1 /* DO NOT EDIT! 2 ** This file is automatically generated by the script in the canonical 3 ** SQLite source tree at tool/mkshellc.tcl. That script combines source 4 ** code from various constituent source files of SQLite into this single 5 ** "shell.c" file used to implement the SQLite command-line shell. 6 ** 7 ** Most of the code found below comes from the "src/shell.c.in" file in 8 ** the canonical SQLite source tree. That main file contains "INCLUDE" 9 ** lines that specify other files in the canonical source tree that are 10 ** inserted to getnerate this complete program source file. 11 ** 12 ** The code from multiple files is combined into this single "shell.c" 13 ** source file to help make the command-line program easier to compile. 14 ** 15 ** To modify this program, get a copy of the canonical SQLite source tree, 16 ** edit the src/shell.c.in" and/or some of the other files that are included 17 ** by "src/shell.c.in", then rerun the tool/mkshellc.tcl script. 18 */ 19 /* 20 ** 2001 September 15 21 ** 22 ** The author disclaims copyright to this source code. In place of 23 ** a legal notice, here is a blessing: 24 ** 25 ** May you do good and not evil. 26 ** May you find forgiveness for yourself and forgive others. 27 ** May you share freely, never taking more than you give. 28 ** 29 ************************************************************************* 30 ** This file contains code to implement the "sqlite" command line 31 ** utility for accessing SQLite databases. 32 */ 33 #if (defined(_WIN32) || defined(WIN32)) && !defined(_CRT_SECURE_NO_WARNINGS) 34 /* This needs to come before any includes for MSVC compiler */ 35 #define _CRT_SECURE_NO_WARNINGS 36 #endif 37 38 /* 39 ** Determine if we are dealing with WinRT, which provides only a subset of 40 ** the full Win32 API. 41 */ 42 #if !defined(SQLITE_OS_WINRT) 43 # define SQLITE_OS_WINRT 0 44 #endif 45 46 /* 47 ** Warning pragmas copied from msvc.h in the core. 48 */ 49 #if defined(_MSC_VER) 50 #pragma warning(disable : 4054) 51 #pragma warning(disable : 4055) 52 #pragma warning(disable : 4100) 53 #pragma warning(disable : 4127) 54 #pragma warning(disable : 4130) 55 #pragma warning(disable : 4152) 56 #pragma warning(disable : 4189) 57 #pragma warning(disable : 4206) 58 #pragma warning(disable : 4210) 59 #pragma warning(disable : 4232) 60 #pragma warning(disable : 4244) 61 #pragma warning(disable : 4305) 62 #pragma warning(disable : 4306) 63 #pragma warning(disable : 4702) 64 #pragma warning(disable : 4706) 65 #endif /* defined(_MSC_VER) */ 66 67 /* 68 ** No support for loadable extensions in VxWorks. 69 */ 70 #if (defined(__RTP__) || defined(_WRS_KERNEL)) && !SQLITE_OMIT_LOAD_EXTENSION 71 # define SQLITE_OMIT_LOAD_EXTENSION 1 72 #endif 73 74 /* 75 ** Enable large-file support for fopen() and friends on unix. 76 */ 77 #ifndef SQLITE_DISABLE_LFS 78 # define _LARGE_FILE 1 79 # ifndef _FILE_OFFSET_BITS 80 # define _FILE_OFFSET_BITS 64 81 # endif 82 # define _LARGEFILE_SOURCE 1 83 #endif 84 85 #include <stdlib.h> 86 #include <string.h> 87 #include <stdio.h> 88 #include <assert.h> 89 #include "sqlite3.h" 90 typedef sqlite3_int64 i64; 91 typedef sqlite3_uint64 u64; 92 typedef unsigned char u8; 93 #if SQLITE_USER_AUTHENTICATION 94 # include "sqlite3userauth.h" 95 #endif 96 #include <ctype.h> 97 #include <stdarg.h> 98 99 #if !defined(_WIN32) && !defined(WIN32) 100 # include <signal.h> 101 # if !defined(__RTP__) && !defined(_WRS_KERNEL) 102 # include <pwd.h> 103 # endif 104 #endif 105 #if (!defined(_WIN32) && !defined(WIN32)) || defined(__MINGW32__) 106 # include <unistd.h> 107 # include <dirent.h> 108 # define GETPID getpid 109 # if defined(__MINGW32__) 110 # define DIRENT dirent 111 # ifndef S_ISLNK 112 # define S_ISLNK(mode) (0) 113 # endif 114 # endif 115 #else 116 # define GETPID (int)GetCurrentProcessId 117 #endif 118 #include <sys/types.h> 119 #include <sys/stat.h> 120 121 #if HAVE_READLINE 122 # include <readline/readline.h> 123 # include <readline/history.h> 124 #endif 125 126 #if HAVE_EDITLINE 127 # include <editline/readline.h> 128 #endif 129 130 #if HAVE_EDITLINE || HAVE_READLINE 131 132 # define shell_add_history(X) add_history(X) 133 # define shell_read_history(X) read_history(X) 134 # define shell_write_history(X) write_history(X) 135 # define shell_stifle_history(X) stifle_history(X) 136 # define shell_readline(X) readline(X) 137 138 #elif HAVE_LINENOISE 139 140 # include "linenoise.h" 141 # define shell_add_history(X) linenoiseHistoryAdd(X) 142 # define shell_read_history(X) linenoiseHistoryLoad(X) 143 # define shell_write_history(X) linenoiseHistorySave(X) 144 # define shell_stifle_history(X) linenoiseHistorySetMaxLen(X) 145 # define shell_readline(X) linenoise(X) 146 147 #else 148 149 # define shell_read_history(X) 150 # define shell_write_history(X) 151 # define shell_stifle_history(X) 152 153 # define SHELL_USE_LOCAL_GETLINE 1 154 #endif 155 156 157 #if defined(_WIN32) || defined(WIN32) 158 # if SQLITE_OS_WINRT 159 # define SQLITE_OMIT_POPEN 1 160 # else 161 # include <io.h> 162 # include <fcntl.h> 163 # define isatty(h) _isatty(h) 164 # ifndef access 165 # define access(f,m) _access((f),(m)) 166 # endif 167 # ifndef unlink 168 # define unlink _unlink 169 # endif 170 # ifndef strdup 171 # define strdup _strdup 172 # endif 173 # undef popen 174 # define popen _popen 175 # undef pclose 176 # define pclose _pclose 177 # endif 178 #else 179 /* Make sure isatty() has a prototype. */ 180 extern int isatty(int); 181 182 # if !defined(__RTP__) && !defined(_WRS_KERNEL) 183 /* popen and pclose are not C89 functions and so are 184 ** sometimes omitted from the <stdio.h> header */ 185 extern FILE *popen(const char*,const char*); 186 extern int pclose(FILE*); 187 # else 188 # define SQLITE_OMIT_POPEN 1 189 # endif 190 #endif 191 192 #if defined(_WIN32_WCE) 193 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty() 194 * thus we always assume that we have a console. That can be 195 * overridden with the -batch command line option. 196 */ 197 #define isatty(x) 1 198 #endif 199 200 /* ctype macros that work with signed characters */ 201 #define IsSpace(X) isspace((unsigned char)X) 202 #define IsDigit(X) isdigit((unsigned char)X) 203 #define ToLower(X) (char)tolower((unsigned char)X) 204 205 #if defined(_WIN32) || defined(WIN32) 206 #if SQLITE_OS_WINRT 207 #include <intrin.h> 208 #endif 209 #include <windows.h> 210 211 /* string conversion routines only needed on Win32 */ 212 extern char *sqlite3_win32_unicode_to_utf8(LPCWSTR); 213 extern char *sqlite3_win32_mbcs_to_utf8_v2(const char *, int); 214 extern char *sqlite3_win32_utf8_to_mbcs_v2(const char *, int); 215 extern LPWSTR sqlite3_win32_utf8_to_unicode(const char *zText); 216 #endif 217 218 /* On Windows, we normally run with output mode of TEXT so that \n characters 219 ** are automatically translated into \r\n. However, this behavior needs 220 ** to be disabled in some cases (ex: when generating CSV output and when 221 ** rendering quoted strings that contain \n characters). The following 222 ** routines take care of that. 223 */ 224 #if (defined(_WIN32) || defined(WIN32)) && !SQLITE_OS_WINRT 225 static void setBinaryMode(FILE *file, int isOutput){ 226 if( isOutput ) fflush(file); 227 _setmode(_fileno(file), _O_BINARY); 228 } 229 static void setTextMode(FILE *file, int isOutput){ 230 if( isOutput ) fflush(file); 231 _setmode(_fileno(file), _O_TEXT); 232 } 233 #else 234 # define setBinaryMode(X,Y) 235 # define setTextMode(X,Y) 236 #endif 237 238 239 /* True if the timer is enabled */ 240 static int enableTimer = 0; 241 242 /* Return the current wall-clock time */ 243 static sqlite3_int64 timeOfDay(void){ 244 static sqlite3_vfs *clockVfs = 0; 245 sqlite3_int64 t; 246 if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0); 247 if( clockVfs->iVersion>=2 && clockVfs->xCurrentTimeInt64!=0 ){ 248 clockVfs->xCurrentTimeInt64(clockVfs, &t); 249 }else{ 250 double r; 251 clockVfs->xCurrentTime(clockVfs, &r); 252 t = (sqlite3_int64)(r*86400000.0); 253 } 254 return t; 255 } 256 257 #if !defined(_WIN32) && !defined(WIN32) && !defined(__minux) 258 #include <sys/time.h> 259 #include <sys/resource.h> 260 261 /* VxWorks does not support getrusage() as far as we can determine */ 262 #if defined(_WRS_KERNEL) || defined(__RTP__) 263 struct rusage { 264 struct timeval ru_utime; /* user CPU time used */ 265 struct timeval ru_stime; /* system CPU time used */ 266 }; 267 #define getrusage(A,B) memset(B,0,sizeof(*B)) 268 #endif 269 270 /* Saved resource information for the beginning of an operation */ 271 static struct rusage sBegin; /* CPU time at start */ 272 static sqlite3_int64 iBegin; /* Wall-clock time at start */ 273 274 /* 275 ** Begin timing an operation 276 */ 277 static void beginTimer(void){ 278 if( enableTimer ){ 279 getrusage(RUSAGE_SELF, &sBegin); 280 iBegin = timeOfDay(); 281 } 282 } 283 284 /* Return the difference of two time_structs in seconds */ 285 static double timeDiff(struct timeval *pStart, struct timeval *pEnd){ 286 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 + 287 (double)(pEnd->tv_sec - pStart->tv_sec); 288 } 289 290 /* 291 ** Print the timing results. 292 */ 293 static void endTimer(void){ 294 if( enableTimer ){ 295 sqlite3_int64 iEnd = timeOfDay(); 296 struct rusage sEnd; 297 getrusage(RUSAGE_SELF, &sEnd); 298 printf("Run Time: real %.3f user %f sys %f\n", 299 (iEnd - iBegin)*0.001, 300 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime), 301 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime)); 302 } 303 } 304 305 #define BEGIN_TIMER beginTimer() 306 #define END_TIMER endTimer() 307 #define HAS_TIMER 1 308 309 #elif (defined(_WIN32) || defined(WIN32)) 310 311 /* Saved resource information for the beginning of an operation */ 312 static HANDLE hProcess; 313 static FILETIME ftKernelBegin; 314 static FILETIME ftUserBegin; 315 static sqlite3_int64 ftWallBegin; 316 typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME, 317 LPFILETIME, LPFILETIME); 318 static GETPROCTIMES getProcessTimesAddr = NULL; 319 320 /* 321 ** Check to see if we have timer support. Return 1 if necessary 322 ** support found (or found previously). 323 */ 324 static int hasTimer(void){ 325 if( getProcessTimesAddr ){ 326 return 1; 327 } else { 328 #if !SQLITE_OS_WINRT 329 /* GetProcessTimes() isn't supported in WIN95 and some other Windows 330 ** versions. See if the version we are running on has it, and if it 331 ** does, save off a pointer to it and the current process handle. 332 */ 333 hProcess = GetCurrentProcess(); 334 if( hProcess ){ 335 HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll")); 336 if( NULL != hinstLib ){ 337 getProcessTimesAddr = 338 (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes"); 339 if( NULL != getProcessTimesAddr ){ 340 return 1; 341 } 342 FreeLibrary(hinstLib); 343 } 344 } 345 #endif 346 } 347 return 0; 348 } 349 350 /* 351 ** Begin timing an operation 352 */ 353 static void beginTimer(void){ 354 if( enableTimer && getProcessTimesAddr ){ 355 FILETIME ftCreation, ftExit; 356 getProcessTimesAddr(hProcess,&ftCreation,&ftExit, 357 &ftKernelBegin,&ftUserBegin); 358 ftWallBegin = timeOfDay(); 359 } 360 } 361 362 /* Return the difference of two FILETIME structs in seconds */ 363 static double timeDiff(FILETIME *pStart, FILETIME *pEnd){ 364 sqlite_int64 i64Start = *((sqlite_int64 *) pStart); 365 sqlite_int64 i64End = *((sqlite_int64 *) pEnd); 366 return (double) ((i64End - i64Start) / 10000000.0); 367 } 368 369 /* 370 ** Print the timing results. 371 */ 372 static void endTimer(void){ 373 if( enableTimer && getProcessTimesAddr){ 374 FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd; 375 sqlite3_int64 ftWallEnd = timeOfDay(); 376 getProcessTimesAddr(hProcess,&ftCreation,&ftExit,&ftKernelEnd,&ftUserEnd); 377 printf("Run Time: real %.3f user %f sys %f\n", 378 (ftWallEnd - ftWallBegin)*0.001, 379 timeDiff(&ftUserBegin, &ftUserEnd), 380 timeDiff(&ftKernelBegin, &ftKernelEnd)); 381 } 382 } 383 384 #define BEGIN_TIMER beginTimer() 385 #define END_TIMER endTimer() 386 #define HAS_TIMER hasTimer() 387 388 #else 389 #define BEGIN_TIMER 390 #define END_TIMER 391 #define HAS_TIMER 0 392 #endif 393 394 /* 395 ** Used to prevent warnings about unused parameters 396 */ 397 #define UNUSED_PARAMETER(x) (void)(x) 398 399 /* 400 ** Number of elements in an array 401 */ 402 #define ArraySize(X) (int)(sizeof(X)/sizeof(X[0])) 403 404 /* 405 ** If the following flag is set, then command execution stops 406 ** at an error if we are not interactive. 407 */ 408 static int bail_on_error = 0; 409 410 /* 411 ** Threat stdin as an interactive input if the following variable 412 ** is true. Otherwise, assume stdin is connected to a file or pipe. 413 */ 414 static int stdin_is_interactive = 1; 415 416 /* 417 ** On Windows systems we have to know if standard output is a console 418 ** in order to translate UTF-8 into MBCS. The following variable is 419 ** true if translation is required. 420 */ 421 static int stdout_is_console = 1; 422 423 /* 424 ** The following is the open SQLite database. We make a pointer 425 ** to this database a static variable so that it can be accessed 426 ** by the SIGINT handler to interrupt database processing. 427 */ 428 static sqlite3 *globalDb = 0; 429 430 /* 431 ** True if an interrupt (Control-C) has been received. 432 */ 433 static volatile int seenInterrupt = 0; 434 435 #ifdef SQLITE_DEBUG 436 /* 437 ** Out-of-memory simulator variables 438 */ 439 static unsigned int oomCounter = 0; /* Simulate OOM when equals 1 */ 440 static unsigned int oomRepeat = 0; /* Number of OOMs in a row */ 441 static void*(*defaultMalloc)(int) = 0; /* The low-level malloc routine */ 442 #endif /* SQLITE_DEBUG */ 443 444 /* 445 ** This is the name of our program. It is set in main(), used 446 ** in a number of other places, mostly for error messages. 447 */ 448 static char *Argv0; 449 450 /* 451 ** Prompt strings. Initialized in main. Settable with 452 ** .prompt main continue 453 */ 454 static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/ 455 static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */ 456 457 /* 458 ** Render output like fprintf(). Except, if the output is going to the 459 ** console and if this is running on a Windows machine, translate the 460 ** output from UTF-8 into MBCS. 461 */ 462 #if defined(_WIN32) || defined(WIN32) 463 void utf8_printf(FILE *out, const char *zFormat, ...){ 464 va_list ap; 465 va_start(ap, zFormat); 466 if( stdout_is_console && (out==stdout || out==stderr) ){ 467 char *z1 = sqlite3_vmprintf(zFormat, ap); 468 char *z2 = sqlite3_win32_utf8_to_mbcs_v2(z1, 0); 469 sqlite3_free(z1); 470 fputs(z2, out); 471 sqlite3_free(z2); 472 }else{ 473 vfprintf(out, zFormat, ap); 474 } 475 va_end(ap); 476 } 477 #elif !defined(utf8_printf) 478 # define utf8_printf fprintf 479 #endif 480 481 /* 482 ** Render output like fprintf(). This should not be used on anything that 483 ** includes string formatting (e.g. "%s"). 484 */ 485 #if !defined(raw_printf) 486 # define raw_printf fprintf 487 #endif 488 489 /* Indicate out-of-memory and exit. */ 490 static void shell_out_of_memory(void){ 491 raw_printf(stderr,"Error: out of memory\n"); 492 exit(1); 493 } 494 495 #ifdef SQLITE_DEBUG 496 /* This routine is called when a simulated OOM occurs. It is broken 497 ** out as a separate routine to make it easy to set a breakpoint on 498 ** the OOM 499 */ 500 void shellOomFault(void){ 501 if( oomRepeat>0 ){ 502 oomRepeat--; 503 }else{ 504 oomCounter--; 505 } 506 } 507 #endif /* SQLITE_DEBUG */ 508 509 #ifdef SQLITE_DEBUG 510 /* This routine is a replacement malloc() that is used to simulate 511 ** Out-Of-Memory (OOM) errors for testing purposes. 512 */ 513 static void *oomMalloc(int nByte){ 514 if( oomCounter ){ 515 if( oomCounter==1 ){ 516 shellOomFault(); 517 return 0; 518 }else{ 519 oomCounter--; 520 } 521 } 522 return defaultMalloc(nByte); 523 } 524 #endif /* SQLITE_DEBUG */ 525 526 #ifdef SQLITE_DEBUG 527 /* Register the OOM simulator. This must occur before any memory 528 ** allocations */ 529 static void registerOomSimulator(void){ 530 sqlite3_mem_methods mem; 531 sqlite3_config(SQLITE_CONFIG_GETMALLOC, &mem); 532 defaultMalloc = mem.xMalloc; 533 mem.xMalloc = oomMalloc; 534 sqlite3_config(SQLITE_CONFIG_MALLOC, &mem); 535 } 536 #endif 537 538 /* 539 ** Write I/O traces to the following stream. 540 */ 541 #ifdef SQLITE_ENABLE_IOTRACE 542 static FILE *iotrace = 0; 543 #endif 544 545 /* 546 ** This routine works like printf in that its first argument is a 547 ** format string and subsequent arguments are values to be substituted 548 ** in place of % fields. The result of formatting this string 549 ** is written to iotrace. 550 */ 551 #ifdef SQLITE_ENABLE_IOTRACE 552 static void SQLITE_CDECL iotracePrintf(const char *zFormat, ...){ 553 va_list ap; 554 char *z; 555 if( iotrace==0 ) return; 556 va_start(ap, zFormat); 557 z = sqlite3_vmprintf(zFormat, ap); 558 va_end(ap); 559 utf8_printf(iotrace, "%s", z); 560 sqlite3_free(z); 561 } 562 #endif 563 564 /* 565 ** Output string zUtf to stream pOut as w characters. If w is negative, 566 ** then right-justify the text. W is the width in UTF-8 characters, not 567 ** in bytes. This is different from the %*.*s specification in printf 568 ** since with %*.*s the width is measured in bytes, not characters. 569 */ 570 static void utf8_width_print(FILE *pOut, int w, const char *zUtf){ 571 int i; 572 int n; 573 int aw = w<0 ? -w : w; 574 char zBuf[1000]; 575 if( aw>(int)sizeof(zBuf)/3 ) aw = (int)sizeof(zBuf)/3; 576 for(i=n=0; zUtf[i]; i++){ 577 if( (zUtf[i]&0xc0)!=0x80 ){ 578 n++; 579 if( n==aw ){ 580 do{ i++; }while( (zUtf[i]&0xc0)==0x80 ); 581 break; 582 } 583 } 584 } 585 if( n>=aw ){ 586 utf8_printf(pOut, "%.*s", i, zUtf); 587 }else if( w<0 ){ 588 utf8_printf(pOut, "%*s%s", aw-n, "", zUtf); 589 }else{ 590 utf8_printf(pOut, "%s%*s", zUtf, aw-n, ""); 591 } 592 } 593 594 595 /* 596 ** Determines if a string is a number of not. 597 */ 598 static int isNumber(const char *z, int *realnum){ 599 if( *z=='-' || *z=='+' ) z++; 600 if( !IsDigit(*z) ){ 601 return 0; 602 } 603 z++; 604 if( realnum ) *realnum = 0; 605 while( IsDigit(*z) ){ z++; } 606 if( *z=='.' ){ 607 z++; 608 if( !IsDigit(*z) ) return 0; 609 while( IsDigit(*z) ){ z++; } 610 if( realnum ) *realnum = 1; 611 } 612 if( *z=='e' || *z=='E' ){ 613 z++; 614 if( *z=='+' || *z=='-' ) z++; 615 if( !IsDigit(*z) ) return 0; 616 while( IsDigit(*z) ){ z++; } 617 if( realnum ) *realnum = 1; 618 } 619 return *z==0; 620 } 621 622 /* 623 ** Compute a string length that is limited to what can be stored in 624 ** lower 30 bits of a 32-bit signed integer. 625 */ 626 static int strlen30(const char *z){ 627 const char *z2 = z; 628 while( *z2 ){ z2++; } 629 return 0x3fffffff & (int)(z2 - z); 630 } 631 632 /* 633 ** Return the length of a string in characters. Multibyte UTF8 characters 634 ** count as a single character. 635 */ 636 static int strlenChar(const char *z){ 637 int n = 0; 638 while( *z ){ 639 if( (0xc0&*(z++))!=0x80 ) n++; 640 } 641 return n; 642 } 643 644 /* 645 ** Return true if zFile does not exist or if it is not an ordinary file. 646 */ 647 #ifdef _WIN32 648 # define notNormalFile(X) 0 649 #else 650 static int notNormalFile(const char *zFile){ 651 struct stat x; 652 int rc; 653 memset(&x, 0, sizeof(x)); 654 rc = stat(zFile, &x); 655 return rc || !S_ISREG(x.st_mode); 656 } 657 #endif 658 659 /* 660 ** This routine reads a line of text from FILE in, stores 661 ** the text in memory obtained from malloc() and returns a pointer 662 ** to the text. NULL is returned at end of file, or if malloc() 663 ** fails. 664 ** 665 ** If zLine is not NULL then it is a malloced buffer returned from 666 ** a previous call to this routine that may be reused. 667 */ 668 static char *local_getline(char *zLine, FILE *in){ 669 int nLine = zLine==0 ? 0 : 100; 670 int n = 0; 671 672 while( 1 ){ 673 if( n+100>nLine ){ 674 nLine = nLine*2 + 100; 675 zLine = realloc(zLine, nLine); 676 if( zLine==0 ) shell_out_of_memory(); 677 } 678 if( fgets(&zLine[n], nLine - n, in)==0 ){ 679 if( n==0 ){ 680 free(zLine); 681 return 0; 682 } 683 zLine[n] = 0; 684 break; 685 } 686 while( zLine[n] ) n++; 687 if( n>0 && zLine[n-1]=='\n' ){ 688 n--; 689 if( n>0 && zLine[n-1]=='\r' ) n--; 690 zLine[n] = 0; 691 break; 692 } 693 } 694 #if defined(_WIN32) || defined(WIN32) 695 /* For interactive input on Windows systems, translate the 696 ** multi-byte characterset characters into UTF-8. */ 697 if( stdin_is_interactive && in==stdin ){ 698 char *zTrans = sqlite3_win32_mbcs_to_utf8_v2(zLine, 0); 699 if( zTrans ){ 700 int nTrans = strlen30(zTrans)+1; 701 if( nTrans>nLine ){ 702 zLine = realloc(zLine, nTrans); 703 if( zLine==0 ) shell_out_of_memory(); 704 } 705 memcpy(zLine, zTrans, nTrans); 706 sqlite3_free(zTrans); 707 } 708 } 709 #endif /* defined(_WIN32) || defined(WIN32) */ 710 return zLine; 711 } 712 713 /* 714 ** Retrieve a single line of input text. 715 ** 716 ** If in==0 then read from standard input and prompt before each line. 717 ** If isContinuation is true, then a continuation prompt is appropriate. 718 ** If isContinuation is zero, then the main prompt should be used. 719 ** 720 ** If zPrior is not NULL then it is a buffer from a prior call to this 721 ** routine that can be reused. 722 ** 723 ** The result is stored in space obtained from malloc() and must either 724 ** be freed by the caller or else passed back into this routine via the 725 ** zPrior argument for reuse. 726 */ 727 static char *one_input_line(FILE *in, char *zPrior, int isContinuation){ 728 char *zPrompt; 729 char *zResult; 730 if( in!=0 ){ 731 zResult = local_getline(zPrior, in); 732 }else{ 733 zPrompt = isContinuation ? continuePrompt : mainPrompt; 734 #if SHELL_USE_LOCAL_GETLINE 735 printf("%s", zPrompt); 736 fflush(stdout); 737 zResult = local_getline(zPrior, stdin); 738 #else 739 free(zPrior); 740 zResult = shell_readline(zPrompt); 741 if( zResult && *zResult ) shell_add_history(zResult); 742 #endif 743 } 744 return zResult; 745 } 746 747 748 /* 749 ** Return the value of a hexadecimal digit. Return -1 if the input 750 ** is not a hex digit. 751 */ 752 static int hexDigitValue(char c){ 753 if( c>='0' && c<='9' ) return c - '0'; 754 if( c>='a' && c<='f' ) return c - 'a' + 10; 755 if( c>='A' && c<='F' ) return c - 'A' + 10; 756 return -1; 757 } 758 759 /* 760 ** Interpret zArg as an integer value, possibly with suffixes. 761 */ 762 static sqlite3_int64 integerValue(const char *zArg){ 763 sqlite3_int64 v = 0; 764 static const struct { char *zSuffix; int iMult; } aMult[] = { 765 { "KiB", 1024 }, 766 { "MiB", 1024*1024 }, 767 { "GiB", 1024*1024*1024 }, 768 { "KB", 1000 }, 769 { "MB", 1000000 }, 770 { "GB", 1000000000 }, 771 { "K", 1000 }, 772 { "M", 1000000 }, 773 { "G", 1000000000 }, 774 }; 775 int i; 776 int isNeg = 0; 777 if( zArg[0]=='-' ){ 778 isNeg = 1; 779 zArg++; 780 }else if( zArg[0]=='+' ){ 781 zArg++; 782 } 783 if( zArg[0]=='0' && zArg[1]=='x' ){ 784 int x; 785 zArg += 2; 786 while( (x = hexDigitValue(zArg[0]))>=0 ){ 787 v = (v<<4) + x; 788 zArg++; 789 } 790 }else{ 791 while( IsDigit(zArg[0]) ){ 792 v = v*10 + zArg[0] - '0'; 793 zArg++; 794 } 795 } 796 for(i=0; i<ArraySize(aMult); i++){ 797 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){ 798 v *= aMult[i].iMult; 799 break; 800 } 801 } 802 return isNeg? -v : v; 803 } 804 805 /* 806 ** A variable length string to which one can append text. 807 */ 808 typedef struct ShellText ShellText; 809 struct ShellText { 810 char *z; 811 int n; 812 int nAlloc; 813 }; 814 815 /* 816 ** Initialize and destroy a ShellText object 817 */ 818 static void initText(ShellText *p){ 819 memset(p, 0, sizeof(*p)); 820 } 821 static void freeText(ShellText *p){ 822 free(p->z); 823 initText(p); 824 } 825 826 /* zIn is either a pointer to a NULL-terminated string in memory obtained 827 ** from malloc(), or a NULL pointer. The string pointed to by zAppend is 828 ** added to zIn, and the result returned in memory obtained from malloc(). 829 ** zIn, if it was not NULL, is freed. 830 ** 831 ** If the third argument, quote, is not '\0', then it is used as a 832 ** quote character for zAppend. 833 */ 834 static void appendText(ShellText *p, char const *zAppend, char quote){ 835 int len; 836 int i; 837 int nAppend = strlen30(zAppend); 838 839 len = nAppend+p->n+1; 840 if( quote ){ 841 len += 2; 842 for(i=0; i<nAppend; i++){ 843 if( zAppend[i]==quote ) len++; 844 } 845 } 846 847 if( p->n+len>=p->nAlloc ){ 848 p->nAlloc = p->nAlloc*2 + len + 20; 849 p->z = realloc(p->z, p->nAlloc); 850 if( p->z==0 ) shell_out_of_memory(); 851 } 852 853 if( quote ){ 854 char *zCsr = p->z+p->n; 855 *zCsr++ = quote; 856 for(i=0; i<nAppend; i++){ 857 *zCsr++ = zAppend[i]; 858 if( zAppend[i]==quote ) *zCsr++ = quote; 859 } 860 *zCsr++ = quote; 861 p->n = (int)(zCsr - p->z); 862 *zCsr = '\0'; 863 }else{ 864 memcpy(p->z+p->n, zAppend, nAppend); 865 p->n += nAppend; 866 p->z[p->n] = '\0'; 867 } 868 } 869 870 /* 871 ** Attempt to determine if identifier zName needs to be quoted, either 872 ** because it contains non-alphanumeric characters, or because it is an 873 ** SQLite keyword. Be conservative in this estimate: When in doubt assume 874 ** that quoting is required. 875 ** 876 ** Return '"' if quoting is required. Return 0 if no quoting is required. 877 */ 878 static char quoteChar(const char *zName){ 879 int i; 880 if( !isalpha((unsigned char)zName[0]) && zName[0]!='_' ) return '"'; 881 for(i=0; zName[i]; i++){ 882 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ) return '"'; 883 } 884 return sqlite3_keyword_check(zName, i) ? '"' : 0; 885 } 886 887 /* 888 ** Construct a fake object name and column list to describe the structure 889 ** of the view, virtual table, or table valued function zSchema.zName. 890 */ 891 static char *shellFakeSchema( 892 sqlite3 *db, /* The database connection containing the vtab */ 893 const char *zSchema, /* Schema of the database holding the vtab */ 894 const char *zName /* The name of the virtual table */ 895 ){ 896 sqlite3_stmt *pStmt = 0; 897 char *zSql; 898 ShellText s; 899 char cQuote; 900 char *zDiv = "("; 901 int nRow = 0; 902 903 zSql = sqlite3_mprintf("PRAGMA \"%w\".table_info=%Q;", 904 zSchema ? zSchema : "main", zName); 905 sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); 906 sqlite3_free(zSql); 907 initText(&s); 908 if( zSchema ){ 909 cQuote = quoteChar(zSchema); 910 if( cQuote && sqlite3_stricmp(zSchema,"temp")==0 ) cQuote = 0; 911 appendText(&s, zSchema, cQuote); 912 appendText(&s, ".", 0); 913 } 914 cQuote = quoteChar(zName); 915 appendText(&s, zName, cQuote); 916 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 917 const char *zCol = (const char*)sqlite3_column_text(pStmt, 1); 918 nRow++; 919 appendText(&s, zDiv, 0); 920 zDiv = ","; 921 cQuote = quoteChar(zCol); 922 appendText(&s, zCol, cQuote); 923 } 924 appendText(&s, ")", 0); 925 sqlite3_finalize(pStmt); 926 if( nRow==0 ){ 927 freeText(&s); 928 s.z = 0; 929 } 930 return s.z; 931 } 932 933 /* 934 ** SQL function: shell_module_schema(X) 935 ** 936 ** Return a fake schema for the table-valued function or eponymous virtual 937 ** table X. 938 */ 939 static void shellModuleSchema( 940 sqlite3_context *pCtx, 941 int nVal, 942 sqlite3_value **apVal 943 ){ 944 const char *zName = (const char*)sqlite3_value_text(apVal[0]); 945 char *zFake = shellFakeSchema(sqlite3_context_db_handle(pCtx), 0, zName); 946 UNUSED_PARAMETER(nVal); 947 if( zFake ){ 948 sqlite3_result_text(pCtx, sqlite3_mprintf("/* %s */", zFake), 949 -1, sqlite3_free); 950 free(zFake); 951 } 952 } 953 954 /* 955 ** SQL function: shell_add_schema(S,X) 956 ** 957 ** Add the schema name X to the CREATE statement in S and return the result. 958 ** Examples: 959 ** 960 ** CREATE TABLE t1(x) -> CREATE TABLE xyz.t1(x); 961 ** 962 ** Also works on 963 ** 964 ** CREATE INDEX 965 ** CREATE UNIQUE INDEX 966 ** CREATE VIEW 967 ** CREATE TRIGGER 968 ** CREATE VIRTUAL TABLE 969 ** 970 ** This UDF is used by the .schema command to insert the schema name of 971 ** attached databases into the middle of the sqlite_schema.sql field. 972 */ 973 static void shellAddSchemaName( 974 sqlite3_context *pCtx, 975 int nVal, 976 sqlite3_value **apVal 977 ){ 978 static const char *aPrefix[] = { 979 "TABLE", 980 "INDEX", 981 "UNIQUE INDEX", 982 "VIEW", 983 "TRIGGER", 984 "VIRTUAL TABLE" 985 }; 986 int i = 0; 987 const char *zIn = (const char*)sqlite3_value_text(apVal[0]); 988 const char *zSchema = (const char*)sqlite3_value_text(apVal[1]); 989 const char *zName = (const char*)sqlite3_value_text(apVal[2]); 990 sqlite3 *db = sqlite3_context_db_handle(pCtx); 991 UNUSED_PARAMETER(nVal); 992 if( zIn!=0 && strncmp(zIn, "CREATE ", 7)==0 ){ 993 for(i=0; i<(int)(sizeof(aPrefix)/sizeof(aPrefix[0])); i++){ 994 int n = strlen30(aPrefix[i]); 995 if( strncmp(zIn+7, aPrefix[i], n)==0 && zIn[n+7]==' ' ){ 996 char *z = 0; 997 char *zFake = 0; 998 if( zSchema ){ 999 char cQuote = quoteChar(zSchema); 1000 if( cQuote && sqlite3_stricmp(zSchema,"temp")!=0 ){ 1001 z = sqlite3_mprintf("%.*s \"%w\".%s", n+7, zIn, zSchema, zIn+n+8); 1002 }else{ 1003 z = sqlite3_mprintf("%.*s %s.%s", n+7, zIn, zSchema, zIn+n+8); 1004 } 1005 } 1006 if( zName 1007 && aPrefix[i][0]=='V' 1008 && (zFake = shellFakeSchema(db, zSchema, zName))!=0 1009 ){ 1010 if( z==0 ){ 1011 z = sqlite3_mprintf("%s\n/* %s */", zIn, zFake); 1012 }else{ 1013 z = sqlite3_mprintf("%z\n/* %s */", z, zFake); 1014 } 1015 free(zFake); 1016 } 1017 if( z ){ 1018 sqlite3_result_text(pCtx, z, -1, sqlite3_free); 1019 return; 1020 } 1021 } 1022 } 1023 } 1024 sqlite3_result_value(pCtx, apVal[0]); 1025 } 1026 1027 /* 1028 ** The source code for several run-time loadable extensions is inserted 1029 ** below by the ../tool/mkshellc.tcl script. Before processing that included 1030 ** code, we need to override some macros to make the included program code 1031 ** work here in the middle of this regular program. 1032 */ 1033 #define SQLITE_EXTENSION_INIT1 1034 #define SQLITE_EXTENSION_INIT2(X) (void)(X) 1035 1036 #if defined(_WIN32) && defined(_MSC_VER) 1037 /************************* Begin test_windirent.h ******************/ 1038 /* 1039 ** 2015 November 30 1040 ** 1041 ** The author disclaims copyright to this source code. In place of 1042 ** a legal notice, here is a blessing: 1043 ** 1044 ** May you do good and not evil. 1045 ** May you find forgiveness for yourself and forgive others. 1046 ** May you share freely, never taking more than you give. 1047 ** 1048 ************************************************************************* 1049 ** This file contains declarations for most of the opendir() family of 1050 ** POSIX functions on Win32 using the MSVCRT. 1051 */ 1052 1053 #if defined(_WIN32) && defined(_MSC_VER) && !defined(SQLITE_WINDIRENT_H) 1054 #define SQLITE_WINDIRENT_H 1055 1056 /* 1057 ** We need several data types from the Windows SDK header. 1058 */ 1059 1060 #ifndef WIN32_LEAN_AND_MEAN 1061 #define WIN32_LEAN_AND_MEAN 1062 #endif 1063 1064 #include "windows.h" 1065 1066 /* 1067 ** We need several support functions from the SQLite core. 1068 */ 1069 1070 /* #include "sqlite3.h" */ 1071 1072 /* 1073 ** We need several things from the ANSI and MSVCRT headers. 1074 */ 1075 1076 #include <stdio.h> 1077 #include <stdlib.h> 1078 #include <errno.h> 1079 #include <io.h> 1080 #include <limits.h> 1081 #include <sys/types.h> 1082 #include <sys/stat.h> 1083 1084 /* 1085 ** We may need several defines that should have been in "sys/stat.h". 1086 */ 1087 1088 #ifndef S_ISREG 1089 #define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG) 1090 #endif 1091 1092 #ifndef S_ISDIR 1093 #define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) 1094 #endif 1095 1096 #ifndef S_ISLNK 1097 #define S_ISLNK(mode) (0) 1098 #endif 1099 1100 /* 1101 ** We may need to provide the "mode_t" type. 1102 */ 1103 1104 #ifndef MODE_T_DEFINED 1105 #define MODE_T_DEFINED 1106 typedef unsigned short mode_t; 1107 #endif 1108 1109 /* 1110 ** We may need to provide the "ino_t" type. 1111 */ 1112 1113 #ifndef INO_T_DEFINED 1114 #define INO_T_DEFINED 1115 typedef unsigned short ino_t; 1116 #endif 1117 1118 /* 1119 ** We need to define "NAME_MAX" if it was not present in "limits.h". 1120 */ 1121 1122 #ifndef NAME_MAX 1123 # ifdef FILENAME_MAX 1124 # define NAME_MAX (FILENAME_MAX) 1125 # else 1126 # define NAME_MAX (260) 1127 # endif 1128 #endif 1129 1130 /* 1131 ** We need to define "NULL_INTPTR_T" and "BAD_INTPTR_T". 1132 */ 1133 1134 #ifndef NULL_INTPTR_T 1135 # define NULL_INTPTR_T ((intptr_t)(0)) 1136 #endif 1137 1138 #ifndef BAD_INTPTR_T 1139 # define BAD_INTPTR_T ((intptr_t)(-1)) 1140 #endif 1141 1142 /* 1143 ** We need to provide the necessary structures and related types. 1144 */ 1145 1146 #ifndef DIRENT_DEFINED 1147 #define DIRENT_DEFINED 1148 typedef struct DIRENT DIRENT; 1149 typedef DIRENT *LPDIRENT; 1150 struct DIRENT { 1151 ino_t d_ino; /* Sequence number, do not use. */ 1152 unsigned d_attributes; /* Win32 file attributes. */ 1153 char d_name[NAME_MAX + 1]; /* Name within the directory. */ 1154 }; 1155 #endif 1156 1157 #ifndef DIR_DEFINED 1158 #define DIR_DEFINED 1159 typedef struct DIR DIR; 1160 typedef DIR *LPDIR; 1161 struct DIR { 1162 intptr_t d_handle; /* Value returned by "_findfirst". */ 1163 DIRENT d_first; /* DIRENT constructed based on "_findfirst". */ 1164 DIRENT d_next; /* DIRENT constructed based on "_findnext". */ 1165 }; 1166 #endif 1167 1168 /* 1169 ** Provide a macro, for use by the implementation, to determine if a 1170 ** particular directory entry should be skipped over when searching for 1171 ** the next directory entry that should be returned by the readdir() or 1172 ** readdir_r() functions. 1173 */ 1174 1175 #ifndef is_filtered 1176 # define is_filtered(a) ((((a).attrib)&_A_HIDDEN) || (((a).attrib)&_A_SYSTEM)) 1177 #endif 1178 1179 /* 1180 ** Provide the function prototype for the POSIX compatiable getenv() 1181 ** function. This function is not thread-safe. 1182 */ 1183 1184 extern const char *windirent_getenv(const char *name); 1185 1186 /* 1187 ** Finally, we can provide the function prototypes for the opendir(), 1188 ** readdir(), readdir_r(), and closedir() POSIX functions. 1189 */ 1190 1191 extern LPDIR opendir(const char *dirname); 1192 extern LPDIRENT readdir(LPDIR dirp); 1193 extern INT readdir_r(LPDIR dirp, LPDIRENT entry, LPDIRENT *result); 1194 extern INT closedir(LPDIR dirp); 1195 1196 #endif /* defined(WIN32) && defined(_MSC_VER) */ 1197 1198 /************************* End test_windirent.h ********************/ 1199 /************************* Begin test_windirent.c ******************/ 1200 /* 1201 ** 2015 November 30 1202 ** 1203 ** The author disclaims copyright to this source code. In place of 1204 ** a legal notice, here is a blessing: 1205 ** 1206 ** May you do good and not evil. 1207 ** May you find forgiveness for yourself and forgive others. 1208 ** May you share freely, never taking more than you give. 1209 ** 1210 ************************************************************************* 1211 ** This file contains code to implement most of the opendir() family of 1212 ** POSIX functions on Win32 using the MSVCRT. 1213 */ 1214 1215 #if defined(_WIN32) && defined(_MSC_VER) 1216 /* #include "test_windirent.h" */ 1217 1218 /* 1219 ** Implementation of the POSIX getenv() function using the Win32 API. 1220 ** This function is not thread-safe. 1221 */ 1222 const char *windirent_getenv( 1223 const char *name 1224 ){ 1225 static char value[32768]; /* Maximum length, per MSDN */ 1226 DWORD dwSize = sizeof(value) / sizeof(char); /* Size in chars */ 1227 DWORD dwRet; /* Value returned by GetEnvironmentVariableA() */ 1228 1229 memset(value, 0, sizeof(value)); 1230 dwRet = GetEnvironmentVariableA(name, value, dwSize); 1231 if( dwRet==0 || dwRet>dwSize ){ 1232 /* 1233 ** The function call to GetEnvironmentVariableA() failed -OR- 1234 ** the buffer is not large enough. Either way, return NULL. 1235 */ 1236 return 0; 1237 }else{ 1238 /* 1239 ** The function call to GetEnvironmentVariableA() succeeded 1240 ** -AND- the buffer contains the entire value. 1241 */ 1242 return value; 1243 } 1244 } 1245 1246 /* 1247 ** Implementation of the POSIX opendir() function using the MSVCRT. 1248 */ 1249 LPDIR opendir( 1250 const char *dirname 1251 ){ 1252 struct _finddata_t data; 1253 LPDIR dirp = (LPDIR)sqlite3_malloc(sizeof(DIR)); 1254 SIZE_T namesize = sizeof(data.name) / sizeof(data.name[0]); 1255 1256 if( dirp==NULL ) return NULL; 1257 memset(dirp, 0, sizeof(DIR)); 1258 1259 /* TODO: Remove this if Unix-style root paths are not used. */ 1260 if( sqlite3_stricmp(dirname, "/")==0 ){ 1261 dirname = windirent_getenv("SystemDrive"); 1262 } 1263 1264 memset(&data, 0, sizeof(struct _finddata_t)); 1265 _snprintf(data.name, namesize, "%s\\*", dirname); 1266 dirp->d_handle = _findfirst(data.name, &data); 1267 1268 if( dirp->d_handle==BAD_INTPTR_T ){ 1269 closedir(dirp); 1270 return NULL; 1271 } 1272 1273 /* TODO: Remove this block to allow hidden and/or system files. */ 1274 if( is_filtered(data) ){ 1275 next: 1276 1277 memset(&data, 0, sizeof(struct _finddata_t)); 1278 if( _findnext(dirp->d_handle, &data)==-1 ){ 1279 closedir(dirp); 1280 return NULL; 1281 } 1282 1283 /* TODO: Remove this block to allow hidden and/or system files. */ 1284 if( is_filtered(data) ) goto next; 1285 } 1286 1287 dirp->d_first.d_attributes = data.attrib; 1288 strncpy(dirp->d_first.d_name, data.name, NAME_MAX); 1289 dirp->d_first.d_name[NAME_MAX] = '\0'; 1290 1291 return dirp; 1292 } 1293 1294 /* 1295 ** Implementation of the POSIX readdir() function using the MSVCRT. 1296 */ 1297 LPDIRENT readdir( 1298 LPDIR dirp 1299 ){ 1300 struct _finddata_t data; 1301 1302 if( dirp==NULL ) return NULL; 1303 1304 if( dirp->d_first.d_ino==0 ){ 1305 dirp->d_first.d_ino++; 1306 dirp->d_next.d_ino++; 1307 1308 return &dirp->d_first; 1309 } 1310 1311 next: 1312 1313 memset(&data, 0, sizeof(struct _finddata_t)); 1314 if( _findnext(dirp->d_handle, &data)==-1 ) return NULL; 1315 1316 /* TODO: Remove this block to allow hidden and/or system files. */ 1317 if( is_filtered(data) ) goto next; 1318 1319 dirp->d_next.d_ino++; 1320 dirp->d_next.d_attributes = data.attrib; 1321 strncpy(dirp->d_next.d_name, data.name, NAME_MAX); 1322 dirp->d_next.d_name[NAME_MAX] = '\0'; 1323 1324 return &dirp->d_next; 1325 } 1326 1327 /* 1328 ** Implementation of the POSIX readdir_r() function using the MSVCRT. 1329 */ 1330 INT readdir_r( 1331 LPDIR dirp, 1332 LPDIRENT entry, 1333 LPDIRENT *result 1334 ){ 1335 struct _finddata_t data; 1336 1337 if( dirp==NULL ) return EBADF; 1338 1339 if( dirp->d_first.d_ino==0 ){ 1340 dirp->d_first.d_ino++; 1341 dirp->d_next.d_ino++; 1342 1343 entry->d_ino = dirp->d_first.d_ino; 1344 entry->d_attributes = dirp->d_first.d_attributes; 1345 strncpy(entry->d_name, dirp->d_first.d_name, NAME_MAX); 1346 entry->d_name[NAME_MAX] = '\0'; 1347 1348 *result = entry; 1349 return 0; 1350 } 1351 1352 next: 1353 1354 memset(&data, 0, sizeof(struct _finddata_t)); 1355 if( _findnext(dirp->d_handle, &data)==-1 ){ 1356 *result = NULL; 1357 return ENOENT; 1358 } 1359 1360 /* TODO: Remove this block to allow hidden and/or system files. */ 1361 if( is_filtered(data) ) goto next; 1362 1363 entry->d_ino = (ino_t)-1; /* not available */ 1364 entry->d_attributes = data.attrib; 1365 strncpy(entry->d_name, data.name, NAME_MAX); 1366 entry->d_name[NAME_MAX] = '\0'; 1367 1368 *result = entry; 1369 return 0; 1370 } 1371 1372 /* 1373 ** Implementation of the POSIX closedir() function using the MSVCRT. 1374 */ 1375 INT closedir( 1376 LPDIR dirp 1377 ){ 1378 INT result = 0; 1379 1380 if( dirp==NULL ) return EINVAL; 1381 1382 if( dirp->d_handle!=NULL_INTPTR_T && dirp->d_handle!=BAD_INTPTR_T ){ 1383 result = _findclose(dirp->d_handle); 1384 } 1385 1386 sqlite3_free(dirp); 1387 return result; 1388 } 1389 1390 #endif /* defined(WIN32) && defined(_MSC_VER) */ 1391 1392 /************************* End test_windirent.c ********************/ 1393 #define dirent DIRENT 1394 #endif 1395 /************************* Begin ../ext/misc/shathree.c ******************/ 1396 /* 1397 ** 2017-03-08 1398 ** 1399 ** The author disclaims copyright to this source code. In place of 1400 ** a legal notice, here is a blessing: 1401 ** 1402 ** May you do good and not evil. 1403 ** May you find forgiveness for yourself and forgive others. 1404 ** May you share freely, never taking more than you give. 1405 ** 1406 ****************************************************************************** 1407 ** 1408 ** This SQLite extension implements functions that compute SHA3 hashes. 1409 ** Two SQL functions are implemented: 1410 ** 1411 ** sha3(X,SIZE) 1412 ** sha3_query(Y,SIZE) 1413 ** 1414 ** The sha3(X) function computes the SHA3 hash of the input X, or NULL if 1415 ** X is NULL. 1416 ** 1417 ** The sha3_query(Y) function evalutes all queries in the SQL statements of Y 1418 ** and returns a hash of their results. 1419 ** 1420 ** The SIZE argument is optional. If omitted, the SHA3-256 hash algorithm 1421 ** is used. If SIZE is included it must be one of the integers 224, 256, 1422 ** 384, or 512, to determine SHA3 hash variant that is computed. 1423 */ 1424 /* #include "sqlite3ext.h" */ 1425 SQLITE_EXTENSION_INIT1 1426 #include <assert.h> 1427 #include <string.h> 1428 #include <stdarg.h> 1429 /* typedef sqlite3_uint64 u64; */ 1430 1431 /****************************************************************************** 1432 ** The Hash Engine 1433 */ 1434 /* 1435 ** Macros to determine whether the machine is big or little endian, 1436 ** and whether or not that determination is run-time or compile-time. 1437 ** 1438 ** For best performance, an attempt is made to guess at the byte-order 1439 ** using C-preprocessor macros. If that is unsuccessful, or if 1440 ** -DSHA3_BYTEORDER=0 is set, then byte-order is determined 1441 ** at run-time. 1442 */ 1443 #ifndef SHA3_BYTEORDER 1444 # if defined(i386) || defined(__i386__) || defined(_M_IX86) || \ 1445 defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || \ 1446 defined(_M_AMD64) || defined(_M_ARM) || defined(__x86) || \ 1447 defined(__arm__) 1448 # define SHA3_BYTEORDER 1234 1449 # elif defined(sparc) || defined(__ppc__) 1450 # define SHA3_BYTEORDER 4321 1451 # else 1452 # define SHA3_BYTEORDER 0 1453 # endif 1454 #endif 1455 1456 1457 /* 1458 ** State structure for a SHA3 hash in progress 1459 */ 1460 typedef struct SHA3Context SHA3Context; 1461 struct SHA3Context { 1462 union { 1463 u64 s[25]; /* Keccak state. 5x5 lines of 64 bits each */ 1464 unsigned char x[1600]; /* ... or 1600 bytes */ 1465 } u; 1466 unsigned nRate; /* Bytes of input accepted per Keccak iteration */ 1467 unsigned nLoaded; /* Input bytes loaded into u.x[] so far this cycle */ 1468 unsigned ixMask; /* Insert next input into u.x[nLoaded^ixMask]. */ 1469 }; 1470 1471 /* 1472 ** A single step of the Keccak mixing function for a 1600-bit state 1473 */ 1474 static void KeccakF1600Step(SHA3Context *p){ 1475 int i; 1476 u64 b0, b1, b2, b3, b4; 1477 u64 c0, c1, c2, c3, c4; 1478 u64 d0, d1, d2, d3, d4; 1479 static const u64 RC[] = { 1480 0x0000000000000001ULL, 0x0000000000008082ULL, 1481 0x800000000000808aULL, 0x8000000080008000ULL, 1482 0x000000000000808bULL, 0x0000000080000001ULL, 1483 0x8000000080008081ULL, 0x8000000000008009ULL, 1484 0x000000000000008aULL, 0x0000000000000088ULL, 1485 0x0000000080008009ULL, 0x000000008000000aULL, 1486 0x000000008000808bULL, 0x800000000000008bULL, 1487 0x8000000000008089ULL, 0x8000000000008003ULL, 1488 0x8000000000008002ULL, 0x8000000000000080ULL, 1489 0x000000000000800aULL, 0x800000008000000aULL, 1490 0x8000000080008081ULL, 0x8000000000008080ULL, 1491 0x0000000080000001ULL, 0x8000000080008008ULL 1492 }; 1493 # define a00 (p->u.s[0]) 1494 # define a01 (p->u.s[1]) 1495 # define a02 (p->u.s[2]) 1496 # define a03 (p->u.s[3]) 1497 # define a04 (p->u.s[4]) 1498 # define a10 (p->u.s[5]) 1499 # define a11 (p->u.s[6]) 1500 # define a12 (p->u.s[7]) 1501 # define a13 (p->u.s[8]) 1502 # define a14 (p->u.s[9]) 1503 # define a20 (p->u.s[10]) 1504 # define a21 (p->u.s[11]) 1505 # define a22 (p->u.s[12]) 1506 # define a23 (p->u.s[13]) 1507 # define a24 (p->u.s[14]) 1508 # define a30 (p->u.s[15]) 1509 # define a31 (p->u.s[16]) 1510 # define a32 (p->u.s[17]) 1511 # define a33 (p->u.s[18]) 1512 # define a34 (p->u.s[19]) 1513 # define a40 (p->u.s[20]) 1514 # define a41 (p->u.s[21]) 1515 # define a42 (p->u.s[22]) 1516 # define a43 (p->u.s[23]) 1517 # define a44 (p->u.s[24]) 1518 # define ROL64(a,x) ((a<<x)|(a>>(64-x))) 1519 1520 for(i=0; i<24; i+=4){ 1521 c0 = a00^a10^a20^a30^a40; 1522 c1 = a01^a11^a21^a31^a41; 1523 c2 = a02^a12^a22^a32^a42; 1524 c3 = a03^a13^a23^a33^a43; 1525 c4 = a04^a14^a24^a34^a44; 1526 d0 = c4^ROL64(c1, 1); 1527 d1 = c0^ROL64(c2, 1); 1528 d2 = c1^ROL64(c3, 1); 1529 d3 = c2^ROL64(c4, 1); 1530 d4 = c3^ROL64(c0, 1); 1531 1532 b0 = (a00^d0); 1533 b1 = ROL64((a11^d1), 44); 1534 b2 = ROL64((a22^d2), 43); 1535 b3 = ROL64((a33^d3), 21); 1536 b4 = ROL64((a44^d4), 14); 1537 a00 = b0 ^((~b1)& b2 ); 1538 a00 ^= RC[i]; 1539 a11 = b1 ^((~b2)& b3 ); 1540 a22 = b2 ^((~b3)& b4 ); 1541 a33 = b3 ^((~b4)& b0 ); 1542 a44 = b4 ^((~b0)& b1 ); 1543 1544 b2 = ROL64((a20^d0), 3); 1545 b3 = ROL64((a31^d1), 45); 1546 b4 = ROL64((a42^d2), 61); 1547 b0 = ROL64((a03^d3), 28); 1548 b1 = ROL64((a14^d4), 20); 1549 a20 = b0 ^((~b1)& b2 ); 1550 a31 = b1 ^((~b2)& b3 ); 1551 a42 = b2 ^((~b3)& b4 ); 1552 a03 = b3 ^((~b4)& b0 ); 1553 a14 = b4 ^((~b0)& b1 ); 1554 1555 b4 = ROL64((a40^d0), 18); 1556 b0 = ROL64((a01^d1), 1); 1557 b1 = ROL64((a12^d2), 6); 1558 b2 = ROL64((a23^d3), 25); 1559 b3 = ROL64((a34^d4), 8); 1560 a40 = b0 ^((~b1)& b2 ); 1561 a01 = b1 ^((~b2)& b3 ); 1562 a12 = b2 ^((~b3)& b4 ); 1563 a23 = b3 ^((~b4)& b0 ); 1564 a34 = b4 ^((~b0)& b1 ); 1565 1566 b1 = ROL64((a10^d0), 36); 1567 b2 = ROL64((a21^d1), 10); 1568 b3 = ROL64((a32^d2), 15); 1569 b4 = ROL64((a43^d3), 56); 1570 b0 = ROL64((a04^d4), 27); 1571 a10 = b0 ^((~b1)& b2 ); 1572 a21 = b1 ^((~b2)& b3 ); 1573 a32 = b2 ^((~b3)& b4 ); 1574 a43 = b3 ^((~b4)& b0 ); 1575 a04 = b4 ^((~b0)& b1 ); 1576 1577 b3 = ROL64((a30^d0), 41); 1578 b4 = ROL64((a41^d1), 2); 1579 b0 = ROL64((a02^d2), 62); 1580 b1 = ROL64((a13^d3), 55); 1581 b2 = ROL64((a24^d4), 39); 1582 a30 = b0 ^((~b1)& b2 ); 1583 a41 = b1 ^((~b2)& b3 ); 1584 a02 = b2 ^((~b3)& b4 ); 1585 a13 = b3 ^((~b4)& b0 ); 1586 a24 = b4 ^((~b0)& b1 ); 1587 1588 c0 = a00^a20^a40^a10^a30; 1589 c1 = a11^a31^a01^a21^a41; 1590 c2 = a22^a42^a12^a32^a02; 1591 c3 = a33^a03^a23^a43^a13; 1592 c4 = a44^a14^a34^a04^a24; 1593 d0 = c4^ROL64(c1, 1); 1594 d1 = c0^ROL64(c2, 1); 1595 d2 = c1^ROL64(c3, 1); 1596 d3 = c2^ROL64(c4, 1); 1597 d4 = c3^ROL64(c0, 1); 1598 1599 b0 = (a00^d0); 1600 b1 = ROL64((a31^d1), 44); 1601 b2 = ROL64((a12^d2), 43); 1602 b3 = ROL64((a43^d3), 21); 1603 b4 = ROL64((a24^d4), 14); 1604 a00 = b0 ^((~b1)& b2 ); 1605 a00 ^= RC[i+1]; 1606 a31 = b1 ^((~b2)& b3 ); 1607 a12 = b2 ^((~b3)& b4 ); 1608 a43 = b3 ^((~b4)& b0 ); 1609 a24 = b4 ^((~b0)& b1 ); 1610 1611 b2 = ROL64((a40^d0), 3); 1612 b3 = ROL64((a21^d1), 45); 1613 b4 = ROL64((a02^d2), 61); 1614 b0 = ROL64((a33^d3), 28); 1615 b1 = ROL64((a14^d4), 20); 1616 a40 = b0 ^((~b1)& b2 ); 1617 a21 = b1 ^((~b2)& b3 ); 1618 a02 = b2 ^((~b3)& b4 ); 1619 a33 = b3 ^((~b4)& b0 ); 1620 a14 = b4 ^((~b0)& b1 ); 1621 1622 b4 = ROL64((a30^d0), 18); 1623 b0 = ROL64((a11^d1), 1); 1624 b1 = ROL64((a42^d2), 6); 1625 b2 = ROL64((a23^d3), 25); 1626 b3 = ROL64((a04^d4), 8); 1627 a30 = b0 ^((~b1)& b2 ); 1628 a11 = b1 ^((~b2)& b3 ); 1629 a42 = b2 ^((~b3)& b4 ); 1630 a23 = b3 ^((~b4)& b0 ); 1631 a04 = b4 ^((~b0)& b1 ); 1632 1633 b1 = ROL64((a20^d0), 36); 1634 b2 = ROL64((a01^d1), 10); 1635 b3 = ROL64((a32^d2), 15); 1636 b4 = ROL64((a13^d3), 56); 1637 b0 = ROL64((a44^d4), 27); 1638 a20 = b0 ^((~b1)& b2 ); 1639 a01 = b1 ^((~b2)& b3 ); 1640 a32 = b2 ^((~b3)& b4 ); 1641 a13 = b3 ^((~b4)& b0 ); 1642 a44 = b4 ^((~b0)& b1 ); 1643 1644 b3 = ROL64((a10^d0), 41); 1645 b4 = ROL64((a41^d1), 2); 1646 b0 = ROL64((a22^d2), 62); 1647 b1 = ROL64((a03^d3), 55); 1648 b2 = ROL64((a34^d4), 39); 1649 a10 = b0 ^((~b1)& b2 ); 1650 a41 = b1 ^((~b2)& b3 ); 1651 a22 = b2 ^((~b3)& b4 ); 1652 a03 = b3 ^((~b4)& b0 ); 1653 a34 = b4 ^((~b0)& b1 ); 1654 1655 c0 = a00^a40^a30^a20^a10; 1656 c1 = a31^a21^a11^a01^a41; 1657 c2 = a12^a02^a42^a32^a22; 1658 c3 = a43^a33^a23^a13^a03; 1659 c4 = a24^a14^a04^a44^a34; 1660 d0 = c4^ROL64(c1, 1); 1661 d1 = c0^ROL64(c2, 1); 1662 d2 = c1^ROL64(c3, 1); 1663 d3 = c2^ROL64(c4, 1); 1664 d4 = c3^ROL64(c0, 1); 1665 1666 b0 = (a00^d0); 1667 b1 = ROL64((a21^d1), 44); 1668 b2 = ROL64((a42^d2), 43); 1669 b3 = ROL64((a13^d3), 21); 1670 b4 = ROL64((a34^d4), 14); 1671 a00 = b0 ^((~b1)& b2 ); 1672 a00 ^= RC[i+2]; 1673 a21 = b1 ^((~b2)& b3 ); 1674 a42 = b2 ^((~b3)& b4 ); 1675 a13 = b3 ^((~b4)& b0 ); 1676 a34 = b4 ^((~b0)& b1 ); 1677 1678 b2 = ROL64((a30^d0), 3); 1679 b3 = ROL64((a01^d1), 45); 1680 b4 = ROL64((a22^d2), 61); 1681 b0 = ROL64((a43^d3), 28); 1682 b1 = ROL64((a14^d4), 20); 1683 a30 = b0 ^((~b1)& b2 ); 1684 a01 = b1 ^((~b2)& b3 ); 1685 a22 = b2 ^((~b3)& b4 ); 1686 a43 = b3 ^((~b4)& b0 ); 1687 a14 = b4 ^((~b0)& b1 ); 1688 1689 b4 = ROL64((a10^d0), 18); 1690 b0 = ROL64((a31^d1), 1); 1691 b1 = ROL64((a02^d2), 6); 1692 b2 = ROL64((a23^d3), 25); 1693 b3 = ROL64((a44^d4), 8); 1694 a10 = b0 ^((~b1)& b2 ); 1695 a31 = b1 ^((~b2)& b3 ); 1696 a02 = b2 ^((~b3)& b4 ); 1697 a23 = b3 ^((~b4)& b0 ); 1698 a44 = b4 ^((~b0)& b1 ); 1699 1700 b1 = ROL64((a40^d0), 36); 1701 b2 = ROL64((a11^d1), 10); 1702 b3 = ROL64((a32^d2), 15); 1703 b4 = ROL64((a03^d3), 56); 1704 b0 = ROL64((a24^d4), 27); 1705 a40 = b0 ^((~b1)& b2 ); 1706 a11 = b1 ^((~b2)& b3 ); 1707 a32 = b2 ^((~b3)& b4 ); 1708 a03 = b3 ^((~b4)& b0 ); 1709 a24 = b4 ^((~b0)& b1 ); 1710 1711 b3 = ROL64((a20^d0), 41); 1712 b4 = ROL64((a41^d1), 2); 1713 b0 = ROL64((a12^d2), 62); 1714 b1 = ROL64((a33^d3), 55); 1715 b2 = ROL64((a04^d4), 39); 1716 a20 = b0 ^((~b1)& b2 ); 1717 a41 = b1 ^((~b2)& b3 ); 1718 a12 = b2 ^((~b3)& b4 ); 1719 a33 = b3 ^((~b4)& b0 ); 1720 a04 = b4 ^((~b0)& b1 ); 1721 1722 c0 = a00^a30^a10^a40^a20; 1723 c1 = a21^a01^a31^a11^a41; 1724 c2 = a42^a22^a02^a32^a12; 1725 c3 = a13^a43^a23^a03^a33; 1726 c4 = a34^a14^a44^a24^a04; 1727 d0 = c4^ROL64(c1, 1); 1728 d1 = c0^ROL64(c2, 1); 1729 d2 = c1^ROL64(c3, 1); 1730 d3 = c2^ROL64(c4, 1); 1731 d4 = c3^ROL64(c0, 1); 1732 1733 b0 = (a00^d0); 1734 b1 = ROL64((a01^d1), 44); 1735 b2 = ROL64((a02^d2), 43); 1736 b3 = ROL64((a03^d3), 21); 1737 b4 = ROL64((a04^d4), 14); 1738 a00 = b0 ^((~b1)& b2 ); 1739 a00 ^= RC[i+3]; 1740 a01 = b1 ^((~b2)& b3 ); 1741 a02 = b2 ^((~b3)& b4 ); 1742 a03 = b3 ^((~b4)& b0 ); 1743 a04 = b4 ^((~b0)& b1 ); 1744 1745 b2 = ROL64((a10^d0), 3); 1746 b3 = ROL64((a11^d1), 45); 1747 b4 = ROL64((a12^d2), 61); 1748 b0 = ROL64((a13^d3), 28); 1749 b1 = ROL64((a14^d4), 20); 1750 a10 = b0 ^((~b1)& b2 ); 1751 a11 = b1 ^((~b2)& b3 ); 1752 a12 = b2 ^((~b3)& b4 ); 1753 a13 = b3 ^((~b4)& b0 ); 1754 a14 = b4 ^((~b0)& b1 ); 1755 1756 b4 = ROL64((a20^d0), 18); 1757 b0 = ROL64((a21^d1), 1); 1758 b1 = ROL64((a22^d2), 6); 1759 b2 = ROL64((a23^d3), 25); 1760 b3 = ROL64((a24^d4), 8); 1761 a20 = b0 ^((~b1)& b2 ); 1762 a21 = b1 ^((~b2)& b3 ); 1763 a22 = b2 ^((~b3)& b4 ); 1764 a23 = b3 ^((~b4)& b0 ); 1765 a24 = b4 ^((~b0)& b1 ); 1766 1767 b1 = ROL64((a30^d0), 36); 1768 b2 = ROL64((a31^d1), 10); 1769 b3 = ROL64((a32^d2), 15); 1770 b4 = ROL64((a33^d3), 56); 1771 b0 = ROL64((a34^d4), 27); 1772 a30 = b0 ^((~b1)& b2 ); 1773 a31 = b1 ^((~b2)& b3 ); 1774 a32 = b2 ^((~b3)& b4 ); 1775 a33 = b3 ^((~b4)& b0 ); 1776 a34 = b4 ^((~b0)& b1 ); 1777 1778 b3 = ROL64((a40^d0), 41); 1779 b4 = ROL64((a41^d1), 2); 1780 b0 = ROL64((a42^d2), 62); 1781 b1 = ROL64((a43^d3), 55); 1782 b2 = ROL64((a44^d4), 39); 1783 a40 = b0 ^((~b1)& b2 ); 1784 a41 = b1 ^((~b2)& b3 ); 1785 a42 = b2 ^((~b3)& b4 ); 1786 a43 = b3 ^((~b4)& b0 ); 1787 a44 = b4 ^((~b0)& b1 ); 1788 } 1789 } 1790 1791 /* 1792 ** Initialize a new hash. iSize determines the size of the hash 1793 ** in bits and should be one of 224, 256, 384, or 512. Or iSize 1794 ** can be zero to use the default hash size of 256 bits. 1795 */ 1796 static void SHA3Init(SHA3Context *p, int iSize){ 1797 memset(p, 0, sizeof(*p)); 1798 if( iSize>=128 && iSize<=512 ){ 1799 p->nRate = (1600 - ((iSize + 31)&~31)*2)/8; 1800 }else{ 1801 p->nRate = (1600 - 2*256)/8; 1802 } 1803 #if SHA3_BYTEORDER==1234 1804 /* Known to be little-endian at compile-time. No-op */ 1805 #elif SHA3_BYTEORDER==4321 1806 p->ixMask = 7; /* Big-endian */ 1807 #else 1808 { 1809 static unsigned int one = 1; 1810 if( 1==*(unsigned char*)&one ){ 1811 /* Little endian. No byte swapping. */ 1812 p->ixMask = 0; 1813 }else{ 1814 /* Big endian. Byte swap. */ 1815 p->ixMask = 7; 1816 } 1817 } 1818 #endif 1819 } 1820 1821 /* 1822 ** Make consecutive calls to the SHA3Update function to add new content 1823 ** to the hash 1824 */ 1825 static void SHA3Update( 1826 SHA3Context *p, 1827 const unsigned char *aData, 1828 unsigned int nData 1829 ){ 1830 unsigned int i = 0; 1831 #if SHA3_BYTEORDER==1234 1832 if( (p->nLoaded % 8)==0 && ((aData - (const unsigned char*)0)&7)==0 ){ 1833 for(; i+7<nData; i+=8){ 1834 p->u.s[p->nLoaded/8] ^= *(u64*)&aData[i]; 1835 p->nLoaded += 8; 1836 if( p->nLoaded>=p->nRate ){ 1837 KeccakF1600Step(p); 1838 p->nLoaded = 0; 1839 } 1840 } 1841 } 1842 #endif 1843 for(; i<nData; i++){ 1844 #if SHA3_BYTEORDER==1234 1845 p->u.x[p->nLoaded] ^= aData[i]; 1846 #elif SHA3_BYTEORDER==4321 1847 p->u.x[p->nLoaded^0x07] ^= aData[i]; 1848 #else 1849 p->u.x[p->nLoaded^p->ixMask] ^= aData[i]; 1850 #endif 1851 p->nLoaded++; 1852 if( p->nLoaded==p->nRate ){ 1853 KeccakF1600Step(p); 1854 p->nLoaded = 0; 1855 } 1856 } 1857 } 1858 1859 /* 1860 ** After all content has been added, invoke SHA3Final() to compute 1861 ** the final hash. The function returns a pointer to the binary 1862 ** hash value. 1863 */ 1864 static unsigned char *SHA3Final(SHA3Context *p){ 1865 unsigned int i; 1866 if( p->nLoaded==p->nRate-1 ){ 1867 const unsigned char c1 = 0x86; 1868 SHA3Update(p, &c1, 1); 1869 }else{ 1870 const unsigned char c2 = 0x06; 1871 const unsigned char c3 = 0x80; 1872 SHA3Update(p, &c2, 1); 1873 p->nLoaded = p->nRate - 1; 1874 SHA3Update(p, &c3, 1); 1875 } 1876 for(i=0; i<p->nRate; i++){ 1877 p->u.x[i+p->nRate] = p->u.x[i^p->ixMask]; 1878 } 1879 return &p->u.x[p->nRate]; 1880 } 1881 /* End of the hashing logic 1882 *****************************************************************************/ 1883 1884 /* 1885 ** Implementation of the sha3(X,SIZE) function. 1886 ** 1887 ** Return a BLOB which is the SIZE-bit SHA3 hash of X. The default 1888 ** size is 256. If X is a BLOB, it is hashed as is. 1889 ** For all other non-NULL types of input, X is converted into a UTF-8 string 1890 ** and the string is hashed without the trailing 0x00 terminator. The hash 1891 ** of a NULL value is NULL. 1892 */ 1893 static void sha3Func( 1894 sqlite3_context *context, 1895 int argc, 1896 sqlite3_value **argv 1897 ){ 1898 SHA3Context cx; 1899 int eType = sqlite3_value_type(argv[0]); 1900 int nByte = sqlite3_value_bytes(argv[0]); 1901 int iSize; 1902 if( argc==1 ){ 1903 iSize = 256; 1904 }else{ 1905 iSize = sqlite3_value_int(argv[1]); 1906 if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){ 1907 sqlite3_result_error(context, "SHA3 size should be one of: 224 256 " 1908 "384 512", -1); 1909 return; 1910 } 1911 } 1912 if( eType==SQLITE_NULL ) return; 1913 SHA3Init(&cx, iSize); 1914 if( eType==SQLITE_BLOB ){ 1915 SHA3Update(&cx, sqlite3_value_blob(argv[0]), nByte); 1916 }else{ 1917 SHA3Update(&cx, sqlite3_value_text(argv[0]), nByte); 1918 } 1919 sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT); 1920 } 1921 1922 /* Compute a string using sqlite3_vsnprintf() with a maximum length 1923 ** of 50 bytes and add it to the hash. 1924 */ 1925 static void hash_step_vformat( 1926 SHA3Context *p, /* Add content to this context */ 1927 const char *zFormat, 1928 ... 1929 ){ 1930 va_list ap; 1931 int n; 1932 char zBuf[50]; 1933 va_start(ap, zFormat); 1934 sqlite3_vsnprintf(sizeof(zBuf),zBuf,zFormat,ap); 1935 va_end(ap); 1936 n = (int)strlen(zBuf); 1937 SHA3Update(p, (unsigned char*)zBuf, n); 1938 } 1939 1940 /* 1941 ** Implementation of the sha3_query(SQL,SIZE) function. 1942 ** 1943 ** This function compiles and runs the SQL statement(s) given in the 1944 ** argument. The results are hashed using a SIZE-bit SHA3. The default 1945 ** size is 256. 1946 ** 1947 ** The format of the byte stream that is hashed is summarized as follows: 1948 ** 1949 ** S<n>:<sql> 1950 ** R 1951 ** N 1952 ** I<int> 1953 ** F<ieee-float> 1954 ** B<size>:<bytes> 1955 ** T<size>:<text> 1956 ** 1957 ** <sql> is the original SQL text for each statement run and <n> is 1958 ** the size of that text. The SQL text is UTF-8. A single R character 1959 ** occurs before the start of each row. N means a NULL value. 1960 ** I mean an 8-byte little-endian integer <int>. F is a floating point 1961 ** number with an 8-byte little-endian IEEE floating point value <ieee-float>. 1962 ** B means blobs of <size> bytes. T means text rendered as <size> 1963 ** bytes of UTF-8. The <n> and <size> values are expressed as an ASCII 1964 ** text integers. 1965 ** 1966 ** For each SQL statement in the X input, there is one S segment. Each 1967 ** S segment is followed by zero or more R segments, one for each row in the 1968 ** result set. After each R, there are one or more N, I, F, B, or T segments, 1969 ** one for each column in the result set. Segments are concatentated directly 1970 ** with no delimiters of any kind. 1971 */ 1972 static void sha3QueryFunc( 1973 sqlite3_context *context, 1974 int argc, 1975 sqlite3_value **argv 1976 ){ 1977 sqlite3 *db = sqlite3_context_db_handle(context); 1978 const char *zSql = (const char*)sqlite3_value_text(argv[0]); 1979 sqlite3_stmt *pStmt = 0; 1980 int nCol; /* Number of columns in the result set */ 1981 int i; /* Loop counter */ 1982 int rc; 1983 int n; 1984 const char *z; 1985 SHA3Context cx; 1986 int iSize; 1987 1988 if( argc==1 ){ 1989 iSize = 256; 1990 }else{ 1991 iSize = sqlite3_value_int(argv[1]); 1992 if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){ 1993 sqlite3_result_error(context, "SHA3 size should be one of: 224 256 " 1994 "384 512", -1); 1995 return; 1996 } 1997 } 1998 if( zSql==0 ) return; 1999 SHA3Init(&cx, iSize); 2000 while( zSql[0] ){ 2001 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zSql); 2002 if( rc ){ 2003 char *zMsg = sqlite3_mprintf("error SQL statement [%s]: %s", 2004 zSql, sqlite3_errmsg(db)); 2005 sqlite3_finalize(pStmt); 2006 sqlite3_result_error(context, zMsg, -1); 2007 sqlite3_free(zMsg); 2008 return; 2009 } 2010 if( !sqlite3_stmt_readonly(pStmt) ){ 2011 char *zMsg = sqlite3_mprintf("non-query: [%s]", sqlite3_sql(pStmt)); 2012 sqlite3_finalize(pStmt); 2013 sqlite3_result_error(context, zMsg, -1); 2014 sqlite3_free(zMsg); 2015 return; 2016 } 2017 nCol = sqlite3_column_count(pStmt); 2018 z = sqlite3_sql(pStmt); 2019 n = (int)strlen(z); 2020 hash_step_vformat(&cx,"S%d:",n); 2021 SHA3Update(&cx,(unsigned char*)z,n); 2022 2023 /* Compute a hash over the result of the query */ 2024 while( SQLITE_ROW==sqlite3_step(pStmt) ){ 2025 SHA3Update(&cx,(const unsigned char*)"R",1); 2026 for(i=0; i<nCol; i++){ 2027 switch( sqlite3_column_type(pStmt,i) ){ 2028 case SQLITE_NULL: { 2029 SHA3Update(&cx, (const unsigned char*)"N",1); 2030 break; 2031 } 2032 case SQLITE_INTEGER: { 2033 sqlite3_uint64 u; 2034 int j; 2035 unsigned char x[9]; 2036 sqlite3_int64 v = sqlite3_column_int64(pStmt,i); 2037 memcpy(&u, &v, 8); 2038 for(j=8; j>=1; j--){ 2039 x[j] = u & 0xff; 2040 u >>= 8; 2041 } 2042 x[0] = 'I'; 2043 SHA3Update(&cx, x, 9); 2044 break; 2045 } 2046 case SQLITE_FLOAT: { 2047 sqlite3_uint64 u; 2048 int j; 2049 unsigned char x[9]; 2050 double r = sqlite3_column_double(pStmt,i); 2051 memcpy(&u, &r, 8); 2052 for(j=8; j>=1; j--){ 2053 x[j] = u & 0xff; 2054 u >>= 8; 2055 } 2056 x[0] = 'F'; 2057 SHA3Update(&cx,x,9); 2058 break; 2059 } 2060 case SQLITE_TEXT: { 2061 int n2 = sqlite3_column_bytes(pStmt, i); 2062 const unsigned char *z2 = sqlite3_column_text(pStmt, i); 2063 hash_step_vformat(&cx,"T%d:",n2); 2064 SHA3Update(&cx, z2, n2); 2065 break; 2066 } 2067 case SQLITE_BLOB: { 2068 int n2 = sqlite3_column_bytes(pStmt, i); 2069 const unsigned char *z2 = sqlite3_column_blob(pStmt, i); 2070 hash_step_vformat(&cx,"B%d:",n2); 2071 SHA3Update(&cx, z2, n2); 2072 break; 2073 } 2074 } 2075 } 2076 } 2077 sqlite3_finalize(pStmt); 2078 } 2079 sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT); 2080 } 2081 2082 2083 #ifdef _WIN32 2084 2085 #endif 2086 int sqlite3_shathree_init( 2087 sqlite3 *db, 2088 char **pzErrMsg, 2089 const sqlite3_api_routines *pApi 2090 ){ 2091 int rc = SQLITE_OK; 2092 SQLITE_EXTENSION_INIT2(pApi); 2093 (void)pzErrMsg; /* Unused parameter */ 2094 rc = sqlite3_create_function(db, "sha3", 1, 2095 SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC, 2096 0, sha3Func, 0, 0); 2097 if( rc==SQLITE_OK ){ 2098 rc = sqlite3_create_function(db, "sha3", 2, 2099 SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC, 2100 0, sha3Func, 0, 0); 2101 } 2102 if( rc==SQLITE_OK ){ 2103 rc = sqlite3_create_function(db, "sha3_query", 1, 2104 SQLITE_UTF8 | SQLITE_DIRECTONLY, 2105 0, sha3QueryFunc, 0, 0); 2106 } 2107 if( rc==SQLITE_OK ){ 2108 rc = sqlite3_create_function(db, "sha3_query", 2, 2109 SQLITE_UTF8 | SQLITE_DIRECTONLY, 2110 0, sha3QueryFunc, 0, 0); 2111 } 2112 return rc; 2113 } 2114 2115 /************************* End ../ext/misc/shathree.c ********************/ 2116 /************************* Begin ../ext/misc/fileio.c ******************/ 2117 /* 2118 ** 2014-06-13 2119 ** 2120 ** The author disclaims copyright to this source code. In place of 2121 ** a legal notice, here is a blessing: 2122 ** 2123 ** May you do good and not evil. 2124 ** May you find forgiveness for yourself and forgive others. 2125 ** May you share freely, never taking more than you give. 2126 ** 2127 ****************************************************************************** 2128 ** 2129 ** This SQLite extension implements SQL functions readfile() and 2130 ** writefile(), and eponymous virtual type "fsdir". 2131 ** 2132 ** WRITEFILE(FILE, DATA [, MODE [, MTIME]]): 2133 ** 2134 ** If neither of the optional arguments is present, then this UDF 2135 ** function writes blob DATA to file FILE. If successful, the number 2136 ** of bytes written is returned. If an error occurs, NULL is returned. 2137 ** 2138 ** If the first option argument - MODE - is present, then it must 2139 ** be passed an integer value that corresponds to a POSIX mode 2140 ** value (file type + permissions, as returned in the stat.st_mode 2141 ** field by the stat() system call). Three types of files may 2142 ** be written/created: 2143 ** 2144 ** regular files: (mode & 0170000)==0100000 2145 ** symbolic links: (mode & 0170000)==0120000 2146 ** directories: (mode & 0170000)==0040000 2147 ** 2148 ** For a directory, the DATA is ignored. For a symbolic link, it is 2149 ** interpreted as text and used as the target of the link. For a 2150 ** regular file, it is interpreted as a blob and written into the 2151 ** named file. Regardless of the type of file, its permissions are 2152 ** set to (mode & 0777) before returning. 2153 ** 2154 ** If the optional MTIME argument is present, then it is interpreted 2155 ** as an integer - the number of seconds since the unix epoch. The 2156 ** modification-time of the target file is set to this value before 2157 ** returning. 2158 ** 2159 ** If three or more arguments are passed to this function and an 2160 ** error is encountered, an exception is raised. 2161 ** 2162 ** READFILE(FILE): 2163 ** 2164 ** Read and return the contents of file FILE (type blob) from disk. 2165 ** 2166 ** FSDIR: 2167 ** 2168 ** Used as follows: 2169 ** 2170 ** SELECT * FROM fsdir($path [, $dir]); 2171 ** 2172 ** Parameter $path is an absolute or relative pathname. If the file that it 2173 ** refers to does not exist, it is an error. If the path refers to a regular 2174 ** file or symbolic link, it returns a single row. Or, if the path refers 2175 ** to a directory, it returns one row for the directory, and one row for each 2176 ** file within the hierarchy rooted at $path. 2177 ** 2178 ** Each row has the following columns: 2179 ** 2180 ** name: Path to file or directory (text value). 2181 ** mode: Value of stat.st_mode for directory entry (an integer). 2182 ** mtime: Value of stat.st_mtime for directory entry (an integer). 2183 ** data: For a regular file, a blob containing the file data. For a 2184 ** symlink, a text value containing the text of the link. For a 2185 ** directory, NULL. 2186 ** 2187 ** If a non-NULL value is specified for the optional $dir parameter and 2188 ** $path is a relative path, then $path is interpreted relative to $dir. 2189 ** And the paths returned in the "name" column of the table are also 2190 ** relative to directory $dir. 2191 */ 2192 /* #include "sqlite3ext.h" */ 2193 SQLITE_EXTENSION_INIT1 2194 #include <stdio.h> 2195 #include <string.h> 2196 #include <assert.h> 2197 2198 #include <sys/types.h> 2199 #include <sys/stat.h> 2200 #include <fcntl.h> 2201 #if !defined(_WIN32) && !defined(WIN32) 2202 # include <unistd.h> 2203 # include <dirent.h> 2204 # include <utime.h> 2205 # include <sys/time.h> 2206 #else 2207 # include "windows.h" 2208 # include <io.h> 2209 # include <direct.h> 2210 /* # include "test_windirent.h" */ 2211 # define dirent DIRENT 2212 # ifndef chmod 2213 # define chmod _chmod 2214 # endif 2215 # ifndef stat 2216 # define stat _stat 2217 # endif 2218 # define mkdir(path,mode) _mkdir(path) 2219 # define lstat(path,buf) stat(path,buf) 2220 #endif 2221 #include <time.h> 2222 #include <errno.h> 2223 2224 2225 /* 2226 ** Structure of the fsdir() table-valued function 2227 */ 2228 /* 0 1 2 3 4 5 */ 2229 #define FSDIR_SCHEMA "(name,mode,mtime,data,path HIDDEN,dir HIDDEN)" 2230 #define FSDIR_COLUMN_NAME 0 /* Name of the file */ 2231 #define FSDIR_COLUMN_MODE 1 /* Access mode */ 2232 #define FSDIR_COLUMN_MTIME 2 /* Last modification time */ 2233 #define FSDIR_COLUMN_DATA 3 /* File content */ 2234 #define FSDIR_COLUMN_PATH 4 /* Path to top of search */ 2235 #define FSDIR_COLUMN_DIR 5 /* Path is relative to this directory */ 2236 2237 2238 /* 2239 ** Set the result stored by context ctx to a blob containing the 2240 ** contents of file zName. Or, leave the result unchanged (NULL) 2241 ** if the file does not exist or is unreadable. 2242 ** 2243 ** If the file exceeds the SQLite blob size limit, through an 2244 ** SQLITE_TOOBIG error. 2245 ** 2246 ** Throw an SQLITE_IOERR if there are difficulties pulling the file 2247 ** off of disk. 2248 */ 2249 static void readFileContents(sqlite3_context *ctx, const char *zName){ 2250 FILE *in; 2251 sqlite3_int64 nIn; 2252 void *pBuf; 2253 sqlite3 *db; 2254 int mxBlob; 2255 2256 in = fopen(zName, "rb"); 2257 if( in==0 ){ 2258 /* File does not exist or is unreadable. Leave the result set to NULL. */ 2259 return; 2260 } 2261 fseek(in, 0, SEEK_END); 2262 nIn = ftell(in); 2263 rewind(in); 2264 db = sqlite3_context_db_handle(ctx); 2265 mxBlob = sqlite3_limit(db, SQLITE_LIMIT_LENGTH, -1); 2266 if( nIn>mxBlob ){ 2267 sqlite3_result_error_code(ctx, SQLITE_TOOBIG); 2268 fclose(in); 2269 return; 2270 } 2271 pBuf = sqlite3_malloc64( nIn ? nIn : 1 ); 2272 if( pBuf==0 ){ 2273 sqlite3_result_error_nomem(ctx); 2274 fclose(in); 2275 return; 2276 } 2277 if( nIn==(sqlite3_int64)fread(pBuf, 1, (size_t)nIn, in) ){ 2278 sqlite3_result_blob64(ctx, pBuf, nIn, sqlite3_free); 2279 }else{ 2280 sqlite3_result_error_code(ctx, SQLITE_IOERR); 2281 sqlite3_free(pBuf); 2282 } 2283 fclose(in); 2284 } 2285 2286 /* 2287 ** Implementation of the "readfile(X)" SQL function. The entire content 2288 ** of the file named X is read and returned as a BLOB. NULL is returned 2289 ** if the file does not exist or is unreadable. 2290 */ 2291 static void readfileFunc( 2292 sqlite3_context *context, 2293 int argc, 2294 sqlite3_value **argv 2295 ){ 2296 const char *zName; 2297 (void)(argc); /* Unused parameter */ 2298 zName = (const char*)sqlite3_value_text(argv[0]); 2299 if( zName==0 ) return; 2300 readFileContents(context, zName); 2301 } 2302 2303 /* 2304 ** Set the error message contained in context ctx to the results of 2305 ** vprintf(zFmt, ...). 2306 */ 2307 static void ctxErrorMsg(sqlite3_context *ctx, const char *zFmt, ...){ 2308 char *zMsg = 0; 2309 va_list ap; 2310 va_start(ap, zFmt); 2311 zMsg = sqlite3_vmprintf(zFmt, ap); 2312 sqlite3_result_error(ctx, zMsg, -1); 2313 sqlite3_free(zMsg); 2314 va_end(ap); 2315 } 2316 2317 #if defined(_WIN32) 2318 /* 2319 ** This function is designed to convert a Win32 FILETIME structure into the 2320 ** number of seconds since the Unix Epoch (1970-01-01 00:00:00 UTC). 2321 */ 2322 static sqlite3_uint64 fileTimeToUnixTime( 2323 LPFILETIME pFileTime 2324 ){ 2325 SYSTEMTIME epochSystemTime; 2326 ULARGE_INTEGER epochIntervals; 2327 FILETIME epochFileTime; 2328 ULARGE_INTEGER fileIntervals; 2329 2330 memset(&epochSystemTime, 0, sizeof(SYSTEMTIME)); 2331 epochSystemTime.wYear = 1970; 2332 epochSystemTime.wMonth = 1; 2333 epochSystemTime.wDay = 1; 2334 SystemTimeToFileTime(&epochSystemTime, &epochFileTime); 2335 epochIntervals.LowPart = epochFileTime.dwLowDateTime; 2336 epochIntervals.HighPart = epochFileTime.dwHighDateTime; 2337 2338 fileIntervals.LowPart = pFileTime->dwLowDateTime; 2339 fileIntervals.HighPart = pFileTime->dwHighDateTime; 2340 2341 return (fileIntervals.QuadPart - epochIntervals.QuadPart) / 10000000; 2342 } 2343 2344 /* 2345 ** This function attempts to normalize the time values found in the stat() 2346 ** buffer to UTC. This is necessary on Win32, where the runtime library 2347 ** appears to return these values as local times. 2348 */ 2349 static void statTimesToUtc( 2350 const char *zPath, 2351 struct stat *pStatBuf 2352 ){ 2353 HANDLE hFindFile; 2354 WIN32_FIND_DATAW fd; 2355 LPWSTR zUnicodeName; 2356 extern LPWSTR sqlite3_win32_utf8_to_unicode(const char*); 2357 zUnicodeName = sqlite3_win32_utf8_to_unicode(zPath); 2358 if( zUnicodeName ){ 2359 memset(&fd, 0, sizeof(WIN32_FIND_DATAW)); 2360 hFindFile = FindFirstFileW(zUnicodeName, &fd); 2361 if( hFindFile!=NULL ){ 2362 pStatBuf->st_ctime = (time_t)fileTimeToUnixTime(&fd.ftCreationTime); 2363 pStatBuf->st_atime = (time_t)fileTimeToUnixTime(&fd.ftLastAccessTime); 2364 pStatBuf->st_mtime = (time_t)fileTimeToUnixTime(&fd.ftLastWriteTime); 2365 FindClose(hFindFile); 2366 } 2367 sqlite3_free(zUnicodeName); 2368 } 2369 } 2370 #endif 2371 2372 /* 2373 ** This function is used in place of stat(). On Windows, special handling 2374 ** is required in order for the included time to be returned as UTC. On all 2375 ** other systems, this function simply calls stat(). 2376 */ 2377 static int fileStat( 2378 const char *zPath, 2379 struct stat *pStatBuf 2380 ){ 2381 #if defined(_WIN32) 2382 int rc = stat(zPath, pStatBuf); 2383 if( rc==0 ) statTimesToUtc(zPath, pStatBuf); 2384 return rc; 2385 #else 2386 return stat(zPath, pStatBuf); 2387 #endif 2388 } 2389 2390 /* 2391 ** This function is used in place of lstat(). On Windows, special handling 2392 ** is required in order for the included time to be returned as UTC. On all 2393 ** other systems, this function simply calls lstat(). 2394 */ 2395 static int fileLinkStat( 2396 const char *zPath, 2397 struct stat *pStatBuf 2398 ){ 2399 #if defined(_WIN32) 2400 int rc = lstat(zPath, pStatBuf); 2401 if( rc==0 ) statTimesToUtc(zPath, pStatBuf); 2402 return rc; 2403 #else 2404 return lstat(zPath, pStatBuf); 2405 #endif 2406 } 2407 2408 /* 2409 ** Argument zFile is the name of a file that will be created and/or written 2410 ** by SQL function writefile(). This function ensures that the directory 2411 ** zFile will be written to exists, creating it if required. The permissions 2412 ** for any path components created by this function are set in accordance 2413 ** with the current umask. 2414 ** 2415 ** If an OOM condition is encountered, SQLITE_NOMEM is returned. Otherwise, 2416 ** SQLITE_OK is returned if the directory is successfully created, or 2417 ** SQLITE_ERROR otherwise. 2418 */ 2419 static int makeDirectory( 2420 const char *zFile 2421 ){ 2422 char *zCopy = sqlite3_mprintf("%s", zFile); 2423 int rc = SQLITE_OK; 2424 2425 if( zCopy==0 ){ 2426 rc = SQLITE_NOMEM; 2427 }else{ 2428 int nCopy = (int)strlen(zCopy); 2429 int i = 1; 2430 2431 while( rc==SQLITE_OK ){ 2432 struct stat sStat; 2433 int rc2; 2434 2435 for(; zCopy[i]!='/' && i<nCopy; i++); 2436 if( i==nCopy ) break; 2437 zCopy[i] = '\0'; 2438 2439 rc2 = fileStat(zCopy, &sStat); 2440 if( rc2!=0 ){ 2441 if( mkdir(zCopy, 0777) ) rc = SQLITE_ERROR; 2442 }else{ 2443 if( !S_ISDIR(sStat.st_mode) ) rc = SQLITE_ERROR; 2444 } 2445 zCopy[i] = '/'; 2446 i++; 2447 } 2448 2449 sqlite3_free(zCopy); 2450 } 2451 2452 return rc; 2453 } 2454 2455 /* 2456 ** This function does the work for the writefile() UDF. Refer to 2457 ** header comments at the top of this file for details. 2458 */ 2459 static int writeFile( 2460 sqlite3_context *pCtx, /* Context to return bytes written in */ 2461 const char *zFile, /* File to write */ 2462 sqlite3_value *pData, /* Data to write */ 2463 mode_t mode, /* MODE parameter passed to writefile() */ 2464 sqlite3_int64 mtime /* MTIME parameter (or -1 to not set time) */ 2465 ){ 2466 #if !defined(_WIN32) && !defined(WIN32) 2467 if( S_ISLNK(mode) ){ 2468 const char *zTo = (const char*)sqlite3_value_text(pData); 2469 if( symlink(zTo, zFile)<0 ) return 1; 2470 }else 2471 #endif 2472 { 2473 if( S_ISDIR(mode) ){ 2474 if( mkdir(zFile, mode) ){ 2475 /* The mkdir() call to create the directory failed. This might not 2476 ** be an error though - if there is already a directory at the same 2477 ** path and either the permissions already match or can be changed 2478 ** to do so using chmod(), it is not an error. */ 2479 struct stat sStat; 2480 if( errno!=EEXIST 2481 || 0!=fileStat(zFile, &sStat) 2482 || !S_ISDIR(sStat.st_mode) 2483 || ((sStat.st_mode&0777)!=(mode&0777) && 0!=chmod(zFile, mode&0777)) 2484 ){ 2485 return 1; 2486 } 2487 } 2488 }else{ 2489 sqlite3_int64 nWrite = 0; 2490 const char *z; 2491 int rc = 0; 2492 FILE *out = fopen(zFile, "wb"); 2493 if( out==0 ) return 1; 2494 z = (const char*)sqlite3_value_blob(pData); 2495 if( z ){ 2496 sqlite3_int64 n = fwrite(z, 1, sqlite3_value_bytes(pData), out); 2497 nWrite = sqlite3_value_bytes(pData); 2498 if( nWrite!=n ){ 2499 rc = 1; 2500 } 2501 } 2502 fclose(out); 2503 if( rc==0 && mode && chmod(zFile, mode & 0777) ){ 2504 rc = 1; 2505 } 2506 if( rc ) return 2; 2507 sqlite3_result_int64(pCtx, nWrite); 2508 } 2509 } 2510 2511 if( mtime>=0 ){ 2512 #if defined(_WIN32) 2513 #if !SQLITE_OS_WINRT 2514 /* Windows */ 2515 FILETIME lastAccess; 2516 FILETIME lastWrite; 2517 SYSTEMTIME currentTime; 2518 LONGLONG intervals; 2519 HANDLE hFile; 2520 LPWSTR zUnicodeName; 2521 extern LPWSTR sqlite3_win32_utf8_to_unicode(const char*); 2522 2523 GetSystemTime(¤tTime); 2524 SystemTimeToFileTime(¤tTime, &lastAccess); 2525 intervals = Int32x32To64(mtime, 10000000) + 116444736000000000; 2526 lastWrite.dwLowDateTime = (DWORD)intervals; 2527 lastWrite.dwHighDateTime = intervals >> 32; 2528 zUnicodeName = sqlite3_win32_utf8_to_unicode(zFile); 2529 if( zUnicodeName==0 ){ 2530 return 1; 2531 } 2532 hFile = CreateFileW( 2533 zUnicodeName, FILE_WRITE_ATTRIBUTES, 0, NULL, OPEN_EXISTING, 2534 FILE_FLAG_BACKUP_SEMANTICS, NULL 2535 ); 2536 sqlite3_free(zUnicodeName); 2537 if( hFile!=INVALID_HANDLE_VALUE ){ 2538 BOOL bResult = SetFileTime(hFile, NULL, &lastAccess, &lastWrite); 2539 CloseHandle(hFile); 2540 return !bResult; 2541 }else{ 2542 return 1; 2543 } 2544 #endif 2545 #elif defined(AT_FDCWD) && 0 /* utimensat() is not universally available */ 2546 /* Recent unix */ 2547 struct timespec times[2]; 2548 times[0].tv_nsec = times[1].tv_nsec = 0; 2549 times[0].tv_sec = time(0); 2550 times[1].tv_sec = mtime; 2551 if( utimensat(AT_FDCWD, zFile, times, AT_SYMLINK_NOFOLLOW) ){ 2552 return 1; 2553 } 2554 #else 2555 /* Legacy unix */ 2556 struct timeval times[2]; 2557 times[0].tv_usec = times[1].tv_usec = 0; 2558 times[0].tv_sec = time(0); 2559 times[1].tv_sec = mtime; 2560 if( utimes(zFile, times) ){ 2561 return 1; 2562 } 2563 #endif 2564 } 2565 2566 return 0; 2567 } 2568 2569 /* 2570 ** Implementation of the "writefile(W,X[,Y[,Z]]])" SQL function. 2571 ** Refer to header comments at the top of this file for details. 2572 */ 2573 static void writefileFunc( 2574 sqlite3_context *context, 2575 int argc, 2576 sqlite3_value **argv 2577 ){ 2578 const char *zFile; 2579 mode_t mode = 0; 2580 int res; 2581 sqlite3_int64 mtime = -1; 2582 2583 if( argc<2 || argc>4 ){ 2584 sqlite3_result_error(context, 2585 "wrong number of arguments to function writefile()", -1 2586 ); 2587 return; 2588 } 2589 2590 zFile = (const char*)sqlite3_value_text(argv[0]); 2591 if( zFile==0 ) return; 2592 if( argc>=3 ){ 2593 mode = (mode_t)sqlite3_value_int(argv[2]); 2594 } 2595 if( argc==4 ){ 2596 mtime = sqlite3_value_int64(argv[3]); 2597 } 2598 2599 res = writeFile(context, zFile, argv[1], mode, mtime); 2600 if( res==1 && errno==ENOENT ){ 2601 if( makeDirectory(zFile)==SQLITE_OK ){ 2602 res = writeFile(context, zFile, argv[1], mode, mtime); 2603 } 2604 } 2605 2606 if( argc>2 && res!=0 ){ 2607 if( S_ISLNK(mode) ){ 2608 ctxErrorMsg(context, "failed to create symlink: %s", zFile); 2609 }else if( S_ISDIR(mode) ){ 2610 ctxErrorMsg(context, "failed to create directory: %s", zFile); 2611 }else{ 2612 ctxErrorMsg(context, "failed to write file: %s", zFile); 2613 } 2614 } 2615 } 2616 2617 /* 2618 ** SQL function: lsmode(MODE) 2619 ** 2620 ** Given a numberic st_mode from stat(), convert it into a human-readable 2621 ** text string in the style of "ls -l". 2622 */ 2623 static void lsModeFunc( 2624 sqlite3_context *context, 2625 int argc, 2626 sqlite3_value **argv 2627 ){ 2628 int i; 2629 int iMode = sqlite3_value_int(argv[0]); 2630 char z[16]; 2631 (void)argc; 2632 if( S_ISLNK(iMode) ){ 2633 z[0] = 'l'; 2634 }else if( S_ISREG(iMode) ){ 2635 z[0] = '-'; 2636 }else if( S_ISDIR(iMode) ){ 2637 z[0] = 'd'; 2638 }else{ 2639 z[0] = '?'; 2640 } 2641 for(i=0; i<3; i++){ 2642 int m = (iMode >> ((2-i)*3)); 2643 char *a = &z[1 + i*3]; 2644 a[0] = (m & 0x4) ? 'r' : '-'; 2645 a[1] = (m & 0x2) ? 'w' : '-'; 2646 a[2] = (m & 0x1) ? 'x' : '-'; 2647 } 2648 z[10] = '\0'; 2649 sqlite3_result_text(context, z, -1, SQLITE_TRANSIENT); 2650 } 2651 2652 #ifndef SQLITE_OMIT_VIRTUALTABLE 2653 2654 /* 2655 ** Cursor type for recursively iterating through a directory structure. 2656 */ 2657 typedef struct fsdir_cursor fsdir_cursor; 2658 typedef struct FsdirLevel FsdirLevel; 2659 2660 struct FsdirLevel { 2661 DIR *pDir; /* From opendir() */ 2662 char *zDir; /* Name of directory (nul-terminated) */ 2663 }; 2664 2665 struct fsdir_cursor { 2666 sqlite3_vtab_cursor base; /* Base class - must be first */ 2667 2668 int nLvl; /* Number of entries in aLvl[] array */ 2669 int iLvl; /* Index of current entry */ 2670 FsdirLevel *aLvl; /* Hierarchy of directories being traversed */ 2671 2672 const char *zBase; 2673 int nBase; 2674 2675 struct stat sStat; /* Current lstat() results */ 2676 char *zPath; /* Path to current entry */ 2677 sqlite3_int64 iRowid; /* Current rowid */ 2678 }; 2679 2680 typedef struct fsdir_tab fsdir_tab; 2681 struct fsdir_tab { 2682 sqlite3_vtab base; /* Base class - must be first */ 2683 }; 2684 2685 /* 2686 ** Construct a new fsdir virtual table object. 2687 */ 2688 static int fsdirConnect( 2689 sqlite3 *db, 2690 void *pAux, 2691 int argc, const char *const*argv, 2692 sqlite3_vtab **ppVtab, 2693 char **pzErr 2694 ){ 2695 fsdir_tab *pNew = 0; 2696 int rc; 2697 (void)pAux; 2698 (void)argc; 2699 (void)argv; 2700 (void)pzErr; 2701 rc = sqlite3_declare_vtab(db, "CREATE TABLE x" FSDIR_SCHEMA); 2702 if( rc==SQLITE_OK ){ 2703 pNew = (fsdir_tab*)sqlite3_malloc( sizeof(*pNew) ); 2704 if( pNew==0 ) return SQLITE_NOMEM; 2705 memset(pNew, 0, sizeof(*pNew)); 2706 sqlite3_vtab_config(db, SQLITE_VTAB_DIRECTONLY); 2707 } 2708 *ppVtab = (sqlite3_vtab*)pNew; 2709 return rc; 2710 } 2711 2712 /* 2713 ** This method is the destructor for fsdir vtab objects. 2714 */ 2715 static int fsdirDisconnect(sqlite3_vtab *pVtab){ 2716 sqlite3_free(pVtab); 2717 return SQLITE_OK; 2718 } 2719 2720 /* 2721 ** Constructor for a new fsdir_cursor object. 2722 */ 2723 static int fsdirOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ 2724 fsdir_cursor *pCur; 2725 (void)p; 2726 pCur = sqlite3_malloc( sizeof(*pCur) ); 2727 if( pCur==0 ) return SQLITE_NOMEM; 2728 memset(pCur, 0, sizeof(*pCur)); 2729 pCur->iLvl = -1; 2730 *ppCursor = &pCur->base; 2731 return SQLITE_OK; 2732 } 2733 2734 /* 2735 ** Reset a cursor back to the state it was in when first returned 2736 ** by fsdirOpen(). 2737 */ 2738 static void fsdirResetCursor(fsdir_cursor *pCur){ 2739 int i; 2740 for(i=0; i<=pCur->iLvl; i++){ 2741 FsdirLevel *pLvl = &pCur->aLvl[i]; 2742 if( pLvl->pDir ) closedir(pLvl->pDir); 2743 sqlite3_free(pLvl->zDir); 2744 } 2745 sqlite3_free(pCur->zPath); 2746 sqlite3_free(pCur->aLvl); 2747 pCur->aLvl = 0; 2748 pCur->zPath = 0; 2749 pCur->zBase = 0; 2750 pCur->nBase = 0; 2751 pCur->nLvl = 0; 2752 pCur->iLvl = -1; 2753 pCur->iRowid = 1; 2754 } 2755 2756 /* 2757 ** Destructor for an fsdir_cursor. 2758 */ 2759 static int fsdirClose(sqlite3_vtab_cursor *cur){ 2760 fsdir_cursor *pCur = (fsdir_cursor*)cur; 2761 2762 fsdirResetCursor(pCur); 2763 sqlite3_free(pCur); 2764 return SQLITE_OK; 2765 } 2766 2767 /* 2768 ** Set the error message for the virtual table associated with cursor 2769 ** pCur to the results of vprintf(zFmt, ...). 2770 */ 2771 static void fsdirSetErrmsg(fsdir_cursor *pCur, const char *zFmt, ...){ 2772 va_list ap; 2773 va_start(ap, zFmt); 2774 pCur->base.pVtab->zErrMsg = sqlite3_vmprintf(zFmt, ap); 2775 va_end(ap); 2776 } 2777 2778 2779 /* 2780 ** Advance an fsdir_cursor to its next row of output. 2781 */ 2782 static int fsdirNext(sqlite3_vtab_cursor *cur){ 2783 fsdir_cursor *pCur = (fsdir_cursor*)cur; 2784 mode_t m = pCur->sStat.st_mode; 2785 2786 pCur->iRowid++; 2787 if( S_ISDIR(m) ){ 2788 /* Descend into this directory */ 2789 int iNew = pCur->iLvl + 1; 2790 FsdirLevel *pLvl; 2791 if( iNew>=pCur->nLvl ){ 2792 int nNew = iNew+1; 2793 sqlite3_int64 nByte = nNew*sizeof(FsdirLevel); 2794 FsdirLevel *aNew = (FsdirLevel*)sqlite3_realloc64(pCur->aLvl, nByte); 2795 if( aNew==0 ) return SQLITE_NOMEM; 2796 memset(&aNew[pCur->nLvl], 0, sizeof(FsdirLevel)*(nNew-pCur->nLvl)); 2797 pCur->aLvl = aNew; 2798 pCur->nLvl = nNew; 2799 } 2800 pCur->iLvl = iNew; 2801 pLvl = &pCur->aLvl[iNew]; 2802 2803 pLvl->zDir = pCur->zPath; 2804 pCur->zPath = 0; 2805 pLvl->pDir = opendir(pLvl->zDir); 2806 if( pLvl->pDir==0 ){ 2807 fsdirSetErrmsg(pCur, "cannot read directory: %s", pCur->zPath); 2808 return SQLITE_ERROR; 2809 } 2810 } 2811 2812 while( pCur->iLvl>=0 ){ 2813 FsdirLevel *pLvl = &pCur->aLvl[pCur->iLvl]; 2814 struct dirent *pEntry = readdir(pLvl->pDir); 2815 if( pEntry ){ 2816 if( pEntry->d_name[0]=='.' ){ 2817 if( pEntry->d_name[1]=='.' && pEntry->d_name[2]=='\0' ) continue; 2818 if( pEntry->d_name[1]=='\0' ) continue; 2819 } 2820 sqlite3_free(pCur->zPath); 2821 pCur->zPath = sqlite3_mprintf("%s/%s", pLvl->zDir, pEntry->d_name); 2822 if( pCur->zPath==0 ) return SQLITE_NOMEM; 2823 if( fileLinkStat(pCur->zPath, &pCur->sStat) ){ 2824 fsdirSetErrmsg(pCur, "cannot stat file: %s", pCur->zPath); 2825 return SQLITE_ERROR; 2826 } 2827 return SQLITE_OK; 2828 } 2829 closedir(pLvl->pDir); 2830 sqlite3_free(pLvl->zDir); 2831 pLvl->pDir = 0; 2832 pLvl->zDir = 0; 2833 pCur->iLvl--; 2834 } 2835 2836 /* EOF */ 2837 sqlite3_free(pCur->zPath); 2838 pCur->zPath = 0; 2839 return SQLITE_OK; 2840 } 2841 2842 /* 2843 ** Return values of columns for the row at which the series_cursor 2844 ** is currently pointing. 2845 */ 2846 static int fsdirColumn( 2847 sqlite3_vtab_cursor *cur, /* The cursor */ 2848 sqlite3_context *ctx, /* First argument to sqlite3_result_...() */ 2849 int i /* Which column to return */ 2850 ){ 2851 fsdir_cursor *pCur = (fsdir_cursor*)cur; 2852 switch( i ){ 2853 case FSDIR_COLUMN_NAME: { 2854 sqlite3_result_text(ctx, &pCur->zPath[pCur->nBase], -1, SQLITE_TRANSIENT); 2855 break; 2856 } 2857 2858 case FSDIR_COLUMN_MODE: 2859 sqlite3_result_int64(ctx, pCur->sStat.st_mode); 2860 break; 2861 2862 case FSDIR_COLUMN_MTIME: 2863 sqlite3_result_int64(ctx, pCur->sStat.st_mtime); 2864 break; 2865 2866 case FSDIR_COLUMN_DATA: { 2867 mode_t m = pCur->sStat.st_mode; 2868 if( S_ISDIR(m) ){ 2869 sqlite3_result_null(ctx); 2870 #if !defined(_WIN32) && !defined(WIN32) 2871 }else if( S_ISLNK(m) ){ 2872 char aStatic[64]; 2873 char *aBuf = aStatic; 2874 sqlite3_int64 nBuf = 64; 2875 int n; 2876 2877 while( 1 ){ 2878 n = readlink(pCur->zPath, aBuf, nBuf); 2879 if( n<nBuf ) break; 2880 if( aBuf!=aStatic ) sqlite3_free(aBuf); 2881 nBuf = nBuf*2; 2882 aBuf = sqlite3_malloc64(nBuf); 2883 if( aBuf==0 ){ 2884 sqlite3_result_error_nomem(ctx); 2885 return SQLITE_NOMEM; 2886 } 2887 } 2888 2889 sqlite3_result_text(ctx, aBuf, n, SQLITE_TRANSIENT); 2890 if( aBuf!=aStatic ) sqlite3_free(aBuf); 2891 #endif 2892 }else{ 2893 readFileContents(ctx, pCur->zPath); 2894 } 2895 } 2896 case FSDIR_COLUMN_PATH: 2897 default: { 2898 /* The FSDIR_COLUMN_PATH and FSDIR_COLUMN_DIR are input parameters. 2899 ** always return their values as NULL */ 2900 break; 2901 } 2902 } 2903 return SQLITE_OK; 2904 } 2905 2906 /* 2907 ** Return the rowid for the current row. In this implementation, the 2908 ** first row returned is assigned rowid value 1, and each subsequent 2909 ** row a value 1 more than that of the previous. 2910 */ 2911 static int fsdirRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ 2912 fsdir_cursor *pCur = (fsdir_cursor*)cur; 2913 *pRowid = pCur->iRowid; 2914 return SQLITE_OK; 2915 } 2916 2917 /* 2918 ** Return TRUE if the cursor has been moved off of the last 2919 ** row of output. 2920 */ 2921 static int fsdirEof(sqlite3_vtab_cursor *cur){ 2922 fsdir_cursor *pCur = (fsdir_cursor*)cur; 2923 return (pCur->zPath==0); 2924 } 2925 2926 /* 2927 ** xFilter callback. 2928 ** 2929 ** idxNum==1 PATH parameter only 2930 ** idxNum==2 Both PATH and DIR supplied 2931 */ 2932 static int fsdirFilter( 2933 sqlite3_vtab_cursor *cur, 2934 int idxNum, const char *idxStr, 2935 int argc, sqlite3_value **argv 2936 ){ 2937 const char *zDir = 0; 2938 fsdir_cursor *pCur = (fsdir_cursor*)cur; 2939 (void)idxStr; 2940 fsdirResetCursor(pCur); 2941 2942 if( idxNum==0 ){ 2943 fsdirSetErrmsg(pCur, "table function fsdir requires an argument"); 2944 return SQLITE_ERROR; 2945 } 2946 2947 assert( argc==idxNum && (argc==1 || argc==2) ); 2948 zDir = (const char*)sqlite3_value_text(argv[0]); 2949 if( zDir==0 ){ 2950 fsdirSetErrmsg(pCur, "table function fsdir requires a non-NULL argument"); 2951 return SQLITE_ERROR; 2952 } 2953 if( argc==2 ){ 2954 pCur->zBase = (const char*)sqlite3_value_text(argv[1]); 2955 } 2956 if( pCur->zBase ){ 2957 pCur->nBase = (int)strlen(pCur->zBase)+1; 2958 pCur->zPath = sqlite3_mprintf("%s/%s", pCur->zBase, zDir); 2959 }else{ 2960 pCur->zPath = sqlite3_mprintf("%s", zDir); 2961 } 2962 2963 if( pCur->zPath==0 ){ 2964 return SQLITE_NOMEM; 2965 } 2966 if( fileLinkStat(pCur->zPath, &pCur->sStat) ){ 2967 fsdirSetErrmsg(pCur, "cannot stat file: %s", pCur->zPath); 2968 return SQLITE_ERROR; 2969 } 2970 2971 return SQLITE_OK; 2972 } 2973 2974 /* 2975 ** SQLite will invoke this method one or more times while planning a query 2976 ** that uses the generate_series virtual table. This routine needs to create 2977 ** a query plan for each invocation and compute an estimated cost for that 2978 ** plan. 2979 ** 2980 ** In this implementation idxNum is used to represent the 2981 ** query plan. idxStr is unused. 2982 ** 2983 ** The query plan is represented by values of idxNum: 2984 ** 2985 ** (1) The path value is supplied by argv[0] 2986 ** (2) Path is in argv[0] and dir is in argv[1] 2987 */ 2988 static int fsdirBestIndex( 2989 sqlite3_vtab *tab, 2990 sqlite3_index_info *pIdxInfo 2991 ){ 2992 int i; /* Loop over constraints */ 2993 int idxPath = -1; /* Index in pIdxInfo->aConstraint of PATH= */ 2994 int idxDir = -1; /* Index in pIdxInfo->aConstraint of DIR= */ 2995 int seenPath = 0; /* True if an unusable PATH= constraint is seen */ 2996 int seenDir = 0; /* True if an unusable DIR= constraint is seen */ 2997 const struct sqlite3_index_constraint *pConstraint; 2998 2999 (void)tab; 3000 pConstraint = pIdxInfo->aConstraint; 3001 for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){ 3002 if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue; 3003 switch( pConstraint->iColumn ){ 3004 case FSDIR_COLUMN_PATH: { 3005 if( pConstraint->usable ){ 3006 idxPath = i; 3007 seenPath = 0; 3008 }else if( idxPath<0 ){ 3009 seenPath = 1; 3010 } 3011 break; 3012 } 3013 case FSDIR_COLUMN_DIR: { 3014 if( pConstraint->usable ){ 3015 idxDir = i; 3016 seenDir = 0; 3017 }else if( idxDir<0 ){ 3018 seenDir = 1; 3019 } 3020 break; 3021 } 3022 } 3023 } 3024 if( seenPath || seenDir ){ 3025 /* If input parameters are unusable, disallow this plan */ 3026 return SQLITE_CONSTRAINT; 3027 } 3028 3029 if( idxPath<0 ){ 3030 pIdxInfo->idxNum = 0; 3031 /* The pIdxInfo->estimatedCost should have been initialized to a huge 3032 ** number. Leave it unchanged. */ 3033 pIdxInfo->estimatedRows = 0x7fffffff; 3034 }else{ 3035 pIdxInfo->aConstraintUsage[idxPath].omit = 1; 3036 pIdxInfo->aConstraintUsage[idxPath].argvIndex = 1; 3037 if( idxDir>=0 ){ 3038 pIdxInfo->aConstraintUsage[idxDir].omit = 1; 3039 pIdxInfo->aConstraintUsage[idxDir].argvIndex = 2; 3040 pIdxInfo->idxNum = 2; 3041 pIdxInfo->estimatedCost = 10.0; 3042 }else{ 3043 pIdxInfo->idxNum = 1; 3044 pIdxInfo->estimatedCost = 100.0; 3045 } 3046 } 3047 3048 return SQLITE_OK; 3049 } 3050 3051 /* 3052 ** Register the "fsdir" virtual table. 3053 */ 3054 static int fsdirRegister(sqlite3 *db){ 3055 static sqlite3_module fsdirModule = { 3056 0, /* iVersion */ 3057 0, /* xCreate */ 3058 fsdirConnect, /* xConnect */ 3059 fsdirBestIndex, /* xBestIndex */ 3060 fsdirDisconnect, /* xDisconnect */ 3061 0, /* xDestroy */ 3062 fsdirOpen, /* xOpen - open a cursor */ 3063 fsdirClose, /* xClose - close a cursor */ 3064 fsdirFilter, /* xFilter - configure scan constraints */ 3065 fsdirNext, /* xNext - advance a cursor */ 3066 fsdirEof, /* xEof - check for end of scan */ 3067 fsdirColumn, /* xColumn - read data */ 3068 fsdirRowid, /* xRowid - read data */ 3069 0, /* xUpdate */ 3070 0, /* xBegin */ 3071 0, /* xSync */ 3072 0, /* xCommit */ 3073 0, /* xRollback */ 3074 0, /* xFindMethod */ 3075 0, /* xRename */ 3076 0, /* xSavepoint */ 3077 0, /* xRelease */ 3078 0, /* xRollbackTo */ 3079 0, /* xShadowName */ 3080 }; 3081 3082 int rc = sqlite3_create_module(db, "fsdir", &fsdirModule, 0); 3083 return rc; 3084 } 3085 #else /* SQLITE_OMIT_VIRTUALTABLE */ 3086 # define fsdirRegister(x) SQLITE_OK 3087 #endif 3088 3089 #ifdef _WIN32 3090 3091 #endif 3092 int sqlite3_fileio_init( 3093 sqlite3 *db, 3094 char **pzErrMsg, 3095 const sqlite3_api_routines *pApi 3096 ){ 3097 int rc = SQLITE_OK; 3098 SQLITE_EXTENSION_INIT2(pApi); 3099 (void)pzErrMsg; /* Unused parameter */ 3100 rc = sqlite3_create_function(db, "readfile", 1, 3101 SQLITE_UTF8|SQLITE_DIRECTONLY, 0, 3102 readfileFunc, 0, 0); 3103 if( rc==SQLITE_OK ){ 3104 rc = sqlite3_create_function(db, "writefile", -1, 3105 SQLITE_UTF8|SQLITE_DIRECTONLY, 0, 3106 writefileFunc, 0, 0); 3107 } 3108 if( rc==SQLITE_OK ){ 3109 rc = sqlite3_create_function(db, "lsmode", 1, SQLITE_UTF8, 0, 3110 lsModeFunc, 0, 0); 3111 } 3112 if( rc==SQLITE_OK ){ 3113 rc = fsdirRegister(db); 3114 } 3115 return rc; 3116 } 3117 3118 /************************* End ../ext/misc/fileio.c ********************/ 3119 /************************* Begin ../ext/misc/completion.c ******************/ 3120 /* 3121 ** 2017-07-10 3122 ** 3123 ** The author disclaims copyright to this source code. In place of 3124 ** a legal notice, here is a blessing: 3125 ** 3126 ** May you do good and not evil. 3127 ** May you find forgiveness for yourself and forgive others. 3128 ** May you share freely, never taking more than you give. 3129 ** 3130 ************************************************************************* 3131 ** 3132 ** This file implements an eponymous virtual table that returns suggested 3133 ** completions for a partial SQL input. 3134 ** 3135 ** Suggested usage: 3136 ** 3137 ** SELECT DISTINCT candidate COLLATE nocase 3138 ** FROM completion($prefix,$wholeline) 3139 ** ORDER BY 1; 3140 ** 3141 ** The two query parameters are optional. $prefix is the text of the 3142 ** current word being typed and that is to be completed. $wholeline is 3143 ** the complete input line, used for context. 3144 ** 3145 ** The raw completion() table might return the same candidate multiple 3146 ** times, for example if the same column name is used to two or more 3147 ** tables. And the candidates are returned in an arbitrary order. Hence, 3148 ** the DISTINCT and ORDER BY are recommended. 3149 ** 3150 ** This virtual table operates at the speed of human typing, and so there 3151 ** is no attempt to make it fast. Even a slow implementation will be much 3152 ** faster than any human can type. 3153 ** 3154 */ 3155 /* #include "sqlite3ext.h" */ 3156 SQLITE_EXTENSION_INIT1 3157 #include <assert.h> 3158 #include <string.h> 3159 #include <ctype.h> 3160 3161 #ifndef SQLITE_OMIT_VIRTUALTABLE 3162 3163 /* completion_vtab is a subclass of sqlite3_vtab which will 3164 ** serve as the underlying representation of a completion virtual table 3165 */ 3166 typedef struct completion_vtab completion_vtab; 3167 struct completion_vtab { 3168 sqlite3_vtab base; /* Base class - must be first */ 3169 sqlite3 *db; /* Database connection for this completion vtab */ 3170 }; 3171 3172 /* completion_cursor is a subclass of sqlite3_vtab_cursor which will 3173 ** serve as the underlying representation of a cursor that scans 3174 ** over rows of the result 3175 */ 3176 typedef struct completion_cursor completion_cursor; 3177 struct completion_cursor { 3178 sqlite3_vtab_cursor base; /* Base class - must be first */ 3179 sqlite3 *db; /* Database connection for this cursor */ 3180 int nPrefix, nLine; /* Number of bytes in zPrefix and zLine */ 3181 char *zPrefix; /* The prefix for the word we want to complete */ 3182 char *zLine; /* The whole that we want to complete */ 3183 const char *zCurrentRow; /* Current output row */ 3184 int szRow; /* Length of the zCurrentRow string */ 3185 sqlite3_stmt *pStmt; /* Current statement */ 3186 sqlite3_int64 iRowid; /* The rowid */ 3187 int ePhase; /* Current phase */ 3188 int j; /* inter-phase counter */ 3189 }; 3190 3191 /* Values for ePhase: 3192 */ 3193 #define COMPLETION_FIRST_PHASE 1 3194 #define COMPLETION_KEYWORDS 1 3195 #define COMPLETION_PRAGMAS 2 3196 #define COMPLETION_FUNCTIONS 3 3197 #define COMPLETION_COLLATIONS 4 3198 #define COMPLETION_INDEXES 5 3199 #define COMPLETION_TRIGGERS 6 3200 #define COMPLETION_DATABASES 7 3201 #define COMPLETION_TABLES 8 /* Also VIEWs and TRIGGERs */ 3202 #define COMPLETION_COLUMNS 9 3203 #define COMPLETION_MODULES 10 3204 #define COMPLETION_EOF 11 3205 3206 /* 3207 ** The completionConnect() method is invoked to create a new 3208 ** completion_vtab that describes the completion virtual table. 3209 ** 3210 ** Think of this routine as the constructor for completion_vtab objects. 3211 ** 3212 ** All this routine needs to do is: 3213 ** 3214 ** (1) Allocate the completion_vtab object and initialize all fields. 3215 ** 3216 ** (2) Tell SQLite (via the sqlite3_declare_vtab() interface) what the 3217 ** result set of queries against completion will look like. 3218 */ 3219 static int completionConnect( 3220 sqlite3 *db, 3221 void *pAux, 3222 int argc, const char *const*argv, 3223 sqlite3_vtab **ppVtab, 3224 char **pzErr 3225 ){ 3226 completion_vtab *pNew; 3227 int rc; 3228 3229 (void)(pAux); /* Unused parameter */ 3230 (void)(argc); /* Unused parameter */ 3231 (void)(argv); /* Unused parameter */ 3232 (void)(pzErr); /* Unused parameter */ 3233 3234 /* Column numbers */ 3235 #define COMPLETION_COLUMN_CANDIDATE 0 /* Suggested completion of the input */ 3236 #define COMPLETION_COLUMN_PREFIX 1 /* Prefix of the word to be completed */ 3237 #define COMPLETION_COLUMN_WHOLELINE 2 /* Entire line seen so far */ 3238 #define COMPLETION_COLUMN_PHASE 3 /* ePhase - used for debugging only */ 3239 3240 sqlite3_vtab_config(db, SQLITE_VTAB_INNOCUOUS); 3241 rc = sqlite3_declare_vtab(db, 3242 "CREATE TABLE x(" 3243 " candidate TEXT," 3244 " prefix TEXT HIDDEN," 3245 " wholeline TEXT HIDDEN," 3246 " phase INT HIDDEN" /* Used for debugging only */ 3247 ")"); 3248 if( rc==SQLITE_OK ){ 3249 pNew = sqlite3_malloc( sizeof(*pNew) ); 3250 *ppVtab = (sqlite3_vtab*)pNew; 3251 if( pNew==0 ) return SQLITE_NOMEM; 3252 memset(pNew, 0, sizeof(*pNew)); 3253 pNew->db = db; 3254 } 3255 return rc; 3256 } 3257 3258 /* 3259 ** This method is the destructor for completion_cursor objects. 3260 */ 3261 static int completionDisconnect(sqlite3_vtab *pVtab){ 3262 sqlite3_free(pVtab); 3263 return SQLITE_OK; 3264 } 3265 3266 /* 3267 ** Constructor for a new completion_cursor object. 3268 */ 3269 static int completionOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ 3270 completion_cursor *pCur; 3271 pCur = sqlite3_malloc( sizeof(*pCur) ); 3272 if( pCur==0 ) return SQLITE_NOMEM; 3273 memset(pCur, 0, sizeof(*pCur)); 3274 pCur->db = ((completion_vtab*)p)->db; 3275 *ppCursor = &pCur->base; 3276 return SQLITE_OK; 3277 } 3278 3279 /* 3280 ** Reset the completion_cursor. 3281 */ 3282 static void completionCursorReset(completion_cursor *pCur){ 3283 sqlite3_free(pCur->zPrefix); pCur->zPrefix = 0; pCur->nPrefix = 0; 3284 sqlite3_free(pCur->zLine); pCur->zLine = 0; pCur->nLine = 0; 3285 sqlite3_finalize(pCur->pStmt); pCur->pStmt = 0; 3286 pCur->j = 0; 3287 } 3288 3289 /* 3290 ** Destructor for a completion_cursor. 3291 */ 3292 static int completionClose(sqlite3_vtab_cursor *cur){ 3293 completionCursorReset((completion_cursor*)cur); 3294 sqlite3_free(cur); 3295 return SQLITE_OK; 3296 } 3297 3298 /* 3299 ** Advance a completion_cursor to its next row of output. 3300 ** 3301 ** The ->ePhase, ->j, and ->pStmt fields of the completion_cursor object 3302 ** record the current state of the scan. This routine sets ->zCurrentRow 3303 ** to the current row of output and then returns. If no more rows remain, 3304 ** then ->ePhase is set to COMPLETION_EOF which will signal the virtual 3305 ** table that has reached the end of its scan. 3306 ** 3307 ** The current implementation just lists potential identifiers and 3308 ** keywords and filters them by zPrefix. Future enhancements should 3309 ** take zLine into account to try to restrict the set of identifiers and 3310 ** keywords based on what would be legal at the current point of input. 3311 */ 3312 static int completionNext(sqlite3_vtab_cursor *cur){ 3313 completion_cursor *pCur = (completion_cursor*)cur; 3314 int eNextPhase = 0; /* Next phase to try if current phase reaches end */ 3315 int iCol = -1; /* If >=0, step pCur->pStmt and use the i-th column */ 3316 pCur->iRowid++; 3317 while( pCur->ePhase!=COMPLETION_EOF ){ 3318 switch( pCur->ePhase ){ 3319 case COMPLETION_KEYWORDS: { 3320 if( pCur->j >= sqlite3_keyword_count() ){ 3321 pCur->zCurrentRow = 0; 3322 pCur->ePhase = COMPLETION_DATABASES; 3323 }else{ 3324 sqlite3_keyword_name(pCur->j++, &pCur->zCurrentRow, &pCur->szRow); 3325 } 3326 iCol = -1; 3327 break; 3328 } 3329 case COMPLETION_DATABASES: { 3330 if( pCur->pStmt==0 ){ 3331 sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1, 3332 &pCur->pStmt, 0); 3333 } 3334 iCol = 1; 3335 eNextPhase = COMPLETION_TABLES; 3336 break; 3337 } 3338 case COMPLETION_TABLES: { 3339 if( pCur->pStmt==0 ){ 3340 sqlite3_stmt *pS2; 3341 char *zSql = 0; 3342 const char *zSep = ""; 3343 sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1, &pS2, 0); 3344 while( sqlite3_step(pS2)==SQLITE_ROW ){ 3345 const char *zDb = (const char*)sqlite3_column_text(pS2, 1); 3346 zSql = sqlite3_mprintf( 3347 "%z%s" 3348 "SELECT name FROM \"%w\".sqlite_schema", 3349 zSql, zSep, zDb 3350 ); 3351 if( zSql==0 ) return SQLITE_NOMEM; 3352 zSep = " UNION "; 3353 } 3354 sqlite3_finalize(pS2); 3355 sqlite3_prepare_v2(pCur->db, zSql, -1, &pCur->pStmt, 0); 3356 sqlite3_free(zSql); 3357 } 3358 iCol = 0; 3359 eNextPhase = COMPLETION_COLUMNS; 3360 break; 3361 } 3362 case COMPLETION_COLUMNS: { 3363 if( pCur->pStmt==0 ){ 3364 sqlite3_stmt *pS2; 3365 char *zSql = 0; 3366 const char *zSep = ""; 3367 sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1, &pS2, 0); 3368 while( sqlite3_step(pS2)==SQLITE_ROW ){ 3369 const char *zDb = (const char*)sqlite3_column_text(pS2, 1); 3370 zSql = sqlite3_mprintf( 3371 "%z%s" 3372 "SELECT pti.name FROM \"%w\".sqlite_schema AS sm" 3373 " JOIN pragma_table_info(sm.name,%Q) AS pti" 3374 " WHERE sm.type='table'", 3375 zSql, zSep, zDb, zDb 3376 ); 3377 if( zSql==0 ) return SQLITE_NOMEM; 3378 zSep = " UNION "; 3379 } 3380 sqlite3_finalize(pS2); 3381 sqlite3_prepare_v2(pCur->db, zSql, -1, &pCur->pStmt, 0); 3382 sqlite3_free(zSql); 3383 } 3384 iCol = 0; 3385 eNextPhase = COMPLETION_EOF; 3386 break; 3387 } 3388 } 3389 if( iCol<0 ){ 3390 /* This case is when the phase presets zCurrentRow */ 3391 if( pCur->zCurrentRow==0 ) continue; 3392 }else{ 3393 if( sqlite3_step(pCur->pStmt)==SQLITE_ROW ){ 3394 /* Extract the next row of content */ 3395 pCur->zCurrentRow = (const char*)sqlite3_column_text(pCur->pStmt, iCol); 3396 pCur->szRow = sqlite3_column_bytes(pCur->pStmt, iCol); 3397 }else{ 3398 /* When all rows are finished, advance to the next phase */ 3399 sqlite3_finalize(pCur->pStmt); 3400 pCur->pStmt = 0; 3401 pCur->ePhase = eNextPhase; 3402 continue; 3403 } 3404 } 3405 if( pCur->nPrefix==0 ) break; 3406 if( pCur->nPrefix<=pCur->szRow 3407 && sqlite3_strnicmp(pCur->zPrefix, pCur->zCurrentRow, pCur->nPrefix)==0 3408 ){ 3409 break; 3410 } 3411 } 3412 3413 return SQLITE_OK; 3414 } 3415 3416 /* 3417 ** Return values of columns for the row at which the completion_cursor 3418 ** is currently pointing. 3419 */ 3420 static int completionColumn( 3421 sqlite3_vtab_cursor *cur, /* The cursor */ 3422 sqlite3_context *ctx, /* First argument to sqlite3_result_...() */ 3423 int i /* Which column to return */ 3424 ){ 3425 completion_cursor *pCur = (completion_cursor*)cur; 3426 switch( i ){ 3427 case COMPLETION_COLUMN_CANDIDATE: { 3428 sqlite3_result_text(ctx, pCur->zCurrentRow, pCur->szRow,SQLITE_TRANSIENT); 3429 break; 3430 } 3431 case COMPLETION_COLUMN_PREFIX: { 3432 sqlite3_result_text(ctx, pCur->zPrefix, -1, SQLITE_TRANSIENT); 3433 break; 3434 } 3435 case COMPLETION_COLUMN_WHOLELINE: { 3436 sqlite3_result_text(ctx, pCur->zLine, -1, SQLITE_TRANSIENT); 3437 break; 3438 } 3439 case COMPLETION_COLUMN_PHASE: { 3440 sqlite3_result_int(ctx, pCur->ePhase); 3441 break; 3442 } 3443 } 3444 return SQLITE_OK; 3445 } 3446 3447 /* 3448 ** Return the rowid for the current row. In this implementation, the 3449 ** rowid is the same as the output value. 3450 */ 3451 static int completionRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ 3452 completion_cursor *pCur = (completion_cursor*)cur; 3453 *pRowid = pCur->iRowid; 3454 return SQLITE_OK; 3455 } 3456 3457 /* 3458 ** Return TRUE if the cursor has been moved off of the last 3459 ** row of output. 3460 */ 3461 static int completionEof(sqlite3_vtab_cursor *cur){ 3462 completion_cursor *pCur = (completion_cursor*)cur; 3463 return pCur->ePhase >= COMPLETION_EOF; 3464 } 3465 3466 /* 3467 ** This method is called to "rewind" the completion_cursor object back 3468 ** to the first row of output. This method is always called at least 3469 ** once prior to any call to completionColumn() or completionRowid() or 3470 ** completionEof(). 3471 */ 3472 static int completionFilter( 3473 sqlite3_vtab_cursor *pVtabCursor, 3474 int idxNum, const char *idxStr, 3475 int argc, sqlite3_value **argv 3476 ){ 3477 completion_cursor *pCur = (completion_cursor *)pVtabCursor; 3478 int iArg = 0; 3479 (void)(idxStr); /* Unused parameter */ 3480 (void)(argc); /* Unused parameter */ 3481 completionCursorReset(pCur); 3482 if( idxNum & 1 ){ 3483 pCur->nPrefix = sqlite3_value_bytes(argv[iArg]); 3484 if( pCur->nPrefix>0 ){ 3485 pCur->zPrefix = sqlite3_mprintf("%s", sqlite3_value_text(argv[iArg])); 3486 if( pCur->zPrefix==0 ) return SQLITE_NOMEM; 3487 } 3488 iArg = 1; 3489 } 3490 if( idxNum & 2 ){ 3491 pCur->nLine = sqlite3_value_bytes(argv[iArg]); 3492 if( pCur->nLine>0 ){ 3493 pCur->zLine = sqlite3_mprintf("%s", sqlite3_value_text(argv[iArg])); 3494 if( pCur->zLine==0 ) return SQLITE_NOMEM; 3495 } 3496 } 3497 if( pCur->zLine!=0 && pCur->zPrefix==0 ){ 3498 int i = pCur->nLine; 3499 while( i>0 && (isalnum(pCur->zLine[i-1]) || pCur->zLine[i-1]=='_') ){ 3500 i--; 3501 } 3502 pCur->nPrefix = pCur->nLine - i; 3503 if( pCur->nPrefix>0 ){ 3504 pCur->zPrefix = sqlite3_mprintf("%.*s", pCur->nPrefix, pCur->zLine + i); 3505 if( pCur->zPrefix==0 ) return SQLITE_NOMEM; 3506 } 3507 } 3508 pCur->iRowid = 0; 3509 pCur->ePhase = COMPLETION_FIRST_PHASE; 3510 return completionNext(pVtabCursor); 3511 } 3512 3513 /* 3514 ** SQLite will invoke this method one or more times while planning a query 3515 ** that uses the completion virtual table. This routine needs to create 3516 ** a query plan for each invocation and compute an estimated cost for that 3517 ** plan. 3518 ** 3519 ** There are two hidden parameters that act as arguments to the table-valued 3520 ** function: "prefix" and "wholeline". Bit 0 of idxNum is set if "prefix" 3521 ** is available and bit 1 is set if "wholeline" is available. 3522 */ 3523 static int completionBestIndex( 3524 sqlite3_vtab *tab, 3525 sqlite3_index_info *pIdxInfo 3526 ){ 3527 int i; /* Loop over constraints */ 3528 int idxNum = 0; /* The query plan bitmask */ 3529 int prefixIdx = -1; /* Index of the start= constraint, or -1 if none */ 3530 int wholelineIdx = -1; /* Index of the stop= constraint, or -1 if none */ 3531 int nArg = 0; /* Number of arguments that completeFilter() expects */ 3532 const struct sqlite3_index_constraint *pConstraint; 3533 3534 (void)(tab); /* Unused parameter */ 3535 pConstraint = pIdxInfo->aConstraint; 3536 for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){ 3537 if( pConstraint->usable==0 ) continue; 3538 if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue; 3539 switch( pConstraint->iColumn ){ 3540 case COMPLETION_COLUMN_PREFIX: 3541 prefixIdx = i; 3542 idxNum |= 1; 3543 break; 3544 case COMPLETION_COLUMN_WHOLELINE: 3545 wholelineIdx = i; 3546 idxNum |= 2; 3547 break; 3548 } 3549 } 3550 if( prefixIdx>=0 ){ 3551 pIdxInfo->aConstraintUsage[prefixIdx].argvIndex = ++nArg; 3552 pIdxInfo->aConstraintUsage[prefixIdx].omit = 1; 3553 } 3554 if( wholelineIdx>=0 ){ 3555 pIdxInfo->aConstraintUsage[wholelineIdx].argvIndex = ++nArg; 3556 pIdxInfo->aConstraintUsage[wholelineIdx].omit = 1; 3557 } 3558 pIdxInfo->idxNum = idxNum; 3559 pIdxInfo->estimatedCost = (double)5000 - 1000*nArg; 3560 pIdxInfo->estimatedRows = 500 - 100*nArg; 3561 return SQLITE_OK; 3562 } 3563 3564 /* 3565 ** This following structure defines all the methods for the 3566 ** completion virtual table. 3567 */ 3568 static sqlite3_module completionModule = { 3569 0, /* iVersion */ 3570 0, /* xCreate */ 3571 completionConnect, /* xConnect */ 3572 completionBestIndex, /* xBestIndex */ 3573 completionDisconnect, /* xDisconnect */ 3574 0, /* xDestroy */ 3575 completionOpen, /* xOpen - open a cursor */ 3576 completionClose, /* xClose - close a cursor */ 3577 completionFilter, /* xFilter - configure scan constraints */ 3578 completionNext, /* xNext - advance a cursor */ 3579 completionEof, /* xEof - check for end of scan */ 3580 completionColumn, /* xColumn - read data */ 3581 completionRowid, /* xRowid - read data */ 3582 0, /* xUpdate */ 3583 0, /* xBegin */ 3584 0, /* xSync */ 3585 0, /* xCommit */ 3586 0, /* xRollback */ 3587 0, /* xFindMethod */ 3588 0, /* xRename */ 3589 0, /* xSavepoint */ 3590 0, /* xRelease */ 3591 0, /* xRollbackTo */ 3592 0 /* xShadowName */ 3593 }; 3594 3595 #endif /* SQLITE_OMIT_VIRTUALTABLE */ 3596 3597 int sqlite3CompletionVtabInit(sqlite3 *db){ 3598 int rc = SQLITE_OK; 3599 #ifndef SQLITE_OMIT_VIRTUALTABLE 3600 rc = sqlite3_create_module(db, "completion", &completionModule, 0); 3601 #endif 3602 return rc; 3603 } 3604 3605 #ifdef _WIN32 3606 3607 #endif 3608 int sqlite3_completion_init( 3609 sqlite3 *db, 3610 char **pzErrMsg, 3611 const sqlite3_api_routines *pApi 3612 ){ 3613 int rc = SQLITE_OK; 3614 SQLITE_EXTENSION_INIT2(pApi); 3615 (void)(pzErrMsg); /* Unused parameter */ 3616 #ifndef SQLITE_OMIT_VIRTUALTABLE 3617 rc = sqlite3CompletionVtabInit(db); 3618 #endif 3619 return rc; 3620 } 3621 3622 /************************* End ../ext/misc/completion.c ********************/ 3623 /************************* Begin ../ext/misc/appendvfs.c ******************/ 3624 /* 3625 ** 2017-10-20 3626 ** 3627 ** The author disclaims copyright to this source code. In place of 3628 ** a legal notice, here is a blessing: 3629 ** 3630 ** May you do good and not evil. 3631 ** May you find forgiveness for yourself and forgive others. 3632 ** May you share freely, never taking more than you give. 3633 ** 3634 ****************************************************************************** 3635 ** 3636 ** This file implements a VFS shim that allows an SQLite database to be 3637 ** appended onto the end of some other file, such as an executable. 3638 ** 3639 ** A special record must appear at the end of the file that identifies the 3640 ** file as an appended database and provides an offset to page 1. For 3641 ** best performance page 1 should be located at a disk page boundary, though 3642 ** that is not required. 3643 ** 3644 ** When opening a database using this VFS, the connection might treat 3645 ** the file as an ordinary SQLite database, or it might treat is as a 3646 ** database appended onto some other file. Here are the rules: 3647 ** 3648 ** (1) When opening a new empty file, that file is treated as an ordinary 3649 ** database. 3650 ** 3651 ** (2) When opening a file that begins with the standard SQLite prefix 3652 ** string "SQLite format 3", that file is treated as an ordinary 3653 ** database. 3654 ** 3655 ** (3) When opening a file that ends with the appendvfs trailer string 3656 ** "Start-Of-SQLite3-NNNNNNNN" that file is treated as an appended 3657 ** database. 3658 ** 3659 ** (4) If none of the above apply and the SQLITE_OPEN_CREATE flag is 3660 ** set, then a new database is appended to the already existing file. 3661 ** 3662 ** (5) Otherwise, SQLITE_CANTOPEN is returned. 3663 ** 3664 ** To avoid unnecessary complications with the PENDING_BYTE, the size of 3665 ** the file containing the database is limited to 1GB. This VFS will refuse 3666 ** to read or write past the 1GB mark. This restriction might be lifted in 3667 ** future versions. For now, if you need a large database, then keep the 3668 ** database in a separate file. 3669 ** 3670 ** If the file being opened is not an appended database, then this shim is 3671 ** a pass-through into the default underlying VFS. 3672 **/ 3673 /* #include "sqlite3ext.h" */ 3674 SQLITE_EXTENSION_INIT1 3675 #include <string.h> 3676 #include <assert.h> 3677 3678 /* The append mark at the end of the database is: 3679 ** 3680 ** Start-Of-SQLite3-NNNNNNNN 3681 ** 123456789 123456789 12345 3682 ** 3683 ** The NNNNNNNN represents a 64-bit big-endian unsigned integer which is 3684 ** the offset to page 1. 3685 */ 3686 #define APND_MARK_PREFIX "Start-Of-SQLite3-" 3687 #define APND_MARK_PREFIX_SZ 17 3688 #define APND_MARK_SIZE 25 3689 3690 /* 3691 ** Maximum size of the combined prefix + database + append-mark. This 3692 ** must be less than 0x40000000 to avoid locking issues on Windows. 3693 */ 3694 #define APND_MAX_SIZE (65536*15259) 3695 3696 /* 3697 ** Forward declaration of objects used by this utility 3698 */ 3699 typedef struct sqlite3_vfs ApndVfs; 3700 typedef struct ApndFile ApndFile; 3701 3702 /* Access to a lower-level VFS that (might) implement dynamic loading, 3703 ** access to randomness, etc. 3704 */ 3705 #define ORIGVFS(p) ((sqlite3_vfs*)((p)->pAppData)) 3706 #define ORIGFILE(p) ((sqlite3_file*)(((ApndFile*)(p))+1)) 3707 3708 /* An open file */ 3709 struct ApndFile { 3710 sqlite3_file base; /* IO methods */ 3711 sqlite3_int64 iPgOne; /* File offset to page 1 */ 3712 sqlite3_int64 iMark; /* Start of the append-mark */ 3713 }; 3714 3715 /* 3716 ** Methods for ApndFile 3717 */ 3718 static int apndClose(sqlite3_file*); 3719 static int apndRead(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst); 3720 static int apndWrite(sqlite3_file*,const void*,int iAmt, sqlite3_int64 iOfst); 3721 static int apndTruncate(sqlite3_file*, sqlite3_int64 size); 3722 static int apndSync(sqlite3_file*, int flags); 3723 static int apndFileSize(sqlite3_file*, sqlite3_int64 *pSize); 3724 static int apndLock(sqlite3_file*, int); 3725 static int apndUnlock(sqlite3_file*, int); 3726 static int apndCheckReservedLock(sqlite3_file*, int *pResOut); 3727 static int apndFileControl(sqlite3_file*, int op, void *pArg); 3728 static int apndSectorSize(sqlite3_file*); 3729 static int apndDeviceCharacteristics(sqlite3_file*); 3730 static int apndShmMap(sqlite3_file*, int iPg, int pgsz, int, void volatile**); 3731 static int apndShmLock(sqlite3_file*, int offset, int n, int flags); 3732 static void apndShmBarrier(sqlite3_file*); 3733 static int apndShmUnmap(sqlite3_file*, int deleteFlag); 3734 static int apndFetch(sqlite3_file*, sqlite3_int64 iOfst, int iAmt, void **pp); 3735 static int apndUnfetch(sqlite3_file*, sqlite3_int64 iOfst, void *p); 3736 3737 /* 3738 ** Methods for ApndVfs 3739 */ 3740 static int apndOpen(sqlite3_vfs*, const char *, sqlite3_file*, int , int *); 3741 static int apndDelete(sqlite3_vfs*, const char *zName, int syncDir); 3742 static int apndAccess(sqlite3_vfs*, const char *zName, int flags, int *); 3743 static int apndFullPathname(sqlite3_vfs*, const char *zName, int, char *zOut); 3744 static void *apndDlOpen(sqlite3_vfs*, const char *zFilename); 3745 static void apndDlError(sqlite3_vfs*, int nByte, char *zErrMsg); 3746 static void (*apndDlSym(sqlite3_vfs *pVfs, void *p, const char*zSym))(void); 3747 static void apndDlClose(sqlite3_vfs*, void*); 3748 static int apndRandomness(sqlite3_vfs*, int nByte, char *zOut); 3749 static int apndSleep(sqlite3_vfs*, int microseconds); 3750 static int apndCurrentTime(sqlite3_vfs*, double*); 3751 static int apndGetLastError(sqlite3_vfs*, int, char *); 3752 static int apndCurrentTimeInt64(sqlite3_vfs*, sqlite3_int64*); 3753 static int apndSetSystemCall(sqlite3_vfs*, const char*,sqlite3_syscall_ptr); 3754 static sqlite3_syscall_ptr apndGetSystemCall(sqlite3_vfs*, const char *z); 3755 static const char *apndNextSystemCall(sqlite3_vfs*, const char *zName); 3756 3757 static sqlite3_vfs apnd_vfs = { 3758 3, /* iVersion (set when registered) */ 3759 0, /* szOsFile (set when registered) */ 3760 1024, /* mxPathname */ 3761 0, /* pNext */ 3762 "apndvfs", /* zName */ 3763 0, /* pAppData (set when registered) */ 3764 apndOpen, /* xOpen */ 3765 apndDelete, /* xDelete */ 3766 apndAccess, /* xAccess */ 3767 apndFullPathname, /* xFullPathname */ 3768 apndDlOpen, /* xDlOpen */ 3769 apndDlError, /* xDlError */ 3770 apndDlSym, /* xDlSym */ 3771 apndDlClose, /* xDlClose */ 3772 apndRandomness, /* xRandomness */ 3773 apndSleep, /* xSleep */ 3774 apndCurrentTime, /* xCurrentTime */ 3775 apndGetLastError, /* xGetLastError */ 3776 apndCurrentTimeInt64, /* xCurrentTimeInt64 */ 3777 apndSetSystemCall, /* xSetSystemCall */ 3778 apndGetSystemCall, /* xGetSystemCall */ 3779 apndNextSystemCall /* xNextSystemCall */ 3780 }; 3781 3782 static const sqlite3_io_methods apnd_io_methods = { 3783 3, /* iVersion */ 3784 apndClose, /* xClose */ 3785 apndRead, /* xRead */ 3786 apndWrite, /* xWrite */ 3787 apndTruncate, /* xTruncate */ 3788 apndSync, /* xSync */ 3789 apndFileSize, /* xFileSize */ 3790 apndLock, /* xLock */ 3791 apndUnlock, /* xUnlock */ 3792 apndCheckReservedLock, /* xCheckReservedLock */ 3793 apndFileControl, /* xFileControl */ 3794 apndSectorSize, /* xSectorSize */ 3795 apndDeviceCharacteristics, /* xDeviceCharacteristics */ 3796 apndShmMap, /* xShmMap */ 3797 apndShmLock, /* xShmLock */ 3798 apndShmBarrier, /* xShmBarrier */ 3799 apndShmUnmap, /* xShmUnmap */ 3800 apndFetch, /* xFetch */ 3801 apndUnfetch /* xUnfetch */ 3802 }; 3803 3804 3805 3806 /* 3807 ** Close an apnd-file. 3808 */ 3809 static int apndClose(sqlite3_file *pFile){ 3810 pFile = ORIGFILE(pFile); 3811 return pFile->pMethods->xClose(pFile); 3812 } 3813 3814 /* 3815 ** Read data from an apnd-file. 3816 */ 3817 static int apndRead( 3818 sqlite3_file *pFile, 3819 void *zBuf, 3820 int iAmt, 3821 sqlite_int64 iOfst 3822 ){ 3823 ApndFile *p = (ApndFile *)pFile; 3824 pFile = ORIGFILE(pFile); 3825 return pFile->pMethods->xRead(pFile, zBuf, iAmt, iOfst+p->iPgOne); 3826 } 3827 3828 /* 3829 ** Add the append-mark onto the end of the file. 3830 */ 3831 static int apndWriteMark(ApndFile *p, sqlite3_file *pFile){ 3832 int i; 3833 unsigned char a[APND_MARK_SIZE]; 3834 memcpy(a, APND_MARK_PREFIX, APND_MARK_PREFIX_SZ); 3835 for(i=0; i<8; i++){ 3836 a[APND_MARK_PREFIX_SZ+i] = (p->iPgOne >> (56 - i*8)) & 0xff; 3837 } 3838 return pFile->pMethods->xWrite(pFile, a, APND_MARK_SIZE, p->iMark); 3839 } 3840 3841 /* 3842 ** Write data to an apnd-file. 3843 */ 3844 static int apndWrite( 3845 sqlite3_file *pFile, 3846 const void *zBuf, 3847 int iAmt, 3848 sqlite_int64 iOfst 3849 ){ 3850 int rc; 3851 ApndFile *p = (ApndFile *)pFile; 3852 pFile = ORIGFILE(pFile); 3853 if( iOfst+iAmt>=APND_MAX_SIZE ) return SQLITE_FULL; 3854 rc = pFile->pMethods->xWrite(pFile, zBuf, iAmt, iOfst+p->iPgOne); 3855 if( rc==SQLITE_OK && iOfst + iAmt + p->iPgOne > p->iMark ){ 3856 sqlite3_int64 sz = 0; 3857 rc = pFile->pMethods->xFileSize(pFile, &sz); 3858 if( rc==SQLITE_OK ){ 3859 p->iMark = sz - APND_MARK_SIZE; 3860 if( iOfst + iAmt + p->iPgOne > p->iMark ){ 3861 p->iMark = p->iPgOne + iOfst + iAmt; 3862 rc = apndWriteMark(p, pFile); 3863 } 3864 } 3865 } 3866 return rc; 3867 } 3868 3869 /* 3870 ** Truncate an apnd-file. 3871 */ 3872 static int apndTruncate(sqlite3_file *pFile, sqlite_int64 size){ 3873 int rc; 3874 ApndFile *p = (ApndFile *)pFile; 3875 pFile = ORIGFILE(pFile); 3876 rc = pFile->pMethods->xTruncate(pFile, size+p->iPgOne+APND_MARK_SIZE); 3877 if( rc==SQLITE_OK ){ 3878 p->iMark = p->iPgOne+size; 3879 rc = apndWriteMark(p, pFile); 3880 } 3881 return rc; 3882 } 3883 3884 /* 3885 ** Sync an apnd-file. 3886 */ 3887 static int apndSync(sqlite3_file *pFile, int flags){ 3888 pFile = ORIGFILE(pFile); 3889 return pFile->pMethods->xSync(pFile, flags); 3890 } 3891 3892 /* 3893 ** Return the current file-size of an apnd-file. 3894 */ 3895 static int apndFileSize(sqlite3_file *pFile, sqlite_int64 *pSize){ 3896 ApndFile *p = (ApndFile *)pFile; 3897 int rc; 3898 pFile = ORIGFILE(p); 3899 rc = pFile->pMethods->xFileSize(pFile, pSize); 3900 if( rc==SQLITE_OK && p->iPgOne ){ 3901 *pSize -= p->iPgOne + APND_MARK_SIZE; 3902 } 3903 return rc; 3904 } 3905 3906 /* 3907 ** Lock an apnd-file. 3908 */ 3909 static int apndLock(sqlite3_file *pFile, int eLock){ 3910 pFile = ORIGFILE(pFile); 3911 return pFile->pMethods->xLock(pFile, eLock); 3912 } 3913 3914 /* 3915 ** Unlock an apnd-file. 3916 */ 3917 static int apndUnlock(sqlite3_file *pFile, int eLock){ 3918 pFile = ORIGFILE(pFile); 3919 return pFile->pMethods->xUnlock(pFile, eLock); 3920 } 3921 3922 /* 3923 ** Check if another file-handle holds a RESERVED lock on an apnd-file. 3924 */ 3925 static int apndCheckReservedLock(sqlite3_file *pFile, int *pResOut){ 3926 pFile = ORIGFILE(pFile); 3927 return pFile->pMethods->xCheckReservedLock(pFile, pResOut); 3928 } 3929 3930 /* 3931 ** File control method. For custom operations on an apnd-file. 3932 */ 3933 static int apndFileControl(sqlite3_file *pFile, int op, void *pArg){ 3934 ApndFile *p = (ApndFile *)pFile; 3935 int rc; 3936 pFile = ORIGFILE(pFile); 3937 rc = pFile->pMethods->xFileControl(pFile, op, pArg); 3938 if( rc==SQLITE_OK && op==SQLITE_FCNTL_VFSNAME ){ 3939 *(char**)pArg = sqlite3_mprintf("apnd(%lld)/%z", p->iPgOne, *(char**)pArg); 3940 } 3941 return rc; 3942 } 3943 3944 /* 3945 ** Return the sector-size in bytes for an apnd-file. 3946 */ 3947 static int apndSectorSize(sqlite3_file *pFile){ 3948 pFile = ORIGFILE(pFile); 3949 return pFile->pMethods->xSectorSize(pFile); 3950 } 3951 3952 /* 3953 ** Return the device characteristic flags supported by an apnd-file. 3954 */ 3955 static int apndDeviceCharacteristics(sqlite3_file *pFile){ 3956 pFile = ORIGFILE(pFile); 3957 return pFile->pMethods->xDeviceCharacteristics(pFile); 3958 } 3959 3960 /* Create a shared memory file mapping */ 3961 static int apndShmMap( 3962 sqlite3_file *pFile, 3963 int iPg, 3964 int pgsz, 3965 int bExtend, 3966 void volatile **pp 3967 ){ 3968 pFile = ORIGFILE(pFile); 3969 return pFile->pMethods->xShmMap(pFile,iPg,pgsz,bExtend,pp); 3970 } 3971 3972 /* Perform locking on a shared-memory segment */ 3973 static int apndShmLock(sqlite3_file *pFile, int offset, int n, int flags){ 3974 pFile = ORIGFILE(pFile); 3975 return pFile->pMethods->xShmLock(pFile,offset,n,flags); 3976 } 3977 3978 /* Memory barrier operation on shared memory */ 3979 static void apndShmBarrier(sqlite3_file *pFile){ 3980 pFile = ORIGFILE(pFile); 3981 pFile->pMethods->xShmBarrier(pFile); 3982 } 3983 3984 /* Unmap a shared memory segment */ 3985 static int apndShmUnmap(sqlite3_file *pFile, int deleteFlag){ 3986 pFile = ORIGFILE(pFile); 3987 return pFile->pMethods->xShmUnmap(pFile,deleteFlag); 3988 } 3989 3990 /* Fetch a page of a memory-mapped file */ 3991 static int apndFetch( 3992 sqlite3_file *pFile, 3993 sqlite3_int64 iOfst, 3994 int iAmt, 3995 void **pp 3996 ){ 3997 ApndFile *p = (ApndFile *)pFile; 3998 pFile = ORIGFILE(pFile); 3999 return pFile->pMethods->xFetch(pFile, iOfst+p->iPgOne, iAmt, pp); 4000 } 4001 4002 /* Release a memory-mapped page */ 4003 static int apndUnfetch(sqlite3_file *pFile, sqlite3_int64 iOfst, void *pPage){ 4004 ApndFile *p = (ApndFile *)pFile; 4005 pFile = ORIGFILE(pFile); 4006 return pFile->pMethods->xUnfetch(pFile, iOfst+p->iPgOne, pPage); 4007 } 4008 4009 /* 4010 ** Check to see if the file is an ordinary SQLite database file. 4011 */ 4012 static int apndIsOrdinaryDatabaseFile(sqlite3_int64 sz, sqlite3_file *pFile){ 4013 int rc; 4014 char zHdr[16]; 4015 static const char aSqliteHdr[] = "SQLite format 3"; 4016 if( sz<512 ) return 0; 4017 rc = pFile->pMethods->xRead(pFile, zHdr, sizeof(zHdr), 0); 4018 if( rc ) return 0; 4019 return memcmp(zHdr, aSqliteHdr, sizeof(zHdr))==0; 4020 } 4021 4022 /* 4023 ** Try to read the append-mark off the end of a file. Return the 4024 ** start of the appended database if the append-mark is present. If 4025 ** there is no append-mark, return -1; 4026 */ 4027 static sqlite3_int64 apndReadMark(sqlite3_int64 sz, sqlite3_file *pFile){ 4028 int rc, i; 4029 sqlite3_int64 iMark; 4030 unsigned char a[APND_MARK_SIZE]; 4031 4032 if( sz<=APND_MARK_SIZE ) return -1; 4033 rc = pFile->pMethods->xRead(pFile, a, APND_MARK_SIZE, sz-APND_MARK_SIZE); 4034 if( rc ) return -1; 4035 if( memcmp(a, APND_MARK_PREFIX, APND_MARK_PREFIX_SZ)!=0 ) return -1; 4036 iMark = ((sqlite3_int64)(a[APND_MARK_PREFIX_SZ]&0x7f))<<56; 4037 for(i=1; i<8; i++){ 4038 iMark += (sqlite3_int64)a[APND_MARK_PREFIX_SZ+i]<<(56-8*i); 4039 } 4040 return iMark; 4041 } 4042 4043 /* 4044 ** Open an apnd file handle. 4045 */ 4046 static int apndOpen( 4047 sqlite3_vfs *pVfs, 4048 const char *zName, 4049 sqlite3_file *pFile, 4050 int flags, 4051 int *pOutFlags 4052 ){ 4053 ApndFile *p; 4054 sqlite3_file *pSubFile; 4055 sqlite3_vfs *pSubVfs; 4056 int rc; 4057 sqlite3_int64 sz; 4058 pSubVfs = ORIGVFS(pVfs); 4059 if( (flags & SQLITE_OPEN_MAIN_DB)==0 ){ 4060 return pSubVfs->xOpen(pSubVfs, zName, pFile, flags, pOutFlags); 4061 } 4062 p = (ApndFile*)pFile; 4063 memset(p, 0, sizeof(*p)); 4064 pSubFile = ORIGFILE(pFile); 4065 pFile->pMethods = &apnd_io_methods; 4066 rc = pSubVfs->xOpen(pSubVfs, zName, pSubFile, flags, pOutFlags); 4067 if( rc ) goto apnd_open_done; 4068 rc = pSubFile->pMethods->xFileSize(pSubFile, &sz); 4069 if( rc ){ 4070 pSubFile->pMethods->xClose(pSubFile); 4071 goto apnd_open_done; 4072 } 4073 if( apndIsOrdinaryDatabaseFile(sz, pSubFile) ){ 4074 memmove(pFile, pSubFile, pSubVfs->szOsFile); 4075 return SQLITE_OK; 4076 } 4077 p->iMark = 0; 4078 p->iPgOne = apndReadMark(sz, pFile); 4079 if( p->iPgOne>0 ){ 4080 return SQLITE_OK; 4081 } 4082 if( (flags & SQLITE_OPEN_CREATE)==0 ){ 4083 pSubFile->pMethods->xClose(pSubFile); 4084 rc = SQLITE_CANTOPEN; 4085 } 4086 p->iPgOne = (sz+0xfff) & ~(sqlite3_int64)0xfff; 4087 apnd_open_done: 4088 if( rc ) pFile->pMethods = 0; 4089 return rc; 4090 } 4091 4092 /* 4093 ** All other VFS methods are pass-thrus. 4094 */ 4095 static int apndDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){ 4096 return ORIGVFS(pVfs)->xDelete(ORIGVFS(pVfs), zPath, dirSync); 4097 } 4098 static int apndAccess( 4099 sqlite3_vfs *pVfs, 4100 const char *zPath, 4101 int flags, 4102 int *pResOut 4103 ){ 4104 return ORIGVFS(pVfs)->xAccess(ORIGVFS(pVfs), zPath, flags, pResOut); 4105 } 4106 static int apndFullPathname( 4107 sqlite3_vfs *pVfs, 4108 const char *zPath, 4109 int nOut, 4110 char *zOut 4111 ){ 4112 return ORIGVFS(pVfs)->xFullPathname(ORIGVFS(pVfs),zPath,nOut,zOut); 4113 } 4114 static void *apndDlOpen(sqlite3_vfs *pVfs, const char *zPath){ 4115 return ORIGVFS(pVfs)->xDlOpen(ORIGVFS(pVfs), zPath); 4116 } 4117 static void apndDlError(sqlite3_vfs *pVfs, int nByte, char *zErrMsg){ 4118 ORIGVFS(pVfs)->xDlError(ORIGVFS(pVfs), nByte, zErrMsg); 4119 } 4120 static void (*apndDlSym(sqlite3_vfs *pVfs, void *p, const char *zSym))(void){ 4121 return ORIGVFS(pVfs)->xDlSym(ORIGVFS(pVfs), p, zSym); 4122 } 4123 static void apndDlClose(sqlite3_vfs *pVfs, void *pHandle){ 4124 ORIGVFS(pVfs)->xDlClose(ORIGVFS(pVfs), pHandle); 4125 } 4126 static int apndRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){ 4127 return ORIGVFS(pVfs)->xRandomness(ORIGVFS(pVfs), nByte, zBufOut); 4128 } 4129 static int apndSleep(sqlite3_vfs *pVfs, int nMicro){ 4130 return ORIGVFS(pVfs)->xSleep(ORIGVFS(pVfs), nMicro); 4131 } 4132 static int apndCurrentTime(sqlite3_vfs *pVfs, double *pTimeOut){ 4133 return ORIGVFS(pVfs)->xCurrentTime(ORIGVFS(pVfs), pTimeOut); 4134 } 4135 static int apndGetLastError(sqlite3_vfs *pVfs, int a, char *b){ 4136 return ORIGVFS(pVfs)->xGetLastError(ORIGVFS(pVfs), a, b); 4137 } 4138 static int apndCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *p){ 4139 return ORIGVFS(pVfs)->xCurrentTimeInt64(ORIGVFS(pVfs), p); 4140 } 4141 static int apndSetSystemCall( 4142 sqlite3_vfs *pVfs, 4143 const char *zName, 4144 sqlite3_syscall_ptr pCall 4145 ){ 4146 return ORIGVFS(pVfs)->xSetSystemCall(ORIGVFS(pVfs),zName,pCall); 4147 } 4148 static sqlite3_syscall_ptr apndGetSystemCall( 4149 sqlite3_vfs *pVfs, 4150 const char *zName 4151 ){ 4152 return ORIGVFS(pVfs)->xGetSystemCall(ORIGVFS(pVfs),zName); 4153 } 4154 static const char *apndNextSystemCall(sqlite3_vfs *pVfs, const char *zName){ 4155 return ORIGVFS(pVfs)->xNextSystemCall(ORIGVFS(pVfs), zName); 4156 } 4157 4158 4159 #ifdef _WIN32 4160 4161 #endif 4162 /* 4163 ** This routine is called when the extension is loaded. 4164 ** Register the new VFS. 4165 */ 4166 int sqlite3_appendvfs_init( 4167 sqlite3 *db, 4168 char **pzErrMsg, 4169 const sqlite3_api_routines *pApi 4170 ){ 4171 int rc = SQLITE_OK; 4172 sqlite3_vfs *pOrig; 4173 SQLITE_EXTENSION_INIT2(pApi); 4174 (void)pzErrMsg; 4175 (void)db; 4176 pOrig = sqlite3_vfs_find(0); 4177 apnd_vfs.iVersion = pOrig->iVersion; 4178 apnd_vfs.pAppData = pOrig; 4179 apnd_vfs.szOsFile = pOrig->szOsFile + sizeof(ApndFile); 4180 rc = sqlite3_vfs_register(&apnd_vfs, 0); 4181 #ifdef APPENDVFS_TEST 4182 if( rc==SQLITE_OK ){ 4183 rc = sqlite3_auto_extension((void(*)(void))apndvfsRegister); 4184 } 4185 #endif 4186 if( rc==SQLITE_OK ) rc = SQLITE_OK_LOAD_PERMANENTLY; 4187 return rc; 4188 } 4189 4190 /************************* End ../ext/misc/appendvfs.c ********************/ 4191 /************************* Begin ../ext/misc/memtrace.c ******************/ 4192 /* 4193 ** 2019-01-21 4194 ** 4195 ** The author disclaims copyright to this source code. In place of 4196 ** a legal notice, here is a blessing: 4197 ** 4198 ** May you do good and not evil. 4199 ** May you find forgiveness for yourself and forgive others. 4200 ** May you share freely, never taking more than you give. 4201 ** 4202 ************************************************************************* 4203 ** 4204 ** This file implements an extension that uses the SQLITE_CONFIG_MALLOC 4205 ** mechanism to add a tracing layer on top of SQLite. If this extension 4206 ** is registered prior to sqlite3_initialize(), it will cause all memory 4207 ** allocation activities to be logged on standard output, or to some other 4208 ** FILE specified by the initializer. 4209 ** 4210 ** This file needs to be compiled into the application that uses it. 4211 ** 4212 ** This extension is used to implement the --memtrace option of the 4213 ** command-line shell. 4214 */ 4215 #include <assert.h> 4216 #include <string.h> 4217 #include <stdio.h> 4218 4219 /* The original memory allocation routines */ 4220 static sqlite3_mem_methods memtraceBase; 4221 static FILE *memtraceOut; 4222 4223 /* Methods that trace memory allocations */ 4224 static void *memtraceMalloc(int n){ 4225 if( memtraceOut ){ 4226 fprintf(memtraceOut, "MEMTRACE: allocate %d bytes\n", 4227 memtraceBase.xRoundup(n)); 4228 } 4229 return memtraceBase.xMalloc(n); 4230 } 4231 static void memtraceFree(void *p){ 4232 if( p==0 ) return; 4233 if( memtraceOut ){ 4234 fprintf(memtraceOut, "MEMTRACE: free %d bytes\n", memtraceBase.xSize(p)); 4235 } 4236 memtraceBase.xFree(p); 4237 } 4238 static void *memtraceRealloc(void *p, int n){ 4239 if( p==0 ) return memtraceMalloc(n); 4240 if( n==0 ){ 4241 memtraceFree(p); 4242 return 0; 4243 } 4244 if( memtraceOut ){ 4245 fprintf(memtraceOut, "MEMTRACE: resize %d -> %d bytes\n", 4246 memtraceBase.xSize(p), memtraceBase.xRoundup(n)); 4247 } 4248 return memtraceBase.xRealloc(p, n); 4249 } 4250 static int memtraceSize(void *p){ 4251 return memtraceBase.xSize(p); 4252 } 4253 static int memtraceRoundup(int n){ 4254 return memtraceBase.xRoundup(n); 4255 } 4256 static int memtraceInit(void *p){ 4257 return memtraceBase.xInit(p); 4258 } 4259 static void memtraceShutdown(void *p){ 4260 memtraceBase.xShutdown(p); 4261 } 4262 4263 /* The substitute memory allocator */ 4264 static sqlite3_mem_methods ersaztMethods = { 4265 memtraceMalloc, 4266 memtraceFree, 4267 memtraceRealloc, 4268 memtraceSize, 4269 memtraceRoundup, 4270 memtraceInit, 4271 memtraceShutdown, 4272 0 4273 }; 4274 4275 /* Begin tracing memory allocations to out. */ 4276 int sqlite3MemTraceActivate(FILE *out){ 4277 int rc = SQLITE_OK; 4278 if( memtraceBase.xMalloc==0 ){ 4279 rc = sqlite3_config(SQLITE_CONFIG_GETMALLOC, &memtraceBase); 4280 if( rc==SQLITE_OK ){ 4281 rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &ersaztMethods); 4282 } 4283 } 4284 memtraceOut = out; 4285 return rc; 4286 } 4287 4288 /* Deactivate memory tracing */ 4289 int sqlite3MemTraceDeactivate(void){ 4290 int rc = SQLITE_OK; 4291 if( memtraceBase.xMalloc!=0 ){ 4292 rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &memtraceBase); 4293 if( rc==SQLITE_OK ){ 4294 memset(&memtraceBase, 0, sizeof(memtraceBase)); 4295 } 4296 } 4297 memtraceOut = 0; 4298 return rc; 4299 } 4300 4301 /************************* End ../ext/misc/memtrace.c ********************/ 4302 /************************* Begin ../ext/misc/uint.c ******************/ 4303 /* 4304 ** 2020-04-14 4305 ** 4306 ** The author disclaims copyright to this source code. In place of 4307 ** a legal notice, here is a blessing: 4308 ** 4309 ** May you do good and not evil. 4310 ** May you find forgiveness for yourself and forgive others. 4311 ** May you share freely, never taking more than you give. 4312 ** 4313 ****************************************************************************** 4314 ** 4315 ** This SQLite extension implements the UINT collating sequence. 4316 ** 4317 ** UINT works like BINARY for text, except that embedded strings 4318 ** of digits compare in numeric order. 4319 ** 4320 ** * Leading zeros are handled properly, in the sense that 4321 ** they do not mess of the maginitude comparison of embedded 4322 ** strings of digits. "x00123y" is equal to "x123y". 4323 ** 4324 ** * Only unsigned integers are recognized. Plus and minus 4325 ** signs are ignored. Decimal points and exponential notation 4326 ** are ignored. 4327 ** 4328 ** * Embedded integers can be of arbitrary length. Comparison 4329 ** is *not* limited integers that can be expressed as a 4330 ** 64-bit machine integer. 4331 */ 4332 /* #include "sqlite3ext.h" */ 4333 SQLITE_EXTENSION_INIT1 4334 #include <assert.h> 4335 #include <string.h> 4336 #include <ctype.h> 4337 4338 /* 4339 ** Compare text in lexicographic order, except strings of digits 4340 ** compare in numeric order. 4341 */ 4342 static int uintCollFunc( 4343 void *notUsed, 4344 int nKey1, const void *pKey1, 4345 int nKey2, const void *pKey2 4346 ){ 4347 const unsigned char *zA = (const unsigned char*)pKey1; 4348 const unsigned char *zB = (const unsigned char*)pKey2; 4349 int i=0, j=0, x; 4350 (void)notUsed; 4351 while( i<nKey1 && j<nKey2 ){ 4352 x = zA[i] - zB[j]; 4353 if( isdigit(zA[i]) ){ 4354 int k; 4355 if( !isdigit(zB[j]) ) return x; 4356 while( i<nKey1 && zA[i]=='0' ){ i++; } 4357 while( j<nKey2 && zB[j]=='0' ){ j++; } 4358 k = 0; 4359 while( i+k<nKey1 && isdigit(zA[i+k]) 4360 && j+k<nKey2 && isdigit(zB[j+k]) ){ 4361 k++; 4362 } 4363 if( i+k<nKey1 && isdigit(zA[i+k]) ){ 4364 return +1; 4365 }else if( j+k<nKey2 && isdigit(zB[j+k]) ){ 4366 return -1; 4367 }else{ 4368 x = memcmp(zA+i, zB+j, k); 4369 if( x ) return x; 4370 i += k; 4371 j += k; 4372 } 4373 }else if( x ){ 4374 return x; 4375 }else{ 4376 i++; 4377 j++; 4378 } 4379 } 4380 return (nKey1 - i) - (nKey2 - j); 4381 } 4382 4383 #ifdef _WIN32 4384 4385 #endif 4386 int sqlite3_uint_init( 4387 sqlite3 *db, 4388 char **pzErrMsg, 4389 const sqlite3_api_routines *pApi 4390 ){ 4391 SQLITE_EXTENSION_INIT2(pApi); 4392 (void)pzErrMsg; /* Unused parameter */ 4393 return sqlite3_create_collation(db, "uint", SQLITE_UTF8, 0, uintCollFunc); 4394 } 4395 4396 /************************* End ../ext/misc/uint.c ********************/ 4397 /************************* Begin ../ext/misc/decimal.c ******************/ 4398 /* 4399 ** 2020-06-22 4400 ** 4401 ** The author disclaims copyright to this source code. In place of 4402 ** a legal notice, here is a blessing: 4403 ** 4404 ** May you do good and not evil. 4405 ** May you find forgiveness for yourself and forgive others. 4406 ** May you share freely, never taking more than you give. 4407 ** 4408 ****************************************************************************** 4409 ** 4410 ** Routines to implement arbitrary-precision decimal math. 4411 ** 4412 ** The focus here is on simplicity and correctness, not performance. 4413 */ 4414 /* #include "sqlite3ext.h" */ 4415 SQLITE_EXTENSION_INIT1 4416 #include <assert.h> 4417 #include <string.h> 4418 #include <ctype.h> 4419 #include <stdlib.h> 4420 4421 /* Mark a function parameter as unused, to suppress nuisance compiler 4422 ** warnings. */ 4423 #ifndef UNUSED_PARAMETER 4424 # define UNUSED_PARAMETER(X) (void)(X) 4425 #endif 4426 4427 4428 /* A decimal object */ 4429 typedef struct Decimal Decimal; 4430 struct Decimal { 4431 char sign; /* 0 for positive, 1 for negative */ 4432 char oom; /* True if an OOM is encountered */ 4433 char isNull; /* True if holds a NULL rather than a number */ 4434 char isInit; /* True upon initialization */ 4435 int nDigit; /* Total number of digits */ 4436 int nFrac; /* Number of digits to the right of the decimal point */ 4437 signed char *a; /* Array of digits. Most significant first. */ 4438 }; 4439 4440 /* 4441 ** Release memory held by a Decimal, but do not free the object itself. 4442 */ 4443 static void decimal_clear(Decimal *p){ 4444 sqlite3_free(p->a); 4445 } 4446 4447 /* 4448 ** Destroy a Decimal object 4449 */ 4450 static void decimal_free(Decimal *p){ 4451 if( p ){ 4452 decimal_clear(p); 4453 sqlite3_free(p); 4454 } 4455 } 4456 4457 /* 4458 ** Allocate a new Decimal object. Initialize it to the number given 4459 ** by the input string. 4460 */ 4461 static Decimal *decimal_new( 4462 sqlite3_context *pCtx, 4463 sqlite3_value *pIn, 4464 int nAlt, 4465 const unsigned char *zAlt 4466 ){ 4467 Decimal *p; 4468 int n, i; 4469 const unsigned char *zIn; 4470 int iExp = 0; 4471 p = sqlite3_malloc( sizeof(*p) ); 4472 if( p==0 ) goto new_no_mem; 4473 p->sign = 0; 4474 p->oom = 0; 4475 p->isInit = 1; 4476 p->isNull = 0; 4477 p->nDigit = 0; 4478 p->nFrac = 0; 4479 if( zAlt ){ 4480 n = nAlt, 4481 zIn = zAlt; 4482 }else{ 4483 if( sqlite3_value_type(pIn)==SQLITE_NULL ){ 4484 p->a = 0; 4485 p->isNull = 1; 4486 return p; 4487 } 4488 n = sqlite3_value_bytes(pIn); 4489 zIn = sqlite3_value_text(pIn); 4490 } 4491 p->a = sqlite3_malloc64( n+1 ); 4492 if( p->a==0 ) goto new_no_mem; 4493 for(i=0; isspace(zIn[i]); i++){} 4494 if( zIn[i]=='-' ){ 4495 p->sign = 1; 4496 i++; 4497 }else if( zIn[i]=='+' ){ 4498 i++; 4499 } 4500 while( i<n && zIn[i]=='0' ) i++; 4501 while( i<n ){ 4502 char c = zIn[i]; 4503 if( c>='0' && c<='9' ){ 4504 p->a[p->nDigit++] = c - '0'; 4505 }else if( c=='.' ){ 4506 p->nFrac = p->nDigit + 1; 4507 }else if( c=='e' || c=='E' ){ 4508 int j = i+1; 4509 int neg = 0; 4510 if( j>=n ) break; 4511 if( zIn[j]=='-' ){ 4512 neg = 1; 4513 j++; 4514 }else if( zIn[j]=='+' ){ 4515 j++; 4516 } 4517 while( j<n && iExp<1000000 ){ 4518 if( zIn[j]>='0' && zIn[j]<='9' ){ 4519 iExp = iExp*10 + zIn[j] - '0'; 4520 } 4521 j++; 4522 } 4523 if( neg ) iExp = -iExp; 4524 break; 4525 } 4526 i++; 4527 } 4528 if( p->nFrac ){ 4529 p->nFrac = p->nDigit - (p->nFrac - 1); 4530 } 4531 if( iExp>0 ){ 4532 if( p->nFrac>0 ){ 4533 if( iExp<=p->nFrac ){ 4534 p->nFrac -= iExp; 4535 iExp = 0; 4536 }else{ 4537 iExp -= p->nFrac; 4538 p->nFrac = 0; 4539 } 4540 } 4541 if( iExp>0 ){ 4542 p->a = sqlite3_realloc64(p->a, p->nDigit + iExp + 1 ); 4543 if( p->a==0 ) goto new_no_mem; 4544 memset(p->a+p->nDigit, 0, iExp); 4545 p->nDigit += iExp; 4546 } 4547 }else if( iExp<0 ){ 4548 int nExtra; 4549 iExp = -iExp; 4550 nExtra = p->nDigit - p->nFrac - 1; 4551 if( nExtra ){ 4552 if( nExtra>=iExp ){ 4553 p->nFrac += iExp; 4554 iExp = 0; 4555 }else{ 4556 iExp -= nExtra; 4557 p->nFrac = p->nDigit - 1; 4558 } 4559 } 4560 if( iExp>0 ){ 4561 p->a = sqlite3_realloc64(p->a, p->nDigit + iExp + 1 ); 4562 if( p->a==0 ) goto new_no_mem; 4563 memmove(p->a+iExp, p->a, p->nDigit); 4564 memset(p->a, 0, iExp); 4565 p->nDigit += iExp; 4566 p->nFrac += iExp; 4567 } 4568 } 4569 return p; 4570 4571 new_no_mem: 4572 if( pCtx ) sqlite3_result_error_nomem(pCtx); 4573 sqlite3_free(p); 4574 return 0; 4575 } 4576 4577 /* 4578 ** Make the given Decimal the result. 4579 */ 4580 static void decimal_result(sqlite3_context *pCtx, Decimal *p){ 4581 char *z; 4582 int i, j; 4583 int n; 4584 if( p==0 || p->oom ){ 4585 sqlite3_result_error_nomem(pCtx); 4586 return; 4587 } 4588 if( p->isNull ){ 4589 sqlite3_result_null(pCtx); 4590 return; 4591 } 4592 z = sqlite3_malloc( p->nDigit+4 ); 4593 if( z==0 ){ 4594 sqlite3_result_error_nomem(pCtx); 4595 return; 4596 } 4597 i = 0; 4598 if( p->nDigit==0 || (p->nDigit==1 && p->a[0]==0) ){ 4599 p->sign = 0; 4600 } 4601 if( p->sign ){ 4602 z[0] = '-'; 4603 i = 1; 4604 } 4605 n = p->nDigit - p->nFrac; 4606 if( n<=0 ){ 4607 z[i++] = '0'; 4608 } 4609 j = 0; 4610 while( n>1 && p->a[j]==0 ){ 4611 j++; 4612 n--; 4613 } 4614 while( n>0 ){ 4615 z[i++] = p->a[j] + '0'; 4616 j++; 4617 n--; 4618 } 4619 if( p->nFrac ){ 4620 z[i++] = '.'; 4621 do{ 4622 z[i++] = p->a[j] + '0'; 4623 j++; 4624 }while( j<p->nDigit ); 4625 } 4626 z[i] = 0; 4627 sqlite3_result_text(pCtx, z, i, sqlite3_free); 4628 } 4629 4630 /* 4631 ** SQL Function: decimal(X) 4632 ** 4633 ** Convert input X into decimal and then back into text 4634 */ 4635 static void decimalFunc( 4636 sqlite3_context *context, 4637 int argc, 4638 sqlite3_value **argv 4639 ){ 4640 Decimal *p = decimal_new(context, argv[0], 0, 0); 4641 UNUSED_PARAMETER(argc); 4642 decimal_result(context, p); 4643 decimal_free(p); 4644 } 4645 4646 /* 4647 ** Compare to Decimal objects. Return negative, 0, or positive if the 4648 ** first object is less than, equal to, or greater than the second. 4649 ** 4650 ** Preconditions for this routine: 4651 ** 4652 ** pA!=0 4653 ** pA->isNull==0 4654 ** pB!=0 4655 ** pB->isNull==0 4656 */ 4657 static int decimal_cmp(const Decimal *pA, const Decimal *pB){ 4658 int nASig, nBSig, rc, n; 4659 if( pA->sign!=pB->sign ){ 4660 return pA->sign ? -1 : +1; 4661 } 4662 if( pA->sign ){ 4663 const Decimal *pTemp = pA; 4664 pA = pB; 4665 pB = pTemp; 4666 } 4667 nASig = pA->nDigit - pA->nFrac; 4668 nBSig = pB->nDigit - pB->nFrac; 4669 if( nASig!=nBSig ){ 4670 return nASig - nBSig; 4671 } 4672 n = pA->nDigit; 4673 if( n>pB->nDigit ) n = pB->nDigit; 4674 rc = memcmp(pA->a, pB->a, n); 4675 if( rc==0 ){ 4676 rc = pA->nDigit - pB->nDigit; 4677 } 4678 return rc; 4679 } 4680 4681 /* 4682 ** SQL Function: decimal_cmp(X, Y) 4683 ** 4684 ** Return negative, zero, or positive if X is less then, equal to, or 4685 ** greater than Y. 4686 */ 4687 static void decimalCmpFunc( 4688 sqlite3_context *context, 4689 int argc, 4690 sqlite3_value **argv 4691 ){ 4692 Decimal *pA = 0, *pB = 0; 4693 int rc; 4694 4695 UNUSED_PARAMETER(argc); 4696 pA = decimal_new(context, argv[0], 0, 0); 4697 if( pA==0 || pA->isNull ) goto cmp_done; 4698 pB = decimal_new(context, argv[1], 0, 0); 4699 if( pB==0 || pB->isNull ) goto cmp_done; 4700 rc = decimal_cmp(pA, pB); 4701 if( rc<0 ) rc = -1; 4702 else if( rc>0 ) rc = +1; 4703 sqlite3_result_int(context, rc); 4704 cmp_done: 4705 decimal_free(pA); 4706 decimal_free(pB); 4707 } 4708 4709 /* 4710 ** Expand the Decimal so that it has a least nDigit digits and nFrac 4711 ** digits to the right of the decimal point. 4712 */ 4713 static void decimal_expand(Decimal *p, int nDigit, int nFrac){ 4714 int nAddSig; 4715 int nAddFrac; 4716 if( p==0 ) return; 4717 nAddFrac = nFrac - p->nFrac; 4718 nAddSig = (nDigit - p->nDigit) - nAddFrac; 4719 if( nAddFrac==0 && nAddSig==0 ) return; 4720 p->a = sqlite3_realloc64(p->a, nDigit+1); 4721 if( p->a==0 ){ 4722 p->oom = 1; 4723 return; 4724 } 4725 if( nAddSig ){ 4726 memmove(p->a+nAddSig, p->a, p->nDigit); 4727 memset(p->a, 0, nAddSig); 4728 p->nDigit += nAddSig; 4729 } 4730 if( nAddFrac ){ 4731 memset(p->a+p->nDigit, 0, nAddFrac); 4732 p->nDigit += nAddFrac; 4733 p->nFrac += nAddFrac; 4734 } 4735 } 4736 4737 /* 4738 ** Add the value pB into pA. 4739 ** 4740 ** Both pA and pB might become denormalized by this routine. 4741 */ 4742 static void decimal_add(Decimal *pA, Decimal *pB){ 4743 int nSig, nFrac, nDigit; 4744 int i, rc; 4745 if( pA==0 ){ 4746 return; 4747 } 4748 if( pA->oom || pB==0 || pB->oom ){ 4749 pA->oom = 1; 4750 return; 4751 } 4752 if( pA->isNull || pB->isNull ){ 4753 pA->isNull = 1; 4754 return; 4755 } 4756 nSig = pA->nDigit - pA->nFrac; 4757 if( nSig && pA->a[0]==0 ) nSig--; 4758 if( nSig<pB->nDigit-pB->nFrac ){ 4759 nSig = pB->nDigit - pB->nFrac; 4760 } 4761 nFrac = pA->nFrac; 4762 if( nFrac<pB->nFrac ) nFrac = pB->nFrac; 4763 nDigit = nSig + nFrac + 1; 4764 decimal_expand(pA, nDigit, nFrac); 4765 decimal_expand(pB, nDigit, nFrac); 4766 if( pA->oom || pB->oom ){ 4767 pA->oom = 1; 4768 }else{ 4769 if( pA->sign==pB->sign ){ 4770 int carry = 0; 4771 for(i=nDigit-1; i>=0; i--){ 4772 int x = pA->a[i] + pB->a[i] + carry; 4773 if( x>=10 ){ 4774 carry = 1; 4775 pA->a[i] = x - 10; 4776 }else{ 4777 carry = 0; 4778 pA->a[i] = x; 4779 } 4780 } 4781 }else{ 4782 signed char *aA, *aB; 4783 int borrow = 0; 4784 rc = memcmp(pA->a, pB->a, nDigit); 4785 if( rc<0 ){ 4786 aA = pB->a; 4787 aB = pA->a; 4788 pA->sign = !pA->sign; 4789 }else{ 4790 aA = pA->a; 4791 aB = pB->a; 4792 } 4793 for(i=nDigit-1; i>=0; i--){ 4794 int x = aA[i] - aB[i] - borrow; 4795 if( x<0 ){ 4796 pA->a[i] = x+10; 4797 borrow = 1; 4798 }else{ 4799 pA->a[i] = x; 4800 borrow = 0; 4801 } 4802 } 4803 } 4804 } 4805 } 4806 4807 /* 4808 ** Compare text in decimal order. 4809 */ 4810 static int decimalCollFunc( 4811 void *notUsed, 4812 int nKey1, const void *pKey1, 4813 int nKey2, const void *pKey2 4814 ){ 4815 const unsigned char *zA = (const unsigned char*)pKey1; 4816 const unsigned char *zB = (const unsigned char*)pKey2; 4817 Decimal *pA = decimal_new(0, 0, nKey1, zA); 4818 Decimal *pB = decimal_new(0, 0, nKey2, zB); 4819 int rc; 4820 UNUSED_PARAMETER(notUsed); 4821 if( pA==0 || pB==0 ){ 4822 rc = 0; 4823 }else{ 4824 rc = decimal_cmp(pA, pB); 4825 } 4826 decimal_free(pA); 4827 decimal_free(pB); 4828 return rc; 4829 } 4830 4831 4832 /* 4833 ** SQL Function: decimal_add(X, Y) 4834 ** decimal_sub(X, Y) 4835 ** 4836 ** Return the sum or difference of X and Y. 4837 */ 4838 static void decimalAddFunc( 4839 sqlite3_context *context, 4840 int argc, 4841 sqlite3_value **argv 4842 ){ 4843 Decimal *pA = decimal_new(context, argv[0], 0, 0); 4844 Decimal *pB = decimal_new(context, argv[1], 0, 0); 4845 UNUSED_PARAMETER(argc); 4846 decimal_add(pA, pB); 4847 decimal_result(context, pA); 4848 decimal_free(pA); 4849 decimal_free(pB); 4850 } 4851 static void decimalSubFunc( 4852 sqlite3_context *context, 4853 int argc, 4854 sqlite3_value **argv 4855 ){ 4856 Decimal *pA = decimal_new(context, argv[0], 0, 0); 4857 Decimal *pB = decimal_new(context, argv[1], 0, 0); 4858 UNUSED_PARAMETER(argc); 4859 if( pB==0 ) return; 4860 pB->sign = !pB->sign; 4861 decimal_add(pA, pB); 4862 decimal_result(context, pA); 4863 decimal_free(pA); 4864 decimal_free(pB); 4865 } 4866 4867 /* Aggregate funcion: decimal_sum(X) 4868 ** 4869 ** Works like sum() except that it uses decimal arithmetic for unlimited 4870 ** precision. 4871 */ 4872 static void decimalSumStep( 4873 sqlite3_context *context, 4874 int argc, 4875 sqlite3_value **argv 4876 ){ 4877 Decimal *p; 4878 Decimal *pArg; 4879 UNUSED_PARAMETER(argc); 4880 p = sqlite3_aggregate_context(context, sizeof(*p)); 4881 if( p==0 ) return; 4882 if( !p->isInit ){ 4883 p->isInit = 1; 4884 p->a = sqlite3_malloc(2); 4885 if( p->a==0 ){ 4886 p->oom = 1; 4887 }else{ 4888 p->a[0] = 0; 4889 } 4890 p->nDigit = 1; 4891 p->nFrac = 0; 4892 } 4893 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; 4894 pArg = decimal_new(context, argv[0], 0, 0); 4895 decimal_add(p, pArg); 4896 decimal_free(pArg); 4897 } 4898 static void decimalSumInverse( 4899 sqlite3_context *context, 4900 int argc, 4901 sqlite3_value **argv 4902 ){ 4903 Decimal *p; 4904 Decimal *pArg; 4905 UNUSED_PARAMETER(argc); 4906 p = sqlite3_aggregate_context(context, sizeof(*p)); 4907 if( p==0 ) return; 4908 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; 4909 pArg = decimal_new(context, argv[0], 0, 0); 4910 if( pArg ) pArg->sign = !pArg->sign; 4911 decimal_add(p, pArg); 4912 decimal_free(pArg); 4913 } 4914 static void decimalSumValue(sqlite3_context *context){ 4915 Decimal *p = sqlite3_aggregate_context(context, 0); 4916 if( p==0 ) return; 4917 decimal_result(context, p); 4918 } 4919 static void decimalSumFinalize(sqlite3_context *context){ 4920 Decimal *p = sqlite3_aggregate_context(context, 0); 4921 if( p==0 ) return; 4922 decimal_result(context, p); 4923 decimal_clear(p); 4924 } 4925 4926 /* 4927 ** SQL Function: decimal_mul(X, Y) 4928 ** 4929 ** Return the product of X and Y. 4930 ** 4931 ** All significant digits after the decimal point are retained. 4932 ** Trailing zeros after the decimal point are omitted as long as 4933 ** the number of digits after the decimal point is no less than 4934 ** either the number of digits in either input. 4935 */ 4936 static void decimalMulFunc( 4937 sqlite3_context *context, 4938 int argc, 4939 sqlite3_value **argv 4940 ){ 4941 Decimal *pA = decimal_new(context, argv[0], 0, 0); 4942 Decimal *pB = decimal_new(context, argv[1], 0, 0); 4943 signed char *acc = 0; 4944 int i, j, k; 4945 int minFrac; 4946 UNUSED_PARAMETER(argc); 4947 if( pA==0 || pA->oom || pA->isNull 4948 || pB==0 || pB->oom || pB->isNull 4949 ){ 4950 goto mul_end; 4951 } 4952 acc = sqlite3_malloc64( pA->nDigit + pB->nDigit + 2 ); 4953 if( acc==0 ){ 4954 sqlite3_result_error_nomem(context); 4955 goto mul_end; 4956 } 4957 memset(acc, 0, pA->nDigit + pB->nDigit + 2); 4958 minFrac = pA->nFrac; 4959 if( pB->nFrac<minFrac ) minFrac = pB->nFrac; 4960 for(i=pA->nDigit-1; i>=0; i--){ 4961 signed char f = pA->a[i]; 4962 int carry = 0, x; 4963 for(j=pB->nDigit-1, k=i+j+3; j>=0; j--, k--){ 4964 x = acc[k] + f*pB->a[j] + carry; 4965 acc[k] = x%10; 4966 carry = x/10; 4967 } 4968 x = acc[k] + carry; 4969 acc[k] = x%10; 4970 acc[k-1] += x/10; 4971 } 4972 sqlite3_free(pA->a); 4973 pA->a = acc; 4974 acc = 0; 4975 pA->nDigit += pB->nDigit + 2; 4976 pA->nFrac += pB->nFrac; 4977 pA->sign ^= pB->sign; 4978 while( pA->nFrac>minFrac && pA->a[pA->nDigit-1]==0 ){ 4979 pA->nFrac--; 4980 pA->nDigit--; 4981 } 4982 decimal_result(context, pA); 4983 4984 mul_end: 4985 sqlite3_free(acc); 4986 decimal_free(pA); 4987 decimal_free(pB); 4988 } 4989 4990 #ifdef _WIN32 4991 4992 #endif 4993 int sqlite3_decimal_init( 4994 sqlite3 *db, 4995 char **pzErrMsg, 4996 const sqlite3_api_routines *pApi 4997 ){ 4998 int rc = SQLITE_OK; 4999 static const struct { 5000 const char *zFuncName; 5001 int nArg; 5002 void (*xFunc)(sqlite3_context*,int,sqlite3_value**); 5003 } aFunc[] = { 5004 { "decimal", 1, decimalFunc }, 5005 { "decimal_cmp", 2, decimalCmpFunc }, 5006 { "decimal_add", 2, decimalAddFunc }, 5007 { "decimal_sub", 2, decimalSubFunc }, 5008 { "decimal_mul", 2, decimalMulFunc }, 5009 }; 5010 unsigned int i; 5011 (void)pzErrMsg; /* Unused parameter */ 5012 5013 SQLITE_EXTENSION_INIT2(pApi); 5014 5015 for(i=0; i<sizeof(aFunc)/sizeof(aFunc[0]) && rc==SQLITE_OK; i++){ 5016 rc = sqlite3_create_function(db, aFunc[i].zFuncName, aFunc[i].nArg, 5017 SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC, 5018 0, aFunc[i].xFunc, 0, 0); 5019 } 5020 if( rc==SQLITE_OK ){ 5021 rc = sqlite3_create_window_function(db, "decimal_sum", 1, 5022 SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC, 0, 5023 decimalSumStep, decimalSumFinalize, 5024 decimalSumValue, decimalSumInverse, 0); 5025 } 5026 if( rc==SQLITE_OK ){ 5027 rc = sqlite3_create_collation(db, "decimal", SQLITE_UTF8, 5028 0, decimalCollFunc); 5029 } 5030 return rc; 5031 } 5032 5033 /************************* End ../ext/misc/decimal.c ********************/ 5034 /************************* Begin ../ext/misc/ieee754.c ******************/ 5035 /* 5036 ** 2013-04-17 5037 ** 5038 ** The author disclaims copyright to this source code. In place of 5039 ** a legal notice, here is a blessing: 5040 ** 5041 ** May you do good and not evil. 5042 ** May you find forgiveness for yourself and forgive others. 5043 ** May you share freely, never taking more than you give. 5044 ** 5045 ****************************************************************************** 5046 ** 5047 ** This SQLite extension implements functions for the exact display 5048 ** and input of IEEE754 Binary64 floating-point numbers. 5049 ** 5050 ** ieee754(X) 5051 ** ieee754(Y,Z) 5052 ** 5053 ** In the first form, the value X should be a floating-point number. 5054 ** The function will return a string of the form 'ieee754(Y,Z)' where 5055 ** Y and Z are integers such that X==Y*pow(2,Z). 5056 ** 5057 ** In the second form, Y and Z are integers which are the mantissa and 5058 ** base-2 exponent of a new floating point number. The function returns 5059 ** a floating-point value equal to Y*pow(2,Z). 5060 ** 5061 ** Examples: 5062 ** 5063 ** ieee754(2.0) -> 'ieee754(2,0)' 5064 ** ieee754(45.25) -> 'ieee754(181,-2)' 5065 ** ieee754(2, 0) -> 2.0 5066 ** ieee754(181, -2) -> 45.25 5067 ** 5068 ** Two additional functions break apart the one-argument ieee754() 5069 ** result into separate integer values: 5070 ** 5071 ** ieee754_mantissa(45.25) -> 181 5072 ** ieee754_exponent(45.25) -> -2 5073 ** 5074 ** These functions convert binary64 numbers into blobs and back again. 5075 ** 5076 ** ieee754_from_blob(x'3ff0000000000000') -> 1.0 5077 ** ieee754_to_blob(1.0) -> x'3ff0000000000000' 5078 ** 5079 ** In all single-argument functions, if the argument is an 8-byte blob 5080 ** then that blob is interpreted as a big-endian binary64 value. 5081 ** 5082 ** 5083 ** EXACT DECIMAL REPRESENTATION OF BINARY64 VALUES 5084 ** ----------------------------------------------- 5085 ** 5086 ** This extension in combination with the separate 'decimal' extension 5087 ** can be used to compute the exact decimal representation of binary64 5088 ** values. To begin, first compute a table of exponent values: 5089 ** 5090 ** CREATE TABLE pow2(x INTEGER PRIMARY KEY, v TEXT); 5091 ** WITH RECURSIVE c(x,v) AS ( 5092 ** VALUES(0,'1') 5093 ** UNION ALL 5094 ** SELECT x+1, decimal_mul(v,'2') FROM c WHERE x+1<=971 5095 ** ) INSERT INTO pow2(x,v) SELECT x, v FROM c; 5096 ** WITH RECURSIVE c(x,v) AS ( 5097 ** VALUES(-1,'0.5') 5098 ** UNION ALL 5099 ** SELECT x-1, decimal_mul(v,'0.5') FROM c WHERE x-1>=-1075 5100 ** ) INSERT INTO pow2(x,v) SELECT x, v FROM c; 5101 ** 5102 ** Then, to compute the exact decimal representation of a floating 5103 ** point value (the value 47.49 is used in the example) do: 5104 ** 5105 ** WITH c(n) AS (VALUES(47.49)) 5106 ** ---------------^^^^^---- Replace with whatever you want 5107 ** SELECT decimal_mul(ieee754_mantissa(c.n),pow2.v) 5108 ** FROM pow2, c WHERE pow2.x=ieee754_exponent(c.n); 5109 ** 5110 ** Here is a query to show various boundry values for the binary64 5111 ** number format: 5112 ** 5113 ** WITH c(name,bin) AS (VALUES 5114 ** ('minimum positive value', x'0000000000000001'), 5115 ** ('maximum subnormal value', x'000fffffffffffff'), 5116 ** ('mininum positive nornal value', x'0010000000000000'), 5117 ** ('maximum value', x'7fefffffffffffff')) 5118 ** SELECT c.name, decimal_mul(ieee754_mantissa(c.bin),pow2.v) 5119 ** FROM pow2, c WHERE pow2.x=ieee754_exponent(c.bin); 5120 ** 5121 */ 5122 /* #include "sqlite3ext.h" */ 5123 SQLITE_EXTENSION_INIT1 5124 #include <assert.h> 5125 #include <string.h> 5126 5127 /* Mark a function parameter as unused, to suppress nuisance compiler 5128 ** warnings. */ 5129 #ifndef UNUSED_PARAMETER 5130 # define UNUSED_PARAMETER(X) (void)(X) 5131 #endif 5132 5133 /* 5134 ** Implementation of the ieee754() function 5135 */ 5136 static void ieee754func( 5137 sqlite3_context *context, 5138 int argc, 5139 sqlite3_value **argv 5140 ){ 5141 if( argc==1 ){ 5142 sqlite3_int64 m, a; 5143 double r; 5144 int e; 5145 int isNeg; 5146 char zResult[100]; 5147 assert( sizeof(m)==sizeof(r) ); 5148 if( sqlite3_value_type(argv[0])==SQLITE_BLOB 5149 && sqlite3_value_bytes(argv[0])==sizeof(r) 5150 ){ 5151 const unsigned char *x = sqlite3_value_blob(argv[0]); 5152 unsigned int i; 5153 sqlite3_uint64 v = 0; 5154 for(i=0; i<sizeof(r); i++){ 5155 v = (v<<8) | x[i]; 5156 } 5157 memcpy(&r, &v, sizeof(r)); 5158 }else{ 5159 r = sqlite3_value_double(argv[0]); 5160 } 5161 if( r<0.0 ){ 5162 isNeg = 1; 5163 r = -r; 5164 }else{ 5165 isNeg = 0; 5166 } 5167 memcpy(&a,&r,sizeof(a)); 5168 if( a==0 ){ 5169 e = 0; 5170 m = 0; 5171 }else{ 5172 e = a>>52; 5173 m = a & ((((sqlite3_int64)1)<<52)-1); 5174 if( e==0 ){ 5175 m <<= 1; 5176 }else{ 5177 m |= ((sqlite3_int64)1)<<52; 5178 } 5179 while( e<1075 && m>0 && (m&1)==0 ){ 5180 m >>= 1; 5181 e++; 5182 } 5183 if( isNeg ) m = -m; 5184 } 5185 switch( *(int*)sqlite3_user_data(context) ){ 5186 case 0: 5187 sqlite3_snprintf(sizeof(zResult), zResult, "ieee754(%lld,%d)", 5188 m, e-1075); 5189 sqlite3_result_text(context, zResult, -1, SQLITE_TRANSIENT); 5190 break; 5191 case 1: 5192 sqlite3_result_int64(context, m); 5193 break; 5194 case 2: 5195 sqlite3_result_int(context, e-1075); 5196 break; 5197 } 5198 }else{ 5199 sqlite3_int64 m, e, a; 5200 double r; 5201 int isNeg = 0; 5202 m = sqlite3_value_int64(argv[0]); 5203 e = sqlite3_value_int64(argv[1]); 5204 if( m<0 ){ 5205 isNeg = 1; 5206 m = -m; 5207 if( m<0 ) return; 5208 }else if( m==0 && e>-1000 && e<1000 ){ 5209 sqlite3_result_double(context, 0.0); 5210 return; 5211 } 5212 while( (m>>32)&0xffe00000 ){ 5213 m >>= 1; 5214 e++; 5215 } 5216 while( m!=0 && ((m>>32)&0xfff00000)==0 ){ 5217 m <<= 1; 5218 e--; 5219 } 5220 e += 1075; 5221 if( e<=0 ){ 5222 /* Subnormal */ 5223 m >>= 1-e; 5224 e = 0; 5225 }else if( e>0x7ff ){ 5226 e = 0x7ff; 5227 } 5228 a = m & ((((sqlite3_int64)1)<<52)-1); 5229 a |= e<<52; 5230 if( isNeg ) a |= ((sqlite3_uint64)1)<<63; 5231 memcpy(&r, &a, sizeof(r)); 5232 sqlite3_result_double(context, r); 5233 } 5234 } 5235 5236 /* 5237 ** Functions to convert between blobs and floats. 5238 */ 5239 static void ieee754func_from_blob( 5240 sqlite3_context *context, 5241 int argc, 5242 sqlite3_value **argv 5243 ){ 5244 UNUSED_PARAMETER(argc); 5245 if( sqlite3_value_type(argv[0])==SQLITE_BLOB 5246 && sqlite3_value_bytes(argv[0])==sizeof(double) 5247 ){ 5248 double r; 5249 const unsigned char *x = sqlite3_value_blob(argv[0]); 5250 unsigned int i; 5251 sqlite3_uint64 v = 0; 5252 for(i=0; i<sizeof(r); i++){ 5253 v = (v<<8) | x[i]; 5254 } 5255 memcpy(&r, &v, sizeof(r)); 5256 sqlite3_result_double(context, r); 5257 } 5258 } 5259 static void ieee754func_to_blob( 5260 sqlite3_context *context, 5261 int argc, 5262 sqlite3_value **argv 5263 ){ 5264 UNUSED_PARAMETER(argc); 5265 if( sqlite3_value_type(argv[0])==SQLITE_FLOAT 5266 || sqlite3_value_type(argv[0])==SQLITE_INTEGER 5267 ){ 5268 double r = sqlite3_value_double(argv[0]); 5269 sqlite3_uint64 v; 5270 unsigned char a[sizeof(r)]; 5271 unsigned int i; 5272 memcpy(&v, &r, sizeof(r)); 5273 for(i=1; i<=sizeof(r); i++){ 5274 a[sizeof(r)-i] = v&0xff; 5275 v >>= 8; 5276 } 5277 sqlite3_result_blob(context, a, sizeof(r), SQLITE_TRANSIENT); 5278 } 5279 } 5280 5281 5282 #ifdef _WIN32 5283 5284 #endif 5285 int sqlite3_ieee_init( 5286 sqlite3 *db, 5287 char **pzErrMsg, 5288 const sqlite3_api_routines *pApi 5289 ){ 5290 static const struct { 5291 char *zFName; 5292 int nArg; 5293 int iAux; 5294 void (*xFunc)(sqlite3_context*,int,sqlite3_value**); 5295 } aFunc[] = { 5296 { "ieee754", 1, 0, ieee754func }, 5297 { "ieee754", 2, 0, ieee754func }, 5298 { "ieee754_mantissa", 1, 1, ieee754func }, 5299 { "ieee754_exponent", 1, 2, ieee754func }, 5300 { "ieee754_to_blob", 1, 0, ieee754func_to_blob }, 5301 { "ieee754_from_blob", 1, 0, ieee754func_from_blob }, 5302 5303 }; 5304 unsigned int i; 5305 int rc = SQLITE_OK; 5306 SQLITE_EXTENSION_INIT2(pApi); 5307 (void)pzErrMsg; /* Unused parameter */ 5308 for(i=0; i<sizeof(aFunc)/sizeof(aFunc[0]) && rc==SQLITE_OK; i++){ 5309 rc = sqlite3_create_function(db, aFunc[i].zFName, aFunc[i].nArg, 5310 SQLITE_UTF8|SQLITE_INNOCUOUS, 5311 (void*)&aFunc[i].iAux, 5312 aFunc[i].xFunc, 0, 0); 5313 } 5314 return rc; 5315 } 5316 5317 /************************* End ../ext/misc/ieee754.c ********************/ 5318 #ifdef SQLITE_HAVE_ZLIB 5319 /************************* Begin ../ext/misc/zipfile.c ******************/ 5320 /* 5321 ** 2017-12-26 5322 ** 5323 ** The author disclaims copyright to this source code. In place of 5324 ** a legal notice, here is a blessing: 5325 ** 5326 ** May you do good and not evil. 5327 ** May you find forgiveness for yourself and forgive others. 5328 ** May you share freely, never taking more than you give. 5329 ** 5330 ****************************************************************************** 5331 ** 5332 ** This file implements a virtual table for reading and writing ZIP archive 5333 ** files. 5334 ** 5335 ** Usage example: 5336 ** 5337 ** SELECT name, sz, datetime(mtime,'unixepoch') FROM zipfile($filename); 5338 ** 5339 ** Current limitations: 5340 ** 5341 ** * No support for encryption 5342 ** * No support for ZIP archives spanning multiple files 5343 ** * No support for zip64 extensions 5344 ** * Only the "inflate/deflate" (zlib) compression method is supported 5345 */ 5346 /* #include "sqlite3ext.h" */ 5347 SQLITE_EXTENSION_INIT1 5348 #include <stdio.h> 5349 #include <string.h> 5350 #include <assert.h> 5351 5352 #include <zlib.h> 5353 5354 #ifndef SQLITE_OMIT_VIRTUALTABLE 5355 5356 #ifndef SQLITE_AMALGAMATION 5357 5358 /* typedef sqlite3_int64 i64; */ 5359 /* typedef unsigned char u8; */ 5360 typedef unsigned short u16; 5361 typedef unsigned long u32; 5362 #define MIN(a,b) ((a)<(b) ? (a) : (b)) 5363 5364 #if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST) 5365 # define ALWAYS(X) (1) 5366 # define NEVER(X) (0) 5367 #elif !defined(NDEBUG) 5368 # define ALWAYS(X) ((X)?1:(assert(0),0)) 5369 # define NEVER(X) ((X)?(assert(0),1):0) 5370 #else 5371 # define ALWAYS(X) (X) 5372 # define NEVER(X) (X) 5373 #endif 5374 5375 #endif /* SQLITE_AMALGAMATION */ 5376 5377 /* 5378 ** Definitions for mode bitmasks S_IFDIR, S_IFREG and S_IFLNK. 5379 ** 5380 ** In some ways it would be better to obtain these values from system 5381 ** header files. But, the dependency is undesirable and (a) these 5382 ** have been stable for decades, (b) the values are part of POSIX and 5383 ** are also made explicit in [man stat], and (c) are part of the 5384 ** file format for zip archives. 5385 */ 5386 #ifndef S_IFDIR 5387 # define S_IFDIR 0040000 5388 #endif 5389 #ifndef S_IFREG 5390 # define S_IFREG 0100000 5391 #endif 5392 #ifndef S_IFLNK 5393 # define S_IFLNK 0120000 5394 #endif 5395 5396 static const char ZIPFILE_SCHEMA[] = 5397 "CREATE TABLE y(" 5398 "name PRIMARY KEY," /* 0: Name of file in zip archive */ 5399 "mode," /* 1: POSIX mode for file */ 5400 "mtime," /* 2: Last modification time (secs since 1970)*/ 5401 "sz," /* 3: Size of object */ 5402 "rawdata," /* 4: Raw data */ 5403 "data," /* 5: Uncompressed data */ 5404 "method," /* 6: Compression method (integer) */ 5405 "z HIDDEN" /* 7: Name of zip file */ 5406 ") WITHOUT ROWID;"; 5407 5408 #define ZIPFILE_F_COLUMN_IDX 7 /* Index of column "file" in the above */ 5409 #define ZIPFILE_BUFFER_SIZE (64*1024) 5410 5411 5412 /* 5413 ** Magic numbers used to read and write zip files. 5414 ** 5415 ** ZIPFILE_NEWENTRY_MADEBY: 5416 ** Use this value for the "version-made-by" field in new zip file 5417 ** entries. The upper byte indicates "unix", and the lower byte 5418 ** indicates that the zip file matches pkzip specification 3.0. 5419 ** This is what info-zip seems to do. 5420 ** 5421 ** ZIPFILE_NEWENTRY_REQUIRED: 5422 ** Value for "version-required-to-extract" field of new entries. 5423 ** Version 2.0 is required to support folders and deflate compression. 5424 ** 5425 ** ZIPFILE_NEWENTRY_FLAGS: 5426 ** Value for "general-purpose-bit-flags" field of new entries. Bit 5427 ** 11 means "utf-8 filename and comment". 5428 ** 5429 ** ZIPFILE_SIGNATURE_CDS: 5430 ** First 4 bytes of a valid CDS record. 5431 ** 5432 ** ZIPFILE_SIGNATURE_LFH: 5433 ** First 4 bytes of a valid LFH record. 5434 ** 5435 ** ZIPFILE_SIGNATURE_EOCD 5436 ** First 4 bytes of a valid EOCD record. 5437 */ 5438 #define ZIPFILE_EXTRA_TIMESTAMP 0x5455 5439 #define ZIPFILE_NEWENTRY_MADEBY ((3<<8) + 30) 5440 #define ZIPFILE_NEWENTRY_REQUIRED 20 5441 #define ZIPFILE_NEWENTRY_FLAGS 0x800 5442 #define ZIPFILE_SIGNATURE_CDS 0x02014b50 5443 #define ZIPFILE_SIGNATURE_LFH 0x04034b50 5444 #define ZIPFILE_SIGNATURE_EOCD 0x06054b50 5445 5446 /* 5447 ** The sizes of the fixed-size part of each of the three main data 5448 ** structures in a zip archive. 5449 */ 5450 #define ZIPFILE_LFH_FIXED_SZ 30 5451 #define ZIPFILE_EOCD_FIXED_SZ 22 5452 #define ZIPFILE_CDS_FIXED_SZ 46 5453 5454 /* 5455 *** 4.3.16 End of central directory record: 5456 *** 5457 *** end of central dir signature 4 bytes (0x06054b50) 5458 *** number of this disk 2 bytes 5459 *** number of the disk with the 5460 *** start of the central directory 2 bytes 5461 *** total number of entries in the 5462 *** central directory on this disk 2 bytes 5463 *** total number of entries in 5464 *** the central directory 2 bytes 5465 *** size of the central directory 4 bytes 5466 *** offset of start of central 5467 *** directory with respect to 5468 *** the starting disk number 4 bytes 5469 *** .ZIP file comment length 2 bytes 5470 *** .ZIP file comment (variable size) 5471 */ 5472 typedef struct ZipfileEOCD ZipfileEOCD; 5473 struct ZipfileEOCD { 5474 u16 iDisk; 5475 u16 iFirstDisk; 5476 u16 nEntry; 5477 u16 nEntryTotal; 5478 u32 nSize; 5479 u32 iOffset; 5480 }; 5481 5482 /* 5483 *** 4.3.12 Central directory structure: 5484 *** 5485 *** ... 5486 *** 5487 *** central file header signature 4 bytes (0x02014b50) 5488 *** version made by 2 bytes 5489 *** version needed to extract 2 bytes 5490 *** general purpose bit flag 2 bytes 5491 *** compression method 2 bytes 5492 *** last mod file time 2 bytes 5493 *** last mod file date 2 bytes 5494 *** crc-32 4 bytes 5495 *** compressed size 4 bytes 5496 *** uncompressed size 4 bytes 5497 *** file name length 2 bytes 5498 *** extra field length 2 bytes 5499 *** file comment length 2 bytes 5500 *** disk number start 2 bytes 5501 *** internal file attributes 2 bytes 5502 *** external file attributes 4 bytes 5503 *** relative offset of local header 4 bytes 5504 */ 5505 typedef struct ZipfileCDS ZipfileCDS; 5506 struct ZipfileCDS { 5507 u16 iVersionMadeBy; 5508 u16 iVersionExtract; 5509 u16 flags; 5510 u16 iCompression; 5511 u16 mTime; 5512 u16 mDate; 5513 u32 crc32; 5514 u32 szCompressed; 5515 u32 szUncompressed; 5516 u16 nFile; 5517 u16 nExtra; 5518 u16 nComment; 5519 u16 iDiskStart; 5520 u16 iInternalAttr; 5521 u32 iExternalAttr; 5522 u32 iOffset; 5523 char *zFile; /* Filename (sqlite3_malloc()) */ 5524 }; 5525 5526 /* 5527 *** 4.3.7 Local file header: 5528 *** 5529 *** local file header signature 4 bytes (0x04034b50) 5530 *** version needed to extract 2 bytes 5531 *** general purpose bit flag 2 bytes 5532 *** compression method 2 bytes 5533 *** last mod file time 2 bytes 5534 *** last mod file date 2 bytes 5535 *** crc-32 4 bytes 5536 *** compressed size 4 bytes 5537 *** uncompressed size 4 bytes 5538 *** file name length 2 bytes 5539 *** extra field length 2 bytes 5540 *** 5541 */ 5542 typedef struct ZipfileLFH ZipfileLFH; 5543 struct ZipfileLFH { 5544 u16 iVersionExtract; 5545 u16 flags; 5546 u16 iCompression; 5547 u16 mTime; 5548 u16 mDate; 5549 u32 crc32; 5550 u32 szCompressed; 5551 u32 szUncompressed; 5552 u16 nFile; 5553 u16 nExtra; 5554 }; 5555 5556 typedef struct ZipfileEntry ZipfileEntry; 5557 struct ZipfileEntry { 5558 ZipfileCDS cds; /* Parsed CDS record */ 5559 u32 mUnixTime; /* Modification time, in UNIX format */ 5560 u8 *aExtra; /* cds.nExtra+cds.nComment bytes of extra data */ 5561 i64 iDataOff; /* Offset to data in file (if aData==0) */ 5562 u8 *aData; /* cds.szCompressed bytes of compressed data */ 5563 ZipfileEntry *pNext; /* Next element in in-memory CDS */ 5564 }; 5565 5566 /* 5567 ** Cursor type for zipfile tables. 5568 */ 5569 typedef struct ZipfileCsr ZipfileCsr; 5570 struct ZipfileCsr { 5571 sqlite3_vtab_cursor base; /* Base class - must be first */ 5572 i64 iId; /* Cursor ID */ 5573 u8 bEof; /* True when at EOF */ 5574 u8 bNoop; /* If next xNext() call is no-op */ 5575 5576 /* Used outside of write transactions */ 5577 FILE *pFile; /* Zip file */ 5578 i64 iNextOff; /* Offset of next record in central directory */ 5579 ZipfileEOCD eocd; /* Parse of central directory record */ 5580 5581 ZipfileEntry *pFreeEntry; /* Free this list when cursor is closed or reset */ 5582 ZipfileEntry *pCurrent; /* Current entry */ 5583 ZipfileCsr *pCsrNext; /* Next cursor on same virtual table */ 5584 }; 5585 5586 typedef struct ZipfileTab ZipfileTab; 5587 struct ZipfileTab { 5588 sqlite3_vtab base; /* Base class - must be first */ 5589 char *zFile; /* Zip file this table accesses (may be NULL) */ 5590 sqlite3 *db; /* Host database connection */ 5591 u8 *aBuffer; /* Temporary buffer used for various tasks */ 5592 5593 ZipfileCsr *pCsrList; /* List of cursors */ 5594 i64 iNextCsrid; 5595 5596 /* The following are used by write transactions only */ 5597 ZipfileEntry *pFirstEntry; /* Linked list of all files (if pWriteFd!=0) */ 5598 ZipfileEntry *pLastEntry; /* Last element in pFirstEntry list */ 5599 FILE *pWriteFd; /* File handle open on zip archive */ 5600 i64 szCurrent; /* Current size of zip archive */ 5601 i64 szOrig; /* Size of archive at start of transaction */ 5602 }; 5603 5604 /* 5605 ** Set the error message contained in context ctx to the results of 5606 ** vprintf(zFmt, ...). 5607 */ 5608 static void zipfileCtxErrorMsg(sqlite3_context *ctx, const char *zFmt, ...){ 5609 char *zMsg = 0; 5610 va_list ap; 5611 va_start(ap, zFmt); 5612 zMsg = sqlite3_vmprintf(zFmt, ap); 5613 sqlite3_result_error(ctx, zMsg, -1); 5614 sqlite3_free(zMsg); 5615 va_end(ap); 5616 } 5617 5618 /* 5619 ** If string zIn is quoted, dequote it in place. Otherwise, if the string 5620 ** is not quoted, do nothing. 5621 */ 5622 static void zipfileDequote(char *zIn){ 5623 char q = zIn[0]; 5624 if( q=='"' || q=='\'' || q=='`' || q=='[' ){ 5625 int iIn = 1; 5626 int iOut = 0; 5627 if( q=='[' ) q = ']'; 5628 while( ALWAYS(zIn[iIn]) ){ 5629 char c = zIn[iIn++]; 5630 if( c==q && zIn[iIn++]!=q ) break; 5631 zIn[iOut++] = c; 5632 } 5633 zIn[iOut] = '\0'; 5634 } 5635 } 5636 5637 /* 5638 ** Construct a new ZipfileTab virtual table object. 5639 ** 5640 ** argv[0] -> module name ("zipfile") 5641 ** argv[1] -> database name 5642 ** argv[2] -> table name 5643 ** argv[...] -> "column name" and other module argument fields. 5644 */ 5645 static int zipfileConnect( 5646 sqlite3 *db, 5647 void *pAux, 5648 int argc, const char *const*argv, 5649 sqlite3_vtab **ppVtab, 5650 char **pzErr 5651 ){ 5652 int nByte = sizeof(ZipfileTab) + ZIPFILE_BUFFER_SIZE; 5653 int nFile = 0; 5654 const char *zFile = 0; 5655 ZipfileTab *pNew = 0; 5656 int rc; 5657 5658 /* If the table name is not "zipfile", require that the argument be 5659 ** specified. This stops zipfile tables from being created as: 5660 ** 5661 ** CREATE VIRTUAL TABLE zzz USING zipfile(); 5662 ** 5663 ** It does not prevent: 5664 ** 5665 ** CREATE VIRTUAL TABLE zipfile USING zipfile(); 5666 */ 5667 assert( 0==sqlite3_stricmp(argv[0], "zipfile") ); 5668 if( (0!=sqlite3_stricmp(argv[2], "zipfile") && argc<4) || argc>4 ){ 5669 *pzErr = sqlite3_mprintf("zipfile constructor requires one argument"); 5670 return SQLITE_ERROR; 5671 } 5672 5673 if( argc>3 ){ 5674 zFile = argv[3]; 5675 nFile = (int)strlen(zFile)+1; 5676 } 5677 5678 rc = sqlite3_declare_vtab(db, ZIPFILE_SCHEMA); 5679 if( rc==SQLITE_OK ){ 5680 pNew = (ZipfileTab*)sqlite3_malloc64((sqlite3_int64)nByte+nFile); 5681 if( pNew==0 ) return SQLITE_NOMEM; 5682 memset(pNew, 0, nByte+nFile); 5683 pNew->db = db; 5684 pNew->aBuffer = (u8*)&pNew[1]; 5685 if( zFile ){ 5686 pNew->zFile = (char*)&pNew->aBuffer[ZIPFILE_BUFFER_SIZE]; 5687 memcpy(pNew->zFile, zFile, nFile); 5688 zipfileDequote(pNew->zFile); 5689 } 5690 } 5691 sqlite3_vtab_config(db, SQLITE_VTAB_DIRECTONLY); 5692 *ppVtab = (sqlite3_vtab*)pNew; 5693 return rc; 5694 } 5695 5696 /* 5697 ** Free the ZipfileEntry structure indicated by the only argument. 5698 */ 5699 static void zipfileEntryFree(ZipfileEntry *p){ 5700 if( p ){ 5701 sqlite3_free(p->cds.zFile); 5702 sqlite3_free(p); 5703 } 5704 } 5705 5706 /* 5707 ** Release resources that should be freed at the end of a write 5708 ** transaction. 5709 */ 5710 static void zipfileCleanupTransaction(ZipfileTab *pTab){ 5711 ZipfileEntry *pEntry; 5712 ZipfileEntry *pNext; 5713 5714 if( pTab->pWriteFd ){ 5715 fclose(pTab->pWriteFd); 5716 pTab->pWriteFd = 0; 5717 } 5718 for(pEntry=pTab->pFirstEntry; pEntry; pEntry=pNext){ 5719 pNext = pEntry->pNext; 5720 zipfileEntryFree(pEntry); 5721 } 5722 pTab->pFirstEntry = 0; 5723 pTab->pLastEntry = 0; 5724 pTab->szCurrent = 0; 5725 pTab->szOrig = 0; 5726 } 5727 5728 /* 5729 ** This method is the destructor for zipfile vtab objects. 5730 */ 5731 static int zipfileDisconnect(sqlite3_vtab *pVtab){ 5732 zipfileCleanupTransaction((ZipfileTab*)pVtab); 5733 sqlite3_free(pVtab); 5734 return SQLITE_OK; 5735 } 5736 5737 /* 5738 ** Constructor for a new ZipfileCsr object. 5739 */ 5740 static int zipfileOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCsr){ 5741 ZipfileTab *pTab = (ZipfileTab*)p; 5742 ZipfileCsr *pCsr; 5743 pCsr = sqlite3_malloc(sizeof(*pCsr)); 5744 *ppCsr = (sqlite3_vtab_cursor*)pCsr; 5745 if( pCsr==0 ){ 5746 return SQLITE_NOMEM; 5747 } 5748 memset(pCsr, 0, sizeof(*pCsr)); 5749 pCsr->iId = ++pTab->iNextCsrid; 5750 pCsr->pCsrNext = pTab->pCsrList; 5751 pTab->pCsrList = pCsr; 5752 return SQLITE_OK; 5753 } 5754 5755 /* 5756 ** Reset a cursor back to the state it was in when first returned 5757 ** by zipfileOpen(). 5758 */ 5759 static void zipfileResetCursor(ZipfileCsr *pCsr){ 5760 ZipfileEntry *p; 5761 ZipfileEntry *pNext; 5762 5763 pCsr->bEof = 0; 5764 if( pCsr->pFile ){ 5765 fclose(pCsr->pFile); 5766 pCsr->pFile = 0; 5767 zipfileEntryFree(pCsr->pCurrent); 5768 pCsr->pCurrent = 0; 5769 } 5770 5771 for(p=pCsr->pFreeEntry; p; p=pNext){ 5772 pNext = p->pNext; 5773 zipfileEntryFree(p); 5774 } 5775 } 5776 5777 /* 5778 ** Destructor for an ZipfileCsr. 5779 */ 5780 static int zipfileClose(sqlite3_vtab_cursor *cur){ 5781 ZipfileCsr *pCsr = (ZipfileCsr*)cur; 5782 ZipfileTab *pTab = (ZipfileTab*)(pCsr->base.pVtab); 5783 ZipfileCsr **pp; 5784 zipfileResetCursor(pCsr); 5785 5786 /* Remove this cursor from the ZipfileTab.pCsrList list. */ 5787 for(pp=&pTab->pCsrList; *pp!=pCsr; pp=&((*pp)->pCsrNext)); 5788 *pp = pCsr->pCsrNext; 5789 5790 sqlite3_free(pCsr); 5791 return SQLITE_OK; 5792 } 5793 5794 /* 5795 ** Set the error message for the virtual table associated with cursor 5796 ** pCsr to the results of vprintf(zFmt, ...). 5797 */ 5798 static void zipfileTableErr(ZipfileTab *pTab, const char *zFmt, ...){ 5799 va_list ap; 5800 va_start(ap, zFmt); 5801 sqlite3_free(pTab->base.zErrMsg); 5802 pTab->base.zErrMsg = sqlite3_vmprintf(zFmt, ap); 5803 va_end(ap); 5804 } 5805 static void zipfileCursorErr(ZipfileCsr *pCsr, const char *zFmt, ...){ 5806 va_list ap; 5807 va_start(ap, zFmt); 5808 sqlite3_free(pCsr->base.pVtab->zErrMsg); 5809 pCsr->base.pVtab->zErrMsg = sqlite3_vmprintf(zFmt, ap); 5810 va_end(ap); 5811 } 5812 5813 /* 5814 ** Read nRead bytes of data from offset iOff of file pFile into buffer 5815 ** aRead[]. Return SQLITE_OK if successful, or an SQLite error code 5816 ** otherwise. 5817 ** 5818 ** If an error does occur, output variable (*pzErrmsg) may be set to point 5819 ** to an English language error message. It is the responsibility of the 5820 ** caller to eventually free this buffer using 5821 ** sqlite3_free(). 5822 */ 5823 static int zipfileReadData( 5824 FILE *pFile, /* Read from this file */ 5825 u8 *aRead, /* Read into this buffer */ 5826 int nRead, /* Number of bytes to read */ 5827 i64 iOff, /* Offset to read from */ 5828 char **pzErrmsg /* OUT: Error message (from sqlite3_malloc) */ 5829 ){ 5830 size_t n; 5831 fseek(pFile, (long)iOff, SEEK_SET); 5832 n = fread(aRead, 1, nRead, pFile); 5833 if( (int)n!=nRead ){ 5834 *pzErrmsg = sqlite3_mprintf("error in fread()"); 5835 return SQLITE_ERROR; 5836 } 5837 return SQLITE_OK; 5838 } 5839 5840 static int zipfileAppendData( 5841 ZipfileTab *pTab, 5842 const u8 *aWrite, 5843 int nWrite 5844 ){ 5845 size_t n; 5846 fseek(pTab->pWriteFd, (long)pTab->szCurrent, SEEK_SET); 5847 n = fwrite(aWrite, 1, nWrite, pTab->pWriteFd); 5848 if( (int)n!=nWrite ){ 5849 pTab->base.zErrMsg = sqlite3_mprintf("error in fwrite()"); 5850 return SQLITE_ERROR; 5851 } 5852 pTab->szCurrent += nWrite; 5853 return SQLITE_OK; 5854 } 5855 5856 /* 5857 ** Read and return a 16-bit little-endian unsigned integer from buffer aBuf. 5858 */ 5859 static u16 zipfileGetU16(const u8 *aBuf){ 5860 return (aBuf[1] << 8) + aBuf[0]; 5861 } 5862 5863 /* 5864 ** Read and return a 32-bit little-endian unsigned integer from buffer aBuf. 5865 */ 5866 static u32 zipfileGetU32(const u8 *aBuf){ 5867 return ((u32)(aBuf[3]) << 24) 5868 + ((u32)(aBuf[2]) << 16) 5869 + ((u32)(aBuf[1]) << 8) 5870 + ((u32)(aBuf[0]) << 0); 5871 } 5872 5873 /* 5874 ** Write a 16-bit little endiate integer into buffer aBuf. 5875 */ 5876 static void zipfilePutU16(u8 *aBuf, u16 val){ 5877 aBuf[0] = val & 0xFF; 5878 aBuf[1] = (val>>8) & 0xFF; 5879 } 5880 5881 /* 5882 ** Write a 32-bit little endiate integer into buffer aBuf. 5883 */ 5884 static void zipfilePutU32(u8 *aBuf, u32 val){ 5885 aBuf[0] = val & 0xFF; 5886 aBuf[1] = (val>>8) & 0xFF; 5887 aBuf[2] = (val>>16) & 0xFF; 5888 aBuf[3] = (val>>24) & 0xFF; 5889 } 5890 5891 #define zipfileRead32(aBuf) ( aBuf+=4, zipfileGetU32(aBuf-4) ) 5892 #define zipfileRead16(aBuf) ( aBuf+=2, zipfileGetU16(aBuf-2) ) 5893 5894 #define zipfileWrite32(aBuf,val) { zipfilePutU32(aBuf,val); aBuf+=4; } 5895 #define zipfileWrite16(aBuf,val) { zipfilePutU16(aBuf,val); aBuf+=2; } 5896 5897 /* 5898 ** Magic numbers used to read CDS records. 5899 */ 5900 #define ZIPFILE_CDS_NFILE_OFF 28 5901 #define ZIPFILE_CDS_SZCOMPRESSED_OFF 20 5902 5903 /* 5904 ** Decode the CDS record in buffer aBuf into (*pCDS). Return SQLITE_ERROR 5905 ** if the record is not well-formed, or SQLITE_OK otherwise. 5906 */ 5907 static int zipfileReadCDS(u8 *aBuf, ZipfileCDS *pCDS){ 5908 u8 *aRead = aBuf; 5909 u32 sig = zipfileRead32(aRead); 5910 int rc = SQLITE_OK; 5911 if( sig!=ZIPFILE_SIGNATURE_CDS ){ 5912 rc = SQLITE_ERROR; 5913 }else{ 5914 pCDS->iVersionMadeBy = zipfileRead16(aRead); 5915 pCDS->iVersionExtract = zipfileRead16(aRead); 5916 pCDS->flags = zipfileRead16(aRead); 5917 pCDS->iCompression = zipfileRead16(aRead); 5918 pCDS->mTime = zipfileRead16(aRead); 5919 pCDS->mDate = zipfileRead16(aRead); 5920 pCDS->crc32 = zipfileRead32(aRead); 5921 pCDS->szCompressed = zipfileRead32(aRead); 5922 pCDS->szUncompressed = zipfileRead32(aRead); 5923 assert( aRead==&aBuf[ZIPFILE_CDS_NFILE_OFF] ); 5924 pCDS->nFile = zipfileRead16(aRead); 5925 pCDS->nExtra = zipfileRead16(aRead); 5926 pCDS->nComment = zipfileRead16(aRead); 5927 pCDS->iDiskStart = zipfileRead16(aRead); 5928 pCDS->iInternalAttr = zipfileRead16(aRead); 5929 pCDS->iExternalAttr = zipfileRead32(aRead); 5930 pCDS->iOffset = zipfileRead32(aRead); 5931 assert( aRead==&aBuf[ZIPFILE_CDS_FIXED_SZ] ); 5932 } 5933 5934 return rc; 5935 } 5936 5937 /* 5938 ** Decode the LFH record in buffer aBuf into (*pLFH). Return SQLITE_ERROR 5939 ** if the record is not well-formed, or SQLITE_OK otherwise. 5940 */ 5941 static int zipfileReadLFH( 5942 u8 *aBuffer, 5943 ZipfileLFH *pLFH 5944 ){ 5945 u8 *aRead = aBuffer; 5946 int rc = SQLITE_OK; 5947 5948 u32 sig = zipfileRead32(aRead); 5949 if( sig!=ZIPFILE_SIGNATURE_LFH ){ 5950 rc = SQLITE_ERROR; 5951 }else{ 5952 pLFH->iVersionExtract = zipfileRead16(aRead); 5953 pLFH->flags = zipfileRead16(aRead); 5954 pLFH->iCompression = zipfileRead16(aRead); 5955 pLFH->mTime = zipfileRead16(aRead); 5956 pLFH->mDate = zipfileRead16(aRead); 5957 pLFH->crc32 = zipfileRead32(aRead); 5958 pLFH->szCompressed = zipfileRead32(aRead); 5959 pLFH->szUncompressed = zipfileRead32(aRead); 5960 pLFH->nFile = zipfileRead16(aRead); 5961 pLFH->nExtra = zipfileRead16(aRead); 5962 } 5963 return rc; 5964 } 5965 5966 5967 /* 5968 ** Buffer aExtra (size nExtra bytes) contains zip archive "extra" fields. 5969 ** Scan through this buffer to find an "extra-timestamp" field. If one 5970 ** exists, extract the 32-bit modification-timestamp from it and store 5971 ** the value in output parameter *pmTime. 5972 ** 5973 ** Zero is returned if no extra-timestamp record could be found (and so 5974 ** *pmTime is left unchanged), or non-zero otherwise. 5975 ** 5976 ** The general format of an extra field is: 5977 ** 5978 ** Header ID 2 bytes 5979 ** Data Size 2 bytes 5980 ** Data N bytes 5981 */ 5982 static int zipfileScanExtra(u8 *aExtra, int nExtra, u32 *pmTime){ 5983 int ret = 0; 5984 u8 *p = aExtra; 5985 u8 *pEnd = &aExtra[nExtra]; 5986 5987 while( p<pEnd ){ 5988 u16 id = zipfileRead16(p); 5989 u16 nByte = zipfileRead16(p); 5990 5991 switch( id ){ 5992 case ZIPFILE_EXTRA_TIMESTAMP: { 5993 u8 b = p[0]; 5994 if( b & 0x01 ){ /* 0x01 -> modtime is present */ 5995 *pmTime = zipfileGetU32(&p[1]); 5996 ret = 1; 5997 } 5998 break; 5999 } 6000 } 6001 6002 p += nByte; 6003 } 6004 return ret; 6005 } 6006 6007 /* 6008 ** Convert the standard MS-DOS timestamp stored in the mTime and mDate 6009 ** fields of the CDS structure passed as the only argument to a 32-bit 6010 ** UNIX seconds-since-the-epoch timestamp. Return the result. 6011 ** 6012 ** "Standard" MS-DOS time format: 6013 ** 6014 ** File modification time: 6015 ** Bits 00-04: seconds divided by 2 6016 ** Bits 05-10: minute 6017 ** Bits 11-15: hour 6018 ** File modification date: 6019 ** Bits 00-04: day 6020 ** Bits 05-08: month (1-12) 6021 ** Bits 09-15: years from 1980 6022 ** 6023 ** https://msdn.microsoft.com/en-us/library/9kkf9tah.aspx 6024 */ 6025 static u32 zipfileMtime(ZipfileCDS *pCDS){ 6026 int Y = (1980 + ((pCDS->mDate >> 9) & 0x7F)); 6027 int M = ((pCDS->mDate >> 5) & 0x0F); 6028 int D = (pCDS->mDate & 0x1F); 6029 int B = -13; 6030 6031 int sec = (pCDS->mTime & 0x1F)*2; 6032 int min = (pCDS->mTime >> 5) & 0x3F; 6033 int hr = (pCDS->mTime >> 11) & 0x1F; 6034 i64 JD; 6035 6036 /* JD = INT(365.25 * (Y+4716)) + INT(30.6001 * (M+1)) + D + B - 1524.5 */ 6037 6038 /* Calculate the JD in seconds for noon on the day in question */ 6039 if( M<3 ){ 6040 Y = Y-1; 6041 M = M+12; 6042 } 6043 JD = (i64)(24*60*60) * ( 6044 (int)(365.25 * (Y + 4716)) 6045 + (int)(30.6001 * (M + 1)) 6046 + D + B - 1524 6047 ); 6048 6049 /* Correct the JD for the time within the day */ 6050 JD += (hr-12) * 3600 + min * 60 + sec; 6051 6052 /* Convert JD to unix timestamp (the JD epoch is 2440587.5) */ 6053 return (u32)(JD - (i64)(24405875) * 24*60*6); 6054 } 6055 6056 /* 6057 ** The opposite of zipfileMtime(). This function populates the mTime and 6058 ** mDate fields of the CDS structure passed as the first argument according 6059 ** to the UNIX timestamp value passed as the second. 6060 */ 6061 static void zipfileMtimeToDos(ZipfileCDS *pCds, u32 mUnixTime){ 6062 /* Convert unix timestamp to JD (2440588 is noon on 1/1/1970) */ 6063 i64 JD = (i64)2440588 + mUnixTime / (24*60*60); 6064 6065 int A, B, C, D, E; 6066 int yr, mon, day; 6067 int hr, min, sec; 6068 6069 A = (int)((JD - 1867216.25)/36524.25); 6070 A = (int)(JD + 1 + A - (A/4)); 6071 B = A + 1524; 6072 C = (int)((B - 122.1)/365.25); 6073 D = (36525*(C&32767))/100; 6074 E = (int)((B-D)/30.6001); 6075 6076 day = B - D - (int)(30.6001*E); 6077 mon = (E<14 ? E-1 : E-13); 6078 yr = mon>2 ? C-4716 : C-4715; 6079 6080 hr = (mUnixTime % (24*60*60)) / (60*60); 6081 min = (mUnixTime % (60*60)) / 60; 6082 sec = (mUnixTime % 60); 6083 6084 if( yr>=1980 ){ 6085 pCds->mDate = (u16)(day + (mon << 5) + ((yr-1980) << 9)); 6086 pCds->mTime = (u16)(sec/2 + (min<<5) + (hr<<11)); 6087 }else{ 6088 pCds->mDate = pCds->mTime = 0; 6089 } 6090 6091 assert( mUnixTime<315507600 6092 || mUnixTime==zipfileMtime(pCds) 6093 || ((mUnixTime % 2) && mUnixTime-1==zipfileMtime(pCds)) 6094 /* || (mUnixTime % 2) */ 6095 ); 6096 } 6097 6098 /* 6099 ** If aBlob is not NULL, then it is a pointer to a buffer (nBlob bytes in 6100 ** size) containing an entire zip archive image. Or, if aBlob is NULL, 6101 ** then pFile is a file-handle open on a zip file. In either case, this 6102 ** function creates a ZipfileEntry object based on the zip archive entry 6103 ** for which the CDS record is at offset iOff. 6104 ** 6105 ** If successful, SQLITE_OK is returned and (*ppEntry) set to point to 6106 ** the new object. Otherwise, an SQLite error code is returned and the 6107 ** final value of (*ppEntry) undefined. 6108 */ 6109 static int zipfileGetEntry( 6110 ZipfileTab *pTab, /* Store any error message here */ 6111 const u8 *aBlob, /* Pointer to in-memory file image */ 6112 int nBlob, /* Size of aBlob[] in bytes */ 6113 FILE *pFile, /* If aBlob==0, read from this file */ 6114 i64 iOff, /* Offset of CDS record */ 6115 ZipfileEntry **ppEntry /* OUT: Pointer to new object */ 6116 ){ 6117 u8 *aRead; 6118 char **pzErr = &pTab->base.zErrMsg; 6119 int rc = SQLITE_OK; 6120 6121 if( aBlob==0 ){ 6122 aRead = pTab->aBuffer; 6123 rc = zipfileReadData(pFile, aRead, ZIPFILE_CDS_FIXED_SZ, iOff, pzErr); 6124 }else{ 6125 aRead = (u8*)&aBlob[iOff]; 6126 } 6127 6128 if( rc==SQLITE_OK ){ 6129 sqlite3_int64 nAlloc; 6130 ZipfileEntry *pNew; 6131 6132 int nFile = zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF]); 6133 int nExtra = zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF+2]); 6134 nExtra += zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF+4]); 6135 6136 nAlloc = sizeof(ZipfileEntry) + nExtra; 6137 if( aBlob ){ 6138 nAlloc += zipfileGetU32(&aRead[ZIPFILE_CDS_SZCOMPRESSED_OFF]); 6139 } 6140 6141 pNew = (ZipfileEntry*)sqlite3_malloc64(nAlloc); 6142 if( pNew==0 ){ 6143 rc = SQLITE_NOMEM; 6144 }else{ 6145 memset(pNew, 0, sizeof(ZipfileEntry)); 6146 rc = zipfileReadCDS(aRead, &pNew->cds); 6147 if( rc!=SQLITE_OK ){ 6148 *pzErr = sqlite3_mprintf("failed to read CDS at offset %lld", iOff); 6149 }else if( aBlob==0 ){ 6150 rc = zipfileReadData( 6151 pFile, aRead, nExtra+nFile, iOff+ZIPFILE_CDS_FIXED_SZ, pzErr 6152 ); 6153 }else{ 6154 aRead = (u8*)&aBlob[iOff + ZIPFILE_CDS_FIXED_SZ]; 6155 } 6156 } 6157 6158 if( rc==SQLITE_OK ){ 6159 u32 *pt = &pNew->mUnixTime; 6160 pNew->cds.zFile = sqlite3_mprintf("%.*s", nFile, aRead); 6161 pNew->aExtra = (u8*)&pNew[1]; 6162 memcpy(pNew->aExtra, &aRead[nFile], nExtra); 6163 if( pNew->cds.zFile==0 ){ 6164 rc = SQLITE_NOMEM; 6165 }else if( 0==zipfileScanExtra(&aRead[nFile], pNew->cds.nExtra, pt) ){ 6166 pNew->mUnixTime = zipfileMtime(&pNew->cds); 6167 } 6168 } 6169 6170 if( rc==SQLITE_OK ){ 6171 static const int szFix = ZIPFILE_LFH_FIXED_SZ; 6172 ZipfileLFH lfh; 6173 if( pFile ){ 6174 rc = zipfileReadData(pFile, aRead, szFix, pNew->cds.iOffset, pzErr); 6175 }else{ 6176 aRead = (u8*)&aBlob[pNew->cds.iOffset]; 6177 } 6178 6179 rc = zipfileReadLFH(aRead, &lfh); 6180 if( rc==SQLITE_OK ){ 6181 pNew->iDataOff = pNew->cds.iOffset + ZIPFILE_LFH_FIXED_SZ; 6182 pNew->iDataOff += lfh.nFile + lfh.nExtra; 6183 if( aBlob && pNew->cds.szCompressed ){ 6184 pNew->aData = &pNew->aExtra[nExtra]; 6185 memcpy(pNew->aData, &aBlob[pNew->iDataOff], pNew->cds.szCompressed); 6186 } 6187 }else{ 6188 *pzErr = sqlite3_mprintf("failed to read LFH at offset %d", 6189 (int)pNew->cds.iOffset 6190 ); 6191 } 6192 } 6193 6194 if( rc!=SQLITE_OK ){ 6195 zipfileEntryFree(pNew); 6196 }else{ 6197 *ppEntry = pNew; 6198 } 6199 } 6200 6201 return rc; 6202 } 6203 6204 /* 6205 ** Advance an ZipfileCsr to its next row of output. 6206 */ 6207 static int zipfileNext(sqlite3_vtab_cursor *cur){ 6208 ZipfileCsr *pCsr = (ZipfileCsr*)cur; 6209 int rc = SQLITE_OK; 6210 6211 if( pCsr->pFile ){ 6212 i64 iEof = pCsr->eocd.iOffset + pCsr->eocd.nSize; 6213 zipfileEntryFree(pCsr->pCurrent); 6214 pCsr->pCurrent = 0; 6215 if( pCsr->iNextOff>=iEof ){ 6216 pCsr->bEof = 1; 6217 }else{ 6218 ZipfileEntry *p = 0; 6219 ZipfileTab *pTab = (ZipfileTab*)(cur->pVtab); 6220 rc = zipfileGetEntry(pTab, 0, 0, pCsr->pFile, pCsr->iNextOff, &p); 6221 if( rc==SQLITE_OK ){ 6222 pCsr->iNextOff += ZIPFILE_CDS_FIXED_SZ; 6223 pCsr->iNextOff += (int)p->cds.nExtra + p->cds.nFile + p->cds.nComment; 6224 } 6225 pCsr->pCurrent = p; 6226 } 6227 }else{ 6228 if( !pCsr->bNoop ){ 6229 pCsr->pCurrent = pCsr->pCurrent->pNext; 6230 } 6231 if( pCsr->pCurrent==0 ){ 6232 pCsr->bEof = 1; 6233 } 6234 } 6235 6236 pCsr->bNoop = 0; 6237 return rc; 6238 } 6239 6240 static void zipfileFree(void *p) { 6241 sqlite3_free(p); 6242 } 6243 6244 /* 6245 ** Buffer aIn (size nIn bytes) contains compressed data. Uncompressed, the 6246 ** size is nOut bytes. This function uncompresses the data and sets the 6247 ** return value in context pCtx to the result (a blob). 6248 ** 6249 ** If an error occurs, an error code is left in pCtx instead. 6250 */ 6251 static void zipfileInflate( 6252 sqlite3_context *pCtx, /* Store result here */ 6253 const u8 *aIn, /* Compressed data */ 6254 int nIn, /* Size of buffer aIn[] in bytes */ 6255 int nOut /* Expected output size */ 6256 ){ 6257 u8 *aRes = sqlite3_malloc(nOut); 6258 if( aRes==0 ){ 6259 sqlite3_result_error_nomem(pCtx); 6260 }else{ 6261 int err; 6262 z_stream str; 6263 memset(&str, 0, sizeof(str)); 6264 6265 str.next_in = (Byte*)aIn; 6266 str.avail_in = nIn; 6267 str.next_out = (Byte*)aRes; 6268 str.avail_out = nOut; 6269 6270 err = inflateInit2(&str, -15); 6271 if( err!=Z_OK ){ 6272 zipfileCtxErrorMsg(pCtx, "inflateInit2() failed (%d)", err); 6273 }else{ 6274 err = inflate(&str, Z_NO_FLUSH); 6275 if( err!=Z_STREAM_END ){ 6276 zipfileCtxErrorMsg(pCtx, "inflate() failed (%d)", err); 6277 }else{ 6278 sqlite3_result_blob(pCtx, aRes, nOut, zipfileFree); 6279 aRes = 0; 6280 } 6281 } 6282 sqlite3_free(aRes); 6283 inflateEnd(&str); 6284 } 6285 } 6286 6287 /* 6288 ** Buffer aIn (size nIn bytes) contains uncompressed data. This function 6289 ** compresses it and sets (*ppOut) to point to a buffer containing the 6290 ** compressed data. The caller is responsible for eventually calling 6291 ** sqlite3_free() to release buffer (*ppOut). Before returning, (*pnOut) 6292 ** is set to the size of buffer (*ppOut) in bytes. 6293 ** 6294 ** If no error occurs, SQLITE_OK is returned. Otherwise, an SQLite error 6295 ** code is returned and an error message left in virtual-table handle 6296 ** pTab. The values of (*ppOut) and (*pnOut) are left unchanged in this 6297 ** case. 6298 */ 6299 static int zipfileDeflate( 6300 const u8 *aIn, int nIn, /* Input */ 6301 u8 **ppOut, int *pnOut, /* Output */ 6302 char **pzErr /* OUT: Error message */ 6303 ){ 6304 int rc = SQLITE_OK; 6305 sqlite3_int64 nAlloc; 6306 z_stream str; 6307 u8 *aOut; 6308 6309 memset(&str, 0, sizeof(str)); 6310 str.next_in = (Bytef*)aIn; 6311 str.avail_in = nIn; 6312 deflateInit2(&str, 9, Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY); 6313 6314 nAlloc = deflateBound(&str, nIn); 6315 aOut = (u8*)sqlite3_malloc64(nAlloc); 6316 if( aOut==0 ){ 6317 rc = SQLITE_NOMEM; 6318 }else{ 6319 int res; 6320 str.next_out = aOut; 6321 str.avail_out = nAlloc; 6322 res = deflate(&str, Z_FINISH); 6323 if( res==Z_STREAM_END ){ 6324 *ppOut = aOut; 6325 *pnOut = (int)str.total_out; 6326 }else{ 6327 sqlite3_free(aOut); 6328 *pzErr = sqlite3_mprintf("zipfile: deflate() error"); 6329 rc = SQLITE_ERROR; 6330 } 6331 deflateEnd(&str); 6332 } 6333 6334 return rc; 6335 } 6336 6337 6338 /* 6339 ** Return values of columns for the row at which the series_cursor 6340 ** is currently pointing. 6341 */ 6342 static int zipfileColumn( 6343 sqlite3_vtab_cursor *cur, /* The cursor */ 6344 sqlite3_context *ctx, /* First argument to sqlite3_result_...() */ 6345 int i /* Which column to return */ 6346 ){ 6347 ZipfileCsr *pCsr = (ZipfileCsr*)cur; 6348 ZipfileCDS *pCDS = &pCsr->pCurrent->cds; 6349 int rc = SQLITE_OK; 6350 switch( i ){ 6351 case 0: /* name */ 6352 sqlite3_result_text(ctx, pCDS->zFile, -1, SQLITE_TRANSIENT); 6353 break; 6354 case 1: /* mode */ 6355 /* TODO: Whether or not the following is correct surely depends on 6356 ** the platform on which the archive was created. */ 6357 sqlite3_result_int(ctx, pCDS->iExternalAttr >> 16); 6358 break; 6359 case 2: { /* mtime */ 6360 sqlite3_result_int64(ctx, pCsr->pCurrent->mUnixTime); 6361 break; 6362 } 6363 case 3: { /* sz */ 6364 if( sqlite3_vtab_nochange(ctx)==0 ){ 6365 sqlite3_result_int64(ctx, pCDS->szUncompressed); 6366 } 6367 break; 6368 } 6369 case 4: /* rawdata */ 6370 if( sqlite3_vtab_nochange(ctx) ) break; 6371 case 5: { /* data */ 6372 if( i==4 || pCDS->iCompression==0 || pCDS->iCompression==8 ){ 6373 int sz = pCDS->szCompressed; 6374 int szFinal = pCDS->szUncompressed; 6375 if( szFinal>0 ){ 6376 u8 *aBuf; 6377 u8 *aFree = 0; 6378 if( pCsr->pCurrent->aData ){ 6379 aBuf = pCsr->pCurrent->aData; 6380 }else{ 6381 aBuf = aFree = sqlite3_malloc64(sz); 6382 if( aBuf==0 ){ 6383 rc = SQLITE_NOMEM; 6384 }else{ 6385 FILE *pFile = pCsr->pFile; 6386 if( pFile==0 ){ 6387 pFile = ((ZipfileTab*)(pCsr->base.pVtab))->pWriteFd; 6388 } 6389 rc = zipfileReadData(pFile, aBuf, sz, pCsr->pCurrent->iDataOff, 6390 &pCsr->base.pVtab->zErrMsg 6391 ); 6392 } 6393 } 6394 if( rc==SQLITE_OK ){ 6395 if( i==5 && pCDS->iCompression ){ 6396 zipfileInflate(ctx, aBuf, sz, szFinal); 6397 }else{ 6398 sqlite3_result_blob(ctx, aBuf, sz, SQLITE_TRANSIENT); 6399 } 6400 } 6401 sqlite3_free(aFree); 6402 }else{ 6403 /* Figure out if this is a directory or a zero-sized file. Consider 6404 ** it to be a directory either if the mode suggests so, or if 6405 ** the final character in the name is '/'. */ 6406 u32 mode = pCDS->iExternalAttr >> 16; 6407 if( !(mode & S_IFDIR) && pCDS->zFile[pCDS->nFile-1]!='/' ){ 6408 sqlite3_result_blob(ctx, "", 0, SQLITE_STATIC); 6409 } 6410 } 6411 } 6412 break; 6413 } 6414 case 6: /* method */ 6415 sqlite3_result_int(ctx, pCDS->iCompression); 6416 break; 6417 default: /* z */ 6418 assert( i==7 ); 6419 sqlite3_result_int64(ctx, pCsr->iId); 6420 break; 6421 } 6422 6423 return rc; 6424 } 6425 6426 /* 6427 ** Return TRUE if the cursor is at EOF. 6428 */ 6429 static int zipfileEof(sqlite3_vtab_cursor *cur){ 6430 ZipfileCsr *pCsr = (ZipfileCsr*)cur; 6431 return pCsr->bEof; 6432 } 6433 6434 /* 6435 ** If aBlob is not NULL, then it points to a buffer nBlob bytes in size 6436 ** containing an entire zip archive image. Or, if aBlob is NULL, then pFile 6437 ** is guaranteed to be a file-handle open on a zip file. 6438 ** 6439 ** This function attempts to locate the EOCD record within the zip archive 6440 ** and populate *pEOCD with the results of decoding it. SQLITE_OK is 6441 ** returned if successful. Otherwise, an SQLite error code is returned and 6442 ** an English language error message may be left in virtual-table pTab. 6443 */ 6444 static int zipfileReadEOCD( 6445 ZipfileTab *pTab, /* Return errors here */ 6446 const u8 *aBlob, /* Pointer to in-memory file image */ 6447 int nBlob, /* Size of aBlob[] in bytes */ 6448 FILE *pFile, /* Read from this file if aBlob==0 */ 6449 ZipfileEOCD *pEOCD /* Object to populate */ 6450 ){ 6451 u8 *aRead = pTab->aBuffer; /* Temporary buffer */ 6452 int nRead; /* Bytes to read from file */ 6453 int rc = SQLITE_OK; 6454 6455 if( aBlob==0 ){ 6456 i64 iOff; /* Offset to read from */ 6457 i64 szFile; /* Total size of file in bytes */ 6458 fseek(pFile, 0, SEEK_END); 6459 szFile = (i64)ftell(pFile); 6460 if( szFile==0 ){ 6461 memset(pEOCD, 0, sizeof(ZipfileEOCD)); 6462 return SQLITE_OK; 6463 } 6464 nRead = (int)(MIN(szFile, ZIPFILE_BUFFER_SIZE)); 6465 iOff = szFile - nRead; 6466 rc = zipfileReadData(pFile, aRead, nRead, iOff, &pTab->base.zErrMsg); 6467 }else{ 6468 nRead = (int)(MIN(nBlob, ZIPFILE_BUFFER_SIZE)); 6469 aRead = (u8*)&aBlob[nBlob-nRead]; 6470 } 6471 6472 if( rc==SQLITE_OK ){ 6473 int i; 6474 6475 /* Scan backwards looking for the signature bytes */ 6476 for(i=nRead-20; i>=0; i--){ 6477 if( aRead[i]==0x50 && aRead[i+1]==0x4b 6478 && aRead[i+2]==0x05 && aRead[i+3]==0x06 6479 ){ 6480 break; 6481 } 6482 } 6483 if( i<0 ){ 6484 pTab->base.zErrMsg = sqlite3_mprintf( 6485 "cannot find end of central directory record" 6486 ); 6487 return SQLITE_ERROR; 6488 } 6489 6490 aRead += i+4; 6491 pEOCD->iDisk = zipfileRead16(aRead); 6492 pEOCD->iFirstDisk = zipfileRead16(aRead); 6493 pEOCD->nEntry = zipfileRead16(aRead); 6494 pEOCD->nEntryTotal = zipfileRead16(aRead); 6495 pEOCD->nSize = zipfileRead32(aRead); 6496 pEOCD->iOffset = zipfileRead32(aRead); 6497 } 6498 6499 return rc; 6500 } 6501 6502 /* 6503 ** Add object pNew to the linked list that begins at ZipfileTab.pFirstEntry 6504 ** and ends with pLastEntry. If argument pBefore is NULL, then pNew is added 6505 ** to the end of the list. Otherwise, it is added to the list immediately 6506 ** before pBefore (which is guaranteed to be a part of said list). 6507 */ 6508 static void zipfileAddEntry( 6509 ZipfileTab *pTab, 6510 ZipfileEntry *pBefore, 6511 ZipfileEntry *pNew 6512 ){ 6513 assert( (pTab->pFirstEntry==0)==(pTab->pLastEntry==0) ); 6514 assert( pNew->pNext==0 ); 6515 if( pBefore==0 ){ 6516 if( pTab->pFirstEntry==0 ){ 6517 pTab->pFirstEntry = pTab->pLastEntry = pNew; 6518 }else{ 6519 assert( pTab->pLastEntry->pNext==0 ); 6520 pTab->pLastEntry->pNext = pNew; 6521 pTab->pLastEntry = pNew; 6522 } 6523 }else{ 6524 ZipfileEntry **pp; 6525 for(pp=&pTab->pFirstEntry; *pp!=pBefore; pp=&((*pp)->pNext)); 6526 pNew->pNext = pBefore; 6527 *pp = pNew; 6528 } 6529 } 6530 6531 static int zipfileLoadDirectory(ZipfileTab *pTab, const u8 *aBlob, int nBlob){ 6532 ZipfileEOCD eocd; 6533 int rc; 6534 int i; 6535 i64 iOff; 6536 6537 rc = zipfileReadEOCD(pTab, aBlob, nBlob, pTab->pWriteFd, &eocd); 6538 iOff = eocd.iOffset; 6539 for(i=0; rc==SQLITE_OK && i<eocd.nEntry; i++){ 6540 ZipfileEntry *pNew = 0; 6541 rc = zipfileGetEntry(pTab, aBlob, nBlob, pTab->pWriteFd, iOff, &pNew); 6542 6543 if( rc==SQLITE_OK ){ 6544 zipfileAddEntry(pTab, 0, pNew); 6545 iOff += ZIPFILE_CDS_FIXED_SZ; 6546 iOff += (int)pNew->cds.nExtra + pNew->cds.nFile + pNew->cds.nComment; 6547 } 6548 } 6549 return rc; 6550 } 6551 6552 /* 6553 ** xFilter callback. 6554 */ 6555 static int zipfileFilter( 6556 sqlite3_vtab_cursor *cur, 6557 int idxNum, const char *idxStr, 6558 int argc, sqlite3_value **argv 6559 ){ 6560 ZipfileTab *pTab = (ZipfileTab*)cur->pVtab; 6561 ZipfileCsr *pCsr = (ZipfileCsr*)cur; 6562 const char *zFile = 0; /* Zip file to scan */ 6563 int rc = SQLITE_OK; /* Return Code */ 6564 int bInMemory = 0; /* True for an in-memory zipfile */ 6565 6566 zipfileResetCursor(pCsr); 6567 6568 if( pTab->zFile ){ 6569 zFile = pTab->zFile; 6570 }else if( idxNum==0 ){ 6571 zipfileCursorErr(pCsr, "zipfile() function requires an argument"); 6572 return SQLITE_ERROR; 6573 }else if( sqlite3_value_type(argv[0])==SQLITE_BLOB ){ 6574 const u8 *aBlob = (const u8*)sqlite3_value_blob(argv[0]); 6575 int nBlob = sqlite3_value_bytes(argv[0]); 6576 assert( pTab->pFirstEntry==0 ); 6577 rc = zipfileLoadDirectory(pTab, aBlob, nBlob); 6578 pCsr->pFreeEntry = pTab->pFirstEntry; 6579 pTab->pFirstEntry = pTab->pLastEntry = 0; 6580 if( rc!=SQLITE_OK ) return rc; 6581 bInMemory = 1; 6582 }else{ 6583 zFile = (const char*)sqlite3_value_text(argv[0]); 6584 } 6585 6586 if( 0==pTab->pWriteFd && 0==bInMemory ){ 6587 pCsr->pFile = fopen(zFile, "rb"); 6588 if( pCsr->pFile==0 ){ 6589 zipfileCursorErr(pCsr, "cannot open file: %s", zFile); 6590 rc = SQLITE_ERROR; 6591 }else{ 6592 rc = zipfileReadEOCD(pTab, 0, 0, pCsr->pFile, &pCsr->eocd); 6593 if( rc==SQLITE_OK ){ 6594 if( pCsr->eocd.nEntry==0 ){ 6595 pCsr->bEof = 1; 6596 }else{ 6597 pCsr->iNextOff = pCsr->eocd.iOffset; 6598 rc = zipfileNext(cur); 6599 } 6600 } 6601 } 6602 }else{ 6603 pCsr->bNoop = 1; 6604 pCsr->pCurrent = pCsr->pFreeEntry ? pCsr->pFreeEntry : pTab->pFirstEntry; 6605 rc = zipfileNext(cur); 6606 } 6607 6608 return rc; 6609 } 6610 6611 /* 6612 ** xBestIndex callback. 6613 */ 6614 static int zipfileBestIndex( 6615 sqlite3_vtab *tab, 6616 sqlite3_index_info *pIdxInfo 6617 ){ 6618 int i; 6619 int idx = -1; 6620 int unusable = 0; 6621 6622 for(i=0; i<pIdxInfo->nConstraint; i++){ 6623 const struct sqlite3_index_constraint *pCons = &pIdxInfo->aConstraint[i]; 6624 if( pCons->iColumn!=ZIPFILE_F_COLUMN_IDX ) continue; 6625 if( pCons->usable==0 ){ 6626 unusable = 1; 6627 }else if( pCons->op==SQLITE_INDEX_CONSTRAINT_EQ ){ 6628 idx = i; 6629 } 6630 } 6631 pIdxInfo->estimatedCost = 1000.0; 6632 if( idx>=0 ){ 6633 pIdxInfo->aConstraintUsage[idx].argvIndex = 1; 6634 pIdxInfo->aConstraintUsage[idx].omit = 1; 6635 pIdxInfo->idxNum = 1; 6636 }else if( unusable ){ 6637 return SQLITE_CONSTRAINT; 6638 } 6639 return SQLITE_OK; 6640 } 6641 6642 static ZipfileEntry *zipfileNewEntry(const char *zPath){ 6643 ZipfileEntry *pNew; 6644 pNew = sqlite3_malloc(sizeof(ZipfileEntry)); 6645 if( pNew ){ 6646 memset(pNew, 0, sizeof(ZipfileEntry)); 6647 pNew->cds.zFile = sqlite3_mprintf("%s", zPath); 6648 if( pNew->cds.zFile==0 ){ 6649 sqlite3_free(pNew); 6650 pNew = 0; 6651 } 6652 } 6653 return pNew; 6654 } 6655 6656 static int zipfileSerializeLFH(ZipfileEntry *pEntry, u8 *aBuf){ 6657 ZipfileCDS *pCds = &pEntry->cds; 6658 u8 *a = aBuf; 6659 6660 pCds->nExtra = 9; 6661 6662 /* Write the LFH itself */ 6663 zipfileWrite32(a, ZIPFILE_SIGNATURE_LFH); 6664 zipfileWrite16(a, pCds->iVersionExtract); 6665 zipfileWrite16(a, pCds->flags); 6666 zipfileWrite16(a, pCds->iCompression); 6667 zipfileWrite16(a, pCds->mTime); 6668 zipfileWrite16(a, pCds->mDate); 6669 zipfileWrite32(a, pCds->crc32); 6670 zipfileWrite32(a, pCds->szCompressed); 6671 zipfileWrite32(a, pCds->szUncompressed); 6672 zipfileWrite16(a, (u16)pCds->nFile); 6673 zipfileWrite16(a, pCds->nExtra); 6674 assert( a==&aBuf[ZIPFILE_LFH_FIXED_SZ] ); 6675 6676 /* Add the file name */ 6677 memcpy(a, pCds->zFile, (int)pCds->nFile); 6678 a += (int)pCds->nFile; 6679 6680 /* The "extra" data */ 6681 zipfileWrite16(a, ZIPFILE_EXTRA_TIMESTAMP); 6682 zipfileWrite16(a, 5); 6683 *a++ = 0x01; 6684 zipfileWrite32(a, pEntry->mUnixTime); 6685 6686 return a-aBuf; 6687 } 6688 6689 static int zipfileAppendEntry( 6690 ZipfileTab *pTab, 6691 ZipfileEntry *pEntry, 6692 const u8 *pData, 6693 int nData 6694 ){ 6695 u8 *aBuf = pTab->aBuffer; 6696 int nBuf; 6697 int rc; 6698 6699 nBuf = zipfileSerializeLFH(pEntry, aBuf); 6700 rc = zipfileAppendData(pTab, aBuf, nBuf); 6701 if( rc==SQLITE_OK ){ 6702 pEntry->iDataOff = pTab->szCurrent; 6703 rc = zipfileAppendData(pTab, pData, nData); 6704 } 6705 6706 return rc; 6707 } 6708 6709 static int zipfileGetMode( 6710 sqlite3_value *pVal, 6711 int bIsDir, /* If true, default to directory */ 6712 u32 *pMode, /* OUT: Mode value */ 6713 char **pzErr /* OUT: Error message */ 6714 ){ 6715 const char *z = (const char*)sqlite3_value_text(pVal); 6716 u32 mode = 0; 6717 if( z==0 ){ 6718 mode = (bIsDir ? (S_IFDIR + 0755) : (S_IFREG + 0644)); 6719 }else if( z[0]>='0' && z[0]<='9' ){ 6720 mode = (unsigned int)sqlite3_value_int(pVal); 6721 }else{ 6722 const char zTemplate[11] = "-rwxrwxrwx"; 6723 int i; 6724 if( strlen(z)!=10 ) goto parse_error; 6725 switch( z[0] ){ 6726 case '-': mode |= S_IFREG; break; 6727 case 'd': mode |= S_IFDIR; break; 6728 case 'l': mode |= S_IFLNK; break; 6729 default: goto parse_error; 6730 } 6731 for(i=1; i<10; i++){ 6732 if( z[i]==zTemplate[i] ) mode |= 1 << (9-i); 6733 else if( z[i]!='-' ) goto parse_error; 6734 } 6735 } 6736 if( ((mode & S_IFDIR)==0)==bIsDir ){ 6737 /* The "mode" attribute is a directory, but data has been specified. 6738 ** Or vice-versa - no data but "mode" is a file or symlink. */ 6739 *pzErr = sqlite3_mprintf("zipfile: mode does not match data"); 6740 return SQLITE_CONSTRAINT; 6741 } 6742 *pMode = mode; 6743 return SQLITE_OK; 6744 6745 parse_error: 6746 *pzErr = sqlite3_mprintf("zipfile: parse error in mode: %s", z); 6747 return SQLITE_ERROR; 6748 } 6749 6750 /* 6751 ** Both (const char*) arguments point to nul-terminated strings. Argument 6752 ** nB is the value of strlen(zB). This function returns 0 if the strings are 6753 ** identical, ignoring any trailing '/' character in either path. */ 6754 static int zipfileComparePath(const char *zA, const char *zB, int nB){ 6755 int nA = (int)strlen(zA); 6756 if( nA>0 && zA[nA-1]=='/' ) nA--; 6757 if( nB>0 && zB[nB-1]=='/' ) nB--; 6758 if( nA==nB && memcmp(zA, zB, nA)==0 ) return 0; 6759 return 1; 6760 } 6761 6762 static int zipfileBegin(sqlite3_vtab *pVtab){ 6763 ZipfileTab *pTab = (ZipfileTab*)pVtab; 6764 int rc = SQLITE_OK; 6765 6766 assert( pTab->pWriteFd==0 ); 6767 if( pTab->zFile==0 || pTab->zFile[0]==0 ){ 6768 pTab->base.zErrMsg = sqlite3_mprintf("zipfile: missing filename"); 6769 return SQLITE_ERROR; 6770 } 6771 6772 /* Open a write fd on the file. Also load the entire central directory 6773 ** structure into memory. During the transaction any new file data is 6774 ** appended to the archive file, but the central directory is accumulated 6775 ** in main-memory until the transaction is committed. */ 6776 pTab->pWriteFd = fopen(pTab->zFile, "ab+"); 6777 if( pTab->pWriteFd==0 ){ 6778 pTab->base.zErrMsg = sqlite3_mprintf( 6779 "zipfile: failed to open file %s for writing", pTab->zFile 6780 ); 6781 rc = SQLITE_ERROR; 6782 }else{ 6783 fseek(pTab->pWriteFd, 0, SEEK_END); 6784 pTab->szCurrent = pTab->szOrig = (i64)ftell(pTab->pWriteFd); 6785 rc = zipfileLoadDirectory(pTab, 0, 0); 6786 } 6787 6788 if( rc!=SQLITE_OK ){ 6789 zipfileCleanupTransaction(pTab); 6790 } 6791 6792 return rc; 6793 } 6794 6795 /* 6796 ** Return the current time as a 32-bit timestamp in UNIX epoch format (like 6797 ** time(2)). 6798 */ 6799 static u32 zipfileTime(void){ 6800 sqlite3_vfs *pVfs = sqlite3_vfs_find(0); 6801 u32 ret; 6802 if( pVfs->iVersion>=2 && pVfs->xCurrentTimeInt64 ){ 6803 i64 ms; 6804 pVfs->xCurrentTimeInt64(pVfs, &ms); 6805 ret = (u32)((ms/1000) - ((i64)24405875 * 8640)); 6806 }else{ 6807 double day; 6808 pVfs->xCurrentTime(pVfs, &day); 6809 ret = (u32)((day - 2440587.5) * 86400); 6810 } 6811 return ret; 6812 } 6813 6814 /* 6815 ** Return a 32-bit timestamp in UNIX epoch format. 6816 ** 6817 ** If the value passed as the only argument is either NULL or an SQL NULL, 6818 ** return the current time. Otherwise, return the value stored in (*pVal) 6819 ** cast to a 32-bit unsigned integer. 6820 */ 6821 static u32 zipfileGetTime(sqlite3_value *pVal){ 6822 if( pVal==0 || sqlite3_value_type(pVal)==SQLITE_NULL ){ 6823 return zipfileTime(); 6824 } 6825 return (u32)sqlite3_value_int64(pVal); 6826 } 6827 6828 /* 6829 ** Unless it is NULL, entry pOld is currently part of the pTab->pFirstEntry 6830 ** linked list. Remove it from the list and free the object. 6831 */ 6832 static void zipfileRemoveEntryFromList(ZipfileTab *pTab, ZipfileEntry *pOld){ 6833 if( pOld ){ 6834 ZipfileEntry **pp; 6835 for(pp=&pTab->pFirstEntry; (*pp)!=pOld; pp=&((*pp)->pNext)); 6836 *pp = (*pp)->pNext; 6837 zipfileEntryFree(pOld); 6838 } 6839 } 6840 6841 /* 6842 ** xUpdate method. 6843 */ 6844 static int zipfileUpdate( 6845 sqlite3_vtab *pVtab, 6846 int nVal, 6847 sqlite3_value **apVal, 6848 sqlite_int64 *pRowid 6849 ){ 6850 ZipfileTab *pTab = (ZipfileTab*)pVtab; 6851 int rc = SQLITE_OK; /* Return Code */ 6852 ZipfileEntry *pNew = 0; /* New in-memory CDS entry */ 6853 6854 u32 mode = 0; /* Mode for new entry */ 6855 u32 mTime = 0; /* Modification time for new entry */ 6856 i64 sz = 0; /* Uncompressed size */ 6857 const char *zPath = 0; /* Path for new entry */ 6858 int nPath = 0; /* strlen(zPath) */ 6859 const u8 *pData = 0; /* Pointer to buffer containing content */ 6860 int nData = 0; /* Size of pData buffer in bytes */ 6861 int iMethod = 0; /* Compression method for new entry */ 6862 u8 *pFree = 0; /* Free this */ 6863 char *zFree = 0; /* Also free this */ 6864 ZipfileEntry *pOld = 0; 6865 ZipfileEntry *pOld2 = 0; 6866 int bUpdate = 0; /* True for an update that modifies "name" */ 6867 int bIsDir = 0; 6868 u32 iCrc32 = 0; 6869 6870 if( pTab->pWriteFd==0 ){ 6871 rc = zipfileBegin(pVtab); 6872 if( rc!=SQLITE_OK ) return rc; 6873 } 6874 6875 /* If this is a DELETE or UPDATE, find the archive entry to delete. */ 6876 if( sqlite3_value_type(apVal[0])!=SQLITE_NULL ){ 6877 const char *zDelete = (const char*)sqlite3_value_text(apVal[0]); 6878 int nDelete = (int)strlen(zDelete); 6879 if( nVal>1 ){ 6880 const char *zUpdate = (const char*)sqlite3_value_text(apVal[1]); 6881 if( zUpdate && zipfileComparePath(zUpdate, zDelete, nDelete)!=0 ){ 6882 bUpdate = 1; 6883 } 6884 } 6885 for(pOld=pTab->pFirstEntry; 1; pOld=pOld->pNext){ 6886 if( zipfileComparePath(pOld->cds.zFile, zDelete, nDelete)==0 ){ 6887 break; 6888 } 6889 assert( pOld->pNext ); 6890 } 6891 } 6892 6893 if( nVal>1 ){ 6894 /* Check that "sz" and "rawdata" are both NULL: */ 6895 if( sqlite3_value_type(apVal[5])!=SQLITE_NULL ){ 6896 zipfileTableErr(pTab, "sz must be NULL"); 6897 rc = SQLITE_CONSTRAINT; 6898 } 6899 if( sqlite3_value_type(apVal[6])!=SQLITE_NULL ){ 6900 zipfileTableErr(pTab, "rawdata must be NULL"); 6901 rc = SQLITE_CONSTRAINT; 6902 } 6903 6904 if( rc==SQLITE_OK ){ 6905 if( sqlite3_value_type(apVal[7])==SQLITE_NULL ){ 6906 /* data=NULL. A directory */ 6907 bIsDir = 1; 6908 }else{ 6909 /* Value specified for "data", and possibly "method". This must be 6910 ** a regular file or a symlink. */ 6911 const u8 *aIn = sqlite3_value_blob(apVal[7]); 6912 int nIn = sqlite3_value_bytes(apVal[7]); 6913 int bAuto = sqlite3_value_type(apVal[8])==SQLITE_NULL; 6914 6915 iMethod = sqlite3_value_int(apVal[8]); 6916 sz = nIn; 6917 pData = aIn; 6918 nData = nIn; 6919 if( iMethod!=0 && iMethod!=8 ){ 6920 zipfileTableErr(pTab, "unknown compression method: %d", iMethod); 6921 rc = SQLITE_CONSTRAINT; 6922 }else{ 6923 if( bAuto || iMethod ){ 6924 int nCmp; 6925 rc = zipfileDeflate(aIn, nIn, &pFree, &nCmp, &pTab->base.zErrMsg); 6926 if( rc==SQLITE_OK ){ 6927 if( iMethod || nCmp<nIn ){ 6928 iMethod = 8; 6929 pData = pFree; 6930 nData = nCmp; 6931 } 6932 } 6933 } 6934 iCrc32 = crc32(0, aIn, nIn); 6935 } 6936 } 6937 } 6938 6939 if( rc==SQLITE_OK ){ 6940 rc = zipfileGetMode(apVal[3], bIsDir, &mode, &pTab->base.zErrMsg); 6941 } 6942 6943 if( rc==SQLITE_OK ){ 6944 zPath = (const char*)sqlite3_value_text(apVal[2]); 6945 if( zPath==0 ) zPath = ""; 6946 nPath = (int)strlen(zPath); 6947 mTime = zipfileGetTime(apVal[4]); 6948 } 6949 6950 if( rc==SQLITE_OK && bIsDir ){ 6951 /* For a directory, check that the last character in the path is a 6952 ** '/'. This appears to be required for compatibility with info-zip 6953 ** (the unzip command on unix). It does not create directories 6954 ** otherwise. */ 6955 if( nPath<=0 || zPath[nPath-1]!='/' ){ 6956 zFree = sqlite3_mprintf("%s/", zPath); 6957 zPath = (const char*)zFree; 6958 if( zFree==0 ){ 6959 rc = SQLITE_NOMEM; 6960 nPath = 0; 6961 }else{ 6962 nPath = (int)strlen(zPath); 6963 } 6964 } 6965 } 6966 6967 /* Check that we're not inserting a duplicate entry -OR- updating an 6968 ** entry with a path, thereby making it into a duplicate. */ 6969 if( (pOld==0 || bUpdate) && rc==SQLITE_OK ){ 6970 ZipfileEntry *p; 6971 for(p=pTab->pFirstEntry; p; p=p->pNext){ 6972 if( zipfileComparePath(p->cds.zFile, zPath, nPath)==0 ){ 6973 switch( sqlite3_vtab_on_conflict(pTab->db) ){ 6974 case SQLITE_IGNORE: { 6975 goto zipfile_update_done; 6976 } 6977 case SQLITE_REPLACE: { 6978 pOld2 = p; 6979 break; 6980 } 6981 default: { 6982 zipfileTableErr(pTab, "duplicate name: \"%s\"", zPath); 6983 rc = SQLITE_CONSTRAINT; 6984 break; 6985 } 6986 } 6987 break; 6988 } 6989 } 6990 } 6991 6992 if( rc==SQLITE_OK ){ 6993 /* Create the new CDS record. */ 6994 pNew = zipfileNewEntry(zPath); 6995 if( pNew==0 ){ 6996 rc = SQLITE_NOMEM; 6997 }else{ 6998 pNew->cds.iVersionMadeBy = ZIPFILE_NEWENTRY_MADEBY; 6999 pNew->cds.iVersionExtract = ZIPFILE_NEWENTRY_REQUIRED; 7000 pNew->cds.flags = ZIPFILE_NEWENTRY_FLAGS; 7001 pNew->cds.iCompression = (u16)iMethod; 7002 zipfileMtimeToDos(&pNew->cds, mTime); 7003 pNew->cds.crc32 = iCrc32; 7004 pNew->cds.szCompressed = nData; 7005 pNew->cds.szUncompressed = (u32)sz; 7006 pNew->cds.iExternalAttr = (mode<<16); 7007 pNew->cds.iOffset = (u32)pTab->szCurrent; 7008 pNew->cds.nFile = (u16)nPath; 7009 pNew->mUnixTime = (u32)mTime; 7010 rc = zipfileAppendEntry(pTab, pNew, pData, nData); 7011 zipfileAddEntry(pTab, pOld, pNew); 7012 } 7013 } 7014 } 7015 7016 if( rc==SQLITE_OK && (pOld || pOld2) ){ 7017 ZipfileCsr *pCsr; 7018 for(pCsr=pTab->pCsrList; pCsr; pCsr=pCsr->pCsrNext){ 7019 if( pCsr->pCurrent && (pCsr->pCurrent==pOld || pCsr->pCurrent==pOld2) ){ 7020 pCsr->pCurrent = pCsr->pCurrent->pNext; 7021 pCsr->bNoop = 1; 7022 } 7023 } 7024 7025 zipfileRemoveEntryFromList(pTab, pOld); 7026 zipfileRemoveEntryFromList(pTab, pOld2); 7027 } 7028 7029 zipfile_update_done: 7030 sqlite3_free(pFree); 7031 sqlite3_free(zFree); 7032 return rc; 7033 } 7034 7035 static int zipfileSerializeEOCD(ZipfileEOCD *p, u8 *aBuf){ 7036 u8 *a = aBuf; 7037 zipfileWrite32(a, ZIPFILE_SIGNATURE_EOCD); 7038 zipfileWrite16(a, p->iDisk); 7039 zipfileWrite16(a, p->iFirstDisk); 7040 zipfileWrite16(a, p->nEntry); 7041 zipfileWrite16(a, p->nEntryTotal); 7042 zipfileWrite32(a, p->nSize); 7043 zipfileWrite32(a, p->iOffset); 7044 zipfileWrite16(a, 0); /* Size of trailing comment in bytes*/ 7045 7046 return a-aBuf; 7047 } 7048 7049 static int zipfileAppendEOCD(ZipfileTab *pTab, ZipfileEOCD *p){ 7050 int nBuf = zipfileSerializeEOCD(p, pTab->aBuffer); 7051 assert( nBuf==ZIPFILE_EOCD_FIXED_SZ ); 7052 return zipfileAppendData(pTab, pTab->aBuffer, nBuf); 7053 } 7054 7055 /* 7056 ** Serialize the CDS structure into buffer aBuf[]. Return the number 7057 ** of bytes written. 7058 */ 7059 static int zipfileSerializeCDS(ZipfileEntry *pEntry, u8 *aBuf){ 7060 u8 *a = aBuf; 7061 ZipfileCDS *pCDS = &pEntry->cds; 7062 7063 if( pEntry->aExtra==0 ){ 7064 pCDS->nExtra = 9; 7065 } 7066 7067 zipfileWrite32(a, ZIPFILE_SIGNATURE_CDS); 7068 zipfileWrite16(a, pCDS->iVersionMadeBy); 7069 zipfileWrite16(a, pCDS->iVersionExtract); 7070 zipfileWrite16(a, pCDS->flags); 7071 zipfileWrite16(a, pCDS->iCompression); 7072 zipfileWrite16(a, pCDS->mTime); 7073 zipfileWrite16(a, pCDS->mDate); 7074 zipfileWrite32(a, pCDS->crc32); 7075 zipfileWrite32(a, pCDS->szCompressed); 7076 zipfileWrite32(a, pCDS->szUncompressed); 7077 assert( a==&aBuf[ZIPFILE_CDS_NFILE_OFF] ); 7078 zipfileWrite16(a, pCDS->nFile); 7079 zipfileWrite16(a, pCDS->nExtra); 7080 zipfileWrite16(a, pCDS->nComment); 7081 zipfileWrite16(a, pCDS->iDiskStart); 7082 zipfileWrite16(a, pCDS->iInternalAttr); 7083 zipfileWrite32(a, pCDS->iExternalAttr); 7084 zipfileWrite32(a, pCDS->iOffset); 7085 7086 memcpy(a, pCDS->zFile, pCDS->nFile); 7087 a += pCDS->nFile; 7088 7089 if( pEntry->aExtra ){ 7090 int n = (int)pCDS->nExtra + (int)pCDS->nComment; 7091 memcpy(a, pEntry->aExtra, n); 7092 a += n; 7093 }else{ 7094 assert( pCDS->nExtra==9 ); 7095 zipfileWrite16(a, ZIPFILE_EXTRA_TIMESTAMP); 7096 zipfileWrite16(a, 5); 7097 *a++ = 0x01; 7098 zipfileWrite32(a, pEntry->mUnixTime); 7099 } 7100 7101 return a-aBuf; 7102 } 7103 7104 static int zipfileCommit(sqlite3_vtab *pVtab){ 7105 ZipfileTab *pTab = (ZipfileTab*)pVtab; 7106 int rc = SQLITE_OK; 7107 if( pTab->pWriteFd ){ 7108 i64 iOffset = pTab->szCurrent; 7109 ZipfileEntry *p; 7110 ZipfileEOCD eocd; 7111 int nEntry = 0; 7112 7113 /* Write out all entries */ 7114 for(p=pTab->pFirstEntry; rc==SQLITE_OK && p; p=p->pNext){ 7115 int n = zipfileSerializeCDS(p, pTab->aBuffer); 7116 rc = zipfileAppendData(pTab, pTab->aBuffer, n); 7117 nEntry++; 7118 } 7119 7120 /* Write out the EOCD record */ 7121 eocd.iDisk = 0; 7122 eocd.iFirstDisk = 0; 7123 eocd.nEntry = (u16)nEntry; 7124 eocd.nEntryTotal = (u16)nEntry; 7125 eocd.nSize = (u32)(pTab->szCurrent - iOffset); 7126 eocd.iOffset = (u32)iOffset; 7127 rc = zipfileAppendEOCD(pTab, &eocd); 7128 7129 zipfileCleanupTransaction(pTab); 7130 } 7131 return rc; 7132 } 7133 7134 static int zipfileRollback(sqlite3_vtab *pVtab){ 7135 return zipfileCommit(pVtab); 7136 } 7137 7138 static ZipfileCsr *zipfileFindCursor(ZipfileTab *pTab, i64 iId){ 7139 ZipfileCsr *pCsr; 7140 for(pCsr=pTab->pCsrList; pCsr; pCsr=pCsr->pCsrNext){ 7141 if( iId==pCsr->iId ) break; 7142 } 7143 return pCsr; 7144 } 7145 7146 static void zipfileFunctionCds( 7147 sqlite3_context *context, 7148 int argc, 7149 sqlite3_value **argv 7150 ){ 7151 ZipfileCsr *pCsr; 7152 ZipfileTab *pTab = (ZipfileTab*)sqlite3_user_data(context); 7153 assert( argc>0 ); 7154 7155 pCsr = zipfileFindCursor(pTab, sqlite3_value_int64(argv[0])); 7156 if( pCsr ){ 7157 ZipfileCDS *p = &pCsr->pCurrent->cds; 7158 char *zRes = sqlite3_mprintf("{" 7159 "\"version-made-by\" : %u, " 7160 "\"version-to-extract\" : %u, " 7161 "\"flags\" : %u, " 7162 "\"compression\" : %u, " 7163 "\"time\" : %u, " 7164 "\"date\" : %u, " 7165 "\"crc32\" : %u, " 7166 "\"compressed-size\" : %u, " 7167 "\"uncompressed-size\" : %u, " 7168 "\"file-name-length\" : %u, " 7169 "\"extra-field-length\" : %u, " 7170 "\"file-comment-length\" : %u, " 7171 "\"disk-number-start\" : %u, " 7172 "\"internal-attr\" : %u, " 7173 "\"external-attr\" : %u, " 7174 "\"offset\" : %u }", 7175 (u32)p->iVersionMadeBy, (u32)p->iVersionExtract, 7176 (u32)p->flags, (u32)p->iCompression, 7177 (u32)p->mTime, (u32)p->mDate, 7178 (u32)p->crc32, (u32)p->szCompressed, 7179 (u32)p->szUncompressed, (u32)p->nFile, 7180 (u32)p->nExtra, (u32)p->nComment, 7181 (u32)p->iDiskStart, (u32)p->iInternalAttr, 7182 (u32)p->iExternalAttr, (u32)p->iOffset 7183 ); 7184 7185 if( zRes==0 ){ 7186 sqlite3_result_error_nomem(context); 7187 }else{ 7188 sqlite3_result_text(context, zRes, -1, SQLITE_TRANSIENT); 7189 sqlite3_free(zRes); 7190 } 7191 } 7192 } 7193 7194 /* 7195 ** xFindFunction method. 7196 */ 7197 static int zipfileFindFunction( 7198 sqlite3_vtab *pVtab, /* Virtual table handle */ 7199 int nArg, /* Number of SQL function arguments */ 7200 const char *zName, /* Name of SQL function */ 7201 void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), /* OUT: Result */ 7202 void **ppArg /* OUT: User data for *pxFunc */ 7203 ){ 7204 if( sqlite3_stricmp("zipfile_cds", zName)==0 ){ 7205 *pxFunc = zipfileFunctionCds; 7206 *ppArg = (void*)pVtab; 7207 return 1; 7208 } 7209 return 0; 7210 } 7211 7212 typedef struct ZipfileBuffer ZipfileBuffer; 7213 struct ZipfileBuffer { 7214 u8 *a; /* Pointer to buffer */ 7215 int n; /* Size of buffer in bytes */ 7216 int nAlloc; /* Byte allocated at a[] */ 7217 }; 7218 7219 typedef struct ZipfileCtx ZipfileCtx; 7220 struct ZipfileCtx { 7221 int nEntry; 7222 ZipfileBuffer body; 7223 ZipfileBuffer cds; 7224 }; 7225 7226 static int zipfileBufferGrow(ZipfileBuffer *pBuf, int nByte){ 7227 if( pBuf->n+nByte>pBuf->nAlloc ){ 7228 u8 *aNew; 7229 sqlite3_int64 nNew = pBuf->n ? pBuf->n*2 : 512; 7230 int nReq = pBuf->n + nByte; 7231 7232 while( nNew<nReq ) nNew = nNew*2; 7233 aNew = sqlite3_realloc64(pBuf->a, nNew); 7234 if( aNew==0 ) return SQLITE_NOMEM; 7235 pBuf->a = aNew; 7236 pBuf->nAlloc = (int)nNew; 7237 } 7238 return SQLITE_OK; 7239 } 7240 7241 /* 7242 ** xStep() callback for the zipfile() aggregate. This can be called in 7243 ** any of the following ways: 7244 ** 7245 ** SELECT zipfile(name,data) ... 7246 ** SELECT zipfile(name,mode,mtime,data) ... 7247 ** SELECT zipfile(name,mode,mtime,data,method) ... 7248 */ 7249 void zipfileStep(sqlite3_context *pCtx, int nVal, sqlite3_value **apVal){ 7250 ZipfileCtx *p; /* Aggregate function context */ 7251 ZipfileEntry e; /* New entry to add to zip archive */ 7252 7253 sqlite3_value *pName = 0; 7254 sqlite3_value *pMode = 0; 7255 sqlite3_value *pMtime = 0; 7256 sqlite3_value *pData = 0; 7257 sqlite3_value *pMethod = 0; 7258 7259 int bIsDir = 0; 7260 u32 mode; 7261 int rc = SQLITE_OK; 7262 char *zErr = 0; 7263 7264 int iMethod = -1; /* Compression method to use (0 or 8) */ 7265 7266 const u8 *aData = 0; /* Possibly compressed data for new entry */ 7267 int nData = 0; /* Size of aData[] in bytes */ 7268 int szUncompressed = 0; /* Size of data before compression */ 7269 u8 *aFree = 0; /* Free this before returning */ 7270 u32 iCrc32 = 0; /* crc32 of uncompressed data */ 7271 7272 char *zName = 0; /* Path (name) of new entry */ 7273 int nName = 0; /* Size of zName in bytes */ 7274 char *zFree = 0; /* Free this before returning */ 7275 int nByte; 7276 7277 memset(&e, 0, sizeof(e)); 7278 p = (ZipfileCtx*)sqlite3_aggregate_context(pCtx, sizeof(ZipfileCtx)); 7279 if( p==0 ) return; 7280 7281 /* Martial the arguments into stack variables */ 7282 if( nVal!=2 && nVal!=4 && nVal!=5 ){ 7283 zErr = sqlite3_mprintf("wrong number of arguments to function zipfile()"); 7284 rc = SQLITE_ERROR; 7285 goto zipfile_step_out; 7286 } 7287 pName = apVal[0]; 7288 if( nVal==2 ){ 7289 pData = apVal[1]; 7290 }else{ 7291 pMode = apVal[1]; 7292 pMtime = apVal[2]; 7293 pData = apVal[3]; 7294 if( nVal==5 ){ 7295 pMethod = apVal[4]; 7296 } 7297 } 7298 7299 /* Check that the 'name' parameter looks ok. */ 7300 zName = (char*)sqlite3_value_text(pName); 7301 nName = sqlite3_value_bytes(pName); 7302 if( zName==0 ){ 7303 zErr = sqlite3_mprintf("first argument to zipfile() must be non-NULL"); 7304 rc = SQLITE_ERROR; 7305 goto zipfile_step_out; 7306 } 7307 7308 /* Inspect the 'method' parameter. This must be either 0 (store), 8 (use 7309 ** deflate compression) or NULL (choose automatically). */ 7310 if( pMethod && SQLITE_NULL!=sqlite3_value_type(pMethod) ){ 7311 iMethod = (int)sqlite3_value_int64(pMethod); 7312 if( iMethod!=0 && iMethod!=8 ){ 7313 zErr = sqlite3_mprintf("illegal method value: %d", iMethod); 7314 rc = SQLITE_ERROR; 7315 goto zipfile_step_out; 7316 } 7317 } 7318 7319 /* Now inspect the data. If this is NULL, then the new entry must be a 7320 ** directory. Otherwise, figure out whether or not the data should 7321 ** be deflated or simply stored in the zip archive. */ 7322 if( sqlite3_value_type(pData)==SQLITE_NULL ){ 7323 bIsDir = 1; 7324 iMethod = 0; 7325 }else{ 7326 aData = sqlite3_value_blob(pData); 7327 szUncompressed = nData = sqlite3_value_bytes(pData); 7328 iCrc32 = crc32(0, aData, nData); 7329 if( iMethod<0 || iMethod==8 ){ 7330 int nOut = 0; 7331 rc = zipfileDeflate(aData, nData, &aFree, &nOut, &zErr); 7332 if( rc!=SQLITE_OK ){ 7333 goto zipfile_step_out; 7334 } 7335 if( iMethod==8 || nOut<nData ){ 7336 aData = aFree; 7337 nData = nOut; 7338 iMethod = 8; 7339 }else{ 7340 iMethod = 0; 7341 } 7342 } 7343 } 7344 7345 /* Decode the "mode" argument. */ 7346 rc = zipfileGetMode(pMode, bIsDir, &mode, &zErr); 7347 if( rc ) goto zipfile_step_out; 7348 7349 /* Decode the "mtime" argument. */ 7350 e.mUnixTime = zipfileGetTime(pMtime); 7351 7352 /* If this is a directory entry, ensure that there is exactly one '/' 7353 ** at the end of the path. Or, if this is not a directory and the path 7354 ** ends in '/' it is an error. */ 7355 if( bIsDir==0 ){ 7356 if( nName>0 && zName[nName-1]=='/' ){ 7357 zErr = sqlite3_mprintf("non-directory name must not end with /"); 7358 rc = SQLITE_ERROR; 7359 goto zipfile_step_out; 7360 } 7361 }else{ 7362 if( nName==0 || zName[nName-1]!='/' ){ 7363 zName = zFree = sqlite3_mprintf("%s/", zName); 7364 if( zName==0 ){ 7365 rc = SQLITE_NOMEM; 7366 goto zipfile_step_out; 7367 } 7368 nName = (int)strlen(zName); 7369 }else{ 7370 while( nName>1 && zName[nName-2]=='/' ) nName--; 7371 } 7372 } 7373 7374 /* Assemble the ZipfileEntry object for the new zip archive entry */ 7375 e.cds.iVersionMadeBy = ZIPFILE_NEWENTRY_MADEBY; 7376 e.cds.iVersionExtract = ZIPFILE_NEWENTRY_REQUIRED; 7377 e.cds.flags = ZIPFILE_NEWENTRY_FLAGS; 7378 e.cds.iCompression = (u16)iMethod; 7379 zipfileMtimeToDos(&e.cds, (u32)e.mUnixTime); 7380 e.cds.crc32 = iCrc32; 7381 e.cds.szCompressed = nData; 7382 e.cds.szUncompressed = szUncompressed; 7383 e.cds.iExternalAttr = (mode<<16); 7384 e.cds.iOffset = p->body.n; 7385 e.cds.nFile = (u16)nName; 7386 e.cds.zFile = zName; 7387 7388 /* Append the LFH to the body of the new archive */ 7389 nByte = ZIPFILE_LFH_FIXED_SZ + e.cds.nFile + 9; 7390 if( (rc = zipfileBufferGrow(&p->body, nByte)) ) goto zipfile_step_out; 7391 p->body.n += zipfileSerializeLFH(&e, &p->body.a[p->body.n]); 7392 7393 /* Append the data to the body of the new archive */ 7394 if( nData>0 ){ 7395 if( (rc = zipfileBufferGrow(&p->body, nData)) ) goto zipfile_step_out; 7396 memcpy(&p->body.a[p->body.n], aData, nData); 7397 p->body.n += nData; 7398 } 7399 7400 /* Append the CDS record to the directory of the new archive */ 7401 nByte = ZIPFILE_CDS_FIXED_SZ + e.cds.nFile + 9; 7402 if( (rc = zipfileBufferGrow(&p->cds, nByte)) ) goto zipfile_step_out; 7403 p->cds.n += zipfileSerializeCDS(&e, &p->cds.a[p->cds.n]); 7404 7405 /* Increment the count of entries in the archive */ 7406 p->nEntry++; 7407 7408 zipfile_step_out: 7409 sqlite3_free(aFree); 7410 sqlite3_free(zFree); 7411 if( rc ){ 7412 if( zErr ){ 7413 sqlite3_result_error(pCtx, zErr, -1); 7414 }else{ 7415 sqlite3_result_error_code(pCtx, rc); 7416 } 7417 } 7418 sqlite3_free(zErr); 7419 } 7420 7421 /* 7422 ** xFinalize() callback for zipfile aggregate function. 7423 */ 7424 void zipfileFinal(sqlite3_context *pCtx){ 7425 ZipfileCtx *p; 7426 ZipfileEOCD eocd; 7427 sqlite3_int64 nZip; 7428 u8 *aZip; 7429 7430 p = (ZipfileCtx*)sqlite3_aggregate_context(pCtx, sizeof(ZipfileCtx)); 7431 if( p==0 ) return; 7432 if( p->nEntry>0 ){ 7433 memset(&eocd, 0, sizeof(eocd)); 7434 eocd.nEntry = (u16)p->nEntry; 7435 eocd.nEntryTotal = (u16)p->nEntry; 7436 eocd.nSize = p->cds.n; 7437 eocd.iOffset = p->body.n; 7438 7439 nZip = p->body.n + p->cds.n + ZIPFILE_EOCD_FIXED_SZ; 7440 aZip = (u8*)sqlite3_malloc64(nZip); 7441 if( aZip==0 ){ 7442 sqlite3_result_error_nomem(pCtx); 7443 }else{ 7444 memcpy(aZip, p->body.a, p->body.n); 7445 memcpy(&aZip[p->body.n], p->cds.a, p->cds.n); 7446 zipfileSerializeEOCD(&eocd, &aZip[p->body.n + p->cds.n]); 7447 sqlite3_result_blob(pCtx, aZip, (int)nZip, zipfileFree); 7448 } 7449 } 7450 7451 sqlite3_free(p->body.a); 7452 sqlite3_free(p->cds.a); 7453 } 7454 7455 7456 /* 7457 ** Register the "zipfile" virtual table. 7458 */ 7459 static int zipfileRegister(sqlite3 *db){ 7460 static sqlite3_module zipfileModule = { 7461 1, /* iVersion */ 7462 zipfileConnect, /* xCreate */ 7463 zipfileConnect, /* xConnect */ 7464 zipfileBestIndex, /* xBestIndex */ 7465 zipfileDisconnect, /* xDisconnect */ 7466 zipfileDisconnect, /* xDestroy */ 7467 zipfileOpen, /* xOpen - open a cursor */ 7468 zipfileClose, /* xClose - close a cursor */ 7469 zipfileFilter, /* xFilter - configure scan constraints */ 7470 zipfileNext, /* xNext - advance a cursor */ 7471 zipfileEof, /* xEof - check for end of scan */ 7472 zipfileColumn, /* xColumn - read data */ 7473 0, /* xRowid - read data */ 7474 zipfileUpdate, /* xUpdate */ 7475 zipfileBegin, /* xBegin */ 7476 0, /* xSync */ 7477 zipfileCommit, /* xCommit */ 7478 zipfileRollback, /* xRollback */ 7479 zipfileFindFunction, /* xFindMethod */ 7480 0, /* xRename */ 7481 }; 7482 7483 int rc = sqlite3_create_module(db, "zipfile" , &zipfileModule, 0); 7484 if( rc==SQLITE_OK ) rc = sqlite3_overload_function(db, "zipfile_cds", -1); 7485 if( rc==SQLITE_OK ){ 7486 rc = sqlite3_create_function(db, "zipfile", -1, SQLITE_UTF8, 0, 0, 7487 zipfileStep, zipfileFinal 7488 ); 7489 } 7490 return rc; 7491 } 7492 #else /* SQLITE_OMIT_VIRTUALTABLE */ 7493 # define zipfileRegister(x) SQLITE_OK 7494 #endif 7495 7496 #ifdef _WIN32 7497 7498 #endif 7499 int sqlite3_zipfile_init( 7500 sqlite3 *db, 7501 char **pzErrMsg, 7502 const sqlite3_api_routines *pApi 7503 ){ 7504 SQLITE_EXTENSION_INIT2(pApi); 7505 (void)pzErrMsg; /* Unused parameter */ 7506 return zipfileRegister(db); 7507 } 7508 7509 /************************* End ../ext/misc/zipfile.c ********************/ 7510 /************************* Begin ../ext/misc/sqlar.c ******************/ 7511 /* 7512 ** 2017-12-17 7513 ** 7514 ** The author disclaims copyright to this source code. In place of 7515 ** a legal notice, here is a blessing: 7516 ** 7517 ** May you do good and not evil. 7518 ** May you find forgiveness for yourself and forgive others. 7519 ** May you share freely, never taking more than you give. 7520 ** 7521 ****************************************************************************** 7522 ** 7523 ** Utility functions sqlar_compress() and sqlar_uncompress(). Useful 7524 ** for working with sqlar archives and used by the shell tool's built-in 7525 ** sqlar support. 7526 */ 7527 /* #include "sqlite3ext.h" */ 7528 SQLITE_EXTENSION_INIT1 7529 #include <zlib.h> 7530 #include <assert.h> 7531 7532 /* 7533 ** Implementation of the "sqlar_compress(X)" SQL function. 7534 ** 7535 ** If the type of X is SQLITE_BLOB, and compressing that blob using 7536 ** zlib utility function compress() yields a smaller blob, return the 7537 ** compressed blob. Otherwise, return a copy of X. 7538 ** 7539 ** SQLar uses the "zlib format" for compressed content. The zlib format 7540 ** contains a two-byte identification header and a four-byte checksum at 7541 ** the end. This is different from ZIP which uses the raw deflate format. 7542 ** 7543 ** Future enhancements to SQLar might add support for new compression formats. 7544 ** If so, those new formats will be identified by alternative headers in the 7545 ** compressed data. 7546 */ 7547 static void sqlarCompressFunc( 7548 sqlite3_context *context, 7549 int argc, 7550 sqlite3_value **argv 7551 ){ 7552 assert( argc==1 ); 7553 if( sqlite3_value_type(argv[0])==SQLITE_BLOB ){ 7554 const Bytef *pData = sqlite3_value_blob(argv[0]); 7555 uLong nData = sqlite3_value_bytes(argv[0]); 7556 uLongf nOut = compressBound(nData); 7557 Bytef *pOut; 7558 7559 pOut = (Bytef*)sqlite3_malloc(nOut); 7560 if( pOut==0 ){ 7561 sqlite3_result_error_nomem(context); 7562 return; 7563 }else{ 7564 if( Z_OK!=compress(pOut, &nOut, pData, nData) ){ 7565 sqlite3_result_error(context, "error in compress()", -1); 7566 }else if( nOut<nData ){ 7567 sqlite3_result_blob(context, pOut, nOut, SQLITE_TRANSIENT); 7568 }else{ 7569 sqlite3_result_value(context, argv[0]); 7570 } 7571 sqlite3_free(pOut); 7572 } 7573 }else{ 7574 sqlite3_result_value(context, argv[0]); 7575 } 7576 } 7577 7578 /* 7579 ** Implementation of the "sqlar_uncompress(X,SZ)" SQL function 7580 ** 7581 ** Parameter SZ is interpreted as an integer. If it is less than or 7582 ** equal to zero, then this function returns a copy of X. Or, if 7583 ** SZ is equal to the size of X when interpreted as a blob, also 7584 ** return a copy of X. Otherwise, decompress blob X using zlib 7585 ** utility function uncompress() and return the results (another 7586 ** blob). 7587 */ 7588 static void sqlarUncompressFunc( 7589 sqlite3_context *context, 7590 int argc, 7591 sqlite3_value **argv 7592 ){ 7593 uLong nData; 7594 uLongf sz; 7595 7596 assert( argc==2 ); 7597 sz = sqlite3_value_int(argv[1]); 7598 7599 if( sz<=0 || sz==(nData = sqlite3_value_bytes(argv[0])) ){ 7600 sqlite3_result_value(context, argv[0]); 7601 }else{ 7602 const Bytef *pData= sqlite3_value_blob(argv[0]); 7603 Bytef *pOut = sqlite3_malloc(sz); 7604 if( Z_OK!=uncompress(pOut, &sz, pData, nData) ){ 7605 sqlite3_result_error(context, "error in uncompress()", -1); 7606 }else{ 7607 sqlite3_result_blob(context, pOut, sz, SQLITE_TRANSIENT); 7608 } 7609 sqlite3_free(pOut); 7610 } 7611 } 7612 7613 7614 #ifdef _WIN32 7615 7616 #endif 7617 int sqlite3_sqlar_init( 7618 sqlite3 *db, 7619 char **pzErrMsg, 7620 const sqlite3_api_routines *pApi 7621 ){ 7622 int rc = SQLITE_OK; 7623 SQLITE_EXTENSION_INIT2(pApi); 7624 (void)pzErrMsg; /* Unused parameter */ 7625 rc = sqlite3_create_function(db, "sqlar_compress", 1, 7626 SQLITE_UTF8|SQLITE_INNOCUOUS, 0, 7627 sqlarCompressFunc, 0, 0); 7628 if( rc==SQLITE_OK ){ 7629 rc = sqlite3_create_function(db, "sqlar_uncompress", 2, 7630 SQLITE_UTF8|SQLITE_INNOCUOUS, 0, 7631 sqlarUncompressFunc, 0, 0); 7632 } 7633 return rc; 7634 } 7635 7636 /************************* End ../ext/misc/sqlar.c ********************/ 7637 #endif 7638 /************************* Begin ../ext/expert/sqlite3expert.h ******************/ 7639 /* 7640 ** 2017 April 07 7641 ** 7642 ** The author disclaims copyright to this source code. In place of 7643 ** a legal notice, here is a blessing: 7644 ** 7645 ** May you do good and not evil. 7646 ** May you find forgiveness for yourself and forgive others. 7647 ** May you share freely, never taking more than you give. 7648 ** 7649 ************************************************************************* 7650 */ 7651 #if !defined(SQLITEEXPERT_H) 7652 #define SQLITEEXPERT_H 1 7653 /* #include "sqlite3.h" */ 7654 7655 typedef struct sqlite3expert sqlite3expert; 7656 7657 /* 7658 ** Create a new sqlite3expert object. 7659 ** 7660 ** If successful, a pointer to the new object is returned and (*pzErr) set 7661 ** to NULL. Or, if an error occurs, NULL is returned and (*pzErr) set to 7662 ** an English-language error message. In this case it is the responsibility 7663 ** of the caller to eventually free the error message buffer using 7664 ** sqlite3_free(). 7665 */ 7666 sqlite3expert *sqlite3_expert_new(sqlite3 *db, char **pzErr); 7667 7668 /* 7669 ** Configure an sqlite3expert object. 7670 ** 7671 ** EXPERT_CONFIG_SAMPLE: 7672 ** By default, sqlite3_expert_analyze() generates sqlite_stat1 data for 7673 ** each candidate index. This involves scanning and sorting the entire 7674 ** contents of each user database table once for each candidate index 7675 ** associated with the table. For large databases, this can be 7676 ** prohibitively slow. This option allows the sqlite3expert object to 7677 ** be configured so that sqlite_stat1 data is instead generated based on a 7678 ** subset of each table, or so that no sqlite_stat1 data is used at all. 7679 ** 7680 ** A single integer argument is passed to this option. If the value is less 7681 ** than or equal to zero, then no sqlite_stat1 data is generated or used by 7682 ** the analysis - indexes are recommended based on the database schema only. 7683 ** Or, if the value is 100 or greater, complete sqlite_stat1 data is 7684 ** generated for each candidate index (this is the default). Finally, if the 7685 ** value falls between 0 and 100, then it represents the percentage of user 7686 ** table rows that should be considered when generating sqlite_stat1 data. 7687 ** 7688 ** Examples: 7689 ** 7690 ** // Do not generate any sqlite_stat1 data 7691 ** sqlite3_expert_config(pExpert, EXPERT_CONFIG_SAMPLE, 0); 7692 ** 7693 ** // Generate sqlite_stat1 data based on 10% of the rows in each table. 7694 ** sqlite3_expert_config(pExpert, EXPERT_CONFIG_SAMPLE, 10); 7695 */ 7696 int sqlite3_expert_config(sqlite3expert *p, int op, ...); 7697 7698 #define EXPERT_CONFIG_SAMPLE 1 /* int */ 7699 7700 /* 7701 ** Specify zero or more SQL statements to be included in the analysis. 7702 ** 7703 ** Buffer zSql must contain zero or more complete SQL statements. This 7704 ** function parses all statements contained in the buffer and adds them 7705 ** to the internal list of statements to analyze. If successful, SQLITE_OK 7706 ** is returned and (*pzErr) set to NULL. Or, if an error occurs - for example 7707 ** due to a error in the SQL - an SQLite error code is returned and (*pzErr) 7708 ** may be set to point to an English language error message. In this case 7709 ** the caller is responsible for eventually freeing the error message buffer 7710 ** using sqlite3_free(). 7711 ** 7712 ** If an error does occur while processing one of the statements in the 7713 ** buffer passed as the second argument, none of the statements in the 7714 ** buffer are added to the analysis. 7715 ** 7716 ** This function must be called before sqlite3_expert_analyze(). If a call 7717 ** to this function is made on an sqlite3expert object that has already 7718 ** been passed to sqlite3_expert_analyze() SQLITE_MISUSE is returned 7719 ** immediately and no statements are added to the analysis. 7720 */ 7721 int sqlite3_expert_sql( 7722 sqlite3expert *p, /* From a successful sqlite3_expert_new() */ 7723 const char *zSql, /* SQL statement(s) to add */ 7724 char **pzErr /* OUT: Error message (if any) */ 7725 ); 7726 7727 7728 /* 7729 ** This function is called after the sqlite3expert object has been configured 7730 ** with all SQL statements using sqlite3_expert_sql() to actually perform 7731 ** the analysis. Once this function has been called, it is not possible to 7732 ** add further SQL statements to the analysis. 7733 ** 7734 ** If successful, SQLITE_OK is returned and (*pzErr) is set to NULL. Or, if 7735 ** an error occurs, an SQLite error code is returned and (*pzErr) set to 7736 ** point to a buffer containing an English language error message. In this 7737 ** case it is the responsibility of the caller to eventually free the buffer 7738 ** using sqlite3_free(). 7739 ** 7740 ** If an error does occur within this function, the sqlite3expert object 7741 ** is no longer useful for any purpose. At that point it is no longer 7742 ** possible to add further SQL statements to the object or to re-attempt 7743 ** the analysis. The sqlite3expert object must still be freed using a call 7744 ** sqlite3_expert_destroy(). 7745 */ 7746 int sqlite3_expert_analyze(sqlite3expert *p, char **pzErr); 7747 7748 /* 7749 ** Return the total number of statements loaded using sqlite3_expert_sql(). 7750 ** The total number of SQL statements may be different from the total number 7751 ** to calls to sqlite3_expert_sql(). 7752 */ 7753 int sqlite3_expert_count(sqlite3expert*); 7754 7755 /* 7756 ** Return a component of the report. 7757 ** 7758 ** This function is called after sqlite3_expert_analyze() to extract the 7759 ** results of the analysis. Each call to this function returns either a 7760 ** NULL pointer or a pointer to a buffer containing a nul-terminated string. 7761 ** The value passed as the third argument must be one of the EXPERT_REPORT_* 7762 ** #define constants defined below. 7763 ** 7764 ** For some EXPERT_REPORT_* parameters, the buffer returned contains 7765 ** information relating to a specific SQL statement. In these cases that 7766 ** SQL statement is identified by the value passed as the second argument. 7767 ** SQL statements are numbered from 0 in the order in which they are parsed. 7768 ** If an out-of-range value (less than zero or equal to or greater than the 7769 ** value returned by sqlite3_expert_count()) is passed as the second argument 7770 ** along with such an EXPERT_REPORT_* parameter, NULL is always returned. 7771 ** 7772 ** EXPERT_REPORT_SQL: 7773 ** Return the text of SQL statement iStmt. 7774 ** 7775 ** EXPERT_REPORT_INDEXES: 7776 ** Return a buffer containing the CREATE INDEX statements for all recommended 7777 ** indexes for statement iStmt. If there are no new recommeded indexes, NULL 7778 ** is returned. 7779 ** 7780 ** EXPERT_REPORT_PLAN: 7781 ** Return a buffer containing the EXPLAIN QUERY PLAN output for SQL query 7782 ** iStmt after the proposed indexes have been added to the database schema. 7783 ** 7784 ** EXPERT_REPORT_CANDIDATES: 7785 ** Return a pointer to a buffer containing the CREATE INDEX statements 7786 ** for all indexes that were tested (for all SQL statements). The iStmt 7787 ** parameter is ignored for EXPERT_REPORT_CANDIDATES calls. 7788 */ 7789 const char *sqlite3_expert_report(sqlite3expert*, int iStmt, int eReport); 7790 7791 /* 7792 ** Values for the third argument passed to sqlite3_expert_report(). 7793 */ 7794 #define EXPERT_REPORT_SQL 1 7795 #define EXPERT_REPORT_INDEXES 2 7796 #define EXPERT_REPORT_PLAN 3 7797 #define EXPERT_REPORT_CANDIDATES 4 7798 7799 /* 7800 ** Free an (sqlite3expert*) handle and all associated resources. There 7801 ** should be one call to this function for each successful call to 7802 ** sqlite3-expert_new(). 7803 */ 7804 void sqlite3_expert_destroy(sqlite3expert*); 7805 7806 #endif /* !defined(SQLITEEXPERT_H) */ 7807 7808 /************************* End ../ext/expert/sqlite3expert.h ********************/ 7809 /************************* Begin ../ext/expert/sqlite3expert.c ******************/ 7810 /* 7811 ** 2017 April 09 7812 ** 7813 ** The author disclaims copyright to this source code. In place of 7814 ** a legal notice, here is a blessing: 7815 ** 7816 ** May you do good and not evil. 7817 ** May you find forgiveness for yourself and forgive others. 7818 ** May you share freely, never taking more than you give. 7819 ** 7820 ************************************************************************* 7821 */ 7822 /* #include "sqlite3expert.h" */ 7823 #include <assert.h> 7824 #include <string.h> 7825 #include <stdio.h> 7826 7827 #ifndef SQLITE_OMIT_VIRTUALTABLE 7828 7829 /* typedef sqlite3_int64 i64; */ 7830 /* typedef sqlite3_uint64 u64; */ 7831 7832 typedef struct IdxColumn IdxColumn; 7833 typedef struct IdxConstraint IdxConstraint; 7834 typedef struct IdxScan IdxScan; 7835 typedef struct IdxStatement IdxStatement; 7836 typedef struct IdxTable IdxTable; 7837 typedef struct IdxWrite IdxWrite; 7838 7839 #define STRLEN (int)strlen 7840 7841 /* 7842 ** A temp table name that we assume no user database will actually use. 7843 ** If this assumption proves incorrect triggers on the table with the 7844 ** conflicting name will be ignored. 7845 */ 7846 #define UNIQUE_TABLE_NAME "t592690916721053953805701627921227776" 7847 7848 /* 7849 ** A single constraint. Equivalent to either "col = ?" or "col < ?" (or 7850 ** any other type of single-ended range constraint on a column). 7851 ** 7852 ** pLink: 7853 ** Used to temporarily link IdxConstraint objects into lists while 7854 ** creating candidate indexes. 7855 */ 7856 struct IdxConstraint { 7857 char *zColl; /* Collation sequence */ 7858 int bRange; /* True for range, false for eq */ 7859 int iCol; /* Constrained table column */ 7860 int bFlag; /* Used by idxFindCompatible() */ 7861 int bDesc; /* True if ORDER BY <expr> DESC */ 7862 IdxConstraint *pNext; /* Next constraint in pEq or pRange list */ 7863 IdxConstraint *pLink; /* See above */ 7864 }; 7865 7866 /* 7867 ** A single scan of a single table. 7868 */ 7869 struct IdxScan { 7870 IdxTable *pTab; /* Associated table object */ 7871 int iDb; /* Database containing table zTable */ 7872 i64 covering; /* Mask of columns required for cov. index */ 7873 IdxConstraint *pOrder; /* ORDER BY columns */ 7874 IdxConstraint *pEq; /* List of == constraints */ 7875 IdxConstraint *pRange; /* List of < constraints */ 7876 IdxScan *pNextScan; /* Next IdxScan object for same analysis */ 7877 }; 7878 7879 /* 7880 ** Information regarding a single database table. Extracted from 7881 ** "PRAGMA table_info" by function idxGetTableInfo(). 7882 */ 7883 struct IdxColumn { 7884 char *zName; 7885 char *zColl; 7886 int iPk; 7887 }; 7888 struct IdxTable { 7889 int nCol; 7890 char *zName; /* Table name */ 7891 IdxColumn *aCol; 7892 IdxTable *pNext; /* Next table in linked list of all tables */ 7893 }; 7894 7895 /* 7896 ** An object of the following type is created for each unique table/write-op 7897 ** seen. The objects are stored in a singly-linked list beginning at 7898 ** sqlite3expert.pWrite. 7899 */ 7900 struct IdxWrite { 7901 IdxTable *pTab; 7902 int eOp; /* SQLITE_UPDATE, DELETE or INSERT */ 7903 IdxWrite *pNext; 7904 }; 7905 7906 /* 7907 ** Each statement being analyzed is represented by an instance of this 7908 ** structure. 7909 */ 7910 struct IdxStatement { 7911 int iId; /* Statement number */ 7912 char *zSql; /* SQL statement */ 7913 char *zIdx; /* Indexes */ 7914 char *zEQP; /* Plan */ 7915 IdxStatement *pNext; 7916 }; 7917 7918 7919 /* 7920 ** A hash table for storing strings. With space for a payload string 7921 ** with each entry. Methods are: 7922 ** 7923 ** idxHashInit() 7924 ** idxHashClear() 7925 ** idxHashAdd() 7926 ** idxHashSearch() 7927 */ 7928 #define IDX_HASH_SIZE 1023 7929 typedef struct IdxHashEntry IdxHashEntry; 7930 typedef struct IdxHash IdxHash; 7931 struct IdxHashEntry { 7932 char *zKey; /* nul-terminated key */ 7933 char *zVal; /* nul-terminated value string */ 7934 char *zVal2; /* nul-terminated value string 2 */ 7935 IdxHashEntry *pHashNext; /* Next entry in same hash bucket */ 7936 IdxHashEntry *pNext; /* Next entry in hash */ 7937 }; 7938 struct IdxHash { 7939 IdxHashEntry *pFirst; 7940 IdxHashEntry *aHash[IDX_HASH_SIZE]; 7941 }; 7942 7943 /* 7944 ** sqlite3expert object. 7945 */ 7946 struct sqlite3expert { 7947 int iSample; /* Percentage of tables to sample for stat1 */ 7948 sqlite3 *db; /* User database */ 7949 sqlite3 *dbm; /* In-memory db for this analysis */ 7950 sqlite3 *dbv; /* Vtab schema for this analysis */ 7951 IdxTable *pTable; /* List of all IdxTable objects */ 7952 IdxScan *pScan; /* List of scan objects */ 7953 IdxWrite *pWrite; /* List of write objects */ 7954 IdxStatement *pStatement; /* List of IdxStatement objects */ 7955 int bRun; /* True once analysis has run */ 7956 char **pzErrmsg; 7957 int rc; /* Error code from whereinfo hook */ 7958 IdxHash hIdx; /* Hash containing all candidate indexes */ 7959 char *zCandidates; /* For EXPERT_REPORT_CANDIDATES */ 7960 }; 7961 7962 7963 /* 7964 ** Allocate and return nByte bytes of zeroed memory using sqlite3_malloc(). 7965 ** If the allocation fails, set *pRc to SQLITE_NOMEM and return NULL. 7966 */ 7967 static void *idxMalloc(int *pRc, int nByte){ 7968 void *pRet; 7969 assert( *pRc==SQLITE_OK ); 7970 assert( nByte>0 ); 7971 pRet = sqlite3_malloc(nByte); 7972 if( pRet ){ 7973 memset(pRet, 0, nByte); 7974 }else{ 7975 *pRc = SQLITE_NOMEM; 7976 } 7977 return pRet; 7978 } 7979 7980 /* 7981 ** Initialize an IdxHash hash table. 7982 */ 7983 static void idxHashInit(IdxHash *pHash){ 7984 memset(pHash, 0, sizeof(IdxHash)); 7985 } 7986 7987 /* 7988 ** Reset an IdxHash hash table. 7989 */ 7990 static void idxHashClear(IdxHash *pHash){ 7991 int i; 7992 for(i=0; i<IDX_HASH_SIZE; i++){ 7993 IdxHashEntry *pEntry; 7994 IdxHashEntry *pNext; 7995 for(pEntry=pHash->aHash[i]; pEntry; pEntry=pNext){ 7996 pNext = pEntry->pHashNext; 7997 sqlite3_free(pEntry->zVal2); 7998 sqlite3_free(pEntry); 7999 } 8000 } 8001 memset(pHash, 0, sizeof(IdxHash)); 8002 } 8003 8004 /* 8005 ** Return the index of the hash bucket that the string specified by the 8006 ** arguments to this function belongs. 8007 */ 8008 static int idxHashString(const char *z, int n){ 8009 unsigned int ret = 0; 8010 int i; 8011 for(i=0; i<n; i++){ 8012 ret += (ret<<3) + (unsigned char)(z[i]); 8013 } 8014 return (int)(ret % IDX_HASH_SIZE); 8015 } 8016 8017 /* 8018 ** If zKey is already present in the hash table, return non-zero and do 8019 ** nothing. Otherwise, add an entry with key zKey and payload string zVal to 8020 ** the hash table passed as the second argument. 8021 */ 8022 static int idxHashAdd( 8023 int *pRc, 8024 IdxHash *pHash, 8025 const char *zKey, 8026 const char *zVal 8027 ){ 8028 int nKey = STRLEN(zKey); 8029 int iHash = idxHashString(zKey, nKey); 8030 int nVal = (zVal ? STRLEN(zVal) : 0); 8031 IdxHashEntry *pEntry; 8032 assert( iHash>=0 ); 8033 for(pEntry=pHash->aHash[iHash]; pEntry; pEntry=pEntry->pHashNext){ 8034 if( STRLEN(pEntry->zKey)==nKey && 0==memcmp(pEntry->zKey, zKey, nKey) ){ 8035 return 1; 8036 } 8037 } 8038 pEntry = idxMalloc(pRc, sizeof(IdxHashEntry) + nKey+1 + nVal+1); 8039 if( pEntry ){ 8040 pEntry->zKey = (char*)&pEntry[1]; 8041 memcpy(pEntry->zKey, zKey, nKey); 8042 if( zVal ){ 8043 pEntry->zVal = &pEntry->zKey[nKey+1]; 8044 memcpy(pEntry->zVal, zVal, nVal); 8045 } 8046 pEntry->pHashNext = pHash->aHash[iHash]; 8047 pHash->aHash[iHash] = pEntry; 8048 8049 pEntry->pNext = pHash->pFirst; 8050 pHash->pFirst = pEntry; 8051 } 8052 return 0; 8053 } 8054 8055 /* 8056 ** If zKey/nKey is present in the hash table, return a pointer to the 8057 ** hash-entry object. 8058 */ 8059 static IdxHashEntry *idxHashFind(IdxHash *pHash, const char *zKey, int nKey){ 8060 int iHash; 8061 IdxHashEntry *pEntry; 8062 if( nKey<0 ) nKey = STRLEN(zKey); 8063 iHash = idxHashString(zKey, nKey); 8064 assert( iHash>=0 ); 8065 for(pEntry=pHash->aHash[iHash]; pEntry; pEntry=pEntry->pHashNext){ 8066 if( STRLEN(pEntry->zKey)==nKey && 0==memcmp(pEntry->zKey, zKey, nKey) ){ 8067 return pEntry; 8068 } 8069 } 8070 return 0; 8071 } 8072 8073 /* 8074 ** If the hash table contains an entry with a key equal to the string 8075 ** passed as the final two arguments to this function, return a pointer 8076 ** to the payload string. Otherwise, if zKey/nKey is not present in the 8077 ** hash table, return NULL. 8078 */ 8079 static const char *idxHashSearch(IdxHash *pHash, const char *zKey, int nKey){ 8080 IdxHashEntry *pEntry = idxHashFind(pHash, zKey, nKey); 8081 if( pEntry ) return pEntry->zVal; 8082 return 0; 8083 } 8084 8085 /* 8086 ** Allocate and return a new IdxConstraint object. Set the IdxConstraint.zColl 8087 ** variable to point to a copy of nul-terminated string zColl. 8088 */ 8089 static IdxConstraint *idxNewConstraint(int *pRc, const char *zColl){ 8090 IdxConstraint *pNew; 8091 int nColl = STRLEN(zColl); 8092 8093 assert( *pRc==SQLITE_OK ); 8094 pNew = (IdxConstraint*)idxMalloc(pRc, sizeof(IdxConstraint) * nColl + 1); 8095 if( pNew ){ 8096 pNew->zColl = (char*)&pNew[1]; 8097 memcpy(pNew->zColl, zColl, nColl+1); 8098 } 8099 return pNew; 8100 } 8101 8102 /* 8103 ** An error associated with database handle db has just occurred. Pass 8104 ** the error message to callback function xOut. 8105 */ 8106 static void idxDatabaseError( 8107 sqlite3 *db, /* Database handle */ 8108 char **pzErrmsg /* Write error here */ 8109 ){ 8110 *pzErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(db)); 8111 } 8112 8113 /* 8114 ** Prepare an SQL statement. 8115 */ 8116 static int idxPrepareStmt( 8117 sqlite3 *db, /* Database handle to compile against */ 8118 sqlite3_stmt **ppStmt, /* OUT: Compiled SQL statement */ 8119 char **pzErrmsg, /* OUT: sqlite3_malloc()ed error message */ 8120 const char *zSql /* SQL statement to compile */ 8121 ){ 8122 int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0); 8123 if( rc!=SQLITE_OK ){ 8124 *ppStmt = 0; 8125 idxDatabaseError(db, pzErrmsg); 8126 } 8127 return rc; 8128 } 8129 8130 /* 8131 ** Prepare an SQL statement using the results of a printf() formatting. 8132 */ 8133 static int idxPrintfPrepareStmt( 8134 sqlite3 *db, /* Database handle to compile against */ 8135 sqlite3_stmt **ppStmt, /* OUT: Compiled SQL statement */ 8136 char **pzErrmsg, /* OUT: sqlite3_malloc()ed error message */ 8137 const char *zFmt, /* printf() format of SQL statement */ 8138 ... /* Trailing printf() arguments */ 8139 ){ 8140 va_list ap; 8141 int rc; 8142 char *zSql; 8143 va_start(ap, zFmt); 8144 zSql = sqlite3_vmprintf(zFmt, ap); 8145 if( zSql==0 ){ 8146 rc = SQLITE_NOMEM; 8147 }else{ 8148 rc = idxPrepareStmt(db, ppStmt, pzErrmsg, zSql); 8149 sqlite3_free(zSql); 8150 } 8151 va_end(ap); 8152 return rc; 8153 } 8154 8155 8156 /************************************************************************* 8157 ** Beginning of virtual table implementation. 8158 */ 8159 typedef struct ExpertVtab ExpertVtab; 8160 struct ExpertVtab { 8161 sqlite3_vtab base; 8162 IdxTable *pTab; 8163 sqlite3expert *pExpert; 8164 }; 8165 8166 typedef struct ExpertCsr ExpertCsr; 8167 struct ExpertCsr { 8168 sqlite3_vtab_cursor base; 8169 sqlite3_stmt *pData; 8170 }; 8171 8172 static char *expertDequote(const char *zIn){ 8173 int n = STRLEN(zIn); 8174 char *zRet = sqlite3_malloc(n); 8175 8176 assert( zIn[0]=='\'' ); 8177 assert( zIn[n-1]=='\'' ); 8178 8179 if( zRet ){ 8180 int iOut = 0; 8181 int iIn = 0; 8182 for(iIn=1; iIn<(n-1); iIn++){ 8183 if( zIn[iIn]=='\'' ){ 8184 assert( zIn[iIn+1]=='\'' ); 8185 iIn++; 8186 } 8187 zRet[iOut++] = zIn[iIn]; 8188 } 8189 zRet[iOut] = '\0'; 8190 } 8191 8192 return zRet; 8193 } 8194 8195 /* 8196 ** This function is the implementation of both the xConnect and xCreate 8197 ** methods of the r-tree virtual table. 8198 ** 8199 ** argv[0] -> module name 8200 ** argv[1] -> database name 8201 ** argv[2] -> table name 8202 ** argv[...] -> column names... 8203 */ 8204 static int expertConnect( 8205 sqlite3 *db, 8206 void *pAux, 8207 int argc, const char *const*argv, 8208 sqlite3_vtab **ppVtab, 8209 char **pzErr 8210 ){ 8211 sqlite3expert *pExpert = (sqlite3expert*)pAux; 8212 ExpertVtab *p = 0; 8213 int rc; 8214 8215 if( argc!=4 ){ 8216 *pzErr = sqlite3_mprintf("internal error!"); 8217 rc = SQLITE_ERROR; 8218 }else{ 8219 char *zCreateTable = expertDequote(argv[3]); 8220 if( zCreateTable ){ 8221 rc = sqlite3_declare_vtab(db, zCreateTable); 8222 if( rc==SQLITE_OK ){ 8223 p = idxMalloc(&rc, sizeof(ExpertVtab)); 8224 } 8225 if( rc==SQLITE_OK ){ 8226 p->pExpert = pExpert; 8227 p->pTab = pExpert->pTable; 8228 assert( sqlite3_stricmp(p->pTab->zName, argv[2])==0 ); 8229 } 8230 sqlite3_free(zCreateTable); 8231 }else{ 8232 rc = SQLITE_NOMEM; 8233 } 8234 } 8235 8236 *ppVtab = (sqlite3_vtab*)p; 8237 return rc; 8238 } 8239 8240 static int expertDisconnect(sqlite3_vtab *pVtab){ 8241 ExpertVtab *p = (ExpertVtab*)pVtab; 8242 sqlite3_free(p); 8243 return SQLITE_OK; 8244 } 8245 8246 static int expertBestIndex(sqlite3_vtab *pVtab, sqlite3_index_info *pIdxInfo){ 8247 ExpertVtab *p = (ExpertVtab*)pVtab; 8248 int rc = SQLITE_OK; 8249 int n = 0; 8250 IdxScan *pScan; 8251 const int opmask = 8252 SQLITE_INDEX_CONSTRAINT_EQ | SQLITE_INDEX_CONSTRAINT_GT | 8253 SQLITE_INDEX_CONSTRAINT_LT | SQLITE_INDEX_CONSTRAINT_GE | 8254 SQLITE_INDEX_CONSTRAINT_LE; 8255 8256 pScan = idxMalloc(&rc, sizeof(IdxScan)); 8257 if( pScan ){ 8258 int i; 8259 8260 /* Link the new scan object into the list */ 8261 pScan->pTab = p->pTab; 8262 pScan->pNextScan = p->pExpert->pScan; 8263 p->pExpert->pScan = pScan; 8264 8265 /* Add the constraints to the IdxScan object */ 8266 for(i=0; i<pIdxInfo->nConstraint; i++){ 8267 struct sqlite3_index_constraint *pCons = &pIdxInfo->aConstraint[i]; 8268 if( pCons->usable 8269 && pCons->iColumn>=0 8270 && p->pTab->aCol[pCons->iColumn].iPk==0 8271 && (pCons->op & opmask) 8272 ){ 8273 IdxConstraint *pNew; 8274 const char *zColl = sqlite3_vtab_collation(pIdxInfo, i); 8275 pNew = idxNewConstraint(&rc, zColl); 8276 if( pNew ){ 8277 pNew->iCol = pCons->iColumn; 8278 if( pCons->op==SQLITE_INDEX_CONSTRAINT_EQ ){ 8279 pNew->pNext = pScan->pEq; 8280 pScan->pEq = pNew; 8281 }else{ 8282 pNew->bRange = 1; 8283 pNew->pNext = pScan->pRange; 8284 pScan->pRange = pNew; 8285 } 8286 } 8287 n++; 8288 pIdxInfo->aConstraintUsage[i].argvIndex = n; 8289 } 8290 } 8291 8292 /* Add the ORDER BY to the IdxScan object */ 8293 for(i=pIdxInfo->nOrderBy-1; i>=0; i--){ 8294 int iCol = pIdxInfo->aOrderBy[i].iColumn; 8295 if( iCol>=0 ){ 8296 IdxConstraint *pNew = idxNewConstraint(&rc, p->pTab->aCol[iCol].zColl); 8297 if( pNew ){ 8298 pNew->iCol = iCol; 8299 pNew->bDesc = pIdxInfo->aOrderBy[i].desc; 8300 pNew->pNext = pScan->pOrder; 8301 pNew->pLink = pScan->pOrder; 8302 pScan->pOrder = pNew; 8303 n++; 8304 } 8305 } 8306 } 8307 } 8308 8309 pIdxInfo->estimatedCost = 1000000.0 / (n+1); 8310 return rc; 8311 } 8312 8313 static int expertUpdate( 8314 sqlite3_vtab *pVtab, 8315 int nData, 8316 sqlite3_value **azData, 8317 sqlite_int64 *pRowid 8318 ){ 8319 (void)pVtab; 8320 (void)nData; 8321 (void)azData; 8322 (void)pRowid; 8323 return SQLITE_OK; 8324 } 8325 8326 /* 8327 ** Virtual table module xOpen method. 8328 */ 8329 static int expertOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){ 8330 int rc = SQLITE_OK; 8331 ExpertCsr *pCsr; 8332 (void)pVTab; 8333 pCsr = idxMalloc(&rc, sizeof(ExpertCsr)); 8334 *ppCursor = (sqlite3_vtab_cursor*)pCsr; 8335 return rc; 8336 } 8337 8338 /* 8339 ** Virtual table module xClose method. 8340 */ 8341 static int expertClose(sqlite3_vtab_cursor *cur){ 8342 ExpertCsr *pCsr = (ExpertCsr*)cur; 8343 sqlite3_finalize(pCsr->pData); 8344 sqlite3_free(pCsr); 8345 return SQLITE_OK; 8346 } 8347 8348 /* 8349 ** Virtual table module xEof method. 8350 ** 8351 ** Return non-zero if the cursor does not currently point to a valid 8352 ** record (i.e if the scan has finished), or zero otherwise. 8353 */ 8354 static int expertEof(sqlite3_vtab_cursor *cur){ 8355 ExpertCsr *pCsr = (ExpertCsr*)cur; 8356 return pCsr->pData==0; 8357 } 8358 8359 /* 8360 ** Virtual table module xNext method. 8361 */ 8362 static int expertNext(sqlite3_vtab_cursor *cur){ 8363 ExpertCsr *pCsr = (ExpertCsr*)cur; 8364 int rc = SQLITE_OK; 8365 8366 assert( pCsr->pData ); 8367 rc = sqlite3_step(pCsr->pData); 8368 if( rc!=SQLITE_ROW ){ 8369 rc = sqlite3_finalize(pCsr->pData); 8370 pCsr->pData = 0; 8371 }else{ 8372 rc = SQLITE_OK; 8373 } 8374 8375 return rc; 8376 } 8377 8378 /* 8379 ** Virtual table module xRowid method. 8380 */ 8381 static int expertRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ 8382 (void)cur; 8383 *pRowid = 0; 8384 return SQLITE_OK; 8385 } 8386 8387 /* 8388 ** Virtual table module xColumn method. 8389 */ 8390 static int expertColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){ 8391 ExpertCsr *pCsr = (ExpertCsr*)cur; 8392 sqlite3_value *pVal; 8393 pVal = sqlite3_column_value(pCsr->pData, i); 8394 if( pVal ){ 8395 sqlite3_result_value(ctx, pVal); 8396 } 8397 return SQLITE_OK; 8398 } 8399 8400 /* 8401 ** Virtual table module xFilter method. 8402 */ 8403 static int expertFilter( 8404 sqlite3_vtab_cursor *cur, 8405 int idxNum, const char *idxStr, 8406 int argc, sqlite3_value **argv 8407 ){ 8408 ExpertCsr *pCsr = (ExpertCsr*)cur; 8409 ExpertVtab *pVtab = (ExpertVtab*)(cur->pVtab); 8410 sqlite3expert *pExpert = pVtab->pExpert; 8411 int rc; 8412 8413 (void)idxNum; 8414 (void)idxStr; 8415 (void)argc; 8416 (void)argv; 8417 rc = sqlite3_finalize(pCsr->pData); 8418 pCsr->pData = 0; 8419 if( rc==SQLITE_OK ){ 8420 rc = idxPrintfPrepareStmt(pExpert->db, &pCsr->pData, &pVtab->base.zErrMsg, 8421 "SELECT * FROM main.%Q WHERE sample()", pVtab->pTab->zName 8422 ); 8423 } 8424 8425 if( rc==SQLITE_OK ){ 8426 rc = expertNext(cur); 8427 } 8428 return rc; 8429 } 8430 8431 static int idxRegisterVtab(sqlite3expert *p){ 8432 static sqlite3_module expertModule = { 8433 2, /* iVersion */ 8434 expertConnect, /* xCreate - create a table */ 8435 expertConnect, /* xConnect - connect to an existing table */ 8436 expertBestIndex, /* xBestIndex - Determine search strategy */ 8437 expertDisconnect, /* xDisconnect - Disconnect from a table */ 8438 expertDisconnect, /* xDestroy - Drop a table */ 8439 expertOpen, /* xOpen - open a cursor */ 8440 expertClose, /* xClose - close a cursor */ 8441 expertFilter, /* xFilter - configure scan constraints */ 8442 expertNext, /* xNext - advance a cursor */ 8443 expertEof, /* xEof */ 8444 expertColumn, /* xColumn - read data */ 8445 expertRowid, /* xRowid - read data */ 8446 expertUpdate, /* xUpdate - write data */ 8447 0, /* xBegin - begin transaction */ 8448 0, /* xSync - sync transaction */ 8449 0, /* xCommit - commit transaction */ 8450 0, /* xRollback - rollback transaction */ 8451 0, /* xFindFunction - function overloading */ 8452 0, /* xRename - rename the table */ 8453 0, /* xSavepoint */ 8454 0, /* xRelease */ 8455 0, /* xRollbackTo */ 8456 0, /* xShadowName */ 8457 }; 8458 8459 return sqlite3_create_module(p->dbv, "expert", &expertModule, (void*)p); 8460 } 8461 /* 8462 ** End of virtual table implementation. 8463 *************************************************************************/ 8464 /* 8465 ** Finalize SQL statement pStmt. If (*pRc) is SQLITE_OK when this function 8466 ** is called, set it to the return value of sqlite3_finalize() before 8467 ** returning. Otherwise, discard the sqlite3_finalize() return value. 8468 */ 8469 static void idxFinalize(int *pRc, sqlite3_stmt *pStmt){ 8470 int rc = sqlite3_finalize(pStmt); 8471 if( *pRc==SQLITE_OK ) *pRc = rc; 8472 } 8473 8474 /* 8475 ** Attempt to allocate an IdxTable structure corresponding to table zTab 8476 ** in the main database of connection db. If successful, set (*ppOut) to 8477 ** point to the new object and return SQLITE_OK. Otherwise, return an 8478 ** SQLite error code and set (*ppOut) to NULL. In this case *pzErrmsg may be 8479 ** set to point to an error string. 8480 ** 8481 ** It is the responsibility of the caller to eventually free either the 8482 ** IdxTable object or error message using sqlite3_free(). 8483 */ 8484 static int idxGetTableInfo( 8485 sqlite3 *db, /* Database connection to read details from */ 8486 const char *zTab, /* Table name */ 8487 IdxTable **ppOut, /* OUT: New object (if successful) */ 8488 char **pzErrmsg /* OUT: Error message (if not) */ 8489 ){ 8490 sqlite3_stmt *p1 = 0; 8491 int nCol = 0; 8492 int nTab = STRLEN(zTab); 8493 int nByte = sizeof(IdxTable) + nTab + 1; 8494 IdxTable *pNew = 0; 8495 int rc, rc2; 8496 char *pCsr = 0; 8497 8498 rc = idxPrintfPrepareStmt(db, &p1, pzErrmsg, "PRAGMA table_info=%Q", zTab); 8499 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){ 8500 const char *zCol = (const char*)sqlite3_column_text(p1, 1); 8501 nByte += 1 + STRLEN(zCol); 8502 rc = sqlite3_table_column_metadata( 8503 db, "main", zTab, zCol, 0, &zCol, 0, 0, 0 8504 ); 8505 nByte += 1 + STRLEN(zCol); 8506 nCol++; 8507 } 8508 rc2 = sqlite3_reset(p1); 8509 if( rc==SQLITE_OK ) rc = rc2; 8510 8511 nByte += sizeof(IdxColumn) * nCol; 8512 if( rc==SQLITE_OK ){ 8513 pNew = idxMalloc(&rc, nByte); 8514 } 8515 if( rc==SQLITE_OK ){ 8516 pNew->aCol = (IdxColumn*)&pNew[1]; 8517 pNew->nCol = nCol; 8518 pCsr = (char*)&pNew->aCol[nCol]; 8519 } 8520 8521 nCol = 0; 8522 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){ 8523 const char *zCol = (const char*)sqlite3_column_text(p1, 1); 8524 int nCopy = STRLEN(zCol) + 1; 8525 pNew->aCol[nCol].zName = pCsr; 8526 pNew->aCol[nCol].iPk = sqlite3_column_int(p1, 5); 8527 memcpy(pCsr, zCol, nCopy); 8528 pCsr += nCopy; 8529 8530 rc = sqlite3_table_column_metadata( 8531 db, "main", zTab, zCol, 0, &zCol, 0, 0, 0 8532 ); 8533 if( rc==SQLITE_OK ){ 8534 nCopy = STRLEN(zCol) + 1; 8535 pNew->aCol[nCol].zColl = pCsr; 8536 memcpy(pCsr, zCol, nCopy); 8537 pCsr += nCopy; 8538 } 8539 8540 nCol++; 8541 } 8542 idxFinalize(&rc, p1); 8543 8544 if( rc!=SQLITE_OK ){ 8545 sqlite3_free(pNew); 8546 pNew = 0; 8547 }else{ 8548 pNew->zName = pCsr; 8549 memcpy(pNew->zName, zTab, nTab+1); 8550 } 8551 8552 *ppOut = pNew; 8553 return rc; 8554 } 8555 8556 /* 8557 ** This function is a no-op if *pRc is set to anything other than 8558 ** SQLITE_OK when it is called. 8559 ** 8560 ** If *pRc is initially set to SQLITE_OK, then the text specified by 8561 ** the printf() style arguments is appended to zIn and the result returned 8562 ** in a buffer allocated by sqlite3_malloc(). sqlite3_free() is called on 8563 ** zIn before returning. 8564 */ 8565 static char *idxAppendText(int *pRc, char *zIn, const char *zFmt, ...){ 8566 va_list ap; 8567 char *zAppend = 0; 8568 char *zRet = 0; 8569 int nIn = zIn ? STRLEN(zIn) : 0; 8570 int nAppend = 0; 8571 va_start(ap, zFmt); 8572 if( *pRc==SQLITE_OK ){ 8573 zAppend = sqlite3_vmprintf(zFmt, ap); 8574 if( zAppend ){ 8575 nAppend = STRLEN(zAppend); 8576 zRet = (char*)sqlite3_malloc(nIn + nAppend + 1); 8577 } 8578 if( zAppend && zRet ){ 8579 if( nIn ) memcpy(zRet, zIn, nIn); 8580 memcpy(&zRet[nIn], zAppend, nAppend+1); 8581 }else{ 8582 sqlite3_free(zRet); 8583 zRet = 0; 8584 *pRc = SQLITE_NOMEM; 8585 } 8586 sqlite3_free(zAppend); 8587 sqlite3_free(zIn); 8588 } 8589 va_end(ap); 8590 return zRet; 8591 } 8592 8593 /* 8594 ** Return true if zId must be quoted in order to use it as an SQL 8595 ** identifier, or false otherwise. 8596 */ 8597 static int idxIdentifierRequiresQuotes(const char *zId){ 8598 int i; 8599 for(i=0; zId[i]; i++){ 8600 if( !(zId[i]=='_') 8601 && !(zId[i]>='0' && zId[i]<='9') 8602 && !(zId[i]>='a' && zId[i]<='z') 8603 && !(zId[i]>='A' && zId[i]<='Z') 8604 ){ 8605 return 1; 8606 } 8607 } 8608 return 0; 8609 } 8610 8611 /* 8612 ** This function appends an index column definition suitable for constraint 8613 ** pCons to the string passed as zIn and returns the result. 8614 */ 8615 static char *idxAppendColDefn( 8616 int *pRc, /* IN/OUT: Error code */ 8617 char *zIn, /* Column defn accumulated so far */ 8618 IdxTable *pTab, /* Table index will be created on */ 8619 IdxConstraint *pCons 8620 ){ 8621 char *zRet = zIn; 8622 IdxColumn *p = &pTab->aCol[pCons->iCol]; 8623 if( zRet ) zRet = idxAppendText(pRc, zRet, ", "); 8624 8625 if( idxIdentifierRequiresQuotes(p->zName) ){ 8626 zRet = idxAppendText(pRc, zRet, "%Q", p->zName); 8627 }else{ 8628 zRet = idxAppendText(pRc, zRet, "%s", p->zName); 8629 } 8630 8631 if( sqlite3_stricmp(p->zColl, pCons->zColl) ){ 8632 if( idxIdentifierRequiresQuotes(pCons->zColl) ){ 8633 zRet = idxAppendText(pRc, zRet, " COLLATE %Q", pCons->zColl); 8634 }else{ 8635 zRet = idxAppendText(pRc, zRet, " COLLATE %s", pCons->zColl); 8636 } 8637 } 8638 8639 if( pCons->bDesc ){ 8640 zRet = idxAppendText(pRc, zRet, " DESC"); 8641 } 8642 return zRet; 8643 } 8644 8645 /* 8646 ** Search database dbm for an index compatible with the one idxCreateFromCons() 8647 ** would create from arguments pScan, pEq and pTail. If no error occurs and 8648 ** such an index is found, return non-zero. Or, if no such index is found, 8649 ** return zero. 8650 ** 8651 ** If an error occurs, set *pRc to an SQLite error code and return zero. 8652 */ 8653 static int idxFindCompatible( 8654 int *pRc, /* OUT: Error code */ 8655 sqlite3* dbm, /* Database to search */ 8656 IdxScan *pScan, /* Scan for table to search for index on */ 8657 IdxConstraint *pEq, /* List of == constraints */ 8658 IdxConstraint *pTail /* List of range constraints */ 8659 ){ 8660 const char *zTbl = pScan->pTab->zName; 8661 sqlite3_stmt *pIdxList = 0; 8662 IdxConstraint *pIter; 8663 int nEq = 0; /* Number of elements in pEq */ 8664 int rc; 8665 8666 /* Count the elements in list pEq */ 8667 for(pIter=pEq; pIter; pIter=pIter->pLink) nEq++; 8668 8669 rc = idxPrintfPrepareStmt(dbm, &pIdxList, 0, "PRAGMA index_list=%Q", zTbl); 8670 while( rc==SQLITE_OK && sqlite3_step(pIdxList)==SQLITE_ROW ){ 8671 int bMatch = 1; 8672 IdxConstraint *pT = pTail; 8673 sqlite3_stmt *pInfo = 0; 8674 const char *zIdx = (const char*)sqlite3_column_text(pIdxList, 1); 8675 8676 /* Zero the IdxConstraint.bFlag values in the pEq list */ 8677 for(pIter=pEq; pIter; pIter=pIter->pLink) pIter->bFlag = 0; 8678 8679 rc = idxPrintfPrepareStmt(dbm, &pInfo, 0, "PRAGMA index_xInfo=%Q", zIdx); 8680 while( rc==SQLITE_OK && sqlite3_step(pInfo)==SQLITE_ROW ){ 8681 int iIdx = sqlite3_column_int(pInfo, 0); 8682 int iCol = sqlite3_column_int(pInfo, 1); 8683 const char *zColl = (const char*)sqlite3_column_text(pInfo, 4); 8684 8685 if( iIdx<nEq ){ 8686 for(pIter=pEq; pIter; pIter=pIter->pLink){ 8687 if( pIter->bFlag ) continue; 8688 if( pIter->iCol!=iCol ) continue; 8689 if( sqlite3_stricmp(pIter->zColl, zColl) ) continue; 8690 pIter->bFlag = 1; 8691 break; 8692 } 8693 if( pIter==0 ){ 8694 bMatch = 0; 8695 break; 8696 } 8697 }else{ 8698 if( pT ){ 8699 if( pT->iCol!=iCol || sqlite3_stricmp(pT->zColl, zColl) ){ 8700 bMatch = 0; 8701 break; 8702 } 8703 pT = pT->pLink; 8704 } 8705 } 8706 } 8707 idxFinalize(&rc, pInfo); 8708 8709 if( rc==SQLITE_OK && bMatch ){ 8710 sqlite3_finalize(pIdxList); 8711 return 1; 8712 } 8713 } 8714 idxFinalize(&rc, pIdxList); 8715 8716 *pRc = rc; 8717 return 0; 8718 } 8719 8720 static int idxCreateFromCons( 8721 sqlite3expert *p, 8722 IdxScan *pScan, 8723 IdxConstraint *pEq, 8724 IdxConstraint *pTail 8725 ){ 8726 sqlite3 *dbm = p->dbm; 8727 int rc = SQLITE_OK; 8728 if( (pEq || pTail) && 0==idxFindCompatible(&rc, dbm, pScan, pEq, pTail) ){ 8729 IdxTable *pTab = pScan->pTab; 8730 char *zCols = 0; 8731 char *zIdx = 0; 8732 IdxConstraint *pCons; 8733 unsigned int h = 0; 8734 const char *zFmt; 8735 8736 for(pCons=pEq; pCons; pCons=pCons->pLink){ 8737 zCols = idxAppendColDefn(&rc, zCols, pTab, pCons); 8738 } 8739 for(pCons=pTail; pCons; pCons=pCons->pLink){ 8740 zCols = idxAppendColDefn(&rc, zCols, pTab, pCons); 8741 } 8742 8743 if( rc==SQLITE_OK ){ 8744 /* Hash the list of columns to come up with a name for the index */ 8745 const char *zTable = pScan->pTab->zName; 8746 char *zName; /* Index name */ 8747 int i; 8748 for(i=0; zCols[i]; i++){ 8749 h += ((h<<3) + zCols[i]); 8750 } 8751 zName = sqlite3_mprintf("%s_idx_%08x", zTable, h); 8752 if( zName==0 ){ 8753 rc = SQLITE_NOMEM; 8754 }else{ 8755 if( idxIdentifierRequiresQuotes(zTable) ){ 8756 zFmt = "CREATE INDEX '%q' ON %Q(%s)"; 8757 }else{ 8758 zFmt = "CREATE INDEX %s ON %s(%s)"; 8759 } 8760 zIdx = sqlite3_mprintf(zFmt, zName, zTable, zCols); 8761 if( !zIdx ){ 8762 rc = SQLITE_NOMEM; 8763 }else{ 8764 rc = sqlite3_exec(dbm, zIdx, 0, 0, p->pzErrmsg); 8765 idxHashAdd(&rc, &p->hIdx, zName, zIdx); 8766 } 8767 sqlite3_free(zName); 8768 sqlite3_free(zIdx); 8769 } 8770 } 8771 8772 sqlite3_free(zCols); 8773 } 8774 return rc; 8775 } 8776 8777 /* 8778 ** Return true if list pList (linked by IdxConstraint.pLink) contains 8779 ** a constraint compatible with *p. Otherwise return false. 8780 */ 8781 static int idxFindConstraint(IdxConstraint *pList, IdxConstraint *p){ 8782 IdxConstraint *pCmp; 8783 for(pCmp=pList; pCmp; pCmp=pCmp->pLink){ 8784 if( p->iCol==pCmp->iCol ) return 1; 8785 } 8786 return 0; 8787 } 8788 8789 static int idxCreateFromWhere( 8790 sqlite3expert *p, 8791 IdxScan *pScan, /* Create indexes for this scan */ 8792 IdxConstraint *pTail /* range/ORDER BY constraints for inclusion */ 8793 ){ 8794 IdxConstraint *p1 = 0; 8795 IdxConstraint *pCon; 8796 int rc; 8797 8798 /* Gather up all the == constraints. */ 8799 for(pCon=pScan->pEq; pCon; pCon=pCon->pNext){ 8800 if( !idxFindConstraint(p1, pCon) && !idxFindConstraint(pTail, pCon) ){ 8801 pCon->pLink = p1; 8802 p1 = pCon; 8803 } 8804 } 8805 8806 /* Create an index using the == constraints collected above. And the 8807 ** range constraint/ORDER BY terms passed in by the caller, if any. */ 8808 rc = idxCreateFromCons(p, pScan, p1, pTail); 8809 8810 /* If no range/ORDER BY passed by the caller, create a version of the 8811 ** index for each range constraint. */ 8812 if( pTail==0 ){ 8813 for(pCon=pScan->pRange; rc==SQLITE_OK && pCon; pCon=pCon->pNext){ 8814 assert( pCon->pLink==0 ); 8815 if( !idxFindConstraint(p1, pCon) && !idxFindConstraint(pTail, pCon) ){ 8816 rc = idxCreateFromCons(p, pScan, p1, pCon); 8817 } 8818 } 8819 } 8820 8821 return rc; 8822 } 8823 8824 /* 8825 ** Create candidate indexes in database [dbm] based on the data in 8826 ** linked-list pScan. 8827 */ 8828 static int idxCreateCandidates(sqlite3expert *p){ 8829 int rc = SQLITE_OK; 8830 IdxScan *pIter; 8831 8832 for(pIter=p->pScan; pIter && rc==SQLITE_OK; pIter=pIter->pNextScan){ 8833 rc = idxCreateFromWhere(p, pIter, 0); 8834 if( rc==SQLITE_OK && pIter->pOrder ){ 8835 rc = idxCreateFromWhere(p, pIter, pIter->pOrder); 8836 } 8837 } 8838 8839 return rc; 8840 } 8841 8842 /* 8843 ** Free all elements of the linked list starting at pConstraint. 8844 */ 8845 static void idxConstraintFree(IdxConstraint *pConstraint){ 8846 IdxConstraint *pNext; 8847 IdxConstraint *p; 8848 8849 for(p=pConstraint; p; p=pNext){ 8850 pNext = p->pNext; 8851 sqlite3_free(p); 8852 } 8853 } 8854 8855 /* 8856 ** Free all elements of the linked list starting from pScan up until pLast 8857 ** (pLast is not freed). 8858 */ 8859 static void idxScanFree(IdxScan *pScan, IdxScan *pLast){ 8860 IdxScan *p; 8861 IdxScan *pNext; 8862 for(p=pScan; p!=pLast; p=pNext){ 8863 pNext = p->pNextScan; 8864 idxConstraintFree(p->pOrder); 8865 idxConstraintFree(p->pEq); 8866 idxConstraintFree(p->pRange); 8867 sqlite3_free(p); 8868 } 8869 } 8870 8871 /* 8872 ** Free all elements of the linked list starting from pStatement up 8873 ** until pLast (pLast is not freed). 8874 */ 8875 static void idxStatementFree(IdxStatement *pStatement, IdxStatement *pLast){ 8876 IdxStatement *p; 8877 IdxStatement *pNext; 8878 for(p=pStatement; p!=pLast; p=pNext){ 8879 pNext = p->pNext; 8880 sqlite3_free(p->zEQP); 8881 sqlite3_free(p->zIdx); 8882 sqlite3_free(p); 8883 } 8884 } 8885 8886 /* 8887 ** Free the linked list of IdxTable objects starting at pTab. 8888 */ 8889 static void idxTableFree(IdxTable *pTab){ 8890 IdxTable *pIter; 8891 IdxTable *pNext; 8892 for(pIter=pTab; pIter; pIter=pNext){ 8893 pNext = pIter->pNext; 8894 sqlite3_free(pIter); 8895 } 8896 } 8897 8898 /* 8899 ** Free the linked list of IdxWrite objects starting at pTab. 8900 */ 8901 static void idxWriteFree(IdxWrite *pTab){ 8902 IdxWrite *pIter; 8903 IdxWrite *pNext; 8904 for(pIter=pTab; pIter; pIter=pNext){ 8905 pNext = pIter->pNext; 8906 sqlite3_free(pIter); 8907 } 8908 } 8909 8910 8911 8912 /* 8913 ** This function is called after candidate indexes have been created. It 8914 ** runs all the queries to see which indexes they prefer, and populates 8915 ** IdxStatement.zIdx and IdxStatement.zEQP with the results. 8916 */ 8917 int idxFindIndexes( 8918 sqlite3expert *p, 8919 char **pzErr /* OUT: Error message (sqlite3_malloc) */ 8920 ){ 8921 IdxStatement *pStmt; 8922 sqlite3 *dbm = p->dbm; 8923 int rc = SQLITE_OK; 8924 8925 IdxHash hIdx; 8926 idxHashInit(&hIdx); 8927 8928 for(pStmt=p->pStatement; rc==SQLITE_OK && pStmt; pStmt=pStmt->pNext){ 8929 IdxHashEntry *pEntry; 8930 sqlite3_stmt *pExplain = 0; 8931 idxHashClear(&hIdx); 8932 rc = idxPrintfPrepareStmt(dbm, &pExplain, pzErr, 8933 "EXPLAIN QUERY PLAN %s", pStmt->zSql 8934 ); 8935 while( rc==SQLITE_OK && sqlite3_step(pExplain)==SQLITE_ROW ){ 8936 /* int iId = sqlite3_column_int(pExplain, 0); */ 8937 /* int iParent = sqlite3_column_int(pExplain, 1); */ 8938 /* int iNotUsed = sqlite3_column_int(pExplain, 2); */ 8939 const char *zDetail = (const char*)sqlite3_column_text(pExplain, 3); 8940 int nDetail; 8941 int i; 8942 8943 if( !zDetail ) continue; 8944 nDetail = STRLEN(zDetail); 8945 8946 for(i=0; i<nDetail; i++){ 8947 const char *zIdx = 0; 8948 if( i+13<nDetail && memcmp(&zDetail[i], " USING INDEX ", 13)==0 ){ 8949 zIdx = &zDetail[i+13]; 8950 }else if( i+22<nDetail 8951 && memcmp(&zDetail[i], " USING COVERING INDEX ", 22)==0 8952 ){ 8953 zIdx = &zDetail[i+22]; 8954 } 8955 if( zIdx ){ 8956 const char *zSql; 8957 int nIdx = 0; 8958 while( zIdx[nIdx]!='\0' && (zIdx[nIdx]!=' ' || zIdx[nIdx+1]!='(') ){ 8959 nIdx++; 8960 } 8961 zSql = idxHashSearch(&p->hIdx, zIdx, nIdx); 8962 if( zSql ){ 8963 idxHashAdd(&rc, &hIdx, zSql, 0); 8964 if( rc ) goto find_indexes_out; 8965 } 8966 break; 8967 } 8968 } 8969 8970 if( zDetail[0]!='-' ){ 8971 pStmt->zEQP = idxAppendText(&rc, pStmt->zEQP, "%s\n", zDetail); 8972 } 8973 } 8974 8975 for(pEntry=hIdx.pFirst; pEntry; pEntry=pEntry->pNext){ 8976 pStmt->zIdx = idxAppendText(&rc, pStmt->zIdx, "%s;\n", pEntry->zKey); 8977 } 8978 8979 idxFinalize(&rc, pExplain); 8980 } 8981 8982 find_indexes_out: 8983 idxHashClear(&hIdx); 8984 return rc; 8985 } 8986 8987 static int idxAuthCallback( 8988 void *pCtx, 8989 int eOp, 8990 const char *z3, 8991 const char *z4, 8992 const char *zDb, 8993 const char *zTrigger 8994 ){ 8995 int rc = SQLITE_OK; 8996 (void)z4; 8997 (void)zTrigger; 8998 if( eOp==SQLITE_INSERT || eOp==SQLITE_UPDATE || eOp==SQLITE_DELETE ){ 8999 if( sqlite3_stricmp(zDb, "main")==0 ){ 9000 sqlite3expert *p = (sqlite3expert*)pCtx; 9001 IdxTable *pTab; 9002 for(pTab=p->pTable; pTab; pTab=pTab->pNext){ 9003 if( 0==sqlite3_stricmp(z3, pTab->zName) ) break; 9004 } 9005 if( pTab ){ 9006 IdxWrite *pWrite; 9007 for(pWrite=p->pWrite; pWrite; pWrite=pWrite->pNext){ 9008 if( pWrite->pTab==pTab && pWrite->eOp==eOp ) break; 9009 } 9010 if( pWrite==0 ){ 9011 pWrite = idxMalloc(&rc, sizeof(IdxWrite)); 9012 if( rc==SQLITE_OK ){ 9013 pWrite->pTab = pTab; 9014 pWrite->eOp = eOp; 9015 pWrite->pNext = p->pWrite; 9016 p->pWrite = pWrite; 9017 } 9018 } 9019 } 9020 } 9021 } 9022 return rc; 9023 } 9024 9025 static int idxProcessOneTrigger( 9026 sqlite3expert *p, 9027 IdxWrite *pWrite, 9028 char **pzErr 9029 ){ 9030 static const char *zInt = UNIQUE_TABLE_NAME; 9031 static const char *zDrop = "DROP TABLE " UNIQUE_TABLE_NAME; 9032 IdxTable *pTab = pWrite->pTab; 9033 const char *zTab = pTab->zName; 9034 const char *zSql = 9035 "SELECT 'CREATE TEMP' || substr(sql, 7) FROM sqlite_schema " 9036 "WHERE tbl_name = %Q AND type IN ('table', 'trigger') " 9037 "ORDER BY type;"; 9038 sqlite3_stmt *pSelect = 0; 9039 int rc = SQLITE_OK; 9040 char *zWrite = 0; 9041 9042 /* Create the table and its triggers in the temp schema */ 9043 rc = idxPrintfPrepareStmt(p->db, &pSelect, pzErr, zSql, zTab, zTab); 9044 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSelect) ){ 9045 const char *zCreate = (const char*)sqlite3_column_text(pSelect, 0); 9046 rc = sqlite3_exec(p->dbv, zCreate, 0, 0, pzErr); 9047 } 9048 idxFinalize(&rc, pSelect); 9049 9050 /* Rename the table in the temp schema to zInt */ 9051 if( rc==SQLITE_OK ){ 9052 char *z = sqlite3_mprintf("ALTER TABLE temp.%Q RENAME TO %Q", zTab, zInt); 9053 if( z==0 ){ 9054 rc = SQLITE_NOMEM; 9055 }else{ 9056 rc = sqlite3_exec(p->dbv, z, 0, 0, pzErr); 9057 sqlite3_free(z); 9058 } 9059 } 9060 9061 switch( pWrite->eOp ){ 9062 case SQLITE_INSERT: { 9063 int i; 9064 zWrite = idxAppendText(&rc, zWrite, "INSERT INTO %Q VALUES(", zInt); 9065 for(i=0; i<pTab->nCol; i++){ 9066 zWrite = idxAppendText(&rc, zWrite, "%s?", i==0 ? "" : ", "); 9067 } 9068 zWrite = idxAppendText(&rc, zWrite, ")"); 9069 break; 9070 } 9071 case SQLITE_UPDATE: { 9072 int i; 9073 zWrite = idxAppendText(&rc, zWrite, "UPDATE %Q SET ", zInt); 9074 for(i=0; i<pTab->nCol; i++){ 9075 zWrite = idxAppendText(&rc, zWrite, "%s%Q=?", i==0 ? "" : ", ", 9076 pTab->aCol[i].zName 9077 ); 9078 } 9079 break; 9080 } 9081 default: { 9082 assert( pWrite->eOp==SQLITE_DELETE ); 9083 if( rc==SQLITE_OK ){ 9084 zWrite = sqlite3_mprintf("DELETE FROM %Q", zInt); 9085 if( zWrite==0 ) rc = SQLITE_NOMEM; 9086 } 9087 } 9088 } 9089 9090 if( rc==SQLITE_OK ){ 9091 sqlite3_stmt *pX = 0; 9092 rc = sqlite3_prepare_v2(p->dbv, zWrite, -1, &pX, 0); 9093 idxFinalize(&rc, pX); 9094 if( rc!=SQLITE_OK ){ 9095 idxDatabaseError(p->dbv, pzErr); 9096 } 9097 } 9098 sqlite3_free(zWrite); 9099 9100 if( rc==SQLITE_OK ){ 9101 rc = sqlite3_exec(p->dbv, zDrop, 0, 0, pzErr); 9102 } 9103 9104 return rc; 9105 } 9106 9107 static int idxProcessTriggers(sqlite3expert *p, char **pzErr){ 9108 int rc = SQLITE_OK; 9109 IdxWrite *pEnd = 0; 9110 IdxWrite *pFirst = p->pWrite; 9111 9112 while( rc==SQLITE_OK && pFirst!=pEnd ){ 9113 IdxWrite *pIter; 9114 for(pIter=pFirst; rc==SQLITE_OK && pIter!=pEnd; pIter=pIter->pNext){ 9115 rc = idxProcessOneTrigger(p, pIter, pzErr); 9116 } 9117 pEnd = pFirst; 9118 pFirst = p->pWrite; 9119 } 9120 9121 return rc; 9122 } 9123 9124 9125 static int idxCreateVtabSchema(sqlite3expert *p, char **pzErrmsg){ 9126 int rc = idxRegisterVtab(p); 9127 sqlite3_stmt *pSchema = 0; 9128 9129 /* For each table in the main db schema: 9130 ** 9131 ** 1) Add an entry to the p->pTable list, and 9132 ** 2) Create the equivalent virtual table in dbv. 9133 */ 9134 rc = idxPrepareStmt(p->db, &pSchema, pzErrmsg, 9135 "SELECT type, name, sql, 1 FROM sqlite_schema " 9136 "WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%%' " 9137 " UNION ALL " 9138 "SELECT type, name, sql, 2 FROM sqlite_schema " 9139 "WHERE type = 'trigger'" 9140 " AND tbl_name IN(SELECT name FROM sqlite_schema WHERE type = 'view') " 9141 "ORDER BY 4, 1" 9142 ); 9143 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSchema) ){ 9144 const char *zType = (const char*)sqlite3_column_text(pSchema, 0); 9145 const char *zName = (const char*)sqlite3_column_text(pSchema, 1); 9146 const char *zSql = (const char*)sqlite3_column_text(pSchema, 2); 9147 9148 if( zType[0]=='v' || zType[1]=='r' ){ 9149 rc = sqlite3_exec(p->dbv, zSql, 0, 0, pzErrmsg); 9150 }else{ 9151 IdxTable *pTab; 9152 rc = idxGetTableInfo(p->db, zName, &pTab, pzErrmsg); 9153 if( rc==SQLITE_OK ){ 9154 int i; 9155 char *zInner = 0; 9156 char *zOuter = 0; 9157 pTab->pNext = p->pTable; 9158 p->pTable = pTab; 9159 9160 /* The statement the vtab will pass to sqlite3_declare_vtab() */ 9161 zInner = idxAppendText(&rc, 0, "CREATE TABLE x("); 9162 for(i=0; i<pTab->nCol; i++){ 9163 zInner = idxAppendText(&rc, zInner, "%s%Q COLLATE %s", 9164 (i==0 ? "" : ", "), pTab->aCol[i].zName, pTab->aCol[i].zColl 9165 ); 9166 } 9167 zInner = idxAppendText(&rc, zInner, ")"); 9168 9169 /* The CVT statement to create the vtab */ 9170 zOuter = idxAppendText(&rc, 0, 9171 "CREATE VIRTUAL TABLE %Q USING expert(%Q)", zName, zInner 9172 ); 9173 if( rc==SQLITE_OK ){ 9174 rc = sqlite3_exec(p->dbv, zOuter, 0, 0, pzErrmsg); 9175 } 9176 sqlite3_free(zInner); 9177 sqlite3_free(zOuter); 9178 } 9179 } 9180 } 9181 idxFinalize(&rc, pSchema); 9182 return rc; 9183 } 9184 9185 struct IdxSampleCtx { 9186 int iTarget; 9187 double target; /* Target nRet/nRow value */ 9188 double nRow; /* Number of rows seen */ 9189 double nRet; /* Number of rows returned */ 9190 }; 9191 9192 static void idxSampleFunc( 9193 sqlite3_context *pCtx, 9194 int argc, 9195 sqlite3_value **argv 9196 ){ 9197 struct IdxSampleCtx *p = (struct IdxSampleCtx*)sqlite3_user_data(pCtx); 9198 int bRet; 9199 9200 (void)argv; 9201 assert( argc==0 ); 9202 if( p->nRow==0.0 ){ 9203 bRet = 1; 9204 }else{ 9205 bRet = (p->nRet / p->nRow) <= p->target; 9206 if( bRet==0 ){ 9207 unsigned short rnd; 9208 sqlite3_randomness(2, (void*)&rnd); 9209 bRet = ((int)rnd % 100) <= p->iTarget; 9210 } 9211 } 9212 9213 sqlite3_result_int(pCtx, bRet); 9214 p->nRow += 1.0; 9215 p->nRet += (double)bRet; 9216 } 9217 9218 struct IdxRemCtx { 9219 int nSlot; 9220 struct IdxRemSlot { 9221 int eType; /* SQLITE_NULL, INTEGER, REAL, TEXT, BLOB */ 9222 i64 iVal; /* SQLITE_INTEGER value */ 9223 double rVal; /* SQLITE_FLOAT value */ 9224 int nByte; /* Bytes of space allocated at z */ 9225 int n; /* Size of buffer z */ 9226 char *z; /* SQLITE_TEXT/BLOB value */ 9227 } aSlot[1]; 9228 }; 9229 9230 /* 9231 ** Implementation of scalar function rem(). 9232 */ 9233 static void idxRemFunc( 9234 sqlite3_context *pCtx, 9235 int argc, 9236 sqlite3_value **argv 9237 ){ 9238 struct IdxRemCtx *p = (struct IdxRemCtx*)sqlite3_user_data(pCtx); 9239 struct IdxRemSlot *pSlot; 9240 int iSlot; 9241 assert( argc==2 ); 9242 9243 iSlot = sqlite3_value_int(argv[0]); 9244 assert( iSlot<=p->nSlot ); 9245 pSlot = &p->aSlot[iSlot]; 9246 9247 switch( pSlot->eType ){ 9248 case SQLITE_NULL: 9249 /* no-op */ 9250 break; 9251 9252 case SQLITE_INTEGER: 9253 sqlite3_result_int64(pCtx, pSlot->iVal); 9254 break; 9255 9256 case SQLITE_FLOAT: 9257 sqlite3_result_double(pCtx, pSlot->rVal); 9258 break; 9259 9260 case SQLITE_BLOB: 9261 sqlite3_result_blob(pCtx, pSlot->z, pSlot->n, SQLITE_TRANSIENT); 9262 break; 9263 9264 case SQLITE_TEXT: 9265 sqlite3_result_text(pCtx, pSlot->z, pSlot->n, SQLITE_TRANSIENT); 9266 break; 9267 } 9268 9269 pSlot->eType = sqlite3_value_type(argv[1]); 9270 switch( pSlot->eType ){ 9271 case SQLITE_NULL: 9272 /* no-op */ 9273 break; 9274 9275 case SQLITE_INTEGER: 9276 pSlot->iVal = sqlite3_value_int64(argv[1]); 9277 break; 9278 9279 case SQLITE_FLOAT: 9280 pSlot->rVal = sqlite3_value_double(argv[1]); 9281 break; 9282 9283 case SQLITE_BLOB: 9284 case SQLITE_TEXT: { 9285 int nByte = sqlite3_value_bytes(argv[1]); 9286 if( nByte>pSlot->nByte ){ 9287 char *zNew = (char*)sqlite3_realloc(pSlot->z, nByte*2); 9288 if( zNew==0 ){ 9289 sqlite3_result_error_nomem(pCtx); 9290 return; 9291 } 9292 pSlot->nByte = nByte*2; 9293 pSlot->z = zNew; 9294 } 9295 pSlot->n = nByte; 9296 if( pSlot->eType==SQLITE_BLOB ){ 9297 memcpy(pSlot->z, sqlite3_value_blob(argv[1]), nByte); 9298 }else{ 9299 memcpy(pSlot->z, sqlite3_value_text(argv[1]), nByte); 9300 } 9301 break; 9302 } 9303 } 9304 } 9305 9306 static int idxLargestIndex(sqlite3 *db, int *pnMax, char **pzErr){ 9307 int rc = SQLITE_OK; 9308 const char *zMax = 9309 "SELECT max(i.seqno) FROM " 9310 " sqlite_schema AS s, " 9311 " pragma_index_list(s.name) AS l, " 9312 " pragma_index_info(l.name) AS i " 9313 "WHERE s.type = 'table'"; 9314 sqlite3_stmt *pMax = 0; 9315 9316 *pnMax = 0; 9317 rc = idxPrepareStmt(db, &pMax, pzErr, zMax); 9318 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pMax) ){ 9319 *pnMax = sqlite3_column_int(pMax, 0) + 1; 9320 } 9321 idxFinalize(&rc, pMax); 9322 9323 return rc; 9324 } 9325 9326 static int idxPopulateOneStat1( 9327 sqlite3expert *p, 9328 sqlite3_stmt *pIndexXInfo, 9329 sqlite3_stmt *pWriteStat, 9330 const char *zTab, 9331 const char *zIdx, 9332 char **pzErr 9333 ){ 9334 char *zCols = 0; 9335 char *zOrder = 0; 9336 char *zQuery = 0; 9337 int nCol = 0; 9338 int i; 9339 sqlite3_stmt *pQuery = 0; 9340 int *aStat = 0; 9341 int rc = SQLITE_OK; 9342 9343 assert( p->iSample>0 ); 9344 9345 /* Formulate the query text */ 9346 sqlite3_bind_text(pIndexXInfo, 1, zIdx, -1, SQLITE_STATIC); 9347 while( SQLITE_OK==rc && SQLITE_ROW==sqlite3_step(pIndexXInfo) ){ 9348 const char *zComma = zCols==0 ? "" : ", "; 9349 const char *zName = (const char*)sqlite3_column_text(pIndexXInfo, 0); 9350 const char *zColl = (const char*)sqlite3_column_text(pIndexXInfo, 1); 9351 zCols = idxAppendText(&rc, zCols, 9352 "%sx.%Q IS rem(%d, x.%Q) COLLATE %s", zComma, zName, nCol, zName, zColl 9353 ); 9354 zOrder = idxAppendText(&rc, zOrder, "%s%d", zComma, ++nCol); 9355 } 9356 sqlite3_reset(pIndexXInfo); 9357 if( rc==SQLITE_OK ){ 9358 if( p->iSample==100 ){ 9359 zQuery = sqlite3_mprintf( 9360 "SELECT %s FROM %Q x ORDER BY %s", zCols, zTab, zOrder 9361 ); 9362 }else{ 9363 zQuery = sqlite3_mprintf( 9364 "SELECT %s FROM temp."UNIQUE_TABLE_NAME" x ORDER BY %s", zCols, zOrder 9365 ); 9366 } 9367 } 9368 sqlite3_free(zCols); 9369 sqlite3_free(zOrder); 9370 9371 /* Formulate the query text */ 9372 if( rc==SQLITE_OK ){ 9373 sqlite3 *dbrem = (p->iSample==100 ? p->db : p->dbv); 9374 rc = idxPrepareStmt(dbrem, &pQuery, pzErr, zQuery); 9375 } 9376 sqlite3_free(zQuery); 9377 9378 if( rc==SQLITE_OK ){ 9379 aStat = (int*)idxMalloc(&rc, sizeof(int)*(nCol+1)); 9380 } 9381 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pQuery) ){ 9382 IdxHashEntry *pEntry; 9383 char *zStat = 0; 9384 for(i=0; i<=nCol; i++) aStat[i] = 1; 9385 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pQuery) ){ 9386 aStat[0]++; 9387 for(i=0; i<nCol; i++){ 9388 if( sqlite3_column_int(pQuery, i)==0 ) break; 9389 } 9390 for(/*no-op*/; i<nCol; i++){ 9391 aStat[i+1]++; 9392 } 9393 } 9394 9395 if( rc==SQLITE_OK ){ 9396 int s0 = aStat[0]; 9397 zStat = sqlite3_mprintf("%d", s0); 9398 if( zStat==0 ) rc = SQLITE_NOMEM; 9399 for(i=1; rc==SQLITE_OK && i<=nCol; i++){ 9400 zStat = idxAppendText(&rc, zStat, " %d", (s0+aStat[i]/2) / aStat[i]); 9401 } 9402 } 9403 9404 if( rc==SQLITE_OK ){ 9405 sqlite3_bind_text(pWriteStat, 1, zTab, -1, SQLITE_STATIC); 9406 sqlite3_bind_text(pWriteStat, 2, zIdx, -1, SQLITE_STATIC); 9407 sqlite3_bind_text(pWriteStat, 3, zStat, -1, SQLITE_STATIC); 9408 sqlite3_step(pWriteStat); 9409 rc = sqlite3_reset(pWriteStat); 9410 } 9411 9412 pEntry = idxHashFind(&p->hIdx, zIdx, STRLEN(zIdx)); 9413 if( pEntry ){ 9414 assert( pEntry->zVal2==0 ); 9415 pEntry->zVal2 = zStat; 9416 }else{ 9417 sqlite3_free(zStat); 9418 } 9419 } 9420 sqlite3_free(aStat); 9421 idxFinalize(&rc, pQuery); 9422 9423 return rc; 9424 } 9425 9426 static int idxBuildSampleTable(sqlite3expert *p, const char *zTab){ 9427 int rc; 9428 char *zSql; 9429 9430 rc = sqlite3_exec(p->dbv,"DROP TABLE IF EXISTS temp."UNIQUE_TABLE_NAME,0,0,0); 9431 if( rc!=SQLITE_OK ) return rc; 9432 9433 zSql = sqlite3_mprintf( 9434 "CREATE TABLE temp." UNIQUE_TABLE_NAME " AS SELECT * FROM %Q", zTab 9435 ); 9436 if( zSql==0 ) return SQLITE_NOMEM; 9437 rc = sqlite3_exec(p->dbv, zSql, 0, 0, 0); 9438 sqlite3_free(zSql); 9439 9440 return rc; 9441 } 9442 9443 /* 9444 ** This function is called as part of sqlite3_expert_analyze(). Candidate 9445 ** indexes have already been created in database sqlite3expert.dbm, this 9446 ** function populates sqlite_stat1 table in the same database. 9447 ** 9448 ** The stat1 data is generated by querying the 9449 */ 9450 static int idxPopulateStat1(sqlite3expert *p, char **pzErr){ 9451 int rc = SQLITE_OK; 9452 int nMax =0; 9453 struct IdxRemCtx *pCtx = 0; 9454 struct IdxSampleCtx samplectx; 9455 int i; 9456 i64 iPrev = -100000; 9457 sqlite3_stmt *pAllIndex = 0; 9458 sqlite3_stmt *pIndexXInfo = 0; 9459 sqlite3_stmt *pWrite = 0; 9460 9461 const char *zAllIndex = 9462 "SELECT s.rowid, s.name, l.name FROM " 9463 " sqlite_schema AS s, " 9464 " pragma_index_list(s.name) AS l " 9465 "WHERE s.type = 'table'"; 9466 const char *zIndexXInfo = 9467 "SELECT name, coll FROM pragma_index_xinfo(?) WHERE key"; 9468 const char *zWrite = "INSERT INTO sqlite_stat1 VALUES(?, ?, ?)"; 9469 9470 /* If iSample==0, no sqlite_stat1 data is required. */ 9471 if( p->iSample==0 ) return SQLITE_OK; 9472 9473 rc = idxLargestIndex(p->dbm, &nMax, pzErr); 9474 if( nMax<=0 || rc!=SQLITE_OK ) return rc; 9475 9476 rc = sqlite3_exec(p->dbm, "ANALYZE; PRAGMA writable_schema=1", 0, 0, 0); 9477 9478 if( rc==SQLITE_OK ){ 9479 int nByte = sizeof(struct IdxRemCtx) + (sizeof(struct IdxRemSlot) * nMax); 9480 pCtx = (struct IdxRemCtx*)idxMalloc(&rc, nByte); 9481 } 9482 9483 if( rc==SQLITE_OK ){ 9484 sqlite3 *dbrem = (p->iSample==100 ? p->db : p->dbv); 9485 rc = sqlite3_create_function( 9486 dbrem, "rem", 2, SQLITE_UTF8, (void*)pCtx, idxRemFunc, 0, 0 9487 ); 9488 } 9489 if( rc==SQLITE_OK ){ 9490 rc = sqlite3_create_function( 9491 p->db, "sample", 0, SQLITE_UTF8, (void*)&samplectx, idxSampleFunc, 0, 0 9492 ); 9493 } 9494 9495 if( rc==SQLITE_OK ){ 9496 pCtx->nSlot = nMax+1; 9497 rc = idxPrepareStmt(p->dbm, &pAllIndex, pzErr, zAllIndex); 9498 } 9499 if( rc==SQLITE_OK ){ 9500 rc = idxPrepareStmt(p->dbm, &pIndexXInfo, pzErr, zIndexXInfo); 9501 } 9502 if( rc==SQLITE_OK ){ 9503 rc = idxPrepareStmt(p->dbm, &pWrite, pzErr, zWrite); 9504 } 9505 9506 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pAllIndex) ){ 9507 i64 iRowid = sqlite3_column_int64(pAllIndex, 0); 9508 const char *zTab = (const char*)sqlite3_column_text(pAllIndex, 1); 9509 const char *zIdx = (const char*)sqlite3_column_text(pAllIndex, 2); 9510 if( p->iSample<100 && iPrev!=iRowid ){ 9511 samplectx.target = (double)p->iSample / 100.0; 9512 samplectx.iTarget = p->iSample; 9513 samplectx.nRow = 0.0; 9514 samplectx.nRet = 0.0; 9515 rc = idxBuildSampleTable(p, zTab); 9516 if( rc!=SQLITE_OK ) break; 9517 } 9518 rc = idxPopulateOneStat1(p, pIndexXInfo, pWrite, zTab, zIdx, pzErr); 9519 iPrev = iRowid; 9520 } 9521 if( rc==SQLITE_OK && p->iSample<100 ){ 9522 rc = sqlite3_exec(p->dbv, 9523 "DROP TABLE IF EXISTS temp." UNIQUE_TABLE_NAME, 0,0,0 9524 ); 9525 } 9526 9527 idxFinalize(&rc, pAllIndex); 9528 idxFinalize(&rc, pIndexXInfo); 9529 idxFinalize(&rc, pWrite); 9530 9531 for(i=0; i<pCtx->nSlot; i++){ 9532 sqlite3_free(pCtx->aSlot[i].z); 9533 } 9534 sqlite3_free(pCtx); 9535 9536 if( rc==SQLITE_OK ){ 9537 rc = sqlite3_exec(p->dbm, "ANALYZE sqlite_schema", 0, 0, 0); 9538 } 9539 9540 sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp."UNIQUE_TABLE_NAME,0,0,0); 9541 return rc; 9542 } 9543 9544 /* 9545 ** Allocate a new sqlite3expert object. 9546 */ 9547 sqlite3expert *sqlite3_expert_new(sqlite3 *db, char **pzErrmsg){ 9548 int rc = SQLITE_OK; 9549 sqlite3expert *pNew; 9550 9551 pNew = (sqlite3expert*)idxMalloc(&rc, sizeof(sqlite3expert)); 9552 9553 /* Open two in-memory databases to work with. The "vtab database" (dbv) 9554 ** will contain a virtual table corresponding to each real table in 9555 ** the user database schema, and a copy of each view. It is used to 9556 ** collect information regarding the WHERE, ORDER BY and other clauses 9557 ** of the user's query. 9558 */ 9559 if( rc==SQLITE_OK ){ 9560 pNew->db = db; 9561 pNew->iSample = 100; 9562 rc = sqlite3_open(":memory:", &pNew->dbv); 9563 } 9564 if( rc==SQLITE_OK ){ 9565 rc = sqlite3_open(":memory:", &pNew->dbm); 9566 if( rc==SQLITE_OK ){ 9567 sqlite3_db_config(pNew->dbm, SQLITE_DBCONFIG_TRIGGER_EQP, 1, (int*)0); 9568 } 9569 } 9570 9571 9572 /* Copy the entire schema of database [db] into [dbm]. */ 9573 if( rc==SQLITE_OK ){ 9574 sqlite3_stmt *pSql; 9575 rc = idxPrintfPrepareStmt(pNew->db, &pSql, pzErrmsg, 9576 "SELECT sql FROM sqlite_schema WHERE name NOT LIKE 'sqlite_%%'" 9577 " AND sql NOT LIKE 'CREATE VIRTUAL %%'" 9578 ); 9579 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){ 9580 const char *zSql = (const char*)sqlite3_column_text(pSql, 0); 9581 rc = sqlite3_exec(pNew->dbm, zSql, 0, 0, pzErrmsg); 9582 } 9583 idxFinalize(&rc, pSql); 9584 } 9585 9586 /* Create the vtab schema */ 9587 if( rc==SQLITE_OK ){ 9588 rc = idxCreateVtabSchema(pNew, pzErrmsg); 9589 } 9590 9591 /* Register the auth callback with dbv */ 9592 if( rc==SQLITE_OK ){ 9593 sqlite3_set_authorizer(pNew->dbv, idxAuthCallback, (void*)pNew); 9594 } 9595 9596 /* If an error has occurred, free the new object and reutrn NULL. Otherwise, 9597 ** return the new sqlite3expert handle. */ 9598 if( rc!=SQLITE_OK ){ 9599 sqlite3_expert_destroy(pNew); 9600 pNew = 0; 9601 } 9602 return pNew; 9603 } 9604 9605 /* 9606 ** Configure an sqlite3expert object. 9607 */ 9608 int sqlite3_expert_config(sqlite3expert *p, int op, ...){ 9609 int rc = SQLITE_OK; 9610 va_list ap; 9611 va_start(ap, op); 9612 switch( op ){ 9613 case EXPERT_CONFIG_SAMPLE: { 9614 int iVal = va_arg(ap, int); 9615 if( iVal<0 ) iVal = 0; 9616 if( iVal>100 ) iVal = 100; 9617 p->iSample = iVal; 9618 break; 9619 } 9620 default: 9621 rc = SQLITE_NOTFOUND; 9622 break; 9623 } 9624 9625 va_end(ap); 9626 return rc; 9627 } 9628 9629 /* 9630 ** Add an SQL statement to the analysis. 9631 */ 9632 int sqlite3_expert_sql( 9633 sqlite3expert *p, /* From sqlite3_expert_new() */ 9634 const char *zSql, /* SQL statement to add */ 9635 char **pzErr /* OUT: Error message (if any) */ 9636 ){ 9637 IdxScan *pScanOrig = p->pScan; 9638 IdxStatement *pStmtOrig = p->pStatement; 9639 int rc = SQLITE_OK; 9640 const char *zStmt = zSql; 9641 9642 if( p->bRun ) return SQLITE_MISUSE; 9643 9644 while( rc==SQLITE_OK && zStmt && zStmt[0] ){ 9645 sqlite3_stmt *pStmt = 0; 9646 rc = sqlite3_prepare_v2(p->dbv, zStmt, -1, &pStmt, &zStmt); 9647 if( rc==SQLITE_OK ){ 9648 if( pStmt ){ 9649 IdxStatement *pNew; 9650 const char *z = sqlite3_sql(pStmt); 9651 int n = STRLEN(z); 9652 pNew = (IdxStatement*)idxMalloc(&rc, sizeof(IdxStatement) + n+1); 9653 if( rc==SQLITE_OK ){ 9654 pNew->zSql = (char*)&pNew[1]; 9655 memcpy(pNew->zSql, z, n+1); 9656 pNew->pNext = p->pStatement; 9657 if( p->pStatement ) pNew->iId = p->pStatement->iId+1; 9658 p->pStatement = pNew; 9659 } 9660 sqlite3_finalize(pStmt); 9661 } 9662 }else{ 9663 idxDatabaseError(p->dbv, pzErr); 9664 } 9665 } 9666 9667 if( rc!=SQLITE_OK ){ 9668 idxScanFree(p->pScan, pScanOrig); 9669 idxStatementFree(p->pStatement, pStmtOrig); 9670 p->pScan = pScanOrig; 9671 p->pStatement = pStmtOrig; 9672 } 9673 9674 return rc; 9675 } 9676 9677 int sqlite3_expert_analyze(sqlite3expert *p, char **pzErr){ 9678 int rc; 9679 IdxHashEntry *pEntry; 9680 9681 /* Do trigger processing to collect any extra IdxScan structures */ 9682 rc = idxProcessTriggers(p, pzErr); 9683 9684 /* Create candidate indexes within the in-memory database file */ 9685 if( rc==SQLITE_OK ){ 9686 rc = idxCreateCandidates(p); 9687 } 9688 9689 /* Generate the stat1 data */ 9690 if( rc==SQLITE_OK ){ 9691 rc = idxPopulateStat1(p, pzErr); 9692 } 9693 9694 /* Formulate the EXPERT_REPORT_CANDIDATES text */ 9695 for(pEntry=p->hIdx.pFirst; pEntry; pEntry=pEntry->pNext){ 9696 p->zCandidates = idxAppendText(&rc, p->zCandidates, 9697 "%s;%s%s\n", pEntry->zVal, 9698 pEntry->zVal2 ? " -- stat1: " : "", pEntry->zVal2 9699 ); 9700 } 9701 9702 /* Figure out which of the candidate indexes are preferred by the query 9703 ** planner and report the results to the user. */ 9704 if( rc==SQLITE_OK ){ 9705 rc = idxFindIndexes(p, pzErr); 9706 } 9707 9708 if( rc==SQLITE_OK ){ 9709 p->bRun = 1; 9710 } 9711 return rc; 9712 } 9713 9714 /* 9715 ** Return the total number of statements that have been added to this 9716 ** sqlite3expert using sqlite3_expert_sql(). 9717 */ 9718 int sqlite3_expert_count(sqlite3expert *p){ 9719 int nRet = 0; 9720 if( p->pStatement ) nRet = p->pStatement->iId+1; 9721 return nRet; 9722 } 9723 9724 /* 9725 ** Return a component of the report. 9726 */ 9727 const char *sqlite3_expert_report(sqlite3expert *p, int iStmt, int eReport){ 9728 const char *zRet = 0; 9729 IdxStatement *pStmt; 9730 9731 if( p->bRun==0 ) return 0; 9732 for(pStmt=p->pStatement; pStmt && pStmt->iId!=iStmt; pStmt=pStmt->pNext); 9733 switch( eReport ){ 9734 case EXPERT_REPORT_SQL: 9735 if( pStmt ) zRet = pStmt->zSql; 9736 break; 9737 case EXPERT_REPORT_INDEXES: 9738 if( pStmt ) zRet = pStmt->zIdx; 9739 break; 9740 case EXPERT_REPORT_PLAN: 9741 if( pStmt ) zRet = pStmt->zEQP; 9742 break; 9743 case EXPERT_REPORT_CANDIDATES: 9744 zRet = p->zCandidates; 9745 break; 9746 } 9747 return zRet; 9748 } 9749 9750 /* 9751 ** Free an sqlite3expert object. 9752 */ 9753 void sqlite3_expert_destroy(sqlite3expert *p){ 9754 if( p ){ 9755 sqlite3_close(p->dbm); 9756 sqlite3_close(p->dbv); 9757 idxScanFree(p->pScan, 0); 9758 idxStatementFree(p->pStatement, 0); 9759 idxTableFree(p->pTable); 9760 idxWriteFree(p->pWrite); 9761 idxHashClear(&p->hIdx); 9762 sqlite3_free(p->zCandidates); 9763 sqlite3_free(p); 9764 } 9765 } 9766 9767 #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */ 9768 9769 /************************* End ../ext/expert/sqlite3expert.c ********************/ 9770 9771 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) 9772 /************************* Begin ../ext/misc/dbdata.c ******************/ 9773 /* 9774 ** 2019-04-17 9775 ** 9776 ** The author disclaims copyright to this source code. In place of 9777 ** a legal notice, here is a blessing: 9778 ** 9779 ** May you do good and not evil. 9780 ** May you find forgiveness for yourself and forgive others. 9781 ** May you share freely, never taking more than you give. 9782 ** 9783 ****************************************************************************** 9784 ** 9785 ** This file contains an implementation of two eponymous virtual tables, 9786 ** "sqlite_dbdata" and "sqlite_dbptr". Both modules require that the 9787 ** "sqlite_dbpage" eponymous virtual table be available. 9788 ** 9789 ** SQLITE_DBDATA: 9790 ** sqlite_dbdata is used to extract data directly from a database b-tree 9791 ** page and its associated overflow pages, bypassing the b-tree layer. 9792 ** The table schema is equivalent to: 9793 ** 9794 ** CREATE TABLE sqlite_dbdata( 9795 ** pgno INTEGER, 9796 ** cell INTEGER, 9797 ** field INTEGER, 9798 ** value ANY, 9799 ** schema TEXT HIDDEN 9800 ** ); 9801 ** 9802 ** IMPORTANT: THE VIRTUAL TABLE SCHEMA ABOVE IS SUBJECT TO CHANGE. IN THE 9803 ** FUTURE NEW NON-HIDDEN COLUMNS MAY BE ADDED BETWEEN "value" AND 9804 ** "schema". 9805 ** 9806 ** Each page of the database is inspected. If it cannot be interpreted as 9807 ** a b-tree page, or if it is a b-tree page containing 0 entries, the 9808 ** sqlite_dbdata table contains no rows for that page. Otherwise, the 9809 ** table contains one row for each field in the record associated with 9810 ** each cell on the page. For intkey b-trees, the key value is stored in 9811 ** field -1. 9812 ** 9813 ** For example, for the database: 9814 ** 9815 ** CREATE TABLE t1(a, b); -- root page is page 2 9816 ** INSERT INTO t1(rowid, a, b) VALUES(5, 'v', 'five'); 9817 ** INSERT INTO t1(rowid, a, b) VALUES(10, 'x', 'ten'); 9818 ** 9819 ** the sqlite_dbdata table contains, as well as from entries related to 9820 ** page 1, content equivalent to: 9821 ** 9822 ** INSERT INTO sqlite_dbdata(pgno, cell, field, value) VALUES 9823 ** (2, 0, -1, 5 ), 9824 ** (2, 0, 0, 'v' ), 9825 ** (2, 0, 1, 'five'), 9826 ** (2, 1, -1, 10 ), 9827 ** (2, 1, 0, 'x' ), 9828 ** (2, 1, 1, 'ten' ); 9829 ** 9830 ** If database corruption is encountered, this module does not report an 9831 ** error. Instead, it attempts to extract as much data as possible and 9832 ** ignores the corruption. 9833 ** 9834 ** SQLITE_DBPTR: 9835 ** The sqlite_dbptr table has the following schema: 9836 ** 9837 ** CREATE TABLE sqlite_dbptr( 9838 ** pgno INTEGER, 9839 ** child INTEGER, 9840 ** schema TEXT HIDDEN 9841 ** ); 9842 ** 9843 ** It contains one entry for each b-tree pointer between a parent and 9844 ** child page in the database. 9845 */ 9846 #if !defined(SQLITEINT_H) 9847 /* #include "sqlite3ext.h" */ 9848 9849 /* typedef unsigned char u8; */ 9850 9851 #endif 9852 SQLITE_EXTENSION_INIT1 9853 #include <string.h> 9854 #include <assert.h> 9855 9856 #define DBDATA_PADDING_BYTES 100 9857 9858 typedef struct DbdataTable DbdataTable; 9859 typedef struct DbdataCursor DbdataCursor; 9860 9861 /* Cursor object */ 9862 struct DbdataCursor { 9863 sqlite3_vtab_cursor base; /* Base class. Must be first */ 9864 sqlite3_stmt *pStmt; /* For fetching database pages */ 9865 9866 int iPgno; /* Current page number */ 9867 u8 *aPage; /* Buffer containing page */ 9868 int nPage; /* Size of aPage[] in bytes */ 9869 int nCell; /* Number of cells on aPage[] */ 9870 int iCell; /* Current cell number */ 9871 int bOnePage; /* True to stop after one page */ 9872 int szDb; 9873 sqlite3_int64 iRowid; 9874 9875 /* Only for the sqlite_dbdata table */ 9876 u8 *pRec; /* Buffer containing current record */ 9877 int nRec; /* Size of pRec[] in bytes */ 9878 int nHdr; /* Size of header in bytes */ 9879 int iField; /* Current field number */ 9880 u8 *pHdrPtr; 9881 u8 *pPtr; 9882 9883 sqlite3_int64 iIntkey; /* Integer key value */ 9884 }; 9885 9886 /* Table object */ 9887 struct DbdataTable { 9888 sqlite3_vtab base; /* Base class. Must be first */ 9889 sqlite3 *db; /* The database connection */ 9890 sqlite3_stmt *pStmt; /* For fetching database pages */ 9891 int bPtr; /* True for sqlite3_dbptr table */ 9892 }; 9893 9894 /* Column and schema definitions for sqlite_dbdata */ 9895 #define DBDATA_COLUMN_PGNO 0 9896 #define DBDATA_COLUMN_CELL 1 9897 #define DBDATA_COLUMN_FIELD 2 9898 #define DBDATA_COLUMN_VALUE 3 9899 #define DBDATA_COLUMN_SCHEMA 4 9900 #define DBDATA_SCHEMA \ 9901 "CREATE TABLE x(" \ 9902 " pgno INTEGER," \ 9903 " cell INTEGER," \ 9904 " field INTEGER," \ 9905 " value ANY," \ 9906 " schema TEXT HIDDEN" \ 9907 ")" 9908 9909 /* Column and schema definitions for sqlite_dbptr */ 9910 #define DBPTR_COLUMN_PGNO 0 9911 #define DBPTR_COLUMN_CHILD 1 9912 #define DBPTR_COLUMN_SCHEMA 2 9913 #define DBPTR_SCHEMA \ 9914 "CREATE TABLE x(" \ 9915 " pgno INTEGER," \ 9916 " child INTEGER," \ 9917 " schema TEXT HIDDEN" \ 9918 ")" 9919 9920 /* 9921 ** Connect to an sqlite_dbdata (pAux==0) or sqlite_dbptr (pAux!=0) virtual 9922 ** table. 9923 */ 9924 static int dbdataConnect( 9925 sqlite3 *db, 9926 void *pAux, 9927 int argc, const char *const*argv, 9928 sqlite3_vtab **ppVtab, 9929 char **pzErr 9930 ){ 9931 DbdataTable *pTab = 0; 9932 int rc = sqlite3_declare_vtab(db, pAux ? DBPTR_SCHEMA : DBDATA_SCHEMA); 9933 9934 if( rc==SQLITE_OK ){ 9935 pTab = (DbdataTable*)sqlite3_malloc64(sizeof(DbdataTable)); 9936 if( pTab==0 ){ 9937 rc = SQLITE_NOMEM; 9938 }else{ 9939 memset(pTab, 0, sizeof(DbdataTable)); 9940 pTab->db = db; 9941 pTab->bPtr = (pAux!=0); 9942 } 9943 } 9944 9945 *ppVtab = (sqlite3_vtab*)pTab; 9946 return rc; 9947 } 9948 9949 /* 9950 ** Disconnect from or destroy a sqlite_dbdata or sqlite_dbptr virtual table. 9951 */ 9952 static int dbdataDisconnect(sqlite3_vtab *pVtab){ 9953 DbdataTable *pTab = (DbdataTable*)pVtab; 9954 if( pTab ){ 9955 sqlite3_finalize(pTab->pStmt); 9956 sqlite3_free(pVtab); 9957 } 9958 return SQLITE_OK; 9959 } 9960 9961 /* 9962 ** This function interprets two types of constraints: 9963 ** 9964 ** schema=? 9965 ** pgno=? 9966 ** 9967 ** If neither are present, idxNum is set to 0. If schema=? is present, 9968 ** the 0x01 bit in idxNum is set. If pgno=? is present, the 0x02 bit 9969 ** in idxNum is set. 9970 ** 9971 ** If both parameters are present, schema is in position 0 and pgno in 9972 ** position 1. 9973 */ 9974 static int dbdataBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdx){ 9975 DbdataTable *pTab = (DbdataTable*)tab; 9976 int i; 9977 int iSchema = -1; 9978 int iPgno = -1; 9979 int colSchema = (pTab->bPtr ? DBPTR_COLUMN_SCHEMA : DBDATA_COLUMN_SCHEMA); 9980 9981 for(i=0; i<pIdx->nConstraint; i++){ 9982 struct sqlite3_index_constraint *p = &pIdx->aConstraint[i]; 9983 if( p->op==SQLITE_INDEX_CONSTRAINT_EQ ){ 9984 if( p->iColumn==colSchema ){ 9985 if( p->usable==0 ) return SQLITE_CONSTRAINT; 9986 iSchema = i; 9987 } 9988 if( p->iColumn==DBDATA_COLUMN_PGNO && p->usable ){ 9989 iPgno = i; 9990 } 9991 } 9992 } 9993 9994 if( iSchema>=0 ){ 9995 pIdx->aConstraintUsage[iSchema].argvIndex = 1; 9996 pIdx->aConstraintUsage[iSchema].omit = 1; 9997 } 9998 if( iPgno>=0 ){ 9999 pIdx->aConstraintUsage[iPgno].argvIndex = 1 + (iSchema>=0); 10000 pIdx->aConstraintUsage[iPgno].omit = 1; 10001 pIdx->estimatedCost = 100; 10002 pIdx->estimatedRows = 50; 10003 10004 if( pTab->bPtr==0 && pIdx->nOrderBy && pIdx->aOrderBy[0].desc==0 ){ 10005 int iCol = pIdx->aOrderBy[0].iColumn; 10006 if( pIdx->nOrderBy==1 ){ 10007 pIdx->orderByConsumed = (iCol==0 || iCol==1); 10008 }else if( pIdx->nOrderBy==2 && pIdx->aOrderBy[1].desc==0 && iCol==0 ){ 10009 pIdx->orderByConsumed = (pIdx->aOrderBy[1].iColumn==1); 10010 } 10011 } 10012 10013 }else{ 10014 pIdx->estimatedCost = 100000000; 10015 pIdx->estimatedRows = 1000000000; 10016 } 10017 pIdx->idxNum = (iSchema>=0 ? 0x01 : 0x00) | (iPgno>=0 ? 0x02 : 0x00); 10018 return SQLITE_OK; 10019 } 10020 10021 /* 10022 ** Open a new sqlite_dbdata or sqlite_dbptr cursor. 10023 */ 10024 static int dbdataOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){ 10025 DbdataCursor *pCsr; 10026 10027 pCsr = (DbdataCursor*)sqlite3_malloc64(sizeof(DbdataCursor)); 10028 if( pCsr==0 ){ 10029 return SQLITE_NOMEM; 10030 }else{ 10031 memset(pCsr, 0, sizeof(DbdataCursor)); 10032 pCsr->base.pVtab = pVTab; 10033 } 10034 10035 *ppCursor = (sqlite3_vtab_cursor *)pCsr; 10036 return SQLITE_OK; 10037 } 10038 10039 /* 10040 ** Restore a cursor object to the state it was in when first allocated 10041 ** by dbdataOpen(). 10042 */ 10043 static void dbdataResetCursor(DbdataCursor *pCsr){ 10044 DbdataTable *pTab = (DbdataTable*)(pCsr->base.pVtab); 10045 if( pTab->pStmt==0 ){ 10046 pTab->pStmt = pCsr->pStmt; 10047 }else{ 10048 sqlite3_finalize(pCsr->pStmt); 10049 } 10050 pCsr->pStmt = 0; 10051 pCsr->iPgno = 1; 10052 pCsr->iCell = 0; 10053 pCsr->iField = 0; 10054 pCsr->bOnePage = 0; 10055 sqlite3_free(pCsr->aPage); 10056 sqlite3_free(pCsr->pRec); 10057 pCsr->pRec = 0; 10058 pCsr->aPage = 0; 10059 } 10060 10061 /* 10062 ** Close an sqlite_dbdata or sqlite_dbptr cursor. 10063 */ 10064 static int dbdataClose(sqlite3_vtab_cursor *pCursor){ 10065 DbdataCursor *pCsr = (DbdataCursor*)pCursor; 10066 dbdataResetCursor(pCsr); 10067 sqlite3_free(pCsr); 10068 return SQLITE_OK; 10069 } 10070 10071 /* 10072 ** Utility methods to decode 16 and 32-bit big-endian unsigned integers. 10073 */ 10074 static unsigned int get_uint16(unsigned char *a){ 10075 return (a[0]<<8)|a[1]; 10076 } 10077 static unsigned int get_uint32(unsigned char *a){ 10078 return ((unsigned int)a[0]<<24) 10079 | ((unsigned int)a[1]<<16) 10080 | ((unsigned int)a[2]<<8) 10081 | ((unsigned int)a[3]); 10082 } 10083 10084 /* 10085 ** Load page pgno from the database via the sqlite_dbpage virtual table. 10086 ** If successful, set (*ppPage) to point to a buffer containing the page 10087 ** data, (*pnPage) to the size of that buffer in bytes and return 10088 ** SQLITE_OK. In this case it is the responsibility of the caller to 10089 ** eventually free the buffer using sqlite3_free(). 10090 ** 10091 ** Or, if an error occurs, set both (*ppPage) and (*pnPage) to 0 and 10092 ** return an SQLite error code. 10093 */ 10094 static int dbdataLoadPage( 10095 DbdataCursor *pCsr, /* Cursor object */ 10096 unsigned int pgno, /* Page number of page to load */ 10097 u8 **ppPage, /* OUT: pointer to page buffer */ 10098 int *pnPage /* OUT: Size of (*ppPage) in bytes */ 10099 ){ 10100 int rc2; 10101 int rc = SQLITE_OK; 10102 sqlite3_stmt *pStmt = pCsr->pStmt; 10103 10104 *ppPage = 0; 10105 *pnPage = 0; 10106 sqlite3_bind_int64(pStmt, 2, pgno); 10107 if( SQLITE_ROW==sqlite3_step(pStmt) ){ 10108 int nCopy = sqlite3_column_bytes(pStmt, 0); 10109 if( nCopy>0 ){ 10110 u8 *pPage; 10111 pPage = (u8*)sqlite3_malloc64(nCopy + DBDATA_PADDING_BYTES); 10112 if( pPage==0 ){ 10113 rc = SQLITE_NOMEM; 10114 }else{ 10115 const u8 *pCopy = sqlite3_column_blob(pStmt, 0); 10116 memcpy(pPage, pCopy, nCopy); 10117 memset(&pPage[nCopy], 0, DBDATA_PADDING_BYTES); 10118 } 10119 *ppPage = pPage; 10120 *pnPage = nCopy; 10121 } 10122 } 10123 rc2 = sqlite3_reset(pStmt); 10124 if( rc==SQLITE_OK ) rc = rc2; 10125 10126 return rc; 10127 } 10128 10129 /* 10130 ** Read a varint. Put the value in *pVal and return the number of bytes. 10131 */ 10132 static int dbdataGetVarint(const u8 *z, sqlite3_int64 *pVal){ 10133 sqlite3_int64 v = 0; 10134 int i; 10135 for(i=0; i<8; i++){ 10136 v = (v<<7) + (z[i]&0x7f); 10137 if( (z[i]&0x80)==0 ){ *pVal = v; return i+1; } 10138 } 10139 v = (v<<8) + (z[i]&0xff); 10140 *pVal = v; 10141 return 9; 10142 } 10143 10144 /* 10145 ** Return the number of bytes of space used by an SQLite value of type 10146 ** eType. 10147 */ 10148 static int dbdataValueBytes(int eType){ 10149 switch( eType ){ 10150 case 0: case 8: case 9: 10151 case 10: case 11: 10152 return 0; 10153 case 1: 10154 return 1; 10155 case 2: 10156 return 2; 10157 case 3: 10158 return 3; 10159 case 4: 10160 return 4; 10161 case 5: 10162 return 6; 10163 case 6: 10164 case 7: 10165 return 8; 10166 default: 10167 if( eType>0 ){ 10168 return ((eType-12) / 2); 10169 } 10170 return 0; 10171 } 10172 } 10173 10174 /* 10175 ** Load a value of type eType from buffer pData and use it to set the 10176 ** result of context object pCtx. 10177 */ 10178 static void dbdataValue( 10179 sqlite3_context *pCtx, 10180 int eType, 10181 u8 *pData, 10182 int nData 10183 ){ 10184 if( eType>=0 && dbdataValueBytes(eType)<=nData ){ 10185 switch( eType ){ 10186 case 0: 10187 case 10: 10188 case 11: 10189 sqlite3_result_null(pCtx); 10190 break; 10191 10192 case 8: 10193 sqlite3_result_int(pCtx, 0); 10194 break; 10195 case 9: 10196 sqlite3_result_int(pCtx, 1); 10197 break; 10198 10199 case 1: case 2: case 3: case 4: case 5: case 6: case 7: { 10200 sqlite3_uint64 v = (signed char)pData[0]; 10201 pData++; 10202 switch( eType ){ 10203 case 7: 10204 case 6: v = (v<<16) + (pData[0]<<8) + pData[1]; pData += 2; 10205 case 5: v = (v<<16) + (pData[0]<<8) + pData[1]; pData += 2; 10206 case 4: v = (v<<8) + pData[0]; pData++; 10207 case 3: v = (v<<8) + pData[0]; pData++; 10208 case 2: v = (v<<8) + pData[0]; pData++; 10209 } 10210 10211 if( eType==7 ){ 10212 double r; 10213 memcpy(&r, &v, sizeof(r)); 10214 sqlite3_result_double(pCtx, r); 10215 }else{ 10216 sqlite3_result_int64(pCtx, (sqlite3_int64)v); 10217 } 10218 break; 10219 } 10220 10221 default: { 10222 int n = ((eType-12) / 2); 10223 if( eType % 2 ){ 10224 sqlite3_result_text(pCtx, (const char*)pData, n, SQLITE_TRANSIENT); 10225 }else{ 10226 sqlite3_result_blob(pCtx, pData, n, SQLITE_TRANSIENT); 10227 } 10228 } 10229 } 10230 } 10231 } 10232 10233 /* 10234 ** Move an sqlite_dbdata or sqlite_dbptr cursor to the next entry. 10235 */ 10236 static int dbdataNext(sqlite3_vtab_cursor *pCursor){ 10237 DbdataCursor *pCsr = (DbdataCursor*)pCursor; 10238 DbdataTable *pTab = (DbdataTable*)pCursor->pVtab; 10239 10240 pCsr->iRowid++; 10241 while( 1 ){ 10242 int rc; 10243 int iOff = (pCsr->iPgno==1 ? 100 : 0); 10244 int bNextPage = 0; 10245 10246 if( pCsr->aPage==0 ){ 10247 while( 1 ){ 10248 if( pCsr->bOnePage==0 && pCsr->iPgno>pCsr->szDb ) return SQLITE_OK; 10249 rc = dbdataLoadPage(pCsr, pCsr->iPgno, &pCsr->aPage, &pCsr->nPage); 10250 if( rc!=SQLITE_OK ) return rc; 10251 if( pCsr->aPage ) break; 10252 pCsr->iPgno++; 10253 } 10254 pCsr->iCell = pTab->bPtr ? -2 : 0; 10255 pCsr->nCell = get_uint16(&pCsr->aPage[iOff+3]); 10256 } 10257 10258 if( pTab->bPtr ){ 10259 if( pCsr->aPage[iOff]!=0x02 && pCsr->aPage[iOff]!=0x05 ){ 10260 pCsr->iCell = pCsr->nCell; 10261 } 10262 pCsr->iCell++; 10263 if( pCsr->iCell>=pCsr->nCell ){ 10264 sqlite3_free(pCsr->aPage); 10265 pCsr->aPage = 0; 10266 if( pCsr->bOnePage ) return SQLITE_OK; 10267 pCsr->iPgno++; 10268 }else{ 10269 return SQLITE_OK; 10270 } 10271 }else{ 10272 /* If there is no record loaded, load it now. */ 10273 if( pCsr->pRec==0 ){ 10274 int bHasRowid = 0; 10275 int nPointer = 0; 10276 sqlite3_int64 nPayload = 0; 10277 sqlite3_int64 nHdr = 0; 10278 int iHdr; 10279 int U, X; 10280 int nLocal; 10281 10282 switch( pCsr->aPage[iOff] ){ 10283 case 0x02: 10284 nPointer = 4; 10285 break; 10286 case 0x0a: 10287 break; 10288 case 0x0d: 10289 bHasRowid = 1; 10290 break; 10291 default: 10292 /* This is not a b-tree page with records on it. Continue. */ 10293 pCsr->iCell = pCsr->nCell; 10294 break; 10295 } 10296 10297 if( pCsr->iCell>=pCsr->nCell ){ 10298 bNextPage = 1; 10299 }else{ 10300 10301 iOff += 8 + nPointer + pCsr->iCell*2; 10302 if( iOff>pCsr->nPage ){ 10303 bNextPage = 1; 10304 }else{ 10305 iOff = get_uint16(&pCsr->aPage[iOff]); 10306 } 10307 10308 /* For an interior node cell, skip past the child-page number */ 10309 iOff += nPointer; 10310 10311 /* Load the "byte of payload including overflow" field */ 10312 if( bNextPage || iOff>pCsr->nPage ){ 10313 bNextPage = 1; 10314 }else{ 10315 iOff += dbdataGetVarint(&pCsr->aPage[iOff], &nPayload); 10316 } 10317 10318 /* If this is a leaf intkey cell, load the rowid */ 10319 if( bHasRowid && !bNextPage && iOff<pCsr->nPage ){ 10320 iOff += dbdataGetVarint(&pCsr->aPage[iOff], &pCsr->iIntkey); 10321 } 10322 10323 /* Figure out how much data to read from the local page */ 10324 U = pCsr->nPage; 10325 if( bHasRowid ){ 10326 X = U-35; 10327 }else{ 10328 X = ((U-12)*64/255)-23; 10329 } 10330 if( nPayload<=X ){ 10331 nLocal = nPayload; 10332 }else{ 10333 int M, K; 10334 M = ((U-12)*32/255)-23; 10335 K = M+((nPayload-M)%(U-4)); 10336 if( K<=X ){ 10337 nLocal = K; 10338 }else{ 10339 nLocal = M; 10340 } 10341 } 10342 10343 if( bNextPage || nLocal+iOff>pCsr->nPage ){ 10344 bNextPage = 1; 10345 }else{ 10346 10347 /* Allocate space for payload. And a bit more to catch small buffer 10348 ** overruns caused by attempting to read a varint or similar from 10349 ** near the end of a corrupt record. */ 10350 pCsr->pRec = (u8*)sqlite3_malloc64(nPayload+DBDATA_PADDING_BYTES); 10351 if( pCsr->pRec==0 ) return SQLITE_NOMEM; 10352 memset(pCsr->pRec, 0, nPayload+DBDATA_PADDING_BYTES); 10353 pCsr->nRec = nPayload; 10354 10355 /* Load the nLocal bytes of payload */ 10356 memcpy(pCsr->pRec, &pCsr->aPage[iOff], nLocal); 10357 iOff += nLocal; 10358 10359 /* Load content from overflow pages */ 10360 if( nPayload>nLocal ){ 10361 sqlite3_int64 nRem = nPayload - nLocal; 10362 unsigned int pgnoOvfl = get_uint32(&pCsr->aPage[iOff]); 10363 while( nRem>0 ){ 10364 u8 *aOvfl = 0; 10365 int nOvfl = 0; 10366 int nCopy; 10367 rc = dbdataLoadPage(pCsr, pgnoOvfl, &aOvfl, &nOvfl); 10368 assert( rc!=SQLITE_OK || aOvfl==0 || nOvfl==pCsr->nPage ); 10369 if( rc!=SQLITE_OK ) return rc; 10370 if( aOvfl==0 ) break; 10371 10372 nCopy = U-4; 10373 if( nCopy>nRem ) nCopy = nRem; 10374 memcpy(&pCsr->pRec[nPayload-nRem], &aOvfl[4], nCopy); 10375 nRem -= nCopy; 10376 10377 pgnoOvfl = get_uint32(aOvfl); 10378 sqlite3_free(aOvfl); 10379 } 10380 } 10381 10382 iHdr = dbdataGetVarint(pCsr->pRec, &nHdr); 10383 pCsr->nHdr = nHdr; 10384 pCsr->pHdrPtr = &pCsr->pRec[iHdr]; 10385 pCsr->pPtr = &pCsr->pRec[pCsr->nHdr]; 10386 pCsr->iField = (bHasRowid ? -1 : 0); 10387 } 10388 } 10389 }else{ 10390 pCsr->iField++; 10391 if( pCsr->iField>0 ){ 10392 sqlite3_int64 iType; 10393 if( pCsr->pHdrPtr>&pCsr->pRec[pCsr->nRec] ){ 10394 bNextPage = 1; 10395 }else{ 10396 pCsr->pHdrPtr += dbdataGetVarint(pCsr->pHdrPtr, &iType); 10397 pCsr->pPtr += dbdataValueBytes(iType); 10398 } 10399 } 10400 } 10401 10402 if( bNextPage ){ 10403 sqlite3_free(pCsr->aPage); 10404 sqlite3_free(pCsr->pRec); 10405 pCsr->aPage = 0; 10406 pCsr->pRec = 0; 10407 if( pCsr->bOnePage ) return SQLITE_OK; 10408 pCsr->iPgno++; 10409 }else{ 10410 if( pCsr->iField<0 || pCsr->pHdrPtr<&pCsr->pRec[pCsr->nHdr] ){ 10411 return SQLITE_OK; 10412 } 10413 10414 /* Advance to the next cell. The next iteration of the loop will load 10415 ** the record and so on. */ 10416 sqlite3_free(pCsr->pRec); 10417 pCsr->pRec = 0; 10418 pCsr->iCell++; 10419 } 10420 } 10421 } 10422 10423 assert( !"can't get here" ); 10424 return SQLITE_OK; 10425 } 10426 10427 /* 10428 ** Return true if the cursor is at EOF. 10429 */ 10430 static int dbdataEof(sqlite3_vtab_cursor *pCursor){ 10431 DbdataCursor *pCsr = (DbdataCursor*)pCursor; 10432 return pCsr->aPage==0; 10433 } 10434 10435 /* 10436 ** Determine the size in pages of database zSchema (where zSchema is 10437 ** "main", "temp" or the name of an attached database) and set 10438 ** pCsr->szDb accordingly. If successful, return SQLITE_OK. Otherwise, 10439 ** an SQLite error code. 10440 */ 10441 static int dbdataDbsize(DbdataCursor *pCsr, const char *zSchema){ 10442 DbdataTable *pTab = (DbdataTable*)pCsr->base.pVtab; 10443 char *zSql = 0; 10444 int rc, rc2; 10445 sqlite3_stmt *pStmt = 0; 10446 10447 zSql = sqlite3_mprintf("PRAGMA %Q.page_count", zSchema); 10448 if( zSql==0 ) return SQLITE_NOMEM; 10449 rc = sqlite3_prepare_v2(pTab->db, zSql, -1, &pStmt, 0); 10450 sqlite3_free(zSql); 10451 if( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){ 10452 pCsr->szDb = sqlite3_column_int(pStmt, 0); 10453 } 10454 rc2 = sqlite3_finalize(pStmt); 10455 if( rc==SQLITE_OK ) rc = rc2; 10456 return rc; 10457 } 10458 10459 /* 10460 ** xFilter method for sqlite_dbdata and sqlite_dbptr. 10461 */ 10462 static int dbdataFilter( 10463 sqlite3_vtab_cursor *pCursor, 10464 int idxNum, const char *idxStr, 10465 int argc, sqlite3_value **argv 10466 ){ 10467 DbdataCursor *pCsr = (DbdataCursor*)pCursor; 10468 DbdataTable *pTab = (DbdataTable*)pCursor->pVtab; 10469 int rc = SQLITE_OK; 10470 const char *zSchema = "main"; 10471 10472 dbdataResetCursor(pCsr); 10473 assert( pCsr->iPgno==1 ); 10474 if( idxNum & 0x01 ){ 10475 zSchema = (const char*)sqlite3_value_text(argv[0]); 10476 } 10477 if( idxNum & 0x02 ){ 10478 pCsr->iPgno = sqlite3_value_int(argv[(idxNum & 0x01)]); 10479 pCsr->bOnePage = 1; 10480 }else{ 10481 pCsr->nPage = dbdataDbsize(pCsr, zSchema); 10482 rc = dbdataDbsize(pCsr, zSchema); 10483 } 10484 10485 if( rc==SQLITE_OK ){ 10486 if( pTab->pStmt ){ 10487 pCsr->pStmt = pTab->pStmt; 10488 pTab->pStmt = 0; 10489 }else{ 10490 rc = sqlite3_prepare_v2(pTab->db, 10491 "SELECT data FROM sqlite_dbpage(?) WHERE pgno=?", -1, 10492 &pCsr->pStmt, 0 10493 ); 10494 } 10495 } 10496 if( rc==SQLITE_OK ){ 10497 rc = sqlite3_bind_text(pCsr->pStmt, 1, zSchema, -1, SQLITE_TRANSIENT); 10498 }else{ 10499 pTab->base.zErrMsg = sqlite3_mprintf("%s", sqlite3_errmsg(pTab->db)); 10500 } 10501 if( rc==SQLITE_OK ){ 10502 rc = dbdataNext(pCursor); 10503 } 10504 return rc; 10505 } 10506 10507 /* 10508 ** Return a column for the sqlite_dbdata or sqlite_dbptr table. 10509 */ 10510 static int dbdataColumn( 10511 sqlite3_vtab_cursor *pCursor, 10512 sqlite3_context *ctx, 10513 int i 10514 ){ 10515 DbdataCursor *pCsr = (DbdataCursor*)pCursor; 10516 DbdataTable *pTab = (DbdataTable*)pCursor->pVtab; 10517 if( pTab->bPtr ){ 10518 switch( i ){ 10519 case DBPTR_COLUMN_PGNO: 10520 sqlite3_result_int64(ctx, pCsr->iPgno); 10521 break; 10522 case DBPTR_COLUMN_CHILD: { 10523 int iOff = pCsr->iPgno==1 ? 100 : 0; 10524 if( pCsr->iCell<0 ){ 10525 iOff += 8; 10526 }else{ 10527 iOff += 12 + pCsr->iCell*2; 10528 if( iOff>pCsr->nPage ) return SQLITE_OK; 10529 iOff = get_uint16(&pCsr->aPage[iOff]); 10530 } 10531 if( iOff<=pCsr->nPage ){ 10532 sqlite3_result_int64(ctx, get_uint32(&pCsr->aPage[iOff])); 10533 } 10534 break; 10535 } 10536 } 10537 }else{ 10538 switch( i ){ 10539 case DBDATA_COLUMN_PGNO: 10540 sqlite3_result_int64(ctx, pCsr->iPgno); 10541 break; 10542 case DBDATA_COLUMN_CELL: 10543 sqlite3_result_int(ctx, pCsr->iCell); 10544 break; 10545 case DBDATA_COLUMN_FIELD: 10546 sqlite3_result_int(ctx, pCsr->iField); 10547 break; 10548 case DBDATA_COLUMN_VALUE: { 10549 if( pCsr->iField<0 ){ 10550 sqlite3_result_int64(ctx, pCsr->iIntkey); 10551 }else{ 10552 sqlite3_int64 iType; 10553 dbdataGetVarint(pCsr->pHdrPtr, &iType); 10554 dbdataValue( 10555 ctx, iType, pCsr->pPtr, &pCsr->pRec[pCsr->nRec] - pCsr->pPtr 10556 ); 10557 } 10558 break; 10559 } 10560 } 10561 } 10562 return SQLITE_OK; 10563 } 10564 10565 /* 10566 ** Return the rowid for an sqlite_dbdata or sqlite_dptr table. 10567 */ 10568 static int dbdataRowid(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){ 10569 DbdataCursor *pCsr = (DbdataCursor*)pCursor; 10570 *pRowid = pCsr->iRowid; 10571 return SQLITE_OK; 10572 } 10573 10574 10575 /* 10576 ** Invoke this routine to register the "sqlite_dbdata" virtual table module 10577 */ 10578 static int sqlite3DbdataRegister(sqlite3 *db){ 10579 static sqlite3_module dbdata_module = { 10580 0, /* iVersion */ 10581 0, /* xCreate */ 10582 dbdataConnect, /* xConnect */ 10583 dbdataBestIndex, /* xBestIndex */ 10584 dbdataDisconnect, /* xDisconnect */ 10585 0, /* xDestroy */ 10586 dbdataOpen, /* xOpen - open a cursor */ 10587 dbdataClose, /* xClose - close a cursor */ 10588 dbdataFilter, /* xFilter - configure scan constraints */ 10589 dbdataNext, /* xNext - advance a cursor */ 10590 dbdataEof, /* xEof - check for end of scan */ 10591 dbdataColumn, /* xColumn - read data */ 10592 dbdataRowid, /* xRowid - read data */ 10593 0, /* xUpdate */ 10594 0, /* xBegin */ 10595 0, /* xSync */ 10596 0, /* xCommit */ 10597 0, /* xRollback */ 10598 0, /* xFindMethod */ 10599 0, /* xRename */ 10600 0, /* xSavepoint */ 10601 0, /* xRelease */ 10602 0, /* xRollbackTo */ 10603 0 /* xShadowName */ 10604 }; 10605 10606 int rc = sqlite3_create_module(db, "sqlite_dbdata", &dbdata_module, 0); 10607 if( rc==SQLITE_OK ){ 10608 rc = sqlite3_create_module(db, "sqlite_dbptr", &dbdata_module, (void*)1); 10609 } 10610 return rc; 10611 } 10612 10613 #ifdef _WIN32 10614 10615 #endif 10616 int sqlite3_dbdata_init( 10617 sqlite3 *db, 10618 char **pzErrMsg, 10619 const sqlite3_api_routines *pApi 10620 ){ 10621 SQLITE_EXTENSION_INIT2(pApi); 10622 return sqlite3DbdataRegister(db); 10623 } 10624 10625 /************************* End ../ext/misc/dbdata.c ********************/ 10626 #endif 10627 10628 #if defined(SQLITE_ENABLE_SESSION) 10629 /* 10630 ** State information for a single open session 10631 */ 10632 typedef struct OpenSession OpenSession; 10633 struct OpenSession { 10634 char *zName; /* Symbolic name for this session */ 10635 int nFilter; /* Number of xFilter rejection GLOB patterns */ 10636 char **azFilter; /* Array of xFilter rejection GLOB patterns */ 10637 sqlite3_session *p; /* The open session */ 10638 }; 10639 #endif 10640 10641 typedef struct ExpertInfo ExpertInfo; 10642 struct ExpertInfo { 10643 sqlite3expert *pExpert; 10644 int bVerbose; 10645 }; 10646 10647 /* A single line in the EQP output */ 10648 typedef struct EQPGraphRow EQPGraphRow; 10649 struct EQPGraphRow { 10650 int iEqpId; /* ID for this row */ 10651 int iParentId; /* ID of the parent row */ 10652 EQPGraphRow *pNext; /* Next row in sequence */ 10653 char zText[1]; /* Text to display for this row */ 10654 }; 10655 10656 /* All EQP output is collected into an instance of the following */ 10657 typedef struct EQPGraph EQPGraph; 10658 struct EQPGraph { 10659 EQPGraphRow *pRow; /* Linked list of all rows of the EQP output */ 10660 EQPGraphRow *pLast; /* Last element of the pRow list */ 10661 char zPrefix[100]; /* Graph prefix */ 10662 }; 10663 10664 /* 10665 ** State information about the database connection is contained in an 10666 ** instance of the following structure. 10667 */ 10668 typedef struct ShellState ShellState; 10669 struct ShellState { 10670 sqlite3 *db; /* The database */ 10671 u8 autoExplain; /* Automatically turn on .explain mode */ 10672 u8 autoEQP; /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */ 10673 u8 autoEQPtest; /* autoEQP is in test mode */ 10674 u8 autoEQPtrace; /* autoEQP is in trace mode */ 10675 u8 statsOn; /* True to display memory stats before each finalize */ 10676 u8 scanstatsOn; /* True to display scan stats before each finalize */ 10677 u8 openMode; /* SHELL_OPEN_NORMAL, _APPENDVFS, or _ZIPFILE */ 10678 u8 doXdgOpen; /* Invoke start/open/xdg-open in output_reset() */ 10679 u8 nEqpLevel; /* Depth of the EQP output graph */ 10680 u8 eTraceType; /* SHELL_TRACE_* value for type of trace */ 10681 unsigned mEqpLines; /* Mask of veritical lines in the EQP output graph */ 10682 int outCount; /* Revert to stdout when reaching zero */ 10683 int cnt; /* Number of records displayed so far */ 10684 int lineno; /* Line number of last line read from in */ 10685 int openFlags; /* Additional flags to open. (SQLITE_OPEN_NOFOLLOW) */ 10686 FILE *in; /* Read commands from this stream */ 10687 FILE *out; /* Write results here */ 10688 FILE *traceOut; /* Output for sqlite3_trace() */ 10689 int nErr; /* Number of errors seen */ 10690 int mode; /* An output mode setting */ 10691 int modePrior; /* Saved mode */ 10692 int cMode; /* temporary output mode for the current query */ 10693 int normalMode; /* Output mode before ".explain on" */ 10694 int writableSchema; /* True if PRAGMA writable_schema=ON */ 10695 int showHeader; /* True to show column names in List or Column mode */ 10696 int nCheck; /* Number of ".check" commands run */ 10697 unsigned nProgress; /* Number of progress callbacks encountered */ 10698 unsigned mxProgress; /* Maximum progress callbacks before failing */ 10699 unsigned flgProgress; /* Flags for the progress callback */ 10700 unsigned shellFlgs; /* Various flags */ 10701 unsigned priorShFlgs; /* Saved copy of flags */ 10702 sqlite3_int64 szMax; /* --maxsize argument to .open */ 10703 char *zDestTable; /* Name of destination table when MODE_Insert */ 10704 char *zTempFile; /* Temporary file that might need deleting */ 10705 char zTestcase[30]; /* Name of current test case */ 10706 char colSeparator[20]; /* Column separator character for several modes */ 10707 char rowSeparator[20]; /* Row separator character for MODE_Ascii */ 10708 char colSepPrior[20]; /* Saved column separator */ 10709 char rowSepPrior[20]; /* Saved row separator */ 10710 int *colWidth; /* Requested width of each column in columnar modes */ 10711 int *actualWidth; /* Actual width of each column */ 10712 int nWidth; /* Number of slots in colWidth[] and actualWidth[] */ 10713 char nullValue[20]; /* The text to print when a NULL comes back from 10714 ** the database */ 10715 char outfile[FILENAME_MAX]; /* Filename for *out */ 10716 const char *zDbFilename; /* name of the database file */ 10717 char *zFreeOnClose; /* Filename to free when closing */ 10718 const char *zVfs; /* Name of VFS to use */ 10719 sqlite3_stmt *pStmt; /* Current statement if any. */ 10720 FILE *pLog; /* Write log output here */ 10721 int *aiIndent; /* Array of indents used in MODE_Explain */ 10722 int nIndent; /* Size of array aiIndent[] */ 10723 int iIndent; /* Index of current op in aiIndent[] */ 10724 EQPGraph sGraph; /* Information for the graphical EXPLAIN QUERY PLAN */ 10725 #if defined(SQLITE_ENABLE_SESSION) 10726 int nSession; /* Number of active sessions */ 10727 OpenSession aSession[4]; /* Array of sessions. [0] is in focus. */ 10728 #endif 10729 ExpertInfo expert; /* Valid if previous command was ".expert OPT..." */ 10730 }; 10731 10732 10733 /* Allowed values for ShellState.autoEQP 10734 */ 10735 #define AUTOEQP_off 0 /* Automatic EXPLAIN QUERY PLAN is off */ 10736 #define AUTOEQP_on 1 /* Automatic EQP is on */ 10737 #define AUTOEQP_trigger 2 /* On and also show plans for triggers */ 10738 #define AUTOEQP_full 3 /* Show full EXPLAIN */ 10739 10740 /* Allowed values for ShellState.openMode 10741 */ 10742 #define SHELL_OPEN_UNSPEC 0 /* No open-mode specified */ 10743 #define SHELL_OPEN_NORMAL 1 /* Normal database file */ 10744 #define SHELL_OPEN_APPENDVFS 2 /* Use appendvfs */ 10745 #define SHELL_OPEN_ZIPFILE 3 /* Use the zipfile virtual table */ 10746 #define SHELL_OPEN_READONLY 4 /* Open a normal database read-only */ 10747 #define SHELL_OPEN_DESERIALIZE 5 /* Open using sqlite3_deserialize() */ 10748 #define SHELL_OPEN_HEXDB 6 /* Use "dbtotxt" output as data source */ 10749 10750 /* Allowed values for ShellState.eTraceType 10751 */ 10752 #define SHELL_TRACE_PLAIN 0 /* Show input SQL text */ 10753 #define SHELL_TRACE_EXPANDED 1 /* Show expanded SQL text */ 10754 #define SHELL_TRACE_NORMALIZED 2 /* Show normalized SQL text */ 10755 10756 /* Bits in the ShellState.flgProgress variable */ 10757 #define SHELL_PROGRESS_QUIET 0x01 /* Omit announcing every progress callback */ 10758 #define SHELL_PROGRESS_RESET 0x02 /* Reset the count when the progres 10759 ** callback limit is reached, and for each 10760 ** top-level SQL statement */ 10761 #define SHELL_PROGRESS_ONCE 0x04 /* Cancel the --limit after firing once */ 10762 10763 /* 10764 ** These are the allowed shellFlgs values 10765 */ 10766 #define SHFLG_Pagecache 0x00000001 /* The --pagecache option is used */ 10767 #define SHFLG_Lookaside 0x00000002 /* Lookaside memory is used */ 10768 #define SHFLG_Backslash 0x00000004 /* The --backslash option is used */ 10769 #define SHFLG_PreserveRowid 0x00000008 /* .dump preserves rowid values */ 10770 #define SHFLG_Newlines 0x00000010 /* .dump --newline flag */ 10771 #define SHFLG_CountChanges 0x00000020 /* .changes setting */ 10772 #define SHFLG_Echo 0x00000040 /* .echo or --echo setting */ 10773 #define SHFLG_HeaderSet 0x00000080 /* .header has been used */ 10774 10775 /* 10776 ** Macros for testing and setting shellFlgs 10777 */ 10778 #define ShellHasFlag(P,X) (((P)->shellFlgs & (X))!=0) 10779 #define ShellSetFlag(P,X) ((P)->shellFlgs|=(X)) 10780 #define ShellClearFlag(P,X) ((P)->shellFlgs&=(~(X))) 10781 10782 /* 10783 ** These are the allowed modes. 10784 */ 10785 #define MODE_Line 0 /* One column per line. Blank line between records */ 10786 #define MODE_Column 1 /* One record per line in neat columns */ 10787 #define MODE_List 2 /* One record per line with a separator */ 10788 #define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */ 10789 #define MODE_Html 4 /* Generate an XHTML table */ 10790 #define MODE_Insert 5 /* Generate SQL "insert" statements */ 10791 #define MODE_Quote 6 /* Quote values as for SQL */ 10792 #define MODE_Tcl 7 /* Generate ANSI-C or TCL quoted elements */ 10793 #define MODE_Csv 8 /* Quote strings, numbers are plain */ 10794 #define MODE_Explain 9 /* Like MODE_Column, but do not truncate data */ 10795 #define MODE_Ascii 10 /* Use ASCII unit and record separators (0x1F/0x1E) */ 10796 #define MODE_Pretty 11 /* Pretty-print schemas */ 10797 #define MODE_EQP 12 /* Converts EXPLAIN QUERY PLAN output into a graph */ 10798 #define MODE_Json 13 /* Output JSON */ 10799 #define MODE_Markdown 14 /* Markdown formatting */ 10800 #define MODE_Table 15 /* MySQL-style table formatting */ 10801 #define MODE_Box 16 /* Unicode box-drawing characters */ 10802 10803 static const char *modeDescr[] = { 10804 "line", 10805 "column", 10806 "list", 10807 "semi", 10808 "html", 10809 "insert", 10810 "quote", 10811 "tcl", 10812 "csv", 10813 "explain", 10814 "ascii", 10815 "prettyprint", 10816 "eqp", 10817 "json", 10818 "markdown", 10819 "table", 10820 "box" 10821 }; 10822 10823 /* 10824 ** These are the column/row/line separators used by the various 10825 ** import/export modes. 10826 */ 10827 #define SEP_Column "|" 10828 #define SEP_Row "\n" 10829 #define SEP_Tab "\t" 10830 #define SEP_Space " " 10831 #define SEP_Comma "," 10832 #define SEP_CrLf "\r\n" 10833 #define SEP_Unit "\x1F" 10834 #define SEP_Record "\x1E" 10835 10836 /* 10837 ** A callback for the sqlite3_log() interface. 10838 */ 10839 static void shellLog(void *pArg, int iErrCode, const char *zMsg){ 10840 ShellState *p = (ShellState*)pArg; 10841 if( p->pLog==0 ) return; 10842 utf8_printf(p->pLog, "(%d) %s\n", iErrCode, zMsg); 10843 fflush(p->pLog); 10844 } 10845 10846 /* 10847 ** SQL function: shell_putsnl(X) 10848 ** 10849 ** Write the text X to the screen (or whatever output is being directed) 10850 ** adding a newline at the end, and then return X. 10851 */ 10852 static void shellPutsFunc( 10853 sqlite3_context *pCtx, 10854 int nVal, 10855 sqlite3_value **apVal 10856 ){ 10857 ShellState *p = (ShellState*)sqlite3_user_data(pCtx); 10858 (void)nVal; 10859 utf8_printf(p->out, "%s\n", sqlite3_value_text(apVal[0])); 10860 sqlite3_result_value(pCtx, apVal[0]); 10861 } 10862 10863 /* 10864 ** SQL function: edit(VALUE) 10865 ** edit(VALUE,EDITOR) 10866 ** 10867 ** These steps: 10868 ** 10869 ** (1) Write VALUE into a temporary file. 10870 ** (2) Run program EDITOR on that temporary file. 10871 ** (3) Read the temporary file back and return its content as the result. 10872 ** (4) Delete the temporary file 10873 ** 10874 ** If the EDITOR argument is omitted, use the value in the VISUAL 10875 ** environment variable. If still there is no EDITOR, through an error. 10876 ** 10877 ** Also throw an error if the EDITOR program returns a non-zero exit code. 10878 */ 10879 #ifndef SQLITE_NOHAVE_SYSTEM 10880 static void editFunc( 10881 sqlite3_context *context, 10882 int argc, 10883 sqlite3_value **argv 10884 ){ 10885 const char *zEditor; 10886 char *zTempFile = 0; 10887 sqlite3 *db; 10888 char *zCmd = 0; 10889 int bBin; 10890 int rc; 10891 int hasCRNL = 0; 10892 FILE *f = 0; 10893 sqlite3_int64 sz; 10894 sqlite3_int64 x; 10895 unsigned char *p = 0; 10896 10897 if( argc==2 ){ 10898 zEditor = (const char*)sqlite3_value_text(argv[1]); 10899 }else{ 10900 zEditor = getenv("VISUAL"); 10901 } 10902 if( zEditor==0 ){ 10903 sqlite3_result_error(context, "no editor for edit()", -1); 10904 return; 10905 } 10906 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){ 10907 sqlite3_result_error(context, "NULL input to edit()", -1); 10908 return; 10909 } 10910 db = sqlite3_context_db_handle(context); 10911 zTempFile = 0; 10912 sqlite3_file_control(db, 0, SQLITE_FCNTL_TEMPFILENAME, &zTempFile); 10913 if( zTempFile==0 ){ 10914 sqlite3_uint64 r = 0; 10915 sqlite3_randomness(sizeof(r), &r); 10916 zTempFile = sqlite3_mprintf("temp%llx", r); 10917 if( zTempFile==0 ){ 10918 sqlite3_result_error_nomem(context); 10919 return; 10920 } 10921 } 10922 bBin = sqlite3_value_type(argv[0])==SQLITE_BLOB; 10923 /* When writing the file to be edited, do \n to \r\n conversions on systems 10924 ** that want \r\n line endings */ 10925 f = fopen(zTempFile, bBin ? "wb" : "w"); 10926 if( f==0 ){ 10927 sqlite3_result_error(context, "edit() cannot open temp file", -1); 10928 goto edit_func_end; 10929 } 10930 sz = sqlite3_value_bytes(argv[0]); 10931 if( bBin ){ 10932 x = fwrite(sqlite3_value_blob(argv[0]), 1, (size_t)sz, f); 10933 }else{ 10934 const char *z = (const char*)sqlite3_value_text(argv[0]); 10935 /* Remember whether or not the value originally contained \r\n */ 10936 if( z && strstr(z,"\r\n")!=0 ) hasCRNL = 1; 10937 x = fwrite(sqlite3_value_text(argv[0]), 1, (size_t)sz, f); 10938 } 10939 fclose(f); 10940 f = 0; 10941 if( x!=sz ){ 10942 sqlite3_result_error(context, "edit() could not write the whole file", -1); 10943 goto edit_func_end; 10944 } 10945 zCmd = sqlite3_mprintf("%s \"%s\"", zEditor, zTempFile); 10946 if( zCmd==0 ){ 10947 sqlite3_result_error_nomem(context); 10948 goto edit_func_end; 10949 } 10950 rc = system(zCmd); 10951 sqlite3_free(zCmd); 10952 if( rc ){ 10953 sqlite3_result_error(context, "EDITOR returned non-zero", -1); 10954 goto edit_func_end; 10955 } 10956 f = fopen(zTempFile, "rb"); 10957 if( f==0 ){ 10958 sqlite3_result_error(context, 10959 "edit() cannot reopen temp file after edit", -1); 10960 goto edit_func_end; 10961 } 10962 fseek(f, 0, SEEK_END); 10963 sz = ftell(f); 10964 rewind(f); 10965 p = sqlite3_malloc64( sz+1 ); 10966 if( p==0 ){ 10967 sqlite3_result_error_nomem(context); 10968 goto edit_func_end; 10969 } 10970 x = fread(p, 1, (size_t)sz, f); 10971 fclose(f); 10972 f = 0; 10973 if( x!=sz ){ 10974 sqlite3_result_error(context, "could not read back the whole file", -1); 10975 goto edit_func_end; 10976 } 10977 if( bBin ){ 10978 sqlite3_result_blob64(context, p, sz, sqlite3_free); 10979 }else{ 10980 sqlite3_int64 i, j; 10981 if( hasCRNL ){ 10982 /* If the original contains \r\n then do no conversions back to \n */ 10983 j = sz; 10984 }else{ 10985 /* If the file did not originally contain \r\n then convert any new 10986 ** \r\n back into \n */ 10987 for(i=j=0; i<sz; i++){ 10988 if( p[i]=='\r' && p[i+1]=='\n' ) i++; 10989 p[j++] = p[i]; 10990 } 10991 sz = j; 10992 p[sz] = 0; 10993 } 10994 sqlite3_result_text64(context, (const char*)p, sz, 10995 sqlite3_free, SQLITE_UTF8); 10996 } 10997 p = 0; 10998 10999 edit_func_end: 11000 if( f ) fclose(f); 11001 unlink(zTempFile); 11002 sqlite3_free(zTempFile); 11003 sqlite3_free(p); 11004 } 11005 #endif /* SQLITE_NOHAVE_SYSTEM */ 11006 11007 /* 11008 ** Save or restore the current output mode 11009 */ 11010 static void outputModePush(ShellState *p){ 11011 p->modePrior = p->mode; 11012 p->priorShFlgs = p->shellFlgs; 11013 memcpy(p->colSepPrior, p->colSeparator, sizeof(p->colSeparator)); 11014 memcpy(p->rowSepPrior, p->rowSeparator, sizeof(p->rowSeparator)); 11015 } 11016 static void outputModePop(ShellState *p){ 11017 p->mode = p->modePrior; 11018 p->shellFlgs = p->priorShFlgs; 11019 memcpy(p->colSeparator, p->colSepPrior, sizeof(p->colSeparator)); 11020 memcpy(p->rowSeparator, p->rowSepPrior, sizeof(p->rowSeparator)); 11021 } 11022 11023 /* 11024 ** Output the given string as a hex-encoded blob (eg. X'1234' ) 11025 */ 11026 static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){ 11027 int i; 11028 char *zBlob = (char *)pBlob; 11029 raw_printf(out,"X'"); 11030 for(i=0; i<nBlob; i++){ raw_printf(out,"%02x",zBlob[i]&0xff); } 11031 raw_printf(out,"'"); 11032 } 11033 11034 /* 11035 ** Find a string that is not found anywhere in z[]. Return a pointer 11036 ** to that string. 11037 ** 11038 ** Try to use zA and zB first. If both of those are already found in z[] 11039 ** then make up some string and store it in the buffer zBuf. 11040 */ 11041 static const char *unused_string( 11042 const char *z, /* Result must not appear anywhere in z */ 11043 const char *zA, const char *zB, /* Try these first */ 11044 char *zBuf /* Space to store a generated string */ 11045 ){ 11046 unsigned i = 0; 11047 if( strstr(z, zA)==0 ) return zA; 11048 if( strstr(z, zB)==0 ) return zB; 11049 do{ 11050 sqlite3_snprintf(20,zBuf,"(%s%u)", zA, i++); 11051 }while( strstr(z,zBuf)!=0 ); 11052 return zBuf; 11053 } 11054 11055 /* 11056 ** Output the given string as a quoted string using SQL quoting conventions. 11057 ** 11058 ** See also: output_quoted_escaped_string() 11059 */ 11060 static void output_quoted_string(FILE *out, const char *z){ 11061 int i; 11062 char c; 11063 setBinaryMode(out, 1); 11064 for(i=0; (c = z[i])!=0 && c!='\''; i++){} 11065 if( c==0 ){ 11066 utf8_printf(out,"'%s'",z); 11067 }else{ 11068 raw_printf(out, "'"); 11069 while( *z ){ 11070 for(i=0; (c = z[i])!=0 && c!='\''; i++){} 11071 if( c=='\'' ) i++; 11072 if( i ){ 11073 utf8_printf(out, "%.*s", i, z); 11074 z += i; 11075 } 11076 if( c=='\'' ){ 11077 raw_printf(out, "'"); 11078 continue; 11079 } 11080 if( c==0 ){ 11081 break; 11082 } 11083 z++; 11084 } 11085 raw_printf(out, "'"); 11086 } 11087 setTextMode(out, 1); 11088 } 11089 11090 /* 11091 ** Output the given string as a quoted string using SQL quoting conventions. 11092 ** Additionallly , escape the "\n" and "\r" characters so that they do not 11093 ** get corrupted by end-of-line translation facilities in some operating 11094 ** systems. 11095 ** 11096 ** This is like output_quoted_string() but with the addition of the \r\n 11097 ** escape mechanism. 11098 */ 11099 static void output_quoted_escaped_string(FILE *out, const char *z){ 11100 int i; 11101 char c; 11102 setBinaryMode(out, 1); 11103 for(i=0; (c = z[i])!=0 && c!='\'' && c!='\n' && c!='\r'; i++){} 11104 if( c==0 ){ 11105 utf8_printf(out,"'%s'",z); 11106 }else{ 11107 const char *zNL = 0; 11108 const char *zCR = 0; 11109 int nNL = 0; 11110 int nCR = 0; 11111 char zBuf1[20], zBuf2[20]; 11112 for(i=0; z[i]; i++){ 11113 if( z[i]=='\n' ) nNL++; 11114 if( z[i]=='\r' ) nCR++; 11115 } 11116 if( nNL ){ 11117 raw_printf(out, "replace("); 11118 zNL = unused_string(z, "\\n", "\\012", zBuf1); 11119 } 11120 if( nCR ){ 11121 raw_printf(out, "replace("); 11122 zCR = unused_string(z, "\\r", "\\015", zBuf2); 11123 } 11124 raw_printf(out, "'"); 11125 while( *z ){ 11126 for(i=0; (c = z[i])!=0 && c!='\n' && c!='\r' && c!='\''; i++){} 11127 if( c=='\'' ) i++; 11128 if( i ){ 11129 utf8_printf(out, "%.*s", i, z); 11130 z += i; 11131 } 11132 if( c=='\'' ){ 11133 raw_printf(out, "'"); 11134 continue; 11135 } 11136 if( c==0 ){ 11137 break; 11138 } 11139 z++; 11140 if( c=='\n' ){ 11141 raw_printf(out, "%s", zNL); 11142 continue; 11143 } 11144 raw_printf(out, "%s", zCR); 11145 } 11146 raw_printf(out, "'"); 11147 if( nCR ){ 11148 raw_printf(out, ",'%s',char(13))", zCR); 11149 } 11150 if( nNL ){ 11151 raw_printf(out, ",'%s',char(10))", zNL); 11152 } 11153 } 11154 setTextMode(out, 1); 11155 } 11156 11157 /* 11158 ** Output the given string as a quoted according to C or TCL quoting rules. 11159 */ 11160 static void output_c_string(FILE *out, const char *z){ 11161 unsigned int c; 11162 fputc('"', out); 11163 while( (c = *(z++))!=0 ){ 11164 if( c=='\\' ){ 11165 fputc(c, out); 11166 fputc(c, out); 11167 }else if( c=='"' ){ 11168 fputc('\\', out); 11169 fputc('"', out); 11170 }else if( c=='\t' ){ 11171 fputc('\\', out); 11172 fputc('t', out); 11173 }else if( c=='\n' ){ 11174 fputc('\\', out); 11175 fputc('n', out); 11176 }else if( c=='\r' ){ 11177 fputc('\\', out); 11178 fputc('r', out); 11179 }else if( !isprint(c&0xff) ){ 11180 raw_printf(out, "\\%03o", c&0xff); 11181 }else{ 11182 fputc(c, out); 11183 } 11184 } 11185 fputc('"', out); 11186 } 11187 11188 /* 11189 ** Output the given string as a quoted according to JSON quoting rules. 11190 */ 11191 static void output_json_string(FILE *out, const char *z, int n){ 11192 unsigned int c; 11193 if( n<0 ) n = (int)strlen(z); 11194 fputc('"', out); 11195 while( n-- ){ 11196 c = *(z++); 11197 if( c=='\\' || c=='"' ){ 11198 fputc('\\', out); 11199 fputc(c, out); 11200 }else if( c<=0x1f ){ 11201 fputc('\\', out); 11202 if( c=='\b' ){ 11203 fputc('b', out); 11204 }else if( c=='\f' ){ 11205 fputc('f', out); 11206 }else if( c=='\n' ){ 11207 fputc('n', out); 11208 }else if( c=='\r' ){ 11209 fputc('r', out); 11210 }else if( c=='\t' ){ 11211 fputc('t', out); 11212 }else{ 11213 raw_printf(out, "u%04x",c); 11214 } 11215 }else{ 11216 fputc(c, out); 11217 } 11218 } 11219 fputc('"', out); 11220 } 11221 11222 /* 11223 ** Output the given string with characters that are special to 11224 ** HTML escaped. 11225 */ 11226 static void output_html_string(FILE *out, const char *z){ 11227 int i; 11228 if( z==0 ) z = ""; 11229 while( *z ){ 11230 for(i=0; z[i] 11231 && z[i]!='<' 11232 && z[i]!='&' 11233 && z[i]!='>' 11234 && z[i]!='\"' 11235 && z[i]!='\''; 11236 i++){} 11237 if( i>0 ){ 11238 utf8_printf(out,"%.*s",i,z); 11239 } 11240 if( z[i]=='<' ){ 11241 raw_printf(out,"<"); 11242 }else if( z[i]=='&' ){ 11243 raw_printf(out,"&"); 11244 }else if( z[i]=='>' ){ 11245 raw_printf(out,">"); 11246 }else if( z[i]=='\"' ){ 11247 raw_printf(out,"""); 11248 }else if( z[i]=='\'' ){ 11249 raw_printf(out,"'"); 11250 }else{ 11251 break; 11252 } 11253 z += i + 1; 11254 } 11255 } 11256 11257 /* 11258 ** If a field contains any character identified by a 1 in the following 11259 ** array, then the string must be quoted for CSV. 11260 */ 11261 static const char needCsvQuote[] = { 11262 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11263 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11264 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 11265 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11266 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11267 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11268 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11269 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 11270 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11271 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11272 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11273 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11274 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11275 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11276 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11277 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11278 }; 11279 11280 /* 11281 ** Output a single term of CSV. Actually, p->colSeparator is used for 11282 ** the separator, which may or may not be a comma. p->nullValue is 11283 ** the null value. Strings are quoted if necessary. The separator 11284 ** is only issued if bSep is true. 11285 */ 11286 static void output_csv(ShellState *p, const char *z, int bSep){ 11287 FILE *out = p->out; 11288 if( z==0 ){ 11289 utf8_printf(out,"%s",p->nullValue); 11290 }else{ 11291 int i; 11292 int nSep = strlen30(p->colSeparator); 11293 for(i=0; z[i]; i++){ 11294 if( needCsvQuote[((unsigned char*)z)[i]] 11295 || (z[i]==p->colSeparator[0] && 11296 (nSep==1 || memcmp(z, p->colSeparator, nSep)==0)) ){ 11297 i = 0; 11298 break; 11299 } 11300 } 11301 if( i==0 ){ 11302 char *zQuoted = sqlite3_mprintf("\"%w\"", z); 11303 utf8_printf(out, "%s", zQuoted); 11304 sqlite3_free(zQuoted); 11305 }else{ 11306 utf8_printf(out, "%s", z); 11307 } 11308 } 11309 if( bSep ){ 11310 utf8_printf(p->out, "%s", p->colSeparator); 11311 } 11312 } 11313 11314 /* 11315 ** This routine runs when the user presses Ctrl-C 11316 */ 11317 static void interrupt_handler(int NotUsed){ 11318 UNUSED_PARAMETER(NotUsed); 11319 seenInterrupt++; 11320 if( seenInterrupt>2 ) exit(1); 11321 if( globalDb ) sqlite3_interrupt(globalDb); 11322 } 11323 11324 #if (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE) 11325 /* 11326 ** This routine runs for console events (e.g. Ctrl-C) on Win32 11327 */ 11328 static BOOL WINAPI ConsoleCtrlHandler( 11329 DWORD dwCtrlType /* One of the CTRL_*_EVENT constants */ 11330 ){ 11331 if( dwCtrlType==CTRL_C_EVENT ){ 11332 interrupt_handler(0); 11333 return TRUE; 11334 } 11335 return FALSE; 11336 } 11337 #endif 11338 11339 #ifndef SQLITE_OMIT_AUTHORIZATION 11340 /* 11341 ** When the ".auth ON" is set, the following authorizer callback is 11342 ** invoked. It always returns SQLITE_OK. 11343 */ 11344 static int shellAuth( 11345 void *pClientData, 11346 int op, 11347 const char *zA1, 11348 const char *zA2, 11349 const char *zA3, 11350 const char *zA4 11351 ){ 11352 ShellState *p = (ShellState*)pClientData; 11353 static const char *azAction[] = { 0, 11354 "CREATE_INDEX", "CREATE_TABLE", "CREATE_TEMP_INDEX", 11355 "CREATE_TEMP_TABLE", "CREATE_TEMP_TRIGGER", "CREATE_TEMP_VIEW", 11356 "CREATE_TRIGGER", "CREATE_VIEW", "DELETE", 11357 "DROP_INDEX", "DROP_TABLE", "DROP_TEMP_INDEX", 11358 "DROP_TEMP_TABLE", "DROP_TEMP_TRIGGER", "DROP_TEMP_VIEW", 11359 "DROP_TRIGGER", "DROP_VIEW", "INSERT", 11360 "PRAGMA", "READ", "SELECT", 11361 "TRANSACTION", "UPDATE", "ATTACH", 11362 "DETACH", "ALTER_TABLE", "REINDEX", 11363 "ANALYZE", "CREATE_VTABLE", "DROP_VTABLE", 11364 "FUNCTION", "SAVEPOINT", "RECURSIVE" 11365 }; 11366 int i; 11367 const char *az[4]; 11368 az[0] = zA1; 11369 az[1] = zA2; 11370 az[2] = zA3; 11371 az[3] = zA4; 11372 utf8_printf(p->out, "authorizer: %s", azAction[op]); 11373 for(i=0; i<4; i++){ 11374 raw_printf(p->out, " "); 11375 if( az[i] ){ 11376 output_c_string(p->out, az[i]); 11377 }else{ 11378 raw_printf(p->out, "NULL"); 11379 } 11380 } 11381 raw_printf(p->out, "\n"); 11382 return SQLITE_OK; 11383 } 11384 #endif 11385 11386 /* 11387 ** Print a schema statement. Part of MODE_Semi and MODE_Pretty output. 11388 ** 11389 ** This routine converts some CREATE TABLE statements for shadow tables 11390 ** in FTS3/4/5 into CREATE TABLE IF NOT EXISTS statements. 11391 */ 11392 static void printSchemaLine(FILE *out, const char *z, const char *zTail){ 11393 if( z==0 ) return; 11394 if( zTail==0 ) return; 11395 if( sqlite3_strglob("CREATE TABLE ['\"]*", z)==0 ){ 11396 utf8_printf(out, "CREATE TABLE IF NOT EXISTS %s%s", z+13, zTail); 11397 }else{ 11398 utf8_printf(out, "%s%s", z, zTail); 11399 } 11400 } 11401 static void printSchemaLineN(FILE *out, char *z, int n, const char *zTail){ 11402 char c = z[n]; 11403 z[n] = 0; 11404 printSchemaLine(out, z, zTail); 11405 z[n] = c; 11406 } 11407 11408 /* 11409 ** Return true if string z[] has nothing but whitespace and comments to the 11410 ** end of the first line. 11411 */ 11412 static int wsToEol(const char *z){ 11413 int i; 11414 for(i=0; z[i]; i++){ 11415 if( z[i]=='\n' ) return 1; 11416 if( IsSpace(z[i]) ) continue; 11417 if( z[i]=='-' && z[i+1]=='-' ) return 1; 11418 return 0; 11419 } 11420 return 1; 11421 } 11422 11423 /* 11424 ** Add a new entry to the EXPLAIN QUERY PLAN data 11425 */ 11426 static void eqp_append(ShellState *p, int iEqpId, int p2, const char *zText){ 11427 EQPGraphRow *pNew; 11428 int nText = strlen30(zText); 11429 if( p->autoEQPtest ){ 11430 utf8_printf(p->out, "%d,%d,%s\n", iEqpId, p2, zText); 11431 } 11432 pNew = sqlite3_malloc64( sizeof(*pNew) + nText ); 11433 if( pNew==0 ) shell_out_of_memory(); 11434 pNew->iEqpId = iEqpId; 11435 pNew->iParentId = p2; 11436 memcpy(pNew->zText, zText, nText+1); 11437 pNew->pNext = 0; 11438 if( p->sGraph.pLast ){ 11439 p->sGraph.pLast->pNext = pNew; 11440 }else{ 11441 p->sGraph.pRow = pNew; 11442 } 11443 p->sGraph.pLast = pNew; 11444 } 11445 11446 /* 11447 ** Free and reset the EXPLAIN QUERY PLAN data that has been collected 11448 ** in p->sGraph. 11449 */ 11450 static void eqp_reset(ShellState *p){ 11451 EQPGraphRow *pRow, *pNext; 11452 for(pRow = p->sGraph.pRow; pRow; pRow = pNext){ 11453 pNext = pRow->pNext; 11454 sqlite3_free(pRow); 11455 } 11456 memset(&p->sGraph, 0, sizeof(p->sGraph)); 11457 } 11458 11459 /* Return the next EXPLAIN QUERY PLAN line with iEqpId that occurs after 11460 ** pOld, or return the first such line if pOld is NULL 11461 */ 11462 static EQPGraphRow *eqp_next_row(ShellState *p, int iEqpId, EQPGraphRow *pOld){ 11463 EQPGraphRow *pRow = pOld ? pOld->pNext : p->sGraph.pRow; 11464 while( pRow && pRow->iParentId!=iEqpId ) pRow = pRow->pNext; 11465 return pRow; 11466 } 11467 11468 /* Render a single level of the graph that has iEqpId as its parent. Called 11469 ** recursively to render sublevels. 11470 */ 11471 static void eqp_render_level(ShellState *p, int iEqpId){ 11472 EQPGraphRow *pRow, *pNext; 11473 int n = strlen30(p->sGraph.zPrefix); 11474 char *z; 11475 for(pRow = eqp_next_row(p, iEqpId, 0); pRow; pRow = pNext){ 11476 pNext = eqp_next_row(p, iEqpId, pRow); 11477 z = pRow->zText; 11478 utf8_printf(p->out, "%s%s%s\n", p->sGraph.zPrefix, 11479 pNext ? "|--" : "`--", z); 11480 if( n<(int)sizeof(p->sGraph.zPrefix)-7 ){ 11481 memcpy(&p->sGraph.zPrefix[n], pNext ? "| " : " ", 4); 11482 eqp_render_level(p, pRow->iEqpId); 11483 p->sGraph.zPrefix[n] = 0; 11484 } 11485 } 11486 } 11487 11488 /* 11489 ** Display and reset the EXPLAIN QUERY PLAN data 11490 */ 11491 static void eqp_render(ShellState *p){ 11492 EQPGraphRow *pRow = p->sGraph.pRow; 11493 if( pRow ){ 11494 if( pRow->zText[0]=='-' ){ 11495 if( pRow->pNext==0 ){ 11496 eqp_reset(p); 11497 return; 11498 } 11499 utf8_printf(p->out, "%s\n", pRow->zText+3); 11500 p->sGraph.pRow = pRow->pNext; 11501 sqlite3_free(pRow); 11502 }else{ 11503 utf8_printf(p->out, "QUERY PLAN\n"); 11504 } 11505 p->sGraph.zPrefix[0] = 0; 11506 eqp_render_level(p, 0); 11507 eqp_reset(p); 11508 } 11509 } 11510 11511 #ifndef SQLITE_OMIT_PROGRESS_CALLBACK 11512 /* 11513 ** Progress handler callback. 11514 */ 11515 static int progress_handler(void *pClientData) { 11516 ShellState *p = (ShellState*)pClientData; 11517 p->nProgress++; 11518 if( p->nProgress>=p->mxProgress && p->mxProgress>0 ){ 11519 raw_printf(p->out, "Progress limit reached (%u)\n", p->nProgress); 11520 if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0; 11521 if( p->flgProgress & SHELL_PROGRESS_ONCE ) p->mxProgress = 0; 11522 return 1; 11523 } 11524 if( (p->flgProgress & SHELL_PROGRESS_QUIET)==0 ){ 11525 raw_printf(p->out, "Progress %u\n", p->nProgress); 11526 } 11527 return 0; 11528 } 11529 #endif /* SQLITE_OMIT_PROGRESS_CALLBACK */ 11530 11531 /* 11532 ** Print N dashes 11533 */ 11534 static void print_dashes(FILE *out, int N){ 11535 const char zDash[] = "--------------------------------------------------"; 11536 const int nDash = sizeof(zDash) - 1; 11537 while( N>nDash ){ 11538 fputs(zDash, out); 11539 N -= nDash; 11540 } 11541 raw_printf(out, "%.*s", N, zDash); 11542 } 11543 11544 /* 11545 ** Print a markdown or table-style row separator using ascii-art 11546 */ 11547 static void print_row_separator( 11548 ShellState *p, 11549 int nArg, 11550 const char *zSep 11551 ){ 11552 int i; 11553 if( nArg>0 ){ 11554 fputs(zSep, p->out); 11555 print_dashes(p->out, p->actualWidth[0]+2); 11556 for(i=1; i<nArg; i++){ 11557 fputs(zSep, p->out); 11558 print_dashes(p->out, p->actualWidth[i]+2); 11559 } 11560 fputs(zSep, p->out); 11561 } 11562 fputs("\n", p->out); 11563 } 11564 11565 /* 11566 ** This is the callback routine that the shell 11567 ** invokes for each row of a query result. 11568 */ 11569 static int shell_callback( 11570 void *pArg, 11571 int nArg, /* Number of result columns */ 11572 char **azArg, /* Text of each result column */ 11573 char **azCol, /* Column names */ 11574 int *aiType /* Column types. Might be NULL */ 11575 ){ 11576 int i; 11577 ShellState *p = (ShellState*)pArg; 11578 11579 if( azArg==0 ) return 0; 11580 switch( p->cMode ){ 11581 case MODE_Line: { 11582 int w = 5; 11583 if( azArg==0 ) break; 11584 for(i=0; i<nArg; i++){ 11585 int len = strlen30(azCol[i] ? azCol[i] : ""); 11586 if( len>w ) w = len; 11587 } 11588 if( p->cnt++>0 ) utf8_printf(p->out, "%s", p->rowSeparator); 11589 for(i=0; i<nArg; i++){ 11590 utf8_printf(p->out,"%*s = %s%s", w, azCol[i], 11591 azArg[i] ? azArg[i] : p->nullValue, p->rowSeparator); 11592 } 11593 break; 11594 } 11595 case MODE_Explain: { 11596 static const int aExplainWidth[] = {4, 13, 4, 4, 4, 13, 2, 13}; 11597 if( nArg>ArraySize(aExplainWidth) ){ 11598 nArg = ArraySize(aExplainWidth); 11599 } 11600 if( p->cnt++==0 ){ 11601 for(i=0; i<nArg; i++){ 11602 int w = aExplainWidth[i]; 11603 utf8_width_print(p->out, w, azCol[i]); 11604 fputs(i==nArg-1 ? "\n" : " ", p->out); 11605 } 11606 for(i=0; i<nArg; i++){ 11607 int w = aExplainWidth[i]; 11608 print_dashes(p->out, w); 11609 fputs(i==nArg-1 ? "\n" : " ", p->out); 11610 } 11611 } 11612 if( azArg==0 ) break; 11613 for(i=0; i<nArg; i++){ 11614 int w = aExplainWidth[i]; 11615 if( azArg[i] && strlenChar(azArg[i])>w ){ 11616 w = strlenChar(azArg[i]); 11617 } 11618 if( i==1 && p->aiIndent && p->pStmt ){ 11619 if( p->iIndent<p->nIndent ){ 11620 utf8_printf(p->out, "%*.s", p->aiIndent[p->iIndent], ""); 11621 } 11622 p->iIndent++; 11623 } 11624 utf8_width_print(p->out, w, azArg[i] ? azArg[i] : p->nullValue); 11625 fputs(i==nArg-1 ? "\n" : " ", p->out); 11626 } 11627 break; 11628 } 11629 case MODE_Semi: { /* .schema and .fullschema output */ 11630 printSchemaLine(p->out, azArg[0], ";\n"); 11631 break; 11632 } 11633 case MODE_Pretty: { /* .schema and .fullschema with --indent */ 11634 char *z; 11635 int j; 11636 int nParen = 0; 11637 char cEnd = 0; 11638 char c; 11639 int nLine = 0; 11640 assert( nArg==1 ); 11641 if( azArg[0]==0 ) break; 11642 if( sqlite3_strlike("CREATE VIEW%", azArg[0], 0)==0 11643 || sqlite3_strlike("CREATE TRIG%", azArg[0], 0)==0 11644 ){ 11645 utf8_printf(p->out, "%s;\n", azArg[0]); 11646 break; 11647 } 11648 z = sqlite3_mprintf("%s", azArg[0]); 11649 j = 0; 11650 for(i=0; IsSpace(z[i]); i++){} 11651 for(; (c = z[i])!=0; i++){ 11652 if( IsSpace(c) ){ 11653 if( z[j-1]=='\r' ) z[j-1] = '\n'; 11654 if( IsSpace(z[j-1]) || z[j-1]=='(' ) continue; 11655 }else if( (c=='(' || c==')') && j>0 && IsSpace(z[j-1]) ){ 11656 j--; 11657 } 11658 z[j++] = c; 11659 } 11660 while( j>0 && IsSpace(z[j-1]) ){ j--; } 11661 z[j] = 0; 11662 if( strlen30(z)>=79 ){ 11663 for(i=j=0; (c = z[i])!=0; i++){ /* Copy from z[i] back to z[j] */ 11664 if( c==cEnd ){ 11665 cEnd = 0; 11666 }else if( c=='"' || c=='\'' || c=='`' ){ 11667 cEnd = c; 11668 }else if( c=='[' ){ 11669 cEnd = ']'; 11670 }else if( c=='-' && z[i+1]=='-' ){ 11671 cEnd = '\n'; 11672 }else if( c=='(' ){ 11673 nParen++; 11674 }else if( c==')' ){ 11675 nParen--; 11676 if( nLine>0 && nParen==0 && j>0 ){ 11677 printSchemaLineN(p->out, z, j, "\n"); 11678 j = 0; 11679 } 11680 } 11681 z[j++] = c; 11682 if( nParen==1 && cEnd==0 11683 && (c=='(' || c=='\n' || (c==',' && !wsToEol(z+i+1))) 11684 ){ 11685 if( c=='\n' ) j--; 11686 printSchemaLineN(p->out, z, j, "\n "); 11687 j = 0; 11688 nLine++; 11689 while( IsSpace(z[i+1]) ){ i++; } 11690 } 11691 } 11692 z[j] = 0; 11693 } 11694 printSchemaLine(p->out, z, ";\n"); 11695 sqlite3_free(z); 11696 break; 11697 } 11698 case MODE_List: { 11699 if( p->cnt++==0 && p->showHeader ){ 11700 for(i=0; i<nArg; i++){ 11701 utf8_printf(p->out,"%s%s",azCol[i], 11702 i==nArg-1 ? p->rowSeparator : p->colSeparator); 11703 } 11704 } 11705 if( azArg==0 ) break; 11706 for(i=0; i<nArg; i++){ 11707 char *z = azArg[i]; 11708 if( z==0 ) z = p->nullValue; 11709 utf8_printf(p->out, "%s", z); 11710 if( i<nArg-1 ){ 11711 utf8_printf(p->out, "%s", p->colSeparator); 11712 }else{ 11713 utf8_printf(p->out, "%s", p->rowSeparator); 11714 } 11715 } 11716 break; 11717 } 11718 case MODE_Html: { 11719 if( p->cnt++==0 && p->showHeader ){ 11720 raw_printf(p->out,"<TR>"); 11721 for(i=0; i<nArg; i++){ 11722 raw_printf(p->out,"<TH>"); 11723 output_html_string(p->out, azCol[i]); 11724 raw_printf(p->out,"</TH>\n"); 11725 } 11726 raw_printf(p->out,"</TR>\n"); 11727 } 11728 if( azArg==0 ) break; 11729 raw_printf(p->out,"<TR>"); 11730 for(i=0; i<nArg; i++){ 11731 raw_printf(p->out,"<TD>"); 11732 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullValue); 11733 raw_printf(p->out,"</TD>\n"); 11734 } 11735 raw_printf(p->out,"</TR>\n"); 11736 break; 11737 } 11738 case MODE_Tcl: { 11739 if( p->cnt++==0 && p->showHeader ){ 11740 for(i=0; i<nArg; i++){ 11741 output_c_string(p->out,azCol[i] ? azCol[i] : ""); 11742 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator); 11743 } 11744 utf8_printf(p->out, "%s", p->rowSeparator); 11745 } 11746 if( azArg==0 ) break; 11747 for(i=0; i<nArg; i++){ 11748 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullValue); 11749 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator); 11750 } 11751 utf8_printf(p->out, "%s", p->rowSeparator); 11752 break; 11753 } 11754 case MODE_Csv: { 11755 setBinaryMode(p->out, 1); 11756 if( p->cnt++==0 && p->showHeader ){ 11757 for(i=0; i<nArg; i++){ 11758 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1); 11759 } 11760 utf8_printf(p->out, "%s", p->rowSeparator); 11761 } 11762 if( nArg>0 ){ 11763 for(i=0; i<nArg; i++){ 11764 output_csv(p, azArg[i], i<nArg-1); 11765 } 11766 utf8_printf(p->out, "%s", p->rowSeparator); 11767 } 11768 setTextMode(p->out, 1); 11769 break; 11770 } 11771 case MODE_Insert: { 11772 if( azArg==0 ) break; 11773 utf8_printf(p->out,"INSERT INTO %s",p->zDestTable); 11774 if( p->showHeader ){ 11775 raw_printf(p->out,"("); 11776 for(i=0; i<nArg; i++){ 11777 if( i>0 ) raw_printf(p->out, ","); 11778 if( quoteChar(azCol[i]) ){ 11779 char *z = sqlite3_mprintf("\"%w\"", azCol[i]); 11780 utf8_printf(p->out, "%s", z); 11781 sqlite3_free(z); 11782 }else{ 11783 raw_printf(p->out, "%s", azCol[i]); 11784 } 11785 } 11786 raw_printf(p->out,")"); 11787 } 11788 p->cnt++; 11789 for(i=0; i<nArg; i++){ 11790 raw_printf(p->out, i>0 ? "," : " VALUES("); 11791 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){ 11792 utf8_printf(p->out,"NULL"); 11793 }else if( aiType && aiType[i]==SQLITE_TEXT ){ 11794 if( ShellHasFlag(p, SHFLG_Newlines) ){ 11795 output_quoted_string(p->out, azArg[i]); 11796 }else{ 11797 output_quoted_escaped_string(p->out, azArg[i]); 11798 } 11799 }else if( aiType && aiType[i]==SQLITE_INTEGER ){ 11800 utf8_printf(p->out,"%s", azArg[i]); 11801 }else if( aiType && aiType[i]==SQLITE_FLOAT ){ 11802 char z[50]; 11803 double r = sqlite3_column_double(p->pStmt, i); 11804 sqlite3_uint64 ur; 11805 memcpy(&ur,&r,sizeof(r)); 11806 if( ur==0x7ff0000000000000LL ){ 11807 raw_printf(p->out, "1e999"); 11808 }else if( ur==0xfff0000000000000LL ){ 11809 raw_printf(p->out, "-1e999"); 11810 }else{ 11811 sqlite3_snprintf(50,z,"%!.20g", r); 11812 raw_printf(p->out, "%s", z); 11813 } 11814 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){ 11815 const void *pBlob = sqlite3_column_blob(p->pStmt, i); 11816 int nBlob = sqlite3_column_bytes(p->pStmt, i); 11817 output_hex_blob(p->out, pBlob, nBlob); 11818 }else if( isNumber(azArg[i], 0) ){ 11819 utf8_printf(p->out,"%s", azArg[i]); 11820 }else if( ShellHasFlag(p, SHFLG_Newlines) ){ 11821 output_quoted_string(p->out, azArg[i]); 11822 }else{ 11823 output_quoted_escaped_string(p->out, azArg[i]); 11824 } 11825 } 11826 raw_printf(p->out,");\n"); 11827 break; 11828 } 11829 case MODE_Json: { 11830 if( azArg==0 ) break; 11831 if( p->cnt==0 ){ 11832 fputs("[{", p->out); 11833 }else{ 11834 fputs(",\n{", p->out); 11835 } 11836 p->cnt++; 11837 for(i=0; i<nArg; i++){ 11838 output_json_string(p->out, azCol[i], -1); 11839 putc(':', p->out); 11840 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){ 11841 fputs("null",p->out); 11842 }else if( aiType && aiType[i]==SQLITE_FLOAT ){ 11843 char z[50]; 11844 double r = sqlite3_column_double(p->pStmt, i); 11845 sqlite3_uint64 ur; 11846 memcpy(&ur,&r,sizeof(r)); 11847 if( ur==0x7ff0000000000000LL ){ 11848 raw_printf(p->out, "1e999"); 11849 }else if( ur==0xfff0000000000000LL ){ 11850 raw_printf(p->out, "-1e999"); 11851 }else{ 11852 sqlite3_snprintf(50,z,"%!.20g", r); 11853 raw_printf(p->out, "%s", z); 11854 } 11855 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){ 11856 const void *pBlob = sqlite3_column_blob(p->pStmt, i); 11857 int nBlob = sqlite3_column_bytes(p->pStmt, i); 11858 output_json_string(p->out, pBlob, nBlob); 11859 }else if( aiType && aiType[i]==SQLITE_TEXT ){ 11860 output_json_string(p->out, azArg[i], -1); 11861 }else{ 11862 utf8_printf(p->out,"%s", azArg[i]); 11863 } 11864 if( i<nArg-1 ){ 11865 putc(',', p->out); 11866 } 11867 } 11868 putc('}', p->out); 11869 break; 11870 } 11871 case MODE_Quote: { 11872 if( azArg==0 ) break; 11873 if( p->cnt==0 && p->showHeader ){ 11874 for(i=0; i<nArg; i++){ 11875 if( i>0 ) fputs(p->colSeparator, p->out); 11876 output_quoted_string(p->out, azCol[i]); 11877 } 11878 fputs(p->rowSeparator, p->out); 11879 } 11880 p->cnt++; 11881 for(i=0; i<nArg; i++){ 11882 if( i>0 ) fputs(p->colSeparator, p->out); 11883 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){ 11884 utf8_printf(p->out,"NULL"); 11885 }else if( aiType && aiType[i]==SQLITE_TEXT ){ 11886 output_quoted_string(p->out, azArg[i]); 11887 }else if( aiType && aiType[i]==SQLITE_INTEGER ){ 11888 utf8_printf(p->out,"%s", azArg[i]); 11889 }else if( aiType && aiType[i]==SQLITE_FLOAT ){ 11890 char z[50]; 11891 double r = sqlite3_column_double(p->pStmt, i); 11892 sqlite3_snprintf(50,z,"%!.20g", r); 11893 raw_printf(p->out, "%s", z); 11894 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){ 11895 const void *pBlob = sqlite3_column_blob(p->pStmt, i); 11896 int nBlob = sqlite3_column_bytes(p->pStmt, i); 11897 output_hex_blob(p->out, pBlob, nBlob); 11898 }else if( isNumber(azArg[i], 0) ){ 11899 utf8_printf(p->out,"%s", azArg[i]); 11900 }else{ 11901 output_quoted_string(p->out, azArg[i]); 11902 } 11903 } 11904 fputs(p->rowSeparator, p->out); 11905 break; 11906 } 11907 case MODE_Ascii: { 11908 if( p->cnt++==0 && p->showHeader ){ 11909 for(i=0; i<nArg; i++){ 11910 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator); 11911 utf8_printf(p->out,"%s",azCol[i] ? azCol[i] : ""); 11912 } 11913 utf8_printf(p->out, "%s", p->rowSeparator); 11914 } 11915 if( azArg==0 ) break; 11916 for(i=0; i<nArg; i++){ 11917 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator); 11918 utf8_printf(p->out,"%s",azArg[i] ? azArg[i] : p->nullValue); 11919 } 11920 utf8_printf(p->out, "%s", p->rowSeparator); 11921 break; 11922 } 11923 case MODE_EQP: { 11924 eqp_append(p, atoi(azArg[0]), atoi(azArg[1]), azArg[3]); 11925 break; 11926 } 11927 } 11928 return 0; 11929 } 11930 11931 /* 11932 ** This is the callback routine that the SQLite library 11933 ** invokes for each row of a query result. 11934 */ 11935 static int callback(void *pArg, int nArg, char **azArg, char **azCol){ 11936 /* since we don't have type info, call the shell_callback with a NULL value */ 11937 return shell_callback(pArg, nArg, azArg, azCol, NULL); 11938 } 11939 11940 /* 11941 ** This is the callback routine from sqlite3_exec() that appends all 11942 ** output onto the end of a ShellText object. 11943 */ 11944 static int captureOutputCallback(void *pArg, int nArg, char **azArg, char **az){ 11945 ShellText *p = (ShellText*)pArg; 11946 int i; 11947 UNUSED_PARAMETER(az); 11948 if( azArg==0 ) return 0; 11949 if( p->n ) appendText(p, "|", 0); 11950 for(i=0; i<nArg; i++){ 11951 if( i ) appendText(p, ",", 0); 11952 if( azArg[i] ) appendText(p, azArg[i], 0); 11953 } 11954 return 0; 11955 } 11956 11957 /* 11958 ** Generate an appropriate SELFTEST table in the main database. 11959 */ 11960 static void createSelftestTable(ShellState *p){ 11961 char *zErrMsg = 0; 11962 sqlite3_exec(p->db, 11963 "SAVEPOINT selftest_init;\n" 11964 "CREATE TABLE IF NOT EXISTS selftest(\n" 11965 " tno INTEGER PRIMARY KEY,\n" /* Test number */ 11966 " op TEXT,\n" /* Operator: memo run */ 11967 " cmd TEXT,\n" /* Command text */ 11968 " ans TEXT\n" /* Desired answer */ 11969 ");" 11970 "CREATE TEMP TABLE [_shell$self](op,cmd,ans);\n" 11971 "INSERT INTO [_shell$self](rowid,op,cmd)\n" 11972 " VALUES(coalesce((SELECT (max(tno)+100)/10 FROM selftest),10),\n" 11973 " 'memo','Tests generated by --init');\n" 11974 "INSERT INTO [_shell$self]\n" 11975 " SELECT 'run',\n" 11976 " 'SELECT hex(sha3_query(''SELECT type,name,tbl_name,sql " 11977 "FROM sqlite_schema ORDER BY 2'',224))',\n" 11978 " hex(sha3_query('SELECT type,name,tbl_name,sql " 11979 "FROM sqlite_schema ORDER BY 2',224));\n" 11980 "INSERT INTO [_shell$self]\n" 11981 " SELECT 'run'," 11982 " 'SELECT hex(sha3_query(''SELECT * FROM \"' ||" 11983 " printf('%w',name) || '\" NOT INDEXED'',224))',\n" 11984 " hex(sha3_query(printf('SELECT * FROM \"%w\" NOT INDEXED',name),224))\n" 11985 " FROM (\n" 11986 " SELECT name FROM sqlite_schema\n" 11987 " WHERE type='table'\n" 11988 " AND name<>'selftest'\n" 11989 " AND coalesce(rootpage,0)>0\n" 11990 " )\n" 11991 " ORDER BY name;\n" 11992 "INSERT INTO [_shell$self]\n" 11993 " VALUES('run','PRAGMA integrity_check','ok');\n" 11994 "INSERT INTO selftest(tno,op,cmd,ans)" 11995 " SELECT rowid*10,op,cmd,ans FROM [_shell$self];\n" 11996 "DROP TABLE [_shell$self];" 11997 ,0,0,&zErrMsg); 11998 if( zErrMsg ){ 11999 utf8_printf(stderr, "SELFTEST initialization failure: %s\n", zErrMsg); 12000 sqlite3_free(zErrMsg); 12001 } 12002 sqlite3_exec(p->db, "RELEASE selftest_init",0,0,0); 12003 } 12004 12005 12006 /* 12007 ** Set the destination table field of the ShellState structure to 12008 ** the name of the table given. Escape any quote characters in the 12009 ** table name. 12010 */ 12011 static void set_table_name(ShellState *p, const char *zName){ 12012 int i, n; 12013 char cQuote; 12014 char *z; 12015 12016 if( p->zDestTable ){ 12017 free(p->zDestTable); 12018 p->zDestTable = 0; 12019 } 12020 if( zName==0 ) return; 12021 cQuote = quoteChar(zName); 12022 n = strlen30(zName); 12023 if( cQuote ) n += n+2; 12024 z = p->zDestTable = malloc( n+1 ); 12025 if( z==0 ) shell_out_of_memory(); 12026 n = 0; 12027 if( cQuote ) z[n++] = cQuote; 12028 for(i=0; zName[i]; i++){ 12029 z[n++] = zName[i]; 12030 if( zName[i]==cQuote ) z[n++] = cQuote; 12031 } 12032 if( cQuote ) z[n++] = cQuote; 12033 z[n] = 0; 12034 } 12035 12036 12037 /* 12038 ** Execute a query statement that will generate SQL output. Print 12039 ** the result columns, comma-separated, on a line and then add a 12040 ** semicolon terminator to the end of that line. 12041 ** 12042 ** If the number of columns is 1 and that column contains text "--" 12043 ** then write the semicolon on a separate line. That way, if a 12044 ** "--" comment occurs at the end of the statement, the comment 12045 ** won't consume the semicolon terminator. 12046 */ 12047 static int run_table_dump_query( 12048 ShellState *p, /* Query context */ 12049 const char *zSelect /* SELECT statement to extract content */ 12050 ){ 12051 sqlite3_stmt *pSelect; 12052 int rc; 12053 int nResult; 12054 int i; 12055 const char *z; 12056 rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0); 12057 if( rc!=SQLITE_OK || !pSelect ){ 12058 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, 12059 sqlite3_errmsg(p->db)); 12060 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++; 12061 return rc; 12062 } 12063 rc = sqlite3_step(pSelect); 12064 nResult = sqlite3_column_count(pSelect); 12065 while( rc==SQLITE_ROW ){ 12066 z = (const char*)sqlite3_column_text(pSelect, 0); 12067 utf8_printf(p->out, "%s", z); 12068 for(i=1; i<nResult; i++){ 12069 utf8_printf(p->out, ",%s", sqlite3_column_text(pSelect, i)); 12070 } 12071 if( z==0 ) z = ""; 12072 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++; 12073 if( z[0] ){ 12074 raw_printf(p->out, "\n;\n"); 12075 }else{ 12076 raw_printf(p->out, ";\n"); 12077 } 12078 rc = sqlite3_step(pSelect); 12079 } 12080 rc = sqlite3_finalize(pSelect); 12081 if( rc!=SQLITE_OK ){ 12082 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, 12083 sqlite3_errmsg(p->db)); 12084 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++; 12085 } 12086 return rc; 12087 } 12088 12089 /* 12090 ** Allocate space and save off current error string. 12091 */ 12092 static char *save_err_msg( 12093 sqlite3 *db /* Database to query */ 12094 ){ 12095 int nErrMsg = 1+strlen30(sqlite3_errmsg(db)); 12096 char *zErrMsg = sqlite3_malloc64(nErrMsg); 12097 if( zErrMsg ){ 12098 memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg); 12099 } 12100 return zErrMsg; 12101 } 12102 12103 #ifdef __linux__ 12104 /* 12105 ** Attempt to display I/O stats on Linux using /proc/PID/io 12106 */ 12107 static void displayLinuxIoStats(FILE *out){ 12108 FILE *in; 12109 char z[200]; 12110 sqlite3_snprintf(sizeof(z), z, "/proc/%d/io", getpid()); 12111 in = fopen(z, "rb"); 12112 if( in==0 ) return; 12113 while( fgets(z, sizeof(z), in)!=0 ){ 12114 static const struct { 12115 const char *zPattern; 12116 const char *zDesc; 12117 } aTrans[] = { 12118 { "rchar: ", "Bytes received by read():" }, 12119 { "wchar: ", "Bytes sent to write():" }, 12120 { "syscr: ", "Read() system calls:" }, 12121 { "syscw: ", "Write() system calls:" }, 12122 { "read_bytes: ", "Bytes read from storage:" }, 12123 { "write_bytes: ", "Bytes written to storage:" }, 12124 { "cancelled_write_bytes: ", "Cancelled write bytes:" }, 12125 }; 12126 int i; 12127 for(i=0; i<ArraySize(aTrans); i++){ 12128 int n = strlen30(aTrans[i].zPattern); 12129 if( strncmp(aTrans[i].zPattern, z, n)==0 ){ 12130 utf8_printf(out, "%-36s %s", aTrans[i].zDesc, &z[n]); 12131 break; 12132 } 12133 } 12134 } 12135 fclose(in); 12136 } 12137 #endif 12138 12139 /* 12140 ** Display a single line of status using 64-bit values. 12141 */ 12142 static void displayStatLine( 12143 ShellState *p, /* The shell context */ 12144 char *zLabel, /* Label for this one line */ 12145 char *zFormat, /* Format for the result */ 12146 int iStatusCtrl, /* Which status to display */ 12147 int bReset /* True to reset the stats */ 12148 ){ 12149 sqlite3_int64 iCur = -1; 12150 sqlite3_int64 iHiwtr = -1; 12151 int i, nPercent; 12152 char zLine[200]; 12153 sqlite3_status64(iStatusCtrl, &iCur, &iHiwtr, bReset); 12154 for(i=0, nPercent=0; zFormat[i]; i++){ 12155 if( zFormat[i]=='%' ) nPercent++; 12156 } 12157 if( nPercent>1 ){ 12158 sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iCur, iHiwtr); 12159 }else{ 12160 sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iHiwtr); 12161 } 12162 raw_printf(p->out, "%-36s %s\n", zLabel, zLine); 12163 } 12164 12165 /* 12166 ** Display memory stats. 12167 */ 12168 static int display_stats( 12169 sqlite3 *db, /* Database to query */ 12170 ShellState *pArg, /* Pointer to ShellState */ 12171 int bReset /* True to reset the stats */ 12172 ){ 12173 int iCur; 12174 int iHiwtr; 12175 FILE *out; 12176 if( pArg==0 || pArg->out==0 ) return 0; 12177 out = pArg->out; 12178 12179 if( pArg->pStmt && (pArg->statsOn & 2) ){ 12180 int nCol, i, x; 12181 sqlite3_stmt *pStmt = pArg->pStmt; 12182 char z[100]; 12183 nCol = sqlite3_column_count(pStmt); 12184 raw_printf(out, "%-36s %d\n", "Number of output columns:", nCol); 12185 for(i=0; i<nCol; i++){ 12186 sqlite3_snprintf(sizeof(z),z,"Column %d %nname:", i, &x); 12187 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_name(pStmt,i)); 12188 #ifndef SQLITE_OMIT_DECLTYPE 12189 sqlite3_snprintf(30, z+x, "declared type:"); 12190 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_decltype(pStmt, i)); 12191 #endif 12192 #ifdef SQLITE_ENABLE_COLUMN_METADATA 12193 sqlite3_snprintf(30, z+x, "database name:"); 12194 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_database_name(pStmt,i)); 12195 sqlite3_snprintf(30, z+x, "table name:"); 12196 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_table_name(pStmt,i)); 12197 sqlite3_snprintf(30, z+x, "origin name:"); 12198 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_origin_name(pStmt,i)); 12199 #endif 12200 } 12201 } 12202 12203 displayStatLine(pArg, "Memory Used:", 12204 "%lld (max %lld) bytes", SQLITE_STATUS_MEMORY_USED, bReset); 12205 displayStatLine(pArg, "Number of Outstanding Allocations:", 12206 "%lld (max %lld)", SQLITE_STATUS_MALLOC_COUNT, bReset); 12207 if( pArg->shellFlgs & SHFLG_Pagecache ){ 12208 displayStatLine(pArg, "Number of Pcache Pages Used:", 12209 "%lld (max %lld) pages", SQLITE_STATUS_PAGECACHE_USED, bReset); 12210 } 12211 displayStatLine(pArg, "Number of Pcache Overflow Bytes:", 12212 "%lld (max %lld) bytes", SQLITE_STATUS_PAGECACHE_OVERFLOW, bReset); 12213 displayStatLine(pArg, "Largest Allocation:", 12214 "%lld bytes", SQLITE_STATUS_MALLOC_SIZE, bReset); 12215 displayStatLine(pArg, "Largest Pcache Allocation:", 12216 "%lld bytes", SQLITE_STATUS_PAGECACHE_SIZE, bReset); 12217 #ifdef YYTRACKMAXSTACKDEPTH 12218 displayStatLine(pArg, "Deepest Parser Stack:", 12219 "%lld (max %lld)", SQLITE_STATUS_PARSER_STACK, bReset); 12220 #endif 12221 12222 if( db ){ 12223 if( pArg->shellFlgs & SHFLG_Lookaside ){ 12224 iHiwtr = iCur = -1; 12225 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED, 12226 &iCur, &iHiwtr, bReset); 12227 raw_printf(pArg->out, 12228 "Lookaside Slots Used: %d (max %d)\n", 12229 iCur, iHiwtr); 12230 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT, 12231 &iCur, &iHiwtr, bReset); 12232 raw_printf(pArg->out, "Successful lookaside attempts: %d\n", 12233 iHiwtr); 12234 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE, 12235 &iCur, &iHiwtr, bReset); 12236 raw_printf(pArg->out, "Lookaside failures due to size: %d\n", 12237 iHiwtr); 12238 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL, 12239 &iCur, &iHiwtr, bReset); 12240 raw_printf(pArg->out, "Lookaside failures due to OOM: %d\n", 12241 iHiwtr); 12242 } 12243 iHiwtr = iCur = -1; 12244 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset); 12245 raw_printf(pArg->out, "Pager Heap Usage: %d bytes\n", 12246 iCur); 12247 iHiwtr = iCur = -1; 12248 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1); 12249 raw_printf(pArg->out, "Page cache hits: %d\n", iCur); 12250 iHiwtr = iCur = -1; 12251 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1); 12252 raw_printf(pArg->out, "Page cache misses: %d\n", iCur); 12253 iHiwtr = iCur = -1; 12254 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1); 12255 raw_printf(pArg->out, "Page cache writes: %d\n", iCur); 12256 iHiwtr = iCur = -1; 12257 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_SPILL, &iCur, &iHiwtr, 1); 12258 raw_printf(pArg->out, "Page cache spills: %d\n", iCur); 12259 iHiwtr = iCur = -1; 12260 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset); 12261 raw_printf(pArg->out, "Schema Heap Usage: %d bytes\n", 12262 iCur); 12263 iHiwtr = iCur = -1; 12264 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset); 12265 raw_printf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n", 12266 iCur); 12267 } 12268 12269 if( pArg->pStmt ){ 12270 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP, 12271 bReset); 12272 raw_printf(pArg->out, "Fullscan Steps: %d\n", iCur); 12273 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset); 12274 raw_printf(pArg->out, "Sort Operations: %d\n", iCur); 12275 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset); 12276 raw_printf(pArg->out, "Autoindex Inserts: %d\n", iCur); 12277 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset); 12278 raw_printf(pArg->out, "Virtual Machine Steps: %d\n", iCur); 12279 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_REPREPARE,bReset); 12280 raw_printf(pArg->out, "Reprepare operations: %d\n", iCur); 12281 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_RUN, bReset); 12282 raw_printf(pArg->out, "Number of times run: %d\n", iCur); 12283 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_MEMUSED, bReset); 12284 raw_printf(pArg->out, "Memory used by prepared stmt: %d\n", iCur); 12285 } 12286 12287 #ifdef __linux__ 12288 displayLinuxIoStats(pArg->out); 12289 #endif 12290 12291 /* Do not remove this machine readable comment: extra-stats-output-here */ 12292 12293 return 0; 12294 } 12295 12296 /* 12297 ** Display scan stats. 12298 */ 12299 static void display_scanstats( 12300 sqlite3 *db, /* Database to query */ 12301 ShellState *pArg /* Pointer to ShellState */ 12302 ){ 12303 #ifndef SQLITE_ENABLE_STMT_SCANSTATUS 12304 UNUSED_PARAMETER(db); 12305 UNUSED_PARAMETER(pArg); 12306 #else 12307 int i, k, n, mx; 12308 raw_printf(pArg->out, "-------- scanstats --------\n"); 12309 mx = 0; 12310 for(k=0; k<=mx; k++){ 12311 double rEstLoop = 1.0; 12312 for(i=n=0; 1; i++){ 12313 sqlite3_stmt *p = pArg->pStmt; 12314 sqlite3_int64 nLoop, nVisit; 12315 double rEst; 12316 int iSid; 12317 const char *zExplain; 12318 if( sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NLOOP, (void*)&nLoop) ){ 12319 break; 12320 } 12321 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_SELECTID, (void*)&iSid); 12322 if( iSid>mx ) mx = iSid; 12323 if( iSid!=k ) continue; 12324 if( n==0 ){ 12325 rEstLoop = (double)nLoop; 12326 if( k>0 ) raw_printf(pArg->out, "-------- subquery %d -------\n", k); 12327 } 12328 n++; 12329 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NVISIT, (void*)&nVisit); 12330 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EST, (void*)&rEst); 12331 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EXPLAIN, (void*)&zExplain); 12332 utf8_printf(pArg->out, "Loop %2d: %s\n", n, zExplain); 12333 rEstLoop *= rEst; 12334 raw_printf(pArg->out, 12335 " nLoop=%-8lld nRow=%-8lld estRow=%-8lld estRow/Loop=%-8g\n", 12336 nLoop, nVisit, (sqlite3_int64)(rEstLoop+0.5), rEst 12337 ); 12338 } 12339 } 12340 raw_printf(pArg->out, "---------------------------\n"); 12341 #endif 12342 } 12343 12344 /* 12345 ** Parameter azArray points to a zero-terminated array of strings. zStr 12346 ** points to a single nul-terminated string. Return non-zero if zStr 12347 ** is equal, according to strcmp(), to any of the strings in the array. 12348 ** Otherwise, return zero. 12349 */ 12350 static int str_in_array(const char *zStr, const char **azArray){ 12351 int i; 12352 for(i=0; azArray[i]; i++){ 12353 if( 0==strcmp(zStr, azArray[i]) ) return 1; 12354 } 12355 return 0; 12356 } 12357 12358 /* 12359 ** If compiled statement pSql appears to be an EXPLAIN statement, allocate 12360 ** and populate the ShellState.aiIndent[] array with the number of 12361 ** spaces each opcode should be indented before it is output. 12362 ** 12363 ** The indenting rules are: 12364 ** 12365 ** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent 12366 ** all opcodes that occur between the p2 jump destination and the opcode 12367 ** itself by 2 spaces. 12368 ** 12369 ** * For each "Goto", if the jump destination is earlier in the program 12370 ** and ends on one of: 12371 ** Yield SeekGt SeekLt RowSetRead Rewind 12372 ** or if the P1 parameter is one instead of zero, 12373 ** then indent all opcodes between the earlier instruction 12374 ** and "Goto" by 2 spaces. 12375 */ 12376 static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){ 12377 const char *zSql; /* The text of the SQL statement */ 12378 const char *z; /* Used to check if this is an EXPLAIN */ 12379 int *abYield = 0; /* True if op is an OP_Yield */ 12380 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */ 12381 int iOp; /* Index of operation in p->aiIndent[] */ 12382 12383 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext", 0 }; 12384 const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead", 12385 "Rewind", 0 }; 12386 const char *azGoto[] = { "Goto", 0 }; 12387 12388 /* Try to figure out if this is really an EXPLAIN statement. If this 12389 ** cannot be verified, return early. */ 12390 if( sqlite3_column_count(pSql)!=8 ){ 12391 p->cMode = p->mode; 12392 return; 12393 } 12394 zSql = sqlite3_sql(pSql); 12395 if( zSql==0 ) return; 12396 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++); 12397 if( sqlite3_strnicmp(z, "explain", 7) ){ 12398 p->cMode = p->mode; 12399 return; 12400 } 12401 12402 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){ 12403 int i; 12404 int iAddr = sqlite3_column_int(pSql, 0); 12405 const char *zOp = (const char*)sqlite3_column_text(pSql, 1); 12406 12407 /* Set p2 to the P2 field of the current opcode. Then, assuming that 12408 ** p2 is an instruction address, set variable p2op to the index of that 12409 ** instruction in the aiIndent[] array. p2 and p2op may be different if 12410 ** the current instruction is part of a sub-program generated by an 12411 ** SQL trigger or foreign key. */ 12412 int p2 = sqlite3_column_int(pSql, 3); 12413 int p2op = (p2 + (iOp-iAddr)); 12414 12415 /* Grow the p->aiIndent array as required */ 12416 if( iOp>=nAlloc ){ 12417 if( iOp==0 ){ 12418 /* Do further verfication that this is explain output. Abort if 12419 ** it is not */ 12420 static const char *explainCols[] = { 12421 "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment" }; 12422 int jj; 12423 for(jj=0; jj<ArraySize(explainCols); jj++){ 12424 if( strcmp(sqlite3_column_name(pSql,jj),explainCols[jj])!=0 ){ 12425 p->cMode = p->mode; 12426 sqlite3_reset(pSql); 12427 return; 12428 } 12429 } 12430 } 12431 nAlloc += 100; 12432 p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int)); 12433 if( p->aiIndent==0 ) shell_out_of_memory(); 12434 abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int)); 12435 if( abYield==0 ) shell_out_of_memory(); 12436 } 12437 abYield[iOp] = str_in_array(zOp, azYield); 12438 p->aiIndent[iOp] = 0; 12439 p->nIndent = iOp+1; 12440 12441 if( str_in_array(zOp, azNext) ){ 12442 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2; 12443 } 12444 if( str_in_array(zOp, azGoto) && p2op<p->nIndent 12445 && (abYield[p2op] || sqlite3_column_int(pSql, 2)) 12446 ){ 12447 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2; 12448 } 12449 } 12450 12451 p->iIndent = 0; 12452 sqlite3_free(abYield); 12453 sqlite3_reset(pSql); 12454 } 12455 12456 /* 12457 ** Free the array allocated by explain_data_prepare(). 12458 */ 12459 static void explain_data_delete(ShellState *p){ 12460 sqlite3_free(p->aiIndent); 12461 p->aiIndent = 0; 12462 p->nIndent = 0; 12463 p->iIndent = 0; 12464 } 12465 12466 /* 12467 ** Disable and restore .wheretrace and .selecttrace settings. 12468 */ 12469 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE) 12470 extern unsigned int sqlite3_unsupported_selecttrace; 12471 static int savedSelectTrace; 12472 #endif 12473 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE) 12474 extern int sqlite3WhereTrace; 12475 static int savedWhereTrace; 12476 #endif 12477 static void disable_debug_trace_modes(void){ 12478 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE) 12479 savedSelectTrace = sqlite3_unsupported_selecttrace; 12480 sqlite3_unsupported_selecttrace = 0; 12481 #endif 12482 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE) 12483 savedWhereTrace = sqlite3WhereTrace; 12484 sqlite3WhereTrace = 0; 12485 #endif 12486 } 12487 static void restore_debug_trace_modes(void){ 12488 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE) 12489 sqlite3_unsupported_selecttrace = savedSelectTrace; 12490 #endif 12491 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE) 12492 sqlite3WhereTrace = savedWhereTrace; 12493 #endif 12494 } 12495 12496 /* Create the TEMP table used to store parameter bindings */ 12497 static void bind_table_init(ShellState *p){ 12498 int wrSchema = 0; 12499 int defensiveMode = 0; 12500 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, -1, &defensiveMode); 12501 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, 0, 0); 12502 sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, -1, &wrSchema); 12503 sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, 1, 0); 12504 sqlite3_exec(p->db, 12505 "CREATE TABLE IF NOT EXISTS temp.sqlite_parameters(\n" 12506 " key TEXT PRIMARY KEY,\n" 12507 " value ANY\n" 12508 ") WITHOUT ROWID;", 12509 0, 0, 0); 12510 sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, wrSchema, 0); 12511 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, defensiveMode, 0); 12512 } 12513 12514 /* 12515 ** Bind parameters on a prepared statement. 12516 ** 12517 ** Parameter bindings are taken from a TEMP table of the form: 12518 ** 12519 ** CREATE TEMP TABLE sqlite_parameters(key TEXT PRIMARY KEY, value) 12520 ** WITHOUT ROWID; 12521 ** 12522 ** No bindings occur if this table does not exist. The name of the table 12523 ** begins with "sqlite_" so that it will not collide with ordinary application 12524 ** tables. The table must be in the TEMP schema. 12525 */ 12526 static void bind_prepared_stmt(ShellState *pArg, sqlite3_stmt *pStmt){ 12527 int nVar; 12528 int i; 12529 int rc; 12530 sqlite3_stmt *pQ = 0; 12531 12532 nVar = sqlite3_bind_parameter_count(pStmt); 12533 if( nVar==0 ) return; /* Nothing to do */ 12534 if( sqlite3_table_column_metadata(pArg->db, "TEMP", "sqlite_parameters", 12535 "key", 0, 0, 0, 0, 0)!=SQLITE_OK ){ 12536 return; /* Parameter table does not exist */ 12537 } 12538 rc = sqlite3_prepare_v2(pArg->db, 12539 "SELECT value FROM temp.sqlite_parameters" 12540 " WHERE key=?1", -1, &pQ, 0); 12541 if( rc || pQ==0 ) return; 12542 for(i=1; i<=nVar; i++){ 12543 char zNum[30]; 12544 const char *zVar = sqlite3_bind_parameter_name(pStmt, i); 12545 if( zVar==0 ){ 12546 sqlite3_snprintf(sizeof(zNum),zNum,"?%d",i); 12547 zVar = zNum; 12548 } 12549 sqlite3_bind_text(pQ, 1, zVar, -1, SQLITE_STATIC); 12550 if( sqlite3_step(pQ)==SQLITE_ROW ){ 12551 sqlite3_bind_value(pStmt, i, sqlite3_column_value(pQ, 0)); 12552 }else{ 12553 sqlite3_bind_null(pStmt, i); 12554 } 12555 sqlite3_reset(pQ); 12556 } 12557 sqlite3_finalize(pQ); 12558 } 12559 12560 /* 12561 ** UTF8 box-drawing characters. Imagine box lines like this: 12562 ** 12563 ** 1 12564 ** | 12565 ** 4 --+-- 2 12566 ** | 12567 ** 3 12568 ** 12569 ** Each box characters has between 2 and 4 of the lines leading from 12570 ** the center. The characters are here identified by the numbers of 12571 ** their corresponding lines. 12572 */ 12573 #define BOX_24 "\342\224\200" /* U+2500 --- */ 12574 #define BOX_13 "\342\224\202" /* U+2502 | */ 12575 #define BOX_23 "\342\224\214" /* U+250c ,- */ 12576 #define BOX_34 "\342\224\220" /* U+2510 -, */ 12577 #define BOX_12 "\342\224\224" /* U+2514 '- */ 12578 #define BOX_14 "\342\224\230" /* U+2518 -' */ 12579 #define BOX_123 "\342\224\234" /* U+251c |- */ 12580 #define BOX_134 "\342\224\244" /* U+2524 -| */ 12581 #define BOX_234 "\342\224\254" /* U+252c -,- */ 12582 #define BOX_124 "\342\224\264" /* U+2534 -'- */ 12583 #define BOX_1234 "\342\224\274" /* U+253c -|- */ 12584 12585 /* Draw horizontal line N characters long using unicode box 12586 ** characters 12587 */ 12588 static void print_box_line(FILE *out, int N){ 12589 const char zDash[] = 12590 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 12591 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24; 12592 const int nDash = sizeof(zDash) - 1; 12593 N *= 3; 12594 while( N>nDash ){ 12595 utf8_printf(out, zDash); 12596 N -= nDash; 12597 } 12598 utf8_printf(out, "%.*s", N, zDash); 12599 } 12600 12601 /* 12602 ** Draw a horizontal separator for a MODE_Box table. 12603 */ 12604 static void print_box_row_separator( 12605 ShellState *p, 12606 int nArg, 12607 const char *zSep1, 12608 const char *zSep2, 12609 const char *zSep3 12610 ){ 12611 int i; 12612 if( nArg>0 ){ 12613 utf8_printf(p->out, "%s", zSep1); 12614 print_box_line(p->out, p->actualWidth[0]+2); 12615 for(i=1; i<nArg; i++){ 12616 utf8_printf(p->out, "%s", zSep2); 12617 print_box_line(p->out, p->actualWidth[i]+2); 12618 } 12619 utf8_printf(p->out, "%s", zSep3); 12620 } 12621 fputs("\n", p->out); 12622 } 12623 12624 12625 12626 /* 12627 ** Run a prepared statement and output the result in one of the 12628 ** table-oriented formats: MODE_Column, MODE_Markdown, MODE_Table, 12629 ** or MODE_Box. 12630 ** 12631 ** This is different from ordinary exec_prepared_stmt() in that 12632 ** it has to run the entire query and gather the results into memory 12633 ** first, in order to determine column widths, before providing 12634 ** any output. 12635 */ 12636 static void exec_prepared_stmt_columnar( 12637 ShellState *p, /* Pointer to ShellState */ 12638 sqlite3_stmt *pStmt /* Statment to run */ 12639 ){ 12640 sqlite3_int64 nRow = 0; 12641 int nColumn = 0; 12642 char **azData = 0; 12643 sqlite3_int64 nAlloc = 0; 12644 const char *z; 12645 int rc; 12646 sqlite3_int64 i, nData; 12647 int j, nTotal, w, n; 12648 const char *colSep = 0; 12649 const char *rowSep = 0; 12650 12651 rc = sqlite3_step(pStmt); 12652 if( rc!=SQLITE_ROW ) return; 12653 nColumn = sqlite3_column_count(pStmt); 12654 nAlloc = nColumn*4; 12655 azData = sqlite3_malloc64( nAlloc*sizeof(char*) ); 12656 if( azData==0 ) shell_out_of_memory(); 12657 for(i=0; i<nColumn; i++){ 12658 azData[i] = strdup(sqlite3_column_name(pStmt,i)); 12659 } 12660 do{ 12661 if( (nRow+2)*nColumn >= nAlloc ){ 12662 nAlloc *= 2; 12663 azData = sqlite3_realloc64(azData, nAlloc*sizeof(char*)); 12664 if( azData==0 ) shell_out_of_memory(); 12665 } 12666 nRow++; 12667 for(i=0; i<nColumn; i++){ 12668 z = (const char*)sqlite3_column_text(pStmt,i); 12669 azData[nRow*nColumn + i] = z ? strdup(z) : 0; 12670 } 12671 }while( (rc = sqlite3_step(pStmt))==SQLITE_ROW ); 12672 if( nColumn>p->nWidth ){ 12673 p->colWidth = realloc(p->colWidth, nColumn*2*sizeof(int)); 12674 if( p->colWidth==0 ) shell_out_of_memory(); 12675 for(i=p->nWidth; i<nColumn; i++) p->colWidth[i] = 0; 12676 p->nWidth = nColumn; 12677 p->actualWidth = &p->colWidth[nColumn]; 12678 } 12679 memset(p->actualWidth, 0, nColumn*sizeof(int)); 12680 for(i=0; i<nColumn; i++){ 12681 w = p->colWidth[i]; 12682 if( w<0 ) w = -w; 12683 p->actualWidth[i] = w; 12684 } 12685 nTotal = nColumn*(nRow+1); 12686 for(i=0; i<nTotal; i++){ 12687 z = azData[i]; 12688 if( z==0 ) z = p->nullValue; 12689 n = strlenChar(z); 12690 j = i%nColumn; 12691 if( n>p->actualWidth[j] ) p->actualWidth[j] = n; 12692 } 12693 if( seenInterrupt ) goto columnar_end; 12694 switch( p->cMode ){ 12695 case MODE_Column: { 12696 colSep = " "; 12697 rowSep = "\n"; 12698 if( p->showHeader ){ 12699 for(i=0; i<nColumn; i++){ 12700 w = p->actualWidth[i]; 12701 if( p->colWidth[i]<0 ) w = -w; 12702 utf8_width_print(p->out, w, azData[i]); 12703 fputs(i==nColumn-1?"\n":" ", p->out); 12704 } 12705 for(i=0; i<nColumn; i++){ 12706 print_dashes(p->out, p->actualWidth[i]); 12707 fputs(i==nColumn-1?"\n":" ", p->out); 12708 } 12709 } 12710 break; 12711 } 12712 case MODE_Table: { 12713 colSep = " | "; 12714 rowSep = " |\n"; 12715 print_row_separator(p, nColumn, "+"); 12716 fputs("| ", p->out); 12717 for(i=0; i<nColumn; i++){ 12718 w = p->actualWidth[i]; 12719 n = strlenChar(azData[i]); 12720 utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, ""); 12721 fputs(i==nColumn-1?" |\n":" | ", p->out); 12722 } 12723 print_row_separator(p, nColumn, "+"); 12724 break; 12725 } 12726 case MODE_Markdown: { 12727 colSep = " | "; 12728 rowSep = " |\n"; 12729 fputs("| ", p->out); 12730 for(i=0; i<nColumn; i++){ 12731 w = p->actualWidth[i]; 12732 n = strlenChar(azData[i]); 12733 utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, ""); 12734 fputs(i==nColumn-1?" |\n":" | ", p->out); 12735 } 12736 print_row_separator(p, nColumn, "|"); 12737 break; 12738 } 12739 case MODE_Box: { 12740 colSep = " " BOX_13 " "; 12741 rowSep = " " BOX_13 "\n"; 12742 print_box_row_separator(p, nColumn, BOX_23, BOX_234, BOX_34); 12743 utf8_printf(p->out, BOX_13 " "); 12744 for(i=0; i<nColumn; i++){ 12745 w = p->actualWidth[i]; 12746 n = strlenChar(azData[i]); 12747 utf8_printf(p->out, "%*s%s%*s%s", 12748 (w-n)/2, "", azData[i], (w-n+1)/2, "", 12749 i==nColumn-1?" "BOX_13"\n":" "BOX_13" "); 12750 } 12751 print_box_row_separator(p, nColumn, BOX_123, BOX_1234, BOX_134); 12752 break; 12753 } 12754 } 12755 for(i=nColumn, j=0; i<nTotal; i++, j++){ 12756 if( j==0 && p->cMode!=MODE_Column ){ 12757 utf8_printf(p->out, "%s", p->cMode==MODE_Box?BOX_13" ":"| "); 12758 } 12759 z = azData[i]; 12760 if( z==0 ) z = p->nullValue; 12761 w = p->actualWidth[j]; 12762 if( p->colWidth[j]<0 ) w = -w; 12763 utf8_width_print(p->out, w, z); 12764 if( j==nColumn-1 ){ 12765 utf8_printf(p->out, "%s", rowSep); 12766 j = -1; 12767 if( seenInterrupt ) goto columnar_end; 12768 }else{ 12769 utf8_printf(p->out, "%s", colSep); 12770 } 12771 } 12772 if( p->cMode==MODE_Table ){ 12773 print_row_separator(p, nColumn, "+"); 12774 }else if( p->cMode==MODE_Box ){ 12775 print_box_row_separator(p, nColumn, BOX_12, BOX_124, BOX_14); 12776 } 12777 columnar_end: 12778 if( seenInterrupt ){ 12779 utf8_printf(p->out, "Interrupt\n"); 12780 } 12781 nData = (nRow+1)*nColumn; 12782 for(i=0; i<nData; i++) free(azData[i]); 12783 sqlite3_free(azData); 12784 } 12785 12786 /* 12787 ** Run a prepared statement 12788 */ 12789 static void exec_prepared_stmt( 12790 ShellState *pArg, /* Pointer to ShellState */ 12791 sqlite3_stmt *pStmt /* Statment to run */ 12792 ){ 12793 int rc; 12794 12795 if( pArg->cMode==MODE_Column 12796 || pArg->cMode==MODE_Table 12797 || pArg->cMode==MODE_Box 12798 || pArg->cMode==MODE_Markdown 12799 ){ 12800 exec_prepared_stmt_columnar(pArg, pStmt); 12801 return; 12802 } 12803 12804 /* perform the first step. this will tell us if we 12805 ** have a result set or not and how wide it is. 12806 */ 12807 rc = sqlite3_step(pStmt); 12808 /* if we have a result set... */ 12809 if( SQLITE_ROW == rc ){ 12810 /* allocate space for col name ptr, value ptr, and type */ 12811 int nCol = sqlite3_column_count(pStmt); 12812 void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1); 12813 if( !pData ){ 12814 rc = SQLITE_NOMEM; 12815 }else{ 12816 char **azCols = (char **)pData; /* Names of result columns */ 12817 char **azVals = &azCols[nCol]; /* Results */ 12818 int *aiTypes = (int *)&azVals[nCol]; /* Result types */ 12819 int i, x; 12820 assert(sizeof(int) <= sizeof(char *)); 12821 /* save off ptrs to column names */ 12822 for(i=0; i<nCol; i++){ 12823 azCols[i] = (char *)sqlite3_column_name(pStmt, i); 12824 } 12825 do{ 12826 /* extract the data and data types */ 12827 for(i=0; i<nCol; i++){ 12828 aiTypes[i] = x = sqlite3_column_type(pStmt, i); 12829 if( x==SQLITE_BLOB && pArg && pArg->cMode==MODE_Insert ){ 12830 azVals[i] = ""; 12831 }else{ 12832 azVals[i] = (char*)sqlite3_column_text(pStmt, i); 12833 } 12834 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){ 12835 rc = SQLITE_NOMEM; 12836 break; /* from for */ 12837 } 12838 } /* end for */ 12839 12840 /* if data and types extracted successfully... */ 12841 if( SQLITE_ROW == rc ){ 12842 /* call the supplied callback with the result row data */ 12843 if( shell_callback(pArg, nCol, azVals, azCols, aiTypes) ){ 12844 rc = SQLITE_ABORT; 12845 }else{ 12846 rc = sqlite3_step(pStmt); 12847 } 12848 } 12849 } while( SQLITE_ROW == rc ); 12850 sqlite3_free(pData); 12851 if( pArg->cMode==MODE_Json ){ 12852 fputs("]\n", pArg->out); 12853 } 12854 } 12855 } 12856 } 12857 12858 #ifndef SQLITE_OMIT_VIRTUALTABLE 12859 /* 12860 ** This function is called to process SQL if the previous shell command 12861 ** was ".expert". It passes the SQL in the second argument directly to 12862 ** the sqlite3expert object. 12863 ** 12864 ** If successful, SQLITE_OK is returned. Otherwise, an SQLite error 12865 ** code. In this case, (*pzErr) may be set to point to a buffer containing 12866 ** an English language error message. It is the responsibility of the 12867 ** caller to eventually free this buffer using sqlite3_free(). 12868 */ 12869 static int expertHandleSQL( 12870 ShellState *pState, 12871 const char *zSql, 12872 char **pzErr 12873 ){ 12874 assert( pState->expert.pExpert ); 12875 assert( pzErr==0 || *pzErr==0 ); 12876 return sqlite3_expert_sql(pState->expert.pExpert, zSql, pzErr); 12877 } 12878 12879 /* 12880 ** This function is called either to silently clean up the object 12881 ** created by the ".expert" command (if bCancel==1), or to generate a 12882 ** report from it and then clean it up (if bCancel==0). 12883 ** 12884 ** If successful, SQLITE_OK is returned. Otherwise, an SQLite error 12885 ** code. In this case, (*pzErr) may be set to point to a buffer containing 12886 ** an English language error message. It is the responsibility of the 12887 ** caller to eventually free this buffer using sqlite3_free(). 12888 */ 12889 static int expertFinish( 12890 ShellState *pState, 12891 int bCancel, 12892 char **pzErr 12893 ){ 12894 int rc = SQLITE_OK; 12895 sqlite3expert *p = pState->expert.pExpert; 12896 assert( p ); 12897 assert( bCancel || pzErr==0 || *pzErr==0 ); 12898 if( bCancel==0 ){ 12899 FILE *out = pState->out; 12900 int bVerbose = pState->expert.bVerbose; 12901 12902 rc = sqlite3_expert_analyze(p, pzErr); 12903 if( rc==SQLITE_OK ){ 12904 int nQuery = sqlite3_expert_count(p); 12905 int i; 12906 12907 if( bVerbose ){ 12908 const char *zCand = sqlite3_expert_report(p,0,EXPERT_REPORT_CANDIDATES); 12909 raw_printf(out, "-- Candidates -----------------------------\n"); 12910 raw_printf(out, "%s\n", zCand); 12911 } 12912 for(i=0; i<nQuery; i++){ 12913 const char *zSql = sqlite3_expert_report(p, i, EXPERT_REPORT_SQL); 12914 const char *zIdx = sqlite3_expert_report(p, i, EXPERT_REPORT_INDEXES); 12915 const char *zEQP = sqlite3_expert_report(p, i, EXPERT_REPORT_PLAN); 12916 if( zIdx==0 ) zIdx = "(no new indexes)\n"; 12917 if( bVerbose ){ 12918 raw_printf(out, "-- Query %d --------------------------------\n",i+1); 12919 raw_printf(out, "%s\n\n", zSql); 12920 } 12921 raw_printf(out, "%s\n", zIdx); 12922 raw_printf(out, "%s\n", zEQP); 12923 } 12924 } 12925 } 12926 sqlite3_expert_destroy(p); 12927 pState->expert.pExpert = 0; 12928 return rc; 12929 } 12930 12931 /* 12932 ** Implementation of ".expert" dot command. 12933 */ 12934 static int expertDotCommand( 12935 ShellState *pState, /* Current shell tool state */ 12936 char **azArg, /* Array of arguments passed to dot command */ 12937 int nArg /* Number of entries in azArg[] */ 12938 ){ 12939 int rc = SQLITE_OK; 12940 char *zErr = 0; 12941 int i; 12942 int iSample = 0; 12943 12944 assert( pState->expert.pExpert==0 ); 12945 memset(&pState->expert, 0, sizeof(ExpertInfo)); 12946 12947 for(i=1; rc==SQLITE_OK && i<nArg; i++){ 12948 char *z = azArg[i]; 12949 int n; 12950 if( z[0]=='-' && z[1]=='-' ) z++; 12951 n = strlen30(z); 12952 if( n>=2 && 0==strncmp(z, "-verbose", n) ){ 12953 pState->expert.bVerbose = 1; 12954 } 12955 else if( n>=2 && 0==strncmp(z, "-sample", n) ){ 12956 if( i==(nArg-1) ){ 12957 raw_printf(stderr, "option requires an argument: %s\n", z); 12958 rc = SQLITE_ERROR; 12959 }else{ 12960 iSample = (int)integerValue(azArg[++i]); 12961 if( iSample<0 || iSample>100 ){ 12962 raw_printf(stderr, "value out of range: %s\n", azArg[i]); 12963 rc = SQLITE_ERROR; 12964 } 12965 } 12966 } 12967 else{ 12968 raw_printf(stderr, "unknown option: %s\n", z); 12969 rc = SQLITE_ERROR; 12970 } 12971 } 12972 12973 if( rc==SQLITE_OK ){ 12974 pState->expert.pExpert = sqlite3_expert_new(pState->db, &zErr); 12975 if( pState->expert.pExpert==0 ){ 12976 raw_printf(stderr, "sqlite3_expert_new: %s\n", zErr); 12977 rc = SQLITE_ERROR; 12978 }else{ 12979 sqlite3_expert_config( 12980 pState->expert.pExpert, EXPERT_CONFIG_SAMPLE, iSample 12981 ); 12982 } 12983 } 12984 12985 return rc; 12986 } 12987 #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */ 12988 12989 /* 12990 ** Execute a statement or set of statements. Print 12991 ** any result rows/columns depending on the current mode 12992 ** set via the supplied callback. 12993 ** 12994 ** This is very similar to SQLite's built-in sqlite3_exec() 12995 ** function except it takes a slightly different callback 12996 ** and callback data argument. 12997 */ 12998 static int shell_exec( 12999 ShellState *pArg, /* Pointer to ShellState */ 13000 const char *zSql, /* SQL to be evaluated */ 13001 char **pzErrMsg /* Error msg written here */ 13002 ){ 13003 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */ 13004 int rc = SQLITE_OK; /* Return Code */ 13005 int rc2; 13006 const char *zLeftover; /* Tail of unprocessed SQL */ 13007 sqlite3 *db = pArg->db; 13008 13009 if( pzErrMsg ){ 13010 *pzErrMsg = NULL; 13011 } 13012 13013 #ifndef SQLITE_OMIT_VIRTUALTABLE 13014 if( pArg->expert.pExpert ){ 13015 rc = expertHandleSQL(pArg, zSql, pzErrMsg); 13016 return expertFinish(pArg, (rc!=SQLITE_OK), pzErrMsg); 13017 } 13018 #endif 13019 13020 while( zSql[0] && (SQLITE_OK == rc) ){ 13021 static const char *zStmtSql; 13022 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover); 13023 if( SQLITE_OK != rc ){ 13024 if( pzErrMsg ){ 13025 *pzErrMsg = save_err_msg(db); 13026 } 13027 }else{ 13028 if( !pStmt ){ 13029 /* this happens for a comment or white-space */ 13030 zSql = zLeftover; 13031 while( IsSpace(zSql[0]) ) zSql++; 13032 continue; 13033 } 13034 zStmtSql = sqlite3_sql(pStmt); 13035 if( zStmtSql==0 ) zStmtSql = ""; 13036 while( IsSpace(zStmtSql[0]) ) zStmtSql++; 13037 13038 /* save off the prepared statment handle and reset row count */ 13039 if( pArg ){ 13040 pArg->pStmt = pStmt; 13041 pArg->cnt = 0; 13042 } 13043 13044 /* echo the sql statement if echo on */ 13045 if( pArg && ShellHasFlag(pArg, SHFLG_Echo) ){ 13046 utf8_printf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql); 13047 } 13048 13049 /* Show the EXPLAIN QUERY PLAN if .eqp is on */ 13050 if( pArg && pArg->autoEQP && sqlite3_stmt_isexplain(pStmt)==0 ){ 13051 sqlite3_stmt *pExplain; 13052 char *zEQP; 13053 int triggerEQP = 0; 13054 disable_debug_trace_modes(); 13055 sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, -1, &triggerEQP); 13056 if( pArg->autoEQP>=AUTOEQP_trigger ){ 13057 sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 1, 0); 13058 } 13059 zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", zStmtSql); 13060 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0); 13061 if( rc==SQLITE_OK ){ 13062 while( sqlite3_step(pExplain)==SQLITE_ROW ){ 13063 const char *zEQPLine = (const char*)sqlite3_column_text(pExplain,3); 13064 int iEqpId = sqlite3_column_int(pExplain, 0); 13065 int iParentId = sqlite3_column_int(pExplain, 1); 13066 if( zEQPLine==0 ) zEQPLine = ""; 13067 if( zEQPLine[0]=='-' ) eqp_render(pArg); 13068 eqp_append(pArg, iEqpId, iParentId, zEQPLine); 13069 } 13070 eqp_render(pArg); 13071 } 13072 sqlite3_finalize(pExplain); 13073 sqlite3_free(zEQP); 13074 if( pArg->autoEQP>=AUTOEQP_full ){ 13075 /* Also do an EXPLAIN for ".eqp full" mode */ 13076 zEQP = sqlite3_mprintf("EXPLAIN %s", zStmtSql); 13077 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0); 13078 if( rc==SQLITE_OK ){ 13079 pArg->cMode = MODE_Explain; 13080 explain_data_prepare(pArg, pExplain); 13081 exec_prepared_stmt(pArg, pExplain); 13082 explain_data_delete(pArg); 13083 } 13084 sqlite3_finalize(pExplain); 13085 sqlite3_free(zEQP); 13086 } 13087 if( pArg->autoEQP>=AUTOEQP_trigger && triggerEQP==0 ){ 13088 sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 0, 0); 13089 /* Reprepare pStmt before reactiving trace modes */ 13090 sqlite3_finalize(pStmt); 13091 sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); 13092 if( pArg ) pArg->pStmt = pStmt; 13093 } 13094 restore_debug_trace_modes(); 13095 } 13096 13097 if( pArg ){ 13098 pArg->cMode = pArg->mode; 13099 if( pArg->autoExplain ){ 13100 if( sqlite3_stmt_isexplain(pStmt)==1 ){ 13101 pArg->cMode = MODE_Explain; 13102 } 13103 if( sqlite3_stmt_isexplain(pStmt)==2 ){ 13104 pArg->cMode = MODE_EQP; 13105 } 13106 } 13107 13108 /* If the shell is currently in ".explain" mode, gather the extra 13109 ** data required to add indents to the output.*/ 13110 if( pArg->cMode==MODE_Explain ){ 13111 explain_data_prepare(pArg, pStmt); 13112 } 13113 } 13114 13115 bind_prepared_stmt(pArg, pStmt); 13116 exec_prepared_stmt(pArg, pStmt); 13117 explain_data_delete(pArg); 13118 eqp_render(pArg); 13119 13120 /* print usage stats if stats on */ 13121 if( pArg && pArg->statsOn ){ 13122 display_stats(db, pArg, 0); 13123 } 13124 13125 /* print loop-counters if required */ 13126 if( pArg && pArg->scanstatsOn ){ 13127 display_scanstats(db, pArg); 13128 } 13129 13130 /* Finalize the statement just executed. If this fails, save a 13131 ** copy of the error message. Otherwise, set zSql to point to the 13132 ** next statement to execute. */ 13133 rc2 = sqlite3_finalize(pStmt); 13134 if( rc!=SQLITE_NOMEM ) rc = rc2; 13135 if( rc==SQLITE_OK ){ 13136 zSql = zLeftover; 13137 while( IsSpace(zSql[0]) ) zSql++; 13138 }else if( pzErrMsg ){ 13139 *pzErrMsg = save_err_msg(db); 13140 } 13141 13142 /* clear saved stmt handle */ 13143 if( pArg ){ 13144 pArg->pStmt = NULL; 13145 } 13146 } 13147 } /* end while */ 13148 13149 return rc; 13150 } 13151 13152 /* 13153 ** Release memory previously allocated by tableColumnList(). 13154 */ 13155 static void freeColumnList(char **azCol){ 13156 int i; 13157 for(i=1; azCol[i]; i++){ 13158 sqlite3_free(azCol[i]); 13159 } 13160 /* azCol[0] is a static string */ 13161 sqlite3_free(azCol); 13162 } 13163 13164 /* 13165 ** Return a list of pointers to strings which are the names of all 13166 ** columns in table zTab. The memory to hold the names is dynamically 13167 ** allocated and must be released by the caller using a subsequent call 13168 ** to freeColumnList(). 13169 ** 13170 ** The azCol[0] entry is usually NULL. However, if zTab contains a rowid 13171 ** value that needs to be preserved, then azCol[0] is filled in with the 13172 ** name of the rowid column. 13173 ** 13174 ** The first regular column in the table is azCol[1]. The list is terminated 13175 ** by an entry with azCol[i]==0. 13176 */ 13177 static char **tableColumnList(ShellState *p, const char *zTab){ 13178 char **azCol = 0; 13179 sqlite3_stmt *pStmt; 13180 char *zSql; 13181 int nCol = 0; 13182 int nAlloc = 0; 13183 int nPK = 0; /* Number of PRIMARY KEY columns seen */ 13184 int isIPK = 0; /* True if one PRIMARY KEY column of type INTEGER */ 13185 int preserveRowid = ShellHasFlag(p, SHFLG_PreserveRowid); 13186 int rc; 13187 13188 zSql = sqlite3_mprintf("PRAGMA table_info=%Q", zTab); 13189 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 13190 sqlite3_free(zSql); 13191 if( rc ) return 0; 13192 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 13193 if( nCol>=nAlloc-2 ){ 13194 nAlloc = nAlloc*2 + nCol + 10; 13195 azCol = sqlite3_realloc(azCol, nAlloc*sizeof(azCol[0])); 13196 if( azCol==0 ) shell_out_of_memory(); 13197 } 13198 azCol[++nCol] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 1)); 13199 if( sqlite3_column_int(pStmt, 5) ){ 13200 nPK++; 13201 if( nPK==1 13202 && sqlite3_stricmp((const char*)sqlite3_column_text(pStmt,2), 13203 "INTEGER")==0 13204 ){ 13205 isIPK = 1; 13206 }else{ 13207 isIPK = 0; 13208 } 13209 } 13210 } 13211 sqlite3_finalize(pStmt); 13212 if( azCol==0 ) return 0; 13213 azCol[0] = 0; 13214 azCol[nCol+1] = 0; 13215 13216 /* The decision of whether or not a rowid really needs to be preserved 13217 ** is tricky. We never need to preserve a rowid for a WITHOUT ROWID table 13218 ** or a table with an INTEGER PRIMARY KEY. We are unable to preserve 13219 ** rowids on tables where the rowid is inaccessible because there are other 13220 ** columns in the table named "rowid", "_rowid_", and "oid". 13221 */ 13222 if( preserveRowid && isIPK ){ 13223 /* If a single PRIMARY KEY column with type INTEGER was seen, then it 13224 ** might be an alise for the ROWID. But it might also be a WITHOUT ROWID 13225 ** table or a INTEGER PRIMARY KEY DESC column, neither of which are 13226 ** ROWID aliases. To distinguish these cases, check to see if 13227 ** there is a "pk" entry in "PRAGMA index_list". There will be 13228 ** no "pk" index if the PRIMARY KEY really is an alias for the ROWID. 13229 */ 13230 zSql = sqlite3_mprintf("SELECT 1 FROM pragma_index_list(%Q)" 13231 " WHERE origin='pk'", zTab); 13232 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 13233 sqlite3_free(zSql); 13234 if( rc ){ 13235 freeColumnList(azCol); 13236 return 0; 13237 } 13238 rc = sqlite3_step(pStmt); 13239 sqlite3_finalize(pStmt); 13240 preserveRowid = rc==SQLITE_ROW; 13241 } 13242 if( preserveRowid ){ 13243 /* Only preserve the rowid if we can find a name to use for the 13244 ** rowid */ 13245 static char *azRowid[] = { "rowid", "_rowid_", "oid" }; 13246 int i, j; 13247 for(j=0; j<3; j++){ 13248 for(i=1; i<=nCol; i++){ 13249 if( sqlite3_stricmp(azRowid[j],azCol[i])==0 ) break; 13250 } 13251 if( i>nCol ){ 13252 /* At this point, we know that azRowid[j] is not the name of any 13253 ** ordinary column in the table. Verify that azRowid[j] is a valid 13254 ** name for the rowid before adding it to azCol[0]. WITHOUT ROWID 13255 ** tables will fail this last check */ 13256 rc = sqlite3_table_column_metadata(p->db,0,zTab,azRowid[j],0,0,0,0,0); 13257 if( rc==SQLITE_OK ) azCol[0] = azRowid[j]; 13258 break; 13259 } 13260 } 13261 } 13262 return azCol; 13263 } 13264 13265 /* 13266 ** Toggle the reverse_unordered_selects setting. 13267 */ 13268 static void toggleSelectOrder(sqlite3 *db){ 13269 sqlite3_stmt *pStmt = 0; 13270 int iSetting = 0; 13271 char zStmt[100]; 13272 sqlite3_prepare_v2(db, "PRAGMA reverse_unordered_selects", -1, &pStmt, 0); 13273 if( sqlite3_step(pStmt)==SQLITE_ROW ){ 13274 iSetting = sqlite3_column_int(pStmt, 0); 13275 } 13276 sqlite3_finalize(pStmt); 13277 sqlite3_snprintf(sizeof(zStmt), zStmt, 13278 "PRAGMA reverse_unordered_selects(%d)", !iSetting); 13279 sqlite3_exec(db, zStmt, 0, 0, 0); 13280 } 13281 13282 /* 13283 ** This is a different callback routine used for dumping the database. 13284 ** Each row received by this callback consists of a table name, 13285 ** the table type ("index" or "table") and SQL to create the table. 13286 ** This routine should print text sufficient to recreate the table. 13287 */ 13288 static int dump_callback(void *pArg, int nArg, char **azArg, char **azNotUsed){ 13289 int rc; 13290 const char *zTable; 13291 const char *zType; 13292 const char *zSql; 13293 ShellState *p = (ShellState *)pArg; 13294 13295 UNUSED_PARAMETER(azNotUsed); 13296 if( nArg!=3 || azArg==0 ) return 0; 13297 zTable = azArg[0]; 13298 zType = azArg[1]; 13299 zSql = azArg[2]; 13300 13301 if( strcmp(zTable, "sqlite_sequence")==0 ){ 13302 raw_printf(p->out, "DELETE FROM sqlite_sequence;\n"); 13303 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){ 13304 raw_printf(p->out, "ANALYZE sqlite_schema;\n"); 13305 }else if( strncmp(zTable, "sqlite_", 7)==0 ){ 13306 return 0; 13307 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){ 13308 char *zIns; 13309 if( !p->writableSchema ){ 13310 raw_printf(p->out, "PRAGMA writable_schema=ON;\n"); 13311 p->writableSchema = 1; 13312 } 13313 zIns = sqlite3_mprintf( 13314 "INSERT INTO sqlite_schema(type,name,tbl_name,rootpage,sql)" 13315 "VALUES('table','%q','%q',0,'%q');", 13316 zTable, zTable, zSql); 13317 utf8_printf(p->out, "%s\n", zIns); 13318 sqlite3_free(zIns); 13319 return 0; 13320 }else{ 13321 printSchemaLine(p->out, zSql, ";\n"); 13322 } 13323 13324 if( strcmp(zType, "table")==0 ){ 13325 ShellText sSelect; 13326 ShellText sTable; 13327 char **azCol; 13328 int i; 13329 char *savedDestTable; 13330 int savedMode; 13331 13332 azCol = tableColumnList(p, zTable); 13333 if( azCol==0 ){ 13334 p->nErr++; 13335 return 0; 13336 } 13337 13338 /* Always quote the table name, even if it appears to be pure ascii, 13339 ** in case it is a keyword. Ex: INSERT INTO "table" ... */ 13340 initText(&sTable); 13341 appendText(&sTable, zTable, quoteChar(zTable)); 13342 /* If preserving the rowid, add a column list after the table name. 13343 ** In other words: "INSERT INTO tab(rowid,a,b,c,...) VALUES(...)" 13344 ** instead of the usual "INSERT INTO tab VALUES(...)". 13345 */ 13346 if( azCol[0] ){ 13347 appendText(&sTable, "(", 0); 13348 appendText(&sTable, azCol[0], 0); 13349 for(i=1; azCol[i]; i++){ 13350 appendText(&sTable, ",", 0); 13351 appendText(&sTable, azCol[i], quoteChar(azCol[i])); 13352 } 13353 appendText(&sTable, ")", 0); 13354 } 13355 13356 /* Build an appropriate SELECT statement */ 13357 initText(&sSelect); 13358 appendText(&sSelect, "SELECT ", 0); 13359 if( azCol[0] ){ 13360 appendText(&sSelect, azCol[0], 0); 13361 appendText(&sSelect, ",", 0); 13362 } 13363 for(i=1; azCol[i]; i++){ 13364 appendText(&sSelect, azCol[i], quoteChar(azCol[i])); 13365 if( azCol[i+1] ){ 13366 appendText(&sSelect, ",", 0); 13367 } 13368 } 13369 freeColumnList(azCol); 13370 appendText(&sSelect, " FROM ", 0); 13371 appendText(&sSelect, zTable, quoteChar(zTable)); 13372 13373 savedDestTable = p->zDestTable; 13374 savedMode = p->mode; 13375 p->zDestTable = sTable.z; 13376 p->mode = p->cMode = MODE_Insert; 13377 rc = shell_exec(p, sSelect.z, 0); 13378 if( (rc&0xff)==SQLITE_CORRUPT ){ 13379 raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n"); 13380 toggleSelectOrder(p->db); 13381 shell_exec(p, sSelect.z, 0); 13382 toggleSelectOrder(p->db); 13383 } 13384 p->zDestTable = savedDestTable; 13385 p->mode = savedMode; 13386 freeText(&sTable); 13387 freeText(&sSelect); 13388 if( rc ) p->nErr++; 13389 } 13390 return 0; 13391 } 13392 13393 /* 13394 ** Run zQuery. Use dump_callback() as the callback routine so that 13395 ** the contents of the query are output as SQL statements. 13396 ** 13397 ** If we get a SQLITE_CORRUPT error, rerun the query after appending 13398 ** "ORDER BY rowid DESC" to the end. 13399 */ 13400 static int run_schema_dump_query( 13401 ShellState *p, 13402 const char *zQuery 13403 ){ 13404 int rc; 13405 char *zErr = 0; 13406 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr); 13407 if( rc==SQLITE_CORRUPT ){ 13408 char *zQ2; 13409 int len = strlen30(zQuery); 13410 raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n"); 13411 if( zErr ){ 13412 utf8_printf(p->out, "/****** %s ******/\n", zErr); 13413 sqlite3_free(zErr); 13414 zErr = 0; 13415 } 13416 zQ2 = malloc( len+100 ); 13417 if( zQ2==0 ) return rc; 13418 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery); 13419 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr); 13420 if( rc ){ 13421 utf8_printf(p->out, "/****** ERROR: %s ******/\n", zErr); 13422 }else{ 13423 rc = SQLITE_CORRUPT; 13424 } 13425 sqlite3_free(zErr); 13426 free(zQ2); 13427 } 13428 return rc; 13429 } 13430 13431 /* 13432 ** Text of help messages. 13433 ** 13434 ** The help text for each individual command begins with a line that starts 13435 ** with ".". Subsequent lines are supplimental information. 13436 ** 13437 ** There must be two or more spaces between the end of the command and the 13438 ** start of the description of what that command does. 13439 */ 13440 static const char *(azHelp[]) = { 13441 #if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE) 13442 ".archive ... Manage SQL archives", 13443 " Each command must have exactly one of the following options:", 13444 " -c, --create Create a new archive", 13445 " -u, --update Add or update files with changed mtime", 13446 " -i, --insert Like -u but always add even if unchanged", 13447 " -t, --list List contents of archive", 13448 " -x, --extract Extract files from archive", 13449 " Optional arguments:", 13450 " -v, --verbose Print each filename as it is processed", 13451 " -f FILE, --file FILE Use archive FILE (default is current db)", 13452 " -a FILE, --append FILE Open FILE using the apndvfs VFS", 13453 " -C DIR, --directory DIR Read/extract files from directory DIR", 13454 " -n, --dryrun Show the SQL that would have occurred", 13455 " Examples:", 13456 " .ar -cf ARCHIVE foo bar # Create ARCHIVE from files foo and bar", 13457 " .ar -tf ARCHIVE # List members of ARCHIVE", 13458 " .ar -xvf ARCHIVE # Verbosely extract files from ARCHIVE", 13459 " See also:", 13460 " http://sqlite.org/cli.html#sqlar_archive_support", 13461 #endif 13462 #ifndef SQLITE_OMIT_AUTHORIZATION 13463 ".auth ON|OFF Show authorizer callbacks", 13464 #endif 13465 ".backup ?DB? FILE Backup DB (default \"main\") to FILE", 13466 " --append Use the appendvfs", 13467 " --async Write to FILE without journal and fsync()", 13468 ".bail on|off Stop after hitting an error. Default OFF", 13469 ".binary on|off Turn binary output on or off. Default OFF", 13470 ".cd DIRECTORY Change the working directory to DIRECTORY", 13471 ".changes on|off Show number of rows changed by SQL", 13472 ".check GLOB Fail if output since .testcase does not match", 13473 ".clone NEWDB Clone data into NEWDB from the existing database", 13474 ".databases List names and files of attached databases", 13475 ".dbconfig ?op? ?val? List or change sqlite3_db_config() options", 13476 ".dbinfo ?DB? Show status information about the database", 13477 ".dump ?TABLE? Render database content as SQL", 13478 " Options:", 13479 " --preserve-rowids Include ROWID values in the output", 13480 " --newlines Allow unescaped newline characters in output", 13481 " TABLE is a LIKE pattern for the tables to dump", 13482 " Additional LIKE patterns can be given in subsequent arguments", 13483 ".echo on|off Turn command echo on or off", 13484 ".eqp on|off|full|... Enable or disable automatic EXPLAIN QUERY PLAN", 13485 " Other Modes:", 13486 #ifdef SQLITE_DEBUG 13487 " test Show raw EXPLAIN QUERY PLAN output", 13488 " trace Like \"full\" but enable \"PRAGMA vdbe_trace\"", 13489 #endif 13490 " trigger Like \"full\" but also show trigger bytecode", 13491 ".excel Display the output of next command in spreadsheet", 13492 " --bom Put a UTF8 byte-order mark on intermediate file", 13493 ".exit ?CODE? Exit this program with return-code CODE", 13494 ".expert EXPERIMENTAL. Suggest indexes for queries", 13495 ".explain ?on|off|auto? Change the EXPLAIN formatting mode. Default: auto", 13496 ".filectrl CMD ... Run various sqlite3_file_control() operations", 13497 " --schema SCHEMA Use SCHEMA instead of \"main\"", 13498 " --help Show CMD details", 13499 ".fullschema ?--indent? Show schema and the content of sqlite_stat tables", 13500 ".headers on|off Turn display of headers on or off", 13501 ".help ?-all? ?PATTERN? Show help text for PATTERN", 13502 ".import FILE TABLE Import data from FILE into TABLE", 13503 " Options:", 13504 " --ascii Use \\037 and \\036 as column and row separators", 13505 " --csv Use , and \\n as column and row separators", 13506 " --skip N Skip the first N rows of input", 13507 " -v \"Verbose\" - increase auxiliary output", 13508 " Notes:", 13509 " * If TABLE does not exist, it is created. The first row of input", 13510 " determines the column names.", 13511 " * If neither --csv or --ascii are used, the input mode is derived", 13512 " from the \".mode\" output mode", 13513 " * If FILE begins with \"|\" then it is a command that generates the", 13514 " input text.", 13515 #ifndef SQLITE_OMIT_TEST_CONTROL 13516 ".imposter INDEX TABLE Create imposter table TABLE on index INDEX", 13517 #endif 13518 ".indexes ?TABLE? Show names of indexes", 13519 " If TABLE is specified, only show indexes for", 13520 " tables matching TABLE using the LIKE operator.", 13521 #ifdef SQLITE_ENABLE_IOTRACE 13522 ".iotrace FILE Enable I/O diagnostic logging to FILE", 13523 #endif 13524 ".limit ?LIMIT? ?VAL? Display or change the value of an SQLITE_LIMIT", 13525 ".lint OPTIONS Report potential schema issues.", 13526 " Options:", 13527 " fkey-indexes Find missing foreign key indexes", 13528 #ifndef SQLITE_OMIT_LOAD_EXTENSION 13529 ".load FILE ?ENTRY? Load an extension library", 13530 #endif 13531 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout", 13532 ".mode MODE ?TABLE? Set output mode", 13533 " MODE is one of:", 13534 " ascii Columns/rows delimited by 0x1F and 0x1E", 13535 " box Tables using unicode box-drawing characters", 13536 " csv Comma-separated values", 13537 " column Output in columns. (See .width)", 13538 " html HTML <table> code", 13539 " insert SQL insert statements for TABLE", 13540 " json Results in a JSON array", 13541 " line One value per line", 13542 " list Values delimited by \"|\"", 13543 " markdown Markdown table format", 13544 " quote Escape answers as for SQL", 13545 " table ASCII-art table", 13546 " tabs Tab-separated values", 13547 " tcl TCL list elements", 13548 ".nullvalue STRING Use STRING in place of NULL values", 13549 ".once ?OPTIONS? ?FILE? Output for the next SQL command only to FILE", 13550 " If FILE begins with '|' then open as a pipe", 13551 " --bom Put a UTF8 byte-order mark at the beginning", 13552 " -e Send output to the system text editor", 13553 " -x Send output as CSV to a spreadsheet (same as \".excel\")", 13554 #ifdef SQLITE_DEBUG 13555 ".oom ?--repeat M? ?N? Simulate an OOM error on the N-th allocation", 13556 #endif 13557 ".open ?OPTIONS? ?FILE? Close existing database and reopen FILE", 13558 " Options:", 13559 " --append Use appendvfs to append database to the end of FILE", 13560 #ifdef SQLITE_ENABLE_DESERIALIZE 13561 " --deserialize Load into memory useing sqlite3_deserialize()", 13562 " --hexdb Load the output of \"dbtotxt\" as an in-memory db", 13563 " --maxsize N Maximum size for --hexdb or --deserialized database", 13564 #endif 13565 " --new Initialize FILE to an empty database", 13566 " --nofollow Do not follow symbolic links", 13567 " --readonly Open FILE readonly", 13568 " --zip FILE is a ZIP archive", 13569 ".output ?FILE? Send output to FILE or stdout if FILE is omitted", 13570 " If FILE begins with '|' then open it as a pipe.", 13571 " Options:", 13572 " --bom Prefix output with a UTF8 byte-order mark", 13573 " -e Send output to the system text editor", 13574 " -x Send output as CSV to a spreadsheet", 13575 ".parameter CMD ... Manage SQL parameter bindings", 13576 " clear Erase all bindings", 13577 " init Initialize the TEMP table that holds bindings", 13578 " list List the current parameter bindings", 13579 " set PARAMETER VALUE Given SQL parameter PARAMETER a value of VALUE", 13580 " PARAMETER should start with one of: $ : @ ?", 13581 " unset PARAMETER Remove PARAMETER from the binding table", 13582 ".print STRING... Print literal STRING", 13583 #ifndef SQLITE_OMIT_PROGRESS_CALLBACK 13584 ".progress N Invoke progress handler after every N opcodes", 13585 " --limit N Interrupt after N progress callbacks", 13586 " --once Do no more than one progress interrupt", 13587 " --quiet|-q No output except at interrupts", 13588 " --reset Reset the count for each input and interrupt", 13589 #endif 13590 ".prompt MAIN CONTINUE Replace the standard prompts", 13591 ".quit Exit this program", 13592 ".read FILE Read input from FILE", 13593 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) 13594 ".recover Recover as much data as possible from corrupt db.", 13595 " --freelist-corrupt Assume the freelist is corrupt", 13596 " --recovery-db NAME Store recovery metadata in database file NAME", 13597 " --lost-and-found TABLE Alternative name for the lost-and-found table", 13598 " --no-rowids Do not attempt to recover rowid values", 13599 " that are not also INTEGER PRIMARY KEYs", 13600 #endif 13601 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE", 13602 ".save FILE Write in-memory database into FILE", 13603 ".scanstats on|off Turn sqlite3_stmt_scanstatus() metrics on or off", 13604 ".schema ?PATTERN? Show the CREATE statements matching PATTERN", 13605 " Options:", 13606 " --indent Try to pretty-print the schema", 13607 ".selftest ?OPTIONS? Run tests defined in the SELFTEST table", 13608 " Options:", 13609 " --init Create a new SELFTEST table", 13610 " -v Verbose output", 13611 ".separator COL ?ROW? Change the column and row separators", 13612 #if defined(SQLITE_ENABLE_SESSION) 13613 ".session ?NAME? CMD ... Create or control sessions", 13614 " Subcommands:", 13615 " attach TABLE Attach TABLE", 13616 " changeset FILE Write a changeset into FILE", 13617 " close Close one session", 13618 " enable ?BOOLEAN? Set or query the enable bit", 13619 " filter GLOB... Reject tables matching GLOBs", 13620 " indirect ?BOOLEAN? Mark or query the indirect status", 13621 " isempty Query whether the session is empty", 13622 " list List currently open session names", 13623 " open DB NAME Open a new session on DB", 13624 " patchset FILE Write a patchset into FILE", 13625 " If ?NAME? is omitted, the first defined session is used.", 13626 #endif 13627 ".sha3sum ... Compute a SHA3 hash of database content", 13628 " Options:", 13629 " --schema Also hash the sqlite_schema table", 13630 " --sha3-224 Use the sha3-224 algorithm", 13631 " --sha3-256 Use the sha3-256 algorithm (default)", 13632 " --sha3-384 Use the sha3-384 algorithm", 13633 " --sha3-512 Use the sha3-512 algorithm", 13634 " Any other argument is a LIKE pattern for tables to hash", 13635 #ifndef SQLITE_NOHAVE_SYSTEM 13636 ".shell CMD ARGS... Run CMD ARGS... in a system shell", 13637 #endif 13638 ".show Show the current values for various settings", 13639 ".stats ?on|off? Show stats or turn stats on or off", 13640 #ifndef SQLITE_NOHAVE_SYSTEM 13641 ".system CMD ARGS... Run CMD ARGS... in a system shell", 13642 #endif 13643 ".tables ?TABLE? List names of tables matching LIKE pattern TABLE", 13644 ".testcase NAME Begin redirecting output to 'testcase-out.txt'", 13645 ".testctrl CMD ... Run various sqlite3_test_control() operations", 13646 " Run \".testctrl\" with no arguments for details", 13647 ".timeout MS Try opening locked tables for MS milliseconds", 13648 ".timer on|off Turn SQL timer on or off", 13649 #ifndef SQLITE_OMIT_TRACE 13650 ".trace ?OPTIONS? Output each SQL statement as it is run", 13651 " FILE Send output to FILE", 13652 " stdout Send output to stdout", 13653 " stderr Send output to stderr", 13654 " off Disable tracing", 13655 " --expanded Expand query parameters", 13656 #ifdef SQLITE_ENABLE_NORMALIZE 13657 " --normalized Normal the SQL statements", 13658 #endif 13659 " --plain Show SQL as it is input", 13660 " --stmt Trace statement execution (SQLITE_TRACE_STMT)", 13661 " --profile Profile statements (SQLITE_TRACE_PROFILE)", 13662 " --row Trace each row (SQLITE_TRACE_ROW)", 13663 " --close Trace connection close (SQLITE_TRACE_CLOSE)", 13664 #endif /* SQLITE_OMIT_TRACE */ 13665 #ifdef SQLITE_DEBUG 13666 ".unmodule NAME ... Unregister virtual table modules", 13667 " --allexcept Unregister everything except those named", 13668 #endif 13669 ".vfsinfo ?AUX? Information about the top-level VFS", 13670 ".vfslist List all available VFSes", 13671 ".vfsname ?AUX? Print the name of the VFS stack", 13672 ".width NUM1 NUM2 ... Set minimum column widths for columnar output", 13673 " Negative values right-justify", 13674 }; 13675 13676 /* 13677 ** Output help text. 13678 ** 13679 ** zPattern describes the set of commands for which help text is provided. 13680 ** If zPattern is NULL, then show all commands, but only give a one-line 13681 ** description of each. 13682 ** 13683 ** Return the number of matches. 13684 */ 13685 static int showHelp(FILE *out, const char *zPattern){ 13686 int i = 0; 13687 int j = 0; 13688 int n = 0; 13689 char *zPat; 13690 if( zPattern==0 13691 || zPattern[0]=='0' 13692 || strcmp(zPattern,"-a")==0 13693 || strcmp(zPattern,"-all")==0 13694 || strcmp(zPattern,"--all")==0 13695 ){ 13696 /* Show all commands, but only one line per command */ 13697 if( zPattern==0 ) zPattern = ""; 13698 for(i=0; i<ArraySize(azHelp); i++){ 13699 if( azHelp[i][0]=='.' || zPattern[0] ){ 13700 utf8_printf(out, "%s\n", azHelp[i]); 13701 n++; 13702 } 13703 } 13704 }else{ 13705 /* Look for commands that for which zPattern is an exact prefix */ 13706 zPat = sqlite3_mprintf(".%s*", zPattern); 13707 for(i=0; i<ArraySize(azHelp); i++){ 13708 if( sqlite3_strglob(zPat, azHelp[i])==0 ){ 13709 utf8_printf(out, "%s\n", azHelp[i]); 13710 j = i+1; 13711 n++; 13712 } 13713 } 13714 sqlite3_free(zPat); 13715 if( n ){ 13716 if( n==1 ){ 13717 /* when zPattern is a prefix of exactly one command, then include the 13718 ** details of that command, which should begin at offset j */ 13719 while( j<ArraySize(azHelp)-1 && azHelp[j][0]!='.' ){ 13720 utf8_printf(out, "%s\n", azHelp[j]); 13721 j++; 13722 } 13723 } 13724 return n; 13725 } 13726 /* Look for commands that contain zPattern anywhere. Show the complete 13727 ** text of all commands that match. */ 13728 zPat = sqlite3_mprintf("%%%s%%", zPattern); 13729 for(i=0; i<ArraySize(azHelp); i++){ 13730 if( azHelp[i][0]=='.' ) j = i; 13731 if( sqlite3_strlike(zPat, azHelp[i], 0)==0 ){ 13732 utf8_printf(out, "%s\n", azHelp[j]); 13733 while( j<ArraySize(azHelp)-1 && azHelp[j+1][0]!='.' ){ 13734 j++; 13735 utf8_printf(out, "%s\n", azHelp[j]); 13736 } 13737 i = j; 13738 n++; 13739 } 13740 } 13741 sqlite3_free(zPat); 13742 } 13743 return n; 13744 } 13745 13746 /* Forward reference */ 13747 static int process_input(ShellState *p); 13748 13749 /* 13750 ** Read the content of file zName into memory obtained from sqlite3_malloc64() 13751 ** and return a pointer to the buffer. The caller is responsible for freeing 13752 ** the memory. 13753 ** 13754 ** If parameter pnByte is not NULL, (*pnByte) is set to the number of bytes 13755 ** read. 13756 ** 13757 ** For convenience, a nul-terminator byte is always appended to the data read 13758 ** from the file before the buffer is returned. This byte is not included in 13759 ** the final value of (*pnByte), if applicable. 13760 ** 13761 ** NULL is returned if any error is encountered. The final value of *pnByte 13762 ** is undefined in this case. 13763 */ 13764 static char *readFile(const char *zName, int *pnByte){ 13765 FILE *in = fopen(zName, "rb"); 13766 long nIn; 13767 size_t nRead; 13768 char *pBuf; 13769 if( in==0 ) return 0; 13770 fseek(in, 0, SEEK_END); 13771 nIn = ftell(in); 13772 rewind(in); 13773 pBuf = sqlite3_malloc64( nIn+1 ); 13774 if( pBuf==0 ){ fclose(in); return 0; } 13775 nRead = fread(pBuf, nIn, 1, in); 13776 fclose(in); 13777 if( nRead!=1 ){ 13778 sqlite3_free(pBuf); 13779 return 0; 13780 } 13781 pBuf[nIn] = 0; 13782 if( pnByte ) *pnByte = nIn; 13783 return pBuf; 13784 } 13785 13786 #if defined(SQLITE_ENABLE_SESSION) 13787 /* 13788 ** Close a single OpenSession object and release all of its associated 13789 ** resources. 13790 */ 13791 static void session_close(OpenSession *pSession){ 13792 int i; 13793 sqlite3session_delete(pSession->p); 13794 sqlite3_free(pSession->zName); 13795 for(i=0; i<pSession->nFilter; i++){ 13796 sqlite3_free(pSession->azFilter[i]); 13797 } 13798 sqlite3_free(pSession->azFilter); 13799 memset(pSession, 0, sizeof(OpenSession)); 13800 } 13801 #endif 13802 13803 /* 13804 ** Close all OpenSession objects and release all associated resources. 13805 */ 13806 #if defined(SQLITE_ENABLE_SESSION) 13807 static void session_close_all(ShellState *p){ 13808 int i; 13809 for(i=0; i<p->nSession; i++){ 13810 session_close(&p->aSession[i]); 13811 } 13812 p->nSession = 0; 13813 } 13814 #else 13815 # define session_close_all(X) 13816 #endif 13817 13818 /* 13819 ** Implementation of the xFilter function for an open session. Omit 13820 ** any tables named by ".session filter" but let all other table through. 13821 */ 13822 #if defined(SQLITE_ENABLE_SESSION) 13823 static int session_filter(void *pCtx, const char *zTab){ 13824 OpenSession *pSession = (OpenSession*)pCtx; 13825 int i; 13826 for(i=0; i<pSession->nFilter; i++){ 13827 if( sqlite3_strglob(pSession->azFilter[i], zTab)==0 ) return 0; 13828 } 13829 return 1; 13830 } 13831 #endif 13832 13833 /* 13834 ** Try to deduce the type of file for zName based on its content. Return 13835 ** one of the SHELL_OPEN_* constants. 13836 ** 13837 ** If the file does not exist or is empty but its name looks like a ZIP 13838 ** archive and the dfltZip flag is true, then assume it is a ZIP archive. 13839 ** Otherwise, assume an ordinary database regardless of the filename if 13840 ** the type cannot be determined from content. 13841 */ 13842 int deduceDatabaseType(const char *zName, int dfltZip){ 13843 FILE *f = fopen(zName, "rb"); 13844 size_t n; 13845 int rc = SHELL_OPEN_UNSPEC; 13846 char zBuf[100]; 13847 if( f==0 ){ 13848 if( dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){ 13849 return SHELL_OPEN_ZIPFILE; 13850 }else{ 13851 return SHELL_OPEN_NORMAL; 13852 } 13853 } 13854 n = fread(zBuf, 16, 1, f); 13855 if( n==1 && memcmp(zBuf, "SQLite format 3", 16)==0 ){ 13856 fclose(f); 13857 return SHELL_OPEN_NORMAL; 13858 } 13859 fseek(f, -25, SEEK_END); 13860 n = fread(zBuf, 25, 1, f); 13861 if( n==1 && memcmp(zBuf, "Start-Of-SQLite3-", 17)==0 ){ 13862 rc = SHELL_OPEN_APPENDVFS; 13863 }else{ 13864 fseek(f, -22, SEEK_END); 13865 n = fread(zBuf, 22, 1, f); 13866 if( n==1 && zBuf[0]==0x50 && zBuf[1]==0x4b && zBuf[2]==0x05 13867 && zBuf[3]==0x06 ){ 13868 rc = SHELL_OPEN_ZIPFILE; 13869 }else if( n==0 && dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){ 13870 rc = SHELL_OPEN_ZIPFILE; 13871 } 13872 } 13873 fclose(f); 13874 return rc; 13875 } 13876 13877 #ifdef SQLITE_ENABLE_DESERIALIZE 13878 /* 13879 ** Reconstruct an in-memory database using the output from the "dbtotxt" 13880 ** program. Read content from the file in p->zDbFilename. If p->zDbFilename 13881 ** is 0, then read from standard input. 13882 */ 13883 static unsigned char *readHexDb(ShellState *p, int *pnData){ 13884 unsigned char *a = 0; 13885 int nLine; 13886 int n = 0; 13887 int pgsz = 0; 13888 int iOffset = 0; 13889 int j, k; 13890 int rc; 13891 FILE *in; 13892 unsigned int x[16]; 13893 char zLine[1000]; 13894 if( p->zDbFilename ){ 13895 in = fopen(p->zDbFilename, "r"); 13896 if( in==0 ){ 13897 utf8_printf(stderr, "cannot open \"%s\" for reading\n", p->zDbFilename); 13898 return 0; 13899 } 13900 nLine = 0; 13901 }else{ 13902 in = p->in; 13903 nLine = p->lineno; 13904 if( in==0 ) in = stdin; 13905 } 13906 *pnData = 0; 13907 nLine++; 13908 if( fgets(zLine, sizeof(zLine), in)==0 ) goto readHexDb_error; 13909 rc = sscanf(zLine, "| size %d pagesize %d", &n, &pgsz); 13910 if( rc!=2 ) goto readHexDb_error; 13911 if( n<0 ) goto readHexDb_error; 13912 if( pgsz<512 || pgsz>65536 || (pgsz&(pgsz-1))!=0 ) goto readHexDb_error; 13913 n = (n+pgsz-1)&~(pgsz-1); /* Round n up to the next multiple of pgsz */ 13914 a = sqlite3_malloc( n ? n : 1 ); 13915 if( a==0 ){ 13916 utf8_printf(stderr, "Out of memory!\n"); 13917 goto readHexDb_error; 13918 } 13919 memset(a, 0, n); 13920 if( pgsz<512 || pgsz>65536 || (pgsz & (pgsz-1))!=0 ){ 13921 utf8_printf(stderr, "invalid pagesize\n"); 13922 goto readHexDb_error; 13923 } 13924 for(nLine++; fgets(zLine, sizeof(zLine), in)!=0; nLine++){ 13925 rc = sscanf(zLine, "| page %d offset %d", &j, &k); 13926 if( rc==2 ){ 13927 iOffset = k; 13928 continue; 13929 } 13930 if( strncmp(zLine, "| end ", 6)==0 ){ 13931 break; 13932 } 13933 rc = sscanf(zLine,"| %d: %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x", 13934 &j, &x[0], &x[1], &x[2], &x[3], &x[4], &x[5], &x[6], &x[7], 13935 &x[8], &x[9], &x[10], &x[11], &x[12], &x[13], &x[14], &x[15]); 13936 if( rc==17 ){ 13937 k = iOffset+j; 13938 if( k+16<=n ){ 13939 int ii; 13940 for(ii=0; ii<16; ii++) a[k+ii] = x[ii]&0xff; 13941 } 13942 } 13943 } 13944 *pnData = n; 13945 if( in!=p->in ){ 13946 fclose(in); 13947 }else{ 13948 p->lineno = nLine; 13949 } 13950 return a; 13951 13952 readHexDb_error: 13953 if( in!=p->in ){ 13954 fclose(in); 13955 }else{ 13956 while( fgets(zLine, sizeof(zLine), p->in)!=0 ){ 13957 nLine++; 13958 if(strncmp(zLine, "| end ", 6)==0 ) break; 13959 } 13960 p->lineno = nLine; 13961 } 13962 sqlite3_free(a); 13963 utf8_printf(stderr,"Error on line %d of --hexdb input\n", nLine); 13964 return 0; 13965 } 13966 #endif /* SQLITE_ENABLE_DESERIALIZE */ 13967 13968 /* 13969 ** Scalar function "shell_int32". The first argument to this function 13970 ** must be a blob. The second a non-negative integer. This function 13971 ** reads and returns a 32-bit big-endian integer from byte 13972 ** offset (4*<arg2>) of the blob. 13973 */ 13974 static void shellInt32( 13975 sqlite3_context *context, 13976 int argc, 13977 sqlite3_value **argv 13978 ){ 13979 const unsigned char *pBlob; 13980 int nBlob; 13981 int iInt; 13982 13983 UNUSED_PARAMETER(argc); 13984 nBlob = sqlite3_value_bytes(argv[0]); 13985 pBlob = (const unsigned char*)sqlite3_value_blob(argv[0]); 13986 iInt = sqlite3_value_int(argv[1]); 13987 13988 if( iInt>=0 && (iInt+1)*4<=nBlob ){ 13989 const unsigned char *a = &pBlob[iInt*4]; 13990 sqlite3_int64 iVal = ((sqlite3_int64)a[0]<<24) 13991 + ((sqlite3_int64)a[1]<<16) 13992 + ((sqlite3_int64)a[2]<< 8) 13993 + ((sqlite3_int64)a[3]<< 0); 13994 sqlite3_result_int64(context, iVal); 13995 } 13996 } 13997 13998 /* 13999 ** Scalar function "shell_idquote(X)" returns string X quoted as an identifier, 14000 ** using "..." with internal double-quote characters doubled. 14001 */ 14002 static void shellIdQuote( 14003 sqlite3_context *context, 14004 int argc, 14005 sqlite3_value **argv 14006 ){ 14007 const char *zName = (const char*)sqlite3_value_text(argv[0]); 14008 UNUSED_PARAMETER(argc); 14009 if( zName ){ 14010 char *z = sqlite3_mprintf("\"%w\"", zName); 14011 sqlite3_result_text(context, z, -1, sqlite3_free); 14012 } 14013 } 14014 14015 /* 14016 ** Scalar function "shell_escape_crnl" used by the .recover command. 14017 ** The argument passed to this function is the output of built-in 14018 ** function quote(). If the first character of the input is "'", 14019 ** indicating that the value passed to quote() was a text value, 14020 ** then this function searches the input for "\n" and "\r" characters 14021 ** and adds a wrapper similar to the following: 14022 ** 14023 ** replace(replace(<input>, '\n', char(10), '\r', char(13)); 14024 ** 14025 ** Or, if the first character of the input is not "'", then a copy 14026 ** of the input is returned. 14027 */ 14028 static void shellEscapeCrnl( 14029 sqlite3_context *context, 14030 int argc, 14031 sqlite3_value **argv 14032 ){ 14033 const char *zText = (const char*)sqlite3_value_text(argv[0]); 14034 UNUSED_PARAMETER(argc); 14035 if( zText[0]=='\'' ){ 14036 int nText = sqlite3_value_bytes(argv[0]); 14037 int i; 14038 char zBuf1[20]; 14039 char zBuf2[20]; 14040 const char *zNL = 0; 14041 const char *zCR = 0; 14042 int nCR = 0; 14043 int nNL = 0; 14044 14045 for(i=0; zText[i]; i++){ 14046 if( zNL==0 && zText[i]=='\n' ){ 14047 zNL = unused_string(zText, "\\n", "\\012", zBuf1); 14048 nNL = (int)strlen(zNL); 14049 } 14050 if( zCR==0 && zText[i]=='\r' ){ 14051 zCR = unused_string(zText, "\\r", "\\015", zBuf2); 14052 nCR = (int)strlen(zCR); 14053 } 14054 } 14055 14056 if( zNL || zCR ){ 14057 int iOut = 0; 14058 i64 nMax = (nNL > nCR) ? nNL : nCR; 14059 i64 nAlloc = nMax * nText + (nMax+64)*2; 14060 char *zOut = (char*)sqlite3_malloc64(nAlloc); 14061 if( zOut==0 ){ 14062 sqlite3_result_error_nomem(context); 14063 return; 14064 } 14065 14066 if( zNL && zCR ){ 14067 memcpy(&zOut[iOut], "replace(replace(", 16); 14068 iOut += 16; 14069 }else{ 14070 memcpy(&zOut[iOut], "replace(", 8); 14071 iOut += 8; 14072 } 14073 for(i=0; zText[i]; i++){ 14074 if( zText[i]=='\n' ){ 14075 memcpy(&zOut[iOut], zNL, nNL); 14076 iOut += nNL; 14077 }else if( zText[i]=='\r' ){ 14078 memcpy(&zOut[iOut], zCR, nCR); 14079 iOut += nCR; 14080 }else{ 14081 zOut[iOut] = zText[i]; 14082 iOut++; 14083 } 14084 } 14085 14086 if( zNL ){ 14087 memcpy(&zOut[iOut], ",'", 2); iOut += 2; 14088 memcpy(&zOut[iOut], zNL, nNL); iOut += nNL; 14089 memcpy(&zOut[iOut], "', char(10))", 12); iOut += 12; 14090 } 14091 if( zCR ){ 14092 memcpy(&zOut[iOut], ",'", 2); iOut += 2; 14093 memcpy(&zOut[iOut], zCR, nCR); iOut += nCR; 14094 memcpy(&zOut[iOut], "', char(13))", 12); iOut += 12; 14095 } 14096 14097 sqlite3_result_text(context, zOut, iOut, SQLITE_TRANSIENT); 14098 sqlite3_free(zOut); 14099 return; 14100 } 14101 } 14102 14103 sqlite3_result_value(context, argv[0]); 14104 } 14105 14106 /* Flags for open_db(). 14107 ** 14108 ** The default behavior of open_db() is to exit(1) if the database fails to 14109 ** open. The OPEN_DB_KEEPALIVE flag changes that so that it prints an error 14110 ** but still returns without calling exit. 14111 ** 14112 ** The OPEN_DB_ZIPFILE flag causes open_db() to prefer to open files as a 14113 ** ZIP archive if the file does not exist or is empty and its name matches 14114 ** the *.zip pattern. 14115 */ 14116 #define OPEN_DB_KEEPALIVE 0x001 /* Return after error if true */ 14117 #define OPEN_DB_ZIPFILE 0x002 /* Open as ZIP if name matches *.zip */ 14118 14119 /* 14120 ** Make sure the database is open. If it is not, then open it. If 14121 ** the database fails to open, print an error message and exit. 14122 */ 14123 static void open_db(ShellState *p, int openFlags){ 14124 if( p->db==0 ){ 14125 if( p->openMode==SHELL_OPEN_UNSPEC ){ 14126 if( p->zDbFilename==0 || p->zDbFilename[0]==0 ){ 14127 p->openMode = SHELL_OPEN_NORMAL; 14128 }else{ 14129 p->openMode = (u8)deduceDatabaseType(p->zDbFilename, 14130 (openFlags & OPEN_DB_ZIPFILE)!=0); 14131 } 14132 } 14133 switch( p->openMode ){ 14134 case SHELL_OPEN_APPENDVFS: { 14135 sqlite3_open_v2(p->zDbFilename, &p->db, 14136 SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, "apndvfs"); 14137 break; 14138 } 14139 case SHELL_OPEN_HEXDB: 14140 case SHELL_OPEN_DESERIALIZE: { 14141 sqlite3_open(0, &p->db); 14142 break; 14143 } 14144 case SHELL_OPEN_ZIPFILE: { 14145 sqlite3_open(":memory:", &p->db); 14146 break; 14147 } 14148 case SHELL_OPEN_READONLY: { 14149 sqlite3_open_v2(p->zDbFilename, &p->db, 14150 SQLITE_OPEN_READONLY|p->openFlags, 0); 14151 break; 14152 } 14153 case SHELL_OPEN_UNSPEC: 14154 case SHELL_OPEN_NORMAL: { 14155 sqlite3_open_v2(p->zDbFilename, &p->db, 14156 SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, 0); 14157 break; 14158 } 14159 } 14160 globalDb = p->db; 14161 if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){ 14162 utf8_printf(stderr,"Error: unable to open database \"%s\": %s\n", 14163 p->zDbFilename, sqlite3_errmsg(p->db)); 14164 if( openFlags & OPEN_DB_KEEPALIVE ){ 14165 sqlite3_open(":memory:", &p->db); 14166 return; 14167 } 14168 exit(1); 14169 } 14170 #ifndef SQLITE_OMIT_LOAD_EXTENSION 14171 sqlite3_enable_load_extension(p->db, 1); 14172 #endif 14173 sqlite3_fileio_init(p->db, 0, 0); 14174 sqlite3_shathree_init(p->db, 0, 0); 14175 sqlite3_completion_init(p->db, 0, 0); 14176 sqlite3_uint_init(p->db, 0, 0); 14177 sqlite3_decimal_init(p->db, 0, 0); 14178 sqlite3_ieee_init(p->db, 0, 0); 14179 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) 14180 sqlite3_dbdata_init(p->db, 0, 0); 14181 #endif 14182 #ifdef SQLITE_HAVE_ZLIB 14183 sqlite3_zipfile_init(p->db, 0, 0); 14184 sqlite3_sqlar_init(p->db, 0, 0); 14185 #endif 14186 sqlite3_create_function(p->db, "shell_add_schema", 3, SQLITE_UTF8, 0, 14187 shellAddSchemaName, 0, 0); 14188 sqlite3_create_function(p->db, "shell_module_schema", 1, SQLITE_UTF8, 0, 14189 shellModuleSchema, 0, 0); 14190 sqlite3_create_function(p->db, "shell_putsnl", 1, SQLITE_UTF8, p, 14191 shellPutsFunc, 0, 0); 14192 sqlite3_create_function(p->db, "shell_escape_crnl", 1, SQLITE_UTF8, 0, 14193 shellEscapeCrnl, 0, 0); 14194 sqlite3_create_function(p->db, "shell_int32", 2, SQLITE_UTF8, 0, 14195 shellInt32, 0, 0); 14196 sqlite3_create_function(p->db, "shell_idquote", 1, SQLITE_UTF8, 0, 14197 shellIdQuote, 0, 0); 14198 #ifndef SQLITE_NOHAVE_SYSTEM 14199 sqlite3_create_function(p->db, "edit", 1, SQLITE_UTF8, 0, 14200 editFunc, 0, 0); 14201 sqlite3_create_function(p->db, "edit", 2, SQLITE_UTF8, 0, 14202 editFunc, 0, 0); 14203 #endif 14204 if( p->openMode==SHELL_OPEN_ZIPFILE ){ 14205 char *zSql = sqlite3_mprintf( 14206 "CREATE VIRTUAL TABLE zip USING zipfile(%Q);", p->zDbFilename); 14207 sqlite3_exec(p->db, zSql, 0, 0, 0); 14208 sqlite3_free(zSql); 14209 } 14210 #ifdef SQLITE_ENABLE_DESERIALIZE 14211 else 14212 if( p->openMode==SHELL_OPEN_DESERIALIZE || p->openMode==SHELL_OPEN_HEXDB ){ 14213 int rc; 14214 int nData = 0; 14215 unsigned char *aData; 14216 if( p->openMode==SHELL_OPEN_DESERIALIZE ){ 14217 aData = (unsigned char*)readFile(p->zDbFilename, &nData); 14218 }else{ 14219 aData = readHexDb(p, &nData); 14220 if( aData==0 ){ 14221 return; 14222 } 14223 } 14224 rc = sqlite3_deserialize(p->db, "main", aData, nData, nData, 14225 SQLITE_DESERIALIZE_RESIZEABLE | 14226 SQLITE_DESERIALIZE_FREEONCLOSE); 14227 if( rc ){ 14228 utf8_printf(stderr, "Error: sqlite3_deserialize() returns %d\n", rc); 14229 } 14230 if( p->szMax>0 ){ 14231 sqlite3_file_control(p->db, "main", SQLITE_FCNTL_SIZE_LIMIT, &p->szMax); 14232 } 14233 } 14234 #endif 14235 } 14236 } 14237 14238 /* 14239 ** Attempt to close the databaes connection. Report errors. 14240 */ 14241 void close_db(sqlite3 *db){ 14242 int rc = sqlite3_close(db); 14243 if( rc ){ 14244 utf8_printf(stderr, "Error: sqlite3_close() returns %d: %s\n", 14245 rc, sqlite3_errmsg(db)); 14246 } 14247 } 14248 14249 #if HAVE_READLINE || HAVE_EDITLINE 14250 /* 14251 ** Readline completion callbacks 14252 */ 14253 static char *readline_completion_generator(const char *text, int state){ 14254 static sqlite3_stmt *pStmt = 0; 14255 char *zRet; 14256 if( state==0 ){ 14257 char *zSql; 14258 sqlite3_finalize(pStmt); 14259 zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase" 14260 " FROM completion(%Q) ORDER BY 1", text); 14261 sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0); 14262 sqlite3_free(zSql); 14263 } 14264 if( sqlite3_step(pStmt)==SQLITE_ROW ){ 14265 zRet = strdup((const char*)sqlite3_column_text(pStmt, 0)); 14266 }else{ 14267 sqlite3_finalize(pStmt); 14268 pStmt = 0; 14269 zRet = 0; 14270 } 14271 return zRet; 14272 } 14273 static char **readline_completion(const char *zText, int iStart, int iEnd){ 14274 rl_attempted_completion_over = 1; 14275 return rl_completion_matches(zText, readline_completion_generator); 14276 } 14277 14278 #elif HAVE_LINENOISE 14279 /* 14280 ** Linenoise completion callback 14281 */ 14282 static void linenoise_completion(const char *zLine, linenoiseCompletions *lc){ 14283 int nLine = strlen30(zLine); 14284 int i, iStart; 14285 sqlite3_stmt *pStmt = 0; 14286 char *zSql; 14287 char zBuf[1000]; 14288 14289 if( nLine>sizeof(zBuf)-30 ) return; 14290 if( zLine[0]=='.' || zLine[0]=='#') return; 14291 for(i=nLine-1; i>=0 && (isalnum(zLine[i]) || zLine[i]=='_'); i--){} 14292 if( i==nLine-1 ) return; 14293 iStart = i+1; 14294 memcpy(zBuf, zLine, iStart); 14295 zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase" 14296 " FROM completion(%Q,%Q) ORDER BY 1", 14297 &zLine[iStart], zLine); 14298 sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0); 14299 sqlite3_free(zSql); 14300 sqlite3_exec(globalDb, "PRAGMA page_count", 0, 0, 0); /* Load the schema */ 14301 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 14302 const char *zCompletion = (const char*)sqlite3_column_text(pStmt, 0); 14303 int nCompletion = sqlite3_column_bytes(pStmt, 0); 14304 if( iStart+nCompletion < sizeof(zBuf)-1 ){ 14305 memcpy(zBuf+iStart, zCompletion, nCompletion+1); 14306 linenoiseAddCompletion(lc, zBuf); 14307 } 14308 } 14309 sqlite3_finalize(pStmt); 14310 } 14311 #endif 14312 14313 /* 14314 ** Do C-language style dequoting. 14315 ** 14316 ** \a -> alarm 14317 ** \b -> backspace 14318 ** \t -> tab 14319 ** \n -> newline 14320 ** \v -> vertical tab 14321 ** \f -> form feed 14322 ** \r -> carriage return 14323 ** \s -> space 14324 ** \" -> " 14325 ** \' -> ' 14326 ** \\ -> backslash 14327 ** \NNN -> ascii character NNN in octal 14328 */ 14329 static void resolve_backslashes(char *z){ 14330 int i, j; 14331 char c; 14332 while( *z && *z!='\\' ) z++; 14333 for(i=j=0; (c = z[i])!=0; i++, j++){ 14334 if( c=='\\' && z[i+1]!=0 ){ 14335 c = z[++i]; 14336 if( c=='a' ){ 14337 c = '\a'; 14338 }else if( c=='b' ){ 14339 c = '\b'; 14340 }else if( c=='t' ){ 14341 c = '\t'; 14342 }else if( c=='n' ){ 14343 c = '\n'; 14344 }else if( c=='v' ){ 14345 c = '\v'; 14346 }else if( c=='f' ){ 14347 c = '\f'; 14348 }else if( c=='r' ){ 14349 c = '\r'; 14350 }else if( c=='"' ){ 14351 c = '"'; 14352 }else if( c=='\'' ){ 14353 c = '\''; 14354 }else if( c=='\\' ){ 14355 c = '\\'; 14356 }else if( c>='0' && c<='7' ){ 14357 c -= '0'; 14358 if( z[i+1]>='0' && z[i+1]<='7' ){ 14359 i++; 14360 c = (c<<3) + z[i] - '0'; 14361 if( z[i+1]>='0' && z[i+1]<='7' ){ 14362 i++; 14363 c = (c<<3) + z[i] - '0'; 14364 } 14365 } 14366 } 14367 } 14368 z[j] = c; 14369 } 14370 if( j<i ) z[j] = 0; 14371 } 14372 14373 /* 14374 ** Interpret zArg as either an integer or a boolean value. Return 1 or 0 14375 ** for TRUE and FALSE. Return the integer value if appropriate. 14376 */ 14377 static int booleanValue(const char *zArg){ 14378 int i; 14379 if( zArg[0]=='0' && zArg[1]=='x' ){ 14380 for(i=2; hexDigitValue(zArg[i])>=0; i++){} 14381 }else{ 14382 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){} 14383 } 14384 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff); 14385 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){ 14386 return 1; 14387 } 14388 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){ 14389 return 0; 14390 } 14391 utf8_printf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n", 14392 zArg); 14393 return 0; 14394 } 14395 14396 /* 14397 ** Set or clear a shell flag according to a boolean value. 14398 */ 14399 static void setOrClearFlag(ShellState *p, unsigned mFlag, const char *zArg){ 14400 if( booleanValue(zArg) ){ 14401 ShellSetFlag(p, mFlag); 14402 }else{ 14403 ShellClearFlag(p, mFlag); 14404 } 14405 } 14406 14407 /* 14408 ** Close an output file, assuming it is not stderr or stdout 14409 */ 14410 static void output_file_close(FILE *f){ 14411 if( f && f!=stdout && f!=stderr ) fclose(f); 14412 } 14413 14414 /* 14415 ** Try to open an output file. The names "stdout" and "stderr" are 14416 ** recognized and do the right thing. NULL is returned if the output 14417 ** filename is "off". 14418 */ 14419 static FILE *output_file_open(const char *zFile, int bTextMode){ 14420 FILE *f; 14421 if( strcmp(zFile,"stdout")==0 ){ 14422 f = stdout; 14423 }else if( strcmp(zFile, "stderr")==0 ){ 14424 f = stderr; 14425 }else if( strcmp(zFile, "off")==0 ){ 14426 f = 0; 14427 }else{ 14428 f = fopen(zFile, bTextMode ? "w" : "wb"); 14429 if( f==0 ){ 14430 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile); 14431 } 14432 } 14433 return f; 14434 } 14435 14436 #ifndef SQLITE_OMIT_TRACE 14437 /* 14438 ** A routine for handling output from sqlite3_trace(). 14439 */ 14440 static int sql_trace_callback( 14441 unsigned mType, /* The trace type */ 14442 void *pArg, /* The ShellState pointer */ 14443 void *pP, /* Usually a pointer to sqlite_stmt */ 14444 void *pX /* Auxiliary output */ 14445 ){ 14446 ShellState *p = (ShellState*)pArg; 14447 sqlite3_stmt *pStmt; 14448 const char *zSql; 14449 int nSql; 14450 if( p->traceOut==0 ) return 0; 14451 if( mType==SQLITE_TRACE_CLOSE ){ 14452 utf8_printf(p->traceOut, "-- closing database connection\n"); 14453 return 0; 14454 } 14455 if( mType!=SQLITE_TRACE_ROW && ((const char*)pX)[0]=='-' ){ 14456 zSql = (const char*)pX; 14457 }else{ 14458 pStmt = (sqlite3_stmt*)pP; 14459 switch( p->eTraceType ){ 14460 case SHELL_TRACE_EXPANDED: { 14461 zSql = sqlite3_expanded_sql(pStmt); 14462 break; 14463 } 14464 #ifdef SQLITE_ENABLE_NORMALIZE 14465 case SHELL_TRACE_NORMALIZED: { 14466 zSql = sqlite3_normalized_sql(pStmt); 14467 break; 14468 } 14469 #endif 14470 default: { 14471 zSql = sqlite3_sql(pStmt); 14472 break; 14473 } 14474 } 14475 } 14476 if( zSql==0 ) return 0; 14477 nSql = strlen30(zSql); 14478 while( nSql>0 && zSql[nSql-1]==';' ){ nSql--; } 14479 switch( mType ){ 14480 case SQLITE_TRACE_ROW: 14481 case SQLITE_TRACE_STMT: { 14482 utf8_printf(p->traceOut, "%.*s;\n", nSql, zSql); 14483 break; 14484 } 14485 case SQLITE_TRACE_PROFILE: { 14486 sqlite3_int64 nNanosec = *(sqlite3_int64*)pX; 14487 utf8_printf(p->traceOut, "%.*s; -- %lld ns\n", nSql, zSql, nNanosec); 14488 break; 14489 } 14490 } 14491 return 0; 14492 } 14493 #endif 14494 14495 /* 14496 ** A no-op routine that runs with the ".breakpoint" doc-command. This is 14497 ** a useful spot to set a debugger breakpoint. 14498 */ 14499 static void test_breakpoint(void){ 14500 static int nCall = 0; 14501 nCall++; 14502 } 14503 14504 /* 14505 ** An object used to read a CSV and other files for import. 14506 */ 14507 typedef struct ImportCtx ImportCtx; 14508 struct ImportCtx { 14509 const char *zFile; /* Name of the input file */ 14510 FILE *in; /* Read the CSV text from this input stream */ 14511 int (SQLITE_CDECL *xCloser)(FILE*); /* Func to close in */ 14512 char *z; /* Accumulated text for a field */ 14513 int n; /* Number of bytes in z */ 14514 int nAlloc; /* Space allocated for z[] */ 14515 int nLine; /* Current line number */ 14516 int nRow; /* Number of rows imported */ 14517 int nErr; /* Number of errors encountered */ 14518 int bNotFirst; /* True if one or more bytes already read */ 14519 int cTerm; /* Character that terminated the most recent field */ 14520 int cColSep; /* The column separator character. (Usually ",") */ 14521 int cRowSep; /* The row separator character. (Usually "\n") */ 14522 }; 14523 14524 /* Clean up resourced used by an ImportCtx */ 14525 static void import_cleanup(ImportCtx *p){ 14526 if( p->in!=0 && p->xCloser!=0 ){ 14527 p->xCloser(p->in); 14528 p->in = 0; 14529 } 14530 sqlite3_free(p->z); 14531 p->z = 0; 14532 } 14533 14534 /* Append a single byte to z[] */ 14535 static void import_append_char(ImportCtx *p, int c){ 14536 if( p->n+1>=p->nAlloc ){ 14537 p->nAlloc += p->nAlloc + 100; 14538 p->z = sqlite3_realloc64(p->z, p->nAlloc); 14539 if( p->z==0 ) shell_out_of_memory(); 14540 } 14541 p->z[p->n++] = (char)c; 14542 } 14543 14544 /* Read a single field of CSV text. Compatible with rfc4180 and extended 14545 ** with the option of having a separator other than ",". 14546 ** 14547 ** + Input comes from p->in. 14548 ** + Store results in p->z of length p->n. Space to hold p->z comes 14549 ** from sqlite3_malloc64(). 14550 ** + Use p->cSep as the column separator. The default is ",". 14551 ** + Use p->rSep as the row separator. The default is "\n". 14552 ** + Keep track of the line number in p->nLine. 14553 ** + Store the character that terminates the field in p->cTerm. Store 14554 ** EOF on end-of-file. 14555 ** + Report syntax errors on stderr 14556 */ 14557 static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){ 14558 int c; 14559 int cSep = p->cColSep; 14560 int rSep = p->cRowSep; 14561 p->n = 0; 14562 c = fgetc(p->in); 14563 if( c==EOF || seenInterrupt ){ 14564 p->cTerm = EOF; 14565 return 0; 14566 } 14567 if( c=='"' ){ 14568 int pc, ppc; 14569 int startLine = p->nLine; 14570 int cQuote = c; 14571 pc = ppc = 0; 14572 while( 1 ){ 14573 c = fgetc(p->in); 14574 if( c==rSep ) p->nLine++; 14575 if( c==cQuote ){ 14576 if( pc==cQuote ){ 14577 pc = 0; 14578 continue; 14579 } 14580 } 14581 if( (c==cSep && pc==cQuote) 14582 || (c==rSep && pc==cQuote) 14583 || (c==rSep && pc=='\r' && ppc==cQuote) 14584 || (c==EOF && pc==cQuote) 14585 ){ 14586 do{ p->n--; }while( p->z[p->n]!=cQuote ); 14587 p->cTerm = c; 14588 break; 14589 } 14590 if( pc==cQuote && c!='\r' ){ 14591 utf8_printf(stderr, "%s:%d: unescaped %c character\n", 14592 p->zFile, p->nLine, cQuote); 14593 } 14594 if( c==EOF ){ 14595 utf8_printf(stderr, "%s:%d: unterminated %c-quoted field\n", 14596 p->zFile, startLine, cQuote); 14597 p->cTerm = c; 14598 break; 14599 } 14600 import_append_char(p, c); 14601 ppc = pc; 14602 pc = c; 14603 } 14604 }else{ 14605 /* If this is the first field being parsed and it begins with the 14606 ** UTF-8 BOM (0xEF BB BF) then skip the BOM */ 14607 if( (c&0xff)==0xef && p->bNotFirst==0 ){ 14608 import_append_char(p, c); 14609 c = fgetc(p->in); 14610 if( (c&0xff)==0xbb ){ 14611 import_append_char(p, c); 14612 c = fgetc(p->in); 14613 if( (c&0xff)==0xbf ){ 14614 p->bNotFirst = 1; 14615 p->n = 0; 14616 return csv_read_one_field(p); 14617 } 14618 } 14619 } 14620 while( c!=EOF && c!=cSep && c!=rSep ){ 14621 import_append_char(p, c); 14622 c = fgetc(p->in); 14623 } 14624 if( c==rSep ){ 14625 p->nLine++; 14626 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--; 14627 } 14628 p->cTerm = c; 14629 } 14630 if( p->z ) p->z[p->n] = 0; 14631 p->bNotFirst = 1; 14632 return p->z; 14633 } 14634 14635 /* Read a single field of ASCII delimited text. 14636 ** 14637 ** + Input comes from p->in. 14638 ** + Store results in p->z of length p->n. Space to hold p->z comes 14639 ** from sqlite3_malloc64(). 14640 ** + Use p->cSep as the column separator. The default is "\x1F". 14641 ** + Use p->rSep as the row separator. The default is "\x1E". 14642 ** + Keep track of the row number in p->nLine. 14643 ** + Store the character that terminates the field in p->cTerm. Store 14644 ** EOF on end-of-file. 14645 ** + Report syntax errors on stderr 14646 */ 14647 static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){ 14648 int c; 14649 int cSep = p->cColSep; 14650 int rSep = p->cRowSep; 14651 p->n = 0; 14652 c = fgetc(p->in); 14653 if( c==EOF || seenInterrupt ){ 14654 p->cTerm = EOF; 14655 return 0; 14656 } 14657 while( c!=EOF && c!=cSep && c!=rSep ){ 14658 import_append_char(p, c); 14659 c = fgetc(p->in); 14660 } 14661 if( c==rSep ){ 14662 p->nLine++; 14663 } 14664 p->cTerm = c; 14665 if( p->z ) p->z[p->n] = 0; 14666 return p->z; 14667 } 14668 14669 /* 14670 ** Try to transfer data for table zTable. If an error is seen while 14671 ** moving forward, try to go backwards. The backwards movement won't 14672 ** work for WITHOUT ROWID tables. 14673 */ 14674 static void tryToCloneData( 14675 ShellState *p, 14676 sqlite3 *newDb, 14677 const char *zTable 14678 ){ 14679 sqlite3_stmt *pQuery = 0; 14680 sqlite3_stmt *pInsert = 0; 14681 char *zQuery = 0; 14682 char *zInsert = 0; 14683 int rc; 14684 int i, j, n; 14685 int nTable = strlen30(zTable); 14686 int k = 0; 14687 int cnt = 0; 14688 const int spinRate = 10000; 14689 14690 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable); 14691 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0); 14692 if( rc ){ 14693 utf8_printf(stderr, "Error %d: %s on [%s]\n", 14694 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db), 14695 zQuery); 14696 goto end_data_xfer; 14697 } 14698 n = sqlite3_column_count(pQuery); 14699 zInsert = sqlite3_malloc64(200 + nTable + n*3); 14700 if( zInsert==0 ) shell_out_of_memory(); 14701 sqlite3_snprintf(200+nTable,zInsert, 14702 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable); 14703 i = strlen30(zInsert); 14704 for(j=1; j<n; j++){ 14705 memcpy(zInsert+i, ",?", 2); 14706 i += 2; 14707 } 14708 memcpy(zInsert+i, ");", 3); 14709 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0); 14710 if( rc ){ 14711 utf8_printf(stderr, "Error %d: %s on [%s]\n", 14712 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb), 14713 zQuery); 14714 goto end_data_xfer; 14715 } 14716 for(k=0; k<2; k++){ 14717 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){ 14718 for(i=0; i<n; i++){ 14719 switch( sqlite3_column_type(pQuery, i) ){ 14720 case SQLITE_NULL: { 14721 sqlite3_bind_null(pInsert, i+1); 14722 break; 14723 } 14724 case SQLITE_INTEGER: { 14725 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i)); 14726 break; 14727 } 14728 case SQLITE_FLOAT: { 14729 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i)); 14730 break; 14731 } 14732 case SQLITE_TEXT: { 14733 sqlite3_bind_text(pInsert, i+1, 14734 (const char*)sqlite3_column_text(pQuery,i), 14735 -1, SQLITE_STATIC); 14736 break; 14737 } 14738 case SQLITE_BLOB: { 14739 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i), 14740 sqlite3_column_bytes(pQuery,i), 14741 SQLITE_STATIC); 14742 break; 14743 } 14744 } 14745 } /* End for */ 14746 rc = sqlite3_step(pInsert); 14747 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){ 14748 utf8_printf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb), 14749 sqlite3_errmsg(newDb)); 14750 } 14751 sqlite3_reset(pInsert); 14752 cnt++; 14753 if( (cnt%spinRate)==0 ){ 14754 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]); 14755 fflush(stdout); 14756 } 14757 } /* End while */ 14758 if( rc==SQLITE_DONE ) break; 14759 sqlite3_finalize(pQuery); 14760 sqlite3_free(zQuery); 14761 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;", 14762 zTable); 14763 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0); 14764 if( rc ){ 14765 utf8_printf(stderr, "Warning: cannot step \"%s\" backwards", zTable); 14766 break; 14767 } 14768 } /* End for(k=0...) */ 14769 14770 end_data_xfer: 14771 sqlite3_finalize(pQuery); 14772 sqlite3_finalize(pInsert); 14773 sqlite3_free(zQuery); 14774 sqlite3_free(zInsert); 14775 } 14776 14777 14778 /* 14779 ** Try to transfer all rows of the schema that match zWhere. For 14780 ** each row, invoke xForEach() on the object defined by that row. 14781 ** If an error is encountered while moving forward through the 14782 ** sqlite_schema table, try again moving backwards. 14783 */ 14784 static void tryToCloneSchema( 14785 ShellState *p, 14786 sqlite3 *newDb, 14787 const char *zWhere, 14788 void (*xForEach)(ShellState*,sqlite3*,const char*) 14789 ){ 14790 sqlite3_stmt *pQuery = 0; 14791 char *zQuery = 0; 14792 int rc; 14793 const unsigned char *zName; 14794 const unsigned char *zSql; 14795 char *zErrMsg = 0; 14796 14797 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema" 14798 " WHERE %s", zWhere); 14799 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0); 14800 if( rc ){ 14801 utf8_printf(stderr, "Error: (%d) %s on [%s]\n", 14802 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db), 14803 zQuery); 14804 goto end_schema_xfer; 14805 } 14806 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){ 14807 zName = sqlite3_column_text(pQuery, 0); 14808 zSql = sqlite3_column_text(pQuery, 1); 14809 printf("%s... ", zName); fflush(stdout); 14810 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg); 14811 if( zErrMsg ){ 14812 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql); 14813 sqlite3_free(zErrMsg); 14814 zErrMsg = 0; 14815 } 14816 if( xForEach ){ 14817 xForEach(p, newDb, (const char*)zName); 14818 } 14819 printf("done\n"); 14820 } 14821 if( rc!=SQLITE_DONE ){ 14822 sqlite3_finalize(pQuery); 14823 sqlite3_free(zQuery); 14824 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema" 14825 " WHERE %s ORDER BY rowid DESC", zWhere); 14826 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0); 14827 if( rc ){ 14828 utf8_printf(stderr, "Error: (%d) %s on [%s]\n", 14829 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db), 14830 zQuery); 14831 goto end_schema_xfer; 14832 } 14833 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){ 14834 zName = sqlite3_column_text(pQuery, 0); 14835 zSql = sqlite3_column_text(pQuery, 1); 14836 printf("%s... ", zName); fflush(stdout); 14837 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg); 14838 if( zErrMsg ){ 14839 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql); 14840 sqlite3_free(zErrMsg); 14841 zErrMsg = 0; 14842 } 14843 if( xForEach ){ 14844 xForEach(p, newDb, (const char*)zName); 14845 } 14846 printf("done\n"); 14847 } 14848 } 14849 end_schema_xfer: 14850 sqlite3_finalize(pQuery); 14851 sqlite3_free(zQuery); 14852 } 14853 14854 /* 14855 ** Open a new database file named "zNewDb". Try to recover as much information 14856 ** as possible out of the main database (which might be corrupt) and write it 14857 ** into zNewDb. 14858 */ 14859 static void tryToClone(ShellState *p, const char *zNewDb){ 14860 int rc; 14861 sqlite3 *newDb = 0; 14862 if( access(zNewDb,0)==0 ){ 14863 utf8_printf(stderr, "File \"%s\" already exists.\n", zNewDb); 14864 return; 14865 } 14866 rc = sqlite3_open(zNewDb, &newDb); 14867 if( rc ){ 14868 utf8_printf(stderr, "Cannot create output database: %s\n", 14869 sqlite3_errmsg(newDb)); 14870 }else{ 14871 sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0); 14872 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0); 14873 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData); 14874 tryToCloneSchema(p, newDb, "type!='table'", 0); 14875 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0); 14876 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0); 14877 } 14878 close_db(newDb); 14879 } 14880 14881 /* 14882 ** Change the output file back to stdout. 14883 ** 14884 ** If the p->doXdgOpen flag is set, that means the output was being 14885 ** redirected to a temporary file named by p->zTempFile. In that case, 14886 ** launch start/open/xdg-open on that temporary file. 14887 */ 14888 static void output_reset(ShellState *p){ 14889 if( p->outfile[0]=='|' ){ 14890 #ifndef SQLITE_OMIT_POPEN 14891 pclose(p->out); 14892 #endif 14893 }else{ 14894 output_file_close(p->out); 14895 #ifndef SQLITE_NOHAVE_SYSTEM 14896 if( p->doXdgOpen ){ 14897 const char *zXdgOpenCmd = 14898 #if defined(_WIN32) 14899 "start"; 14900 #elif defined(__APPLE__) 14901 "open"; 14902 #else 14903 "xdg-open"; 14904 #endif 14905 char *zCmd; 14906 zCmd = sqlite3_mprintf("%s %s", zXdgOpenCmd, p->zTempFile); 14907 if( system(zCmd) ){ 14908 utf8_printf(stderr, "Failed: [%s]\n", zCmd); 14909 }else{ 14910 /* Give the start/open/xdg-open command some time to get 14911 ** going before we continue, and potential delete the 14912 ** p->zTempFile data file out from under it */ 14913 sqlite3_sleep(2000); 14914 } 14915 sqlite3_free(zCmd); 14916 outputModePop(p); 14917 p->doXdgOpen = 0; 14918 } 14919 #endif /* !defined(SQLITE_NOHAVE_SYSTEM) */ 14920 } 14921 p->outfile[0] = 0; 14922 p->out = stdout; 14923 } 14924 14925 /* 14926 ** Run an SQL command and return the single integer result. 14927 */ 14928 static int db_int(ShellState *p, const char *zSql){ 14929 sqlite3_stmt *pStmt; 14930 int res = 0; 14931 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 14932 if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){ 14933 res = sqlite3_column_int(pStmt,0); 14934 } 14935 sqlite3_finalize(pStmt); 14936 return res; 14937 } 14938 14939 /* 14940 ** Convert a 2-byte or 4-byte big-endian integer into a native integer 14941 */ 14942 static unsigned int get2byteInt(unsigned char *a){ 14943 return (a[0]<<8) + a[1]; 14944 } 14945 static unsigned int get4byteInt(unsigned char *a){ 14946 return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3]; 14947 } 14948 14949 /* 14950 ** Implementation of the ".dbinfo" command. 14951 ** 14952 ** Return 1 on error, 2 to exit, and 0 otherwise. 14953 */ 14954 static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){ 14955 static const struct { const char *zName; int ofst; } aField[] = { 14956 { "file change counter:", 24 }, 14957 { "database page count:", 28 }, 14958 { "freelist page count:", 36 }, 14959 { "schema cookie:", 40 }, 14960 { "schema format:", 44 }, 14961 { "default cache size:", 48 }, 14962 { "autovacuum top root:", 52 }, 14963 { "incremental vacuum:", 64 }, 14964 { "text encoding:", 56 }, 14965 { "user version:", 60 }, 14966 { "application id:", 68 }, 14967 { "software version:", 96 }, 14968 }; 14969 static const struct { const char *zName; const char *zSql; } aQuery[] = { 14970 { "number of tables:", 14971 "SELECT count(*) FROM %s WHERE type='table'" }, 14972 { "number of indexes:", 14973 "SELECT count(*) FROM %s WHERE type='index'" }, 14974 { "number of triggers:", 14975 "SELECT count(*) FROM %s WHERE type='trigger'" }, 14976 { "number of views:", 14977 "SELECT count(*) FROM %s WHERE type='view'" }, 14978 { "schema size:", 14979 "SELECT total(length(sql)) FROM %s" }, 14980 }; 14981 int i, rc; 14982 unsigned iDataVersion; 14983 char *zSchemaTab; 14984 char *zDb = nArg>=2 ? azArg[1] : "main"; 14985 sqlite3_stmt *pStmt = 0; 14986 unsigned char aHdr[100]; 14987 open_db(p, 0); 14988 if( p->db==0 ) return 1; 14989 rc = sqlite3_prepare_v2(p->db, 14990 "SELECT data FROM sqlite_dbpage(?1) WHERE pgno=1", 14991 -1, &pStmt, 0); 14992 if( rc ){ 14993 utf8_printf(stderr, "error: %s\n", sqlite3_errmsg(p->db)); 14994 sqlite3_finalize(pStmt); 14995 return 1; 14996 } 14997 sqlite3_bind_text(pStmt, 1, zDb, -1, SQLITE_STATIC); 14998 if( sqlite3_step(pStmt)==SQLITE_ROW 14999 && sqlite3_column_bytes(pStmt,0)>100 15000 ){ 15001 memcpy(aHdr, sqlite3_column_blob(pStmt,0), 100); 15002 sqlite3_finalize(pStmt); 15003 }else{ 15004 raw_printf(stderr, "unable to read database header\n"); 15005 sqlite3_finalize(pStmt); 15006 return 1; 15007 } 15008 i = get2byteInt(aHdr+16); 15009 if( i==1 ) i = 65536; 15010 utf8_printf(p->out, "%-20s %d\n", "database page size:", i); 15011 utf8_printf(p->out, "%-20s %d\n", "write format:", aHdr[18]); 15012 utf8_printf(p->out, "%-20s %d\n", "read format:", aHdr[19]); 15013 utf8_printf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]); 15014 for(i=0; i<ArraySize(aField); i++){ 15015 int ofst = aField[i].ofst; 15016 unsigned int val = get4byteInt(aHdr + ofst); 15017 utf8_printf(p->out, "%-20s %u", aField[i].zName, val); 15018 switch( ofst ){ 15019 case 56: { 15020 if( val==1 ) raw_printf(p->out, " (utf8)"); 15021 if( val==2 ) raw_printf(p->out, " (utf16le)"); 15022 if( val==3 ) raw_printf(p->out, " (utf16be)"); 15023 } 15024 } 15025 raw_printf(p->out, "\n"); 15026 } 15027 if( zDb==0 ){ 15028 zSchemaTab = sqlite3_mprintf("main.sqlite_schema"); 15029 }else if( strcmp(zDb,"temp")==0 ){ 15030 zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_schema"); 15031 }else{ 15032 zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_schema", zDb); 15033 } 15034 for(i=0; i<ArraySize(aQuery); i++){ 15035 char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab); 15036 int val = db_int(p, zSql); 15037 sqlite3_free(zSql); 15038 utf8_printf(p->out, "%-20s %d\n", aQuery[i].zName, val); 15039 } 15040 sqlite3_free(zSchemaTab); 15041 sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_DATA_VERSION, &iDataVersion); 15042 utf8_printf(p->out, "%-20s %u\n", "data version", iDataVersion); 15043 return 0; 15044 } 15045 15046 /* 15047 ** Print the current sqlite3_errmsg() value to stderr and return 1. 15048 */ 15049 static int shellDatabaseError(sqlite3 *db){ 15050 const char *zErr = sqlite3_errmsg(db); 15051 utf8_printf(stderr, "Error: %s\n", zErr); 15052 return 1; 15053 } 15054 15055 /* 15056 ** Compare the pattern in zGlob[] against the text in z[]. Return TRUE 15057 ** if they match and FALSE (0) if they do not match. 15058 ** 15059 ** Globbing rules: 15060 ** 15061 ** '*' Matches any sequence of zero or more characters. 15062 ** 15063 ** '?' Matches exactly one character. 15064 ** 15065 ** [...] Matches one character from the enclosed list of 15066 ** characters. 15067 ** 15068 ** [^...] Matches one character not in the enclosed list. 15069 ** 15070 ** '#' Matches any sequence of one or more digits with an 15071 ** optional + or - sign in front 15072 ** 15073 ** ' ' Any span of whitespace matches any other span of 15074 ** whitespace. 15075 ** 15076 ** Extra whitespace at the end of z[] is ignored. 15077 */ 15078 static int testcase_glob(const char *zGlob, const char *z){ 15079 int c, c2; 15080 int invert; 15081 int seen; 15082 15083 while( (c = (*(zGlob++)))!=0 ){ 15084 if( IsSpace(c) ){ 15085 if( !IsSpace(*z) ) return 0; 15086 while( IsSpace(*zGlob) ) zGlob++; 15087 while( IsSpace(*z) ) z++; 15088 }else if( c=='*' ){ 15089 while( (c=(*(zGlob++))) == '*' || c=='?' ){ 15090 if( c=='?' && (*(z++))==0 ) return 0; 15091 } 15092 if( c==0 ){ 15093 return 1; 15094 }else if( c=='[' ){ 15095 while( *z && testcase_glob(zGlob-1,z)==0 ){ 15096 z++; 15097 } 15098 return (*z)!=0; 15099 } 15100 while( (c2 = (*(z++)))!=0 ){ 15101 while( c2!=c ){ 15102 c2 = *(z++); 15103 if( c2==0 ) return 0; 15104 } 15105 if( testcase_glob(zGlob,z) ) return 1; 15106 } 15107 return 0; 15108 }else if( c=='?' ){ 15109 if( (*(z++))==0 ) return 0; 15110 }else if( c=='[' ){ 15111 int prior_c = 0; 15112 seen = 0; 15113 invert = 0; 15114 c = *(z++); 15115 if( c==0 ) return 0; 15116 c2 = *(zGlob++); 15117 if( c2=='^' ){ 15118 invert = 1; 15119 c2 = *(zGlob++); 15120 } 15121 if( c2==']' ){ 15122 if( c==']' ) seen = 1; 15123 c2 = *(zGlob++); 15124 } 15125 while( c2 && c2!=']' ){ 15126 if( c2=='-' && zGlob[0]!=']' && zGlob[0]!=0 && prior_c>0 ){ 15127 c2 = *(zGlob++); 15128 if( c>=prior_c && c<=c2 ) seen = 1; 15129 prior_c = 0; 15130 }else{ 15131 if( c==c2 ){ 15132 seen = 1; 15133 } 15134 prior_c = c2; 15135 } 15136 c2 = *(zGlob++); 15137 } 15138 if( c2==0 || (seen ^ invert)==0 ) return 0; 15139 }else if( c=='#' ){ 15140 if( (z[0]=='-' || z[0]=='+') && IsDigit(z[1]) ) z++; 15141 if( !IsDigit(z[0]) ) return 0; 15142 z++; 15143 while( IsDigit(z[0]) ){ z++; } 15144 }else{ 15145 if( c!=(*(z++)) ) return 0; 15146 } 15147 } 15148 while( IsSpace(*z) ){ z++; } 15149 return *z==0; 15150 } 15151 15152 15153 /* 15154 ** Compare the string as a command-line option with either one or two 15155 ** initial "-" characters. 15156 */ 15157 static int optionMatch(const char *zStr, const char *zOpt){ 15158 if( zStr[0]!='-' ) return 0; 15159 zStr++; 15160 if( zStr[0]=='-' ) zStr++; 15161 return strcmp(zStr, zOpt)==0; 15162 } 15163 15164 /* 15165 ** Delete a file. 15166 */ 15167 int shellDeleteFile(const char *zFilename){ 15168 int rc; 15169 #ifdef _WIN32 15170 wchar_t *z = sqlite3_win32_utf8_to_unicode(zFilename); 15171 rc = _wunlink(z); 15172 sqlite3_free(z); 15173 #else 15174 rc = unlink(zFilename); 15175 #endif 15176 return rc; 15177 } 15178 15179 /* 15180 ** Try to delete the temporary file (if there is one) and free the 15181 ** memory used to hold the name of the temp file. 15182 */ 15183 static void clearTempFile(ShellState *p){ 15184 if( p->zTempFile==0 ) return; 15185 if( p->doXdgOpen ) return; 15186 if( shellDeleteFile(p->zTempFile) ) return; 15187 sqlite3_free(p->zTempFile); 15188 p->zTempFile = 0; 15189 } 15190 15191 /* 15192 ** Create a new temp file name with the given suffix. 15193 */ 15194 static void newTempFile(ShellState *p, const char *zSuffix){ 15195 clearTempFile(p); 15196 sqlite3_free(p->zTempFile); 15197 p->zTempFile = 0; 15198 if( p->db ){ 15199 sqlite3_file_control(p->db, 0, SQLITE_FCNTL_TEMPFILENAME, &p->zTempFile); 15200 } 15201 if( p->zTempFile==0 ){ 15202 /* If p->db is an in-memory database then the TEMPFILENAME file-control 15203 ** will not work and we will need to fallback to guessing */ 15204 char *zTemp; 15205 sqlite3_uint64 r; 15206 sqlite3_randomness(sizeof(r), &r); 15207 zTemp = getenv("TEMP"); 15208 if( zTemp==0 ) zTemp = getenv("TMP"); 15209 if( zTemp==0 ){ 15210 #ifdef _WIN32 15211 zTemp = "\\tmp"; 15212 #else 15213 zTemp = "/tmp"; 15214 #endif 15215 } 15216 p->zTempFile = sqlite3_mprintf("%s/temp%llx.%s", zTemp, r, zSuffix); 15217 }else{ 15218 p->zTempFile = sqlite3_mprintf("%z.%s", p->zTempFile, zSuffix); 15219 } 15220 if( p->zTempFile==0 ){ 15221 raw_printf(stderr, "out of memory\n"); 15222 exit(1); 15223 } 15224 } 15225 15226 15227 /* 15228 ** The implementation of SQL scalar function fkey_collate_clause(), used 15229 ** by the ".lint fkey-indexes" command. This scalar function is always 15230 ** called with four arguments - the parent table name, the parent column name, 15231 ** the child table name and the child column name. 15232 ** 15233 ** fkey_collate_clause('parent-tab', 'parent-col', 'child-tab', 'child-col') 15234 ** 15235 ** If either of the named tables or columns do not exist, this function 15236 ** returns an empty string. An empty string is also returned if both tables 15237 ** and columns exist but have the same default collation sequence. Or, 15238 ** if both exist but the default collation sequences are different, this 15239 ** function returns the string " COLLATE <parent-collation>", where 15240 ** <parent-collation> is the default collation sequence of the parent column. 15241 */ 15242 static void shellFkeyCollateClause( 15243 sqlite3_context *pCtx, 15244 int nVal, 15245 sqlite3_value **apVal 15246 ){ 15247 sqlite3 *db = sqlite3_context_db_handle(pCtx); 15248 const char *zParent; 15249 const char *zParentCol; 15250 const char *zParentSeq; 15251 const char *zChild; 15252 const char *zChildCol; 15253 const char *zChildSeq = 0; /* Initialize to avoid false-positive warning */ 15254 int rc; 15255 15256 assert( nVal==4 ); 15257 zParent = (const char*)sqlite3_value_text(apVal[0]); 15258 zParentCol = (const char*)sqlite3_value_text(apVal[1]); 15259 zChild = (const char*)sqlite3_value_text(apVal[2]); 15260 zChildCol = (const char*)sqlite3_value_text(apVal[3]); 15261 15262 sqlite3_result_text(pCtx, "", -1, SQLITE_STATIC); 15263 rc = sqlite3_table_column_metadata( 15264 db, "main", zParent, zParentCol, 0, &zParentSeq, 0, 0, 0 15265 ); 15266 if( rc==SQLITE_OK ){ 15267 rc = sqlite3_table_column_metadata( 15268 db, "main", zChild, zChildCol, 0, &zChildSeq, 0, 0, 0 15269 ); 15270 } 15271 15272 if( rc==SQLITE_OK && sqlite3_stricmp(zParentSeq, zChildSeq) ){ 15273 char *z = sqlite3_mprintf(" COLLATE %s", zParentSeq); 15274 sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT); 15275 sqlite3_free(z); 15276 } 15277 } 15278 15279 15280 /* 15281 ** The implementation of dot-command ".lint fkey-indexes". 15282 */ 15283 static int lintFkeyIndexes( 15284 ShellState *pState, /* Current shell tool state */ 15285 char **azArg, /* Array of arguments passed to dot command */ 15286 int nArg /* Number of entries in azArg[] */ 15287 ){ 15288 sqlite3 *db = pState->db; /* Database handle to query "main" db of */ 15289 FILE *out = pState->out; /* Stream to write non-error output to */ 15290 int bVerbose = 0; /* If -verbose is present */ 15291 int bGroupByParent = 0; /* If -groupbyparent is present */ 15292 int i; /* To iterate through azArg[] */ 15293 const char *zIndent = ""; /* How much to indent CREATE INDEX by */ 15294 int rc; /* Return code */ 15295 sqlite3_stmt *pSql = 0; /* Compiled version of SQL statement below */ 15296 15297 /* 15298 ** This SELECT statement returns one row for each foreign key constraint 15299 ** in the schema of the main database. The column values are: 15300 ** 15301 ** 0. The text of an SQL statement similar to: 15302 ** 15303 ** "EXPLAIN QUERY PLAN SELECT 1 FROM child_table WHERE child_key=?" 15304 ** 15305 ** This SELECT is similar to the one that the foreign keys implementation 15306 ** needs to run internally on child tables. If there is an index that can 15307 ** be used to optimize this query, then it can also be used by the FK 15308 ** implementation to optimize DELETE or UPDATE statements on the parent 15309 ** table. 15310 ** 15311 ** 1. A GLOB pattern suitable for sqlite3_strglob(). If the plan output by 15312 ** the EXPLAIN QUERY PLAN command matches this pattern, then the schema 15313 ** contains an index that can be used to optimize the query. 15314 ** 15315 ** 2. Human readable text that describes the child table and columns. e.g. 15316 ** 15317 ** "child_table(child_key1, child_key2)" 15318 ** 15319 ** 3. Human readable text that describes the parent table and columns. e.g. 15320 ** 15321 ** "parent_table(parent_key1, parent_key2)" 15322 ** 15323 ** 4. A full CREATE INDEX statement for an index that could be used to 15324 ** optimize DELETE or UPDATE statements on the parent table. e.g. 15325 ** 15326 ** "CREATE INDEX child_table_child_key ON child_table(child_key)" 15327 ** 15328 ** 5. The name of the parent table. 15329 ** 15330 ** These six values are used by the C logic below to generate the report. 15331 */ 15332 const char *zSql = 15333 "SELECT " 15334 " 'EXPLAIN QUERY PLAN SELECT 1 FROM ' || quote(s.name) || ' WHERE '" 15335 " || group_concat(quote(s.name) || '.' || quote(f.[from]) || '=?' " 15336 " || fkey_collate_clause(" 15337 " f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]),' AND ')" 15338 ", " 15339 " 'SEARCH TABLE ' || s.name || ' USING COVERING INDEX*('" 15340 " || group_concat('*=?', ' AND ') || ')'" 15341 ", " 15342 " s.name || '(' || group_concat(f.[from], ', ') || ')'" 15343 ", " 15344 " f.[table] || '(' || group_concat(COALESCE(f.[to], p.[name])) || ')'" 15345 ", " 15346 " 'CREATE INDEX ' || quote(s.name ||'_'|| group_concat(f.[from], '_'))" 15347 " || ' ON ' || quote(s.name) || '('" 15348 " || group_concat(quote(f.[from]) ||" 15349 " fkey_collate_clause(" 15350 " f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]), ', ')" 15351 " || ');'" 15352 ", " 15353 " f.[table] " 15354 "FROM sqlite_schema AS s, pragma_foreign_key_list(s.name) AS f " 15355 "LEFT JOIN pragma_table_info AS p ON (pk-1=seq AND p.arg=f.[table]) " 15356 "GROUP BY s.name, f.id " 15357 "ORDER BY (CASE WHEN ? THEN f.[table] ELSE s.name END)" 15358 ; 15359 const char *zGlobIPK = "SEARCH TABLE * USING INTEGER PRIMARY KEY (rowid=?)"; 15360 15361 for(i=2; i<nArg; i++){ 15362 int n = strlen30(azArg[i]); 15363 if( n>1 && sqlite3_strnicmp("-verbose", azArg[i], n)==0 ){ 15364 bVerbose = 1; 15365 } 15366 else if( n>1 && sqlite3_strnicmp("-groupbyparent", azArg[i], n)==0 ){ 15367 bGroupByParent = 1; 15368 zIndent = " "; 15369 } 15370 else{ 15371 raw_printf(stderr, "Usage: %s %s ?-verbose? ?-groupbyparent?\n", 15372 azArg[0], azArg[1] 15373 ); 15374 return SQLITE_ERROR; 15375 } 15376 } 15377 15378 /* Register the fkey_collate_clause() SQL function */ 15379 rc = sqlite3_create_function(db, "fkey_collate_clause", 4, SQLITE_UTF8, 15380 0, shellFkeyCollateClause, 0, 0 15381 ); 15382 15383 15384 if( rc==SQLITE_OK ){ 15385 rc = sqlite3_prepare_v2(db, zSql, -1, &pSql, 0); 15386 } 15387 if( rc==SQLITE_OK ){ 15388 sqlite3_bind_int(pSql, 1, bGroupByParent); 15389 } 15390 15391 if( rc==SQLITE_OK ){ 15392 int rc2; 15393 char *zPrev = 0; 15394 while( SQLITE_ROW==sqlite3_step(pSql) ){ 15395 int res = -1; 15396 sqlite3_stmt *pExplain = 0; 15397 const char *zEQP = (const char*)sqlite3_column_text(pSql, 0); 15398 const char *zGlob = (const char*)sqlite3_column_text(pSql, 1); 15399 const char *zFrom = (const char*)sqlite3_column_text(pSql, 2); 15400 const char *zTarget = (const char*)sqlite3_column_text(pSql, 3); 15401 const char *zCI = (const char*)sqlite3_column_text(pSql, 4); 15402 const char *zParent = (const char*)sqlite3_column_text(pSql, 5); 15403 15404 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0); 15405 if( rc!=SQLITE_OK ) break; 15406 if( SQLITE_ROW==sqlite3_step(pExplain) ){ 15407 const char *zPlan = (const char*)sqlite3_column_text(pExplain, 3); 15408 res = ( 15409 0==sqlite3_strglob(zGlob, zPlan) 15410 || 0==sqlite3_strglob(zGlobIPK, zPlan) 15411 ); 15412 } 15413 rc = sqlite3_finalize(pExplain); 15414 if( rc!=SQLITE_OK ) break; 15415 15416 if( res<0 ){ 15417 raw_printf(stderr, "Error: internal error"); 15418 break; 15419 }else{ 15420 if( bGroupByParent 15421 && (bVerbose || res==0) 15422 && (zPrev==0 || sqlite3_stricmp(zParent, zPrev)) 15423 ){ 15424 raw_printf(out, "-- Parent table %s\n", zParent); 15425 sqlite3_free(zPrev); 15426 zPrev = sqlite3_mprintf("%s", zParent); 15427 } 15428 15429 if( res==0 ){ 15430 raw_printf(out, "%s%s --> %s\n", zIndent, zCI, zTarget); 15431 }else if( bVerbose ){ 15432 raw_printf(out, "%s/* no extra indexes required for %s -> %s */\n", 15433 zIndent, zFrom, zTarget 15434 ); 15435 } 15436 } 15437 } 15438 sqlite3_free(zPrev); 15439 15440 if( rc!=SQLITE_OK ){ 15441 raw_printf(stderr, "%s\n", sqlite3_errmsg(db)); 15442 } 15443 15444 rc2 = sqlite3_finalize(pSql); 15445 if( rc==SQLITE_OK && rc2!=SQLITE_OK ){ 15446 rc = rc2; 15447 raw_printf(stderr, "%s\n", sqlite3_errmsg(db)); 15448 } 15449 }else{ 15450 raw_printf(stderr, "%s\n", sqlite3_errmsg(db)); 15451 } 15452 15453 return rc; 15454 } 15455 15456 /* 15457 ** Implementation of ".lint" dot command. 15458 */ 15459 static int lintDotCommand( 15460 ShellState *pState, /* Current shell tool state */ 15461 char **azArg, /* Array of arguments passed to dot command */ 15462 int nArg /* Number of entries in azArg[] */ 15463 ){ 15464 int n; 15465 n = (nArg>=2 ? strlen30(azArg[1]) : 0); 15466 if( n<1 || sqlite3_strnicmp(azArg[1], "fkey-indexes", n) ) goto usage; 15467 return lintFkeyIndexes(pState, azArg, nArg); 15468 15469 usage: 15470 raw_printf(stderr, "Usage %s sub-command ?switches...?\n", azArg[0]); 15471 raw_printf(stderr, "Where sub-commands are:\n"); 15472 raw_printf(stderr, " fkey-indexes\n"); 15473 return SQLITE_ERROR; 15474 } 15475 15476 #if !defined SQLITE_OMIT_VIRTUALTABLE 15477 static void shellPrepare( 15478 sqlite3 *db, 15479 int *pRc, 15480 const char *zSql, 15481 sqlite3_stmt **ppStmt 15482 ){ 15483 *ppStmt = 0; 15484 if( *pRc==SQLITE_OK ){ 15485 int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0); 15486 if( rc!=SQLITE_OK ){ 15487 raw_printf(stderr, "sql error: %s (%d)\n", 15488 sqlite3_errmsg(db), sqlite3_errcode(db) 15489 ); 15490 *pRc = rc; 15491 } 15492 } 15493 } 15494 15495 /* 15496 ** Create a prepared statement using printf-style arguments for the SQL. 15497 ** 15498 ** This routine is could be marked "static". But it is not always used, 15499 ** depending on compile-time options. By omitting the "static", we avoid 15500 ** nuisance compiler warnings about "defined but not used". 15501 */ 15502 void shellPreparePrintf( 15503 sqlite3 *db, 15504 int *pRc, 15505 sqlite3_stmt **ppStmt, 15506 const char *zFmt, 15507 ... 15508 ){ 15509 *ppStmt = 0; 15510 if( *pRc==SQLITE_OK ){ 15511 va_list ap; 15512 char *z; 15513 va_start(ap, zFmt); 15514 z = sqlite3_vmprintf(zFmt, ap); 15515 va_end(ap); 15516 if( z==0 ){ 15517 *pRc = SQLITE_NOMEM; 15518 }else{ 15519 shellPrepare(db, pRc, z, ppStmt); 15520 sqlite3_free(z); 15521 } 15522 } 15523 } 15524 15525 /* Finalize the prepared statement created using shellPreparePrintf(). 15526 ** 15527 ** This routine is could be marked "static". But it is not always used, 15528 ** depending on compile-time options. By omitting the "static", we avoid 15529 ** nuisance compiler warnings about "defined but not used". 15530 */ 15531 void shellFinalize( 15532 int *pRc, 15533 sqlite3_stmt *pStmt 15534 ){ 15535 if( pStmt ){ 15536 sqlite3 *db = sqlite3_db_handle(pStmt); 15537 int rc = sqlite3_finalize(pStmt); 15538 if( *pRc==SQLITE_OK ){ 15539 if( rc!=SQLITE_OK ){ 15540 raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db)); 15541 } 15542 *pRc = rc; 15543 } 15544 } 15545 } 15546 15547 /* Reset the prepared statement created using shellPreparePrintf(). 15548 ** 15549 ** This routine is could be marked "static". But it is not always used, 15550 ** depending on compile-time options. By omitting the "static", we avoid 15551 ** nuisance compiler warnings about "defined but not used". 15552 */ 15553 void shellReset( 15554 int *pRc, 15555 sqlite3_stmt *pStmt 15556 ){ 15557 int rc = sqlite3_reset(pStmt); 15558 if( *pRc==SQLITE_OK ){ 15559 if( rc!=SQLITE_OK ){ 15560 sqlite3 *db = sqlite3_db_handle(pStmt); 15561 raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db)); 15562 } 15563 *pRc = rc; 15564 } 15565 } 15566 #endif /* !defined SQLITE_OMIT_VIRTUALTABLE */ 15567 15568 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) 15569 /****************************************************************************** 15570 ** The ".archive" or ".ar" command. 15571 */ 15572 /* 15573 ** Structure representing a single ".ar" command. 15574 */ 15575 typedef struct ArCommand ArCommand; 15576 struct ArCommand { 15577 u8 eCmd; /* An AR_CMD_* value */ 15578 u8 bVerbose; /* True if --verbose */ 15579 u8 bZip; /* True if the archive is a ZIP */ 15580 u8 bDryRun; /* True if --dry-run */ 15581 u8 bAppend; /* True if --append */ 15582 u8 fromCmdLine; /* Run from -A instead of .archive */ 15583 int nArg; /* Number of command arguments */ 15584 char *zSrcTable; /* "sqlar", "zipfile($file)" or "zip" */ 15585 const char *zFile; /* --file argument, or NULL */ 15586 const char *zDir; /* --directory argument, or NULL */ 15587 char **azArg; /* Array of command arguments */ 15588 ShellState *p; /* Shell state */ 15589 sqlite3 *db; /* Database containing the archive */ 15590 }; 15591 15592 /* 15593 ** Print a usage message for the .ar command to stderr and return SQLITE_ERROR. 15594 */ 15595 static int arUsage(FILE *f){ 15596 showHelp(f,"archive"); 15597 return SQLITE_ERROR; 15598 } 15599 15600 /* 15601 ** Print an error message for the .ar command to stderr and return 15602 ** SQLITE_ERROR. 15603 */ 15604 static int arErrorMsg(ArCommand *pAr, const char *zFmt, ...){ 15605 va_list ap; 15606 char *z; 15607 va_start(ap, zFmt); 15608 z = sqlite3_vmprintf(zFmt, ap); 15609 va_end(ap); 15610 utf8_printf(stderr, "Error: %s\n", z); 15611 if( pAr->fromCmdLine ){ 15612 utf8_printf(stderr, "Use \"-A\" for more help\n"); 15613 }else{ 15614 utf8_printf(stderr, "Use \".archive --help\" for more help\n"); 15615 } 15616 sqlite3_free(z); 15617 return SQLITE_ERROR; 15618 } 15619 15620 /* 15621 ** Values for ArCommand.eCmd. 15622 */ 15623 #define AR_CMD_CREATE 1 15624 #define AR_CMD_UPDATE 2 15625 #define AR_CMD_INSERT 3 15626 #define AR_CMD_EXTRACT 4 15627 #define AR_CMD_LIST 5 15628 #define AR_CMD_HELP 6 15629 15630 /* 15631 ** Other (non-command) switches. 15632 */ 15633 #define AR_SWITCH_VERBOSE 7 15634 #define AR_SWITCH_FILE 8 15635 #define AR_SWITCH_DIRECTORY 9 15636 #define AR_SWITCH_APPEND 10 15637 #define AR_SWITCH_DRYRUN 11 15638 15639 static int arProcessSwitch(ArCommand *pAr, int eSwitch, const char *zArg){ 15640 switch( eSwitch ){ 15641 case AR_CMD_CREATE: 15642 case AR_CMD_EXTRACT: 15643 case AR_CMD_LIST: 15644 case AR_CMD_UPDATE: 15645 case AR_CMD_INSERT: 15646 case AR_CMD_HELP: 15647 if( pAr->eCmd ){ 15648 return arErrorMsg(pAr, "multiple command options"); 15649 } 15650 pAr->eCmd = eSwitch; 15651 break; 15652 15653 case AR_SWITCH_DRYRUN: 15654 pAr->bDryRun = 1; 15655 break; 15656 case AR_SWITCH_VERBOSE: 15657 pAr->bVerbose = 1; 15658 break; 15659 case AR_SWITCH_APPEND: 15660 pAr->bAppend = 1; 15661 /* Fall thru into --file */ 15662 case AR_SWITCH_FILE: 15663 pAr->zFile = zArg; 15664 break; 15665 case AR_SWITCH_DIRECTORY: 15666 pAr->zDir = zArg; 15667 break; 15668 } 15669 15670 return SQLITE_OK; 15671 } 15672 15673 /* 15674 ** Parse the command line for an ".ar" command. The results are written into 15675 ** structure (*pAr). SQLITE_OK is returned if the command line is parsed 15676 ** successfully, otherwise an error message is written to stderr and 15677 ** SQLITE_ERROR returned. 15678 */ 15679 static int arParseCommand( 15680 char **azArg, /* Array of arguments passed to dot command */ 15681 int nArg, /* Number of entries in azArg[] */ 15682 ArCommand *pAr /* Populate this object */ 15683 ){ 15684 struct ArSwitch { 15685 const char *zLong; 15686 char cShort; 15687 u8 eSwitch; 15688 u8 bArg; 15689 } aSwitch[] = { 15690 { "create", 'c', AR_CMD_CREATE, 0 }, 15691 { "extract", 'x', AR_CMD_EXTRACT, 0 }, 15692 { "insert", 'i', AR_CMD_INSERT, 0 }, 15693 { "list", 't', AR_CMD_LIST, 0 }, 15694 { "update", 'u', AR_CMD_UPDATE, 0 }, 15695 { "help", 'h', AR_CMD_HELP, 0 }, 15696 { "verbose", 'v', AR_SWITCH_VERBOSE, 0 }, 15697 { "file", 'f', AR_SWITCH_FILE, 1 }, 15698 { "append", 'a', AR_SWITCH_APPEND, 1 }, 15699 { "directory", 'C', AR_SWITCH_DIRECTORY, 1 }, 15700 { "dryrun", 'n', AR_SWITCH_DRYRUN, 0 }, 15701 }; 15702 int nSwitch = sizeof(aSwitch) / sizeof(struct ArSwitch); 15703 struct ArSwitch *pEnd = &aSwitch[nSwitch]; 15704 15705 if( nArg<=1 ){ 15706 utf8_printf(stderr, "Wrong number of arguments. Usage:\n"); 15707 return arUsage(stderr); 15708 }else{ 15709 char *z = azArg[1]; 15710 if( z[0]!='-' ){ 15711 /* Traditional style [tar] invocation */ 15712 int i; 15713 int iArg = 2; 15714 for(i=0; z[i]; i++){ 15715 const char *zArg = 0; 15716 struct ArSwitch *pOpt; 15717 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){ 15718 if( z[i]==pOpt->cShort ) break; 15719 } 15720 if( pOpt==pEnd ){ 15721 return arErrorMsg(pAr, "unrecognized option: %c", z[i]); 15722 } 15723 if( pOpt->bArg ){ 15724 if( iArg>=nArg ){ 15725 return arErrorMsg(pAr, "option requires an argument: %c",z[i]); 15726 } 15727 zArg = azArg[iArg++]; 15728 } 15729 if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR; 15730 } 15731 pAr->nArg = nArg-iArg; 15732 if( pAr->nArg>0 ){ 15733 pAr->azArg = &azArg[iArg]; 15734 } 15735 }else{ 15736 /* Non-traditional invocation */ 15737 int iArg; 15738 for(iArg=1; iArg<nArg; iArg++){ 15739 int n; 15740 z = azArg[iArg]; 15741 if( z[0]!='-' ){ 15742 /* All remaining command line words are command arguments. */ 15743 pAr->azArg = &azArg[iArg]; 15744 pAr->nArg = nArg-iArg; 15745 break; 15746 } 15747 n = strlen30(z); 15748 15749 if( z[1]!='-' ){ 15750 int i; 15751 /* One or more short options */ 15752 for(i=1; i<n; i++){ 15753 const char *zArg = 0; 15754 struct ArSwitch *pOpt; 15755 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){ 15756 if( z[i]==pOpt->cShort ) break; 15757 } 15758 if( pOpt==pEnd ){ 15759 return arErrorMsg(pAr, "unrecognized option: %c", z[i]); 15760 } 15761 if( pOpt->bArg ){ 15762 if( i<(n-1) ){ 15763 zArg = &z[i+1]; 15764 i = n; 15765 }else{ 15766 if( iArg>=(nArg-1) ){ 15767 return arErrorMsg(pAr, "option requires an argument: %c", 15768 z[i]); 15769 } 15770 zArg = azArg[++iArg]; 15771 } 15772 } 15773 if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR; 15774 } 15775 }else if( z[2]=='\0' ){ 15776 /* A -- option, indicating that all remaining command line words 15777 ** are command arguments. */ 15778 pAr->azArg = &azArg[iArg+1]; 15779 pAr->nArg = nArg-iArg-1; 15780 break; 15781 }else{ 15782 /* A long option */ 15783 const char *zArg = 0; /* Argument for option, if any */ 15784 struct ArSwitch *pMatch = 0; /* Matching option */ 15785 struct ArSwitch *pOpt; /* Iterator */ 15786 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){ 15787 const char *zLong = pOpt->zLong; 15788 if( (n-2)<=strlen30(zLong) && 0==memcmp(&z[2], zLong, n-2) ){ 15789 if( pMatch ){ 15790 return arErrorMsg(pAr, "ambiguous option: %s",z); 15791 }else{ 15792 pMatch = pOpt; 15793 } 15794 } 15795 } 15796 15797 if( pMatch==0 ){ 15798 return arErrorMsg(pAr, "unrecognized option: %s", z); 15799 } 15800 if( pMatch->bArg ){ 15801 if( iArg>=(nArg-1) ){ 15802 return arErrorMsg(pAr, "option requires an argument: %s", z); 15803 } 15804 zArg = azArg[++iArg]; 15805 } 15806 if( arProcessSwitch(pAr, pMatch->eSwitch, zArg) ) return SQLITE_ERROR; 15807 } 15808 } 15809 } 15810 } 15811 15812 return SQLITE_OK; 15813 } 15814 15815 /* 15816 ** This function assumes that all arguments within the ArCommand.azArg[] 15817 ** array refer to archive members, as for the --extract or --list commands. 15818 ** It checks that each of them are present. If any specified file is not 15819 ** present in the archive, an error is printed to stderr and an error 15820 ** code returned. Otherwise, if all specified arguments are present in 15821 ** the archive, SQLITE_OK is returned. 15822 ** 15823 ** This function strips any trailing '/' characters from each argument. 15824 ** This is consistent with the way the [tar] command seems to work on 15825 ** Linux. 15826 */ 15827 static int arCheckEntries(ArCommand *pAr){ 15828 int rc = SQLITE_OK; 15829 if( pAr->nArg ){ 15830 int i, j; 15831 sqlite3_stmt *pTest = 0; 15832 15833 shellPreparePrintf(pAr->db, &rc, &pTest, 15834 "SELECT name FROM %s WHERE name=$name", 15835 pAr->zSrcTable 15836 ); 15837 j = sqlite3_bind_parameter_index(pTest, "$name"); 15838 for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){ 15839 char *z = pAr->azArg[i]; 15840 int n = strlen30(z); 15841 int bOk = 0; 15842 while( n>0 && z[n-1]=='/' ) n--; 15843 z[n] = '\0'; 15844 sqlite3_bind_text(pTest, j, z, -1, SQLITE_STATIC); 15845 if( SQLITE_ROW==sqlite3_step(pTest) ){ 15846 bOk = 1; 15847 } 15848 shellReset(&rc, pTest); 15849 if( rc==SQLITE_OK && bOk==0 ){ 15850 utf8_printf(stderr, "not found in archive: %s\n", z); 15851 rc = SQLITE_ERROR; 15852 } 15853 } 15854 shellFinalize(&rc, pTest); 15855 } 15856 return rc; 15857 } 15858 15859 /* 15860 ** Format a WHERE clause that can be used against the "sqlar" table to 15861 ** identify all archive members that match the command arguments held 15862 ** in (*pAr). Leave this WHERE clause in (*pzWhere) before returning. 15863 ** The caller is responsible for eventually calling sqlite3_free() on 15864 ** any non-NULL (*pzWhere) value. 15865 */ 15866 static void arWhereClause( 15867 int *pRc, 15868 ArCommand *pAr, 15869 char **pzWhere /* OUT: New WHERE clause */ 15870 ){ 15871 char *zWhere = 0; 15872 if( *pRc==SQLITE_OK ){ 15873 if( pAr->nArg==0 ){ 15874 zWhere = sqlite3_mprintf("1"); 15875 }else{ 15876 int i; 15877 const char *zSep = ""; 15878 for(i=0; i<pAr->nArg; i++){ 15879 const char *z = pAr->azArg[i]; 15880 zWhere = sqlite3_mprintf( 15881 "%z%s name = '%q' OR substr(name,1,%d) = '%q/'", 15882 zWhere, zSep, z, strlen30(z)+1, z 15883 ); 15884 if( zWhere==0 ){ 15885 *pRc = SQLITE_NOMEM; 15886 break; 15887 } 15888 zSep = " OR "; 15889 } 15890 } 15891 } 15892 *pzWhere = zWhere; 15893 } 15894 15895 /* 15896 ** Implementation of .ar "lisT" command. 15897 */ 15898 static int arListCommand(ArCommand *pAr){ 15899 const char *zSql = "SELECT %s FROM %s WHERE %s"; 15900 const char *azCols[] = { 15901 "name", 15902 "lsmode(mode), sz, datetime(mtime, 'unixepoch'), name" 15903 }; 15904 15905 char *zWhere = 0; 15906 sqlite3_stmt *pSql = 0; 15907 int rc; 15908 15909 rc = arCheckEntries(pAr); 15910 arWhereClause(&rc, pAr, &zWhere); 15911 15912 shellPreparePrintf(pAr->db, &rc, &pSql, zSql, azCols[pAr->bVerbose], 15913 pAr->zSrcTable, zWhere); 15914 if( pAr->bDryRun ){ 15915 utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql)); 15916 }else{ 15917 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){ 15918 if( pAr->bVerbose ){ 15919 utf8_printf(pAr->p->out, "%s % 10d %s %s\n", 15920 sqlite3_column_text(pSql, 0), 15921 sqlite3_column_int(pSql, 1), 15922 sqlite3_column_text(pSql, 2), 15923 sqlite3_column_text(pSql, 3) 15924 ); 15925 }else{ 15926 utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0)); 15927 } 15928 } 15929 } 15930 shellFinalize(&rc, pSql); 15931 sqlite3_free(zWhere); 15932 return rc; 15933 } 15934 15935 15936 /* 15937 ** Implementation of .ar "eXtract" command. 15938 */ 15939 static int arExtractCommand(ArCommand *pAr){ 15940 const char *zSql1 = 15941 "SELECT " 15942 " ($dir || name)," 15943 " writefile(($dir || name), %s, mode, mtime) " 15944 "FROM %s WHERE (%s) AND (data IS NULL OR $dirOnly = 0)" 15945 " AND name NOT GLOB '*..[/\\]*'"; 15946 15947 const char *azExtraArg[] = { 15948 "sqlar_uncompress(data, sz)", 15949 "data" 15950 }; 15951 15952 sqlite3_stmt *pSql = 0; 15953 int rc = SQLITE_OK; 15954 char *zDir = 0; 15955 char *zWhere = 0; 15956 int i, j; 15957 15958 /* If arguments are specified, check that they actually exist within 15959 ** the archive before proceeding. And formulate a WHERE clause to 15960 ** match them. */ 15961 rc = arCheckEntries(pAr); 15962 arWhereClause(&rc, pAr, &zWhere); 15963 15964 if( rc==SQLITE_OK ){ 15965 if( pAr->zDir ){ 15966 zDir = sqlite3_mprintf("%s/", pAr->zDir); 15967 }else{ 15968 zDir = sqlite3_mprintf(""); 15969 } 15970 if( zDir==0 ) rc = SQLITE_NOMEM; 15971 } 15972 15973 shellPreparePrintf(pAr->db, &rc, &pSql, zSql1, 15974 azExtraArg[pAr->bZip], pAr->zSrcTable, zWhere 15975 ); 15976 15977 if( rc==SQLITE_OK ){ 15978 j = sqlite3_bind_parameter_index(pSql, "$dir"); 15979 sqlite3_bind_text(pSql, j, zDir, -1, SQLITE_STATIC); 15980 15981 /* Run the SELECT statement twice. The first time, writefile() is called 15982 ** for all archive members that should be extracted. The second time, 15983 ** only for the directories. This is because the timestamps for 15984 ** extracted directories must be reset after they are populated (as 15985 ** populating them changes the timestamp). */ 15986 for(i=0; i<2; i++){ 15987 j = sqlite3_bind_parameter_index(pSql, "$dirOnly"); 15988 sqlite3_bind_int(pSql, j, i); 15989 if( pAr->bDryRun ){ 15990 utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql)); 15991 }else{ 15992 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){ 15993 if( i==0 && pAr->bVerbose ){ 15994 utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0)); 15995 } 15996 } 15997 } 15998 shellReset(&rc, pSql); 15999 } 16000 shellFinalize(&rc, pSql); 16001 } 16002 16003 sqlite3_free(zDir); 16004 sqlite3_free(zWhere); 16005 return rc; 16006 } 16007 16008 /* 16009 ** Run the SQL statement in zSql. Or if doing a --dryrun, merely print it out. 16010 */ 16011 static int arExecSql(ArCommand *pAr, const char *zSql){ 16012 int rc; 16013 if( pAr->bDryRun ){ 16014 utf8_printf(pAr->p->out, "%s\n", zSql); 16015 rc = SQLITE_OK; 16016 }else{ 16017 char *zErr = 0; 16018 rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr); 16019 if( zErr ){ 16020 utf8_printf(stdout, "ERROR: %s\n", zErr); 16021 sqlite3_free(zErr); 16022 } 16023 } 16024 return rc; 16025 } 16026 16027 16028 /* 16029 ** Implementation of .ar "create", "insert", and "update" commands. 16030 ** 16031 ** create -> Create a new SQL archive 16032 ** insert -> Insert or reinsert all files listed 16033 ** update -> Insert files that have changed or that were not 16034 ** previously in the archive 16035 ** 16036 ** Create the "sqlar" table in the database if it does not already exist. 16037 ** Then add each file in the azFile[] array to the archive. Directories 16038 ** are added recursively. If argument bVerbose is non-zero, a message is 16039 ** printed on stdout for each file archived. 16040 ** 16041 ** The create command is the same as update, except that it drops 16042 ** any existing "sqlar" table before beginning. The "insert" command 16043 ** always overwrites every file named on the command-line, where as 16044 ** "update" only overwrites if the size or mtime or mode has changed. 16045 */ 16046 static int arCreateOrUpdateCommand( 16047 ArCommand *pAr, /* Command arguments and options */ 16048 int bUpdate, /* true for a --create. */ 16049 int bOnlyIfChanged /* Only update if file has changed */ 16050 ){ 16051 const char *zCreate = 16052 "CREATE TABLE IF NOT EXISTS sqlar(\n" 16053 " name TEXT PRIMARY KEY, -- name of the file\n" 16054 " mode INT, -- access permissions\n" 16055 " mtime INT, -- last modification time\n" 16056 " sz INT, -- original file size\n" 16057 " data BLOB -- compressed content\n" 16058 ")"; 16059 const char *zDrop = "DROP TABLE IF EXISTS sqlar"; 16060 const char *zInsertFmt[2] = { 16061 "REPLACE INTO %s(name,mode,mtime,sz,data)\n" 16062 " SELECT\n" 16063 " %s,\n" 16064 " mode,\n" 16065 " mtime,\n" 16066 " CASE substr(lsmode(mode),1,1)\n" 16067 " WHEN '-' THEN length(data)\n" 16068 " WHEN 'd' THEN 0\n" 16069 " ELSE -1 END,\n" 16070 " sqlar_compress(data)\n" 16071 " FROM fsdir(%Q,%Q) AS disk\n" 16072 " WHERE lsmode(mode) NOT LIKE '?%%'%s;" 16073 , 16074 "REPLACE INTO %s(name,mode,mtime,data)\n" 16075 " SELECT\n" 16076 " %s,\n" 16077 " mode,\n" 16078 " mtime,\n" 16079 " data\n" 16080 " FROM fsdir(%Q,%Q) AS disk\n" 16081 " WHERE lsmode(mode) NOT LIKE '?%%'%s;" 16082 }; 16083 int i; /* For iterating through azFile[] */ 16084 int rc; /* Return code */ 16085 const char *zTab = 0; /* SQL table into which to insert */ 16086 char *zSql; 16087 char zTemp[50]; 16088 char *zExists = 0; 16089 16090 arExecSql(pAr, "PRAGMA page_size=512"); 16091 rc = arExecSql(pAr, "SAVEPOINT ar;"); 16092 if( rc!=SQLITE_OK ) return rc; 16093 zTemp[0] = 0; 16094 if( pAr->bZip ){ 16095 /* Initialize the zipfile virtual table, if necessary */ 16096 if( pAr->zFile ){ 16097 sqlite3_uint64 r; 16098 sqlite3_randomness(sizeof(r),&r); 16099 sqlite3_snprintf(sizeof(zTemp),zTemp,"zip%016llx",r); 16100 zTab = zTemp; 16101 zSql = sqlite3_mprintf( 16102 "CREATE VIRTUAL TABLE temp.%s USING zipfile(%Q)", 16103 zTab, pAr->zFile 16104 ); 16105 rc = arExecSql(pAr, zSql); 16106 sqlite3_free(zSql); 16107 }else{ 16108 zTab = "zip"; 16109 } 16110 }else{ 16111 /* Initialize the table for an SQLAR */ 16112 zTab = "sqlar"; 16113 if( bUpdate==0 ){ 16114 rc = arExecSql(pAr, zDrop); 16115 if( rc!=SQLITE_OK ) goto end_ar_transaction; 16116 } 16117 rc = arExecSql(pAr, zCreate); 16118 } 16119 if( bOnlyIfChanged ){ 16120 zExists = sqlite3_mprintf( 16121 " AND NOT EXISTS(" 16122 "SELECT 1 FROM %s AS mem" 16123 " WHERE mem.name=disk.name" 16124 " AND mem.mtime=disk.mtime" 16125 " AND mem.mode=disk.mode)", zTab); 16126 }else{ 16127 zExists = sqlite3_mprintf(""); 16128 } 16129 if( zExists==0 ) rc = SQLITE_NOMEM; 16130 for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){ 16131 char *zSql2 = sqlite3_mprintf(zInsertFmt[pAr->bZip], zTab, 16132 pAr->bVerbose ? "shell_putsnl(name)" : "name", 16133 pAr->azArg[i], pAr->zDir, zExists); 16134 rc = arExecSql(pAr, zSql2); 16135 sqlite3_free(zSql2); 16136 } 16137 end_ar_transaction: 16138 if( rc!=SQLITE_OK ){ 16139 sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0); 16140 }else{ 16141 rc = arExecSql(pAr, "RELEASE ar;"); 16142 if( pAr->bZip && pAr->zFile ){ 16143 zSql = sqlite3_mprintf("DROP TABLE %s", zTemp); 16144 arExecSql(pAr, zSql); 16145 sqlite3_free(zSql); 16146 } 16147 } 16148 sqlite3_free(zExists); 16149 return rc; 16150 } 16151 16152 /* 16153 ** Implementation of ".ar" dot command. 16154 */ 16155 static int arDotCommand( 16156 ShellState *pState, /* Current shell tool state */ 16157 int fromCmdLine, /* True if -A command-line option, not .ar cmd */ 16158 char **azArg, /* Array of arguments passed to dot command */ 16159 int nArg /* Number of entries in azArg[] */ 16160 ){ 16161 ArCommand cmd; 16162 int rc; 16163 memset(&cmd, 0, sizeof(cmd)); 16164 cmd.fromCmdLine = fromCmdLine; 16165 rc = arParseCommand(azArg, nArg, &cmd); 16166 if( rc==SQLITE_OK ){ 16167 int eDbType = SHELL_OPEN_UNSPEC; 16168 cmd.p = pState; 16169 cmd.db = pState->db; 16170 if( cmd.zFile ){ 16171 eDbType = deduceDatabaseType(cmd.zFile, 1); 16172 }else{ 16173 eDbType = pState->openMode; 16174 } 16175 if( eDbType==SHELL_OPEN_ZIPFILE ){ 16176 if( cmd.eCmd==AR_CMD_EXTRACT || cmd.eCmd==AR_CMD_LIST ){ 16177 if( cmd.zFile==0 ){ 16178 cmd.zSrcTable = sqlite3_mprintf("zip"); 16179 }else{ 16180 cmd.zSrcTable = sqlite3_mprintf("zipfile(%Q)", cmd.zFile); 16181 } 16182 } 16183 cmd.bZip = 1; 16184 }else if( cmd.zFile ){ 16185 int flags; 16186 if( cmd.bAppend ) eDbType = SHELL_OPEN_APPENDVFS; 16187 if( cmd.eCmd==AR_CMD_CREATE || cmd.eCmd==AR_CMD_INSERT 16188 || cmd.eCmd==AR_CMD_UPDATE ){ 16189 flags = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE; 16190 }else{ 16191 flags = SQLITE_OPEN_READONLY; 16192 } 16193 cmd.db = 0; 16194 if( cmd.bDryRun ){ 16195 utf8_printf(pState->out, "-- open database '%s'%s\n", cmd.zFile, 16196 eDbType==SHELL_OPEN_APPENDVFS ? " using 'apndvfs'" : ""); 16197 } 16198 rc = sqlite3_open_v2(cmd.zFile, &cmd.db, flags, 16199 eDbType==SHELL_OPEN_APPENDVFS ? "apndvfs" : 0); 16200 if( rc!=SQLITE_OK ){ 16201 utf8_printf(stderr, "cannot open file: %s (%s)\n", 16202 cmd.zFile, sqlite3_errmsg(cmd.db) 16203 ); 16204 goto end_ar_command; 16205 } 16206 sqlite3_fileio_init(cmd.db, 0, 0); 16207 sqlite3_sqlar_init(cmd.db, 0, 0); 16208 sqlite3_create_function(cmd.db, "shell_putsnl", 1, SQLITE_UTF8, cmd.p, 16209 shellPutsFunc, 0, 0); 16210 16211 } 16212 if( cmd.zSrcTable==0 && cmd.bZip==0 && cmd.eCmd!=AR_CMD_HELP ){ 16213 if( cmd.eCmd!=AR_CMD_CREATE 16214 && sqlite3_table_column_metadata(cmd.db,0,"sqlar","name",0,0,0,0,0) 16215 ){ 16216 utf8_printf(stderr, "database does not contain an 'sqlar' table\n"); 16217 rc = SQLITE_ERROR; 16218 goto end_ar_command; 16219 } 16220 cmd.zSrcTable = sqlite3_mprintf("sqlar"); 16221 } 16222 16223 switch( cmd.eCmd ){ 16224 case AR_CMD_CREATE: 16225 rc = arCreateOrUpdateCommand(&cmd, 0, 0); 16226 break; 16227 16228 case AR_CMD_EXTRACT: 16229 rc = arExtractCommand(&cmd); 16230 break; 16231 16232 case AR_CMD_LIST: 16233 rc = arListCommand(&cmd); 16234 break; 16235 16236 case AR_CMD_HELP: 16237 arUsage(pState->out); 16238 break; 16239 16240 case AR_CMD_INSERT: 16241 rc = arCreateOrUpdateCommand(&cmd, 1, 0); 16242 break; 16243 16244 default: 16245 assert( cmd.eCmd==AR_CMD_UPDATE ); 16246 rc = arCreateOrUpdateCommand(&cmd, 1, 1); 16247 break; 16248 } 16249 } 16250 end_ar_command: 16251 if( cmd.db!=pState->db ){ 16252 close_db(cmd.db); 16253 } 16254 sqlite3_free(cmd.zSrcTable); 16255 16256 return rc; 16257 } 16258 /* End of the ".archive" or ".ar" command logic 16259 *******************************************************************************/ 16260 #endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) */ 16261 16262 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) 16263 /* 16264 ** If (*pRc) is not SQLITE_OK when this function is called, it is a no-op. 16265 ** Otherwise, the SQL statement or statements in zSql are executed using 16266 ** database connection db and the error code written to *pRc before 16267 ** this function returns. 16268 */ 16269 static void shellExec(sqlite3 *db, int *pRc, const char *zSql){ 16270 int rc = *pRc; 16271 if( rc==SQLITE_OK ){ 16272 char *zErr = 0; 16273 rc = sqlite3_exec(db, zSql, 0, 0, &zErr); 16274 if( rc!=SQLITE_OK ){ 16275 raw_printf(stderr, "SQL error: %s\n", zErr); 16276 } 16277 *pRc = rc; 16278 } 16279 } 16280 16281 /* 16282 ** Like shellExec(), except that zFmt is a printf() style format string. 16283 */ 16284 static void shellExecPrintf(sqlite3 *db, int *pRc, const char *zFmt, ...){ 16285 char *z = 0; 16286 if( *pRc==SQLITE_OK ){ 16287 va_list ap; 16288 va_start(ap, zFmt); 16289 z = sqlite3_vmprintf(zFmt, ap); 16290 va_end(ap); 16291 if( z==0 ){ 16292 *pRc = SQLITE_NOMEM; 16293 }else{ 16294 shellExec(db, pRc, z); 16295 } 16296 sqlite3_free(z); 16297 } 16298 } 16299 16300 /* 16301 ** If *pRc is not SQLITE_OK when this function is called, it is a no-op. 16302 ** Otherwise, an attempt is made to allocate, zero and return a pointer 16303 ** to a buffer nByte bytes in size. If an OOM error occurs, *pRc is set 16304 ** to SQLITE_NOMEM and NULL returned. 16305 */ 16306 static void *shellMalloc(int *pRc, sqlite3_int64 nByte){ 16307 void *pRet = 0; 16308 if( *pRc==SQLITE_OK ){ 16309 pRet = sqlite3_malloc64(nByte); 16310 if( pRet==0 ){ 16311 *pRc = SQLITE_NOMEM; 16312 }else{ 16313 memset(pRet, 0, nByte); 16314 } 16315 } 16316 return pRet; 16317 } 16318 16319 /* 16320 ** If *pRc is not SQLITE_OK when this function is called, it is a no-op. 16321 ** Otherwise, zFmt is treated as a printf() style string. The result of 16322 ** formatting it along with any trailing arguments is written into a 16323 ** buffer obtained from sqlite3_malloc(), and pointer to which is returned. 16324 ** It is the responsibility of the caller to eventually free this buffer 16325 ** using a call to sqlite3_free(). 16326 ** 16327 ** If an OOM error occurs, (*pRc) is set to SQLITE_NOMEM and a NULL 16328 ** pointer returned. 16329 */ 16330 static char *shellMPrintf(int *pRc, const char *zFmt, ...){ 16331 char *z = 0; 16332 if( *pRc==SQLITE_OK ){ 16333 va_list ap; 16334 va_start(ap, zFmt); 16335 z = sqlite3_vmprintf(zFmt, ap); 16336 va_end(ap); 16337 if( z==0 ){ 16338 *pRc = SQLITE_NOMEM; 16339 } 16340 } 16341 return z; 16342 } 16343 16344 /* 16345 ** When running the ".recover" command, each output table, and the special 16346 ** orphaned row table if it is required, is represented by an instance 16347 ** of the following struct. 16348 */ 16349 typedef struct RecoverTable RecoverTable; 16350 struct RecoverTable { 16351 char *zQuoted; /* Quoted version of table name */ 16352 int nCol; /* Number of columns in table */ 16353 char **azlCol; /* Array of column lists */ 16354 int iPk; /* Index of IPK column */ 16355 }; 16356 16357 /* 16358 ** Free a RecoverTable object allocated by recoverFindTable() or 16359 ** recoverOrphanTable(). 16360 */ 16361 static void recoverFreeTable(RecoverTable *pTab){ 16362 if( pTab ){ 16363 sqlite3_free(pTab->zQuoted); 16364 if( pTab->azlCol ){ 16365 int i; 16366 for(i=0; i<=pTab->nCol; i++){ 16367 sqlite3_free(pTab->azlCol[i]); 16368 } 16369 sqlite3_free(pTab->azlCol); 16370 } 16371 sqlite3_free(pTab); 16372 } 16373 } 16374 16375 /* 16376 ** This function is a no-op if (*pRc) is not SQLITE_OK when it is called. 16377 ** Otherwise, it allocates and returns a RecoverTable object based on the 16378 ** final four arguments passed to this function. It is the responsibility 16379 ** of the caller to eventually free the returned object using 16380 ** recoverFreeTable(). 16381 */ 16382 static RecoverTable *recoverNewTable( 16383 int *pRc, /* IN/OUT: Error code */ 16384 const char *zName, /* Name of table */ 16385 const char *zSql, /* CREATE TABLE statement */ 16386 int bIntkey, 16387 int nCol 16388 ){ 16389 sqlite3 *dbtmp = 0; /* sqlite3 handle for testing CREATE TABLE */ 16390 int rc = *pRc; 16391 RecoverTable *pTab = 0; 16392 16393 pTab = (RecoverTable*)shellMalloc(&rc, sizeof(RecoverTable)); 16394 if( rc==SQLITE_OK ){ 16395 int nSqlCol = 0; 16396 int bSqlIntkey = 0; 16397 sqlite3_stmt *pStmt = 0; 16398 16399 rc = sqlite3_open("", &dbtmp); 16400 if( rc==SQLITE_OK ){ 16401 sqlite3_create_function(dbtmp, "shell_idquote", 1, SQLITE_UTF8, 0, 16402 shellIdQuote, 0, 0); 16403 } 16404 if( rc==SQLITE_OK ){ 16405 rc = sqlite3_exec(dbtmp, "PRAGMA writable_schema = on", 0, 0, 0); 16406 } 16407 if( rc==SQLITE_OK ){ 16408 rc = sqlite3_exec(dbtmp, zSql, 0, 0, 0); 16409 if( rc==SQLITE_ERROR ){ 16410 rc = SQLITE_OK; 16411 goto finished; 16412 } 16413 } 16414 shellPreparePrintf(dbtmp, &rc, &pStmt, 16415 "SELECT count(*) FROM pragma_table_info(%Q)", zName 16416 ); 16417 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ 16418 nSqlCol = sqlite3_column_int(pStmt, 0); 16419 } 16420 shellFinalize(&rc, pStmt); 16421 16422 if( rc!=SQLITE_OK || nSqlCol<nCol ){ 16423 goto finished; 16424 } 16425 16426 shellPreparePrintf(dbtmp, &rc, &pStmt, 16427 "SELECT (" 16428 " SELECT substr(data,1,1)==X'0D' FROM sqlite_dbpage WHERE pgno=rootpage" 16429 ") FROM sqlite_schema WHERE name = %Q", zName 16430 ); 16431 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ 16432 bSqlIntkey = sqlite3_column_int(pStmt, 0); 16433 } 16434 shellFinalize(&rc, pStmt); 16435 16436 if( bIntkey==bSqlIntkey ){ 16437 int i; 16438 const char *zPk = "_rowid_"; 16439 sqlite3_stmt *pPkFinder = 0; 16440 16441 /* If this is an intkey table and there is an INTEGER PRIMARY KEY, 16442 ** set zPk to the name of the PK column, and pTab->iPk to the index 16443 ** of the column, where columns are 0-numbered from left to right. 16444 ** Or, if this is a WITHOUT ROWID table or if there is no IPK column, 16445 ** leave zPk as "_rowid_" and pTab->iPk at -2. */ 16446 pTab->iPk = -2; 16447 if( bIntkey ){ 16448 shellPreparePrintf(dbtmp, &rc, &pPkFinder, 16449 "SELECT cid, name FROM pragma_table_info(%Q) " 16450 " WHERE pk=1 AND type='integer' COLLATE nocase" 16451 " AND NOT EXISTS (SELECT cid FROM pragma_table_info(%Q) WHERE pk=2)" 16452 , zName, zName 16453 ); 16454 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPkFinder) ){ 16455 pTab->iPk = sqlite3_column_int(pPkFinder, 0); 16456 zPk = (const char*)sqlite3_column_text(pPkFinder, 1); 16457 } 16458 } 16459 16460 pTab->zQuoted = shellMPrintf(&rc, "\"%w\"", zName); 16461 pTab->azlCol = (char**)shellMalloc(&rc, sizeof(char*) * (nSqlCol+1)); 16462 pTab->nCol = nSqlCol; 16463 16464 if( bIntkey ){ 16465 pTab->azlCol[0] = shellMPrintf(&rc, "\"%w\"", zPk); 16466 }else{ 16467 pTab->azlCol[0] = shellMPrintf(&rc, ""); 16468 } 16469 i = 1; 16470 shellPreparePrintf(dbtmp, &rc, &pStmt, 16471 "SELECT %Q || group_concat(shell_idquote(name), ', ') " 16472 " FILTER (WHERE cid!=%d) OVER (ORDER BY %s cid) " 16473 "FROM pragma_table_info(%Q)", 16474 bIntkey ? ", " : "", pTab->iPk, 16475 bIntkey ? "" : "(CASE WHEN pk=0 THEN 1000000 ELSE pk END), ", 16476 zName 16477 ); 16478 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ 16479 const char *zText = (const char*)sqlite3_column_text(pStmt, 0); 16480 pTab->azlCol[i] = shellMPrintf(&rc, "%s%s", pTab->azlCol[0], zText); 16481 i++; 16482 } 16483 shellFinalize(&rc, pStmt); 16484 16485 shellFinalize(&rc, pPkFinder); 16486 } 16487 } 16488 16489 finished: 16490 sqlite3_close(dbtmp); 16491 *pRc = rc; 16492 if( rc!=SQLITE_OK || (pTab && pTab->zQuoted==0) ){ 16493 recoverFreeTable(pTab); 16494 pTab = 0; 16495 } 16496 return pTab; 16497 } 16498 16499 /* 16500 ** This function is called to search the schema recovered from the 16501 ** sqlite_schema table of the (possibly) corrupt database as part 16502 ** of a ".recover" command. Specifically, for a table with root page 16503 ** iRoot and at least nCol columns. Additionally, if bIntkey is 0, the 16504 ** table must be a WITHOUT ROWID table, or if non-zero, not one of 16505 ** those. 16506 ** 16507 ** If a table is found, a (RecoverTable*) object is returned. Or, if 16508 ** no such table is found, but bIntkey is false and iRoot is the 16509 ** root page of an index in the recovered schema, then (*pbNoop) is 16510 ** set to true and NULL returned. Or, if there is no such table or 16511 ** index, NULL is returned and (*pbNoop) set to 0, indicating that 16512 ** the caller should write data to the orphans table. 16513 */ 16514 static RecoverTable *recoverFindTable( 16515 ShellState *pState, /* Shell state object */ 16516 int *pRc, /* IN/OUT: Error code */ 16517 int iRoot, /* Root page of table */ 16518 int bIntkey, /* True for an intkey table */ 16519 int nCol, /* Number of columns in table */ 16520 int *pbNoop /* OUT: True if iRoot is root of index */ 16521 ){ 16522 sqlite3_stmt *pStmt = 0; 16523 RecoverTable *pRet = 0; 16524 int bNoop = 0; 16525 const char *zSql = 0; 16526 const char *zName = 0; 16527 16528 /* Search the recovered schema for an object with root page iRoot. */ 16529 shellPreparePrintf(pState->db, pRc, &pStmt, 16530 "SELECT type, name, sql FROM recovery.schema WHERE rootpage=%d", iRoot 16531 ); 16532 while( *pRc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ 16533 const char *zType = (const char*)sqlite3_column_text(pStmt, 0); 16534 if( bIntkey==0 && sqlite3_stricmp(zType, "index")==0 ){ 16535 bNoop = 1; 16536 break; 16537 } 16538 if( sqlite3_stricmp(zType, "table")==0 ){ 16539 zName = (const char*)sqlite3_column_text(pStmt, 1); 16540 zSql = (const char*)sqlite3_column_text(pStmt, 2); 16541 pRet = recoverNewTable(pRc, zName, zSql, bIntkey, nCol); 16542 break; 16543 } 16544 } 16545 16546 shellFinalize(pRc, pStmt); 16547 *pbNoop = bNoop; 16548 return pRet; 16549 } 16550 16551 /* 16552 ** Return a RecoverTable object representing the orphans table. 16553 */ 16554 static RecoverTable *recoverOrphanTable( 16555 ShellState *pState, /* Shell state object */ 16556 int *pRc, /* IN/OUT: Error code */ 16557 const char *zLostAndFound, /* Base name for orphans table */ 16558 int nCol /* Number of user data columns */ 16559 ){ 16560 RecoverTable *pTab = 0; 16561 if( nCol>=0 && *pRc==SQLITE_OK ){ 16562 int i; 16563 16564 /* This block determines the name of the orphan table. The prefered 16565 ** name is zLostAndFound. But if that clashes with another name 16566 ** in the recovered schema, try zLostAndFound_0, zLostAndFound_1 16567 ** and so on until a non-clashing name is found. */ 16568 int iTab = 0; 16569 char *zTab = shellMPrintf(pRc, "%s", zLostAndFound); 16570 sqlite3_stmt *pTest = 0; 16571 shellPrepare(pState->db, pRc, 16572 "SELECT 1 FROM recovery.schema WHERE name=?", &pTest 16573 ); 16574 if( pTest ) sqlite3_bind_text(pTest, 1, zTab, -1, SQLITE_TRANSIENT); 16575 while( *pRc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pTest) ){ 16576 shellReset(pRc, pTest); 16577 sqlite3_free(zTab); 16578 zTab = shellMPrintf(pRc, "%s_%d", zLostAndFound, iTab++); 16579 sqlite3_bind_text(pTest, 1, zTab, -1, SQLITE_TRANSIENT); 16580 } 16581 shellFinalize(pRc, pTest); 16582 16583 pTab = (RecoverTable*)shellMalloc(pRc, sizeof(RecoverTable)); 16584 if( pTab ){ 16585 pTab->zQuoted = shellMPrintf(pRc, "\"%w\"", zTab); 16586 pTab->nCol = nCol; 16587 pTab->iPk = -2; 16588 if( nCol>0 ){ 16589 pTab->azlCol = (char**)shellMalloc(pRc, sizeof(char*) * (nCol+1)); 16590 if( pTab->azlCol ){ 16591 pTab->azlCol[nCol] = shellMPrintf(pRc, ""); 16592 for(i=nCol-1; i>=0; i--){ 16593 pTab->azlCol[i] = shellMPrintf(pRc, "%s, NULL", pTab->azlCol[i+1]); 16594 } 16595 } 16596 } 16597 16598 if( *pRc!=SQLITE_OK ){ 16599 recoverFreeTable(pTab); 16600 pTab = 0; 16601 }else{ 16602 raw_printf(pState->out, 16603 "CREATE TABLE %s(rootpgno INTEGER, " 16604 "pgno INTEGER, nfield INTEGER, id INTEGER", pTab->zQuoted 16605 ); 16606 for(i=0; i<nCol; i++){ 16607 raw_printf(pState->out, ", c%d", i); 16608 } 16609 raw_printf(pState->out, ");\n"); 16610 } 16611 } 16612 sqlite3_free(zTab); 16613 } 16614 return pTab; 16615 } 16616 16617 /* 16618 ** This function is called to recover data from the database. A script 16619 ** to construct a new database containing all recovered data is output 16620 ** on stream pState->out. 16621 */ 16622 static int recoverDatabaseCmd(ShellState *pState, int nArg, char **azArg){ 16623 int rc = SQLITE_OK; 16624 sqlite3_stmt *pLoop = 0; /* Loop through all root pages */ 16625 sqlite3_stmt *pPages = 0; /* Loop through all pages in a group */ 16626 sqlite3_stmt *pCells = 0; /* Loop through all cells in a page */ 16627 const char *zRecoveryDb = ""; /* Name of "recovery" database */ 16628 const char *zLostAndFound = "lost_and_found"; 16629 int i; 16630 int nOrphan = -1; 16631 RecoverTable *pOrphan = 0; 16632 16633 int bFreelist = 1; /* 0 if --freelist-corrupt is specified */ 16634 int bRowids = 1; /* 0 if --no-rowids */ 16635 for(i=1; i<nArg; i++){ 16636 char *z = azArg[i]; 16637 int n; 16638 if( z[0]=='-' && z[1]=='-' ) z++; 16639 n = strlen30(z); 16640 if( n<=17 && memcmp("-freelist-corrupt", z, n)==0 ){ 16641 bFreelist = 0; 16642 }else 16643 if( n<=12 && memcmp("-recovery-db", z, n)==0 && i<(nArg-1) ){ 16644 i++; 16645 zRecoveryDb = azArg[i]; 16646 }else 16647 if( n<=15 && memcmp("-lost-and-found", z, n)==0 && i<(nArg-1) ){ 16648 i++; 16649 zLostAndFound = azArg[i]; 16650 }else 16651 if( n<=10 && memcmp("-no-rowids", z, n)==0 ){ 16652 bRowids = 0; 16653 } 16654 else{ 16655 utf8_printf(stderr, "unexpected option: %s\n", azArg[i]); 16656 showHelp(pState->out, azArg[0]); 16657 return 1; 16658 } 16659 } 16660 16661 shellExecPrintf(pState->db, &rc, 16662 /* Attach an in-memory database named 'recovery'. Create an indexed 16663 ** cache of the sqlite_dbptr virtual table. */ 16664 "PRAGMA writable_schema = on;" 16665 "ATTACH %Q AS recovery;" 16666 "DROP TABLE IF EXISTS recovery.dbptr;" 16667 "DROP TABLE IF EXISTS recovery.freelist;" 16668 "DROP TABLE IF EXISTS recovery.map;" 16669 "DROP TABLE IF EXISTS recovery.schema;" 16670 "CREATE TABLE recovery.freelist(pgno INTEGER PRIMARY KEY);", zRecoveryDb 16671 ); 16672 16673 if( bFreelist ){ 16674 shellExec(pState->db, &rc, 16675 "WITH trunk(pgno) AS (" 16676 " SELECT shell_int32(" 16677 " (SELECT data FROM sqlite_dbpage WHERE pgno=1), 8) AS x " 16678 " WHERE x>0" 16679 " UNION" 16680 " SELECT shell_int32(" 16681 " (SELECT data FROM sqlite_dbpage WHERE pgno=trunk.pgno), 0) AS x " 16682 " FROM trunk WHERE x>0" 16683 ")," 16684 "freelist(data, n, freepgno) AS (" 16685 " SELECT data, min(16384, shell_int32(data, 1)-1), t.pgno " 16686 " FROM trunk t, sqlite_dbpage s WHERE s.pgno=t.pgno" 16687 " UNION ALL" 16688 " SELECT data, n-1, shell_int32(data, 2+n) " 16689 " FROM freelist WHERE n>=0" 16690 ")" 16691 "REPLACE INTO recovery.freelist SELECT freepgno FROM freelist;" 16692 ); 16693 } 16694 16695 /* If this is an auto-vacuum database, add all pointer-map pages to 16696 ** the freelist table. Do this regardless of whether or not 16697 ** --freelist-corrupt was specified. */ 16698 shellExec(pState->db, &rc, 16699 "WITH ptrmap(pgno) AS (" 16700 " SELECT 2 WHERE shell_int32(" 16701 " (SELECT data FROM sqlite_dbpage WHERE pgno=1), 13" 16702 " )" 16703 " UNION ALL " 16704 " SELECT pgno+1+(SELECT page_size FROM pragma_page_size)/5 AS pp " 16705 " FROM ptrmap WHERE pp<=(SELECT page_count FROM pragma_page_count)" 16706 ")" 16707 "REPLACE INTO recovery.freelist SELECT pgno FROM ptrmap" 16708 ); 16709 16710 shellExec(pState->db, &rc, 16711 "CREATE TABLE recovery.dbptr(" 16712 " pgno, child, PRIMARY KEY(child, pgno)" 16713 ") WITHOUT ROWID;" 16714 "INSERT OR IGNORE INTO recovery.dbptr(pgno, child) " 16715 " SELECT * FROM sqlite_dbptr" 16716 " WHERE pgno NOT IN freelist AND child NOT IN freelist;" 16717 16718 /* Delete any pointer to page 1. This ensures that page 1 is considered 16719 ** a root page, regardless of how corrupt the db is. */ 16720 "DELETE FROM recovery.dbptr WHERE child = 1;" 16721 16722 /* Delete all pointers to any pages that have more than one pointer 16723 ** to them. Such pages will be treated as root pages when recovering 16724 ** data. */ 16725 "DELETE FROM recovery.dbptr WHERE child IN (" 16726 " SELECT child FROM recovery.dbptr GROUP BY child HAVING count(*)>1" 16727 ");" 16728 16729 /* Create the "map" table that will (eventually) contain instructions 16730 ** for dealing with each page in the db that contains one or more 16731 ** records. */ 16732 "CREATE TABLE recovery.map(" 16733 "pgno INTEGER PRIMARY KEY, maxlen INT, intkey, root INT" 16734 ");" 16735 16736 /* Populate table [map]. If there are circular loops of pages in the 16737 ** database, the following adds all pages in such a loop to the map 16738 ** as individual root pages. This could be handled better. */ 16739 "WITH pages(i, maxlen) AS (" 16740 " SELECT page_count, (" 16741 " SELECT max(field+1) FROM sqlite_dbdata WHERE pgno=page_count" 16742 " ) FROM pragma_page_count WHERE page_count>0" 16743 " UNION ALL" 16744 " SELECT i-1, (" 16745 " SELECT max(field+1) FROM sqlite_dbdata WHERE pgno=i-1" 16746 " ) FROM pages WHERE i>=2" 16747 ")" 16748 "INSERT INTO recovery.map(pgno, maxlen, intkey, root) " 16749 " SELECT i, maxlen, NULL, (" 16750 " WITH p(orig, pgno, parent) AS (" 16751 " SELECT 0, i, (SELECT pgno FROM recovery.dbptr WHERE child=i)" 16752 " UNION " 16753 " SELECT i, p.parent, " 16754 " (SELECT pgno FROM recovery.dbptr WHERE child=p.parent) FROM p" 16755 " )" 16756 " SELECT pgno FROM p WHERE (parent IS NULL OR pgno = orig)" 16757 ") " 16758 "FROM pages WHERE maxlen IS NOT NULL AND i NOT IN freelist;" 16759 "UPDATE recovery.map AS o SET intkey = (" 16760 " SELECT substr(data, 1, 1)==X'0D' FROM sqlite_dbpage WHERE pgno=o.pgno" 16761 ");" 16762 16763 /* Extract data from page 1 and any linked pages into table 16764 ** recovery.schema. With the same schema as an sqlite_schema table. */ 16765 "CREATE TABLE recovery.schema(type, name, tbl_name, rootpage, sql);" 16766 "INSERT INTO recovery.schema SELECT " 16767 " max(CASE WHEN field=0 THEN value ELSE NULL END)," 16768 " max(CASE WHEN field=1 THEN value ELSE NULL END)," 16769 " max(CASE WHEN field=2 THEN value ELSE NULL END)," 16770 " max(CASE WHEN field=3 THEN value ELSE NULL END)," 16771 " max(CASE WHEN field=4 THEN value ELSE NULL END)" 16772 "FROM sqlite_dbdata WHERE pgno IN (" 16773 " SELECT pgno FROM recovery.map WHERE root=1" 16774 ")" 16775 "GROUP BY pgno, cell;" 16776 "CREATE INDEX recovery.schema_rootpage ON schema(rootpage);" 16777 ); 16778 16779 /* Open a transaction, then print out all non-virtual, non-"sqlite_%" 16780 ** CREATE TABLE statements that extracted from the existing schema. */ 16781 if( rc==SQLITE_OK ){ 16782 sqlite3_stmt *pStmt = 0; 16783 /* ".recover" might output content in an order which causes immediate 16784 ** foreign key constraints to be violated. So disable foreign-key 16785 ** constraint enforcement to prevent problems when running the output 16786 ** script. */ 16787 raw_printf(pState->out, "PRAGMA foreign_keys=OFF;\n"); 16788 raw_printf(pState->out, "BEGIN;\n"); 16789 raw_printf(pState->out, "PRAGMA writable_schema = on;\n"); 16790 shellPrepare(pState->db, &rc, 16791 "SELECT sql FROM recovery.schema " 16792 "WHERE type='table' AND sql LIKE 'create table%'", &pStmt 16793 ); 16794 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ 16795 const char *zCreateTable = (const char*)sqlite3_column_text(pStmt, 0); 16796 raw_printf(pState->out, "CREATE TABLE IF NOT EXISTS %s;\n", 16797 &zCreateTable[12] 16798 ); 16799 } 16800 shellFinalize(&rc, pStmt); 16801 } 16802 16803 /* Figure out if an orphan table will be required. And if so, how many 16804 ** user columns it should contain */ 16805 shellPrepare(pState->db, &rc, 16806 "SELECT coalesce(max(maxlen), -2) FROM recovery.map WHERE root>1" 16807 , &pLoop 16808 ); 16809 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pLoop) ){ 16810 nOrphan = sqlite3_column_int(pLoop, 0); 16811 } 16812 shellFinalize(&rc, pLoop); 16813 pLoop = 0; 16814 16815 shellPrepare(pState->db, &rc, 16816 "SELECT pgno FROM recovery.map WHERE root=?", &pPages 16817 ); 16818 16819 shellPrepare(pState->db, &rc, 16820 "SELECT max(field), group_concat(shell_escape_crnl(quote" 16821 "(case when (? AND field<0) then NULL else value end)" 16822 "), ', ')" 16823 ", min(field) " 16824 "FROM sqlite_dbdata WHERE pgno = ? AND field != ?" 16825 "GROUP BY cell", &pCells 16826 ); 16827 16828 /* Loop through each root page. */ 16829 shellPrepare(pState->db, &rc, 16830 "SELECT root, intkey, max(maxlen) FROM recovery.map" 16831 " WHERE root>1 GROUP BY root, intkey ORDER BY root=(" 16832 " SELECT rootpage FROM recovery.schema WHERE name='sqlite_sequence'" 16833 ")", &pLoop 16834 ); 16835 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pLoop) ){ 16836 int iRoot = sqlite3_column_int(pLoop, 0); 16837 int bIntkey = sqlite3_column_int(pLoop, 1); 16838 int nCol = sqlite3_column_int(pLoop, 2); 16839 int bNoop = 0; 16840 RecoverTable *pTab; 16841 16842 assert( bIntkey==0 || bIntkey==1 ); 16843 pTab = recoverFindTable(pState, &rc, iRoot, bIntkey, nCol, &bNoop); 16844 if( bNoop || rc ) continue; 16845 if( pTab==0 ){ 16846 if( pOrphan==0 ){ 16847 pOrphan = recoverOrphanTable(pState, &rc, zLostAndFound, nOrphan); 16848 } 16849 pTab = pOrphan; 16850 if( pTab==0 ) break; 16851 } 16852 16853 if( 0==sqlite3_stricmp(pTab->zQuoted, "\"sqlite_sequence\"") ){ 16854 raw_printf(pState->out, "DELETE FROM sqlite_sequence;\n"); 16855 } 16856 sqlite3_bind_int(pPages, 1, iRoot); 16857 if( bRowids==0 && pTab->iPk<0 ){ 16858 sqlite3_bind_int(pCells, 1, 1); 16859 }else{ 16860 sqlite3_bind_int(pCells, 1, 0); 16861 } 16862 sqlite3_bind_int(pCells, 3, pTab->iPk); 16863 16864 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPages) ){ 16865 int iPgno = sqlite3_column_int(pPages, 0); 16866 sqlite3_bind_int(pCells, 2, iPgno); 16867 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pCells) ){ 16868 int nField = sqlite3_column_int(pCells, 0); 16869 int iMin = sqlite3_column_int(pCells, 2); 16870 const char *zVal = (const char*)sqlite3_column_text(pCells, 1); 16871 16872 RecoverTable *pTab2 = pTab; 16873 if( pTab!=pOrphan && (iMin<0)!=bIntkey ){ 16874 if( pOrphan==0 ){ 16875 pOrphan = recoverOrphanTable(pState, &rc, zLostAndFound, nOrphan); 16876 } 16877 pTab2 = pOrphan; 16878 if( pTab2==0 ) break; 16879 } 16880 16881 nField = nField+1; 16882 if( pTab2==pOrphan ){ 16883 raw_printf(pState->out, 16884 "INSERT INTO %s VALUES(%d, %d, %d, %s%s%s);\n", 16885 pTab2->zQuoted, iRoot, iPgno, nField, 16886 iMin<0 ? "" : "NULL, ", zVal, pTab2->azlCol[nField] 16887 ); 16888 }else{ 16889 raw_printf(pState->out, "INSERT INTO %s(%s) VALUES( %s );\n", 16890 pTab2->zQuoted, pTab2->azlCol[nField], zVal 16891 ); 16892 } 16893 } 16894 shellReset(&rc, pCells); 16895 } 16896 shellReset(&rc, pPages); 16897 if( pTab!=pOrphan ) recoverFreeTable(pTab); 16898 } 16899 shellFinalize(&rc, pLoop); 16900 shellFinalize(&rc, pPages); 16901 shellFinalize(&rc, pCells); 16902 recoverFreeTable(pOrphan); 16903 16904 /* The rest of the schema */ 16905 if( rc==SQLITE_OK ){ 16906 sqlite3_stmt *pStmt = 0; 16907 shellPrepare(pState->db, &rc, 16908 "SELECT sql, name FROM recovery.schema " 16909 "WHERE sql NOT LIKE 'create table%'", &pStmt 16910 ); 16911 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ 16912 const char *zSql = (const char*)sqlite3_column_text(pStmt, 0); 16913 if( sqlite3_strnicmp(zSql, "create virt", 11)==0 ){ 16914 const char *zName = (const char*)sqlite3_column_text(pStmt, 1); 16915 char *zPrint = shellMPrintf(&rc, 16916 "INSERT INTO sqlite_schema VALUES('table', %Q, %Q, 0, %Q)", 16917 zName, zName, zSql 16918 ); 16919 raw_printf(pState->out, "%s;\n", zPrint); 16920 sqlite3_free(zPrint); 16921 }else{ 16922 raw_printf(pState->out, "%s;\n", zSql); 16923 } 16924 } 16925 shellFinalize(&rc, pStmt); 16926 } 16927 16928 if( rc==SQLITE_OK ){ 16929 raw_printf(pState->out, "PRAGMA writable_schema = off;\n"); 16930 raw_printf(pState->out, "COMMIT;\n"); 16931 } 16932 sqlite3_exec(pState->db, "DETACH recovery", 0, 0, 0); 16933 return rc; 16934 } 16935 #endif /* !(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) */ 16936 16937 16938 /* 16939 ** If an input line begins with "." then invoke this routine to 16940 ** process that line. 16941 ** 16942 ** Return 1 on error, 2 to exit, and 0 otherwise. 16943 */ 16944 static int do_meta_command(char *zLine, ShellState *p){ 16945 int h = 1; 16946 int nArg = 0; 16947 int n, c; 16948 int rc = 0; 16949 char *azArg[52]; 16950 16951 #ifndef SQLITE_OMIT_VIRTUALTABLE 16952 if( p->expert.pExpert ){ 16953 expertFinish(p, 1, 0); 16954 } 16955 #endif 16956 16957 /* Parse the input line into tokens. 16958 */ 16959 while( zLine[h] && nArg<ArraySize(azArg)-1 ){ 16960 while( IsSpace(zLine[h]) ){ h++; } 16961 if( zLine[h]==0 ) break; 16962 if( zLine[h]=='\'' || zLine[h]=='"' ){ 16963 int delim = zLine[h++]; 16964 azArg[nArg++] = &zLine[h]; 16965 while( zLine[h] && zLine[h]!=delim ){ 16966 if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++; 16967 h++; 16968 } 16969 if( zLine[h]==delim ){ 16970 zLine[h++] = 0; 16971 } 16972 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]); 16973 }else{ 16974 azArg[nArg++] = &zLine[h]; 16975 while( zLine[h] && !IsSpace(zLine[h]) ){ h++; } 16976 if( zLine[h] ) zLine[h++] = 0; 16977 resolve_backslashes(azArg[nArg-1]); 16978 } 16979 } 16980 azArg[nArg] = 0; 16981 16982 /* Process the input line. 16983 */ 16984 if( nArg==0 ) return 0; /* no tokens, no error */ 16985 n = strlen30(azArg[0]); 16986 c = azArg[0][0]; 16987 clearTempFile(p); 16988 16989 #ifndef SQLITE_OMIT_AUTHORIZATION 16990 if( c=='a' && strncmp(azArg[0], "auth", n)==0 ){ 16991 if( nArg!=2 ){ 16992 raw_printf(stderr, "Usage: .auth ON|OFF\n"); 16993 rc = 1; 16994 goto meta_command_exit; 16995 } 16996 open_db(p, 0); 16997 if( booleanValue(azArg[1]) ){ 16998 sqlite3_set_authorizer(p->db, shellAuth, p); 16999 }else{ 17000 sqlite3_set_authorizer(p->db, 0, 0); 17001 } 17002 }else 17003 #endif 17004 17005 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) 17006 if( c=='a' && strncmp(azArg[0], "archive", n)==0 ){ 17007 open_db(p, 0); 17008 rc = arDotCommand(p, 0, azArg, nArg); 17009 }else 17010 #endif 17011 17012 if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0) 17013 || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0) 17014 ){ 17015 const char *zDestFile = 0; 17016 const char *zDb = 0; 17017 sqlite3 *pDest; 17018 sqlite3_backup *pBackup; 17019 int j; 17020 int bAsync = 0; 17021 const char *zVfs = 0; 17022 for(j=1; j<nArg; j++){ 17023 const char *z = azArg[j]; 17024 if( z[0]=='-' ){ 17025 if( z[1]=='-' ) z++; 17026 if( strcmp(z, "-append")==0 ){ 17027 zVfs = "apndvfs"; 17028 }else 17029 if( strcmp(z, "-async")==0 ){ 17030 bAsync = 1; 17031 }else 17032 { 17033 utf8_printf(stderr, "unknown option: %s\n", azArg[j]); 17034 return 1; 17035 } 17036 }else if( zDestFile==0 ){ 17037 zDestFile = azArg[j]; 17038 }else if( zDb==0 ){ 17039 zDb = zDestFile; 17040 zDestFile = azArg[j]; 17041 }else{ 17042 raw_printf(stderr, "Usage: .backup ?DB? ?OPTIONS? FILENAME\n"); 17043 return 1; 17044 } 17045 } 17046 if( zDestFile==0 ){ 17047 raw_printf(stderr, "missing FILENAME argument on .backup\n"); 17048 return 1; 17049 } 17050 if( zDb==0 ) zDb = "main"; 17051 rc = sqlite3_open_v2(zDestFile, &pDest, 17052 SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, zVfs); 17053 if( rc!=SQLITE_OK ){ 17054 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zDestFile); 17055 close_db(pDest); 17056 return 1; 17057 } 17058 if( bAsync ){ 17059 sqlite3_exec(pDest, "PRAGMA synchronous=OFF; PRAGMA journal_mode=OFF;", 17060 0, 0, 0); 17061 } 17062 open_db(p, 0); 17063 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb); 17064 if( pBackup==0 ){ 17065 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest)); 17066 close_db(pDest); 17067 return 1; 17068 } 17069 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){} 17070 sqlite3_backup_finish(pBackup); 17071 if( rc==SQLITE_DONE ){ 17072 rc = 0; 17073 }else{ 17074 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest)); 17075 rc = 1; 17076 } 17077 close_db(pDest); 17078 }else 17079 17080 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){ 17081 if( nArg==2 ){ 17082 bail_on_error = booleanValue(azArg[1]); 17083 }else{ 17084 raw_printf(stderr, "Usage: .bail on|off\n"); 17085 rc = 1; 17086 } 17087 }else 17088 17089 if( c=='b' && n>=3 && strncmp(azArg[0], "binary", n)==0 ){ 17090 if( nArg==2 ){ 17091 if( booleanValue(azArg[1]) ){ 17092 setBinaryMode(p->out, 1); 17093 }else{ 17094 setTextMode(p->out, 1); 17095 } 17096 }else{ 17097 raw_printf(stderr, "Usage: .binary on|off\n"); 17098 rc = 1; 17099 } 17100 }else 17101 17102 if( c=='c' && strcmp(azArg[0],"cd")==0 ){ 17103 if( nArg==2 ){ 17104 #if defined(_WIN32) || defined(WIN32) 17105 wchar_t *z = sqlite3_win32_utf8_to_unicode(azArg[1]); 17106 rc = !SetCurrentDirectoryW(z); 17107 sqlite3_free(z); 17108 #else 17109 rc = chdir(azArg[1]); 17110 #endif 17111 if( rc ){ 17112 utf8_printf(stderr, "Cannot change to directory \"%s\"\n", azArg[1]); 17113 rc = 1; 17114 } 17115 }else{ 17116 raw_printf(stderr, "Usage: .cd DIRECTORY\n"); 17117 rc = 1; 17118 } 17119 }else 17120 17121 /* The undocumented ".breakpoint" command causes a call to the no-op 17122 ** routine named test_breakpoint(). 17123 */ 17124 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){ 17125 test_breakpoint(); 17126 }else 17127 17128 if( c=='c' && n>=3 && strncmp(azArg[0], "changes", n)==0 ){ 17129 if( nArg==2 ){ 17130 setOrClearFlag(p, SHFLG_CountChanges, azArg[1]); 17131 }else{ 17132 raw_printf(stderr, "Usage: .changes on|off\n"); 17133 rc = 1; 17134 } 17135 }else 17136 17137 /* Cancel output redirection, if it is currently set (by .testcase) 17138 ** Then read the content of the testcase-out.txt file and compare against 17139 ** azArg[1]. If there are differences, report an error and exit. 17140 */ 17141 if( c=='c' && n>=3 && strncmp(azArg[0], "check", n)==0 ){ 17142 char *zRes = 0; 17143 output_reset(p); 17144 if( nArg!=2 ){ 17145 raw_printf(stderr, "Usage: .check GLOB-PATTERN\n"); 17146 rc = 2; 17147 }else if( (zRes = readFile("testcase-out.txt", 0))==0 ){ 17148 raw_printf(stderr, "Error: cannot read 'testcase-out.txt'\n"); 17149 rc = 2; 17150 }else if( testcase_glob(azArg[1],zRes)==0 ){ 17151 utf8_printf(stderr, 17152 "testcase-%s FAILED\n Expected: [%s]\n Got: [%s]\n", 17153 p->zTestcase, azArg[1], zRes); 17154 rc = 1; 17155 }else{ 17156 utf8_printf(stdout, "testcase-%s ok\n", p->zTestcase); 17157 p->nCheck++; 17158 } 17159 sqlite3_free(zRes); 17160 }else 17161 17162 if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){ 17163 if( nArg==2 ){ 17164 tryToClone(p, azArg[1]); 17165 }else{ 17166 raw_printf(stderr, "Usage: .clone FILENAME\n"); 17167 rc = 1; 17168 } 17169 }else 17170 17171 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){ 17172 ShellState data; 17173 char *zErrMsg = 0; 17174 open_db(p, 0); 17175 memcpy(&data, p, sizeof(data)); 17176 data.showHeader = 0; 17177 data.cMode = data.mode = MODE_List; 17178 sqlite3_snprintf(sizeof(data.colSeparator),data.colSeparator,": "); 17179 data.cnt = 0; 17180 sqlite3_exec(p->db, "SELECT name, file FROM pragma_database_list", 17181 callback, &data, &zErrMsg); 17182 if( zErrMsg ){ 17183 utf8_printf(stderr,"Error: %s\n", zErrMsg); 17184 sqlite3_free(zErrMsg); 17185 rc = 1; 17186 } 17187 }else 17188 17189 if( c=='d' && n>=3 && strncmp(azArg[0], "dbconfig", n)==0 ){ 17190 static const struct DbConfigChoices { 17191 const char *zName; 17192 int op; 17193 } aDbConfig[] = { 17194 { "defensive", SQLITE_DBCONFIG_DEFENSIVE }, 17195 { "dqs_ddl", SQLITE_DBCONFIG_DQS_DDL }, 17196 { "dqs_dml", SQLITE_DBCONFIG_DQS_DML }, 17197 { "enable_fkey", SQLITE_DBCONFIG_ENABLE_FKEY }, 17198 { "enable_qpsg", SQLITE_DBCONFIG_ENABLE_QPSG }, 17199 { "enable_trigger", SQLITE_DBCONFIG_ENABLE_TRIGGER }, 17200 { "enable_view", SQLITE_DBCONFIG_ENABLE_VIEW }, 17201 { "fts3_tokenizer", SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER }, 17202 { "legacy_alter_table", SQLITE_DBCONFIG_LEGACY_ALTER_TABLE }, 17203 { "legacy_file_format", SQLITE_DBCONFIG_LEGACY_FILE_FORMAT }, 17204 { "load_extension", SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION }, 17205 { "no_ckpt_on_close", SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE }, 17206 { "reset_database", SQLITE_DBCONFIG_RESET_DATABASE }, 17207 { "trigger_eqp", SQLITE_DBCONFIG_TRIGGER_EQP }, 17208 { "trusted_schema", SQLITE_DBCONFIG_TRUSTED_SCHEMA }, 17209 { "writable_schema", SQLITE_DBCONFIG_WRITABLE_SCHEMA }, 17210 }; 17211 int ii, v; 17212 open_db(p, 0); 17213 for(ii=0; ii<ArraySize(aDbConfig); ii++){ 17214 if( nArg>1 && strcmp(azArg[1], aDbConfig[ii].zName)!=0 ) continue; 17215 if( nArg>=3 ){ 17216 sqlite3_db_config(p->db, aDbConfig[ii].op, booleanValue(azArg[2]), 0); 17217 } 17218 sqlite3_db_config(p->db, aDbConfig[ii].op, -1, &v); 17219 utf8_printf(p->out, "%19s %s\n", aDbConfig[ii].zName, v ? "on" : "off"); 17220 if( nArg>1 ) break; 17221 } 17222 if( nArg>1 && ii==ArraySize(aDbConfig) ){ 17223 utf8_printf(stderr, "Error: unknown dbconfig \"%s\"\n", azArg[1]); 17224 utf8_printf(stderr, "Enter \".dbconfig\" with no arguments for a list\n"); 17225 } 17226 }else 17227 17228 if( c=='d' && n>=3 && strncmp(azArg[0], "dbinfo", n)==0 ){ 17229 rc = shell_dbinfo_command(p, nArg, azArg); 17230 }else 17231 17232 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) 17233 if( c=='r' && strncmp(azArg[0], "recover", n)==0 ){ 17234 open_db(p, 0); 17235 rc = recoverDatabaseCmd(p, nArg, azArg); 17236 }else 17237 #endif /* !(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) */ 17238 17239 if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){ 17240 char *zLike = 0; 17241 char *zSql; 17242 int i; 17243 int savedShowHeader = p->showHeader; 17244 int savedShellFlags = p->shellFlgs; 17245 ShellClearFlag(p, SHFLG_PreserveRowid|SHFLG_Newlines|SHFLG_Echo); 17246 for(i=1; i<nArg; i++){ 17247 if( azArg[i][0]=='-' ){ 17248 const char *z = azArg[i]+1; 17249 if( z[0]=='-' ) z++; 17250 if( strcmp(z,"preserve-rowids")==0 ){ 17251 #ifdef SQLITE_OMIT_VIRTUALTABLE 17252 raw_printf(stderr, "The --preserve-rowids option is not compatible" 17253 " with SQLITE_OMIT_VIRTUALTABLE\n"); 17254 rc = 1; 17255 sqlite3_free(zLike); 17256 goto meta_command_exit; 17257 #else 17258 ShellSetFlag(p, SHFLG_PreserveRowid); 17259 #endif 17260 }else 17261 if( strcmp(z,"newlines")==0 ){ 17262 ShellSetFlag(p, SHFLG_Newlines); 17263 }else 17264 { 17265 raw_printf(stderr, "Unknown option \"%s\" on \".dump\"\n", azArg[i]); 17266 rc = 1; 17267 sqlite3_free(zLike); 17268 goto meta_command_exit; 17269 } 17270 }else if( zLike ){ 17271 zLike = sqlite3_mprintf("%z OR name LIKE %Q ESCAPE '\\'", 17272 zLike, azArg[i]); 17273 }else{ 17274 zLike = sqlite3_mprintf("name LIKE %Q ESCAPE '\\'", azArg[i]); 17275 } 17276 } 17277 17278 open_db(p, 0); 17279 17280 /* When playing back a "dump", the content might appear in an order 17281 ** which causes immediate foreign key constraints to be violated. 17282 ** So disable foreign-key constraint enforcement to prevent problems. */ 17283 raw_printf(p->out, "PRAGMA foreign_keys=OFF;\n"); 17284 raw_printf(p->out, "BEGIN TRANSACTION;\n"); 17285 p->writableSchema = 0; 17286 p->showHeader = 0; 17287 /* Set writable_schema=ON since doing so forces SQLite to initialize 17288 ** as much of the schema as it can even if the sqlite_schema table is 17289 ** corrupt. */ 17290 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0); 17291 p->nErr = 0; 17292 if( zLike==0 ) zLike = sqlite3_mprintf("true"); 17293 zSql = sqlite3_mprintf( 17294 "SELECT name, type, sql FROM sqlite_schema " 17295 "WHERE (%s) AND type=='table'" 17296 " AND sql NOT NULL" 17297 " ORDER BY tbl_name='sqlite_sequence', rowid", 17298 zLike 17299 ); 17300 run_schema_dump_query(p,zSql); 17301 sqlite3_free(zSql); 17302 zSql = sqlite3_mprintf( 17303 "SELECT sql FROM sqlite_schema " 17304 "WHERE (%s) AND sql NOT NULL" 17305 " AND type IN ('index','trigger','view')", 17306 zLike 17307 ); 17308 run_table_dump_query(p, zSql); 17309 sqlite3_free(zSql); 17310 sqlite3_free(zLike); 17311 if( p->writableSchema ){ 17312 raw_printf(p->out, "PRAGMA writable_schema=OFF;\n"); 17313 p->writableSchema = 0; 17314 } 17315 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0); 17316 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0); 17317 raw_printf(p->out, p->nErr?"ROLLBACK; -- due to errors\n":"COMMIT;\n"); 17318 p->showHeader = savedShowHeader; 17319 p->shellFlgs = savedShellFlags; 17320 }else 17321 17322 if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){ 17323 if( nArg==2 ){ 17324 setOrClearFlag(p, SHFLG_Echo, azArg[1]); 17325 }else{ 17326 raw_printf(stderr, "Usage: .echo on|off\n"); 17327 rc = 1; 17328 } 17329 }else 17330 17331 if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){ 17332 if( nArg==2 ){ 17333 p->autoEQPtest = 0; 17334 if( p->autoEQPtrace ){ 17335 if( p->db ) sqlite3_exec(p->db, "PRAGMA vdbe_trace=OFF;", 0, 0, 0); 17336 p->autoEQPtrace = 0; 17337 } 17338 if( strcmp(azArg[1],"full")==0 ){ 17339 p->autoEQP = AUTOEQP_full; 17340 }else if( strcmp(azArg[1],"trigger")==0 ){ 17341 p->autoEQP = AUTOEQP_trigger; 17342 #ifdef SQLITE_DEBUG 17343 }else if( strcmp(azArg[1],"test")==0 ){ 17344 p->autoEQP = AUTOEQP_on; 17345 p->autoEQPtest = 1; 17346 }else if( strcmp(azArg[1],"trace")==0 ){ 17347 p->autoEQP = AUTOEQP_full; 17348 p->autoEQPtrace = 1; 17349 open_db(p, 0); 17350 sqlite3_exec(p->db, "SELECT name FROM sqlite_schema LIMIT 1", 0, 0, 0); 17351 sqlite3_exec(p->db, "PRAGMA vdbe_trace=ON;", 0, 0, 0); 17352 #endif 17353 }else{ 17354 p->autoEQP = (u8)booleanValue(azArg[1]); 17355 } 17356 }else{ 17357 raw_printf(stderr, "Usage: .eqp off|on|trace|trigger|full\n"); 17358 rc = 1; 17359 } 17360 }else 17361 17362 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){ 17363 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc); 17364 rc = 2; 17365 }else 17366 17367 /* The ".explain" command is automatic now. It is largely pointless. It 17368 ** retained purely for backwards compatibility */ 17369 if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){ 17370 int val = 1; 17371 if( nArg>=2 ){ 17372 if( strcmp(azArg[1],"auto")==0 ){ 17373 val = 99; 17374 }else{ 17375 val = booleanValue(azArg[1]); 17376 } 17377 } 17378 if( val==1 && p->mode!=MODE_Explain ){ 17379 p->normalMode = p->mode; 17380 p->mode = MODE_Explain; 17381 p->autoExplain = 0; 17382 }else if( val==0 ){ 17383 if( p->mode==MODE_Explain ) p->mode = p->normalMode; 17384 p->autoExplain = 0; 17385 }else if( val==99 ){ 17386 if( p->mode==MODE_Explain ) p->mode = p->normalMode; 17387 p->autoExplain = 1; 17388 } 17389 }else 17390 17391 #ifndef SQLITE_OMIT_VIRTUALTABLE 17392 if( c=='e' && strncmp(azArg[0], "expert", n)==0 ){ 17393 open_db(p, 0); 17394 expertDotCommand(p, azArg, nArg); 17395 }else 17396 #endif 17397 17398 if( c=='f' && strncmp(azArg[0], "filectrl", n)==0 ){ 17399 static const struct { 17400 const char *zCtrlName; /* Name of a test-control option */ 17401 int ctrlCode; /* Integer code for that option */ 17402 const char *zUsage; /* Usage notes */ 17403 } aCtrl[] = { 17404 { "size_limit", SQLITE_FCNTL_SIZE_LIMIT, "[LIMIT]" }, 17405 { "chunk_size", SQLITE_FCNTL_CHUNK_SIZE, "SIZE" }, 17406 /* { "win32_av_retry", SQLITE_FCNTL_WIN32_AV_RETRY, "COUNT DELAY" },*/ 17407 { "persist_wal", SQLITE_FCNTL_PERSIST_WAL, "[BOOLEAN]" }, 17408 { "psow", SQLITE_FCNTL_POWERSAFE_OVERWRITE, "[BOOLEAN]" }, 17409 /* { "pragma", SQLITE_FCNTL_PRAGMA, "NAME ARG" },*/ 17410 { "tempfilename", SQLITE_FCNTL_TEMPFILENAME, "" }, 17411 { "has_moved", SQLITE_FCNTL_HAS_MOVED, "" }, 17412 { "lock_timeout", SQLITE_FCNTL_LOCK_TIMEOUT, "MILLISEC" }, 17413 { "reserve_bytes", SQLITE_FCNTL_RESERVE_BYTES, "[N]" }, 17414 }; 17415 int filectrl = -1; 17416 int iCtrl = -1; 17417 sqlite3_int64 iRes = 0; /* Integer result to display if rc2==1 */ 17418 int isOk = 0; /* 0: usage 1: %lld 2: no-result */ 17419 int n2, i; 17420 const char *zCmd = 0; 17421 const char *zSchema = 0; 17422 17423 open_db(p, 0); 17424 zCmd = nArg>=2 ? azArg[1] : "help"; 17425 17426 if( zCmd[0]=='-' 17427 && (strcmp(zCmd,"--schema")==0 || strcmp(zCmd,"-schema")==0) 17428 && nArg>=4 17429 ){ 17430 zSchema = azArg[2]; 17431 for(i=3; i<nArg; i++) azArg[i-2] = azArg[i]; 17432 nArg -= 2; 17433 zCmd = azArg[1]; 17434 } 17435 17436 /* The argument can optionally begin with "-" or "--" */ 17437 if( zCmd[0]=='-' && zCmd[1] ){ 17438 zCmd++; 17439 if( zCmd[0]=='-' && zCmd[1] ) zCmd++; 17440 } 17441 17442 /* --help lists all file-controls */ 17443 if( strcmp(zCmd,"help")==0 ){ 17444 utf8_printf(p->out, "Available file-controls:\n"); 17445 for(i=0; i<ArraySize(aCtrl); i++){ 17446 utf8_printf(p->out, " .filectrl %s %s\n", 17447 aCtrl[i].zCtrlName, aCtrl[i].zUsage); 17448 } 17449 rc = 1; 17450 goto meta_command_exit; 17451 } 17452 17453 /* convert filectrl text option to value. allow any unique prefix 17454 ** of the option name, or a numerical value. */ 17455 n2 = strlen30(zCmd); 17456 for(i=0; i<ArraySize(aCtrl); i++){ 17457 if( strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){ 17458 if( filectrl<0 ){ 17459 filectrl = aCtrl[i].ctrlCode; 17460 iCtrl = i; 17461 }else{ 17462 utf8_printf(stderr, "Error: ambiguous file-control: \"%s\"\n" 17463 "Use \".filectrl --help\" for help\n", zCmd); 17464 rc = 1; 17465 goto meta_command_exit; 17466 } 17467 } 17468 } 17469 if( filectrl<0 ){ 17470 utf8_printf(stderr,"Error: unknown file-control: %s\n" 17471 "Use \".filectrl --help\" for help\n", zCmd); 17472 }else{ 17473 switch(filectrl){ 17474 case SQLITE_FCNTL_SIZE_LIMIT: { 17475 if( nArg!=2 && nArg!=3 ) break; 17476 iRes = nArg==3 ? integerValue(azArg[2]) : -1; 17477 sqlite3_file_control(p->db, zSchema, SQLITE_FCNTL_SIZE_LIMIT, &iRes); 17478 isOk = 1; 17479 break; 17480 } 17481 case SQLITE_FCNTL_LOCK_TIMEOUT: 17482 case SQLITE_FCNTL_CHUNK_SIZE: { 17483 int x; 17484 if( nArg!=3 ) break; 17485 x = (int)integerValue(azArg[2]); 17486 sqlite3_file_control(p->db, zSchema, filectrl, &x); 17487 isOk = 2; 17488 break; 17489 } 17490 case SQLITE_FCNTL_PERSIST_WAL: 17491 case SQLITE_FCNTL_POWERSAFE_OVERWRITE: { 17492 int x; 17493 if( nArg!=2 && nArg!=3 ) break; 17494 x = nArg==3 ? booleanValue(azArg[2]) : -1; 17495 sqlite3_file_control(p->db, zSchema, filectrl, &x); 17496 iRes = x; 17497 isOk = 1; 17498 break; 17499 } 17500 case SQLITE_FCNTL_HAS_MOVED: { 17501 int x; 17502 if( nArg!=2 ) break; 17503 sqlite3_file_control(p->db, zSchema, filectrl, &x); 17504 iRes = x; 17505 isOk = 1; 17506 break; 17507 } 17508 case SQLITE_FCNTL_TEMPFILENAME: { 17509 char *z = 0; 17510 if( nArg!=2 ) break; 17511 sqlite3_file_control(p->db, zSchema, filectrl, &z); 17512 if( z ){ 17513 utf8_printf(p->out, "%s\n", z); 17514 sqlite3_free(z); 17515 } 17516 isOk = 2; 17517 break; 17518 } 17519 case SQLITE_FCNTL_RESERVE_BYTES: { 17520 int x; 17521 if( nArg>=3 ){ 17522 x = atoi(azArg[2]); 17523 sqlite3_file_control(p->db, zSchema, filectrl, &x); 17524 } 17525 x = -1; 17526 sqlite3_file_control(p->db, zSchema, filectrl, &x); 17527 utf8_printf(p->out,"%d\n", x); 17528 isOk = 2; 17529 break; 17530 } 17531 } 17532 } 17533 if( isOk==0 && iCtrl>=0 ){ 17534 utf8_printf(p->out, "Usage: .filectrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage); 17535 rc = 1; 17536 }else if( isOk==1 ){ 17537 char zBuf[100]; 17538 sqlite3_snprintf(sizeof(zBuf), zBuf, "%lld", iRes); 17539 raw_printf(p->out, "%s\n", zBuf); 17540 } 17541 }else 17542 17543 if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){ 17544 ShellState data; 17545 char *zErrMsg = 0; 17546 int doStats = 0; 17547 memcpy(&data, p, sizeof(data)); 17548 data.showHeader = 0; 17549 data.cMode = data.mode = MODE_Semi; 17550 if( nArg==2 && optionMatch(azArg[1], "indent") ){ 17551 data.cMode = data.mode = MODE_Pretty; 17552 nArg = 1; 17553 } 17554 if( nArg!=1 ){ 17555 raw_printf(stderr, "Usage: .fullschema ?--indent?\n"); 17556 rc = 1; 17557 goto meta_command_exit; 17558 } 17559 open_db(p, 0); 17560 rc = sqlite3_exec(p->db, 17561 "SELECT sql FROM" 17562 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x" 17563 " FROM sqlite_schema UNION ALL" 17564 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_schema) " 17565 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' " 17566 "ORDER BY rowid", 17567 callback, &data, &zErrMsg 17568 ); 17569 if( rc==SQLITE_OK ){ 17570 sqlite3_stmt *pStmt; 17571 rc = sqlite3_prepare_v2(p->db, 17572 "SELECT rowid FROM sqlite_schema" 17573 " WHERE name GLOB 'sqlite_stat[134]'", 17574 -1, &pStmt, 0); 17575 doStats = sqlite3_step(pStmt)==SQLITE_ROW; 17576 sqlite3_finalize(pStmt); 17577 } 17578 if( doStats==0 ){ 17579 raw_printf(p->out, "/* No STAT tables available */\n"); 17580 }else{ 17581 raw_printf(p->out, "ANALYZE sqlite_schema;\n"); 17582 sqlite3_exec(p->db, "SELECT 'ANALYZE sqlite_schema'", 17583 callback, &data, &zErrMsg); 17584 data.cMode = data.mode = MODE_Insert; 17585 data.zDestTable = "sqlite_stat1"; 17586 shell_exec(&data, "SELECT * FROM sqlite_stat1", &zErrMsg); 17587 data.zDestTable = "sqlite_stat4"; 17588 shell_exec(&data, "SELECT * FROM sqlite_stat4", &zErrMsg); 17589 raw_printf(p->out, "ANALYZE sqlite_schema;\n"); 17590 } 17591 }else 17592 17593 if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){ 17594 if( nArg==2 ){ 17595 p->showHeader = booleanValue(azArg[1]); 17596 p->shellFlgs |= SHFLG_HeaderSet; 17597 }else{ 17598 raw_printf(stderr, "Usage: .headers on|off\n"); 17599 rc = 1; 17600 } 17601 }else 17602 17603 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){ 17604 if( nArg>=2 ){ 17605 n = showHelp(p->out, azArg[1]); 17606 if( n==0 ){ 17607 utf8_printf(p->out, "Nothing matches '%s'\n", azArg[1]); 17608 } 17609 }else{ 17610 showHelp(p->out, 0); 17611 } 17612 }else 17613 17614 if( c=='i' && strncmp(azArg[0], "import", n)==0 ){ 17615 char *zTable = 0; /* Insert data into this table */ 17616 char *zFile = 0; /* Name of file to extra content from */ 17617 sqlite3_stmt *pStmt = NULL; /* A statement */ 17618 int nCol; /* Number of columns in the table */ 17619 int nByte; /* Number of bytes in an SQL string */ 17620 int i, j; /* Loop counters */ 17621 int needCommit; /* True to COMMIT or ROLLBACK at end */ 17622 int nSep; /* Number of bytes in p->colSeparator[] */ 17623 char *zSql; /* An SQL statement */ 17624 ImportCtx sCtx; /* Reader context */ 17625 char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */ 17626 int eVerbose = 0; /* Larger for more console output */ 17627 int nSkip = 0; /* Initial lines to skip */ 17628 int useOutputMode = 1; /* Use output mode to determine separators */ 17629 17630 memset(&sCtx, 0, sizeof(sCtx)); 17631 if( p->mode==MODE_Ascii ){ 17632 xRead = ascii_read_one_field; 17633 }else{ 17634 xRead = csv_read_one_field; 17635 } 17636 for(i=1; i<nArg; i++){ 17637 char *z = azArg[i]; 17638 if( z[0]=='-' && z[1]=='-' ) z++; 17639 if( z[0]!='-' ){ 17640 if( zFile==0 ){ 17641 zFile = z; 17642 }else if( zTable==0 ){ 17643 zTable = z; 17644 }else{ 17645 utf8_printf(p->out, "ERROR: extra argument: \"%s\". Usage:\n", z); 17646 showHelp(p->out, "import"); 17647 rc = 1; 17648 goto meta_command_exit; 17649 } 17650 }else if( strcmp(z,"-v")==0 ){ 17651 eVerbose++; 17652 }else if( strcmp(z,"-skip")==0 && i<nArg-1 ){ 17653 nSkip = integerValue(azArg[++i]); 17654 }else if( strcmp(z,"-ascii")==0 ){ 17655 sCtx.cColSep = SEP_Unit[0]; 17656 sCtx.cRowSep = SEP_Record[0]; 17657 xRead = ascii_read_one_field; 17658 useOutputMode = 0; 17659 }else if( strcmp(z,"-csv")==0 ){ 17660 sCtx.cColSep = ','; 17661 sCtx.cRowSep = '\n'; 17662 xRead = csv_read_one_field; 17663 useOutputMode = 0; 17664 }else{ 17665 utf8_printf(p->out, "ERROR: unknown option: \"%s\". Usage:\n", z); 17666 showHelp(p->out, "import"); 17667 rc = 1; 17668 goto meta_command_exit; 17669 } 17670 } 17671 if( zTable==0 ){ 17672 utf8_printf(p->out, "ERROR: missing %s argument. Usage:\n", 17673 zFile==0 ? "FILE" : "TABLE"); 17674 showHelp(p->out, "import"); 17675 rc = 1; 17676 goto meta_command_exit; 17677 } 17678 seenInterrupt = 0; 17679 open_db(p, 0); 17680 if( useOutputMode ){ 17681 /* If neither the --csv or --ascii options are specified, then set 17682 ** the column and row separator characters from the output mode. */ 17683 nSep = strlen30(p->colSeparator); 17684 if( nSep==0 ){ 17685 raw_printf(stderr, 17686 "Error: non-null column separator required for import\n"); 17687 rc = 1; 17688 goto meta_command_exit; 17689 } 17690 if( nSep>1 ){ 17691 raw_printf(stderr, 17692 "Error: multi-character column separators not allowed" 17693 " for import\n"); 17694 rc = 1; 17695 goto meta_command_exit; 17696 } 17697 nSep = strlen30(p->rowSeparator); 17698 if( nSep==0 ){ 17699 raw_printf(stderr, 17700 "Error: non-null row separator required for import\n"); 17701 rc = 1; 17702 goto meta_command_exit; 17703 } 17704 if( nSep==2 && p->mode==MODE_Csv && strcmp(p->rowSeparator,SEP_CrLf)==0 ){ 17705 /* When importing CSV (only), if the row separator is set to the 17706 ** default output row separator, change it to the default input 17707 ** row separator. This avoids having to maintain different input 17708 ** and output row separators. */ 17709 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 17710 nSep = strlen30(p->rowSeparator); 17711 } 17712 if( nSep>1 ){ 17713 raw_printf(stderr, "Error: multi-character row separators not allowed" 17714 " for import\n"); 17715 rc = 1; 17716 goto meta_command_exit; 17717 } 17718 sCtx.cColSep = p->colSeparator[0]; 17719 sCtx.cRowSep = p->rowSeparator[0]; 17720 } 17721 sCtx.zFile = zFile; 17722 sCtx.nLine = 1; 17723 if( sCtx.zFile[0]=='|' ){ 17724 #ifdef SQLITE_OMIT_POPEN 17725 raw_printf(stderr, "Error: pipes are not supported in this OS\n"); 17726 rc = 1; 17727 goto meta_command_exit; 17728 #else 17729 sCtx.in = popen(sCtx.zFile+1, "r"); 17730 sCtx.zFile = "<pipe>"; 17731 sCtx.xCloser = pclose; 17732 #endif 17733 }else{ 17734 sCtx.in = fopen(sCtx.zFile, "rb"); 17735 sCtx.xCloser = fclose; 17736 } 17737 if( sCtx.in==0 ){ 17738 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile); 17739 rc = 1; 17740 goto meta_command_exit; 17741 } 17742 if( eVerbose>=2 || (eVerbose>=1 && useOutputMode) ){ 17743 char zSep[2]; 17744 zSep[1] = 0; 17745 zSep[0] = sCtx.cColSep; 17746 utf8_printf(p->out, "Column separator "); 17747 output_c_string(p->out, zSep); 17748 utf8_printf(p->out, ", row separator "); 17749 zSep[0] = sCtx.cRowSep; 17750 output_c_string(p->out, zSep); 17751 utf8_printf(p->out, "\n"); 17752 } 17753 while( (nSkip--)>0 ){ 17754 while( xRead(&sCtx) && sCtx.cTerm==sCtx.cColSep ){} 17755 } 17756 zSql = sqlite3_mprintf("SELECT * FROM %s", zTable); 17757 if( zSql==0 ){ 17758 import_cleanup(&sCtx); 17759 shell_out_of_memory(); 17760 } 17761 nByte = strlen30(zSql); 17762 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 17763 import_append_char(&sCtx, 0); /* To ensure sCtx.z is allocated */ 17764 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){ 17765 char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable); 17766 char cSep = '('; 17767 while( xRead(&sCtx) ){ 17768 zCreate = sqlite3_mprintf("%z%c\n \"%w\" TEXT", zCreate, cSep, sCtx.z); 17769 cSep = ','; 17770 if( sCtx.cTerm!=sCtx.cColSep ) break; 17771 } 17772 if( cSep=='(' ){ 17773 sqlite3_free(zCreate); 17774 import_cleanup(&sCtx); 17775 utf8_printf(stderr,"%s: empty file\n", sCtx.zFile); 17776 rc = 1; 17777 goto meta_command_exit; 17778 } 17779 zCreate = sqlite3_mprintf("%z\n)", zCreate); 17780 if( eVerbose>=1 ){ 17781 utf8_printf(p->out, "%s\n", zCreate); 17782 } 17783 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0); 17784 sqlite3_free(zCreate); 17785 if( rc ){ 17786 utf8_printf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable, 17787 sqlite3_errmsg(p->db)); 17788 import_cleanup(&sCtx); 17789 rc = 1; 17790 goto meta_command_exit; 17791 } 17792 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 17793 } 17794 sqlite3_free(zSql); 17795 if( rc ){ 17796 if (pStmt) sqlite3_finalize(pStmt); 17797 utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db)); 17798 import_cleanup(&sCtx); 17799 rc = 1; 17800 goto meta_command_exit; 17801 } 17802 nCol = sqlite3_column_count(pStmt); 17803 sqlite3_finalize(pStmt); 17804 pStmt = 0; 17805 if( nCol==0 ) return 0; /* no columns, no error */ 17806 zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 ); 17807 if( zSql==0 ){ 17808 import_cleanup(&sCtx); 17809 shell_out_of_memory(); 17810 } 17811 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable); 17812 j = strlen30(zSql); 17813 for(i=1; i<nCol; i++){ 17814 zSql[j++] = ','; 17815 zSql[j++] = '?'; 17816 } 17817 zSql[j++] = ')'; 17818 zSql[j] = 0; 17819 if( eVerbose>=2 ){ 17820 utf8_printf(p->out, "Insert using: %s\n", zSql); 17821 } 17822 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 17823 sqlite3_free(zSql); 17824 if( rc ){ 17825 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); 17826 if (pStmt) sqlite3_finalize(pStmt); 17827 import_cleanup(&sCtx); 17828 rc = 1; 17829 goto meta_command_exit; 17830 } 17831 needCommit = sqlite3_get_autocommit(p->db); 17832 if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0); 17833 do{ 17834 int startLine = sCtx.nLine; 17835 for(i=0; i<nCol; i++){ 17836 char *z = xRead(&sCtx); 17837 /* 17838 ** Did we reach end-of-file before finding any columns? 17839 ** If so, stop instead of NULL filling the remaining columns. 17840 */ 17841 if( z==0 && i==0 ) break; 17842 /* 17843 ** Did we reach end-of-file OR end-of-line before finding any 17844 ** columns in ASCII mode? If so, stop instead of NULL filling 17845 ** the remaining columns. 17846 */ 17847 if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break; 17848 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT); 17849 if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){ 17850 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - " 17851 "filling the rest with NULL\n", 17852 sCtx.zFile, startLine, nCol, i+1); 17853 i += 2; 17854 while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; } 17855 } 17856 } 17857 if( sCtx.cTerm==sCtx.cColSep ){ 17858 do{ 17859 xRead(&sCtx); 17860 i++; 17861 }while( sCtx.cTerm==sCtx.cColSep ); 17862 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - " 17863 "extras ignored\n", 17864 sCtx.zFile, startLine, nCol, i); 17865 } 17866 if( i>=nCol ){ 17867 sqlite3_step(pStmt); 17868 rc = sqlite3_reset(pStmt); 17869 if( rc!=SQLITE_OK ){ 17870 utf8_printf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile, 17871 startLine, sqlite3_errmsg(p->db)); 17872 sCtx.nErr++; 17873 }else{ 17874 sCtx.nRow++; 17875 } 17876 } 17877 }while( sCtx.cTerm!=EOF ); 17878 17879 import_cleanup(&sCtx); 17880 sqlite3_finalize(pStmt); 17881 if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0); 17882 if( eVerbose>0 ){ 17883 utf8_printf(p->out, 17884 "Added %d rows with %d errors using %d lines of input\n", 17885 sCtx.nRow, sCtx.nErr, sCtx.nLine-1); 17886 } 17887 }else 17888 17889 #ifndef SQLITE_UNTESTABLE 17890 if( c=='i' && strncmp(azArg[0], "imposter", n)==0 ){ 17891 char *zSql; 17892 char *zCollist = 0; 17893 sqlite3_stmt *pStmt; 17894 int tnum = 0; 17895 int isWO = 0; /* True if making an imposter of a WITHOUT ROWID table */ 17896 int lenPK = 0; /* Length of the PRIMARY KEY string for isWO tables */ 17897 int i; 17898 if( !(nArg==3 || (nArg==2 && sqlite3_stricmp(azArg[1],"off")==0)) ){ 17899 utf8_printf(stderr, "Usage: .imposter INDEX IMPOSTER\n" 17900 " .imposter off\n"); 17901 /* Also allowed, but not documented: 17902 ** 17903 ** .imposter TABLE IMPOSTER 17904 ** 17905 ** where TABLE is a WITHOUT ROWID table. In that case, the 17906 ** imposter is another WITHOUT ROWID table with the columns in 17907 ** storage order. */ 17908 rc = 1; 17909 goto meta_command_exit; 17910 } 17911 open_db(p, 0); 17912 if( nArg==2 ){ 17913 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 1); 17914 goto meta_command_exit; 17915 } 17916 zSql = sqlite3_mprintf( 17917 "SELECT rootpage, 0 FROM sqlite_schema" 17918 " WHERE name='%q' AND type='index'" 17919 "UNION ALL " 17920 "SELECT rootpage, 1 FROM sqlite_schema" 17921 " WHERE name='%q' AND type='table'" 17922 " AND sql LIKE '%%without%%rowid%%'", 17923 azArg[1], azArg[1] 17924 ); 17925 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 17926 sqlite3_free(zSql); 17927 if( sqlite3_step(pStmt)==SQLITE_ROW ){ 17928 tnum = sqlite3_column_int(pStmt, 0); 17929 isWO = sqlite3_column_int(pStmt, 1); 17930 } 17931 sqlite3_finalize(pStmt); 17932 zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]); 17933 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 17934 sqlite3_free(zSql); 17935 i = 0; 17936 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 17937 char zLabel[20]; 17938 const char *zCol = (const char*)sqlite3_column_text(pStmt,2); 17939 i++; 17940 if( zCol==0 ){ 17941 if( sqlite3_column_int(pStmt,1)==-1 ){ 17942 zCol = "_ROWID_"; 17943 }else{ 17944 sqlite3_snprintf(sizeof(zLabel),zLabel,"expr%d",i); 17945 zCol = zLabel; 17946 } 17947 } 17948 if( isWO && lenPK==0 && sqlite3_column_int(pStmt,5)==0 && zCollist ){ 17949 lenPK = (int)strlen(zCollist); 17950 } 17951 if( zCollist==0 ){ 17952 zCollist = sqlite3_mprintf("\"%w\"", zCol); 17953 }else{ 17954 zCollist = sqlite3_mprintf("%z,\"%w\"", zCollist, zCol); 17955 } 17956 } 17957 sqlite3_finalize(pStmt); 17958 if( i==0 || tnum==0 ){ 17959 utf8_printf(stderr, "no such index: \"%s\"\n", azArg[1]); 17960 rc = 1; 17961 sqlite3_free(zCollist); 17962 goto meta_command_exit; 17963 } 17964 if( lenPK==0 ) lenPK = 100000; 17965 zSql = sqlite3_mprintf( 17966 "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%.*s))WITHOUT ROWID", 17967 azArg[2], zCollist, lenPK, zCollist); 17968 sqlite3_free(zCollist); 17969 rc = sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 1, tnum); 17970 if( rc==SQLITE_OK ){ 17971 rc = sqlite3_exec(p->db, zSql, 0, 0, 0); 17972 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 0); 17973 if( rc ){ 17974 utf8_printf(stderr, "Error in [%s]: %s\n", zSql, sqlite3_errmsg(p->db)); 17975 }else{ 17976 utf8_printf(stdout, "%s;\n", zSql); 17977 raw_printf(stdout, 17978 "WARNING: writing to an imposter table will corrupt the \"%s\" %s!\n", 17979 azArg[1], isWO ? "table" : "index" 17980 ); 17981 } 17982 }else{ 17983 raw_printf(stderr, "SQLITE_TESTCTRL_IMPOSTER returns %d\n", rc); 17984 rc = 1; 17985 } 17986 sqlite3_free(zSql); 17987 }else 17988 #endif /* !defined(SQLITE_OMIT_TEST_CONTROL) */ 17989 17990 #ifdef SQLITE_ENABLE_IOTRACE 17991 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){ 17992 SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...); 17993 if( iotrace && iotrace!=stdout ) fclose(iotrace); 17994 iotrace = 0; 17995 if( nArg<2 ){ 17996 sqlite3IoTrace = 0; 17997 }else if( strcmp(azArg[1], "-")==0 ){ 17998 sqlite3IoTrace = iotracePrintf; 17999 iotrace = stdout; 18000 }else{ 18001 iotrace = fopen(azArg[1], "w"); 18002 if( iotrace==0 ){ 18003 utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]); 18004 sqlite3IoTrace = 0; 18005 rc = 1; 18006 }else{ 18007 sqlite3IoTrace = iotracePrintf; 18008 } 18009 } 18010 }else 18011 #endif 18012 18013 if( c=='l' && n>=5 && strncmp(azArg[0], "limits", n)==0 ){ 18014 static const struct { 18015 const char *zLimitName; /* Name of a limit */ 18016 int limitCode; /* Integer code for that limit */ 18017 } aLimit[] = { 18018 { "length", SQLITE_LIMIT_LENGTH }, 18019 { "sql_length", SQLITE_LIMIT_SQL_LENGTH }, 18020 { "column", SQLITE_LIMIT_COLUMN }, 18021 { "expr_depth", SQLITE_LIMIT_EXPR_DEPTH }, 18022 { "compound_select", SQLITE_LIMIT_COMPOUND_SELECT }, 18023 { "vdbe_op", SQLITE_LIMIT_VDBE_OP }, 18024 { "function_arg", SQLITE_LIMIT_FUNCTION_ARG }, 18025 { "attached", SQLITE_LIMIT_ATTACHED }, 18026 { "like_pattern_length", SQLITE_LIMIT_LIKE_PATTERN_LENGTH }, 18027 { "variable_number", SQLITE_LIMIT_VARIABLE_NUMBER }, 18028 { "trigger_depth", SQLITE_LIMIT_TRIGGER_DEPTH }, 18029 { "worker_threads", SQLITE_LIMIT_WORKER_THREADS }, 18030 }; 18031 int i, n2; 18032 open_db(p, 0); 18033 if( nArg==1 ){ 18034 for(i=0; i<ArraySize(aLimit); i++){ 18035 printf("%20s %d\n", aLimit[i].zLimitName, 18036 sqlite3_limit(p->db, aLimit[i].limitCode, -1)); 18037 } 18038 }else if( nArg>3 ){ 18039 raw_printf(stderr, "Usage: .limit NAME ?NEW-VALUE?\n"); 18040 rc = 1; 18041 goto meta_command_exit; 18042 }else{ 18043 int iLimit = -1; 18044 n2 = strlen30(azArg[1]); 18045 for(i=0; i<ArraySize(aLimit); i++){ 18046 if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){ 18047 if( iLimit<0 ){ 18048 iLimit = i; 18049 }else{ 18050 utf8_printf(stderr, "ambiguous limit: \"%s\"\n", azArg[1]); 18051 rc = 1; 18052 goto meta_command_exit; 18053 } 18054 } 18055 } 18056 if( iLimit<0 ){ 18057 utf8_printf(stderr, "unknown limit: \"%s\"\n" 18058 "enter \".limits\" with no arguments for a list.\n", 18059 azArg[1]); 18060 rc = 1; 18061 goto meta_command_exit; 18062 } 18063 if( nArg==3 ){ 18064 sqlite3_limit(p->db, aLimit[iLimit].limitCode, 18065 (int)integerValue(azArg[2])); 18066 } 18067 printf("%20s %d\n", aLimit[iLimit].zLimitName, 18068 sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1)); 18069 } 18070 }else 18071 18072 if( c=='l' && n>2 && strncmp(azArg[0], "lint", n)==0 ){ 18073 open_db(p, 0); 18074 lintDotCommand(p, azArg, nArg); 18075 }else 18076 18077 #ifndef SQLITE_OMIT_LOAD_EXTENSION 18078 if( c=='l' && strncmp(azArg[0], "load", n)==0 ){ 18079 const char *zFile, *zProc; 18080 char *zErrMsg = 0; 18081 if( nArg<2 ){ 18082 raw_printf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n"); 18083 rc = 1; 18084 goto meta_command_exit; 18085 } 18086 zFile = azArg[1]; 18087 zProc = nArg>=3 ? azArg[2] : 0; 18088 open_db(p, 0); 18089 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg); 18090 if( rc!=SQLITE_OK ){ 18091 utf8_printf(stderr, "Error: %s\n", zErrMsg); 18092 sqlite3_free(zErrMsg); 18093 rc = 1; 18094 } 18095 }else 18096 #endif 18097 18098 if( c=='l' && strncmp(azArg[0], "log", n)==0 ){ 18099 if( nArg!=2 ){ 18100 raw_printf(stderr, "Usage: .log FILENAME\n"); 18101 rc = 1; 18102 }else{ 18103 const char *zFile = azArg[1]; 18104 output_file_close(p->pLog); 18105 p->pLog = output_file_open(zFile, 0); 18106 } 18107 }else 18108 18109 if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){ 18110 const char *zMode = nArg>=2 ? azArg[1] : ""; 18111 int n2 = strlen30(zMode); 18112 int c2 = zMode[0]; 18113 if( c2=='l' && n2>2 && strncmp(azArg[1],"lines",n2)==0 ){ 18114 p->mode = MODE_Line; 18115 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 18116 }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){ 18117 p->mode = MODE_Column; 18118 if( (p->shellFlgs & SHFLG_HeaderSet)==0 ){ 18119 p->showHeader = 1; 18120 } 18121 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 18122 }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){ 18123 p->mode = MODE_List; 18124 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Column); 18125 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 18126 }else if( c2=='h' && strncmp(azArg[1],"html",n2)==0 ){ 18127 p->mode = MODE_Html; 18128 }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){ 18129 p->mode = MODE_Tcl; 18130 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space); 18131 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 18132 }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){ 18133 p->mode = MODE_Csv; 18134 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma); 18135 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf); 18136 }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){ 18137 p->mode = MODE_List; 18138 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab); 18139 }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){ 18140 p->mode = MODE_Insert; 18141 set_table_name(p, nArg>=3 ? azArg[2] : "table"); 18142 }else if( c2=='q' && strncmp(azArg[1],"quote",n2)==0 ){ 18143 p->mode = MODE_Quote; 18144 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma); 18145 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 18146 }else if( c2=='a' && strncmp(azArg[1],"ascii",n2)==0 ){ 18147 p->mode = MODE_Ascii; 18148 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit); 18149 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record); 18150 }else if( c2=='m' && strncmp(azArg[1],"markdown",n2)==0 ){ 18151 p->mode = MODE_Markdown; 18152 }else if( c2=='t' && strncmp(azArg[1],"table",n2)==0 ){ 18153 p->mode = MODE_Table; 18154 }else if( c2=='b' && strncmp(azArg[1],"box",n2)==0 ){ 18155 p->mode = MODE_Box; 18156 }else if( c2=='j' && strncmp(azArg[1],"json",n2)==0 ){ 18157 p->mode = MODE_Json; 18158 }else if( nArg==1 ){ 18159 raw_printf(p->out, "current output mode: %s\n", modeDescr[p->mode]); 18160 }else{ 18161 raw_printf(stderr, "Error: mode should be one of: " 18162 "ascii box column csv html insert json line list markdown " 18163 "quote table tabs tcl\n"); 18164 rc = 1; 18165 } 18166 p->cMode = p->mode; 18167 }else 18168 18169 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){ 18170 if( nArg==2 ){ 18171 sqlite3_snprintf(sizeof(p->nullValue), p->nullValue, 18172 "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]); 18173 }else{ 18174 raw_printf(stderr, "Usage: .nullvalue STRING\n"); 18175 rc = 1; 18176 } 18177 }else 18178 18179 #ifdef SQLITE_DEBUG 18180 if( c=='o' && strcmp(azArg[0],"oom")==0 ){ 18181 int i; 18182 for(i=1; i<nArg; i++){ 18183 const char *z = azArg[i]; 18184 if( z[0]=='-' && z[1]=='-' ) z++; 18185 if( strcmp(z,"-repeat")==0 ){ 18186 if( i==nArg-1 ){ 18187 raw_printf(p->out, "missing argument on \"%s\"\n", azArg[i]); 18188 rc = 1; 18189 }else{ 18190 oomRepeat = (int)integerValue(azArg[++i]); 18191 } 18192 }else if( IsDigit(z[0]) ){ 18193 oomCounter = (int)integerValue(azArg[i]); 18194 }else{ 18195 raw_printf(p->out, "unknown argument: \"%s\"\n", azArg[i]); 18196 raw_printf(p->out, "Usage: .oom [--repeat N] [M]\n"); 18197 rc = 1; 18198 } 18199 } 18200 if( rc==0 ){ 18201 raw_printf(p->out, "oomCounter = %d\n", oomCounter); 18202 raw_printf(p->out, "oomRepeat = %d\n", oomRepeat); 18203 } 18204 }else 18205 #endif /* SQLITE_DEBUG */ 18206 18207 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){ 18208 char *zNewFilename; /* Name of the database file to open */ 18209 int iName = 1; /* Index in azArg[] of the filename */ 18210 int newFlag = 0; /* True to delete file before opening */ 18211 /* Close the existing database */ 18212 session_close_all(p); 18213 close_db(p->db); 18214 p->db = 0; 18215 p->zDbFilename = 0; 18216 sqlite3_free(p->zFreeOnClose); 18217 p->zFreeOnClose = 0; 18218 p->openMode = SHELL_OPEN_UNSPEC; 18219 p->openFlags = 0; 18220 p->szMax = 0; 18221 /* Check for command-line arguments */ 18222 for(iName=1; iName<nArg && azArg[iName][0]=='-'; iName++){ 18223 const char *z = azArg[iName]; 18224 if( optionMatch(z,"new") ){ 18225 newFlag = 1; 18226 #ifdef SQLITE_HAVE_ZLIB 18227 }else if( optionMatch(z, "zip") ){ 18228 p->openMode = SHELL_OPEN_ZIPFILE; 18229 #endif 18230 }else if( optionMatch(z, "append") ){ 18231 p->openMode = SHELL_OPEN_APPENDVFS; 18232 }else if( optionMatch(z, "readonly") ){ 18233 p->openMode = SHELL_OPEN_READONLY; 18234 }else if( optionMatch(z, "nofollow") ){ 18235 p->openFlags |= SQLITE_OPEN_NOFOLLOW; 18236 #ifdef SQLITE_ENABLE_DESERIALIZE 18237 }else if( optionMatch(z, "deserialize") ){ 18238 p->openMode = SHELL_OPEN_DESERIALIZE; 18239 }else if( optionMatch(z, "hexdb") ){ 18240 p->openMode = SHELL_OPEN_HEXDB; 18241 }else if( optionMatch(z, "maxsize") && iName+1<nArg ){ 18242 p->szMax = integerValue(azArg[++iName]); 18243 #endif /* SQLITE_ENABLE_DESERIALIZE */ 18244 }else if( z[0]=='-' ){ 18245 utf8_printf(stderr, "unknown option: %s\n", z); 18246 rc = 1; 18247 goto meta_command_exit; 18248 } 18249 } 18250 /* If a filename is specified, try to open it first */ 18251 zNewFilename = nArg>iName ? sqlite3_mprintf("%s", azArg[iName]) : 0; 18252 if( zNewFilename || p->openMode==SHELL_OPEN_HEXDB ){ 18253 if( newFlag ) shellDeleteFile(zNewFilename); 18254 p->zDbFilename = zNewFilename; 18255 open_db(p, OPEN_DB_KEEPALIVE); 18256 if( p->db==0 ){ 18257 utf8_printf(stderr, "Error: cannot open '%s'\n", zNewFilename); 18258 sqlite3_free(zNewFilename); 18259 }else{ 18260 p->zFreeOnClose = zNewFilename; 18261 } 18262 } 18263 if( p->db==0 ){ 18264 /* As a fall-back open a TEMP database */ 18265 p->zDbFilename = 0; 18266 open_db(p, 0); 18267 } 18268 }else 18269 18270 if( (c=='o' 18271 && (strncmp(azArg[0], "output", n)==0||strncmp(azArg[0], "once", n)==0)) 18272 || (c=='e' && n==5 && strcmp(azArg[0],"excel")==0) 18273 ){ 18274 const char *zFile = 0; 18275 int bTxtMode = 0; 18276 int i; 18277 int eMode = 0; 18278 int bBOM = 0; 18279 int bOnce = 0; /* 0: .output, 1: .once, 2: .excel */ 18280 18281 if( c=='e' ){ 18282 eMode = 'x'; 18283 bOnce = 2; 18284 }else if( strncmp(azArg[0],"once",n)==0 ){ 18285 bOnce = 1; 18286 } 18287 for(i=1; i<nArg; i++){ 18288 char *z = azArg[i]; 18289 if( z[0]=='-' ){ 18290 if( z[1]=='-' ) z++; 18291 if( strcmp(z,"-bom")==0 ){ 18292 bBOM = 1; 18293 }else if( c!='e' && strcmp(z,"-x")==0 ){ 18294 eMode = 'x'; /* spreadsheet */ 18295 }else if( c!='e' && strcmp(z,"-e")==0 ){ 18296 eMode = 'e'; /* text editor */ 18297 }else{ 18298 utf8_printf(p->out, "ERROR: unknown option: \"%s\". Usage:\n", 18299 azArg[i]); 18300 showHelp(p->out, azArg[0]); 18301 rc = 1; 18302 goto meta_command_exit; 18303 } 18304 }else if( zFile==0 ){ 18305 zFile = z; 18306 }else{ 18307 utf8_printf(p->out,"ERROR: extra parameter: \"%s\". Usage:\n", 18308 azArg[i]); 18309 showHelp(p->out, azArg[0]); 18310 rc = 1; 18311 goto meta_command_exit; 18312 } 18313 } 18314 if( zFile==0 ) zFile = "stdout"; 18315 if( bOnce ){ 18316 p->outCount = 2; 18317 }else{ 18318 p->outCount = 0; 18319 } 18320 output_reset(p); 18321 #ifndef SQLITE_NOHAVE_SYSTEM 18322 if( eMode=='e' || eMode=='x' ){ 18323 p->doXdgOpen = 1; 18324 outputModePush(p); 18325 if( eMode=='x' ){ 18326 /* spreadsheet mode. Output as CSV. */ 18327 newTempFile(p, "csv"); 18328 ShellClearFlag(p, SHFLG_Echo); 18329 p->mode = MODE_Csv; 18330 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma); 18331 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf); 18332 }else{ 18333 /* text editor mode */ 18334 newTempFile(p, "txt"); 18335 bTxtMode = 1; 18336 } 18337 zFile = p->zTempFile; 18338 } 18339 #endif /* SQLITE_NOHAVE_SYSTEM */ 18340 if( zFile[0]=='|' ){ 18341 #ifdef SQLITE_OMIT_POPEN 18342 raw_printf(stderr, "Error: pipes are not supported in this OS\n"); 18343 rc = 1; 18344 p->out = stdout; 18345 #else 18346 p->out = popen(zFile + 1, "w"); 18347 if( p->out==0 ){ 18348 utf8_printf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1); 18349 p->out = stdout; 18350 rc = 1; 18351 }else{ 18352 if( bBOM ) fprintf(p->out,"\357\273\277"); 18353 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile); 18354 } 18355 #endif 18356 }else{ 18357 p->out = output_file_open(zFile, bTxtMode); 18358 if( p->out==0 ){ 18359 if( strcmp(zFile,"off")!=0 ){ 18360 utf8_printf(stderr,"Error: cannot write to \"%s\"\n", zFile); 18361 } 18362 p->out = stdout; 18363 rc = 1; 18364 } else { 18365 if( bBOM ) fprintf(p->out,"\357\273\277"); 18366 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile); 18367 } 18368 } 18369 }else 18370 18371 if( c=='p' && n>=3 && strncmp(azArg[0], "parameter", n)==0 ){ 18372 open_db(p,0); 18373 if( nArg<=1 ) goto parameter_syntax_error; 18374 18375 /* .parameter clear 18376 ** Clear all bind parameters by dropping the TEMP table that holds them. 18377 */ 18378 if( nArg==2 && strcmp(azArg[1],"clear")==0 ){ 18379 sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp.sqlite_parameters;", 18380 0, 0, 0); 18381 }else 18382 18383 /* .parameter list 18384 ** List all bind parameters. 18385 */ 18386 if( nArg==2 && strcmp(azArg[1],"list")==0 ){ 18387 sqlite3_stmt *pStmt = 0; 18388 int rx; 18389 int len = 0; 18390 rx = sqlite3_prepare_v2(p->db, 18391 "SELECT max(length(key)) " 18392 "FROM temp.sqlite_parameters;", -1, &pStmt, 0); 18393 if( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){ 18394 len = sqlite3_column_int(pStmt, 0); 18395 if( len>40 ) len = 40; 18396 } 18397 sqlite3_finalize(pStmt); 18398 pStmt = 0; 18399 if( len ){ 18400 rx = sqlite3_prepare_v2(p->db, 18401 "SELECT key, quote(value) " 18402 "FROM temp.sqlite_parameters;", -1, &pStmt, 0); 18403 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 18404 utf8_printf(p->out, "%-*s %s\n", len, sqlite3_column_text(pStmt,0), 18405 sqlite3_column_text(pStmt,1)); 18406 } 18407 sqlite3_finalize(pStmt); 18408 } 18409 }else 18410 18411 /* .parameter init 18412 ** Make sure the TEMP table used to hold bind parameters exists. 18413 ** Create it if necessary. 18414 */ 18415 if( nArg==2 && strcmp(azArg[1],"init")==0 ){ 18416 bind_table_init(p); 18417 }else 18418 18419 /* .parameter set NAME VALUE 18420 ** Set or reset a bind parameter. NAME should be the full parameter 18421 ** name exactly as it appears in the query. (ex: $abc, @def). The 18422 ** VALUE can be in either SQL literal notation, or if not it will be 18423 ** understood to be a text string. 18424 */ 18425 if( nArg==4 && strcmp(azArg[1],"set")==0 ){ 18426 int rx; 18427 char *zSql; 18428 sqlite3_stmt *pStmt; 18429 const char *zKey = azArg[2]; 18430 const char *zValue = azArg[3]; 18431 bind_table_init(p); 18432 zSql = sqlite3_mprintf( 18433 "REPLACE INTO temp.sqlite_parameters(key,value)" 18434 "VALUES(%Q,%s);", zKey, zValue); 18435 if( zSql==0 ) shell_out_of_memory(); 18436 pStmt = 0; 18437 rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 18438 sqlite3_free(zSql); 18439 if( rx!=SQLITE_OK ){ 18440 sqlite3_finalize(pStmt); 18441 pStmt = 0; 18442 zSql = sqlite3_mprintf( 18443 "REPLACE INTO temp.sqlite_parameters(key,value)" 18444 "VALUES(%Q,%Q);", zKey, zValue); 18445 if( zSql==0 ) shell_out_of_memory(); 18446 rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 18447 sqlite3_free(zSql); 18448 if( rx!=SQLITE_OK ){ 18449 utf8_printf(p->out, "Error: %s\n", sqlite3_errmsg(p->db)); 18450 sqlite3_finalize(pStmt); 18451 pStmt = 0; 18452 rc = 1; 18453 } 18454 } 18455 sqlite3_step(pStmt); 18456 sqlite3_finalize(pStmt); 18457 }else 18458 18459 /* .parameter unset NAME 18460 ** Remove the NAME binding from the parameter binding table, if it 18461 ** exists. 18462 */ 18463 if( nArg==3 && strcmp(azArg[1],"unset")==0 ){ 18464 char *zSql = sqlite3_mprintf( 18465 "DELETE FROM temp.sqlite_parameters WHERE key=%Q", azArg[2]); 18466 if( zSql==0 ) shell_out_of_memory(); 18467 sqlite3_exec(p->db, zSql, 0, 0, 0); 18468 sqlite3_free(zSql); 18469 }else 18470 /* If no command name matches, show a syntax error */ 18471 parameter_syntax_error: 18472 showHelp(p->out, "parameter"); 18473 }else 18474 18475 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){ 18476 int i; 18477 for(i=1; i<nArg; i++){ 18478 if( i>1 ) raw_printf(p->out, " "); 18479 utf8_printf(p->out, "%s", azArg[i]); 18480 } 18481 raw_printf(p->out, "\n"); 18482 }else 18483 18484 #ifndef SQLITE_OMIT_PROGRESS_CALLBACK 18485 if( c=='p' && n>=3 && strncmp(azArg[0], "progress", n)==0 ){ 18486 int i; 18487 int nn = 0; 18488 p->flgProgress = 0; 18489 p->mxProgress = 0; 18490 p->nProgress = 0; 18491 for(i=1; i<nArg; i++){ 18492 const char *z = azArg[i]; 18493 if( z[0]=='-' ){ 18494 z++; 18495 if( z[0]=='-' ) z++; 18496 if( strcmp(z,"quiet")==0 || strcmp(z,"q")==0 ){ 18497 p->flgProgress |= SHELL_PROGRESS_QUIET; 18498 continue; 18499 } 18500 if( strcmp(z,"reset")==0 ){ 18501 p->flgProgress |= SHELL_PROGRESS_RESET; 18502 continue; 18503 } 18504 if( strcmp(z,"once")==0 ){ 18505 p->flgProgress |= SHELL_PROGRESS_ONCE; 18506 continue; 18507 } 18508 if( strcmp(z,"limit")==0 ){ 18509 if( i+1>=nArg ){ 18510 utf8_printf(stderr, "Error: missing argument on --limit\n"); 18511 rc = 1; 18512 goto meta_command_exit; 18513 }else{ 18514 p->mxProgress = (int)integerValue(azArg[++i]); 18515 } 18516 continue; 18517 } 18518 utf8_printf(stderr, "Error: unknown option: \"%s\"\n", azArg[i]); 18519 rc = 1; 18520 goto meta_command_exit; 18521 }else{ 18522 nn = (int)integerValue(z); 18523 } 18524 } 18525 open_db(p, 0); 18526 sqlite3_progress_handler(p->db, nn, progress_handler, p); 18527 }else 18528 #endif /* SQLITE_OMIT_PROGRESS_CALLBACK */ 18529 18530 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){ 18531 if( nArg >= 2) { 18532 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1); 18533 } 18534 if( nArg >= 3) { 18535 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1); 18536 } 18537 }else 18538 18539 if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){ 18540 rc = 2; 18541 }else 18542 18543 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){ 18544 FILE *inSaved = p->in; 18545 int savedLineno = p->lineno; 18546 if( nArg!=2 ){ 18547 raw_printf(stderr, "Usage: .read FILE\n"); 18548 rc = 1; 18549 goto meta_command_exit; 18550 } 18551 if( notNormalFile(azArg[1]) 18552 || (p->in = fopen(azArg[1], "rb"))==0 18553 ){ 18554 utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]); 18555 rc = 1; 18556 }else{ 18557 rc = process_input(p); 18558 fclose(p->in); 18559 } 18560 p->in = inSaved; 18561 p->lineno = savedLineno; 18562 }else 18563 18564 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){ 18565 const char *zSrcFile; 18566 const char *zDb; 18567 sqlite3 *pSrc; 18568 sqlite3_backup *pBackup; 18569 int nTimeout = 0; 18570 18571 if( nArg==2 ){ 18572 zSrcFile = azArg[1]; 18573 zDb = "main"; 18574 }else if( nArg==3 ){ 18575 zSrcFile = azArg[2]; 18576 zDb = azArg[1]; 18577 }else{ 18578 raw_printf(stderr, "Usage: .restore ?DB? FILE\n"); 18579 rc = 1; 18580 goto meta_command_exit; 18581 } 18582 rc = sqlite3_open(zSrcFile, &pSrc); 18583 if( rc!=SQLITE_OK ){ 18584 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zSrcFile); 18585 close_db(pSrc); 18586 return 1; 18587 } 18588 open_db(p, 0); 18589 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main"); 18590 if( pBackup==0 ){ 18591 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); 18592 close_db(pSrc); 18593 return 1; 18594 } 18595 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK 18596 || rc==SQLITE_BUSY ){ 18597 if( rc==SQLITE_BUSY ){ 18598 if( nTimeout++ >= 3 ) break; 18599 sqlite3_sleep(100); 18600 } 18601 } 18602 sqlite3_backup_finish(pBackup); 18603 if( rc==SQLITE_DONE ){ 18604 rc = 0; 18605 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){ 18606 raw_printf(stderr, "Error: source database is busy\n"); 18607 rc = 1; 18608 }else{ 18609 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); 18610 rc = 1; 18611 } 18612 close_db(pSrc); 18613 }else 18614 18615 if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){ 18616 if( nArg==2 ){ 18617 p->scanstatsOn = (u8)booleanValue(azArg[1]); 18618 #ifndef SQLITE_ENABLE_STMT_SCANSTATUS 18619 raw_printf(stderr, "Warning: .scanstats not available in this build.\n"); 18620 #endif 18621 }else{ 18622 raw_printf(stderr, "Usage: .scanstats on|off\n"); 18623 rc = 1; 18624 } 18625 }else 18626 18627 if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){ 18628 ShellText sSelect; 18629 ShellState data; 18630 char *zErrMsg = 0; 18631 const char *zDiv = "("; 18632 const char *zName = 0; 18633 int iSchema = 0; 18634 int bDebug = 0; 18635 int ii; 18636 18637 open_db(p, 0); 18638 memcpy(&data, p, sizeof(data)); 18639 data.showHeader = 0; 18640 data.cMode = data.mode = MODE_Semi; 18641 initText(&sSelect); 18642 for(ii=1; ii<nArg; ii++){ 18643 if( optionMatch(azArg[ii],"indent") ){ 18644 data.cMode = data.mode = MODE_Pretty; 18645 }else if( optionMatch(azArg[ii],"debug") ){ 18646 bDebug = 1; 18647 }else if( zName==0 ){ 18648 zName = azArg[ii]; 18649 }else{ 18650 raw_printf(stderr, "Usage: .schema ?--indent? ?LIKE-PATTERN?\n"); 18651 rc = 1; 18652 goto meta_command_exit; 18653 } 18654 } 18655 if( zName!=0 ){ 18656 int isSchema = sqlite3_strlike(zName, "sqlite_master", '\\')==0 18657 || sqlite3_strlike(zName, "sqlite_schema", '\\')==0 18658 || sqlite3_strlike(zName,"sqlite_temp_master", '\\')==0 18659 || sqlite3_strlike(zName,"sqlite_temp_schema", '\\')==0; 18660 if( isSchema ){ 18661 char *new_argv[2], *new_colv[2]; 18662 new_argv[0] = sqlite3_mprintf( 18663 "CREATE TABLE %s (\n" 18664 " type text,\n" 18665 " name text,\n" 18666 " tbl_name text,\n" 18667 " rootpage integer,\n" 18668 " sql text\n" 18669 ")", zName); 18670 new_argv[1] = 0; 18671 new_colv[0] = "sql"; 18672 new_colv[1] = 0; 18673 callback(&data, 1, new_argv, new_colv); 18674 sqlite3_free(new_argv[0]); 18675 } 18676 } 18677 if( zDiv ){ 18678 sqlite3_stmt *pStmt = 0; 18679 rc = sqlite3_prepare_v2(p->db, "SELECT name FROM pragma_database_list", 18680 -1, &pStmt, 0); 18681 if( rc ){ 18682 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); 18683 sqlite3_finalize(pStmt); 18684 rc = 1; 18685 goto meta_command_exit; 18686 } 18687 appendText(&sSelect, "SELECT sql FROM", 0); 18688 iSchema = 0; 18689 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 18690 const char *zDb = (const char*)sqlite3_column_text(pStmt, 0); 18691 char zScNum[30]; 18692 sqlite3_snprintf(sizeof(zScNum), zScNum, "%d", ++iSchema); 18693 appendText(&sSelect, zDiv, 0); 18694 zDiv = " UNION ALL "; 18695 appendText(&sSelect, "SELECT shell_add_schema(sql,", 0); 18696 if( sqlite3_stricmp(zDb, "main")!=0 ){ 18697 appendText(&sSelect, zDb, '\''); 18698 }else{ 18699 appendText(&sSelect, "NULL", 0); 18700 } 18701 appendText(&sSelect, ",name) AS sql, type, tbl_name, name, rowid,", 0); 18702 appendText(&sSelect, zScNum, 0); 18703 appendText(&sSelect, " AS snum, ", 0); 18704 appendText(&sSelect, zDb, '\''); 18705 appendText(&sSelect, " AS sname FROM ", 0); 18706 appendText(&sSelect, zDb, quoteChar(zDb)); 18707 appendText(&sSelect, ".sqlite_schema", 0); 18708 } 18709 sqlite3_finalize(pStmt); 18710 #ifndef SQLITE_OMIT_INTROSPECTION_PRAGMAS 18711 if( zName ){ 18712 appendText(&sSelect, 18713 " UNION ALL SELECT shell_module_schema(name)," 18714 " 'table', name, name, name, 9e+99, 'main' FROM pragma_module_list", 18715 0); 18716 } 18717 #endif 18718 appendText(&sSelect, ") WHERE ", 0); 18719 if( zName ){ 18720 char *zQarg = sqlite3_mprintf("%Q", zName); 18721 int bGlob = strchr(zName, '*') != 0 || strchr(zName, '?') != 0 || 18722 strchr(zName, '[') != 0; 18723 if( strchr(zName, '.') ){ 18724 appendText(&sSelect, "lower(printf('%s.%s',sname,tbl_name))", 0); 18725 }else{ 18726 appendText(&sSelect, "lower(tbl_name)", 0); 18727 } 18728 appendText(&sSelect, bGlob ? " GLOB " : " LIKE ", 0); 18729 appendText(&sSelect, zQarg, 0); 18730 if( !bGlob ){ 18731 appendText(&sSelect, " ESCAPE '\\' ", 0); 18732 } 18733 appendText(&sSelect, " AND ", 0); 18734 sqlite3_free(zQarg); 18735 } 18736 appendText(&sSelect, "type!='meta' AND sql IS NOT NULL" 18737 " ORDER BY snum, rowid", 0); 18738 if( bDebug ){ 18739 utf8_printf(p->out, "SQL: %s;\n", sSelect.z); 18740 }else{ 18741 rc = sqlite3_exec(p->db, sSelect.z, callback, &data, &zErrMsg); 18742 } 18743 freeText(&sSelect); 18744 } 18745 if( zErrMsg ){ 18746 utf8_printf(stderr,"Error: %s\n", zErrMsg); 18747 sqlite3_free(zErrMsg); 18748 rc = 1; 18749 }else if( rc != SQLITE_OK ){ 18750 raw_printf(stderr,"Error: querying schema information\n"); 18751 rc = 1; 18752 }else{ 18753 rc = 0; 18754 } 18755 }else 18756 18757 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE) 18758 if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){ 18759 sqlite3_unsupported_selecttrace = nArg>=2 ? (int)integerValue(azArg[1]) : 0xffff; 18760 }else 18761 #endif 18762 18763 #if defined(SQLITE_ENABLE_SESSION) 18764 if( c=='s' && strncmp(azArg[0],"session",n)==0 && n>=3 ){ 18765 OpenSession *pSession = &p->aSession[0]; 18766 char **azCmd = &azArg[1]; 18767 int iSes = 0; 18768 int nCmd = nArg - 1; 18769 int i; 18770 if( nArg<=1 ) goto session_syntax_error; 18771 open_db(p, 0); 18772 if( nArg>=3 ){ 18773 for(iSes=0; iSes<p->nSession; iSes++){ 18774 if( strcmp(p->aSession[iSes].zName, azArg[1])==0 ) break; 18775 } 18776 if( iSes<p->nSession ){ 18777 pSession = &p->aSession[iSes]; 18778 azCmd++; 18779 nCmd--; 18780 }else{ 18781 pSession = &p->aSession[0]; 18782 iSes = 0; 18783 } 18784 } 18785 18786 /* .session attach TABLE 18787 ** Invoke the sqlite3session_attach() interface to attach a particular 18788 ** table so that it is never filtered. 18789 */ 18790 if( strcmp(azCmd[0],"attach")==0 ){ 18791 if( nCmd!=2 ) goto session_syntax_error; 18792 if( pSession->p==0 ){ 18793 session_not_open: 18794 raw_printf(stderr, "ERROR: No sessions are open\n"); 18795 }else{ 18796 rc = sqlite3session_attach(pSession->p, azCmd[1]); 18797 if( rc ){ 18798 raw_printf(stderr, "ERROR: sqlite3session_attach() returns %d\n", rc); 18799 rc = 0; 18800 } 18801 } 18802 }else 18803 18804 /* .session changeset FILE 18805 ** .session patchset FILE 18806 ** Write a changeset or patchset into a file. The file is overwritten. 18807 */ 18808 if( strcmp(azCmd[0],"changeset")==0 || strcmp(azCmd[0],"patchset")==0 ){ 18809 FILE *out = 0; 18810 if( nCmd!=2 ) goto session_syntax_error; 18811 if( pSession->p==0 ) goto session_not_open; 18812 out = fopen(azCmd[1], "wb"); 18813 if( out==0 ){ 18814 utf8_printf(stderr, "ERROR: cannot open \"%s\" for writing\n", 18815 azCmd[1]); 18816 }else{ 18817 int szChng; 18818 void *pChng; 18819 if( azCmd[0][0]=='c' ){ 18820 rc = sqlite3session_changeset(pSession->p, &szChng, &pChng); 18821 }else{ 18822 rc = sqlite3session_patchset(pSession->p, &szChng, &pChng); 18823 } 18824 if( rc ){ 18825 printf("Error: error code %d\n", rc); 18826 rc = 0; 18827 } 18828 if( pChng 18829 && fwrite(pChng, szChng, 1, out)!=1 ){ 18830 raw_printf(stderr, "ERROR: Failed to write entire %d-byte output\n", 18831 szChng); 18832 } 18833 sqlite3_free(pChng); 18834 fclose(out); 18835 } 18836 }else 18837 18838 /* .session close 18839 ** Close the identified session 18840 */ 18841 if( strcmp(azCmd[0], "close")==0 ){ 18842 if( nCmd!=1 ) goto session_syntax_error; 18843 if( p->nSession ){ 18844 session_close(pSession); 18845 p->aSession[iSes] = p->aSession[--p->nSession]; 18846 } 18847 }else 18848 18849 /* .session enable ?BOOLEAN? 18850 ** Query or set the enable flag 18851 */ 18852 if( strcmp(azCmd[0], "enable")==0 ){ 18853 int ii; 18854 if( nCmd>2 ) goto session_syntax_error; 18855 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]); 18856 if( p->nSession ){ 18857 ii = sqlite3session_enable(pSession->p, ii); 18858 utf8_printf(p->out, "session %s enable flag = %d\n", 18859 pSession->zName, ii); 18860 } 18861 }else 18862 18863 /* .session filter GLOB .... 18864 ** Set a list of GLOB patterns of table names to be excluded. 18865 */ 18866 if( strcmp(azCmd[0], "filter")==0 ){ 18867 int ii, nByte; 18868 if( nCmd<2 ) goto session_syntax_error; 18869 if( p->nSession ){ 18870 for(ii=0; ii<pSession->nFilter; ii++){ 18871 sqlite3_free(pSession->azFilter[ii]); 18872 } 18873 sqlite3_free(pSession->azFilter); 18874 nByte = sizeof(pSession->azFilter[0])*(nCmd-1); 18875 pSession->azFilter = sqlite3_malloc( nByte ); 18876 if( pSession->azFilter==0 ){ 18877 raw_printf(stderr, "Error: out or memory\n"); 18878 exit(1); 18879 } 18880 for(ii=1; ii<nCmd; ii++){ 18881 pSession->azFilter[ii-1] = sqlite3_mprintf("%s", azCmd[ii]); 18882 } 18883 pSession->nFilter = ii-1; 18884 } 18885 }else 18886 18887 /* .session indirect ?BOOLEAN? 18888 ** Query or set the indirect flag 18889 */ 18890 if( strcmp(azCmd[0], "indirect")==0 ){ 18891 int ii; 18892 if( nCmd>2 ) goto session_syntax_error; 18893 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]); 18894 if( p->nSession ){ 18895 ii = sqlite3session_indirect(pSession->p, ii); 18896 utf8_printf(p->out, "session %s indirect flag = %d\n", 18897 pSession->zName, ii); 18898 } 18899 }else 18900 18901 /* .session isempty 18902 ** Determine if the session is empty 18903 */ 18904 if( strcmp(azCmd[0], "isempty")==0 ){ 18905 int ii; 18906 if( nCmd!=1 ) goto session_syntax_error; 18907 if( p->nSession ){ 18908 ii = sqlite3session_isempty(pSession->p); 18909 utf8_printf(p->out, "session %s isempty flag = %d\n", 18910 pSession->zName, ii); 18911 } 18912 }else 18913 18914 /* .session list 18915 ** List all currently open sessions 18916 */ 18917 if( strcmp(azCmd[0],"list")==0 ){ 18918 for(i=0; i<p->nSession; i++){ 18919 utf8_printf(p->out, "%d %s\n", i, p->aSession[i].zName); 18920 } 18921 }else 18922 18923 /* .session open DB NAME 18924 ** Open a new session called NAME on the attached database DB. 18925 ** DB is normally "main". 18926 */ 18927 if( strcmp(azCmd[0],"open")==0 ){ 18928 char *zName; 18929 if( nCmd!=3 ) goto session_syntax_error; 18930 zName = azCmd[2]; 18931 if( zName[0]==0 ) goto session_syntax_error; 18932 for(i=0; i<p->nSession; i++){ 18933 if( strcmp(p->aSession[i].zName,zName)==0 ){ 18934 utf8_printf(stderr, "Session \"%s\" already exists\n", zName); 18935 goto meta_command_exit; 18936 } 18937 } 18938 if( p->nSession>=ArraySize(p->aSession) ){ 18939 raw_printf(stderr, "Maximum of %d sessions\n", ArraySize(p->aSession)); 18940 goto meta_command_exit; 18941 } 18942 pSession = &p->aSession[p->nSession]; 18943 rc = sqlite3session_create(p->db, azCmd[1], &pSession->p); 18944 if( rc ){ 18945 raw_printf(stderr, "Cannot open session: error code=%d\n", rc); 18946 rc = 0; 18947 goto meta_command_exit; 18948 } 18949 pSession->nFilter = 0; 18950 sqlite3session_table_filter(pSession->p, session_filter, pSession); 18951 p->nSession++; 18952 pSession->zName = sqlite3_mprintf("%s", zName); 18953 }else 18954 /* If no command name matches, show a syntax error */ 18955 session_syntax_error: 18956 showHelp(p->out, "session"); 18957 }else 18958 #endif 18959 18960 #ifdef SQLITE_DEBUG 18961 /* Undocumented commands for internal testing. Subject to change 18962 ** without notice. */ 18963 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){ 18964 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){ 18965 int i, v; 18966 for(i=1; i<nArg; i++){ 18967 v = booleanValue(azArg[i]); 18968 utf8_printf(p->out, "%s: %d 0x%x\n", azArg[i], v, v); 18969 } 18970 } 18971 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){ 18972 int i; sqlite3_int64 v; 18973 for(i=1; i<nArg; i++){ 18974 char zBuf[200]; 18975 v = integerValue(azArg[i]); 18976 sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v); 18977 utf8_printf(p->out, "%s", zBuf); 18978 } 18979 } 18980 }else 18981 #endif 18982 18983 if( c=='s' && n>=4 && strncmp(azArg[0],"selftest",n)==0 ){ 18984 int bIsInit = 0; /* True to initialize the SELFTEST table */ 18985 int bVerbose = 0; /* Verbose output */ 18986 int bSelftestExists; /* True if SELFTEST already exists */ 18987 int i, k; /* Loop counters */ 18988 int nTest = 0; /* Number of tests runs */ 18989 int nErr = 0; /* Number of errors seen */ 18990 ShellText str; /* Answer for a query */ 18991 sqlite3_stmt *pStmt = 0; /* Query against the SELFTEST table */ 18992 18993 open_db(p,0); 18994 for(i=1; i<nArg; i++){ 18995 const char *z = azArg[i]; 18996 if( z[0]=='-' && z[1]=='-' ) z++; 18997 if( strcmp(z,"-init")==0 ){ 18998 bIsInit = 1; 18999 }else 19000 if( strcmp(z,"-v")==0 ){ 19001 bVerbose++; 19002 }else 19003 { 19004 utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n", 19005 azArg[i], azArg[0]); 19006 raw_printf(stderr, "Should be one of: --init -v\n"); 19007 rc = 1; 19008 goto meta_command_exit; 19009 } 19010 } 19011 if( sqlite3_table_column_metadata(p->db,"main","selftest",0,0,0,0,0,0) 19012 != SQLITE_OK ){ 19013 bSelftestExists = 0; 19014 }else{ 19015 bSelftestExists = 1; 19016 } 19017 if( bIsInit ){ 19018 createSelftestTable(p); 19019 bSelftestExists = 1; 19020 } 19021 initText(&str); 19022 appendText(&str, "x", 0); 19023 for(k=bSelftestExists; k>=0; k--){ 19024 if( k==1 ){ 19025 rc = sqlite3_prepare_v2(p->db, 19026 "SELECT tno,op,cmd,ans FROM selftest ORDER BY tno", 19027 -1, &pStmt, 0); 19028 }else{ 19029 rc = sqlite3_prepare_v2(p->db, 19030 "VALUES(0,'memo','Missing SELFTEST table - default checks only','')," 19031 " (1,'run','PRAGMA integrity_check','ok')", 19032 -1, &pStmt, 0); 19033 } 19034 if( rc ){ 19035 raw_printf(stderr, "Error querying the selftest table\n"); 19036 rc = 1; 19037 sqlite3_finalize(pStmt); 19038 goto meta_command_exit; 19039 } 19040 for(i=1; sqlite3_step(pStmt)==SQLITE_ROW; i++){ 19041 int tno = sqlite3_column_int(pStmt, 0); 19042 const char *zOp = (const char*)sqlite3_column_text(pStmt, 1); 19043 const char *zSql = (const char*)sqlite3_column_text(pStmt, 2); 19044 const char *zAns = (const char*)sqlite3_column_text(pStmt, 3); 19045 19046 k = 0; 19047 if( bVerbose>0 ){ 19048 char *zQuote = sqlite3_mprintf("%q", zSql); 19049 printf("%d: %s %s\n", tno, zOp, zSql); 19050 sqlite3_free(zQuote); 19051 } 19052 if( strcmp(zOp,"memo")==0 ){ 19053 utf8_printf(p->out, "%s\n", zSql); 19054 }else 19055 if( strcmp(zOp,"run")==0 ){ 19056 char *zErrMsg = 0; 19057 str.n = 0; 19058 str.z[0] = 0; 19059 rc = sqlite3_exec(p->db, zSql, captureOutputCallback, &str, &zErrMsg); 19060 nTest++; 19061 if( bVerbose ){ 19062 utf8_printf(p->out, "Result: %s\n", str.z); 19063 } 19064 if( rc || zErrMsg ){ 19065 nErr++; 19066 rc = 1; 19067 utf8_printf(p->out, "%d: error-code-%d: %s\n", tno, rc, zErrMsg); 19068 sqlite3_free(zErrMsg); 19069 }else if( strcmp(zAns,str.z)!=0 ){ 19070 nErr++; 19071 rc = 1; 19072 utf8_printf(p->out, "%d: Expected: [%s]\n", tno, zAns); 19073 utf8_printf(p->out, "%d: Got: [%s]\n", tno, str.z); 19074 } 19075 }else 19076 { 19077 utf8_printf(stderr, 19078 "Unknown operation \"%s\" on selftest line %d\n", zOp, tno); 19079 rc = 1; 19080 break; 19081 } 19082 } /* End loop over rows of content from SELFTEST */ 19083 sqlite3_finalize(pStmt); 19084 } /* End loop over k */ 19085 freeText(&str); 19086 utf8_printf(p->out, "%d errors out of %d tests\n", nErr, nTest); 19087 }else 19088 19089 if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){ 19090 if( nArg<2 || nArg>3 ){ 19091 raw_printf(stderr, "Usage: .separator COL ?ROW?\n"); 19092 rc = 1; 19093 } 19094 if( nArg>=2 ){ 19095 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, 19096 "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]); 19097 } 19098 if( nArg>=3 ){ 19099 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, 19100 "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]); 19101 } 19102 }else 19103 19104 if( c=='s' && n>=4 && strncmp(azArg[0],"sha3sum",n)==0 ){ 19105 const char *zLike = 0; /* Which table to checksum. 0 means everything */ 19106 int i; /* Loop counter */ 19107 int bSchema = 0; /* Also hash the schema */ 19108 int bSeparate = 0; /* Hash each table separately */ 19109 int iSize = 224; /* Hash algorithm to use */ 19110 int bDebug = 0; /* Only show the query that would have run */ 19111 sqlite3_stmt *pStmt; /* For querying tables names */ 19112 char *zSql; /* SQL to be run */ 19113 char *zSep; /* Separator */ 19114 ShellText sSql; /* Complete SQL for the query to run the hash */ 19115 ShellText sQuery; /* Set of queries used to read all content */ 19116 open_db(p, 0); 19117 for(i=1; i<nArg; i++){ 19118 const char *z = azArg[i]; 19119 if( z[0]=='-' ){ 19120 z++; 19121 if( z[0]=='-' ) z++; 19122 if( strcmp(z,"schema")==0 ){ 19123 bSchema = 1; 19124 }else 19125 if( strcmp(z,"sha3-224")==0 || strcmp(z,"sha3-256")==0 19126 || strcmp(z,"sha3-384")==0 || strcmp(z,"sha3-512")==0 19127 ){ 19128 iSize = atoi(&z[5]); 19129 }else 19130 if( strcmp(z,"debug")==0 ){ 19131 bDebug = 1; 19132 }else 19133 { 19134 utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n", 19135 azArg[i], azArg[0]); 19136 showHelp(p->out, azArg[0]); 19137 rc = 1; 19138 goto meta_command_exit; 19139 } 19140 }else if( zLike ){ 19141 raw_printf(stderr, "Usage: .sha3sum ?OPTIONS? ?LIKE-PATTERN?\n"); 19142 rc = 1; 19143 goto meta_command_exit; 19144 }else{ 19145 zLike = z; 19146 bSeparate = 1; 19147 if( sqlite3_strlike("sqlite\\_%", zLike, '\\')==0 ) bSchema = 1; 19148 } 19149 } 19150 if( bSchema ){ 19151 zSql = "SELECT lower(name) FROM sqlite_schema" 19152 " WHERE type='table' AND coalesce(rootpage,0)>1" 19153 " UNION ALL SELECT 'sqlite_schema'" 19154 " ORDER BY 1 collate nocase"; 19155 }else{ 19156 zSql = "SELECT lower(name) FROM sqlite_schema" 19157 " WHERE type='table' AND coalesce(rootpage,0)>1" 19158 " AND name NOT LIKE 'sqlite_%'" 19159 " ORDER BY 1 collate nocase"; 19160 } 19161 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 19162 initText(&sQuery); 19163 initText(&sSql); 19164 appendText(&sSql, "WITH [sha3sum$query](a,b) AS(",0); 19165 zSep = "VALUES("; 19166 while( SQLITE_ROW==sqlite3_step(pStmt) ){ 19167 const char *zTab = (const char*)sqlite3_column_text(pStmt,0); 19168 if( zLike && sqlite3_strlike(zLike, zTab, 0)!=0 ) continue; 19169 if( strncmp(zTab, "sqlite_",7)!=0 ){ 19170 appendText(&sQuery,"SELECT * FROM ", 0); 19171 appendText(&sQuery,zTab,'"'); 19172 appendText(&sQuery," NOT INDEXED;", 0); 19173 }else if( strcmp(zTab, "sqlite_schema")==0 ){ 19174 appendText(&sQuery,"SELECT type,name,tbl_name,sql FROM sqlite_schema" 19175 " ORDER BY name;", 0); 19176 }else if( strcmp(zTab, "sqlite_sequence")==0 ){ 19177 appendText(&sQuery,"SELECT name,seq FROM sqlite_sequence" 19178 " ORDER BY name;", 0); 19179 }else if( strcmp(zTab, "sqlite_stat1")==0 ){ 19180 appendText(&sQuery,"SELECT tbl,idx,stat FROM sqlite_stat1" 19181 " ORDER BY tbl,idx;", 0); 19182 }else if( strcmp(zTab, "sqlite_stat4")==0 ){ 19183 appendText(&sQuery, "SELECT * FROM ", 0); 19184 appendText(&sQuery, zTab, 0); 19185 appendText(&sQuery, " ORDER BY tbl, idx, rowid;\n", 0); 19186 } 19187 appendText(&sSql, zSep, 0); 19188 appendText(&sSql, sQuery.z, '\''); 19189 sQuery.n = 0; 19190 appendText(&sSql, ",", 0); 19191 appendText(&sSql, zTab, '\''); 19192 zSep = "),("; 19193 } 19194 sqlite3_finalize(pStmt); 19195 if( bSeparate ){ 19196 zSql = sqlite3_mprintf( 19197 "%s))" 19198 " SELECT lower(hex(sha3_query(a,%d))) AS hash, b AS label" 19199 " FROM [sha3sum$query]", 19200 sSql.z, iSize); 19201 }else{ 19202 zSql = sqlite3_mprintf( 19203 "%s))" 19204 " SELECT lower(hex(sha3_query(group_concat(a,''),%d))) AS hash" 19205 " FROM [sha3sum$query]", 19206 sSql.z, iSize); 19207 } 19208 freeText(&sQuery); 19209 freeText(&sSql); 19210 if( bDebug ){ 19211 utf8_printf(p->out, "%s\n", zSql); 19212 }else{ 19213 shell_exec(p, zSql, 0); 19214 } 19215 sqlite3_free(zSql); 19216 }else 19217 19218 #ifndef SQLITE_NOHAVE_SYSTEM 19219 if( c=='s' 19220 && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0) 19221 ){ 19222 char *zCmd; 19223 int i, x; 19224 if( nArg<2 ){ 19225 raw_printf(stderr, "Usage: .system COMMAND\n"); 19226 rc = 1; 19227 goto meta_command_exit; 19228 } 19229 zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]); 19230 for(i=2; i<nArg; i++){ 19231 zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"", 19232 zCmd, azArg[i]); 19233 } 19234 x = system(zCmd); 19235 sqlite3_free(zCmd); 19236 if( x ) raw_printf(stderr, "System command returns %d\n", x); 19237 }else 19238 #endif /* !defined(SQLITE_NOHAVE_SYSTEM) */ 19239 19240 if( c=='s' && strncmp(azArg[0], "show", n)==0 ){ 19241 static const char *azBool[] = { "off", "on", "trigger", "full"}; 19242 int i; 19243 if( nArg!=1 ){ 19244 raw_printf(stderr, "Usage: .show\n"); 19245 rc = 1; 19246 goto meta_command_exit; 19247 } 19248 utf8_printf(p->out, "%12.12s: %s\n","echo", 19249 azBool[ShellHasFlag(p, SHFLG_Echo)]); 19250 utf8_printf(p->out, "%12.12s: %s\n","eqp", azBool[p->autoEQP&3]); 19251 utf8_printf(p->out, "%12.12s: %s\n","explain", 19252 p->mode==MODE_Explain ? "on" : p->autoExplain ? "auto" : "off"); 19253 utf8_printf(p->out,"%12.12s: %s\n","headers", azBool[p->showHeader!=0]); 19254 utf8_printf(p->out, "%12.12s: %s\n","mode", modeDescr[p->mode]); 19255 utf8_printf(p->out, "%12.12s: ", "nullvalue"); 19256 output_c_string(p->out, p->nullValue); 19257 raw_printf(p->out, "\n"); 19258 utf8_printf(p->out,"%12.12s: %s\n","output", 19259 strlen30(p->outfile) ? p->outfile : "stdout"); 19260 utf8_printf(p->out,"%12.12s: ", "colseparator"); 19261 output_c_string(p->out, p->colSeparator); 19262 raw_printf(p->out, "\n"); 19263 utf8_printf(p->out,"%12.12s: ", "rowseparator"); 19264 output_c_string(p->out, p->rowSeparator); 19265 raw_printf(p->out, "\n"); 19266 utf8_printf(p->out, "%12.12s: %s\n","stats", azBool[p->statsOn!=0]); 19267 utf8_printf(p->out, "%12.12s: ", "width"); 19268 for (i=0;i<p->nWidth;i++) { 19269 raw_printf(p->out, "%d ", p->colWidth[i]); 19270 } 19271 raw_printf(p->out, "\n"); 19272 utf8_printf(p->out, "%12.12s: %s\n", "filename", 19273 p->zDbFilename ? p->zDbFilename : ""); 19274 }else 19275 19276 if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){ 19277 if( nArg==2 ){ 19278 p->statsOn = (u8)booleanValue(azArg[1]); 19279 }else if( nArg==1 ){ 19280 display_stats(p->db, p, 0); 19281 }else{ 19282 raw_printf(stderr, "Usage: .stats ?on|off?\n"); 19283 rc = 1; 19284 } 19285 }else 19286 19287 if( (c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0) 19288 || (c=='i' && (strncmp(azArg[0], "indices", n)==0 19289 || strncmp(azArg[0], "indexes", n)==0) ) 19290 ){ 19291 sqlite3_stmt *pStmt; 19292 char **azResult; 19293 int nRow, nAlloc; 19294 int ii; 19295 ShellText s; 19296 initText(&s); 19297 open_db(p, 0); 19298 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0); 19299 if( rc ){ 19300 sqlite3_finalize(pStmt); 19301 return shellDatabaseError(p->db); 19302 } 19303 19304 if( nArg>2 && c=='i' ){ 19305 /* It is an historical accident that the .indexes command shows an error 19306 ** when called with the wrong number of arguments whereas the .tables 19307 ** command does not. */ 19308 raw_printf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n"); 19309 rc = 1; 19310 sqlite3_finalize(pStmt); 19311 goto meta_command_exit; 19312 } 19313 for(ii=0; sqlite3_step(pStmt)==SQLITE_ROW; ii++){ 19314 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1); 19315 if( zDbName==0 ) continue; 19316 if( s.z && s.z[0] ) appendText(&s, " UNION ALL ", 0); 19317 if( sqlite3_stricmp(zDbName, "main")==0 ){ 19318 appendText(&s, "SELECT name FROM ", 0); 19319 }else{ 19320 appendText(&s, "SELECT ", 0); 19321 appendText(&s, zDbName, '\''); 19322 appendText(&s, "||'.'||name FROM ", 0); 19323 } 19324 appendText(&s, zDbName, '"'); 19325 appendText(&s, ".sqlite_schema ", 0); 19326 if( c=='t' ){ 19327 appendText(&s," WHERE type IN ('table','view')" 19328 " AND name NOT LIKE 'sqlite_%'" 19329 " AND name LIKE ?1", 0); 19330 }else{ 19331 appendText(&s," WHERE type='index'" 19332 " AND tbl_name LIKE ?1", 0); 19333 } 19334 } 19335 rc = sqlite3_finalize(pStmt); 19336 appendText(&s, " ORDER BY 1", 0); 19337 rc = sqlite3_prepare_v2(p->db, s.z, -1, &pStmt, 0); 19338 freeText(&s); 19339 if( rc ) return shellDatabaseError(p->db); 19340 19341 /* Run the SQL statement prepared by the above block. Store the results 19342 ** as an array of nul-terminated strings in azResult[]. */ 19343 nRow = nAlloc = 0; 19344 azResult = 0; 19345 if( nArg>1 ){ 19346 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT); 19347 }else{ 19348 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC); 19349 } 19350 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 19351 if( nRow>=nAlloc ){ 19352 char **azNew; 19353 int n2 = nAlloc*2 + 10; 19354 azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2); 19355 if( azNew==0 ) shell_out_of_memory(); 19356 nAlloc = n2; 19357 azResult = azNew; 19358 } 19359 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0)); 19360 if( 0==azResult[nRow] ) shell_out_of_memory(); 19361 nRow++; 19362 } 19363 if( sqlite3_finalize(pStmt)!=SQLITE_OK ){ 19364 rc = shellDatabaseError(p->db); 19365 } 19366 19367 /* Pretty-print the contents of array azResult[] to the output */ 19368 if( rc==0 && nRow>0 ){ 19369 int len, maxlen = 0; 19370 int i, j; 19371 int nPrintCol, nPrintRow; 19372 for(i=0; i<nRow; i++){ 19373 len = strlen30(azResult[i]); 19374 if( len>maxlen ) maxlen = len; 19375 } 19376 nPrintCol = 80/(maxlen+2); 19377 if( nPrintCol<1 ) nPrintCol = 1; 19378 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol; 19379 for(i=0; i<nPrintRow; i++){ 19380 for(j=i; j<nRow; j+=nPrintRow){ 19381 char *zSp = j<nPrintRow ? "" : " "; 19382 utf8_printf(p->out, "%s%-*s", zSp, maxlen, 19383 azResult[j] ? azResult[j]:""); 19384 } 19385 raw_printf(p->out, "\n"); 19386 } 19387 } 19388 19389 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]); 19390 sqlite3_free(azResult); 19391 }else 19392 19393 /* Begin redirecting output to the file "testcase-out.txt" */ 19394 if( c=='t' && strcmp(azArg[0],"testcase")==0 ){ 19395 output_reset(p); 19396 p->out = output_file_open("testcase-out.txt", 0); 19397 if( p->out==0 ){ 19398 raw_printf(stderr, "Error: cannot open 'testcase-out.txt'\n"); 19399 } 19400 if( nArg>=2 ){ 19401 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "%s", azArg[1]); 19402 }else{ 19403 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "?"); 19404 } 19405 }else 19406 19407 #ifndef SQLITE_UNTESTABLE 19408 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 ){ 19409 static const struct { 19410 const char *zCtrlName; /* Name of a test-control option */ 19411 int ctrlCode; /* Integer code for that option */ 19412 const char *zUsage; /* Usage notes */ 19413 } aCtrl[] = { 19414 { "always", SQLITE_TESTCTRL_ALWAYS, "BOOLEAN" }, 19415 { "assert", SQLITE_TESTCTRL_ASSERT, "BOOLEAN" }, 19416 /*{ "benign_malloc_hooks",SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS, "" },*/ 19417 /*{ "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST, "" },*/ 19418 { "byteorder", SQLITE_TESTCTRL_BYTEORDER, "" }, 19419 { "extra_schema_checks",SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS,"BOOLEAN" }, 19420 /*{ "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL, "" },*/ 19421 { "imposter", SQLITE_TESTCTRL_IMPOSTER, "SCHEMA ON/OFF ROOTPAGE"}, 19422 { "internal_functions", SQLITE_TESTCTRL_INTERNAL_FUNCTIONS, "" }, 19423 { "localtime_fault", SQLITE_TESTCTRL_LOCALTIME_FAULT,"BOOLEAN" }, 19424 { "never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT, "BOOLEAN" }, 19425 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS, "DISABLE-MASK" }, 19426 #ifdef YYCOVERAGE 19427 { "parser_coverage", SQLITE_TESTCTRL_PARSER_COVERAGE, "" }, 19428 #endif 19429 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE, "OFFSET " }, 19430 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE, "" }, 19431 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE, "" }, 19432 { "prng_seed", SQLITE_TESTCTRL_PRNG_SEED, "SEED ?db?" }, 19433 }; 19434 int testctrl = -1; 19435 int iCtrl = -1; 19436 int rc2 = 0; /* 0: usage. 1: %d 2: %x 3: no-output */ 19437 int isOk = 0; 19438 int i, n2; 19439 const char *zCmd = 0; 19440 19441 open_db(p, 0); 19442 zCmd = nArg>=2 ? azArg[1] : "help"; 19443 19444 /* The argument can optionally begin with "-" or "--" */ 19445 if( zCmd[0]=='-' && zCmd[1] ){ 19446 zCmd++; 19447 if( zCmd[0]=='-' && zCmd[1] ) zCmd++; 19448 } 19449 19450 /* --help lists all test-controls */ 19451 if( strcmp(zCmd,"help")==0 ){ 19452 utf8_printf(p->out, "Available test-controls:\n"); 19453 for(i=0; i<ArraySize(aCtrl); i++){ 19454 utf8_printf(p->out, " .testctrl %s %s\n", 19455 aCtrl[i].zCtrlName, aCtrl[i].zUsage); 19456 } 19457 rc = 1; 19458 goto meta_command_exit; 19459 } 19460 19461 /* convert testctrl text option to value. allow any unique prefix 19462 ** of the option name, or a numerical value. */ 19463 n2 = strlen30(zCmd); 19464 for(i=0; i<ArraySize(aCtrl); i++){ 19465 if( strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){ 19466 if( testctrl<0 ){ 19467 testctrl = aCtrl[i].ctrlCode; 19468 iCtrl = i; 19469 }else{ 19470 utf8_printf(stderr, "Error: ambiguous test-control: \"%s\"\n" 19471 "Use \".testctrl --help\" for help\n", zCmd); 19472 rc = 1; 19473 goto meta_command_exit; 19474 } 19475 } 19476 } 19477 if( testctrl<0 ){ 19478 utf8_printf(stderr,"Error: unknown test-control: %s\n" 19479 "Use \".testctrl --help\" for help\n", zCmd); 19480 }else{ 19481 switch(testctrl){ 19482 19483 /* sqlite3_test_control(int, db, int) */ 19484 case SQLITE_TESTCTRL_OPTIMIZATIONS: 19485 if( nArg==3 ){ 19486 int opt = (int)strtol(azArg[2], 0, 0); 19487 rc2 = sqlite3_test_control(testctrl, p->db, opt); 19488 isOk = 3; 19489 } 19490 break; 19491 19492 /* sqlite3_test_control(int) */ 19493 case SQLITE_TESTCTRL_PRNG_SAVE: 19494 case SQLITE_TESTCTRL_PRNG_RESTORE: 19495 case SQLITE_TESTCTRL_PRNG_RESET: 19496 case SQLITE_TESTCTRL_BYTEORDER: 19497 if( nArg==2 ){ 19498 rc2 = sqlite3_test_control(testctrl); 19499 isOk = testctrl==SQLITE_TESTCTRL_BYTEORDER ? 1 : 3; 19500 } 19501 break; 19502 19503 /* sqlite3_test_control(int, uint) */ 19504 case SQLITE_TESTCTRL_PENDING_BYTE: 19505 if( nArg==3 ){ 19506 unsigned int opt = (unsigned int)integerValue(azArg[2]); 19507 rc2 = sqlite3_test_control(testctrl, opt); 19508 isOk = 3; 19509 } 19510 break; 19511 19512 /* sqlite3_test_control(int, int, sqlite3*) */ 19513 case SQLITE_TESTCTRL_PRNG_SEED: 19514 if( nArg==3 || nArg==4 ){ 19515 int ii = (int)integerValue(azArg[2]); 19516 sqlite3 *db; 19517 if( ii==0 && strcmp(azArg[2],"random")==0 ){ 19518 sqlite3_randomness(sizeof(ii),&ii); 19519 printf("-- random seed: %d\n", ii); 19520 } 19521 if( nArg==3 ){ 19522 db = 0; 19523 }else{ 19524 db = p->db; 19525 /* Make sure the schema has been loaded */ 19526 sqlite3_table_column_metadata(db, 0, "x", 0, 0, 0, 0, 0, 0); 19527 } 19528 rc2 = sqlite3_test_control(testctrl, ii, db); 19529 isOk = 3; 19530 } 19531 break; 19532 19533 /* sqlite3_test_control(int, int) */ 19534 case SQLITE_TESTCTRL_ASSERT: 19535 case SQLITE_TESTCTRL_ALWAYS: 19536 if( nArg==3 ){ 19537 int opt = booleanValue(azArg[2]); 19538 rc2 = sqlite3_test_control(testctrl, opt); 19539 isOk = 1; 19540 } 19541 break; 19542 19543 /* sqlite3_test_control(int, int) */ 19544 case SQLITE_TESTCTRL_LOCALTIME_FAULT: 19545 case SQLITE_TESTCTRL_NEVER_CORRUPT: 19546 if( nArg==3 ){ 19547 int opt = booleanValue(azArg[2]); 19548 rc2 = sqlite3_test_control(testctrl, opt); 19549 isOk = 3; 19550 } 19551 break; 19552 19553 /* sqlite3_test_control(sqlite3*) */ 19554 case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS: 19555 rc2 = sqlite3_test_control(testctrl, p->db); 19556 isOk = 3; 19557 break; 19558 19559 case SQLITE_TESTCTRL_IMPOSTER: 19560 if( nArg==5 ){ 19561 rc2 = sqlite3_test_control(testctrl, p->db, 19562 azArg[2], 19563 integerValue(azArg[3]), 19564 integerValue(azArg[4])); 19565 isOk = 3; 19566 } 19567 break; 19568 19569 #ifdef YYCOVERAGE 19570 case SQLITE_TESTCTRL_PARSER_COVERAGE: 19571 if( nArg==2 ){ 19572 sqlite3_test_control(testctrl, p->out); 19573 isOk = 3; 19574 } 19575 #endif 19576 } 19577 } 19578 if( isOk==0 && iCtrl>=0 ){ 19579 utf8_printf(p->out, "Usage: .testctrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage); 19580 rc = 1; 19581 }else if( isOk==1 ){ 19582 raw_printf(p->out, "%d\n", rc2); 19583 }else if( isOk==2 ){ 19584 raw_printf(p->out, "0x%08x\n", rc2); 19585 } 19586 }else 19587 #endif /* !defined(SQLITE_UNTESTABLE) */ 19588 19589 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){ 19590 open_db(p, 0); 19591 sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0); 19592 }else 19593 19594 if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){ 19595 if( nArg==2 ){ 19596 enableTimer = booleanValue(azArg[1]); 19597 if( enableTimer && !HAS_TIMER ){ 19598 raw_printf(stderr, "Error: timer not available on this system.\n"); 19599 enableTimer = 0; 19600 } 19601 }else{ 19602 raw_printf(stderr, "Usage: .timer on|off\n"); 19603 rc = 1; 19604 } 19605 }else 19606 19607 #ifndef SQLITE_OMIT_TRACE 19608 if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){ 19609 int mType = 0; 19610 int jj; 19611 open_db(p, 0); 19612 for(jj=1; jj<nArg; jj++){ 19613 const char *z = azArg[jj]; 19614 if( z[0]=='-' ){ 19615 if( optionMatch(z, "expanded") ){ 19616 p->eTraceType = SHELL_TRACE_EXPANDED; 19617 } 19618 #ifdef SQLITE_ENABLE_NORMALIZE 19619 else if( optionMatch(z, "normalized") ){ 19620 p->eTraceType = SHELL_TRACE_NORMALIZED; 19621 } 19622 #endif 19623 else if( optionMatch(z, "plain") ){ 19624 p->eTraceType = SHELL_TRACE_PLAIN; 19625 } 19626 else if( optionMatch(z, "profile") ){ 19627 mType |= SQLITE_TRACE_PROFILE; 19628 } 19629 else if( optionMatch(z, "row") ){ 19630 mType |= SQLITE_TRACE_ROW; 19631 } 19632 else if( optionMatch(z, "stmt") ){ 19633 mType |= SQLITE_TRACE_STMT; 19634 } 19635 else if( optionMatch(z, "close") ){ 19636 mType |= SQLITE_TRACE_CLOSE; 19637 } 19638 else { 19639 raw_printf(stderr, "Unknown option \"%s\" on \".trace\"\n", z); 19640 rc = 1; 19641 goto meta_command_exit; 19642 } 19643 }else{ 19644 output_file_close(p->traceOut); 19645 p->traceOut = output_file_open(azArg[1], 0); 19646 } 19647 } 19648 if( p->traceOut==0 ){ 19649 sqlite3_trace_v2(p->db, 0, 0, 0); 19650 }else{ 19651 if( mType==0 ) mType = SQLITE_TRACE_STMT; 19652 sqlite3_trace_v2(p->db, mType, sql_trace_callback, p); 19653 } 19654 }else 19655 #endif /* !defined(SQLITE_OMIT_TRACE) */ 19656 19657 #if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_VIRTUALTABLE) 19658 if( c=='u' && strncmp(azArg[0], "unmodule", n)==0 ){ 19659 int ii; 19660 int lenOpt; 19661 char *zOpt; 19662 if( nArg<2 ){ 19663 raw_printf(stderr, "Usage: .unmodule [--allexcept] NAME ...\n"); 19664 rc = 1; 19665 goto meta_command_exit; 19666 } 19667 open_db(p, 0); 19668 zOpt = azArg[1]; 19669 if( zOpt[0]=='-' && zOpt[1]=='-' && zOpt[2]!=0 ) zOpt++; 19670 lenOpt = (int)strlen(zOpt); 19671 if( lenOpt>=3 && strncmp(zOpt, "-allexcept",lenOpt)==0 ){ 19672 assert( azArg[nArg]==0 ); 19673 sqlite3_drop_modules(p->db, nArg>2 ? (const char**)(azArg+2) : 0); 19674 }else{ 19675 for(ii=1; ii<nArg; ii++){ 19676 sqlite3_create_module(p->db, azArg[ii], 0, 0); 19677 } 19678 } 19679 }else 19680 #endif 19681 19682 #if SQLITE_USER_AUTHENTICATION 19683 if( c=='u' && strncmp(azArg[0], "user", n)==0 ){ 19684 if( nArg<2 ){ 19685 raw_printf(stderr, "Usage: .user SUBCOMMAND ...\n"); 19686 rc = 1; 19687 goto meta_command_exit; 19688 } 19689 open_db(p, 0); 19690 if( strcmp(azArg[1],"login")==0 ){ 19691 if( nArg!=4 ){ 19692 raw_printf(stderr, "Usage: .user login USER PASSWORD\n"); 19693 rc = 1; 19694 goto meta_command_exit; 19695 } 19696 rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3], 19697 strlen30(azArg[3])); 19698 if( rc ){ 19699 utf8_printf(stderr, "Authentication failed for user %s\n", azArg[2]); 19700 rc = 1; 19701 } 19702 }else if( strcmp(azArg[1],"add")==0 ){ 19703 if( nArg!=5 ){ 19704 raw_printf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n"); 19705 rc = 1; 19706 goto meta_command_exit; 19707 } 19708 rc = sqlite3_user_add(p->db, azArg[2], azArg[3], strlen30(azArg[3]), 19709 booleanValue(azArg[4])); 19710 if( rc ){ 19711 raw_printf(stderr, "User-Add failed: %d\n", rc); 19712 rc = 1; 19713 } 19714 }else if( strcmp(azArg[1],"edit")==0 ){ 19715 if( nArg!=5 ){ 19716 raw_printf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n"); 19717 rc = 1; 19718 goto meta_command_exit; 19719 } 19720 rc = sqlite3_user_change(p->db, azArg[2], azArg[3], strlen30(azArg[3]), 19721 booleanValue(azArg[4])); 19722 if( rc ){ 19723 raw_printf(stderr, "User-Edit failed: %d\n", rc); 19724 rc = 1; 19725 } 19726 }else if( strcmp(azArg[1],"delete")==0 ){ 19727 if( nArg!=3 ){ 19728 raw_printf(stderr, "Usage: .user delete USER\n"); 19729 rc = 1; 19730 goto meta_command_exit; 19731 } 19732 rc = sqlite3_user_delete(p->db, azArg[2]); 19733 if( rc ){ 19734 raw_printf(stderr, "User-Delete failed: %d\n", rc); 19735 rc = 1; 19736 } 19737 }else{ 19738 raw_printf(stderr, "Usage: .user login|add|edit|delete ...\n"); 19739 rc = 1; 19740 goto meta_command_exit; 19741 } 19742 }else 19743 #endif /* SQLITE_USER_AUTHENTICATION */ 19744 19745 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){ 19746 utf8_printf(p->out, "SQLite %s %s\n" /*extra-version-info*/, 19747 sqlite3_libversion(), sqlite3_sourceid()); 19748 #if SQLITE_HAVE_ZLIB 19749 utf8_printf(p->out, "zlib version %s\n", zlibVersion()); 19750 #endif 19751 #define CTIMEOPT_VAL_(opt) #opt 19752 #define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt) 19753 #if defined(__clang__) && defined(__clang_major__) 19754 utf8_printf(p->out, "clang-" CTIMEOPT_VAL(__clang_major__) "." 19755 CTIMEOPT_VAL(__clang_minor__) "." 19756 CTIMEOPT_VAL(__clang_patchlevel__) "\n"); 19757 #elif defined(_MSC_VER) 19758 utf8_printf(p->out, "msvc-" CTIMEOPT_VAL(_MSC_VER) "\n"); 19759 #elif defined(__GNUC__) && defined(__VERSION__) 19760 utf8_printf(p->out, "gcc-" __VERSION__ "\n"); 19761 #endif 19762 }else 19763 19764 if( c=='v' && strncmp(azArg[0], "vfsinfo", n)==0 ){ 19765 const char *zDbName = nArg==2 ? azArg[1] : "main"; 19766 sqlite3_vfs *pVfs = 0; 19767 if( p->db ){ 19768 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFS_POINTER, &pVfs); 19769 if( pVfs ){ 19770 utf8_printf(p->out, "vfs.zName = \"%s\"\n", pVfs->zName); 19771 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion); 19772 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile); 19773 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname); 19774 } 19775 } 19776 }else 19777 19778 if( c=='v' && strncmp(azArg[0], "vfslist", n)==0 ){ 19779 sqlite3_vfs *pVfs; 19780 sqlite3_vfs *pCurrent = 0; 19781 if( p->db ){ 19782 sqlite3_file_control(p->db, "main", SQLITE_FCNTL_VFS_POINTER, &pCurrent); 19783 } 19784 for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){ 19785 utf8_printf(p->out, "vfs.zName = \"%s\"%s\n", pVfs->zName, 19786 pVfs==pCurrent ? " <--- CURRENT" : ""); 19787 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion); 19788 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile); 19789 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname); 19790 if( pVfs->pNext ){ 19791 raw_printf(p->out, "-----------------------------------\n"); 19792 } 19793 } 19794 }else 19795 19796 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){ 19797 const char *zDbName = nArg==2 ? azArg[1] : "main"; 19798 char *zVfsName = 0; 19799 if( p->db ){ 19800 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName); 19801 if( zVfsName ){ 19802 utf8_printf(p->out, "%s\n", zVfsName); 19803 sqlite3_free(zVfsName); 19804 } 19805 } 19806 }else 19807 19808 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE) 19809 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){ 19810 sqlite3WhereTrace = nArg>=2 ? booleanValue(azArg[1]) : 0xff; 19811 }else 19812 #endif 19813 19814 if( c=='w' && strncmp(azArg[0], "width", n)==0 ){ 19815 int j; 19816 assert( nArg<=ArraySize(azArg) ); 19817 p->nWidth = nArg-1; 19818 p->colWidth = realloc(p->colWidth, p->nWidth*sizeof(int)*2); 19819 if( p->colWidth==0 && p->nWidth>0 ) shell_out_of_memory(); 19820 if( p->nWidth ) p->actualWidth = &p->colWidth[p->nWidth]; 19821 for(j=1; j<nArg; j++){ 19822 p->colWidth[j-1] = (int)integerValue(azArg[j]); 19823 } 19824 }else 19825 19826 { 19827 utf8_printf(stderr, "Error: unknown command or invalid arguments: " 19828 " \"%s\". Enter \".help\" for help\n", azArg[0]); 19829 rc = 1; 19830 } 19831 19832 meta_command_exit: 19833 if( p->outCount ){ 19834 p->outCount--; 19835 if( p->outCount==0 ) output_reset(p); 19836 } 19837 return rc; 19838 } 19839 19840 /* 19841 ** Return TRUE if a semicolon occurs anywhere in the first N characters 19842 ** of string z[]. 19843 */ 19844 static int line_contains_semicolon(const char *z, int N){ 19845 int i; 19846 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; } 19847 return 0; 19848 } 19849 19850 /* 19851 ** Test to see if a line consists entirely of whitespace. 19852 */ 19853 static int _all_whitespace(const char *z){ 19854 for(; *z; z++){ 19855 if( IsSpace(z[0]) ) continue; 19856 if( *z=='/' && z[1]=='*' ){ 19857 z += 2; 19858 while( *z && (*z!='*' || z[1]!='/') ){ z++; } 19859 if( *z==0 ) return 0; 19860 z++; 19861 continue; 19862 } 19863 if( *z=='-' && z[1]=='-' ){ 19864 z += 2; 19865 while( *z && *z!='\n' ){ z++; } 19866 if( *z==0 ) return 1; 19867 continue; 19868 } 19869 return 0; 19870 } 19871 return 1; 19872 } 19873 19874 /* 19875 ** Return TRUE if the line typed in is an SQL command terminator other 19876 ** than a semi-colon. The SQL Server style "go" command is understood 19877 ** as is the Oracle "/". 19878 */ 19879 static int line_is_command_terminator(const char *zLine){ 19880 while( IsSpace(zLine[0]) ){ zLine++; }; 19881 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){ 19882 return 1; /* Oracle */ 19883 } 19884 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o' 19885 && _all_whitespace(&zLine[2]) ){ 19886 return 1; /* SQL Server */ 19887 } 19888 return 0; 19889 } 19890 19891 /* 19892 ** We need a default sqlite3_complete() implementation to use in case 19893 ** the shell is compiled with SQLITE_OMIT_COMPLETE. The default assumes 19894 ** any arbitrary text is a complete SQL statement. This is not very 19895 ** user-friendly, but it does seem to work. 19896 */ 19897 #ifdef SQLITE_OMIT_COMPLETE 19898 #define sqlite3_complete(x) 1 19899 #endif 19900 19901 /* 19902 ** Return true if zSql is a complete SQL statement. Return false if it 19903 ** ends in the middle of a string literal or C-style comment. 19904 */ 19905 static int line_is_complete(char *zSql, int nSql){ 19906 int rc; 19907 if( zSql==0 ) return 1; 19908 zSql[nSql] = ';'; 19909 zSql[nSql+1] = 0; 19910 rc = sqlite3_complete(zSql); 19911 zSql[nSql] = 0; 19912 return rc; 19913 } 19914 19915 /* 19916 ** Run a single line of SQL. Return the number of errors. 19917 */ 19918 static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){ 19919 int rc; 19920 char *zErrMsg = 0; 19921 19922 open_db(p, 0); 19923 if( ShellHasFlag(p,SHFLG_Backslash) ) resolve_backslashes(zSql); 19924 if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0; 19925 BEGIN_TIMER; 19926 rc = shell_exec(p, zSql, &zErrMsg); 19927 END_TIMER; 19928 if( rc || zErrMsg ){ 19929 char zPrefix[100]; 19930 if( in!=0 || !stdin_is_interactive ){ 19931 sqlite3_snprintf(sizeof(zPrefix), zPrefix, 19932 "Error: near line %d:", startline); 19933 }else{ 19934 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:"); 19935 } 19936 if( zErrMsg!=0 ){ 19937 utf8_printf(stderr, "%s %s\n", zPrefix, zErrMsg); 19938 sqlite3_free(zErrMsg); 19939 zErrMsg = 0; 19940 }else{ 19941 utf8_printf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db)); 19942 } 19943 return 1; 19944 }else if( ShellHasFlag(p, SHFLG_CountChanges) ){ 19945 raw_printf(p->out, "changes: %3d total_changes: %d\n", 19946 sqlite3_changes(p->db), sqlite3_total_changes(p->db)); 19947 } 19948 return 0; 19949 } 19950 19951 19952 /* 19953 ** Read input from *in and process it. If *in==0 then input 19954 ** is interactive - the user is typing it it. Otherwise, input 19955 ** is coming from a file or device. A prompt is issued and history 19956 ** is saved only if input is interactive. An interrupt signal will 19957 ** cause this routine to exit immediately, unless input is interactive. 19958 ** 19959 ** Return the number of errors. 19960 */ 19961 static int process_input(ShellState *p){ 19962 char *zLine = 0; /* A single input line */ 19963 char *zSql = 0; /* Accumulated SQL text */ 19964 int nLine; /* Length of current line */ 19965 int nSql = 0; /* Bytes of zSql[] used */ 19966 int nAlloc = 0; /* Allocated zSql[] space */ 19967 int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */ 19968 int rc; /* Error code */ 19969 int errCnt = 0; /* Number of errors seen */ 19970 int startline = 0; /* Line number for start of current input */ 19971 19972 p->lineno = 0; 19973 while( errCnt==0 || !bail_on_error || (p->in==0 && stdin_is_interactive) ){ 19974 fflush(p->out); 19975 zLine = one_input_line(p->in, zLine, nSql>0); 19976 if( zLine==0 ){ 19977 /* End of input */ 19978 if( p->in==0 && stdin_is_interactive ) printf("\n"); 19979 break; 19980 } 19981 if( seenInterrupt ){ 19982 if( p->in!=0 ) break; 19983 seenInterrupt = 0; 19984 } 19985 p->lineno++; 19986 if( nSql==0 && _all_whitespace(zLine) ){ 19987 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine); 19988 continue; 19989 } 19990 if( zLine && (zLine[0]=='.' || zLine[0]=='#') && nSql==0 ){ 19991 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine); 19992 if( zLine[0]=='.' ){ 19993 rc = do_meta_command(zLine, p); 19994 if( rc==2 ){ /* exit requested */ 19995 break; 19996 }else if( rc ){ 19997 errCnt++; 19998 } 19999 } 20000 continue; 20001 } 20002 if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){ 20003 memcpy(zLine,";",2); 20004 } 20005 nLine = strlen30(zLine); 20006 if( nSql+nLine+2>=nAlloc ){ 20007 nAlloc = nSql+nLine+100; 20008 zSql = realloc(zSql, nAlloc); 20009 if( zSql==0 ) shell_out_of_memory(); 20010 } 20011 nSqlPrior = nSql; 20012 if( nSql==0 ){ 20013 int i; 20014 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){} 20015 assert( nAlloc>0 && zSql!=0 ); 20016 memcpy(zSql, zLine+i, nLine+1-i); 20017 startline = p->lineno; 20018 nSql = nLine-i; 20019 }else{ 20020 zSql[nSql++] = '\n'; 20021 memcpy(zSql+nSql, zLine, nLine+1); 20022 nSql += nLine; 20023 } 20024 if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior) 20025 && sqlite3_complete(zSql) ){ 20026 errCnt += runOneSqlLine(p, zSql, p->in, startline); 20027 nSql = 0; 20028 if( p->outCount ){ 20029 output_reset(p); 20030 p->outCount = 0; 20031 }else{ 20032 clearTempFile(p); 20033 } 20034 }else if( nSql && _all_whitespace(zSql) ){ 20035 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zSql); 20036 nSql = 0; 20037 } 20038 } 20039 if( nSql && !_all_whitespace(zSql) ){ 20040 errCnt += runOneSqlLine(p, zSql, p->in, startline); 20041 } 20042 free(zSql); 20043 free(zLine); 20044 return errCnt>0; 20045 } 20046 20047 /* 20048 ** Return a pathname which is the user's home directory. A 20049 ** 0 return indicates an error of some kind. 20050 */ 20051 static char *find_home_dir(int clearFlag){ 20052 static char *home_dir = NULL; 20053 if( clearFlag ){ 20054 free(home_dir); 20055 home_dir = 0; 20056 return 0; 20057 } 20058 if( home_dir ) return home_dir; 20059 20060 #if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \ 20061 && !defined(__RTP__) && !defined(_WRS_KERNEL) 20062 { 20063 struct passwd *pwent; 20064 uid_t uid = getuid(); 20065 if( (pwent=getpwuid(uid)) != NULL) { 20066 home_dir = pwent->pw_dir; 20067 } 20068 } 20069 #endif 20070 20071 #if defined(_WIN32_WCE) 20072 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv() 20073 */ 20074 home_dir = "/"; 20075 #else 20076 20077 #if defined(_WIN32) || defined(WIN32) 20078 if (!home_dir) { 20079 home_dir = getenv("USERPROFILE"); 20080 } 20081 #endif 20082 20083 if (!home_dir) { 20084 home_dir = getenv("HOME"); 20085 } 20086 20087 #if defined(_WIN32) || defined(WIN32) 20088 if (!home_dir) { 20089 char *zDrive, *zPath; 20090 int n; 20091 zDrive = getenv("HOMEDRIVE"); 20092 zPath = getenv("HOMEPATH"); 20093 if( zDrive && zPath ){ 20094 n = strlen30(zDrive) + strlen30(zPath) + 1; 20095 home_dir = malloc( n ); 20096 if( home_dir==0 ) return 0; 20097 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath); 20098 return home_dir; 20099 } 20100 home_dir = "c:\\"; 20101 } 20102 #endif 20103 20104 #endif /* !_WIN32_WCE */ 20105 20106 if( home_dir ){ 20107 int n = strlen30(home_dir) + 1; 20108 char *z = malloc( n ); 20109 if( z ) memcpy(z, home_dir, n); 20110 home_dir = z; 20111 } 20112 20113 return home_dir; 20114 } 20115 20116 /* 20117 ** Read input from the file given by sqliterc_override. Or if that 20118 ** parameter is NULL, take input from ~/.sqliterc 20119 ** 20120 ** Returns the number of errors. 20121 */ 20122 static void process_sqliterc( 20123 ShellState *p, /* Configuration data */ 20124 const char *sqliterc_override /* Name of config file. NULL to use default */ 20125 ){ 20126 char *home_dir = NULL; 20127 const char *sqliterc = sqliterc_override; 20128 char *zBuf = 0; 20129 FILE *inSaved = p->in; 20130 int savedLineno = p->lineno; 20131 20132 if (sqliterc == NULL) { 20133 home_dir = find_home_dir(0); 20134 if( home_dir==0 ){ 20135 raw_printf(stderr, "-- warning: cannot find home directory;" 20136 " cannot read ~/.sqliterc\n"); 20137 return; 20138 } 20139 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir); 20140 sqliterc = zBuf; 20141 } 20142 p->in = fopen(sqliterc,"rb"); 20143 if( p->in ){ 20144 if( stdin_is_interactive ){ 20145 utf8_printf(stderr,"-- Loading resources from %s\n",sqliterc); 20146 } 20147 process_input(p); 20148 fclose(p->in); 20149 } 20150 p->in = inSaved; 20151 p->lineno = savedLineno; 20152 sqlite3_free(zBuf); 20153 } 20154 20155 /* 20156 ** Show available command line options 20157 */ 20158 static const char zOptions[] = 20159 #if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE) 20160 " -A ARGS... run \".archive ARGS\" and exit\n" 20161 #endif 20162 " -append append the database to the end of the file\n" 20163 " -ascii set output mode to 'ascii'\n" 20164 " -bail stop after hitting an error\n" 20165 " -batch force batch I/O\n" 20166 " -box set output mode to 'box'\n" 20167 " -column set output mode to 'column'\n" 20168 " -cmd COMMAND run \"COMMAND\" before reading stdin\n" 20169 " -csv set output mode to 'csv'\n" 20170 #if defined(SQLITE_ENABLE_DESERIALIZE) 20171 " -deserialize open the database using sqlite3_deserialize()\n" 20172 #endif 20173 " -echo print commands before execution\n" 20174 " -init FILENAME read/process named file\n" 20175 " -[no]header turn headers on or off\n" 20176 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5) 20177 " -heap SIZE Size of heap for memsys3 or memsys5\n" 20178 #endif 20179 " -help show this message\n" 20180 " -html set output mode to HTML\n" 20181 " -interactive force interactive I/O\n" 20182 " -json set output mode to 'json'\n" 20183 " -line set output mode to 'line'\n" 20184 " -list set output mode to 'list'\n" 20185 " -lookaside SIZE N use N entries of SZ bytes for lookaside memory\n" 20186 " -markdown set output mode to 'markdown'\n" 20187 #if defined(SQLITE_ENABLE_DESERIALIZE) 20188 " -maxsize N maximum size for a --deserialize database\n" 20189 #endif 20190 " -memtrace trace all memory allocations and deallocations\n" 20191 " -mmap N default mmap size set to N\n" 20192 #ifdef SQLITE_ENABLE_MULTIPLEX 20193 " -multiplex enable the multiplexor VFS\n" 20194 #endif 20195 " -newline SEP set output row separator. Default: '\\n'\n" 20196 " -nofollow refuse to open symbolic links to database files\n" 20197 " -nullvalue TEXT set text string for NULL values. Default ''\n" 20198 " -pagecache SIZE N use N slots of SZ bytes each for page cache memory\n" 20199 " -quote set output mode to 'quote'\n" 20200 " -readonly open the database read-only\n" 20201 " -separator SEP set output column separator. Default: '|'\n" 20202 #ifdef SQLITE_ENABLE_SORTER_REFERENCES 20203 " -sorterref SIZE sorter references threshold size\n" 20204 #endif 20205 " -stats print memory stats before each finalize\n" 20206 " -table set output mode to 'table'\n" 20207 " -version show SQLite version\n" 20208 " -vfs NAME use NAME as the default VFS\n" 20209 #ifdef SQLITE_ENABLE_VFSTRACE 20210 " -vfstrace enable tracing of all VFS calls\n" 20211 #endif 20212 #ifdef SQLITE_HAVE_ZLIB 20213 " -zip open the file as a ZIP Archive\n" 20214 #endif 20215 ; 20216 static void usage(int showDetail){ 20217 utf8_printf(stderr, 20218 "Usage: %s [OPTIONS] FILENAME [SQL]\n" 20219 "FILENAME is the name of an SQLite database. A new database is created\n" 20220 "if the file does not previously exist.\n", Argv0); 20221 if( showDetail ){ 20222 utf8_printf(stderr, "OPTIONS include:\n%s", zOptions); 20223 }else{ 20224 raw_printf(stderr, "Use the -help option for additional information\n"); 20225 } 20226 exit(1); 20227 } 20228 20229 /* 20230 ** Internal check: Verify that the SQLite is uninitialized. Print a 20231 ** error message if it is initialized. 20232 */ 20233 static void verify_uninitialized(void){ 20234 if( sqlite3_config(-1)==SQLITE_MISUSE ){ 20235 utf8_printf(stdout, "WARNING: attempt to configure SQLite after" 20236 " initialization.\n"); 20237 } 20238 } 20239 20240 /* 20241 ** Initialize the state information in data 20242 */ 20243 static void main_init(ShellState *data) { 20244 memset(data, 0, sizeof(*data)); 20245 data->normalMode = data->cMode = data->mode = MODE_List; 20246 data->autoExplain = 1; 20247 memcpy(data->colSeparator,SEP_Column, 2); 20248 memcpy(data->rowSeparator,SEP_Row, 2); 20249 data->showHeader = 0; 20250 data->shellFlgs = SHFLG_Lookaside; 20251 verify_uninitialized(); 20252 sqlite3_config(SQLITE_CONFIG_URI, 1); 20253 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data); 20254 sqlite3_config(SQLITE_CONFIG_MULTITHREAD); 20255 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> "); 20256 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> "); 20257 } 20258 20259 /* 20260 ** Output text to the console in a font that attracts extra attention. 20261 */ 20262 #ifdef _WIN32 20263 static void printBold(const char *zText){ 20264 #if !SQLITE_OS_WINRT 20265 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE); 20266 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo; 20267 GetConsoleScreenBufferInfo(out, &defaultScreenInfo); 20268 SetConsoleTextAttribute(out, 20269 FOREGROUND_RED|FOREGROUND_INTENSITY 20270 ); 20271 #endif 20272 printf("%s", zText); 20273 #if !SQLITE_OS_WINRT 20274 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes); 20275 #endif 20276 } 20277 #else 20278 static void printBold(const char *zText){ 20279 printf("\033[1m%s\033[0m", zText); 20280 } 20281 #endif 20282 20283 /* 20284 ** Get the argument to an --option. Throw an error and die if no argument 20285 ** is available. 20286 */ 20287 static char *cmdline_option_value(int argc, char **argv, int i){ 20288 if( i==argc ){ 20289 utf8_printf(stderr, "%s: Error: missing argument to %s\n", 20290 argv[0], argv[argc-1]); 20291 exit(1); 20292 } 20293 return argv[i]; 20294 } 20295 20296 #ifndef SQLITE_SHELL_IS_UTF8 20297 # if (defined(_WIN32) || defined(WIN32)) && defined(_MSC_VER) 20298 # define SQLITE_SHELL_IS_UTF8 (0) 20299 # else 20300 # define SQLITE_SHELL_IS_UTF8 (1) 20301 # endif 20302 #endif 20303 20304 #if SQLITE_SHELL_IS_UTF8 20305 int SQLITE_CDECL main(int argc, char **argv){ 20306 #else 20307 int SQLITE_CDECL wmain(int argc, wchar_t **wargv){ 20308 char **argv; 20309 #endif 20310 char *zErrMsg = 0; 20311 ShellState data; 20312 const char *zInitFile = 0; 20313 int i; 20314 int rc = 0; 20315 int warnInmemoryDb = 0; 20316 int readStdin = 1; 20317 int nCmd = 0; 20318 char **azCmd = 0; 20319 const char *zVfs = 0; /* Value of -vfs command-line option */ 20320 #if !SQLITE_SHELL_IS_UTF8 20321 char **argvToFree = 0; 20322 int argcToFree = 0; 20323 #endif 20324 20325 setBinaryMode(stdin, 0); 20326 setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */ 20327 stdin_is_interactive = isatty(0); 20328 stdout_is_console = isatty(1); 20329 20330 #ifdef SQLITE_DEBUG 20331 registerOomSimulator(); 20332 #endif 20333 20334 #if !defined(_WIN32_WCE) 20335 if( getenv("SQLITE_DEBUG_BREAK") ){ 20336 if( isatty(0) && isatty(2) ){ 20337 fprintf(stderr, 20338 "attach debugger to process %d and press any key to continue.\n", 20339 GETPID()); 20340 fgetc(stdin); 20341 }else{ 20342 #if defined(_WIN32) || defined(WIN32) 20343 #if SQLITE_OS_WINRT 20344 __debugbreak(); 20345 #else 20346 DebugBreak(); 20347 #endif 20348 #elif defined(SIGTRAP) 20349 raise(SIGTRAP); 20350 #endif 20351 } 20352 } 20353 #endif 20354 20355 #if USE_SYSTEM_SQLITE+0!=1 20356 if( strncmp(sqlite3_sourceid(),SQLITE_SOURCE_ID,60)!=0 ){ 20357 utf8_printf(stderr, "SQLite header and source version mismatch\n%s\n%s\n", 20358 sqlite3_sourceid(), SQLITE_SOURCE_ID); 20359 exit(1); 20360 } 20361 #endif 20362 main_init(&data); 20363 20364 /* On Windows, we must translate command-line arguments into UTF-8. 20365 ** The SQLite memory allocator subsystem has to be enabled in order to 20366 ** do this. But we want to run an sqlite3_shutdown() afterwards so that 20367 ** subsequent sqlite3_config() calls will work. So copy all results into 20368 ** memory that does not come from the SQLite memory allocator. 20369 */ 20370 #if !SQLITE_SHELL_IS_UTF8 20371 sqlite3_initialize(); 20372 argvToFree = malloc(sizeof(argv[0])*argc*2); 20373 argcToFree = argc; 20374 argv = argvToFree + argc; 20375 if( argv==0 ) shell_out_of_memory(); 20376 for(i=0; i<argc; i++){ 20377 char *z = sqlite3_win32_unicode_to_utf8(wargv[i]); 20378 int n; 20379 if( z==0 ) shell_out_of_memory(); 20380 n = (int)strlen(z); 20381 argv[i] = malloc( n+1 ); 20382 if( argv[i]==0 ) shell_out_of_memory(); 20383 memcpy(argv[i], z, n+1); 20384 argvToFree[i] = argv[i]; 20385 sqlite3_free(z); 20386 } 20387 sqlite3_shutdown(); 20388 #endif 20389 20390 assert( argc>=1 && argv && argv[0] ); 20391 Argv0 = argv[0]; 20392 20393 /* Make sure we have a valid signal handler early, before anything 20394 ** else is done. 20395 */ 20396 #ifdef SIGINT 20397 signal(SIGINT, interrupt_handler); 20398 #elif (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE) 20399 SetConsoleCtrlHandler(ConsoleCtrlHandler, TRUE); 20400 #endif 20401 20402 #ifdef SQLITE_SHELL_DBNAME_PROC 20403 { 20404 /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name 20405 ** of a C-function that will provide the name of the database file. Use 20406 ** this compile-time option to embed this shell program in larger 20407 ** applications. */ 20408 extern void SQLITE_SHELL_DBNAME_PROC(const char**); 20409 SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename); 20410 warnInmemoryDb = 0; 20411 } 20412 #endif 20413 20414 /* Do an initial pass through the command-line argument to locate 20415 ** the name of the database file, the name of the initialization file, 20416 ** the size of the alternative malloc heap, 20417 ** and the first command to execute. 20418 */ 20419 verify_uninitialized(); 20420 for(i=1; i<argc; i++){ 20421 char *z; 20422 z = argv[i]; 20423 if( z[0]!='-' ){ 20424 if( data.zDbFilename==0 ){ 20425 data.zDbFilename = z; 20426 }else{ 20427 /* Excesss arguments are interpreted as SQL (or dot-commands) and 20428 ** mean that nothing is read from stdin */ 20429 readStdin = 0; 20430 nCmd++; 20431 azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd); 20432 if( azCmd==0 ) shell_out_of_memory(); 20433 azCmd[nCmd-1] = z; 20434 } 20435 } 20436 if( z[1]=='-' ) z++; 20437 if( strcmp(z,"-separator")==0 20438 || strcmp(z,"-nullvalue")==0 20439 || strcmp(z,"-newline")==0 20440 || strcmp(z,"-cmd")==0 20441 ){ 20442 (void)cmdline_option_value(argc, argv, ++i); 20443 }else if( strcmp(z,"-init")==0 ){ 20444 zInitFile = cmdline_option_value(argc, argv, ++i); 20445 }else if( strcmp(z,"-batch")==0 ){ 20446 /* Need to check for batch mode here to so we can avoid printing 20447 ** informational messages (like from process_sqliterc) before 20448 ** we do the actual processing of arguments later in a second pass. 20449 */ 20450 stdin_is_interactive = 0; 20451 }else if( strcmp(z,"-heap")==0 ){ 20452 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5) 20453 const char *zSize; 20454 sqlite3_int64 szHeap; 20455 20456 zSize = cmdline_option_value(argc, argv, ++i); 20457 szHeap = integerValue(zSize); 20458 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000; 20459 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64); 20460 #else 20461 (void)cmdline_option_value(argc, argv, ++i); 20462 #endif 20463 }else if( strcmp(z,"-pagecache")==0 ){ 20464 int n, sz; 20465 sz = (int)integerValue(cmdline_option_value(argc,argv,++i)); 20466 if( sz>70000 ) sz = 70000; 20467 if( sz<0 ) sz = 0; 20468 n = (int)integerValue(cmdline_option_value(argc,argv,++i)); 20469 sqlite3_config(SQLITE_CONFIG_PAGECACHE, 20470 (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n); 20471 data.shellFlgs |= SHFLG_Pagecache; 20472 }else if( strcmp(z,"-lookaside")==0 ){ 20473 int n, sz; 20474 sz = (int)integerValue(cmdline_option_value(argc,argv,++i)); 20475 if( sz<0 ) sz = 0; 20476 n = (int)integerValue(cmdline_option_value(argc,argv,++i)); 20477 if( n<0 ) n = 0; 20478 sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n); 20479 if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside; 20480 #ifdef SQLITE_ENABLE_VFSTRACE 20481 }else if( strcmp(z,"-vfstrace")==0 ){ 20482 extern int vfstrace_register( 20483 const char *zTraceName, 20484 const char *zOldVfsName, 20485 int (*xOut)(const char*,void*), 20486 void *pOutArg, 20487 int makeDefault 20488 ); 20489 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1); 20490 #endif 20491 #ifdef SQLITE_ENABLE_MULTIPLEX 20492 }else if( strcmp(z,"-multiplex")==0 ){ 20493 extern int sqlite3_multiple_initialize(const char*,int); 20494 sqlite3_multiplex_initialize(0, 1); 20495 #endif 20496 }else if( strcmp(z,"-mmap")==0 ){ 20497 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i)); 20498 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz); 20499 #ifdef SQLITE_ENABLE_SORTER_REFERENCES 20500 }else if( strcmp(z,"-sorterref")==0 ){ 20501 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i)); 20502 sqlite3_config(SQLITE_CONFIG_SORTERREF_SIZE, (int)sz); 20503 #endif 20504 }else if( strcmp(z,"-vfs")==0 ){ 20505 zVfs = cmdline_option_value(argc, argv, ++i); 20506 #ifdef SQLITE_HAVE_ZLIB 20507 }else if( strcmp(z,"-zip")==0 ){ 20508 data.openMode = SHELL_OPEN_ZIPFILE; 20509 #endif 20510 }else if( strcmp(z,"-append")==0 ){ 20511 data.openMode = SHELL_OPEN_APPENDVFS; 20512 #ifdef SQLITE_ENABLE_DESERIALIZE 20513 }else if( strcmp(z,"-deserialize")==0 ){ 20514 data.openMode = SHELL_OPEN_DESERIALIZE; 20515 }else if( strcmp(z,"-maxsize")==0 && i+1<argc ){ 20516 data.szMax = integerValue(argv[++i]); 20517 #endif 20518 }else if( strcmp(z,"-readonly")==0 ){ 20519 data.openMode = SHELL_OPEN_READONLY; 20520 }else if( strcmp(z,"-nofollow")==0 ){ 20521 data.openFlags = SQLITE_OPEN_NOFOLLOW; 20522 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) 20523 }else if( strncmp(z, "-A",2)==0 ){ 20524 /* All remaining command-line arguments are passed to the ".archive" 20525 ** command, so ignore them */ 20526 break; 20527 #endif 20528 }else if( strcmp(z, "-memtrace")==0 ){ 20529 sqlite3MemTraceActivate(stderr); 20530 } 20531 } 20532 verify_uninitialized(); 20533 20534 20535 #ifdef SQLITE_SHELL_INIT_PROC 20536 { 20537 /* If the SQLITE_SHELL_INIT_PROC macro is defined, then it is the name 20538 ** of a C-function that will perform initialization actions on SQLite that 20539 ** occur just before or after sqlite3_initialize(). Use this compile-time 20540 ** option to embed this shell program in larger applications. */ 20541 extern void SQLITE_SHELL_INIT_PROC(void); 20542 SQLITE_SHELL_INIT_PROC(); 20543 } 20544 #else 20545 /* All the sqlite3_config() calls have now been made. So it is safe 20546 ** to call sqlite3_initialize() and process any command line -vfs option. */ 20547 sqlite3_initialize(); 20548 #endif 20549 20550 if( zVfs ){ 20551 sqlite3_vfs *pVfs = sqlite3_vfs_find(zVfs); 20552 if( pVfs ){ 20553 sqlite3_vfs_register(pVfs, 1); 20554 }else{ 20555 utf8_printf(stderr, "no such VFS: \"%s\"\n", argv[i]); 20556 exit(1); 20557 } 20558 } 20559 20560 if( data.zDbFilename==0 ){ 20561 #ifndef SQLITE_OMIT_MEMORYDB 20562 data.zDbFilename = ":memory:"; 20563 warnInmemoryDb = argc==1; 20564 #else 20565 utf8_printf(stderr,"%s: Error: no database filename specified\n", Argv0); 20566 return 1; 20567 #endif 20568 } 20569 data.out = stdout; 20570 sqlite3_appendvfs_init(0,0,0); 20571 20572 /* Go ahead and open the database file if it already exists. If the 20573 ** file does not exist, delay opening it. This prevents empty database 20574 ** files from being created if a user mistypes the database name argument 20575 ** to the sqlite command-line tool. 20576 */ 20577 if( access(data.zDbFilename, 0)==0 ){ 20578 open_db(&data, 0); 20579 } 20580 20581 /* Process the initialization file if there is one. If no -init option 20582 ** is given on the command line, look for a file named ~/.sqliterc and 20583 ** try to process it. 20584 */ 20585 process_sqliterc(&data,zInitFile); 20586 20587 /* Make a second pass through the command-line argument and set 20588 ** options. This second pass is delayed until after the initialization 20589 ** file is processed so that the command-line arguments will override 20590 ** settings in the initialization file. 20591 */ 20592 for(i=1; i<argc; i++){ 20593 char *z = argv[i]; 20594 if( z[0]!='-' ) continue; 20595 if( z[1]=='-' ){ z++; } 20596 if( strcmp(z,"-init")==0 ){ 20597 i++; 20598 }else if( strcmp(z,"-html")==0 ){ 20599 data.mode = MODE_Html; 20600 }else if( strcmp(z,"-list")==0 ){ 20601 data.mode = MODE_List; 20602 }else if( strcmp(z,"-quote")==0 ){ 20603 data.mode = MODE_Quote; 20604 }else if( strcmp(z,"-line")==0 ){ 20605 data.mode = MODE_Line; 20606 }else if( strcmp(z,"-column")==0 ){ 20607 data.mode = MODE_Column; 20608 }else if( strcmp(z,"-json")==0 ){ 20609 data.mode = MODE_Json; 20610 }else if( strcmp(z,"-markdown")==0 ){ 20611 data.mode = MODE_Markdown; 20612 }else if( strcmp(z,"-table")==0 ){ 20613 data.mode = MODE_Table; 20614 }else if( strcmp(z,"-box")==0 ){ 20615 data.mode = MODE_Box; 20616 }else if( strcmp(z,"-csv")==0 ){ 20617 data.mode = MODE_Csv; 20618 memcpy(data.colSeparator,",",2); 20619 #ifdef SQLITE_HAVE_ZLIB 20620 }else if( strcmp(z,"-zip")==0 ){ 20621 data.openMode = SHELL_OPEN_ZIPFILE; 20622 #endif 20623 }else if( strcmp(z,"-append")==0 ){ 20624 data.openMode = SHELL_OPEN_APPENDVFS; 20625 #ifdef SQLITE_ENABLE_DESERIALIZE 20626 }else if( strcmp(z,"-deserialize")==0 ){ 20627 data.openMode = SHELL_OPEN_DESERIALIZE; 20628 }else if( strcmp(z,"-maxsize")==0 && i+1<argc ){ 20629 data.szMax = integerValue(argv[++i]); 20630 #endif 20631 }else if( strcmp(z,"-readonly")==0 ){ 20632 data.openMode = SHELL_OPEN_READONLY; 20633 }else if( strcmp(z,"-nofollow")==0 ){ 20634 data.openFlags |= SQLITE_OPEN_NOFOLLOW; 20635 }else if( strcmp(z,"-ascii")==0 ){ 20636 data.mode = MODE_Ascii; 20637 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, 20638 SEP_Unit); 20639 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, 20640 SEP_Record); 20641 }else if( strcmp(z,"-separator")==0 ){ 20642 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, 20643 "%s",cmdline_option_value(argc,argv,++i)); 20644 }else if( strcmp(z,"-newline")==0 ){ 20645 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, 20646 "%s",cmdline_option_value(argc,argv,++i)); 20647 }else if( strcmp(z,"-nullvalue")==0 ){ 20648 sqlite3_snprintf(sizeof(data.nullValue), data.nullValue, 20649 "%s",cmdline_option_value(argc,argv,++i)); 20650 }else if( strcmp(z,"-header")==0 ){ 20651 data.showHeader = 1; 20652 }else if( strcmp(z,"-noheader")==0 ){ 20653 data.showHeader = 0; 20654 }else if( strcmp(z,"-echo")==0 ){ 20655 ShellSetFlag(&data, SHFLG_Echo); 20656 }else if( strcmp(z,"-eqp")==0 ){ 20657 data.autoEQP = AUTOEQP_on; 20658 }else if( strcmp(z,"-eqpfull")==0 ){ 20659 data.autoEQP = AUTOEQP_full; 20660 }else if( strcmp(z,"-stats")==0 ){ 20661 data.statsOn = 1; 20662 }else if( strcmp(z,"-scanstats")==0 ){ 20663 data.scanstatsOn = 1; 20664 }else if( strcmp(z,"-backslash")==0 ){ 20665 /* Undocumented command-line option: -backslash 20666 ** Causes C-style backslash escapes to be evaluated in SQL statements 20667 ** prior to sending the SQL into SQLite. Useful for injecting 20668 ** crazy bytes in the middle of SQL statements for testing and debugging. 20669 */ 20670 ShellSetFlag(&data, SHFLG_Backslash); 20671 }else if( strcmp(z,"-bail")==0 ){ 20672 bail_on_error = 1; 20673 }else if( strcmp(z,"-version")==0 ){ 20674 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid()); 20675 return 0; 20676 }else if( strcmp(z,"-interactive")==0 ){ 20677 stdin_is_interactive = 1; 20678 }else if( strcmp(z,"-batch")==0 ){ 20679 stdin_is_interactive = 0; 20680 }else if( strcmp(z,"-heap")==0 ){ 20681 i++; 20682 }else if( strcmp(z,"-pagecache")==0 ){ 20683 i+=2; 20684 }else if( strcmp(z,"-lookaside")==0 ){ 20685 i+=2; 20686 }else if( strcmp(z,"-mmap")==0 ){ 20687 i++; 20688 }else if( strcmp(z,"-memtrace")==0 ){ 20689 i++; 20690 #ifdef SQLITE_ENABLE_SORTER_REFERENCES 20691 }else if( strcmp(z,"-sorterref")==0 ){ 20692 i++; 20693 #endif 20694 }else if( strcmp(z,"-vfs")==0 ){ 20695 i++; 20696 #ifdef SQLITE_ENABLE_VFSTRACE 20697 }else if( strcmp(z,"-vfstrace")==0 ){ 20698 i++; 20699 #endif 20700 #ifdef SQLITE_ENABLE_MULTIPLEX 20701 }else if( strcmp(z,"-multiplex")==0 ){ 20702 i++; 20703 #endif 20704 }else if( strcmp(z,"-help")==0 ){ 20705 usage(1); 20706 }else if( strcmp(z,"-cmd")==0 ){ 20707 /* Run commands that follow -cmd first and separately from commands 20708 ** that simply appear on the command-line. This seems goofy. It would 20709 ** be better if all commands ran in the order that they appear. But 20710 ** we retain the goofy behavior for historical compatibility. */ 20711 if( i==argc-1 ) break; 20712 z = cmdline_option_value(argc,argv,++i); 20713 if( z[0]=='.' ){ 20714 rc = do_meta_command(z, &data); 20715 if( rc && bail_on_error ) return rc==2 ? 0 : rc; 20716 }else{ 20717 open_db(&data, 0); 20718 rc = shell_exec(&data, z, &zErrMsg); 20719 if( zErrMsg!=0 ){ 20720 utf8_printf(stderr,"Error: %s\n", zErrMsg); 20721 if( bail_on_error ) return rc!=0 ? rc : 1; 20722 }else if( rc!=0 ){ 20723 utf8_printf(stderr,"Error: unable to process SQL \"%s\"\n", z); 20724 if( bail_on_error ) return rc; 20725 } 20726 } 20727 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) 20728 }else if( strncmp(z, "-A", 2)==0 ){ 20729 if( nCmd>0 ){ 20730 utf8_printf(stderr, "Error: cannot mix regular SQL or dot-commands" 20731 " with \"%s\"\n", z); 20732 return 1; 20733 } 20734 open_db(&data, OPEN_DB_ZIPFILE); 20735 if( z[2] ){ 20736 argv[i] = &z[2]; 20737 arDotCommand(&data, 1, argv+(i-1), argc-(i-1)); 20738 }else{ 20739 arDotCommand(&data, 1, argv+i, argc-i); 20740 } 20741 readStdin = 0; 20742 break; 20743 #endif 20744 }else{ 20745 utf8_printf(stderr,"%s: Error: unknown option: %s\n", Argv0, z); 20746 raw_printf(stderr,"Use -help for a list of options.\n"); 20747 return 1; 20748 } 20749 data.cMode = data.mode; 20750 } 20751 20752 if( !readStdin ){ 20753 /* Run all arguments that do not begin with '-' as if they were separate 20754 ** command-line inputs, except for the argToSkip argument which contains 20755 ** the database filename. 20756 */ 20757 for(i=0; i<nCmd; i++){ 20758 if( azCmd[i][0]=='.' ){ 20759 rc = do_meta_command(azCmd[i], &data); 20760 if( rc ) return rc==2 ? 0 : rc; 20761 }else{ 20762 open_db(&data, 0); 20763 rc = shell_exec(&data, azCmd[i], &zErrMsg); 20764 if( zErrMsg!=0 ){ 20765 utf8_printf(stderr,"Error: %s\n", zErrMsg); 20766 return rc!=0 ? rc : 1; 20767 }else if( rc!=0 ){ 20768 utf8_printf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]); 20769 return rc; 20770 } 20771 } 20772 } 20773 free(azCmd); 20774 }else{ 20775 /* Run commands received from standard input 20776 */ 20777 if( stdin_is_interactive ){ 20778 char *zHome; 20779 char *zHistory; 20780 int nHistory; 20781 printf( 20782 "SQLite version %s %.19s\n" /*extra-version-info*/ 20783 "Enter \".help\" for usage hints.\n", 20784 sqlite3_libversion(), sqlite3_sourceid() 20785 ); 20786 if( warnInmemoryDb ){ 20787 printf("Connected to a "); 20788 printBold("transient in-memory database"); 20789 printf(".\nUse \".open FILENAME\" to reopen on a " 20790 "persistent database.\n"); 20791 } 20792 zHistory = getenv("SQLITE_HISTORY"); 20793 if( zHistory ){ 20794 zHistory = strdup(zHistory); 20795 }else if( (zHome = find_home_dir(0))!=0 ){ 20796 nHistory = strlen30(zHome) + 20; 20797 if( (zHistory = malloc(nHistory))!=0 ){ 20798 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome); 20799 } 20800 } 20801 if( zHistory ){ shell_read_history(zHistory); } 20802 #if HAVE_READLINE || HAVE_EDITLINE 20803 rl_attempted_completion_function = readline_completion; 20804 #elif HAVE_LINENOISE 20805 linenoiseSetCompletionCallback(linenoise_completion); 20806 #endif 20807 data.in = 0; 20808 rc = process_input(&data); 20809 if( zHistory ){ 20810 shell_stifle_history(2000); 20811 shell_write_history(zHistory); 20812 free(zHistory); 20813 } 20814 }else{ 20815 data.in = stdin; 20816 rc = process_input(&data); 20817 } 20818 } 20819 set_table_name(&data, 0); 20820 if( data.db ){ 20821 session_close_all(&data); 20822 close_db(data.db); 20823 } 20824 sqlite3_free(data.zFreeOnClose); 20825 find_home_dir(1); 20826 output_reset(&data); 20827 data.doXdgOpen = 0; 20828 clearTempFile(&data); 20829 #if !SQLITE_SHELL_IS_UTF8 20830 for(i=0; i<argcToFree; i++) free(argvToFree[i]); 20831 free(argvToFree); 20832 #endif 20833 free(data.colWidth); 20834 /* Clear the global data structure so that valgrind will detect memory 20835 ** leaks */ 20836 memset(&data, 0, sizeof(data)); 20837 return rc; 20838 } 20839