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 for(i=n=0; zUtf[i]; i++){ 575 if( (zUtf[i]&0xc0)!=0x80 ){ 576 n++; 577 if( n==aw ){ 578 do{ i++; }while( (zUtf[i]&0xc0)==0x80 ); 579 break; 580 } 581 } 582 } 583 if( n>=aw ){ 584 utf8_printf(pOut, "%.*s", i, zUtf); 585 }else if( w<0 ){ 586 utf8_printf(pOut, "%*s%s", aw-n, "", zUtf); 587 }else{ 588 utf8_printf(pOut, "%s%*s", zUtf, aw-n, ""); 589 } 590 } 591 592 593 /* 594 ** Determines if a string is a number of not. 595 */ 596 static int isNumber(const char *z, int *realnum){ 597 if( *z=='-' || *z=='+' ) z++; 598 if( !IsDigit(*z) ){ 599 return 0; 600 } 601 z++; 602 if( realnum ) *realnum = 0; 603 while( IsDigit(*z) ){ z++; } 604 if( *z=='.' ){ 605 z++; 606 if( !IsDigit(*z) ) return 0; 607 while( IsDigit(*z) ){ z++; } 608 if( realnum ) *realnum = 1; 609 } 610 if( *z=='e' || *z=='E' ){ 611 z++; 612 if( *z=='+' || *z=='-' ) z++; 613 if( !IsDigit(*z) ) return 0; 614 while( IsDigit(*z) ){ z++; } 615 if( realnum ) *realnum = 1; 616 } 617 return *z==0; 618 } 619 620 /* 621 ** Compute a string length that is limited to what can be stored in 622 ** lower 30 bits of a 32-bit signed integer. 623 */ 624 static int strlen30(const char *z){ 625 const char *z2 = z; 626 while( *z2 ){ z2++; } 627 return 0x3fffffff & (int)(z2 - z); 628 } 629 630 /* 631 ** Return the length of a string in characters. Multibyte UTF8 characters 632 ** count as a single character. 633 */ 634 static int strlenChar(const char *z){ 635 int n = 0; 636 while( *z ){ 637 if( (0xc0&*(z++))!=0x80 ) n++; 638 } 639 return n; 640 } 641 642 /* 643 ** Return true if zFile does not exist or if it is not an ordinary file. 644 */ 645 #ifdef _WIN32 646 # define notNormalFile(X) 0 647 #else 648 static int notNormalFile(const char *zFile){ 649 struct stat x; 650 int rc; 651 memset(&x, 0, sizeof(x)); 652 rc = stat(zFile, &x); 653 return rc || !S_ISREG(x.st_mode); 654 } 655 #endif 656 657 /* 658 ** This routine reads a line of text from FILE in, stores 659 ** the text in memory obtained from malloc() and returns a pointer 660 ** to the text. NULL is returned at end of file, or if malloc() 661 ** fails. 662 ** 663 ** If zLine is not NULL then it is a malloced buffer returned from 664 ** a previous call to this routine that may be reused. 665 */ 666 static char *local_getline(char *zLine, FILE *in){ 667 int nLine = zLine==0 ? 0 : 100; 668 int n = 0; 669 670 while( 1 ){ 671 if( n+100>nLine ){ 672 nLine = nLine*2 + 100; 673 zLine = realloc(zLine, nLine); 674 if( zLine==0 ) shell_out_of_memory(); 675 } 676 if( fgets(&zLine[n], nLine - n, in)==0 ){ 677 if( n==0 ){ 678 free(zLine); 679 return 0; 680 } 681 zLine[n] = 0; 682 break; 683 } 684 while( zLine[n] ) n++; 685 if( n>0 && zLine[n-1]=='\n' ){ 686 n--; 687 if( n>0 && zLine[n-1]=='\r' ) n--; 688 zLine[n] = 0; 689 break; 690 } 691 } 692 #if defined(_WIN32) || defined(WIN32) 693 /* For interactive input on Windows systems, translate the 694 ** multi-byte characterset characters into UTF-8. */ 695 if( stdin_is_interactive && in==stdin ){ 696 char *zTrans = sqlite3_win32_mbcs_to_utf8_v2(zLine, 0); 697 if( zTrans ){ 698 int nTrans = strlen30(zTrans)+1; 699 if( nTrans>nLine ){ 700 zLine = realloc(zLine, nTrans); 701 if( zLine==0 ) shell_out_of_memory(); 702 } 703 memcpy(zLine, zTrans, nTrans); 704 sqlite3_free(zTrans); 705 } 706 } 707 #endif /* defined(_WIN32) || defined(WIN32) */ 708 return zLine; 709 } 710 711 /* 712 ** Retrieve a single line of input text. 713 ** 714 ** If in==0 then read from standard input and prompt before each line. 715 ** If isContinuation is true, then a continuation prompt is appropriate. 716 ** If isContinuation is zero, then the main prompt should be used. 717 ** 718 ** If zPrior is not NULL then it is a buffer from a prior call to this 719 ** routine that can be reused. 720 ** 721 ** The result is stored in space obtained from malloc() and must either 722 ** be freed by the caller or else passed back into this routine via the 723 ** zPrior argument for reuse. 724 */ 725 static char *one_input_line(FILE *in, char *zPrior, int isContinuation){ 726 char *zPrompt; 727 char *zResult; 728 if( in!=0 ){ 729 zResult = local_getline(zPrior, in); 730 }else{ 731 zPrompt = isContinuation ? continuePrompt : mainPrompt; 732 #if SHELL_USE_LOCAL_GETLINE 733 printf("%s", zPrompt); 734 fflush(stdout); 735 zResult = local_getline(zPrior, stdin); 736 #else 737 free(zPrior); 738 zResult = shell_readline(zPrompt); 739 if( zResult && *zResult ) shell_add_history(zResult); 740 #endif 741 } 742 return zResult; 743 } 744 745 746 /* 747 ** Return the value of a hexadecimal digit. Return -1 if the input 748 ** is not a hex digit. 749 */ 750 static int hexDigitValue(char c){ 751 if( c>='0' && c<='9' ) return c - '0'; 752 if( c>='a' && c<='f' ) return c - 'a' + 10; 753 if( c>='A' && c<='F' ) return c - 'A' + 10; 754 return -1; 755 } 756 757 /* 758 ** Interpret zArg as an integer value, possibly with suffixes. 759 */ 760 static sqlite3_int64 integerValue(const char *zArg){ 761 sqlite3_int64 v = 0; 762 static const struct { char *zSuffix; int iMult; } aMult[] = { 763 { "KiB", 1024 }, 764 { "MiB", 1024*1024 }, 765 { "GiB", 1024*1024*1024 }, 766 { "KB", 1000 }, 767 { "MB", 1000000 }, 768 { "GB", 1000000000 }, 769 { "K", 1000 }, 770 { "M", 1000000 }, 771 { "G", 1000000000 }, 772 }; 773 int i; 774 int isNeg = 0; 775 if( zArg[0]=='-' ){ 776 isNeg = 1; 777 zArg++; 778 }else if( zArg[0]=='+' ){ 779 zArg++; 780 } 781 if( zArg[0]=='0' && zArg[1]=='x' ){ 782 int x; 783 zArg += 2; 784 while( (x = hexDigitValue(zArg[0]))>=0 ){ 785 v = (v<<4) + x; 786 zArg++; 787 } 788 }else{ 789 while( IsDigit(zArg[0]) ){ 790 v = v*10 + zArg[0] - '0'; 791 zArg++; 792 } 793 } 794 for(i=0; i<ArraySize(aMult); i++){ 795 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){ 796 v *= aMult[i].iMult; 797 break; 798 } 799 } 800 return isNeg? -v : v; 801 } 802 803 /* 804 ** A variable length string to which one can append text. 805 */ 806 typedef struct ShellText ShellText; 807 struct ShellText { 808 char *z; 809 int n; 810 int nAlloc; 811 }; 812 813 /* 814 ** Initialize and destroy a ShellText object 815 */ 816 static void initText(ShellText *p){ 817 memset(p, 0, sizeof(*p)); 818 } 819 static void freeText(ShellText *p){ 820 free(p->z); 821 initText(p); 822 } 823 824 /* zIn is either a pointer to a NULL-terminated string in memory obtained 825 ** from malloc(), or a NULL pointer. The string pointed to by zAppend is 826 ** added to zIn, and the result returned in memory obtained from malloc(). 827 ** zIn, if it was not NULL, is freed. 828 ** 829 ** If the third argument, quote, is not '\0', then it is used as a 830 ** quote character for zAppend. 831 */ 832 static void appendText(ShellText *p, char const *zAppend, char quote){ 833 int len; 834 int i; 835 int nAppend = strlen30(zAppend); 836 837 len = nAppend+p->n+1; 838 if( quote ){ 839 len += 2; 840 for(i=0; i<nAppend; i++){ 841 if( zAppend[i]==quote ) len++; 842 } 843 } 844 845 if( p->n+len>=p->nAlloc ){ 846 p->nAlloc = p->nAlloc*2 + len + 20; 847 p->z = realloc(p->z, p->nAlloc); 848 if( p->z==0 ) shell_out_of_memory(); 849 } 850 851 if( quote ){ 852 char *zCsr = p->z+p->n; 853 *zCsr++ = quote; 854 for(i=0; i<nAppend; i++){ 855 *zCsr++ = zAppend[i]; 856 if( zAppend[i]==quote ) *zCsr++ = quote; 857 } 858 *zCsr++ = quote; 859 p->n = (int)(zCsr - p->z); 860 *zCsr = '\0'; 861 }else{ 862 memcpy(p->z+p->n, zAppend, nAppend); 863 p->n += nAppend; 864 p->z[p->n] = '\0'; 865 } 866 } 867 868 /* 869 ** Attempt to determine if identifier zName needs to be quoted, either 870 ** because it contains non-alphanumeric characters, or because it is an 871 ** SQLite keyword. Be conservative in this estimate: When in doubt assume 872 ** that quoting is required. 873 ** 874 ** Return '"' if quoting is required. Return 0 if no quoting is required. 875 */ 876 static char quoteChar(const char *zName){ 877 int i; 878 if( !isalpha((unsigned char)zName[0]) && zName[0]!='_' ) return '"'; 879 for(i=0; zName[i]; i++){ 880 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ) return '"'; 881 } 882 return sqlite3_keyword_check(zName, i) ? '"' : 0; 883 } 884 885 /* 886 ** Construct a fake object name and column list to describe the structure 887 ** of the view, virtual table, or table valued function zSchema.zName. 888 */ 889 static char *shellFakeSchema( 890 sqlite3 *db, /* The database connection containing the vtab */ 891 const char *zSchema, /* Schema of the database holding the vtab */ 892 const char *zName /* The name of the virtual table */ 893 ){ 894 sqlite3_stmt *pStmt = 0; 895 char *zSql; 896 ShellText s; 897 char cQuote; 898 char *zDiv = "("; 899 int nRow = 0; 900 901 zSql = sqlite3_mprintf("PRAGMA \"%w\".table_info=%Q;", 902 zSchema ? zSchema : "main", zName); 903 sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); 904 sqlite3_free(zSql); 905 initText(&s); 906 if( zSchema ){ 907 cQuote = quoteChar(zSchema); 908 if( cQuote && sqlite3_stricmp(zSchema,"temp")==0 ) cQuote = 0; 909 appendText(&s, zSchema, cQuote); 910 appendText(&s, ".", 0); 911 } 912 cQuote = quoteChar(zName); 913 appendText(&s, zName, cQuote); 914 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 915 const char *zCol = (const char*)sqlite3_column_text(pStmt, 1); 916 nRow++; 917 appendText(&s, zDiv, 0); 918 zDiv = ","; 919 cQuote = quoteChar(zCol); 920 appendText(&s, zCol, cQuote); 921 } 922 appendText(&s, ")", 0); 923 sqlite3_finalize(pStmt); 924 if( nRow==0 ){ 925 freeText(&s); 926 s.z = 0; 927 } 928 return s.z; 929 } 930 931 /* 932 ** SQL function: shell_module_schema(X) 933 ** 934 ** Return a fake schema for the table-valued function or eponymous virtual 935 ** table X. 936 */ 937 static void shellModuleSchema( 938 sqlite3_context *pCtx, 939 int nVal, 940 sqlite3_value **apVal 941 ){ 942 const char *zName = (const char*)sqlite3_value_text(apVal[0]); 943 char *zFake = shellFakeSchema(sqlite3_context_db_handle(pCtx), 0, zName); 944 UNUSED_PARAMETER(nVal); 945 if( zFake ){ 946 sqlite3_result_text(pCtx, sqlite3_mprintf("/* %s */", zFake), 947 -1, sqlite3_free); 948 free(zFake); 949 } 950 } 951 952 /* 953 ** SQL function: shell_add_schema(S,X) 954 ** 955 ** Add the schema name X to the CREATE statement in S and return the result. 956 ** Examples: 957 ** 958 ** CREATE TABLE t1(x) -> CREATE TABLE xyz.t1(x); 959 ** 960 ** Also works on 961 ** 962 ** CREATE INDEX 963 ** CREATE UNIQUE INDEX 964 ** CREATE VIEW 965 ** CREATE TRIGGER 966 ** CREATE VIRTUAL TABLE 967 ** 968 ** This UDF is used by the .schema command to insert the schema name of 969 ** attached databases into the middle of the sqlite_schema.sql field. 970 */ 971 static void shellAddSchemaName( 972 sqlite3_context *pCtx, 973 int nVal, 974 sqlite3_value **apVal 975 ){ 976 static const char *aPrefix[] = { 977 "TABLE", 978 "INDEX", 979 "UNIQUE INDEX", 980 "VIEW", 981 "TRIGGER", 982 "VIRTUAL TABLE" 983 }; 984 int i = 0; 985 const char *zIn = (const char*)sqlite3_value_text(apVal[0]); 986 const char *zSchema = (const char*)sqlite3_value_text(apVal[1]); 987 const char *zName = (const char*)sqlite3_value_text(apVal[2]); 988 sqlite3 *db = sqlite3_context_db_handle(pCtx); 989 UNUSED_PARAMETER(nVal); 990 if( zIn!=0 && strncmp(zIn, "CREATE ", 7)==0 ){ 991 for(i=0; i<(int)(sizeof(aPrefix)/sizeof(aPrefix[0])); i++){ 992 int n = strlen30(aPrefix[i]); 993 if( strncmp(zIn+7, aPrefix[i], n)==0 && zIn[n+7]==' ' ){ 994 char *z = 0; 995 char *zFake = 0; 996 if( zSchema ){ 997 char cQuote = quoteChar(zSchema); 998 if( cQuote && sqlite3_stricmp(zSchema,"temp")!=0 ){ 999 z = sqlite3_mprintf("%.*s \"%w\".%s", n+7, zIn, zSchema, zIn+n+8); 1000 }else{ 1001 z = sqlite3_mprintf("%.*s %s.%s", n+7, zIn, zSchema, zIn+n+8); 1002 } 1003 } 1004 if( zName 1005 && aPrefix[i][0]=='V' 1006 && (zFake = shellFakeSchema(db, zSchema, zName))!=0 1007 ){ 1008 if( z==0 ){ 1009 z = sqlite3_mprintf("%s\n/* %s */", zIn, zFake); 1010 }else{ 1011 z = sqlite3_mprintf("%z\n/* %s */", z, zFake); 1012 } 1013 free(zFake); 1014 } 1015 if( z ){ 1016 sqlite3_result_text(pCtx, z, -1, sqlite3_free); 1017 return; 1018 } 1019 } 1020 } 1021 } 1022 sqlite3_result_value(pCtx, apVal[0]); 1023 } 1024 1025 /* 1026 ** The source code for several run-time loadable extensions is inserted 1027 ** below by the ../tool/mkshellc.tcl script. Before processing that included 1028 ** code, we need to override some macros to make the included program code 1029 ** work here in the middle of this regular program. 1030 */ 1031 #define SQLITE_EXTENSION_INIT1 1032 #define SQLITE_EXTENSION_INIT2(X) (void)(X) 1033 1034 #if defined(_WIN32) && defined(_MSC_VER) 1035 /************************* Begin test_windirent.h ******************/ 1036 /* 1037 ** 2015 November 30 1038 ** 1039 ** The author disclaims copyright to this source code. In place of 1040 ** a legal notice, here is a blessing: 1041 ** 1042 ** May you do good and not evil. 1043 ** May you find forgiveness for yourself and forgive others. 1044 ** May you share freely, never taking more than you give. 1045 ** 1046 ************************************************************************* 1047 ** This file contains declarations for most of the opendir() family of 1048 ** POSIX functions on Win32 using the MSVCRT. 1049 */ 1050 1051 #if defined(_WIN32) && defined(_MSC_VER) && !defined(SQLITE_WINDIRENT_H) 1052 #define SQLITE_WINDIRENT_H 1053 1054 /* 1055 ** We need several data types from the Windows SDK header. 1056 */ 1057 1058 #ifndef WIN32_LEAN_AND_MEAN 1059 #define WIN32_LEAN_AND_MEAN 1060 #endif 1061 1062 #include "windows.h" 1063 1064 /* 1065 ** We need several support functions from the SQLite core. 1066 */ 1067 1068 /* #include "sqlite3.h" */ 1069 1070 /* 1071 ** We need several things from the ANSI and MSVCRT headers. 1072 */ 1073 1074 #include <stdio.h> 1075 #include <stdlib.h> 1076 #include <errno.h> 1077 #include <io.h> 1078 #include <limits.h> 1079 #include <sys/types.h> 1080 #include <sys/stat.h> 1081 1082 /* 1083 ** We may need several defines that should have been in "sys/stat.h". 1084 */ 1085 1086 #ifndef S_ISREG 1087 #define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG) 1088 #endif 1089 1090 #ifndef S_ISDIR 1091 #define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) 1092 #endif 1093 1094 #ifndef S_ISLNK 1095 #define S_ISLNK(mode) (0) 1096 #endif 1097 1098 /* 1099 ** We may need to provide the "mode_t" type. 1100 */ 1101 1102 #ifndef MODE_T_DEFINED 1103 #define MODE_T_DEFINED 1104 typedef unsigned short mode_t; 1105 #endif 1106 1107 /* 1108 ** We may need to provide the "ino_t" type. 1109 */ 1110 1111 #ifndef INO_T_DEFINED 1112 #define INO_T_DEFINED 1113 typedef unsigned short ino_t; 1114 #endif 1115 1116 /* 1117 ** We need to define "NAME_MAX" if it was not present in "limits.h". 1118 */ 1119 1120 #ifndef NAME_MAX 1121 # ifdef FILENAME_MAX 1122 # define NAME_MAX (FILENAME_MAX) 1123 # else 1124 # define NAME_MAX (260) 1125 # endif 1126 #endif 1127 1128 /* 1129 ** We need to define "NULL_INTPTR_T" and "BAD_INTPTR_T". 1130 */ 1131 1132 #ifndef NULL_INTPTR_T 1133 # define NULL_INTPTR_T ((intptr_t)(0)) 1134 #endif 1135 1136 #ifndef BAD_INTPTR_T 1137 # define BAD_INTPTR_T ((intptr_t)(-1)) 1138 #endif 1139 1140 /* 1141 ** We need to provide the necessary structures and related types. 1142 */ 1143 1144 #ifndef DIRENT_DEFINED 1145 #define DIRENT_DEFINED 1146 typedef struct DIRENT DIRENT; 1147 typedef DIRENT *LPDIRENT; 1148 struct DIRENT { 1149 ino_t d_ino; /* Sequence number, do not use. */ 1150 unsigned d_attributes; /* Win32 file attributes. */ 1151 char d_name[NAME_MAX + 1]; /* Name within the directory. */ 1152 }; 1153 #endif 1154 1155 #ifndef DIR_DEFINED 1156 #define DIR_DEFINED 1157 typedef struct DIR DIR; 1158 typedef DIR *LPDIR; 1159 struct DIR { 1160 intptr_t d_handle; /* Value returned by "_findfirst". */ 1161 DIRENT d_first; /* DIRENT constructed based on "_findfirst". */ 1162 DIRENT d_next; /* DIRENT constructed based on "_findnext". */ 1163 }; 1164 #endif 1165 1166 /* 1167 ** Provide a macro, for use by the implementation, to determine if a 1168 ** particular directory entry should be skipped over when searching for 1169 ** the next directory entry that should be returned by the readdir() or 1170 ** readdir_r() functions. 1171 */ 1172 1173 #ifndef is_filtered 1174 # define is_filtered(a) ((((a).attrib)&_A_HIDDEN) || (((a).attrib)&_A_SYSTEM)) 1175 #endif 1176 1177 /* 1178 ** Provide the function prototype for the POSIX compatiable getenv() 1179 ** function. This function is not thread-safe. 1180 */ 1181 1182 extern const char *windirent_getenv(const char *name); 1183 1184 /* 1185 ** Finally, we can provide the function prototypes for the opendir(), 1186 ** readdir(), readdir_r(), and closedir() POSIX functions. 1187 */ 1188 1189 extern LPDIR opendir(const char *dirname); 1190 extern LPDIRENT readdir(LPDIR dirp); 1191 extern INT readdir_r(LPDIR dirp, LPDIRENT entry, LPDIRENT *result); 1192 extern INT closedir(LPDIR dirp); 1193 1194 #endif /* defined(WIN32) && defined(_MSC_VER) */ 1195 1196 /************************* End test_windirent.h ********************/ 1197 /************************* Begin test_windirent.c ******************/ 1198 /* 1199 ** 2015 November 30 1200 ** 1201 ** The author disclaims copyright to this source code. In place of 1202 ** a legal notice, here is a blessing: 1203 ** 1204 ** May you do good and not evil. 1205 ** May you find forgiveness for yourself and forgive others. 1206 ** May you share freely, never taking more than you give. 1207 ** 1208 ************************************************************************* 1209 ** This file contains code to implement most of the opendir() family of 1210 ** POSIX functions on Win32 using the MSVCRT. 1211 */ 1212 1213 #if defined(_WIN32) && defined(_MSC_VER) 1214 /* #include "test_windirent.h" */ 1215 1216 /* 1217 ** Implementation of the POSIX getenv() function using the Win32 API. 1218 ** This function is not thread-safe. 1219 */ 1220 const char *windirent_getenv( 1221 const char *name 1222 ){ 1223 static char value[32768]; /* Maximum length, per MSDN */ 1224 DWORD dwSize = sizeof(value) / sizeof(char); /* Size in chars */ 1225 DWORD dwRet; /* Value returned by GetEnvironmentVariableA() */ 1226 1227 memset(value, 0, sizeof(value)); 1228 dwRet = GetEnvironmentVariableA(name, value, dwSize); 1229 if( dwRet==0 || dwRet>dwSize ){ 1230 /* 1231 ** The function call to GetEnvironmentVariableA() failed -OR- 1232 ** the buffer is not large enough. Either way, return NULL. 1233 */ 1234 return 0; 1235 }else{ 1236 /* 1237 ** The function call to GetEnvironmentVariableA() succeeded 1238 ** -AND- the buffer contains the entire value. 1239 */ 1240 return value; 1241 } 1242 } 1243 1244 /* 1245 ** Implementation of the POSIX opendir() function using the MSVCRT. 1246 */ 1247 LPDIR opendir( 1248 const char *dirname 1249 ){ 1250 struct _finddata_t data; 1251 LPDIR dirp = (LPDIR)sqlite3_malloc(sizeof(DIR)); 1252 SIZE_T namesize = sizeof(data.name) / sizeof(data.name[0]); 1253 1254 if( dirp==NULL ) return NULL; 1255 memset(dirp, 0, sizeof(DIR)); 1256 1257 /* TODO: Remove this if Unix-style root paths are not used. */ 1258 if( sqlite3_stricmp(dirname, "/")==0 ){ 1259 dirname = windirent_getenv("SystemDrive"); 1260 } 1261 1262 memset(&data, 0, sizeof(struct _finddata_t)); 1263 _snprintf(data.name, namesize, "%s\\*", dirname); 1264 dirp->d_handle = _findfirst(data.name, &data); 1265 1266 if( dirp->d_handle==BAD_INTPTR_T ){ 1267 closedir(dirp); 1268 return NULL; 1269 } 1270 1271 /* TODO: Remove this block to allow hidden and/or system files. */ 1272 if( is_filtered(data) ){ 1273 next: 1274 1275 memset(&data, 0, sizeof(struct _finddata_t)); 1276 if( _findnext(dirp->d_handle, &data)==-1 ){ 1277 closedir(dirp); 1278 return NULL; 1279 } 1280 1281 /* TODO: Remove this block to allow hidden and/or system files. */ 1282 if( is_filtered(data) ) goto next; 1283 } 1284 1285 dirp->d_first.d_attributes = data.attrib; 1286 strncpy(dirp->d_first.d_name, data.name, NAME_MAX); 1287 dirp->d_first.d_name[NAME_MAX] = '\0'; 1288 1289 return dirp; 1290 } 1291 1292 /* 1293 ** Implementation of the POSIX readdir() function using the MSVCRT. 1294 */ 1295 LPDIRENT readdir( 1296 LPDIR dirp 1297 ){ 1298 struct _finddata_t data; 1299 1300 if( dirp==NULL ) return NULL; 1301 1302 if( dirp->d_first.d_ino==0 ){ 1303 dirp->d_first.d_ino++; 1304 dirp->d_next.d_ino++; 1305 1306 return &dirp->d_first; 1307 } 1308 1309 next: 1310 1311 memset(&data, 0, sizeof(struct _finddata_t)); 1312 if( _findnext(dirp->d_handle, &data)==-1 ) return NULL; 1313 1314 /* TODO: Remove this block to allow hidden and/or system files. */ 1315 if( is_filtered(data) ) goto next; 1316 1317 dirp->d_next.d_ino++; 1318 dirp->d_next.d_attributes = data.attrib; 1319 strncpy(dirp->d_next.d_name, data.name, NAME_MAX); 1320 dirp->d_next.d_name[NAME_MAX] = '\0'; 1321 1322 return &dirp->d_next; 1323 } 1324 1325 /* 1326 ** Implementation of the POSIX readdir_r() function using the MSVCRT. 1327 */ 1328 INT readdir_r( 1329 LPDIR dirp, 1330 LPDIRENT entry, 1331 LPDIRENT *result 1332 ){ 1333 struct _finddata_t data; 1334 1335 if( dirp==NULL ) return EBADF; 1336 1337 if( dirp->d_first.d_ino==0 ){ 1338 dirp->d_first.d_ino++; 1339 dirp->d_next.d_ino++; 1340 1341 entry->d_ino = dirp->d_first.d_ino; 1342 entry->d_attributes = dirp->d_first.d_attributes; 1343 strncpy(entry->d_name, dirp->d_first.d_name, NAME_MAX); 1344 entry->d_name[NAME_MAX] = '\0'; 1345 1346 *result = entry; 1347 return 0; 1348 } 1349 1350 next: 1351 1352 memset(&data, 0, sizeof(struct _finddata_t)); 1353 if( _findnext(dirp->d_handle, &data)==-1 ){ 1354 *result = NULL; 1355 return ENOENT; 1356 } 1357 1358 /* TODO: Remove this block to allow hidden and/or system files. */ 1359 if( is_filtered(data) ) goto next; 1360 1361 entry->d_ino = (ino_t)-1; /* not available */ 1362 entry->d_attributes = data.attrib; 1363 strncpy(entry->d_name, data.name, NAME_MAX); 1364 entry->d_name[NAME_MAX] = '\0'; 1365 1366 *result = entry; 1367 return 0; 1368 } 1369 1370 /* 1371 ** Implementation of the POSIX closedir() function using the MSVCRT. 1372 */ 1373 INT closedir( 1374 LPDIR dirp 1375 ){ 1376 INT result = 0; 1377 1378 if( dirp==NULL ) return EINVAL; 1379 1380 if( dirp->d_handle!=NULL_INTPTR_T && dirp->d_handle!=BAD_INTPTR_T ){ 1381 result = _findclose(dirp->d_handle); 1382 } 1383 1384 sqlite3_free(dirp); 1385 return result; 1386 } 1387 1388 #endif /* defined(WIN32) && defined(_MSC_VER) */ 1389 1390 /************************* End test_windirent.c ********************/ 1391 #define dirent DIRENT 1392 #endif 1393 /************************* Begin ../ext/misc/shathree.c ******************/ 1394 /* 1395 ** 2017-03-08 1396 ** 1397 ** The author disclaims copyright to this source code. In place of 1398 ** a legal notice, here is a blessing: 1399 ** 1400 ** May you do good and not evil. 1401 ** May you find forgiveness for yourself and forgive others. 1402 ** May you share freely, never taking more than you give. 1403 ** 1404 ****************************************************************************** 1405 ** 1406 ** This SQLite extension implements functions that compute SHA3 hashes. 1407 ** Two SQL functions are implemented: 1408 ** 1409 ** sha3(X,SIZE) 1410 ** sha3_query(Y,SIZE) 1411 ** 1412 ** The sha3(X) function computes the SHA3 hash of the input X, or NULL if 1413 ** X is NULL. 1414 ** 1415 ** The sha3_query(Y) function evalutes all queries in the SQL statements of Y 1416 ** and returns a hash of their results. 1417 ** 1418 ** The SIZE argument is optional. If omitted, the SHA3-256 hash algorithm 1419 ** is used. If SIZE is included it must be one of the integers 224, 256, 1420 ** 384, or 512, to determine SHA3 hash variant that is computed. 1421 */ 1422 /* #include "sqlite3ext.h" */ 1423 SQLITE_EXTENSION_INIT1 1424 #include <assert.h> 1425 #include <string.h> 1426 #include <stdarg.h> 1427 /* typedef sqlite3_uint64 u64; */ 1428 1429 /****************************************************************************** 1430 ** The Hash Engine 1431 */ 1432 /* 1433 ** Macros to determine whether the machine is big or little endian, 1434 ** and whether or not that determination is run-time or compile-time. 1435 ** 1436 ** For best performance, an attempt is made to guess at the byte-order 1437 ** using C-preprocessor macros. If that is unsuccessful, or if 1438 ** -DSHA3_BYTEORDER=0 is set, then byte-order is determined 1439 ** at run-time. 1440 */ 1441 #ifndef SHA3_BYTEORDER 1442 # if defined(i386) || defined(__i386__) || defined(_M_IX86) || \ 1443 defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || \ 1444 defined(_M_AMD64) || defined(_M_ARM) || defined(__x86) || \ 1445 defined(__arm__) 1446 # define SHA3_BYTEORDER 1234 1447 # elif defined(sparc) || defined(__ppc__) 1448 # define SHA3_BYTEORDER 4321 1449 # else 1450 # define SHA3_BYTEORDER 0 1451 # endif 1452 #endif 1453 1454 1455 /* 1456 ** State structure for a SHA3 hash in progress 1457 */ 1458 typedef struct SHA3Context SHA3Context; 1459 struct SHA3Context { 1460 union { 1461 u64 s[25]; /* Keccak state. 5x5 lines of 64 bits each */ 1462 unsigned char x[1600]; /* ... or 1600 bytes */ 1463 } u; 1464 unsigned nRate; /* Bytes of input accepted per Keccak iteration */ 1465 unsigned nLoaded; /* Input bytes loaded into u.x[] so far this cycle */ 1466 unsigned ixMask; /* Insert next input into u.x[nLoaded^ixMask]. */ 1467 }; 1468 1469 /* 1470 ** A single step of the Keccak mixing function for a 1600-bit state 1471 */ 1472 static void KeccakF1600Step(SHA3Context *p){ 1473 int i; 1474 u64 b0, b1, b2, b3, b4; 1475 u64 c0, c1, c2, c3, c4; 1476 u64 d0, d1, d2, d3, d4; 1477 static const u64 RC[] = { 1478 0x0000000000000001ULL, 0x0000000000008082ULL, 1479 0x800000000000808aULL, 0x8000000080008000ULL, 1480 0x000000000000808bULL, 0x0000000080000001ULL, 1481 0x8000000080008081ULL, 0x8000000000008009ULL, 1482 0x000000000000008aULL, 0x0000000000000088ULL, 1483 0x0000000080008009ULL, 0x000000008000000aULL, 1484 0x000000008000808bULL, 0x800000000000008bULL, 1485 0x8000000000008089ULL, 0x8000000000008003ULL, 1486 0x8000000000008002ULL, 0x8000000000000080ULL, 1487 0x000000000000800aULL, 0x800000008000000aULL, 1488 0x8000000080008081ULL, 0x8000000000008080ULL, 1489 0x0000000080000001ULL, 0x8000000080008008ULL 1490 }; 1491 # define a00 (p->u.s[0]) 1492 # define a01 (p->u.s[1]) 1493 # define a02 (p->u.s[2]) 1494 # define a03 (p->u.s[3]) 1495 # define a04 (p->u.s[4]) 1496 # define a10 (p->u.s[5]) 1497 # define a11 (p->u.s[6]) 1498 # define a12 (p->u.s[7]) 1499 # define a13 (p->u.s[8]) 1500 # define a14 (p->u.s[9]) 1501 # define a20 (p->u.s[10]) 1502 # define a21 (p->u.s[11]) 1503 # define a22 (p->u.s[12]) 1504 # define a23 (p->u.s[13]) 1505 # define a24 (p->u.s[14]) 1506 # define a30 (p->u.s[15]) 1507 # define a31 (p->u.s[16]) 1508 # define a32 (p->u.s[17]) 1509 # define a33 (p->u.s[18]) 1510 # define a34 (p->u.s[19]) 1511 # define a40 (p->u.s[20]) 1512 # define a41 (p->u.s[21]) 1513 # define a42 (p->u.s[22]) 1514 # define a43 (p->u.s[23]) 1515 # define a44 (p->u.s[24]) 1516 # define ROL64(a,x) ((a<<x)|(a>>(64-x))) 1517 1518 for(i=0; i<24; i+=4){ 1519 c0 = a00^a10^a20^a30^a40; 1520 c1 = a01^a11^a21^a31^a41; 1521 c2 = a02^a12^a22^a32^a42; 1522 c3 = a03^a13^a23^a33^a43; 1523 c4 = a04^a14^a24^a34^a44; 1524 d0 = c4^ROL64(c1, 1); 1525 d1 = c0^ROL64(c2, 1); 1526 d2 = c1^ROL64(c3, 1); 1527 d3 = c2^ROL64(c4, 1); 1528 d4 = c3^ROL64(c0, 1); 1529 1530 b0 = (a00^d0); 1531 b1 = ROL64((a11^d1), 44); 1532 b2 = ROL64((a22^d2), 43); 1533 b3 = ROL64((a33^d3), 21); 1534 b4 = ROL64((a44^d4), 14); 1535 a00 = b0 ^((~b1)& b2 ); 1536 a00 ^= RC[i]; 1537 a11 = b1 ^((~b2)& b3 ); 1538 a22 = b2 ^((~b3)& b4 ); 1539 a33 = b3 ^((~b4)& b0 ); 1540 a44 = b4 ^((~b0)& b1 ); 1541 1542 b2 = ROL64((a20^d0), 3); 1543 b3 = ROL64((a31^d1), 45); 1544 b4 = ROL64((a42^d2), 61); 1545 b0 = ROL64((a03^d3), 28); 1546 b1 = ROL64((a14^d4), 20); 1547 a20 = b0 ^((~b1)& b2 ); 1548 a31 = b1 ^((~b2)& b3 ); 1549 a42 = b2 ^((~b3)& b4 ); 1550 a03 = b3 ^((~b4)& b0 ); 1551 a14 = b4 ^((~b0)& b1 ); 1552 1553 b4 = ROL64((a40^d0), 18); 1554 b0 = ROL64((a01^d1), 1); 1555 b1 = ROL64((a12^d2), 6); 1556 b2 = ROL64((a23^d3), 25); 1557 b3 = ROL64((a34^d4), 8); 1558 a40 = b0 ^((~b1)& b2 ); 1559 a01 = b1 ^((~b2)& b3 ); 1560 a12 = b2 ^((~b3)& b4 ); 1561 a23 = b3 ^((~b4)& b0 ); 1562 a34 = b4 ^((~b0)& b1 ); 1563 1564 b1 = ROL64((a10^d0), 36); 1565 b2 = ROL64((a21^d1), 10); 1566 b3 = ROL64((a32^d2), 15); 1567 b4 = ROL64((a43^d3), 56); 1568 b0 = ROL64((a04^d4), 27); 1569 a10 = b0 ^((~b1)& b2 ); 1570 a21 = b1 ^((~b2)& b3 ); 1571 a32 = b2 ^((~b3)& b4 ); 1572 a43 = b3 ^((~b4)& b0 ); 1573 a04 = b4 ^((~b0)& b1 ); 1574 1575 b3 = ROL64((a30^d0), 41); 1576 b4 = ROL64((a41^d1), 2); 1577 b0 = ROL64((a02^d2), 62); 1578 b1 = ROL64((a13^d3), 55); 1579 b2 = ROL64((a24^d4), 39); 1580 a30 = b0 ^((~b1)& b2 ); 1581 a41 = b1 ^((~b2)& b3 ); 1582 a02 = b2 ^((~b3)& b4 ); 1583 a13 = b3 ^((~b4)& b0 ); 1584 a24 = b4 ^((~b0)& b1 ); 1585 1586 c0 = a00^a20^a40^a10^a30; 1587 c1 = a11^a31^a01^a21^a41; 1588 c2 = a22^a42^a12^a32^a02; 1589 c3 = a33^a03^a23^a43^a13; 1590 c4 = a44^a14^a34^a04^a24; 1591 d0 = c4^ROL64(c1, 1); 1592 d1 = c0^ROL64(c2, 1); 1593 d2 = c1^ROL64(c3, 1); 1594 d3 = c2^ROL64(c4, 1); 1595 d4 = c3^ROL64(c0, 1); 1596 1597 b0 = (a00^d0); 1598 b1 = ROL64((a31^d1), 44); 1599 b2 = ROL64((a12^d2), 43); 1600 b3 = ROL64((a43^d3), 21); 1601 b4 = ROL64((a24^d4), 14); 1602 a00 = b0 ^((~b1)& b2 ); 1603 a00 ^= RC[i+1]; 1604 a31 = b1 ^((~b2)& b3 ); 1605 a12 = b2 ^((~b3)& b4 ); 1606 a43 = b3 ^((~b4)& b0 ); 1607 a24 = b4 ^((~b0)& b1 ); 1608 1609 b2 = ROL64((a40^d0), 3); 1610 b3 = ROL64((a21^d1), 45); 1611 b4 = ROL64((a02^d2), 61); 1612 b0 = ROL64((a33^d3), 28); 1613 b1 = ROL64((a14^d4), 20); 1614 a40 = b0 ^((~b1)& b2 ); 1615 a21 = b1 ^((~b2)& b3 ); 1616 a02 = b2 ^((~b3)& b4 ); 1617 a33 = b3 ^((~b4)& b0 ); 1618 a14 = b4 ^((~b0)& b1 ); 1619 1620 b4 = ROL64((a30^d0), 18); 1621 b0 = ROL64((a11^d1), 1); 1622 b1 = ROL64((a42^d2), 6); 1623 b2 = ROL64((a23^d3), 25); 1624 b3 = ROL64((a04^d4), 8); 1625 a30 = b0 ^((~b1)& b2 ); 1626 a11 = b1 ^((~b2)& b3 ); 1627 a42 = b2 ^((~b3)& b4 ); 1628 a23 = b3 ^((~b4)& b0 ); 1629 a04 = b4 ^((~b0)& b1 ); 1630 1631 b1 = ROL64((a20^d0), 36); 1632 b2 = ROL64((a01^d1), 10); 1633 b3 = ROL64((a32^d2), 15); 1634 b4 = ROL64((a13^d3), 56); 1635 b0 = ROL64((a44^d4), 27); 1636 a20 = b0 ^((~b1)& b2 ); 1637 a01 = b1 ^((~b2)& b3 ); 1638 a32 = b2 ^((~b3)& b4 ); 1639 a13 = b3 ^((~b4)& b0 ); 1640 a44 = b4 ^((~b0)& b1 ); 1641 1642 b3 = ROL64((a10^d0), 41); 1643 b4 = ROL64((a41^d1), 2); 1644 b0 = ROL64((a22^d2), 62); 1645 b1 = ROL64((a03^d3), 55); 1646 b2 = ROL64((a34^d4), 39); 1647 a10 = b0 ^((~b1)& b2 ); 1648 a41 = b1 ^((~b2)& b3 ); 1649 a22 = b2 ^((~b3)& b4 ); 1650 a03 = b3 ^((~b4)& b0 ); 1651 a34 = b4 ^((~b0)& b1 ); 1652 1653 c0 = a00^a40^a30^a20^a10; 1654 c1 = a31^a21^a11^a01^a41; 1655 c2 = a12^a02^a42^a32^a22; 1656 c3 = a43^a33^a23^a13^a03; 1657 c4 = a24^a14^a04^a44^a34; 1658 d0 = c4^ROL64(c1, 1); 1659 d1 = c0^ROL64(c2, 1); 1660 d2 = c1^ROL64(c3, 1); 1661 d3 = c2^ROL64(c4, 1); 1662 d4 = c3^ROL64(c0, 1); 1663 1664 b0 = (a00^d0); 1665 b1 = ROL64((a21^d1), 44); 1666 b2 = ROL64((a42^d2), 43); 1667 b3 = ROL64((a13^d3), 21); 1668 b4 = ROL64((a34^d4), 14); 1669 a00 = b0 ^((~b1)& b2 ); 1670 a00 ^= RC[i+2]; 1671 a21 = b1 ^((~b2)& b3 ); 1672 a42 = b2 ^((~b3)& b4 ); 1673 a13 = b3 ^((~b4)& b0 ); 1674 a34 = b4 ^((~b0)& b1 ); 1675 1676 b2 = ROL64((a30^d0), 3); 1677 b3 = ROL64((a01^d1), 45); 1678 b4 = ROL64((a22^d2), 61); 1679 b0 = ROL64((a43^d3), 28); 1680 b1 = ROL64((a14^d4), 20); 1681 a30 = b0 ^((~b1)& b2 ); 1682 a01 = b1 ^((~b2)& b3 ); 1683 a22 = b2 ^((~b3)& b4 ); 1684 a43 = b3 ^((~b4)& b0 ); 1685 a14 = b4 ^((~b0)& b1 ); 1686 1687 b4 = ROL64((a10^d0), 18); 1688 b0 = ROL64((a31^d1), 1); 1689 b1 = ROL64((a02^d2), 6); 1690 b2 = ROL64((a23^d3), 25); 1691 b3 = ROL64((a44^d4), 8); 1692 a10 = b0 ^((~b1)& b2 ); 1693 a31 = b1 ^((~b2)& b3 ); 1694 a02 = b2 ^((~b3)& b4 ); 1695 a23 = b3 ^((~b4)& b0 ); 1696 a44 = b4 ^((~b0)& b1 ); 1697 1698 b1 = ROL64((a40^d0), 36); 1699 b2 = ROL64((a11^d1), 10); 1700 b3 = ROL64((a32^d2), 15); 1701 b4 = ROL64((a03^d3), 56); 1702 b0 = ROL64((a24^d4), 27); 1703 a40 = b0 ^((~b1)& b2 ); 1704 a11 = b1 ^((~b2)& b3 ); 1705 a32 = b2 ^((~b3)& b4 ); 1706 a03 = b3 ^((~b4)& b0 ); 1707 a24 = b4 ^((~b0)& b1 ); 1708 1709 b3 = ROL64((a20^d0), 41); 1710 b4 = ROL64((a41^d1), 2); 1711 b0 = ROL64((a12^d2), 62); 1712 b1 = ROL64((a33^d3), 55); 1713 b2 = ROL64((a04^d4), 39); 1714 a20 = b0 ^((~b1)& b2 ); 1715 a41 = b1 ^((~b2)& b3 ); 1716 a12 = b2 ^((~b3)& b4 ); 1717 a33 = b3 ^((~b4)& b0 ); 1718 a04 = b4 ^((~b0)& b1 ); 1719 1720 c0 = a00^a30^a10^a40^a20; 1721 c1 = a21^a01^a31^a11^a41; 1722 c2 = a42^a22^a02^a32^a12; 1723 c3 = a13^a43^a23^a03^a33; 1724 c4 = a34^a14^a44^a24^a04; 1725 d0 = c4^ROL64(c1, 1); 1726 d1 = c0^ROL64(c2, 1); 1727 d2 = c1^ROL64(c3, 1); 1728 d3 = c2^ROL64(c4, 1); 1729 d4 = c3^ROL64(c0, 1); 1730 1731 b0 = (a00^d0); 1732 b1 = ROL64((a01^d1), 44); 1733 b2 = ROL64((a02^d2), 43); 1734 b3 = ROL64((a03^d3), 21); 1735 b4 = ROL64((a04^d4), 14); 1736 a00 = b0 ^((~b1)& b2 ); 1737 a00 ^= RC[i+3]; 1738 a01 = b1 ^((~b2)& b3 ); 1739 a02 = b2 ^((~b3)& b4 ); 1740 a03 = b3 ^((~b4)& b0 ); 1741 a04 = b4 ^((~b0)& b1 ); 1742 1743 b2 = ROL64((a10^d0), 3); 1744 b3 = ROL64((a11^d1), 45); 1745 b4 = ROL64((a12^d2), 61); 1746 b0 = ROL64((a13^d3), 28); 1747 b1 = ROL64((a14^d4), 20); 1748 a10 = b0 ^((~b1)& b2 ); 1749 a11 = b1 ^((~b2)& b3 ); 1750 a12 = b2 ^((~b3)& b4 ); 1751 a13 = b3 ^((~b4)& b0 ); 1752 a14 = b4 ^((~b0)& b1 ); 1753 1754 b4 = ROL64((a20^d0), 18); 1755 b0 = ROL64((a21^d1), 1); 1756 b1 = ROL64((a22^d2), 6); 1757 b2 = ROL64((a23^d3), 25); 1758 b3 = ROL64((a24^d4), 8); 1759 a20 = b0 ^((~b1)& b2 ); 1760 a21 = b1 ^((~b2)& b3 ); 1761 a22 = b2 ^((~b3)& b4 ); 1762 a23 = b3 ^((~b4)& b0 ); 1763 a24 = b4 ^((~b0)& b1 ); 1764 1765 b1 = ROL64((a30^d0), 36); 1766 b2 = ROL64((a31^d1), 10); 1767 b3 = ROL64((a32^d2), 15); 1768 b4 = ROL64((a33^d3), 56); 1769 b0 = ROL64((a34^d4), 27); 1770 a30 = b0 ^((~b1)& b2 ); 1771 a31 = b1 ^((~b2)& b3 ); 1772 a32 = b2 ^((~b3)& b4 ); 1773 a33 = b3 ^((~b4)& b0 ); 1774 a34 = b4 ^((~b0)& b1 ); 1775 1776 b3 = ROL64((a40^d0), 41); 1777 b4 = ROL64((a41^d1), 2); 1778 b0 = ROL64((a42^d2), 62); 1779 b1 = ROL64((a43^d3), 55); 1780 b2 = ROL64((a44^d4), 39); 1781 a40 = b0 ^((~b1)& b2 ); 1782 a41 = b1 ^((~b2)& b3 ); 1783 a42 = b2 ^((~b3)& b4 ); 1784 a43 = b3 ^((~b4)& b0 ); 1785 a44 = b4 ^((~b0)& b1 ); 1786 } 1787 } 1788 1789 /* 1790 ** Initialize a new hash. iSize determines the size of the hash 1791 ** in bits and should be one of 224, 256, 384, or 512. Or iSize 1792 ** can be zero to use the default hash size of 256 bits. 1793 */ 1794 static void SHA3Init(SHA3Context *p, int iSize){ 1795 memset(p, 0, sizeof(*p)); 1796 if( iSize>=128 && iSize<=512 ){ 1797 p->nRate = (1600 - ((iSize + 31)&~31)*2)/8; 1798 }else{ 1799 p->nRate = (1600 - 2*256)/8; 1800 } 1801 #if SHA3_BYTEORDER==1234 1802 /* Known to be little-endian at compile-time. No-op */ 1803 #elif SHA3_BYTEORDER==4321 1804 p->ixMask = 7; /* Big-endian */ 1805 #else 1806 { 1807 static unsigned int one = 1; 1808 if( 1==*(unsigned char*)&one ){ 1809 /* Little endian. No byte swapping. */ 1810 p->ixMask = 0; 1811 }else{ 1812 /* Big endian. Byte swap. */ 1813 p->ixMask = 7; 1814 } 1815 } 1816 #endif 1817 } 1818 1819 /* 1820 ** Make consecutive calls to the SHA3Update function to add new content 1821 ** to the hash 1822 */ 1823 static void SHA3Update( 1824 SHA3Context *p, 1825 const unsigned char *aData, 1826 unsigned int nData 1827 ){ 1828 unsigned int i = 0; 1829 #if SHA3_BYTEORDER==1234 1830 if( (p->nLoaded % 8)==0 && ((aData - (const unsigned char*)0)&7)==0 ){ 1831 for(; i+7<nData; i+=8){ 1832 p->u.s[p->nLoaded/8] ^= *(u64*)&aData[i]; 1833 p->nLoaded += 8; 1834 if( p->nLoaded>=p->nRate ){ 1835 KeccakF1600Step(p); 1836 p->nLoaded = 0; 1837 } 1838 } 1839 } 1840 #endif 1841 for(; i<nData; i++){ 1842 #if SHA3_BYTEORDER==1234 1843 p->u.x[p->nLoaded] ^= aData[i]; 1844 #elif SHA3_BYTEORDER==4321 1845 p->u.x[p->nLoaded^0x07] ^= aData[i]; 1846 #else 1847 p->u.x[p->nLoaded^p->ixMask] ^= aData[i]; 1848 #endif 1849 p->nLoaded++; 1850 if( p->nLoaded==p->nRate ){ 1851 KeccakF1600Step(p); 1852 p->nLoaded = 0; 1853 } 1854 } 1855 } 1856 1857 /* 1858 ** After all content has been added, invoke SHA3Final() to compute 1859 ** the final hash. The function returns a pointer to the binary 1860 ** hash value. 1861 */ 1862 static unsigned char *SHA3Final(SHA3Context *p){ 1863 unsigned int i; 1864 if( p->nLoaded==p->nRate-1 ){ 1865 const unsigned char c1 = 0x86; 1866 SHA3Update(p, &c1, 1); 1867 }else{ 1868 const unsigned char c2 = 0x06; 1869 const unsigned char c3 = 0x80; 1870 SHA3Update(p, &c2, 1); 1871 p->nLoaded = p->nRate - 1; 1872 SHA3Update(p, &c3, 1); 1873 } 1874 for(i=0; i<p->nRate; i++){ 1875 p->u.x[i+p->nRate] = p->u.x[i^p->ixMask]; 1876 } 1877 return &p->u.x[p->nRate]; 1878 } 1879 /* End of the hashing logic 1880 *****************************************************************************/ 1881 1882 /* 1883 ** Implementation of the sha3(X,SIZE) function. 1884 ** 1885 ** Return a BLOB which is the SIZE-bit SHA3 hash of X. The default 1886 ** size is 256. If X is a BLOB, it is hashed as is. 1887 ** For all other non-NULL types of input, X is converted into a UTF-8 string 1888 ** and the string is hashed without the trailing 0x00 terminator. The hash 1889 ** of a NULL value is NULL. 1890 */ 1891 static void sha3Func( 1892 sqlite3_context *context, 1893 int argc, 1894 sqlite3_value **argv 1895 ){ 1896 SHA3Context cx; 1897 int eType = sqlite3_value_type(argv[0]); 1898 int nByte = sqlite3_value_bytes(argv[0]); 1899 int iSize; 1900 if( argc==1 ){ 1901 iSize = 256; 1902 }else{ 1903 iSize = sqlite3_value_int(argv[1]); 1904 if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){ 1905 sqlite3_result_error(context, "SHA3 size should be one of: 224 256 " 1906 "384 512", -1); 1907 return; 1908 } 1909 } 1910 if( eType==SQLITE_NULL ) return; 1911 SHA3Init(&cx, iSize); 1912 if( eType==SQLITE_BLOB ){ 1913 SHA3Update(&cx, sqlite3_value_blob(argv[0]), nByte); 1914 }else{ 1915 SHA3Update(&cx, sqlite3_value_text(argv[0]), nByte); 1916 } 1917 sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT); 1918 } 1919 1920 /* Compute a string using sqlite3_vsnprintf() with a maximum length 1921 ** of 50 bytes and add it to the hash. 1922 */ 1923 static void hash_step_vformat( 1924 SHA3Context *p, /* Add content to this context */ 1925 const char *zFormat, 1926 ... 1927 ){ 1928 va_list ap; 1929 int n; 1930 char zBuf[50]; 1931 va_start(ap, zFormat); 1932 sqlite3_vsnprintf(sizeof(zBuf),zBuf,zFormat,ap); 1933 va_end(ap); 1934 n = (int)strlen(zBuf); 1935 SHA3Update(p, (unsigned char*)zBuf, n); 1936 } 1937 1938 /* 1939 ** Implementation of the sha3_query(SQL,SIZE) function. 1940 ** 1941 ** This function compiles and runs the SQL statement(s) given in the 1942 ** argument. The results are hashed using a SIZE-bit SHA3. The default 1943 ** size is 256. 1944 ** 1945 ** The format of the byte stream that is hashed is summarized as follows: 1946 ** 1947 ** S<n>:<sql> 1948 ** R 1949 ** N 1950 ** I<int> 1951 ** F<ieee-float> 1952 ** B<size>:<bytes> 1953 ** T<size>:<text> 1954 ** 1955 ** <sql> is the original SQL text for each statement run and <n> is 1956 ** the size of that text. The SQL text is UTF-8. A single R character 1957 ** occurs before the start of each row. N means a NULL value. 1958 ** I mean an 8-byte little-endian integer <int>. F is a floating point 1959 ** number with an 8-byte little-endian IEEE floating point value <ieee-float>. 1960 ** B means blobs of <size> bytes. T means text rendered as <size> 1961 ** bytes of UTF-8. The <n> and <size> values are expressed as an ASCII 1962 ** text integers. 1963 ** 1964 ** For each SQL statement in the X input, there is one S segment. Each 1965 ** S segment is followed by zero or more R segments, one for each row in the 1966 ** result set. After each R, there are one or more N, I, F, B, or T segments, 1967 ** one for each column in the result set. Segments are concatentated directly 1968 ** with no delimiters of any kind. 1969 */ 1970 static void sha3QueryFunc( 1971 sqlite3_context *context, 1972 int argc, 1973 sqlite3_value **argv 1974 ){ 1975 sqlite3 *db = sqlite3_context_db_handle(context); 1976 const char *zSql = (const char*)sqlite3_value_text(argv[0]); 1977 sqlite3_stmt *pStmt = 0; 1978 int nCol; /* Number of columns in the result set */ 1979 int i; /* Loop counter */ 1980 int rc; 1981 int n; 1982 const char *z; 1983 SHA3Context cx; 1984 int iSize; 1985 1986 if( argc==1 ){ 1987 iSize = 256; 1988 }else{ 1989 iSize = sqlite3_value_int(argv[1]); 1990 if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){ 1991 sqlite3_result_error(context, "SHA3 size should be one of: 224 256 " 1992 "384 512", -1); 1993 return; 1994 } 1995 } 1996 if( zSql==0 ) return; 1997 SHA3Init(&cx, iSize); 1998 while( zSql[0] ){ 1999 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zSql); 2000 if( rc ){ 2001 char *zMsg = sqlite3_mprintf("error SQL statement [%s]: %s", 2002 zSql, sqlite3_errmsg(db)); 2003 sqlite3_finalize(pStmt); 2004 sqlite3_result_error(context, zMsg, -1); 2005 sqlite3_free(zMsg); 2006 return; 2007 } 2008 if( !sqlite3_stmt_readonly(pStmt) ){ 2009 char *zMsg = sqlite3_mprintf("non-query: [%s]", sqlite3_sql(pStmt)); 2010 sqlite3_finalize(pStmt); 2011 sqlite3_result_error(context, zMsg, -1); 2012 sqlite3_free(zMsg); 2013 return; 2014 } 2015 nCol = sqlite3_column_count(pStmt); 2016 z = sqlite3_sql(pStmt); 2017 if( z ){ 2018 n = (int)strlen(z); 2019 hash_step_vformat(&cx,"S%d:",n); 2020 SHA3Update(&cx,(unsigned char*)z,n); 2021 } 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 /************************* Begin ../ext/misc/series.c ******************/ 5319 /* 5320 ** 2015-08-18 5321 ** 5322 ** The author disclaims copyright to this source code. In place of 5323 ** a legal notice, here is a blessing: 5324 ** 5325 ** May you do good and not evil. 5326 ** May you find forgiveness for yourself and forgive others. 5327 ** May you share freely, never taking more than you give. 5328 ** 5329 ************************************************************************* 5330 ** 5331 ** This file demonstrates how to create a table-valued-function using 5332 ** a virtual table. This demo implements the generate_series() function 5333 ** which gives similar results to the eponymous function in PostgreSQL. 5334 ** Examples: 5335 ** 5336 ** SELECT * FROM generate_series(0,100,5); 5337 ** 5338 ** The query above returns integers from 0 through 100 counting by steps 5339 ** of 5. 5340 ** 5341 ** SELECT * FROM generate_series(0,100); 5342 ** 5343 ** Integers from 0 through 100 with a step size of 1. 5344 ** 5345 ** SELECT * FROM generate_series(20) LIMIT 10; 5346 ** 5347 ** Integers 20 through 29. 5348 ** 5349 ** HOW IT WORKS 5350 ** 5351 ** The generate_series "function" is really a virtual table with the 5352 ** following schema: 5353 ** 5354 ** CREATE TABLE generate_series( 5355 ** value, 5356 ** start HIDDEN, 5357 ** stop HIDDEN, 5358 ** step HIDDEN 5359 ** ); 5360 ** 5361 ** Function arguments in queries against this virtual table are translated 5362 ** into equality constraints against successive hidden columns. In other 5363 ** words, the following pairs of queries are equivalent to each other: 5364 ** 5365 ** SELECT * FROM generate_series(0,100,5); 5366 ** SELECT * FROM generate_series WHERE start=0 AND stop=100 AND step=5; 5367 ** 5368 ** SELECT * FROM generate_series(0,100); 5369 ** SELECT * FROM generate_series WHERE start=0 AND stop=100; 5370 ** 5371 ** SELECT * FROM generate_series(20) LIMIT 10; 5372 ** SELECT * FROM generate_series WHERE start=20 LIMIT 10; 5373 ** 5374 ** The generate_series virtual table implementation leaves the xCreate method 5375 ** set to NULL. This means that it is not possible to do a CREATE VIRTUAL 5376 ** TABLE command with "generate_series" as the USING argument. Instead, there 5377 ** is a single generate_series virtual table that is always available without 5378 ** having to be created first. 5379 ** 5380 ** The xBestIndex method looks for equality constraints against the hidden 5381 ** start, stop, and step columns, and if present, it uses those constraints 5382 ** to bound the sequence of generated values. If the equality constraints 5383 ** are missing, it uses 0 for start, 4294967295 for stop, and 1 for step. 5384 ** xBestIndex returns a small cost when both start and stop are available, 5385 ** and a very large cost if either start or stop are unavailable. This 5386 ** encourages the query planner to order joins such that the bounds of the 5387 ** series are well-defined. 5388 */ 5389 /* #include "sqlite3ext.h" */ 5390 SQLITE_EXTENSION_INIT1 5391 #include <assert.h> 5392 #include <string.h> 5393 5394 #ifndef SQLITE_OMIT_VIRTUALTABLE 5395 5396 5397 /* series_cursor is a subclass of sqlite3_vtab_cursor which will 5398 ** serve as the underlying representation of a cursor that scans 5399 ** over rows of the result 5400 */ 5401 typedef struct series_cursor series_cursor; 5402 struct series_cursor { 5403 sqlite3_vtab_cursor base; /* Base class - must be first */ 5404 int isDesc; /* True to count down rather than up */ 5405 sqlite3_int64 iRowid; /* The rowid */ 5406 sqlite3_int64 iValue; /* Current value ("value") */ 5407 sqlite3_int64 mnValue; /* Mimimum value ("start") */ 5408 sqlite3_int64 mxValue; /* Maximum value ("stop") */ 5409 sqlite3_int64 iStep; /* Increment ("step") */ 5410 }; 5411 5412 /* 5413 ** The seriesConnect() method is invoked to create a new 5414 ** series_vtab that describes the generate_series virtual table. 5415 ** 5416 ** Think of this routine as the constructor for series_vtab objects. 5417 ** 5418 ** All this routine needs to do is: 5419 ** 5420 ** (1) Allocate the series_vtab object and initialize all fields. 5421 ** 5422 ** (2) Tell SQLite (via the sqlite3_declare_vtab() interface) what the 5423 ** result set of queries against generate_series will look like. 5424 */ 5425 static int seriesConnect( 5426 sqlite3 *db, 5427 void *pUnused, 5428 int argcUnused, const char *const*argvUnused, 5429 sqlite3_vtab **ppVtab, 5430 char **pzErrUnused 5431 ){ 5432 sqlite3_vtab *pNew; 5433 int rc; 5434 5435 /* Column numbers */ 5436 #define SERIES_COLUMN_VALUE 0 5437 #define SERIES_COLUMN_START 1 5438 #define SERIES_COLUMN_STOP 2 5439 #define SERIES_COLUMN_STEP 3 5440 5441 (void)pUnused; 5442 (void)argcUnused; 5443 (void)argvUnused; 5444 (void)pzErrUnused; 5445 rc = sqlite3_declare_vtab(db, 5446 "CREATE TABLE x(value,start hidden,stop hidden,step hidden)"); 5447 if( rc==SQLITE_OK ){ 5448 pNew = *ppVtab = sqlite3_malloc( sizeof(*pNew) ); 5449 if( pNew==0 ) return SQLITE_NOMEM; 5450 memset(pNew, 0, sizeof(*pNew)); 5451 sqlite3_vtab_config(db, SQLITE_VTAB_INNOCUOUS); 5452 } 5453 return rc; 5454 } 5455 5456 /* 5457 ** This method is the destructor for series_cursor objects. 5458 */ 5459 static int seriesDisconnect(sqlite3_vtab *pVtab){ 5460 sqlite3_free(pVtab); 5461 return SQLITE_OK; 5462 } 5463 5464 /* 5465 ** Constructor for a new series_cursor object. 5466 */ 5467 static int seriesOpen(sqlite3_vtab *pUnused, sqlite3_vtab_cursor **ppCursor){ 5468 series_cursor *pCur; 5469 (void)pUnused; 5470 pCur = sqlite3_malloc( sizeof(*pCur) ); 5471 if( pCur==0 ) return SQLITE_NOMEM; 5472 memset(pCur, 0, sizeof(*pCur)); 5473 *ppCursor = &pCur->base; 5474 return SQLITE_OK; 5475 } 5476 5477 /* 5478 ** Destructor for a series_cursor. 5479 */ 5480 static int seriesClose(sqlite3_vtab_cursor *cur){ 5481 sqlite3_free(cur); 5482 return SQLITE_OK; 5483 } 5484 5485 5486 /* 5487 ** Advance a series_cursor to its next row of output. 5488 */ 5489 static int seriesNext(sqlite3_vtab_cursor *cur){ 5490 series_cursor *pCur = (series_cursor*)cur; 5491 if( pCur->isDesc ){ 5492 pCur->iValue -= pCur->iStep; 5493 }else{ 5494 pCur->iValue += pCur->iStep; 5495 } 5496 pCur->iRowid++; 5497 return SQLITE_OK; 5498 } 5499 5500 /* 5501 ** Return values of columns for the row at which the series_cursor 5502 ** is currently pointing. 5503 */ 5504 static int seriesColumn( 5505 sqlite3_vtab_cursor *cur, /* The cursor */ 5506 sqlite3_context *ctx, /* First argument to sqlite3_result_...() */ 5507 int i /* Which column to return */ 5508 ){ 5509 series_cursor *pCur = (series_cursor*)cur; 5510 sqlite3_int64 x = 0; 5511 switch( i ){ 5512 case SERIES_COLUMN_START: x = pCur->mnValue; break; 5513 case SERIES_COLUMN_STOP: x = pCur->mxValue; break; 5514 case SERIES_COLUMN_STEP: x = pCur->iStep; break; 5515 default: x = pCur->iValue; break; 5516 } 5517 sqlite3_result_int64(ctx, x); 5518 return SQLITE_OK; 5519 } 5520 5521 /* 5522 ** Return the rowid for the current row. In this implementation, the 5523 ** first row returned is assigned rowid value 1, and each subsequent 5524 ** row a value 1 more than that of the previous. 5525 */ 5526 static int seriesRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ 5527 series_cursor *pCur = (series_cursor*)cur; 5528 *pRowid = pCur->iRowid; 5529 return SQLITE_OK; 5530 } 5531 5532 /* 5533 ** Return TRUE if the cursor has been moved off of the last 5534 ** row of output. 5535 */ 5536 static int seriesEof(sqlite3_vtab_cursor *cur){ 5537 series_cursor *pCur = (series_cursor*)cur; 5538 if( pCur->isDesc ){ 5539 return pCur->iValue < pCur->mnValue; 5540 }else{ 5541 return pCur->iValue > pCur->mxValue; 5542 } 5543 } 5544 5545 /* True to cause run-time checking of the start=, stop=, and/or step= 5546 ** parameters. The only reason to do this is for testing the 5547 ** constraint checking logic for virtual tables in the SQLite core. 5548 */ 5549 #ifndef SQLITE_SERIES_CONSTRAINT_VERIFY 5550 # define SQLITE_SERIES_CONSTRAINT_VERIFY 0 5551 #endif 5552 5553 /* 5554 ** This method is called to "rewind" the series_cursor object back 5555 ** to the first row of output. This method is always called at least 5556 ** once prior to any call to seriesColumn() or seriesRowid() or 5557 ** seriesEof(). 5558 ** 5559 ** The query plan selected by seriesBestIndex is passed in the idxNum 5560 ** parameter. (idxStr is not used in this implementation.) idxNum 5561 ** is a bitmask showing which constraints are available: 5562 ** 5563 ** 1: start=VALUE 5564 ** 2: stop=VALUE 5565 ** 4: step=VALUE 5566 ** 5567 ** Also, if bit 8 is set, that means that the series should be output 5568 ** in descending order rather than in ascending order. 5569 ** 5570 ** This routine should initialize the cursor and position it so that it 5571 ** is pointing at the first row, or pointing off the end of the table 5572 ** (so that seriesEof() will return true) if the table is empty. 5573 */ 5574 static int seriesFilter( 5575 sqlite3_vtab_cursor *pVtabCursor, 5576 int idxNum, const char *idxStrUnused, 5577 int argc, sqlite3_value **argv 5578 ){ 5579 series_cursor *pCur = (series_cursor *)pVtabCursor; 5580 int i = 0; 5581 (void)idxStrUnused; 5582 if( idxNum & 1 ){ 5583 pCur->mnValue = sqlite3_value_int64(argv[i++]); 5584 }else{ 5585 pCur->mnValue = 0; 5586 } 5587 if( idxNum & 2 ){ 5588 pCur->mxValue = sqlite3_value_int64(argv[i++]); 5589 }else{ 5590 pCur->mxValue = 0xffffffff; 5591 } 5592 if( idxNum & 4 ){ 5593 pCur->iStep = sqlite3_value_int64(argv[i++]); 5594 if( pCur->iStep<1 ) pCur->iStep = 1; 5595 }else{ 5596 pCur->iStep = 1; 5597 } 5598 for(i=0; i<argc; i++){ 5599 if( sqlite3_value_type(argv[i])==SQLITE_NULL ){ 5600 /* If any of the constraints have a NULL value, then return no rows. 5601 ** See ticket https://www.sqlite.org/src/info/fac496b61722daf2 */ 5602 pCur->mnValue = 1; 5603 pCur->mxValue = 0; 5604 break; 5605 } 5606 } 5607 if( idxNum & 8 ){ 5608 pCur->isDesc = 1; 5609 pCur->iValue = pCur->mxValue; 5610 if( pCur->iStep>0 ){ 5611 pCur->iValue -= (pCur->mxValue - pCur->mnValue)%pCur->iStep; 5612 } 5613 }else{ 5614 pCur->isDesc = 0; 5615 pCur->iValue = pCur->mnValue; 5616 } 5617 pCur->iRowid = 1; 5618 return SQLITE_OK; 5619 } 5620 5621 /* 5622 ** SQLite will invoke this method one or more times while planning a query 5623 ** that uses the generate_series virtual table. This routine needs to create 5624 ** a query plan for each invocation and compute an estimated cost for that 5625 ** plan. 5626 ** 5627 ** In this implementation idxNum is used to represent the 5628 ** query plan. idxStr is unused. 5629 ** 5630 ** The query plan is represented by bits in idxNum: 5631 ** 5632 ** (1) start = $value -- constraint exists 5633 ** (2) stop = $value -- constraint exists 5634 ** (4) step = $value -- constraint exists 5635 ** (8) output in descending order 5636 */ 5637 static int seriesBestIndex( 5638 sqlite3_vtab *tabUnused, 5639 sqlite3_index_info *pIdxInfo 5640 ){ 5641 int i, j; /* Loop over constraints */ 5642 int idxNum = 0; /* The query plan bitmask */ 5643 int unusableMask = 0; /* Mask of unusable constraints */ 5644 int nArg = 0; /* Number of arguments that seriesFilter() expects */ 5645 int aIdx[3]; /* Constraints on start, stop, and step */ 5646 const struct sqlite3_index_constraint *pConstraint; 5647 5648 /* This implementation assumes that the start, stop, and step columns 5649 ** are the last three columns in the virtual table. */ 5650 assert( SERIES_COLUMN_STOP == SERIES_COLUMN_START+1 ); 5651 assert( SERIES_COLUMN_STEP == SERIES_COLUMN_START+2 ); 5652 (void)tabUnused; 5653 aIdx[0] = aIdx[1] = aIdx[2] = -1; 5654 pConstraint = pIdxInfo->aConstraint; 5655 for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){ 5656 int iCol; /* 0 for start, 1 for stop, 2 for step */ 5657 int iMask; /* bitmask for those column */ 5658 if( pConstraint->iColumn<SERIES_COLUMN_START ) continue; 5659 iCol = pConstraint->iColumn - SERIES_COLUMN_START; 5660 assert( iCol>=0 && iCol<=2 ); 5661 iMask = 1 << iCol; 5662 if( pConstraint->usable==0 ){ 5663 unusableMask |= iMask; 5664 continue; 5665 }else if( pConstraint->op==SQLITE_INDEX_CONSTRAINT_EQ ){ 5666 idxNum |= iMask; 5667 aIdx[iCol] = i; 5668 } 5669 } 5670 for(i=0; i<3; i++){ 5671 if( (j = aIdx[i])>=0 ){ 5672 pIdxInfo->aConstraintUsage[j].argvIndex = ++nArg; 5673 pIdxInfo->aConstraintUsage[j].omit = !SQLITE_SERIES_CONSTRAINT_VERIFY; 5674 } 5675 } 5676 if( (unusableMask & ~idxNum)!=0 ){ 5677 /* The start, stop, and step columns are inputs. Therefore if there 5678 ** are unusable constraints on any of start, stop, or step then 5679 ** this plan is unusable */ 5680 return SQLITE_CONSTRAINT; 5681 } 5682 if( (idxNum & 3)==3 ){ 5683 /* Both start= and stop= boundaries are available. This is the 5684 ** the preferred case */ 5685 pIdxInfo->estimatedCost = (double)(2 - ((idxNum&4)!=0)); 5686 pIdxInfo->estimatedRows = 1000; 5687 if( pIdxInfo->nOrderBy==1 ){ 5688 if( pIdxInfo->aOrderBy[0].desc ) idxNum |= 8; 5689 pIdxInfo->orderByConsumed = 1; 5690 } 5691 }else{ 5692 /* If either boundary is missing, we have to generate a huge span 5693 ** of numbers. Make this case very expensive so that the query 5694 ** planner will work hard to avoid it. */ 5695 pIdxInfo->estimatedRows = 2147483647; 5696 } 5697 pIdxInfo->idxNum = idxNum; 5698 return SQLITE_OK; 5699 } 5700 5701 /* 5702 ** This following structure defines all the methods for the 5703 ** generate_series virtual table. 5704 */ 5705 static sqlite3_module seriesModule = { 5706 0, /* iVersion */ 5707 0, /* xCreate */ 5708 seriesConnect, /* xConnect */ 5709 seriesBestIndex, /* xBestIndex */ 5710 seriesDisconnect, /* xDisconnect */ 5711 0, /* xDestroy */ 5712 seriesOpen, /* xOpen - open a cursor */ 5713 seriesClose, /* xClose - close a cursor */ 5714 seriesFilter, /* xFilter - configure scan constraints */ 5715 seriesNext, /* xNext - advance a cursor */ 5716 seriesEof, /* xEof - check for end of scan */ 5717 seriesColumn, /* xColumn - read data */ 5718 seriesRowid, /* xRowid - read data */ 5719 0, /* xUpdate */ 5720 0, /* xBegin */ 5721 0, /* xSync */ 5722 0, /* xCommit */ 5723 0, /* xRollback */ 5724 0, /* xFindMethod */ 5725 0, /* xRename */ 5726 0, /* xSavepoint */ 5727 0, /* xRelease */ 5728 0, /* xRollbackTo */ 5729 0 /* xShadowName */ 5730 }; 5731 5732 #endif /* SQLITE_OMIT_VIRTUALTABLE */ 5733 5734 #ifdef _WIN32 5735 5736 #endif 5737 int sqlite3_series_init( 5738 sqlite3 *db, 5739 char **pzErrMsg, 5740 const sqlite3_api_routines *pApi 5741 ){ 5742 int rc = SQLITE_OK; 5743 SQLITE_EXTENSION_INIT2(pApi); 5744 #ifndef SQLITE_OMIT_VIRTUALTABLE 5745 if( sqlite3_libversion_number()<3008012 ){ 5746 *pzErrMsg = sqlite3_mprintf( 5747 "generate_series() requires SQLite 3.8.12 or later"); 5748 return SQLITE_ERROR; 5749 } 5750 rc = sqlite3_create_module(db, "generate_series", &seriesModule, 0); 5751 #endif 5752 return rc; 5753 } 5754 5755 /************************* End ../ext/misc/series.c ********************/ 5756 #ifdef SQLITE_HAVE_ZLIB 5757 /************************* Begin ../ext/misc/zipfile.c ******************/ 5758 /* 5759 ** 2017-12-26 5760 ** 5761 ** The author disclaims copyright to this source code. In place of 5762 ** a legal notice, here is a blessing: 5763 ** 5764 ** May you do good and not evil. 5765 ** May you find forgiveness for yourself and forgive others. 5766 ** May you share freely, never taking more than you give. 5767 ** 5768 ****************************************************************************** 5769 ** 5770 ** This file implements a virtual table for reading and writing ZIP archive 5771 ** files. 5772 ** 5773 ** Usage example: 5774 ** 5775 ** SELECT name, sz, datetime(mtime,'unixepoch') FROM zipfile($filename); 5776 ** 5777 ** Current limitations: 5778 ** 5779 ** * No support for encryption 5780 ** * No support for ZIP archives spanning multiple files 5781 ** * No support for zip64 extensions 5782 ** * Only the "inflate/deflate" (zlib) compression method is supported 5783 */ 5784 /* #include "sqlite3ext.h" */ 5785 SQLITE_EXTENSION_INIT1 5786 #include <stdio.h> 5787 #include <string.h> 5788 #include <assert.h> 5789 5790 #include <zlib.h> 5791 5792 #ifndef SQLITE_OMIT_VIRTUALTABLE 5793 5794 #ifndef SQLITE_AMALGAMATION 5795 5796 /* typedef sqlite3_int64 i64; */ 5797 /* typedef unsigned char u8; */ 5798 typedef unsigned short u16; 5799 typedef unsigned long u32; 5800 #define MIN(a,b) ((a)<(b) ? (a) : (b)) 5801 5802 #if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST) 5803 # define ALWAYS(X) (1) 5804 # define NEVER(X) (0) 5805 #elif !defined(NDEBUG) 5806 # define ALWAYS(X) ((X)?1:(assert(0),0)) 5807 # define NEVER(X) ((X)?(assert(0),1):0) 5808 #else 5809 # define ALWAYS(X) (X) 5810 # define NEVER(X) (X) 5811 #endif 5812 5813 #endif /* SQLITE_AMALGAMATION */ 5814 5815 /* 5816 ** Definitions for mode bitmasks S_IFDIR, S_IFREG and S_IFLNK. 5817 ** 5818 ** In some ways it would be better to obtain these values from system 5819 ** header files. But, the dependency is undesirable and (a) these 5820 ** have been stable for decades, (b) the values are part of POSIX and 5821 ** are also made explicit in [man stat], and (c) are part of the 5822 ** file format for zip archives. 5823 */ 5824 #ifndef S_IFDIR 5825 # define S_IFDIR 0040000 5826 #endif 5827 #ifndef S_IFREG 5828 # define S_IFREG 0100000 5829 #endif 5830 #ifndef S_IFLNK 5831 # define S_IFLNK 0120000 5832 #endif 5833 5834 static const char ZIPFILE_SCHEMA[] = 5835 "CREATE TABLE y(" 5836 "name PRIMARY KEY," /* 0: Name of file in zip archive */ 5837 "mode," /* 1: POSIX mode for file */ 5838 "mtime," /* 2: Last modification time (secs since 1970)*/ 5839 "sz," /* 3: Size of object */ 5840 "rawdata," /* 4: Raw data */ 5841 "data," /* 5: Uncompressed data */ 5842 "method," /* 6: Compression method (integer) */ 5843 "z HIDDEN" /* 7: Name of zip file */ 5844 ") WITHOUT ROWID;"; 5845 5846 #define ZIPFILE_F_COLUMN_IDX 7 /* Index of column "file" in the above */ 5847 #define ZIPFILE_BUFFER_SIZE (64*1024) 5848 5849 5850 /* 5851 ** Magic numbers used to read and write zip files. 5852 ** 5853 ** ZIPFILE_NEWENTRY_MADEBY: 5854 ** Use this value for the "version-made-by" field in new zip file 5855 ** entries. The upper byte indicates "unix", and the lower byte 5856 ** indicates that the zip file matches pkzip specification 3.0. 5857 ** This is what info-zip seems to do. 5858 ** 5859 ** ZIPFILE_NEWENTRY_REQUIRED: 5860 ** Value for "version-required-to-extract" field of new entries. 5861 ** Version 2.0 is required to support folders and deflate compression. 5862 ** 5863 ** ZIPFILE_NEWENTRY_FLAGS: 5864 ** Value for "general-purpose-bit-flags" field of new entries. Bit 5865 ** 11 means "utf-8 filename and comment". 5866 ** 5867 ** ZIPFILE_SIGNATURE_CDS: 5868 ** First 4 bytes of a valid CDS record. 5869 ** 5870 ** ZIPFILE_SIGNATURE_LFH: 5871 ** First 4 bytes of a valid LFH record. 5872 ** 5873 ** ZIPFILE_SIGNATURE_EOCD 5874 ** First 4 bytes of a valid EOCD record. 5875 */ 5876 #define ZIPFILE_EXTRA_TIMESTAMP 0x5455 5877 #define ZIPFILE_NEWENTRY_MADEBY ((3<<8) + 30) 5878 #define ZIPFILE_NEWENTRY_REQUIRED 20 5879 #define ZIPFILE_NEWENTRY_FLAGS 0x800 5880 #define ZIPFILE_SIGNATURE_CDS 0x02014b50 5881 #define ZIPFILE_SIGNATURE_LFH 0x04034b50 5882 #define ZIPFILE_SIGNATURE_EOCD 0x06054b50 5883 5884 /* 5885 ** The sizes of the fixed-size part of each of the three main data 5886 ** structures in a zip archive. 5887 */ 5888 #define ZIPFILE_LFH_FIXED_SZ 30 5889 #define ZIPFILE_EOCD_FIXED_SZ 22 5890 #define ZIPFILE_CDS_FIXED_SZ 46 5891 5892 /* 5893 *** 4.3.16 End of central directory record: 5894 *** 5895 *** end of central dir signature 4 bytes (0x06054b50) 5896 *** number of this disk 2 bytes 5897 *** number of the disk with the 5898 *** start of the central directory 2 bytes 5899 *** total number of entries in the 5900 *** central directory on this disk 2 bytes 5901 *** total number of entries in 5902 *** the central directory 2 bytes 5903 *** size of the central directory 4 bytes 5904 *** offset of start of central 5905 *** directory with respect to 5906 *** the starting disk number 4 bytes 5907 *** .ZIP file comment length 2 bytes 5908 *** .ZIP file comment (variable size) 5909 */ 5910 typedef struct ZipfileEOCD ZipfileEOCD; 5911 struct ZipfileEOCD { 5912 u16 iDisk; 5913 u16 iFirstDisk; 5914 u16 nEntry; 5915 u16 nEntryTotal; 5916 u32 nSize; 5917 u32 iOffset; 5918 }; 5919 5920 /* 5921 *** 4.3.12 Central directory structure: 5922 *** 5923 *** ... 5924 *** 5925 *** central file header signature 4 bytes (0x02014b50) 5926 *** version made by 2 bytes 5927 *** version needed to extract 2 bytes 5928 *** general purpose bit flag 2 bytes 5929 *** compression method 2 bytes 5930 *** last mod file time 2 bytes 5931 *** last mod file date 2 bytes 5932 *** crc-32 4 bytes 5933 *** compressed size 4 bytes 5934 *** uncompressed size 4 bytes 5935 *** file name length 2 bytes 5936 *** extra field length 2 bytes 5937 *** file comment length 2 bytes 5938 *** disk number start 2 bytes 5939 *** internal file attributes 2 bytes 5940 *** external file attributes 4 bytes 5941 *** relative offset of local header 4 bytes 5942 */ 5943 typedef struct ZipfileCDS ZipfileCDS; 5944 struct ZipfileCDS { 5945 u16 iVersionMadeBy; 5946 u16 iVersionExtract; 5947 u16 flags; 5948 u16 iCompression; 5949 u16 mTime; 5950 u16 mDate; 5951 u32 crc32; 5952 u32 szCompressed; 5953 u32 szUncompressed; 5954 u16 nFile; 5955 u16 nExtra; 5956 u16 nComment; 5957 u16 iDiskStart; 5958 u16 iInternalAttr; 5959 u32 iExternalAttr; 5960 u32 iOffset; 5961 char *zFile; /* Filename (sqlite3_malloc()) */ 5962 }; 5963 5964 /* 5965 *** 4.3.7 Local file header: 5966 *** 5967 *** local file header signature 4 bytes (0x04034b50) 5968 *** version needed to extract 2 bytes 5969 *** general purpose bit flag 2 bytes 5970 *** compression method 2 bytes 5971 *** last mod file time 2 bytes 5972 *** last mod file date 2 bytes 5973 *** crc-32 4 bytes 5974 *** compressed size 4 bytes 5975 *** uncompressed size 4 bytes 5976 *** file name length 2 bytes 5977 *** extra field length 2 bytes 5978 *** 5979 */ 5980 typedef struct ZipfileLFH ZipfileLFH; 5981 struct ZipfileLFH { 5982 u16 iVersionExtract; 5983 u16 flags; 5984 u16 iCompression; 5985 u16 mTime; 5986 u16 mDate; 5987 u32 crc32; 5988 u32 szCompressed; 5989 u32 szUncompressed; 5990 u16 nFile; 5991 u16 nExtra; 5992 }; 5993 5994 typedef struct ZipfileEntry ZipfileEntry; 5995 struct ZipfileEntry { 5996 ZipfileCDS cds; /* Parsed CDS record */ 5997 u32 mUnixTime; /* Modification time, in UNIX format */ 5998 u8 *aExtra; /* cds.nExtra+cds.nComment bytes of extra data */ 5999 i64 iDataOff; /* Offset to data in file (if aData==0) */ 6000 u8 *aData; /* cds.szCompressed bytes of compressed data */ 6001 ZipfileEntry *pNext; /* Next element in in-memory CDS */ 6002 }; 6003 6004 /* 6005 ** Cursor type for zipfile tables. 6006 */ 6007 typedef struct ZipfileCsr ZipfileCsr; 6008 struct ZipfileCsr { 6009 sqlite3_vtab_cursor base; /* Base class - must be first */ 6010 i64 iId; /* Cursor ID */ 6011 u8 bEof; /* True when at EOF */ 6012 u8 bNoop; /* If next xNext() call is no-op */ 6013 6014 /* Used outside of write transactions */ 6015 FILE *pFile; /* Zip file */ 6016 i64 iNextOff; /* Offset of next record in central directory */ 6017 ZipfileEOCD eocd; /* Parse of central directory record */ 6018 6019 ZipfileEntry *pFreeEntry; /* Free this list when cursor is closed or reset */ 6020 ZipfileEntry *pCurrent; /* Current entry */ 6021 ZipfileCsr *pCsrNext; /* Next cursor on same virtual table */ 6022 }; 6023 6024 typedef struct ZipfileTab ZipfileTab; 6025 struct ZipfileTab { 6026 sqlite3_vtab base; /* Base class - must be first */ 6027 char *zFile; /* Zip file this table accesses (may be NULL) */ 6028 sqlite3 *db; /* Host database connection */ 6029 u8 *aBuffer; /* Temporary buffer used for various tasks */ 6030 6031 ZipfileCsr *pCsrList; /* List of cursors */ 6032 i64 iNextCsrid; 6033 6034 /* The following are used by write transactions only */ 6035 ZipfileEntry *pFirstEntry; /* Linked list of all files (if pWriteFd!=0) */ 6036 ZipfileEntry *pLastEntry; /* Last element in pFirstEntry list */ 6037 FILE *pWriteFd; /* File handle open on zip archive */ 6038 i64 szCurrent; /* Current size of zip archive */ 6039 i64 szOrig; /* Size of archive at start of transaction */ 6040 }; 6041 6042 /* 6043 ** Set the error message contained in context ctx to the results of 6044 ** vprintf(zFmt, ...). 6045 */ 6046 static void zipfileCtxErrorMsg(sqlite3_context *ctx, const char *zFmt, ...){ 6047 char *zMsg = 0; 6048 va_list ap; 6049 va_start(ap, zFmt); 6050 zMsg = sqlite3_vmprintf(zFmt, ap); 6051 sqlite3_result_error(ctx, zMsg, -1); 6052 sqlite3_free(zMsg); 6053 va_end(ap); 6054 } 6055 6056 /* 6057 ** If string zIn is quoted, dequote it in place. Otherwise, if the string 6058 ** is not quoted, do nothing. 6059 */ 6060 static void zipfileDequote(char *zIn){ 6061 char q = zIn[0]; 6062 if( q=='"' || q=='\'' || q=='`' || q=='[' ){ 6063 int iIn = 1; 6064 int iOut = 0; 6065 if( q=='[' ) q = ']'; 6066 while( ALWAYS(zIn[iIn]) ){ 6067 char c = zIn[iIn++]; 6068 if( c==q && zIn[iIn++]!=q ) break; 6069 zIn[iOut++] = c; 6070 } 6071 zIn[iOut] = '\0'; 6072 } 6073 } 6074 6075 /* 6076 ** Construct a new ZipfileTab virtual table object. 6077 ** 6078 ** argv[0] -> module name ("zipfile") 6079 ** argv[1] -> database name 6080 ** argv[2] -> table name 6081 ** argv[...] -> "column name" and other module argument fields. 6082 */ 6083 static int zipfileConnect( 6084 sqlite3 *db, 6085 void *pAux, 6086 int argc, const char *const*argv, 6087 sqlite3_vtab **ppVtab, 6088 char **pzErr 6089 ){ 6090 int nByte = sizeof(ZipfileTab) + ZIPFILE_BUFFER_SIZE; 6091 int nFile = 0; 6092 const char *zFile = 0; 6093 ZipfileTab *pNew = 0; 6094 int rc; 6095 6096 /* If the table name is not "zipfile", require that the argument be 6097 ** specified. This stops zipfile tables from being created as: 6098 ** 6099 ** CREATE VIRTUAL TABLE zzz USING zipfile(); 6100 ** 6101 ** It does not prevent: 6102 ** 6103 ** CREATE VIRTUAL TABLE zipfile USING zipfile(); 6104 */ 6105 assert( 0==sqlite3_stricmp(argv[0], "zipfile") ); 6106 if( (0!=sqlite3_stricmp(argv[2], "zipfile") && argc<4) || argc>4 ){ 6107 *pzErr = sqlite3_mprintf("zipfile constructor requires one argument"); 6108 return SQLITE_ERROR; 6109 } 6110 6111 if( argc>3 ){ 6112 zFile = argv[3]; 6113 nFile = (int)strlen(zFile)+1; 6114 } 6115 6116 rc = sqlite3_declare_vtab(db, ZIPFILE_SCHEMA); 6117 if( rc==SQLITE_OK ){ 6118 pNew = (ZipfileTab*)sqlite3_malloc64((sqlite3_int64)nByte+nFile); 6119 if( pNew==0 ) return SQLITE_NOMEM; 6120 memset(pNew, 0, nByte+nFile); 6121 pNew->db = db; 6122 pNew->aBuffer = (u8*)&pNew[1]; 6123 if( zFile ){ 6124 pNew->zFile = (char*)&pNew->aBuffer[ZIPFILE_BUFFER_SIZE]; 6125 memcpy(pNew->zFile, zFile, nFile); 6126 zipfileDequote(pNew->zFile); 6127 } 6128 } 6129 sqlite3_vtab_config(db, SQLITE_VTAB_DIRECTONLY); 6130 *ppVtab = (sqlite3_vtab*)pNew; 6131 return rc; 6132 } 6133 6134 /* 6135 ** Free the ZipfileEntry structure indicated by the only argument. 6136 */ 6137 static void zipfileEntryFree(ZipfileEntry *p){ 6138 if( p ){ 6139 sqlite3_free(p->cds.zFile); 6140 sqlite3_free(p); 6141 } 6142 } 6143 6144 /* 6145 ** Release resources that should be freed at the end of a write 6146 ** transaction. 6147 */ 6148 static void zipfileCleanupTransaction(ZipfileTab *pTab){ 6149 ZipfileEntry *pEntry; 6150 ZipfileEntry *pNext; 6151 6152 if( pTab->pWriteFd ){ 6153 fclose(pTab->pWriteFd); 6154 pTab->pWriteFd = 0; 6155 } 6156 for(pEntry=pTab->pFirstEntry; pEntry; pEntry=pNext){ 6157 pNext = pEntry->pNext; 6158 zipfileEntryFree(pEntry); 6159 } 6160 pTab->pFirstEntry = 0; 6161 pTab->pLastEntry = 0; 6162 pTab->szCurrent = 0; 6163 pTab->szOrig = 0; 6164 } 6165 6166 /* 6167 ** This method is the destructor for zipfile vtab objects. 6168 */ 6169 static int zipfileDisconnect(sqlite3_vtab *pVtab){ 6170 zipfileCleanupTransaction((ZipfileTab*)pVtab); 6171 sqlite3_free(pVtab); 6172 return SQLITE_OK; 6173 } 6174 6175 /* 6176 ** Constructor for a new ZipfileCsr object. 6177 */ 6178 static int zipfileOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCsr){ 6179 ZipfileTab *pTab = (ZipfileTab*)p; 6180 ZipfileCsr *pCsr; 6181 pCsr = sqlite3_malloc(sizeof(*pCsr)); 6182 *ppCsr = (sqlite3_vtab_cursor*)pCsr; 6183 if( pCsr==0 ){ 6184 return SQLITE_NOMEM; 6185 } 6186 memset(pCsr, 0, sizeof(*pCsr)); 6187 pCsr->iId = ++pTab->iNextCsrid; 6188 pCsr->pCsrNext = pTab->pCsrList; 6189 pTab->pCsrList = pCsr; 6190 return SQLITE_OK; 6191 } 6192 6193 /* 6194 ** Reset a cursor back to the state it was in when first returned 6195 ** by zipfileOpen(). 6196 */ 6197 static void zipfileResetCursor(ZipfileCsr *pCsr){ 6198 ZipfileEntry *p; 6199 ZipfileEntry *pNext; 6200 6201 pCsr->bEof = 0; 6202 if( pCsr->pFile ){ 6203 fclose(pCsr->pFile); 6204 pCsr->pFile = 0; 6205 zipfileEntryFree(pCsr->pCurrent); 6206 pCsr->pCurrent = 0; 6207 } 6208 6209 for(p=pCsr->pFreeEntry; p; p=pNext){ 6210 pNext = p->pNext; 6211 zipfileEntryFree(p); 6212 } 6213 } 6214 6215 /* 6216 ** Destructor for an ZipfileCsr. 6217 */ 6218 static int zipfileClose(sqlite3_vtab_cursor *cur){ 6219 ZipfileCsr *pCsr = (ZipfileCsr*)cur; 6220 ZipfileTab *pTab = (ZipfileTab*)(pCsr->base.pVtab); 6221 ZipfileCsr **pp; 6222 zipfileResetCursor(pCsr); 6223 6224 /* Remove this cursor from the ZipfileTab.pCsrList list. */ 6225 for(pp=&pTab->pCsrList; *pp!=pCsr; pp=&((*pp)->pCsrNext)); 6226 *pp = pCsr->pCsrNext; 6227 6228 sqlite3_free(pCsr); 6229 return SQLITE_OK; 6230 } 6231 6232 /* 6233 ** Set the error message for the virtual table associated with cursor 6234 ** pCsr to the results of vprintf(zFmt, ...). 6235 */ 6236 static void zipfileTableErr(ZipfileTab *pTab, const char *zFmt, ...){ 6237 va_list ap; 6238 va_start(ap, zFmt); 6239 sqlite3_free(pTab->base.zErrMsg); 6240 pTab->base.zErrMsg = sqlite3_vmprintf(zFmt, ap); 6241 va_end(ap); 6242 } 6243 static void zipfileCursorErr(ZipfileCsr *pCsr, const char *zFmt, ...){ 6244 va_list ap; 6245 va_start(ap, zFmt); 6246 sqlite3_free(pCsr->base.pVtab->zErrMsg); 6247 pCsr->base.pVtab->zErrMsg = sqlite3_vmprintf(zFmt, ap); 6248 va_end(ap); 6249 } 6250 6251 /* 6252 ** Read nRead bytes of data from offset iOff of file pFile into buffer 6253 ** aRead[]. Return SQLITE_OK if successful, or an SQLite error code 6254 ** otherwise. 6255 ** 6256 ** If an error does occur, output variable (*pzErrmsg) may be set to point 6257 ** to an English language error message. It is the responsibility of the 6258 ** caller to eventually free this buffer using 6259 ** sqlite3_free(). 6260 */ 6261 static int zipfileReadData( 6262 FILE *pFile, /* Read from this file */ 6263 u8 *aRead, /* Read into this buffer */ 6264 int nRead, /* Number of bytes to read */ 6265 i64 iOff, /* Offset to read from */ 6266 char **pzErrmsg /* OUT: Error message (from sqlite3_malloc) */ 6267 ){ 6268 size_t n; 6269 fseek(pFile, (long)iOff, SEEK_SET); 6270 n = fread(aRead, 1, nRead, pFile); 6271 if( (int)n!=nRead ){ 6272 *pzErrmsg = sqlite3_mprintf("error in fread()"); 6273 return SQLITE_ERROR; 6274 } 6275 return SQLITE_OK; 6276 } 6277 6278 static int zipfileAppendData( 6279 ZipfileTab *pTab, 6280 const u8 *aWrite, 6281 int nWrite 6282 ){ 6283 if( nWrite>0 ){ 6284 size_t n = nWrite; 6285 fseek(pTab->pWriteFd, (long)pTab->szCurrent, SEEK_SET); 6286 n = fwrite(aWrite, 1, nWrite, pTab->pWriteFd); 6287 if( (int)n!=nWrite ){ 6288 pTab->base.zErrMsg = sqlite3_mprintf("error in fwrite()"); 6289 return SQLITE_ERROR; 6290 } 6291 pTab->szCurrent += nWrite; 6292 } 6293 return SQLITE_OK; 6294 } 6295 6296 /* 6297 ** Read and return a 16-bit little-endian unsigned integer from buffer aBuf. 6298 */ 6299 static u16 zipfileGetU16(const u8 *aBuf){ 6300 return (aBuf[1] << 8) + aBuf[0]; 6301 } 6302 6303 /* 6304 ** Read and return a 32-bit little-endian unsigned integer from buffer aBuf. 6305 */ 6306 static u32 zipfileGetU32(const u8 *aBuf){ 6307 return ((u32)(aBuf[3]) << 24) 6308 + ((u32)(aBuf[2]) << 16) 6309 + ((u32)(aBuf[1]) << 8) 6310 + ((u32)(aBuf[0]) << 0); 6311 } 6312 6313 /* 6314 ** Write a 16-bit little endiate integer into buffer aBuf. 6315 */ 6316 static void zipfilePutU16(u8 *aBuf, u16 val){ 6317 aBuf[0] = val & 0xFF; 6318 aBuf[1] = (val>>8) & 0xFF; 6319 } 6320 6321 /* 6322 ** Write a 32-bit little endiate integer into buffer aBuf. 6323 */ 6324 static void zipfilePutU32(u8 *aBuf, u32 val){ 6325 aBuf[0] = val & 0xFF; 6326 aBuf[1] = (val>>8) & 0xFF; 6327 aBuf[2] = (val>>16) & 0xFF; 6328 aBuf[3] = (val>>24) & 0xFF; 6329 } 6330 6331 #define zipfileRead32(aBuf) ( aBuf+=4, zipfileGetU32(aBuf-4) ) 6332 #define zipfileRead16(aBuf) ( aBuf+=2, zipfileGetU16(aBuf-2) ) 6333 6334 #define zipfileWrite32(aBuf,val) { zipfilePutU32(aBuf,val); aBuf+=4; } 6335 #define zipfileWrite16(aBuf,val) { zipfilePutU16(aBuf,val); aBuf+=2; } 6336 6337 /* 6338 ** Magic numbers used to read CDS records. 6339 */ 6340 #define ZIPFILE_CDS_NFILE_OFF 28 6341 #define ZIPFILE_CDS_SZCOMPRESSED_OFF 20 6342 6343 /* 6344 ** Decode the CDS record in buffer aBuf into (*pCDS). Return SQLITE_ERROR 6345 ** if the record is not well-formed, or SQLITE_OK otherwise. 6346 */ 6347 static int zipfileReadCDS(u8 *aBuf, ZipfileCDS *pCDS){ 6348 u8 *aRead = aBuf; 6349 u32 sig = zipfileRead32(aRead); 6350 int rc = SQLITE_OK; 6351 if( sig!=ZIPFILE_SIGNATURE_CDS ){ 6352 rc = SQLITE_ERROR; 6353 }else{ 6354 pCDS->iVersionMadeBy = zipfileRead16(aRead); 6355 pCDS->iVersionExtract = zipfileRead16(aRead); 6356 pCDS->flags = zipfileRead16(aRead); 6357 pCDS->iCompression = zipfileRead16(aRead); 6358 pCDS->mTime = zipfileRead16(aRead); 6359 pCDS->mDate = zipfileRead16(aRead); 6360 pCDS->crc32 = zipfileRead32(aRead); 6361 pCDS->szCompressed = zipfileRead32(aRead); 6362 pCDS->szUncompressed = zipfileRead32(aRead); 6363 assert( aRead==&aBuf[ZIPFILE_CDS_NFILE_OFF] ); 6364 pCDS->nFile = zipfileRead16(aRead); 6365 pCDS->nExtra = zipfileRead16(aRead); 6366 pCDS->nComment = zipfileRead16(aRead); 6367 pCDS->iDiskStart = zipfileRead16(aRead); 6368 pCDS->iInternalAttr = zipfileRead16(aRead); 6369 pCDS->iExternalAttr = zipfileRead32(aRead); 6370 pCDS->iOffset = zipfileRead32(aRead); 6371 assert( aRead==&aBuf[ZIPFILE_CDS_FIXED_SZ] ); 6372 } 6373 6374 return rc; 6375 } 6376 6377 /* 6378 ** Decode the LFH record in buffer aBuf into (*pLFH). Return SQLITE_ERROR 6379 ** if the record is not well-formed, or SQLITE_OK otherwise. 6380 */ 6381 static int zipfileReadLFH( 6382 u8 *aBuffer, 6383 ZipfileLFH *pLFH 6384 ){ 6385 u8 *aRead = aBuffer; 6386 int rc = SQLITE_OK; 6387 6388 u32 sig = zipfileRead32(aRead); 6389 if( sig!=ZIPFILE_SIGNATURE_LFH ){ 6390 rc = SQLITE_ERROR; 6391 }else{ 6392 pLFH->iVersionExtract = zipfileRead16(aRead); 6393 pLFH->flags = zipfileRead16(aRead); 6394 pLFH->iCompression = zipfileRead16(aRead); 6395 pLFH->mTime = zipfileRead16(aRead); 6396 pLFH->mDate = zipfileRead16(aRead); 6397 pLFH->crc32 = zipfileRead32(aRead); 6398 pLFH->szCompressed = zipfileRead32(aRead); 6399 pLFH->szUncompressed = zipfileRead32(aRead); 6400 pLFH->nFile = zipfileRead16(aRead); 6401 pLFH->nExtra = zipfileRead16(aRead); 6402 } 6403 return rc; 6404 } 6405 6406 6407 /* 6408 ** Buffer aExtra (size nExtra bytes) contains zip archive "extra" fields. 6409 ** Scan through this buffer to find an "extra-timestamp" field. If one 6410 ** exists, extract the 32-bit modification-timestamp from it and store 6411 ** the value in output parameter *pmTime. 6412 ** 6413 ** Zero is returned if no extra-timestamp record could be found (and so 6414 ** *pmTime is left unchanged), or non-zero otherwise. 6415 ** 6416 ** The general format of an extra field is: 6417 ** 6418 ** Header ID 2 bytes 6419 ** Data Size 2 bytes 6420 ** Data N bytes 6421 */ 6422 static int zipfileScanExtra(u8 *aExtra, int nExtra, u32 *pmTime){ 6423 int ret = 0; 6424 u8 *p = aExtra; 6425 u8 *pEnd = &aExtra[nExtra]; 6426 6427 while( p<pEnd ){ 6428 u16 id = zipfileRead16(p); 6429 u16 nByte = zipfileRead16(p); 6430 6431 switch( id ){ 6432 case ZIPFILE_EXTRA_TIMESTAMP: { 6433 u8 b = p[0]; 6434 if( b & 0x01 ){ /* 0x01 -> modtime is present */ 6435 *pmTime = zipfileGetU32(&p[1]); 6436 ret = 1; 6437 } 6438 break; 6439 } 6440 } 6441 6442 p += nByte; 6443 } 6444 return ret; 6445 } 6446 6447 /* 6448 ** Convert the standard MS-DOS timestamp stored in the mTime and mDate 6449 ** fields of the CDS structure passed as the only argument to a 32-bit 6450 ** UNIX seconds-since-the-epoch timestamp. Return the result. 6451 ** 6452 ** "Standard" MS-DOS time format: 6453 ** 6454 ** File modification time: 6455 ** Bits 00-04: seconds divided by 2 6456 ** Bits 05-10: minute 6457 ** Bits 11-15: hour 6458 ** File modification date: 6459 ** Bits 00-04: day 6460 ** Bits 05-08: month (1-12) 6461 ** Bits 09-15: years from 1980 6462 ** 6463 ** https://msdn.microsoft.com/en-us/library/9kkf9tah.aspx 6464 */ 6465 static u32 zipfileMtime(ZipfileCDS *pCDS){ 6466 int Y = (1980 + ((pCDS->mDate >> 9) & 0x7F)); 6467 int M = ((pCDS->mDate >> 5) & 0x0F); 6468 int D = (pCDS->mDate & 0x1F); 6469 int B = -13; 6470 6471 int sec = (pCDS->mTime & 0x1F)*2; 6472 int min = (pCDS->mTime >> 5) & 0x3F; 6473 int hr = (pCDS->mTime >> 11) & 0x1F; 6474 i64 JD; 6475 6476 /* JD = INT(365.25 * (Y+4716)) + INT(30.6001 * (M+1)) + D + B - 1524.5 */ 6477 6478 /* Calculate the JD in seconds for noon on the day in question */ 6479 if( M<3 ){ 6480 Y = Y-1; 6481 M = M+12; 6482 } 6483 JD = (i64)(24*60*60) * ( 6484 (int)(365.25 * (Y + 4716)) 6485 + (int)(30.6001 * (M + 1)) 6486 + D + B - 1524 6487 ); 6488 6489 /* Correct the JD for the time within the day */ 6490 JD += (hr-12) * 3600 + min * 60 + sec; 6491 6492 /* Convert JD to unix timestamp (the JD epoch is 2440587.5) */ 6493 return (u32)(JD - (i64)(24405875) * 24*60*6); 6494 } 6495 6496 /* 6497 ** The opposite of zipfileMtime(). This function populates the mTime and 6498 ** mDate fields of the CDS structure passed as the first argument according 6499 ** to the UNIX timestamp value passed as the second. 6500 */ 6501 static void zipfileMtimeToDos(ZipfileCDS *pCds, u32 mUnixTime){ 6502 /* Convert unix timestamp to JD (2440588 is noon on 1/1/1970) */ 6503 i64 JD = (i64)2440588 + mUnixTime / (24*60*60); 6504 6505 int A, B, C, D, E; 6506 int yr, mon, day; 6507 int hr, min, sec; 6508 6509 A = (int)((JD - 1867216.25)/36524.25); 6510 A = (int)(JD + 1 + A - (A/4)); 6511 B = A + 1524; 6512 C = (int)((B - 122.1)/365.25); 6513 D = (36525*(C&32767))/100; 6514 E = (int)((B-D)/30.6001); 6515 6516 day = B - D - (int)(30.6001*E); 6517 mon = (E<14 ? E-1 : E-13); 6518 yr = mon>2 ? C-4716 : C-4715; 6519 6520 hr = (mUnixTime % (24*60*60)) / (60*60); 6521 min = (mUnixTime % (60*60)) / 60; 6522 sec = (mUnixTime % 60); 6523 6524 if( yr>=1980 ){ 6525 pCds->mDate = (u16)(day + (mon << 5) + ((yr-1980) << 9)); 6526 pCds->mTime = (u16)(sec/2 + (min<<5) + (hr<<11)); 6527 }else{ 6528 pCds->mDate = pCds->mTime = 0; 6529 } 6530 6531 assert( mUnixTime<315507600 6532 || mUnixTime==zipfileMtime(pCds) 6533 || ((mUnixTime % 2) && mUnixTime-1==zipfileMtime(pCds)) 6534 /* || (mUnixTime % 2) */ 6535 ); 6536 } 6537 6538 /* 6539 ** If aBlob is not NULL, then it is a pointer to a buffer (nBlob bytes in 6540 ** size) containing an entire zip archive image. Or, if aBlob is NULL, 6541 ** then pFile is a file-handle open on a zip file. In either case, this 6542 ** function creates a ZipfileEntry object based on the zip archive entry 6543 ** for which the CDS record is at offset iOff. 6544 ** 6545 ** If successful, SQLITE_OK is returned and (*ppEntry) set to point to 6546 ** the new object. Otherwise, an SQLite error code is returned and the 6547 ** final value of (*ppEntry) undefined. 6548 */ 6549 static int zipfileGetEntry( 6550 ZipfileTab *pTab, /* Store any error message here */ 6551 const u8 *aBlob, /* Pointer to in-memory file image */ 6552 int nBlob, /* Size of aBlob[] in bytes */ 6553 FILE *pFile, /* If aBlob==0, read from this file */ 6554 i64 iOff, /* Offset of CDS record */ 6555 ZipfileEntry **ppEntry /* OUT: Pointer to new object */ 6556 ){ 6557 u8 *aRead; 6558 char **pzErr = &pTab->base.zErrMsg; 6559 int rc = SQLITE_OK; 6560 6561 if( aBlob==0 ){ 6562 aRead = pTab->aBuffer; 6563 rc = zipfileReadData(pFile, aRead, ZIPFILE_CDS_FIXED_SZ, iOff, pzErr); 6564 }else{ 6565 aRead = (u8*)&aBlob[iOff]; 6566 } 6567 6568 if( rc==SQLITE_OK ){ 6569 sqlite3_int64 nAlloc; 6570 ZipfileEntry *pNew; 6571 6572 int nFile = zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF]); 6573 int nExtra = zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF+2]); 6574 nExtra += zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF+4]); 6575 6576 nAlloc = sizeof(ZipfileEntry) + nExtra; 6577 if( aBlob ){ 6578 nAlloc += zipfileGetU32(&aRead[ZIPFILE_CDS_SZCOMPRESSED_OFF]); 6579 } 6580 6581 pNew = (ZipfileEntry*)sqlite3_malloc64(nAlloc); 6582 if( pNew==0 ){ 6583 rc = SQLITE_NOMEM; 6584 }else{ 6585 memset(pNew, 0, sizeof(ZipfileEntry)); 6586 rc = zipfileReadCDS(aRead, &pNew->cds); 6587 if( rc!=SQLITE_OK ){ 6588 *pzErr = sqlite3_mprintf("failed to read CDS at offset %lld", iOff); 6589 }else if( aBlob==0 ){ 6590 rc = zipfileReadData( 6591 pFile, aRead, nExtra+nFile, iOff+ZIPFILE_CDS_FIXED_SZ, pzErr 6592 ); 6593 }else{ 6594 aRead = (u8*)&aBlob[iOff + ZIPFILE_CDS_FIXED_SZ]; 6595 } 6596 } 6597 6598 if( rc==SQLITE_OK ){ 6599 u32 *pt = &pNew->mUnixTime; 6600 pNew->cds.zFile = sqlite3_mprintf("%.*s", nFile, aRead); 6601 pNew->aExtra = (u8*)&pNew[1]; 6602 memcpy(pNew->aExtra, &aRead[nFile], nExtra); 6603 if( pNew->cds.zFile==0 ){ 6604 rc = SQLITE_NOMEM; 6605 }else if( 0==zipfileScanExtra(&aRead[nFile], pNew->cds.nExtra, pt) ){ 6606 pNew->mUnixTime = zipfileMtime(&pNew->cds); 6607 } 6608 } 6609 6610 if( rc==SQLITE_OK ){ 6611 static const int szFix = ZIPFILE_LFH_FIXED_SZ; 6612 ZipfileLFH lfh; 6613 if( pFile ){ 6614 rc = zipfileReadData(pFile, aRead, szFix, pNew->cds.iOffset, pzErr); 6615 }else{ 6616 aRead = (u8*)&aBlob[pNew->cds.iOffset]; 6617 } 6618 6619 rc = zipfileReadLFH(aRead, &lfh); 6620 if( rc==SQLITE_OK ){ 6621 pNew->iDataOff = pNew->cds.iOffset + ZIPFILE_LFH_FIXED_SZ; 6622 pNew->iDataOff += lfh.nFile + lfh.nExtra; 6623 if( aBlob && pNew->cds.szCompressed ){ 6624 pNew->aData = &pNew->aExtra[nExtra]; 6625 memcpy(pNew->aData, &aBlob[pNew->iDataOff], pNew->cds.szCompressed); 6626 } 6627 }else{ 6628 *pzErr = sqlite3_mprintf("failed to read LFH at offset %d", 6629 (int)pNew->cds.iOffset 6630 ); 6631 } 6632 } 6633 6634 if( rc!=SQLITE_OK ){ 6635 zipfileEntryFree(pNew); 6636 }else{ 6637 *ppEntry = pNew; 6638 } 6639 } 6640 6641 return rc; 6642 } 6643 6644 /* 6645 ** Advance an ZipfileCsr to its next row of output. 6646 */ 6647 static int zipfileNext(sqlite3_vtab_cursor *cur){ 6648 ZipfileCsr *pCsr = (ZipfileCsr*)cur; 6649 int rc = SQLITE_OK; 6650 6651 if( pCsr->pFile ){ 6652 i64 iEof = pCsr->eocd.iOffset + pCsr->eocd.nSize; 6653 zipfileEntryFree(pCsr->pCurrent); 6654 pCsr->pCurrent = 0; 6655 if( pCsr->iNextOff>=iEof ){ 6656 pCsr->bEof = 1; 6657 }else{ 6658 ZipfileEntry *p = 0; 6659 ZipfileTab *pTab = (ZipfileTab*)(cur->pVtab); 6660 rc = zipfileGetEntry(pTab, 0, 0, pCsr->pFile, pCsr->iNextOff, &p); 6661 if( rc==SQLITE_OK ){ 6662 pCsr->iNextOff += ZIPFILE_CDS_FIXED_SZ; 6663 pCsr->iNextOff += (int)p->cds.nExtra + p->cds.nFile + p->cds.nComment; 6664 } 6665 pCsr->pCurrent = p; 6666 } 6667 }else{ 6668 if( !pCsr->bNoop ){ 6669 pCsr->pCurrent = pCsr->pCurrent->pNext; 6670 } 6671 if( pCsr->pCurrent==0 ){ 6672 pCsr->bEof = 1; 6673 } 6674 } 6675 6676 pCsr->bNoop = 0; 6677 return rc; 6678 } 6679 6680 static void zipfileFree(void *p) { 6681 sqlite3_free(p); 6682 } 6683 6684 /* 6685 ** Buffer aIn (size nIn bytes) contains compressed data. Uncompressed, the 6686 ** size is nOut bytes. This function uncompresses the data and sets the 6687 ** return value in context pCtx to the result (a blob). 6688 ** 6689 ** If an error occurs, an error code is left in pCtx instead. 6690 */ 6691 static void zipfileInflate( 6692 sqlite3_context *pCtx, /* Store result here */ 6693 const u8 *aIn, /* Compressed data */ 6694 int nIn, /* Size of buffer aIn[] in bytes */ 6695 int nOut /* Expected output size */ 6696 ){ 6697 u8 *aRes = sqlite3_malloc(nOut); 6698 if( aRes==0 ){ 6699 sqlite3_result_error_nomem(pCtx); 6700 }else{ 6701 int err; 6702 z_stream str; 6703 memset(&str, 0, sizeof(str)); 6704 6705 str.next_in = (Byte*)aIn; 6706 str.avail_in = nIn; 6707 str.next_out = (Byte*)aRes; 6708 str.avail_out = nOut; 6709 6710 err = inflateInit2(&str, -15); 6711 if( err!=Z_OK ){ 6712 zipfileCtxErrorMsg(pCtx, "inflateInit2() failed (%d)", err); 6713 }else{ 6714 err = inflate(&str, Z_NO_FLUSH); 6715 if( err!=Z_STREAM_END ){ 6716 zipfileCtxErrorMsg(pCtx, "inflate() failed (%d)", err); 6717 }else{ 6718 sqlite3_result_blob(pCtx, aRes, nOut, zipfileFree); 6719 aRes = 0; 6720 } 6721 } 6722 sqlite3_free(aRes); 6723 inflateEnd(&str); 6724 } 6725 } 6726 6727 /* 6728 ** Buffer aIn (size nIn bytes) contains uncompressed data. This function 6729 ** compresses it and sets (*ppOut) to point to a buffer containing the 6730 ** compressed data. The caller is responsible for eventually calling 6731 ** sqlite3_free() to release buffer (*ppOut). Before returning, (*pnOut) 6732 ** is set to the size of buffer (*ppOut) in bytes. 6733 ** 6734 ** If no error occurs, SQLITE_OK is returned. Otherwise, an SQLite error 6735 ** code is returned and an error message left in virtual-table handle 6736 ** pTab. The values of (*ppOut) and (*pnOut) are left unchanged in this 6737 ** case. 6738 */ 6739 static int zipfileDeflate( 6740 const u8 *aIn, int nIn, /* Input */ 6741 u8 **ppOut, int *pnOut, /* Output */ 6742 char **pzErr /* OUT: Error message */ 6743 ){ 6744 int rc = SQLITE_OK; 6745 sqlite3_int64 nAlloc; 6746 z_stream str; 6747 u8 *aOut; 6748 6749 memset(&str, 0, sizeof(str)); 6750 str.next_in = (Bytef*)aIn; 6751 str.avail_in = nIn; 6752 deflateInit2(&str, 9, Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY); 6753 6754 nAlloc = deflateBound(&str, nIn); 6755 aOut = (u8*)sqlite3_malloc64(nAlloc); 6756 if( aOut==0 ){ 6757 rc = SQLITE_NOMEM; 6758 }else{ 6759 int res; 6760 str.next_out = aOut; 6761 str.avail_out = nAlloc; 6762 res = deflate(&str, Z_FINISH); 6763 if( res==Z_STREAM_END ){ 6764 *ppOut = aOut; 6765 *pnOut = (int)str.total_out; 6766 }else{ 6767 sqlite3_free(aOut); 6768 *pzErr = sqlite3_mprintf("zipfile: deflate() error"); 6769 rc = SQLITE_ERROR; 6770 } 6771 deflateEnd(&str); 6772 } 6773 6774 return rc; 6775 } 6776 6777 6778 /* 6779 ** Return values of columns for the row at which the series_cursor 6780 ** is currently pointing. 6781 */ 6782 static int zipfileColumn( 6783 sqlite3_vtab_cursor *cur, /* The cursor */ 6784 sqlite3_context *ctx, /* First argument to sqlite3_result_...() */ 6785 int i /* Which column to return */ 6786 ){ 6787 ZipfileCsr *pCsr = (ZipfileCsr*)cur; 6788 ZipfileCDS *pCDS = &pCsr->pCurrent->cds; 6789 int rc = SQLITE_OK; 6790 switch( i ){ 6791 case 0: /* name */ 6792 sqlite3_result_text(ctx, pCDS->zFile, -1, SQLITE_TRANSIENT); 6793 break; 6794 case 1: /* mode */ 6795 /* TODO: Whether or not the following is correct surely depends on 6796 ** the platform on which the archive was created. */ 6797 sqlite3_result_int(ctx, pCDS->iExternalAttr >> 16); 6798 break; 6799 case 2: { /* mtime */ 6800 sqlite3_result_int64(ctx, pCsr->pCurrent->mUnixTime); 6801 break; 6802 } 6803 case 3: { /* sz */ 6804 if( sqlite3_vtab_nochange(ctx)==0 ){ 6805 sqlite3_result_int64(ctx, pCDS->szUncompressed); 6806 } 6807 break; 6808 } 6809 case 4: /* rawdata */ 6810 if( sqlite3_vtab_nochange(ctx) ) break; 6811 case 5: { /* data */ 6812 if( i==4 || pCDS->iCompression==0 || pCDS->iCompression==8 ){ 6813 int sz = pCDS->szCompressed; 6814 int szFinal = pCDS->szUncompressed; 6815 if( szFinal>0 ){ 6816 u8 *aBuf; 6817 u8 *aFree = 0; 6818 if( pCsr->pCurrent->aData ){ 6819 aBuf = pCsr->pCurrent->aData; 6820 }else{ 6821 aBuf = aFree = sqlite3_malloc64(sz); 6822 if( aBuf==0 ){ 6823 rc = SQLITE_NOMEM; 6824 }else{ 6825 FILE *pFile = pCsr->pFile; 6826 if( pFile==0 ){ 6827 pFile = ((ZipfileTab*)(pCsr->base.pVtab))->pWriteFd; 6828 } 6829 rc = zipfileReadData(pFile, aBuf, sz, pCsr->pCurrent->iDataOff, 6830 &pCsr->base.pVtab->zErrMsg 6831 ); 6832 } 6833 } 6834 if( rc==SQLITE_OK ){ 6835 if( i==5 && pCDS->iCompression ){ 6836 zipfileInflate(ctx, aBuf, sz, szFinal); 6837 }else{ 6838 sqlite3_result_blob(ctx, aBuf, sz, SQLITE_TRANSIENT); 6839 } 6840 } 6841 sqlite3_free(aFree); 6842 }else{ 6843 /* Figure out if this is a directory or a zero-sized file. Consider 6844 ** it to be a directory either if the mode suggests so, or if 6845 ** the final character in the name is '/'. */ 6846 u32 mode = pCDS->iExternalAttr >> 16; 6847 if( !(mode & S_IFDIR) && pCDS->zFile[pCDS->nFile-1]!='/' ){ 6848 sqlite3_result_blob(ctx, "", 0, SQLITE_STATIC); 6849 } 6850 } 6851 } 6852 break; 6853 } 6854 case 6: /* method */ 6855 sqlite3_result_int(ctx, pCDS->iCompression); 6856 break; 6857 default: /* z */ 6858 assert( i==7 ); 6859 sqlite3_result_int64(ctx, pCsr->iId); 6860 break; 6861 } 6862 6863 return rc; 6864 } 6865 6866 /* 6867 ** Return TRUE if the cursor is at EOF. 6868 */ 6869 static int zipfileEof(sqlite3_vtab_cursor *cur){ 6870 ZipfileCsr *pCsr = (ZipfileCsr*)cur; 6871 return pCsr->bEof; 6872 } 6873 6874 /* 6875 ** If aBlob is not NULL, then it points to a buffer nBlob bytes in size 6876 ** containing an entire zip archive image. Or, if aBlob is NULL, then pFile 6877 ** is guaranteed to be a file-handle open on a zip file. 6878 ** 6879 ** This function attempts to locate the EOCD record within the zip archive 6880 ** and populate *pEOCD with the results of decoding it. SQLITE_OK is 6881 ** returned if successful. Otherwise, an SQLite error code is returned and 6882 ** an English language error message may be left in virtual-table pTab. 6883 */ 6884 static int zipfileReadEOCD( 6885 ZipfileTab *pTab, /* Return errors here */ 6886 const u8 *aBlob, /* Pointer to in-memory file image */ 6887 int nBlob, /* Size of aBlob[] in bytes */ 6888 FILE *pFile, /* Read from this file if aBlob==0 */ 6889 ZipfileEOCD *pEOCD /* Object to populate */ 6890 ){ 6891 u8 *aRead = pTab->aBuffer; /* Temporary buffer */ 6892 int nRead; /* Bytes to read from file */ 6893 int rc = SQLITE_OK; 6894 6895 if( aBlob==0 ){ 6896 i64 iOff; /* Offset to read from */ 6897 i64 szFile; /* Total size of file in bytes */ 6898 fseek(pFile, 0, SEEK_END); 6899 szFile = (i64)ftell(pFile); 6900 if( szFile==0 ){ 6901 memset(pEOCD, 0, sizeof(ZipfileEOCD)); 6902 return SQLITE_OK; 6903 } 6904 nRead = (int)(MIN(szFile, ZIPFILE_BUFFER_SIZE)); 6905 iOff = szFile - nRead; 6906 rc = zipfileReadData(pFile, aRead, nRead, iOff, &pTab->base.zErrMsg); 6907 }else{ 6908 nRead = (int)(MIN(nBlob, ZIPFILE_BUFFER_SIZE)); 6909 aRead = (u8*)&aBlob[nBlob-nRead]; 6910 } 6911 6912 if( rc==SQLITE_OK ){ 6913 int i; 6914 6915 /* Scan backwards looking for the signature bytes */ 6916 for(i=nRead-20; i>=0; i--){ 6917 if( aRead[i]==0x50 && aRead[i+1]==0x4b 6918 && aRead[i+2]==0x05 && aRead[i+3]==0x06 6919 ){ 6920 break; 6921 } 6922 } 6923 if( i<0 ){ 6924 pTab->base.zErrMsg = sqlite3_mprintf( 6925 "cannot find end of central directory record" 6926 ); 6927 return SQLITE_ERROR; 6928 } 6929 6930 aRead += i+4; 6931 pEOCD->iDisk = zipfileRead16(aRead); 6932 pEOCD->iFirstDisk = zipfileRead16(aRead); 6933 pEOCD->nEntry = zipfileRead16(aRead); 6934 pEOCD->nEntryTotal = zipfileRead16(aRead); 6935 pEOCD->nSize = zipfileRead32(aRead); 6936 pEOCD->iOffset = zipfileRead32(aRead); 6937 } 6938 6939 return rc; 6940 } 6941 6942 /* 6943 ** Add object pNew to the linked list that begins at ZipfileTab.pFirstEntry 6944 ** and ends with pLastEntry. If argument pBefore is NULL, then pNew is added 6945 ** to the end of the list. Otherwise, it is added to the list immediately 6946 ** before pBefore (which is guaranteed to be a part of said list). 6947 */ 6948 static void zipfileAddEntry( 6949 ZipfileTab *pTab, 6950 ZipfileEntry *pBefore, 6951 ZipfileEntry *pNew 6952 ){ 6953 assert( (pTab->pFirstEntry==0)==(pTab->pLastEntry==0) ); 6954 assert( pNew->pNext==0 ); 6955 if( pBefore==0 ){ 6956 if( pTab->pFirstEntry==0 ){ 6957 pTab->pFirstEntry = pTab->pLastEntry = pNew; 6958 }else{ 6959 assert( pTab->pLastEntry->pNext==0 ); 6960 pTab->pLastEntry->pNext = pNew; 6961 pTab->pLastEntry = pNew; 6962 } 6963 }else{ 6964 ZipfileEntry **pp; 6965 for(pp=&pTab->pFirstEntry; *pp!=pBefore; pp=&((*pp)->pNext)); 6966 pNew->pNext = pBefore; 6967 *pp = pNew; 6968 } 6969 } 6970 6971 static int zipfileLoadDirectory(ZipfileTab *pTab, const u8 *aBlob, int nBlob){ 6972 ZipfileEOCD eocd; 6973 int rc; 6974 int i; 6975 i64 iOff; 6976 6977 rc = zipfileReadEOCD(pTab, aBlob, nBlob, pTab->pWriteFd, &eocd); 6978 iOff = eocd.iOffset; 6979 for(i=0; rc==SQLITE_OK && i<eocd.nEntry; i++){ 6980 ZipfileEntry *pNew = 0; 6981 rc = zipfileGetEntry(pTab, aBlob, nBlob, pTab->pWriteFd, iOff, &pNew); 6982 6983 if( rc==SQLITE_OK ){ 6984 zipfileAddEntry(pTab, 0, pNew); 6985 iOff += ZIPFILE_CDS_FIXED_SZ; 6986 iOff += (int)pNew->cds.nExtra + pNew->cds.nFile + pNew->cds.nComment; 6987 } 6988 } 6989 return rc; 6990 } 6991 6992 /* 6993 ** xFilter callback. 6994 */ 6995 static int zipfileFilter( 6996 sqlite3_vtab_cursor *cur, 6997 int idxNum, const char *idxStr, 6998 int argc, sqlite3_value **argv 6999 ){ 7000 ZipfileTab *pTab = (ZipfileTab*)cur->pVtab; 7001 ZipfileCsr *pCsr = (ZipfileCsr*)cur; 7002 const char *zFile = 0; /* Zip file to scan */ 7003 int rc = SQLITE_OK; /* Return Code */ 7004 int bInMemory = 0; /* True for an in-memory zipfile */ 7005 7006 zipfileResetCursor(pCsr); 7007 7008 if( pTab->zFile ){ 7009 zFile = pTab->zFile; 7010 }else if( idxNum==0 ){ 7011 zipfileCursorErr(pCsr, "zipfile() function requires an argument"); 7012 return SQLITE_ERROR; 7013 }else if( sqlite3_value_type(argv[0])==SQLITE_BLOB ){ 7014 const u8 *aBlob = (const u8*)sqlite3_value_blob(argv[0]); 7015 int nBlob = sqlite3_value_bytes(argv[0]); 7016 assert( pTab->pFirstEntry==0 ); 7017 rc = zipfileLoadDirectory(pTab, aBlob, nBlob); 7018 pCsr->pFreeEntry = pTab->pFirstEntry; 7019 pTab->pFirstEntry = pTab->pLastEntry = 0; 7020 if( rc!=SQLITE_OK ) return rc; 7021 bInMemory = 1; 7022 }else{ 7023 zFile = (const char*)sqlite3_value_text(argv[0]); 7024 } 7025 7026 if( 0==pTab->pWriteFd && 0==bInMemory ){ 7027 pCsr->pFile = fopen(zFile, "rb"); 7028 if( pCsr->pFile==0 ){ 7029 zipfileCursorErr(pCsr, "cannot open file: %s", zFile); 7030 rc = SQLITE_ERROR; 7031 }else{ 7032 rc = zipfileReadEOCD(pTab, 0, 0, pCsr->pFile, &pCsr->eocd); 7033 if( rc==SQLITE_OK ){ 7034 if( pCsr->eocd.nEntry==0 ){ 7035 pCsr->bEof = 1; 7036 }else{ 7037 pCsr->iNextOff = pCsr->eocd.iOffset; 7038 rc = zipfileNext(cur); 7039 } 7040 } 7041 } 7042 }else{ 7043 pCsr->bNoop = 1; 7044 pCsr->pCurrent = pCsr->pFreeEntry ? pCsr->pFreeEntry : pTab->pFirstEntry; 7045 rc = zipfileNext(cur); 7046 } 7047 7048 return rc; 7049 } 7050 7051 /* 7052 ** xBestIndex callback. 7053 */ 7054 static int zipfileBestIndex( 7055 sqlite3_vtab *tab, 7056 sqlite3_index_info *pIdxInfo 7057 ){ 7058 int i; 7059 int idx = -1; 7060 int unusable = 0; 7061 7062 for(i=0; i<pIdxInfo->nConstraint; i++){ 7063 const struct sqlite3_index_constraint *pCons = &pIdxInfo->aConstraint[i]; 7064 if( pCons->iColumn!=ZIPFILE_F_COLUMN_IDX ) continue; 7065 if( pCons->usable==0 ){ 7066 unusable = 1; 7067 }else if( pCons->op==SQLITE_INDEX_CONSTRAINT_EQ ){ 7068 idx = i; 7069 } 7070 } 7071 pIdxInfo->estimatedCost = 1000.0; 7072 if( idx>=0 ){ 7073 pIdxInfo->aConstraintUsage[idx].argvIndex = 1; 7074 pIdxInfo->aConstraintUsage[idx].omit = 1; 7075 pIdxInfo->idxNum = 1; 7076 }else if( unusable ){ 7077 return SQLITE_CONSTRAINT; 7078 } 7079 return SQLITE_OK; 7080 } 7081 7082 static ZipfileEntry *zipfileNewEntry(const char *zPath){ 7083 ZipfileEntry *pNew; 7084 pNew = sqlite3_malloc(sizeof(ZipfileEntry)); 7085 if( pNew ){ 7086 memset(pNew, 0, sizeof(ZipfileEntry)); 7087 pNew->cds.zFile = sqlite3_mprintf("%s", zPath); 7088 if( pNew->cds.zFile==0 ){ 7089 sqlite3_free(pNew); 7090 pNew = 0; 7091 } 7092 } 7093 return pNew; 7094 } 7095 7096 static int zipfileSerializeLFH(ZipfileEntry *pEntry, u8 *aBuf){ 7097 ZipfileCDS *pCds = &pEntry->cds; 7098 u8 *a = aBuf; 7099 7100 pCds->nExtra = 9; 7101 7102 /* Write the LFH itself */ 7103 zipfileWrite32(a, ZIPFILE_SIGNATURE_LFH); 7104 zipfileWrite16(a, pCds->iVersionExtract); 7105 zipfileWrite16(a, pCds->flags); 7106 zipfileWrite16(a, pCds->iCompression); 7107 zipfileWrite16(a, pCds->mTime); 7108 zipfileWrite16(a, pCds->mDate); 7109 zipfileWrite32(a, pCds->crc32); 7110 zipfileWrite32(a, pCds->szCompressed); 7111 zipfileWrite32(a, pCds->szUncompressed); 7112 zipfileWrite16(a, (u16)pCds->nFile); 7113 zipfileWrite16(a, pCds->nExtra); 7114 assert( a==&aBuf[ZIPFILE_LFH_FIXED_SZ] ); 7115 7116 /* Add the file name */ 7117 memcpy(a, pCds->zFile, (int)pCds->nFile); 7118 a += (int)pCds->nFile; 7119 7120 /* The "extra" data */ 7121 zipfileWrite16(a, ZIPFILE_EXTRA_TIMESTAMP); 7122 zipfileWrite16(a, 5); 7123 *a++ = 0x01; 7124 zipfileWrite32(a, pEntry->mUnixTime); 7125 7126 return a-aBuf; 7127 } 7128 7129 static int zipfileAppendEntry( 7130 ZipfileTab *pTab, 7131 ZipfileEntry *pEntry, 7132 const u8 *pData, 7133 int nData 7134 ){ 7135 u8 *aBuf = pTab->aBuffer; 7136 int nBuf; 7137 int rc; 7138 7139 nBuf = zipfileSerializeLFH(pEntry, aBuf); 7140 rc = zipfileAppendData(pTab, aBuf, nBuf); 7141 if( rc==SQLITE_OK ){ 7142 pEntry->iDataOff = pTab->szCurrent; 7143 rc = zipfileAppendData(pTab, pData, nData); 7144 } 7145 7146 return rc; 7147 } 7148 7149 static int zipfileGetMode( 7150 sqlite3_value *pVal, 7151 int bIsDir, /* If true, default to directory */ 7152 u32 *pMode, /* OUT: Mode value */ 7153 char **pzErr /* OUT: Error message */ 7154 ){ 7155 const char *z = (const char*)sqlite3_value_text(pVal); 7156 u32 mode = 0; 7157 if( z==0 ){ 7158 mode = (bIsDir ? (S_IFDIR + 0755) : (S_IFREG + 0644)); 7159 }else if( z[0]>='0' && z[0]<='9' ){ 7160 mode = (unsigned int)sqlite3_value_int(pVal); 7161 }else{ 7162 const char zTemplate[11] = "-rwxrwxrwx"; 7163 int i; 7164 if( strlen(z)!=10 ) goto parse_error; 7165 switch( z[0] ){ 7166 case '-': mode |= S_IFREG; break; 7167 case 'd': mode |= S_IFDIR; break; 7168 case 'l': mode |= S_IFLNK; break; 7169 default: goto parse_error; 7170 } 7171 for(i=1; i<10; i++){ 7172 if( z[i]==zTemplate[i] ) mode |= 1 << (9-i); 7173 else if( z[i]!='-' ) goto parse_error; 7174 } 7175 } 7176 if( ((mode & S_IFDIR)==0)==bIsDir ){ 7177 /* The "mode" attribute is a directory, but data has been specified. 7178 ** Or vice-versa - no data but "mode" is a file or symlink. */ 7179 *pzErr = sqlite3_mprintf("zipfile: mode does not match data"); 7180 return SQLITE_CONSTRAINT; 7181 } 7182 *pMode = mode; 7183 return SQLITE_OK; 7184 7185 parse_error: 7186 *pzErr = sqlite3_mprintf("zipfile: parse error in mode: %s", z); 7187 return SQLITE_ERROR; 7188 } 7189 7190 /* 7191 ** Both (const char*) arguments point to nul-terminated strings. Argument 7192 ** nB is the value of strlen(zB). This function returns 0 if the strings are 7193 ** identical, ignoring any trailing '/' character in either path. */ 7194 static int zipfileComparePath(const char *zA, const char *zB, int nB){ 7195 int nA = (int)strlen(zA); 7196 if( nA>0 && zA[nA-1]=='/' ) nA--; 7197 if( nB>0 && zB[nB-1]=='/' ) nB--; 7198 if( nA==nB && memcmp(zA, zB, nA)==0 ) return 0; 7199 return 1; 7200 } 7201 7202 static int zipfileBegin(sqlite3_vtab *pVtab){ 7203 ZipfileTab *pTab = (ZipfileTab*)pVtab; 7204 int rc = SQLITE_OK; 7205 7206 assert( pTab->pWriteFd==0 ); 7207 if( pTab->zFile==0 || pTab->zFile[0]==0 ){ 7208 pTab->base.zErrMsg = sqlite3_mprintf("zipfile: missing filename"); 7209 return SQLITE_ERROR; 7210 } 7211 7212 /* Open a write fd on the file. Also load the entire central directory 7213 ** structure into memory. During the transaction any new file data is 7214 ** appended to the archive file, but the central directory is accumulated 7215 ** in main-memory until the transaction is committed. */ 7216 pTab->pWriteFd = fopen(pTab->zFile, "ab+"); 7217 if( pTab->pWriteFd==0 ){ 7218 pTab->base.zErrMsg = sqlite3_mprintf( 7219 "zipfile: failed to open file %s for writing", pTab->zFile 7220 ); 7221 rc = SQLITE_ERROR; 7222 }else{ 7223 fseek(pTab->pWriteFd, 0, SEEK_END); 7224 pTab->szCurrent = pTab->szOrig = (i64)ftell(pTab->pWriteFd); 7225 rc = zipfileLoadDirectory(pTab, 0, 0); 7226 } 7227 7228 if( rc!=SQLITE_OK ){ 7229 zipfileCleanupTransaction(pTab); 7230 } 7231 7232 return rc; 7233 } 7234 7235 /* 7236 ** Return the current time as a 32-bit timestamp in UNIX epoch format (like 7237 ** time(2)). 7238 */ 7239 static u32 zipfileTime(void){ 7240 sqlite3_vfs *pVfs = sqlite3_vfs_find(0); 7241 u32 ret; 7242 if( pVfs->iVersion>=2 && pVfs->xCurrentTimeInt64 ){ 7243 i64 ms; 7244 pVfs->xCurrentTimeInt64(pVfs, &ms); 7245 ret = (u32)((ms/1000) - ((i64)24405875 * 8640)); 7246 }else{ 7247 double day; 7248 pVfs->xCurrentTime(pVfs, &day); 7249 ret = (u32)((day - 2440587.5) * 86400); 7250 } 7251 return ret; 7252 } 7253 7254 /* 7255 ** Return a 32-bit timestamp in UNIX epoch format. 7256 ** 7257 ** If the value passed as the only argument is either NULL or an SQL NULL, 7258 ** return the current time. Otherwise, return the value stored in (*pVal) 7259 ** cast to a 32-bit unsigned integer. 7260 */ 7261 static u32 zipfileGetTime(sqlite3_value *pVal){ 7262 if( pVal==0 || sqlite3_value_type(pVal)==SQLITE_NULL ){ 7263 return zipfileTime(); 7264 } 7265 return (u32)sqlite3_value_int64(pVal); 7266 } 7267 7268 /* 7269 ** Unless it is NULL, entry pOld is currently part of the pTab->pFirstEntry 7270 ** linked list. Remove it from the list and free the object. 7271 */ 7272 static void zipfileRemoveEntryFromList(ZipfileTab *pTab, ZipfileEntry *pOld){ 7273 if( pOld ){ 7274 ZipfileEntry **pp; 7275 for(pp=&pTab->pFirstEntry; (*pp)!=pOld; pp=&((*pp)->pNext)); 7276 *pp = (*pp)->pNext; 7277 zipfileEntryFree(pOld); 7278 } 7279 } 7280 7281 /* 7282 ** xUpdate method. 7283 */ 7284 static int zipfileUpdate( 7285 sqlite3_vtab *pVtab, 7286 int nVal, 7287 sqlite3_value **apVal, 7288 sqlite_int64 *pRowid 7289 ){ 7290 ZipfileTab *pTab = (ZipfileTab*)pVtab; 7291 int rc = SQLITE_OK; /* Return Code */ 7292 ZipfileEntry *pNew = 0; /* New in-memory CDS entry */ 7293 7294 u32 mode = 0; /* Mode for new entry */ 7295 u32 mTime = 0; /* Modification time for new entry */ 7296 i64 sz = 0; /* Uncompressed size */ 7297 const char *zPath = 0; /* Path for new entry */ 7298 int nPath = 0; /* strlen(zPath) */ 7299 const u8 *pData = 0; /* Pointer to buffer containing content */ 7300 int nData = 0; /* Size of pData buffer in bytes */ 7301 int iMethod = 0; /* Compression method for new entry */ 7302 u8 *pFree = 0; /* Free this */ 7303 char *zFree = 0; /* Also free this */ 7304 ZipfileEntry *pOld = 0; 7305 ZipfileEntry *pOld2 = 0; 7306 int bUpdate = 0; /* True for an update that modifies "name" */ 7307 int bIsDir = 0; 7308 u32 iCrc32 = 0; 7309 7310 if( pTab->pWriteFd==0 ){ 7311 rc = zipfileBegin(pVtab); 7312 if( rc!=SQLITE_OK ) return rc; 7313 } 7314 7315 /* If this is a DELETE or UPDATE, find the archive entry to delete. */ 7316 if( sqlite3_value_type(apVal[0])!=SQLITE_NULL ){ 7317 const char *zDelete = (const char*)sqlite3_value_text(apVal[0]); 7318 int nDelete = (int)strlen(zDelete); 7319 if( nVal>1 ){ 7320 const char *zUpdate = (const char*)sqlite3_value_text(apVal[1]); 7321 if( zUpdate && zipfileComparePath(zUpdate, zDelete, nDelete)!=0 ){ 7322 bUpdate = 1; 7323 } 7324 } 7325 for(pOld=pTab->pFirstEntry; 1; pOld=pOld->pNext){ 7326 if( zipfileComparePath(pOld->cds.zFile, zDelete, nDelete)==0 ){ 7327 break; 7328 } 7329 assert( pOld->pNext ); 7330 } 7331 } 7332 7333 if( nVal>1 ){ 7334 /* Check that "sz" and "rawdata" are both NULL: */ 7335 if( sqlite3_value_type(apVal[5])!=SQLITE_NULL ){ 7336 zipfileTableErr(pTab, "sz must be NULL"); 7337 rc = SQLITE_CONSTRAINT; 7338 } 7339 if( sqlite3_value_type(apVal[6])!=SQLITE_NULL ){ 7340 zipfileTableErr(pTab, "rawdata must be NULL"); 7341 rc = SQLITE_CONSTRAINT; 7342 } 7343 7344 if( rc==SQLITE_OK ){ 7345 if( sqlite3_value_type(apVal[7])==SQLITE_NULL ){ 7346 /* data=NULL. A directory */ 7347 bIsDir = 1; 7348 }else{ 7349 /* Value specified for "data", and possibly "method". This must be 7350 ** a regular file or a symlink. */ 7351 const u8 *aIn = sqlite3_value_blob(apVal[7]); 7352 int nIn = sqlite3_value_bytes(apVal[7]); 7353 int bAuto = sqlite3_value_type(apVal[8])==SQLITE_NULL; 7354 7355 iMethod = sqlite3_value_int(apVal[8]); 7356 sz = nIn; 7357 pData = aIn; 7358 nData = nIn; 7359 if( iMethod!=0 && iMethod!=8 ){ 7360 zipfileTableErr(pTab, "unknown compression method: %d", iMethod); 7361 rc = SQLITE_CONSTRAINT; 7362 }else{ 7363 if( bAuto || iMethod ){ 7364 int nCmp; 7365 rc = zipfileDeflate(aIn, nIn, &pFree, &nCmp, &pTab->base.zErrMsg); 7366 if( rc==SQLITE_OK ){ 7367 if( iMethod || nCmp<nIn ){ 7368 iMethod = 8; 7369 pData = pFree; 7370 nData = nCmp; 7371 } 7372 } 7373 } 7374 iCrc32 = crc32(0, aIn, nIn); 7375 } 7376 } 7377 } 7378 7379 if( rc==SQLITE_OK ){ 7380 rc = zipfileGetMode(apVal[3], bIsDir, &mode, &pTab->base.zErrMsg); 7381 } 7382 7383 if( rc==SQLITE_OK ){ 7384 zPath = (const char*)sqlite3_value_text(apVal[2]); 7385 if( zPath==0 ) zPath = ""; 7386 nPath = (int)strlen(zPath); 7387 mTime = zipfileGetTime(apVal[4]); 7388 } 7389 7390 if( rc==SQLITE_OK && bIsDir ){ 7391 /* For a directory, check that the last character in the path is a 7392 ** '/'. This appears to be required for compatibility with info-zip 7393 ** (the unzip command on unix). It does not create directories 7394 ** otherwise. */ 7395 if( nPath<=0 || zPath[nPath-1]!='/' ){ 7396 zFree = sqlite3_mprintf("%s/", zPath); 7397 zPath = (const char*)zFree; 7398 if( zFree==0 ){ 7399 rc = SQLITE_NOMEM; 7400 nPath = 0; 7401 }else{ 7402 nPath = (int)strlen(zPath); 7403 } 7404 } 7405 } 7406 7407 /* Check that we're not inserting a duplicate entry -OR- updating an 7408 ** entry with a path, thereby making it into a duplicate. */ 7409 if( (pOld==0 || bUpdate) && rc==SQLITE_OK ){ 7410 ZipfileEntry *p; 7411 for(p=pTab->pFirstEntry; p; p=p->pNext){ 7412 if( zipfileComparePath(p->cds.zFile, zPath, nPath)==0 ){ 7413 switch( sqlite3_vtab_on_conflict(pTab->db) ){ 7414 case SQLITE_IGNORE: { 7415 goto zipfile_update_done; 7416 } 7417 case SQLITE_REPLACE: { 7418 pOld2 = p; 7419 break; 7420 } 7421 default: { 7422 zipfileTableErr(pTab, "duplicate name: \"%s\"", zPath); 7423 rc = SQLITE_CONSTRAINT; 7424 break; 7425 } 7426 } 7427 break; 7428 } 7429 } 7430 } 7431 7432 if( rc==SQLITE_OK ){ 7433 /* Create the new CDS record. */ 7434 pNew = zipfileNewEntry(zPath); 7435 if( pNew==0 ){ 7436 rc = SQLITE_NOMEM; 7437 }else{ 7438 pNew->cds.iVersionMadeBy = ZIPFILE_NEWENTRY_MADEBY; 7439 pNew->cds.iVersionExtract = ZIPFILE_NEWENTRY_REQUIRED; 7440 pNew->cds.flags = ZIPFILE_NEWENTRY_FLAGS; 7441 pNew->cds.iCompression = (u16)iMethod; 7442 zipfileMtimeToDos(&pNew->cds, mTime); 7443 pNew->cds.crc32 = iCrc32; 7444 pNew->cds.szCompressed = nData; 7445 pNew->cds.szUncompressed = (u32)sz; 7446 pNew->cds.iExternalAttr = (mode<<16); 7447 pNew->cds.iOffset = (u32)pTab->szCurrent; 7448 pNew->cds.nFile = (u16)nPath; 7449 pNew->mUnixTime = (u32)mTime; 7450 rc = zipfileAppendEntry(pTab, pNew, pData, nData); 7451 zipfileAddEntry(pTab, pOld, pNew); 7452 } 7453 } 7454 } 7455 7456 if( rc==SQLITE_OK && (pOld || pOld2) ){ 7457 ZipfileCsr *pCsr; 7458 for(pCsr=pTab->pCsrList; pCsr; pCsr=pCsr->pCsrNext){ 7459 if( pCsr->pCurrent && (pCsr->pCurrent==pOld || pCsr->pCurrent==pOld2) ){ 7460 pCsr->pCurrent = pCsr->pCurrent->pNext; 7461 pCsr->bNoop = 1; 7462 } 7463 } 7464 7465 zipfileRemoveEntryFromList(pTab, pOld); 7466 zipfileRemoveEntryFromList(pTab, pOld2); 7467 } 7468 7469 zipfile_update_done: 7470 sqlite3_free(pFree); 7471 sqlite3_free(zFree); 7472 return rc; 7473 } 7474 7475 static int zipfileSerializeEOCD(ZipfileEOCD *p, u8 *aBuf){ 7476 u8 *a = aBuf; 7477 zipfileWrite32(a, ZIPFILE_SIGNATURE_EOCD); 7478 zipfileWrite16(a, p->iDisk); 7479 zipfileWrite16(a, p->iFirstDisk); 7480 zipfileWrite16(a, p->nEntry); 7481 zipfileWrite16(a, p->nEntryTotal); 7482 zipfileWrite32(a, p->nSize); 7483 zipfileWrite32(a, p->iOffset); 7484 zipfileWrite16(a, 0); /* Size of trailing comment in bytes*/ 7485 7486 return a-aBuf; 7487 } 7488 7489 static int zipfileAppendEOCD(ZipfileTab *pTab, ZipfileEOCD *p){ 7490 int nBuf = zipfileSerializeEOCD(p, pTab->aBuffer); 7491 assert( nBuf==ZIPFILE_EOCD_FIXED_SZ ); 7492 return zipfileAppendData(pTab, pTab->aBuffer, nBuf); 7493 } 7494 7495 /* 7496 ** Serialize the CDS structure into buffer aBuf[]. Return the number 7497 ** of bytes written. 7498 */ 7499 static int zipfileSerializeCDS(ZipfileEntry *pEntry, u8 *aBuf){ 7500 u8 *a = aBuf; 7501 ZipfileCDS *pCDS = &pEntry->cds; 7502 7503 if( pEntry->aExtra==0 ){ 7504 pCDS->nExtra = 9; 7505 } 7506 7507 zipfileWrite32(a, ZIPFILE_SIGNATURE_CDS); 7508 zipfileWrite16(a, pCDS->iVersionMadeBy); 7509 zipfileWrite16(a, pCDS->iVersionExtract); 7510 zipfileWrite16(a, pCDS->flags); 7511 zipfileWrite16(a, pCDS->iCompression); 7512 zipfileWrite16(a, pCDS->mTime); 7513 zipfileWrite16(a, pCDS->mDate); 7514 zipfileWrite32(a, pCDS->crc32); 7515 zipfileWrite32(a, pCDS->szCompressed); 7516 zipfileWrite32(a, pCDS->szUncompressed); 7517 assert( a==&aBuf[ZIPFILE_CDS_NFILE_OFF] ); 7518 zipfileWrite16(a, pCDS->nFile); 7519 zipfileWrite16(a, pCDS->nExtra); 7520 zipfileWrite16(a, pCDS->nComment); 7521 zipfileWrite16(a, pCDS->iDiskStart); 7522 zipfileWrite16(a, pCDS->iInternalAttr); 7523 zipfileWrite32(a, pCDS->iExternalAttr); 7524 zipfileWrite32(a, pCDS->iOffset); 7525 7526 memcpy(a, pCDS->zFile, pCDS->nFile); 7527 a += pCDS->nFile; 7528 7529 if( pEntry->aExtra ){ 7530 int n = (int)pCDS->nExtra + (int)pCDS->nComment; 7531 memcpy(a, pEntry->aExtra, n); 7532 a += n; 7533 }else{ 7534 assert( pCDS->nExtra==9 ); 7535 zipfileWrite16(a, ZIPFILE_EXTRA_TIMESTAMP); 7536 zipfileWrite16(a, 5); 7537 *a++ = 0x01; 7538 zipfileWrite32(a, pEntry->mUnixTime); 7539 } 7540 7541 return a-aBuf; 7542 } 7543 7544 static int zipfileCommit(sqlite3_vtab *pVtab){ 7545 ZipfileTab *pTab = (ZipfileTab*)pVtab; 7546 int rc = SQLITE_OK; 7547 if( pTab->pWriteFd ){ 7548 i64 iOffset = pTab->szCurrent; 7549 ZipfileEntry *p; 7550 ZipfileEOCD eocd; 7551 int nEntry = 0; 7552 7553 /* Write out all entries */ 7554 for(p=pTab->pFirstEntry; rc==SQLITE_OK && p; p=p->pNext){ 7555 int n = zipfileSerializeCDS(p, pTab->aBuffer); 7556 rc = zipfileAppendData(pTab, pTab->aBuffer, n); 7557 nEntry++; 7558 } 7559 7560 /* Write out the EOCD record */ 7561 eocd.iDisk = 0; 7562 eocd.iFirstDisk = 0; 7563 eocd.nEntry = (u16)nEntry; 7564 eocd.nEntryTotal = (u16)nEntry; 7565 eocd.nSize = (u32)(pTab->szCurrent - iOffset); 7566 eocd.iOffset = (u32)iOffset; 7567 rc = zipfileAppendEOCD(pTab, &eocd); 7568 7569 zipfileCleanupTransaction(pTab); 7570 } 7571 return rc; 7572 } 7573 7574 static int zipfileRollback(sqlite3_vtab *pVtab){ 7575 return zipfileCommit(pVtab); 7576 } 7577 7578 static ZipfileCsr *zipfileFindCursor(ZipfileTab *pTab, i64 iId){ 7579 ZipfileCsr *pCsr; 7580 for(pCsr=pTab->pCsrList; pCsr; pCsr=pCsr->pCsrNext){ 7581 if( iId==pCsr->iId ) break; 7582 } 7583 return pCsr; 7584 } 7585 7586 static void zipfileFunctionCds( 7587 sqlite3_context *context, 7588 int argc, 7589 sqlite3_value **argv 7590 ){ 7591 ZipfileCsr *pCsr; 7592 ZipfileTab *pTab = (ZipfileTab*)sqlite3_user_data(context); 7593 assert( argc>0 ); 7594 7595 pCsr = zipfileFindCursor(pTab, sqlite3_value_int64(argv[0])); 7596 if( pCsr ){ 7597 ZipfileCDS *p = &pCsr->pCurrent->cds; 7598 char *zRes = sqlite3_mprintf("{" 7599 "\"version-made-by\" : %u, " 7600 "\"version-to-extract\" : %u, " 7601 "\"flags\" : %u, " 7602 "\"compression\" : %u, " 7603 "\"time\" : %u, " 7604 "\"date\" : %u, " 7605 "\"crc32\" : %u, " 7606 "\"compressed-size\" : %u, " 7607 "\"uncompressed-size\" : %u, " 7608 "\"file-name-length\" : %u, " 7609 "\"extra-field-length\" : %u, " 7610 "\"file-comment-length\" : %u, " 7611 "\"disk-number-start\" : %u, " 7612 "\"internal-attr\" : %u, " 7613 "\"external-attr\" : %u, " 7614 "\"offset\" : %u }", 7615 (u32)p->iVersionMadeBy, (u32)p->iVersionExtract, 7616 (u32)p->flags, (u32)p->iCompression, 7617 (u32)p->mTime, (u32)p->mDate, 7618 (u32)p->crc32, (u32)p->szCompressed, 7619 (u32)p->szUncompressed, (u32)p->nFile, 7620 (u32)p->nExtra, (u32)p->nComment, 7621 (u32)p->iDiskStart, (u32)p->iInternalAttr, 7622 (u32)p->iExternalAttr, (u32)p->iOffset 7623 ); 7624 7625 if( zRes==0 ){ 7626 sqlite3_result_error_nomem(context); 7627 }else{ 7628 sqlite3_result_text(context, zRes, -1, SQLITE_TRANSIENT); 7629 sqlite3_free(zRes); 7630 } 7631 } 7632 } 7633 7634 /* 7635 ** xFindFunction method. 7636 */ 7637 static int zipfileFindFunction( 7638 sqlite3_vtab *pVtab, /* Virtual table handle */ 7639 int nArg, /* Number of SQL function arguments */ 7640 const char *zName, /* Name of SQL function */ 7641 void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), /* OUT: Result */ 7642 void **ppArg /* OUT: User data for *pxFunc */ 7643 ){ 7644 if( sqlite3_stricmp("zipfile_cds", zName)==0 ){ 7645 *pxFunc = zipfileFunctionCds; 7646 *ppArg = (void*)pVtab; 7647 return 1; 7648 } 7649 return 0; 7650 } 7651 7652 typedef struct ZipfileBuffer ZipfileBuffer; 7653 struct ZipfileBuffer { 7654 u8 *a; /* Pointer to buffer */ 7655 int n; /* Size of buffer in bytes */ 7656 int nAlloc; /* Byte allocated at a[] */ 7657 }; 7658 7659 typedef struct ZipfileCtx ZipfileCtx; 7660 struct ZipfileCtx { 7661 int nEntry; 7662 ZipfileBuffer body; 7663 ZipfileBuffer cds; 7664 }; 7665 7666 static int zipfileBufferGrow(ZipfileBuffer *pBuf, int nByte){ 7667 if( pBuf->n+nByte>pBuf->nAlloc ){ 7668 u8 *aNew; 7669 sqlite3_int64 nNew = pBuf->n ? pBuf->n*2 : 512; 7670 int nReq = pBuf->n + nByte; 7671 7672 while( nNew<nReq ) nNew = nNew*2; 7673 aNew = sqlite3_realloc64(pBuf->a, nNew); 7674 if( aNew==0 ) return SQLITE_NOMEM; 7675 pBuf->a = aNew; 7676 pBuf->nAlloc = (int)nNew; 7677 } 7678 return SQLITE_OK; 7679 } 7680 7681 /* 7682 ** xStep() callback for the zipfile() aggregate. This can be called in 7683 ** any of the following ways: 7684 ** 7685 ** SELECT zipfile(name,data) ... 7686 ** SELECT zipfile(name,mode,mtime,data) ... 7687 ** SELECT zipfile(name,mode,mtime,data,method) ... 7688 */ 7689 void zipfileStep(sqlite3_context *pCtx, int nVal, sqlite3_value **apVal){ 7690 ZipfileCtx *p; /* Aggregate function context */ 7691 ZipfileEntry e; /* New entry to add to zip archive */ 7692 7693 sqlite3_value *pName = 0; 7694 sqlite3_value *pMode = 0; 7695 sqlite3_value *pMtime = 0; 7696 sqlite3_value *pData = 0; 7697 sqlite3_value *pMethod = 0; 7698 7699 int bIsDir = 0; 7700 u32 mode; 7701 int rc = SQLITE_OK; 7702 char *zErr = 0; 7703 7704 int iMethod = -1; /* Compression method to use (0 or 8) */ 7705 7706 const u8 *aData = 0; /* Possibly compressed data for new entry */ 7707 int nData = 0; /* Size of aData[] in bytes */ 7708 int szUncompressed = 0; /* Size of data before compression */ 7709 u8 *aFree = 0; /* Free this before returning */ 7710 u32 iCrc32 = 0; /* crc32 of uncompressed data */ 7711 7712 char *zName = 0; /* Path (name) of new entry */ 7713 int nName = 0; /* Size of zName in bytes */ 7714 char *zFree = 0; /* Free this before returning */ 7715 int nByte; 7716 7717 memset(&e, 0, sizeof(e)); 7718 p = (ZipfileCtx*)sqlite3_aggregate_context(pCtx, sizeof(ZipfileCtx)); 7719 if( p==0 ) return; 7720 7721 /* Martial the arguments into stack variables */ 7722 if( nVal!=2 && nVal!=4 && nVal!=5 ){ 7723 zErr = sqlite3_mprintf("wrong number of arguments to function zipfile()"); 7724 rc = SQLITE_ERROR; 7725 goto zipfile_step_out; 7726 } 7727 pName = apVal[0]; 7728 if( nVal==2 ){ 7729 pData = apVal[1]; 7730 }else{ 7731 pMode = apVal[1]; 7732 pMtime = apVal[2]; 7733 pData = apVal[3]; 7734 if( nVal==5 ){ 7735 pMethod = apVal[4]; 7736 } 7737 } 7738 7739 /* Check that the 'name' parameter looks ok. */ 7740 zName = (char*)sqlite3_value_text(pName); 7741 nName = sqlite3_value_bytes(pName); 7742 if( zName==0 ){ 7743 zErr = sqlite3_mprintf("first argument to zipfile() must be non-NULL"); 7744 rc = SQLITE_ERROR; 7745 goto zipfile_step_out; 7746 } 7747 7748 /* Inspect the 'method' parameter. This must be either 0 (store), 8 (use 7749 ** deflate compression) or NULL (choose automatically). */ 7750 if( pMethod && SQLITE_NULL!=sqlite3_value_type(pMethod) ){ 7751 iMethod = (int)sqlite3_value_int64(pMethod); 7752 if( iMethod!=0 && iMethod!=8 ){ 7753 zErr = sqlite3_mprintf("illegal method value: %d", iMethod); 7754 rc = SQLITE_ERROR; 7755 goto zipfile_step_out; 7756 } 7757 } 7758 7759 /* Now inspect the data. If this is NULL, then the new entry must be a 7760 ** directory. Otherwise, figure out whether or not the data should 7761 ** be deflated or simply stored in the zip archive. */ 7762 if( sqlite3_value_type(pData)==SQLITE_NULL ){ 7763 bIsDir = 1; 7764 iMethod = 0; 7765 }else{ 7766 aData = sqlite3_value_blob(pData); 7767 szUncompressed = nData = sqlite3_value_bytes(pData); 7768 iCrc32 = crc32(0, aData, nData); 7769 if( iMethod<0 || iMethod==8 ){ 7770 int nOut = 0; 7771 rc = zipfileDeflate(aData, nData, &aFree, &nOut, &zErr); 7772 if( rc!=SQLITE_OK ){ 7773 goto zipfile_step_out; 7774 } 7775 if( iMethod==8 || nOut<nData ){ 7776 aData = aFree; 7777 nData = nOut; 7778 iMethod = 8; 7779 }else{ 7780 iMethod = 0; 7781 } 7782 } 7783 } 7784 7785 /* Decode the "mode" argument. */ 7786 rc = zipfileGetMode(pMode, bIsDir, &mode, &zErr); 7787 if( rc ) goto zipfile_step_out; 7788 7789 /* Decode the "mtime" argument. */ 7790 e.mUnixTime = zipfileGetTime(pMtime); 7791 7792 /* If this is a directory entry, ensure that there is exactly one '/' 7793 ** at the end of the path. Or, if this is not a directory and the path 7794 ** ends in '/' it is an error. */ 7795 if( bIsDir==0 ){ 7796 if( nName>0 && zName[nName-1]=='/' ){ 7797 zErr = sqlite3_mprintf("non-directory name must not end with /"); 7798 rc = SQLITE_ERROR; 7799 goto zipfile_step_out; 7800 } 7801 }else{ 7802 if( nName==0 || zName[nName-1]!='/' ){ 7803 zName = zFree = sqlite3_mprintf("%s/", zName); 7804 if( zName==0 ){ 7805 rc = SQLITE_NOMEM; 7806 goto zipfile_step_out; 7807 } 7808 nName = (int)strlen(zName); 7809 }else{ 7810 while( nName>1 && zName[nName-2]=='/' ) nName--; 7811 } 7812 } 7813 7814 /* Assemble the ZipfileEntry object for the new zip archive entry */ 7815 e.cds.iVersionMadeBy = ZIPFILE_NEWENTRY_MADEBY; 7816 e.cds.iVersionExtract = ZIPFILE_NEWENTRY_REQUIRED; 7817 e.cds.flags = ZIPFILE_NEWENTRY_FLAGS; 7818 e.cds.iCompression = (u16)iMethod; 7819 zipfileMtimeToDos(&e.cds, (u32)e.mUnixTime); 7820 e.cds.crc32 = iCrc32; 7821 e.cds.szCompressed = nData; 7822 e.cds.szUncompressed = szUncompressed; 7823 e.cds.iExternalAttr = (mode<<16); 7824 e.cds.iOffset = p->body.n; 7825 e.cds.nFile = (u16)nName; 7826 e.cds.zFile = zName; 7827 7828 /* Append the LFH to the body of the new archive */ 7829 nByte = ZIPFILE_LFH_FIXED_SZ + e.cds.nFile + 9; 7830 if( (rc = zipfileBufferGrow(&p->body, nByte)) ) goto zipfile_step_out; 7831 p->body.n += zipfileSerializeLFH(&e, &p->body.a[p->body.n]); 7832 7833 /* Append the data to the body of the new archive */ 7834 if( nData>0 ){ 7835 if( (rc = zipfileBufferGrow(&p->body, nData)) ) goto zipfile_step_out; 7836 memcpy(&p->body.a[p->body.n], aData, nData); 7837 p->body.n += nData; 7838 } 7839 7840 /* Append the CDS record to the directory of the new archive */ 7841 nByte = ZIPFILE_CDS_FIXED_SZ + e.cds.nFile + 9; 7842 if( (rc = zipfileBufferGrow(&p->cds, nByte)) ) goto zipfile_step_out; 7843 p->cds.n += zipfileSerializeCDS(&e, &p->cds.a[p->cds.n]); 7844 7845 /* Increment the count of entries in the archive */ 7846 p->nEntry++; 7847 7848 zipfile_step_out: 7849 sqlite3_free(aFree); 7850 sqlite3_free(zFree); 7851 if( rc ){ 7852 if( zErr ){ 7853 sqlite3_result_error(pCtx, zErr, -1); 7854 }else{ 7855 sqlite3_result_error_code(pCtx, rc); 7856 } 7857 } 7858 sqlite3_free(zErr); 7859 } 7860 7861 /* 7862 ** xFinalize() callback for zipfile aggregate function. 7863 */ 7864 void zipfileFinal(sqlite3_context *pCtx){ 7865 ZipfileCtx *p; 7866 ZipfileEOCD eocd; 7867 sqlite3_int64 nZip; 7868 u8 *aZip; 7869 7870 p = (ZipfileCtx*)sqlite3_aggregate_context(pCtx, sizeof(ZipfileCtx)); 7871 if( p==0 ) return; 7872 if( p->nEntry>0 ){ 7873 memset(&eocd, 0, sizeof(eocd)); 7874 eocd.nEntry = (u16)p->nEntry; 7875 eocd.nEntryTotal = (u16)p->nEntry; 7876 eocd.nSize = p->cds.n; 7877 eocd.iOffset = p->body.n; 7878 7879 nZip = p->body.n + p->cds.n + ZIPFILE_EOCD_FIXED_SZ; 7880 aZip = (u8*)sqlite3_malloc64(nZip); 7881 if( aZip==0 ){ 7882 sqlite3_result_error_nomem(pCtx); 7883 }else{ 7884 memcpy(aZip, p->body.a, p->body.n); 7885 memcpy(&aZip[p->body.n], p->cds.a, p->cds.n); 7886 zipfileSerializeEOCD(&eocd, &aZip[p->body.n + p->cds.n]); 7887 sqlite3_result_blob(pCtx, aZip, (int)nZip, zipfileFree); 7888 } 7889 } 7890 7891 sqlite3_free(p->body.a); 7892 sqlite3_free(p->cds.a); 7893 } 7894 7895 7896 /* 7897 ** Register the "zipfile" virtual table. 7898 */ 7899 static int zipfileRegister(sqlite3 *db){ 7900 static sqlite3_module zipfileModule = { 7901 1, /* iVersion */ 7902 zipfileConnect, /* xCreate */ 7903 zipfileConnect, /* xConnect */ 7904 zipfileBestIndex, /* xBestIndex */ 7905 zipfileDisconnect, /* xDisconnect */ 7906 zipfileDisconnect, /* xDestroy */ 7907 zipfileOpen, /* xOpen - open a cursor */ 7908 zipfileClose, /* xClose - close a cursor */ 7909 zipfileFilter, /* xFilter - configure scan constraints */ 7910 zipfileNext, /* xNext - advance a cursor */ 7911 zipfileEof, /* xEof - check for end of scan */ 7912 zipfileColumn, /* xColumn - read data */ 7913 0, /* xRowid - read data */ 7914 zipfileUpdate, /* xUpdate */ 7915 zipfileBegin, /* xBegin */ 7916 0, /* xSync */ 7917 zipfileCommit, /* xCommit */ 7918 zipfileRollback, /* xRollback */ 7919 zipfileFindFunction, /* xFindMethod */ 7920 0, /* xRename */ 7921 }; 7922 7923 int rc = sqlite3_create_module(db, "zipfile" , &zipfileModule, 0); 7924 if( rc==SQLITE_OK ) rc = sqlite3_overload_function(db, "zipfile_cds", -1); 7925 if( rc==SQLITE_OK ){ 7926 rc = sqlite3_create_function(db, "zipfile", -1, SQLITE_UTF8, 0, 0, 7927 zipfileStep, zipfileFinal 7928 ); 7929 } 7930 return rc; 7931 } 7932 #else /* SQLITE_OMIT_VIRTUALTABLE */ 7933 # define zipfileRegister(x) SQLITE_OK 7934 #endif 7935 7936 #ifdef _WIN32 7937 7938 #endif 7939 int sqlite3_zipfile_init( 7940 sqlite3 *db, 7941 char **pzErrMsg, 7942 const sqlite3_api_routines *pApi 7943 ){ 7944 SQLITE_EXTENSION_INIT2(pApi); 7945 (void)pzErrMsg; /* Unused parameter */ 7946 return zipfileRegister(db); 7947 } 7948 7949 /************************* End ../ext/misc/zipfile.c ********************/ 7950 /************************* Begin ../ext/misc/sqlar.c ******************/ 7951 /* 7952 ** 2017-12-17 7953 ** 7954 ** The author disclaims copyright to this source code. In place of 7955 ** a legal notice, here is a blessing: 7956 ** 7957 ** May you do good and not evil. 7958 ** May you find forgiveness for yourself and forgive others. 7959 ** May you share freely, never taking more than you give. 7960 ** 7961 ****************************************************************************** 7962 ** 7963 ** Utility functions sqlar_compress() and sqlar_uncompress(). Useful 7964 ** for working with sqlar archives and used by the shell tool's built-in 7965 ** sqlar support. 7966 */ 7967 /* #include "sqlite3ext.h" */ 7968 SQLITE_EXTENSION_INIT1 7969 #include <zlib.h> 7970 #include <assert.h> 7971 7972 /* 7973 ** Implementation of the "sqlar_compress(X)" SQL function. 7974 ** 7975 ** If the type of X is SQLITE_BLOB, and compressing that blob using 7976 ** zlib utility function compress() yields a smaller blob, return the 7977 ** compressed blob. Otherwise, return a copy of X. 7978 ** 7979 ** SQLar uses the "zlib format" for compressed content. The zlib format 7980 ** contains a two-byte identification header and a four-byte checksum at 7981 ** the end. This is different from ZIP which uses the raw deflate format. 7982 ** 7983 ** Future enhancements to SQLar might add support for new compression formats. 7984 ** If so, those new formats will be identified by alternative headers in the 7985 ** compressed data. 7986 */ 7987 static void sqlarCompressFunc( 7988 sqlite3_context *context, 7989 int argc, 7990 sqlite3_value **argv 7991 ){ 7992 assert( argc==1 ); 7993 if( sqlite3_value_type(argv[0])==SQLITE_BLOB ){ 7994 const Bytef *pData = sqlite3_value_blob(argv[0]); 7995 uLong nData = sqlite3_value_bytes(argv[0]); 7996 uLongf nOut = compressBound(nData); 7997 Bytef *pOut; 7998 7999 pOut = (Bytef*)sqlite3_malloc(nOut); 8000 if( pOut==0 ){ 8001 sqlite3_result_error_nomem(context); 8002 return; 8003 }else{ 8004 if( Z_OK!=compress(pOut, &nOut, pData, nData) ){ 8005 sqlite3_result_error(context, "error in compress()", -1); 8006 }else if( nOut<nData ){ 8007 sqlite3_result_blob(context, pOut, nOut, SQLITE_TRANSIENT); 8008 }else{ 8009 sqlite3_result_value(context, argv[0]); 8010 } 8011 sqlite3_free(pOut); 8012 } 8013 }else{ 8014 sqlite3_result_value(context, argv[0]); 8015 } 8016 } 8017 8018 /* 8019 ** Implementation of the "sqlar_uncompress(X,SZ)" SQL function 8020 ** 8021 ** Parameter SZ is interpreted as an integer. If it is less than or 8022 ** equal to zero, then this function returns a copy of X. Or, if 8023 ** SZ is equal to the size of X when interpreted as a blob, also 8024 ** return a copy of X. Otherwise, decompress blob X using zlib 8025 ** utility function uncompress() and return the results (another 8026 ** blob). 8027 */ 8028 static void sqlarUncompressFunc( 8029 sqlite3_context *context, 8030 int argc, 8031 sqlite3_value **argv 8032 ){ 8033 uLong nData; 8034 uLongf sz; 8035 8036 assert( argc==2 ); 8037 sz = sqlite3_value_int(argv[1]); 8038 8039 if( sz<=0 || sz==(nData = sqlite3_value_bytes(argv[0])) ){ 8040 sqlite3_result_value(context, argv[0]); 8041 }else{ 8042 const Bytef *pData= sqlite3_value_blob(argv[0]); 8043 Bytef *pOut = sqlite3_malloc(sz); 8044 if( Z_OK!=uncompress(pOut, &sz, pData, nData) ){ 8045 sqlite3_result_error(context, "error in uncompress()", -1); 8046 }else{ 8047 sqlite3_result_blob(context, pOut, sz, SQLITE_TRANSIENT); 8048 } 8049 sqlite3_free(pOut); 8050 } 8051 } 8052 8053 8054 #ifdef _WIN32 8055 8056 #endif 8057 int sqlite3_sqlar_init( 8058 sqlite3 *db, 8059 char **pzErrMsg, 8060 const sqlite3_api_routines *pApi 8061 ){ 8062 int rc = SQLITE_OK; 8063 SQLITE_EXTENSION_INIT2(pApi); 8064 (void)pzErrMsg; /* Unused parameter */ 8065 rc = sqlite3_create_function(db, "sqlar_compress", 1, 8066 SQLITE_UTF8|SQLITE_INNOCUOUS, 0, 8067 sqlarCompressFunc, 0, 0); 8068 if( rc==SQLITE_OK ){ 8069 rc = sqlite3_create_function(db, "sqlar_uncompress", 2, 8070 SQLITE_UTF8|SQLITE_INNOCUOUS, 0, 8071 sqlarUncompressFunc, 0, 0); 8072 } 8073 return rc; 8074 } 8075 8076 /************************* End ../ext/misc/sqlar.c ********************/ 8077 #endif 8078 /************************* Begin ../ext/expert/sqlite3expert.h ******************/ 8079 /* 8080 ** 2017 April 07 8081 ** 8082 ** The author disclaims copyright to this source code. In place of 8083 ** a legal notice, here is a blessing: 8084 ** 8085 ** May you do good and not evil. 8086 ** May you find forgiveness for yourself and forgive others. 8087 ** May you share freely, never taking more than you give. 8088 ** 8089 ************************************************************************* 8090 */ 8091 #if !defined(SQLITEEXPERT_H) 8092 #define SQLITEEXPERT_H 1 8093 /* #include "sqlite3.h" */ 8094 8095 typedef struct sqlite3expert sqlite3expert; 8096 8097 /* 8098 ** Create a new sqlite3expert object. 8099 ** 8100 ** If successful, a pointer to the new object is returned and (*pzErr) set 8101 ** to NULL. Or, if an error occurs, NULL is returned and (*pzErr) set to 8102 ** an English-language error message. In this case it is the responsibility 8103 ** of the caller to eventually free the error message buffer using 8104 ** sqlite3_free(). 8105 */ 8106 sqlite3expert *sqlite3_expert_new(sqlite3 *db, char **pzErr); 8107 8108 /* 8109 ** Configure an sqlite3expert object. 8110 ** 8111 ** EXPERT_CONFIG_SAMPLE: 8112 ** By default, sqlite3_expert_analyze() generates sqlite_stat1 data for 8113 ** each candidate index. This involves scanning and sorting the entire 8114 ** contents of each user database table once for each candidate index 8115 ** associated with the table. For large databases, this can be 8116 ** prohibitively slow. This option allows the sqlite3expert object to 8117 ** be configured so that sqlite_stat1 data is instead generated based on a 8118 ** subset of each table, or so that no sqlite_stat1 data is used at all. 8119 ** 8120 ** A single integer argument is passed to this option. If the value is less 8121 ** than or equal to zero, then no sqlite_stat1 data is generated or used by 8122 ** the analysis - indexes are recommended based on the database schema only. 8123 ** Or, if the value is 100 or greater, complete sqlite_stat1 data is 8124 ** generated for each candidate index (this is the default). Finally, if the 8125 ** value falls between 0 and 100, then it represents the percentage of user 8126 ** table rows that should be considered when generating sqlite_stat1 data. 8127 ** 8128 ** Examples: 8129 ** 8130 ** // Do not generate any sqlite_stat1 data 8131 ** sqlite3_expert_config(pExpert, EXPERT_CONFIG_SAMPLE, 0); 8132 ** 8133 ** // Generate sqlite_stat1 data based on 10% of the rows in each table. 8134 ** sqlite3_expert_config(pExpert, EXPERT_CONFIG_SAMPLE, 10); 8135 */ 8136 int sqlite3_expert_config(sqlite3expert *p, int op, ...); 8137 8138 #define EXPERT_CONFIG_SAMPLE 1 /* int */ 8139 8140 /* 8141 ** Specify zero or more SQL statements to be included in the analysis. 8142 ** 8143 ** Buffer zSql must contain zero or more complete SQL statements. This 8144 ** function parses all statements contained in the buffer and adds them 8145 ** to the internal list of statements to analyze. If successful, SQLITE_OK 8146 ** is returned and (*pzErr) set to NULL. Or, if an error occurs - for example 8147 ** due to a error in the SQL - an SQLite error code is returned and (*pzErr) 8148 ** may be set to point to an English language error message. In this case 8149 ** the caller is responsible for eventually freeing the error message buffer 8150 ** using sqlite3_free(). 8151 ** 8152 ** If an error does occur while processing one of the statements in the 8153 ** buffer passed as the second argument, none of the statements in the 8154 ** buffer are added to the analysis. 8155 ** 8156 ** This function must be called before sqlite3_expert_analyze(). If a call 8157 ** to this function is made on an sqlite3expert object that has already 8158 ** been passed to sqlite3_expert_analyze() SQLITE_MISUSE is returned 8159 ** immediately and no statements are added to the analysis. 8160 */ 8161 int sqlite3_expert_sql( 8162 sqlite3expert *p, /* From a successful sqlite3_expert_new() */ 8163 const char *zSql, /* SQL statement(s) to add */ 8164 char **pzErr /* OUT: Error message (if any) */ 8165 ); 8166 8167 8168 /* 8169 ** This function is called after the sqlite3expert object has been configured 8170 ** with all SQL statements using sqlite3_expert_sql() to actually perform 8171 ** the analysis. Once this function has been called, it is not possible to 8172 ** add further SQL statements to the analysis. 8173 ** 8174 ** If successful, SQLITE_OK is returned and (*pzErr) is set to NULL. Or, if 8175 ** an error occurs, an SQLite error code is returned and (*pzErr) set to 8176 ** point to a buffer containing an English language error message. In this 8177 ** case it is the responsibility of the caller to eventually free the buffer 8178 ** using sqlite3_free(). 8179 ** 8180 ** If an error does occur within this function, the sqlite3expert object 8181 ** is no longer useful for any purpose. At that point it is no longer 8182 ** possible to add further SQL statements to the object or to re-attempt 8183 ** the analysis. The sqlite3expert object must still be freed using a call 8184 ** sqlite3_expert_destroy(). 8185 */ 8186 int sqlite3_expert_analyze(sqlite3expert *p, char **pzErr); 8187 8188 /* 8189 ** Return the total number of statements loaded using sqlite3_expert_sql(). 8190 ** The total number of SQL statements may be different from the total number 8191 ** to calls to sqlite3_expert_sql(). 8192 */ 8193 int sqlite3_expert_count(sqlite3expert*); 8194 8195 /* 8196 ** Return a component of the report. 8197 ** 8198 ** This function is called after sqlite3_expert_analyze() to extract the 8199 ** results of the analysis. Each call to this function returns either a 8200 ** NULL pointer or a pointer to a buffer containing a nul-terminated string. 8201 ** The value passed as the third argument must be one of the EXPERT_REPORT_* 8202 ** #define constants defined below. 8203 ** 8204 ** For some EXPERT_REPORT_* parameters, the buffer returned contains 8205 ** information relating to a specific SQL statement. In these cases that 8206 ** SQL statement is identified by the value passed as the second argument. 8207 ** SQL statements are numbered from 0 in the order in which they are parsed. 8208 ** If an out-of-range value (less than zero or equal to or greater than the 8209 ** value returned by sqlite3_expert_count()) is passed as the second argument 8210 ** along with such an EXPERT_REPORT_* parameter, NULL is always returned. 8211 ** 8212 ** EXPERT_REPORT_SQL: 8213 ** Return the text of SQL statement iStmt. 8214 ** 8215 ** EXPERT_REPORT_INDEXES: 8216 ** Return a buffer containing the CREATE INDEX statements for all recommended 8217 ** indexes for statement iStmt. If there are no new recommeded indexes, NULL 8218 ** is returned. 8219 ** 8220 ** EXPERT_REPORT_PLAN: 8221 ** Return a buffer containing the EXPLAIN QUERY PLAN output for SQL query 8222 ** iStmt after the proposed indexes have been added to the database schema. 8223 ** 8224 ** EXPERT_REPORT_CANDIDATES: 8225 ** Return a pointer to a buffer containing the CREATE INDEX statements 8226 ** for all indexes that were tested (for all SQL statements). The iStmt 8227 ** parameter is ignored for EXPERT_REPORT_CANDIDATES calls. 8228 */ 8229 const char *sqlite3_expert_report(sqlite3expert*, int iStmt, int eReport); 8230 8231 /* 8232 ** Values for the third argument passed to sqlite3_expert_report(). 8233 */ 8234 #define EXPERT_REPORT_SQL 1 8235 #define EXPERT_REPORT_INDEXES 2 8236 #define EXPERT_REPORT_PLAN 3 8237 #define EXPERT_REPORT_CANDIDATES 4 8238 8239 /* 8240 ** Free an (sqlite3expert*) handle and all associated resources. There 8241 ** should be one call to this function for each successful call to 8242 ** sqlite3-expert_new(). 8243 */ 8244 void sqlite3_expert_destroy(sqlite3expert*); 8245 8246 #endif /* !defined(SQLITEEXPERT_H) */ 8247 8248 /************************* End ../ext/expert/sqlite3expert.h ********************/ 8249 /************************* Begin ../ext/expert/sqlite3expert.c ******************/ 8250 /* 8251 ** 2017 April 09 8252 ** 8253 ** The author disclaims copyright to this source code. In place of 8254 ** a legal notice, here is a blessing: 8255 ** 8256 ** May you do good and not evil. 8257 ** May you find forgiveness for yourself and forgive others. 8258 ** May you share freely, never taking more than you give. 8259 ** 8260 ************************************************************************* 8261 */ 8262 /* #include "sqlite3expert.h" */ 8263 #include <assert.h> 8264 #include <string.h> 8265 #include <stdio.h> 8266 8267 #ifndef SQLITE_OMIT_VIRTUALTABLE 8268 8269 /* typedef sqlite3_int64 i64; */ 8270 /* typedef sqlite3_uint64 u64; */ 8271 8272 typedef struct IdxColumn IdxColumn; 8273 typedef struct IdxConstraint IdxConstraint; 8274 typedef struct IdxScan IdxScan; 8275 typedef struct IdxStatement IdxStatement; 8276 typedef struct IdxTable IdxTable; 8277 typedef struct IdxWrite IdxWrite; 8278 8279 #define STRLEN (int)strlen 8280 8281 /* 8282 ** A temp table name that we assume no user database will actually use. 8283 ** If this assumption proves incorrect triggers on the table with the 8284 ** conflicting name will be ignored. 8285 */ 8286 #define UNIQUE_TABLE_NAME "t592690916721053953805701627921227776" 8287 8288 /* 8289 ** A single constraint. Equivalent to either "col = ?" or "col < ?" (or 8290 ** any other type of single-ended range constraint on a column). 8291 ** 8292 ** pLink: 8293 ** Used to temporarily link IdxConstraint objects into lists while 8294 ** creating candidate indexes. 8295 */ 8296 struct IdxConstraint { 8297 char *zColl; /* Collation sequence */ 8298 int bRange; /* True for range, false for eq */ 8299 int iCol; /* Constrained table column */ 8300 int bFlag; /* Used by idxFindCompatible() */ 8301 int bDesc; /* True if ORDER BY <expr> DESC */ 8302 IdxConstraint *pNext; /* Next constraint in pEq or pRange list */ 8303 IdxConstraint *pLink; /* See above */ 8304 }; 8305 8306 /* 8307 ** A single scan of a single table. 8308 */ 8309 struct IdxScan { 8310 IdxTable *pTab; /* Associated table object */ 8311 int iDb; /* Database containing table zTable */ 8312 i64 covering; /* Mask of columns required for cov. index */ 8313 IdxConstraint *pOrder; /* ORDER BY columns */ 8314 IdxConstraint *pEq; /* List of == constraints */ 8315 IdxConstraint *pRange; /* List of < constraints */ 8316 IdxScan *pNextScan; /* Next IdxScan object for same analysis */ 8317 }; 8318 8319 /* 8320 ** Information regarding a single database table. Extracted from 8321 ** "PRAGMA table_info" by function idxGetTableInfo(). 8322 */ 8323 struct IdxColumn { 8324 char *zName; 8325 char *zColl; 8326 int iPk; 8327 }; 8328 struct IdxTable { 8329 int nCol; 8330 char *zName; /* Table name */ 8331 IdxColumn *aCol; 8332 IdxTable *pNext; /* Next table in linked list of all tables */ 8333 }; 8334 8335 /* 8336 ** An object of the following type is created for each unique table/write-op 8337 ** seen. The objects are stored in a singly-linked list beginning at 8338 ** sqlite3expert.pWrite. 8339 */ 8340 struct IdxWrite { 8341 IdxTable *pTab; 8342 int eOp; /* SQLITE_UPDATE, DELETE or INSERT */ 8343 IdxWrite *pNext; 8344 }; 8345 8346 /* 8347 ** Each statement being analyzed is represented by an instance of this 8348 ** structure. 8349 */ 8350 struct IdxStatement { 8351 int iId; /* Statement number */ 8352 char *zSql; /* SQL statement */ 8353 char *zIdx; /* Indexes */ 8354 char *zEQP; /* Plan */ 8355 IdxStatement *pNext; 8356 }; 8357 8358 8359 /* 8360 ** A hash table for storing strings. With space for a payload string 8361 ** with each entry. Methods are: 8362 ** 8363 ** idxHashInit() 8364 ** idxHashClear() 8365 ** idxHashAdd() 8366 ** idxHashSearch() 8367 */ 8368 #define IDX_HASH_SIZE 1023 8369 typedef struct IdxHashEntry IdxHashEntry; 8370 typedef struct IdxHash IdxHash; 8371 struct IdxHashEntry { 8372 char *zKey; /* nul-terminated key */ 8373 char *zVal; /* nul-terminated value string */ 8374 char *zVal2; /* nul-terminated value string 2 */ 8375 IdxHashEntry *pHashNext; /* Next entry in same hash bucket */ 8376 IdxHashEntry *pNext; /* Next entry in hash */ 8377 }; 8378 struct IdxHash { 8379 IdxHashEntry *pFirst; 8380 IdxHashEntry *aHash[IDX_HASH_SIZE]; 8381 }; 8382 8383 /* 8384 ** sqlite3expert object. 8385 */ 8386 struct sqlite3expert { 8387 int iSample; /* Percentage of tables to sample for stat1 */ 8388 sqlite3 *db; /* User database */ 8389 sqlite3 *dbm; /* In-memory db for this analysis */ 8390 sqlite3 *dbv; /* Vtab schema for this analysis */ 8391 IdxTable *pTable; /* List of all IdxTable objects */ 8392 IdxScan *pScan; /* List of scan objects */ 8393 IdxWrite *pWrite; /* List of write objects */ 8394 IdxStatement *pStatement; /* List of IdxStatement objects */ 8395 int bRun; /* True once analysis has run */ 8396 char **pzErrmsg; 8397 int rc; /* Error code from whereinfo hook */ 8398 IdxHash hIdx; /* Hash containing all candidate indexes */ 8399 char *zCandidates; /* For EXPERT_REPORT_CANDIDATES */ 8400 }; 8401 8402 8403 /* 8404 ** Allocate and return nByte bytes of zeroed memory using sqlite3_malloc(). 8405 ** If the allocation fails, set *pRc to SQLITE_NOMEM and return NULL. 8406 */ 8407 static void *idxMalloc(int *pRc, int nByte){ 8408 void *pRet; 8409 assert( *pRc==SQLITE_OK ); 8410 assert( nByte>0 ); 8411 pRet = sqlite3_malloc(nByte); 8412 if( pRet ){ 8413 memset(pRet, 0, nByte); 8414 }else{ 8415 *pRc = SQLITE_NOMEM; 8416 } 8417 return pRet; 8418 } 8419 8420 /* 8421 ** Initialize an IdxHash hash table. 8422 */ 8423 static void idxHashInit(IdxHash *pHash){ 8424 memset(pHash, 0, sizeof(IdxHash)); 8425 } 8426 8427 /* 8428 ** Reset an IdxHash hash table. 8429 */ 8430 static void idxHashClear(IdxHash *pHash){ 8431 int i; 8432 for(i=0; i<IDX_HASH_SIZE; i++){ 8433 IdxHashEntry *pEntry; 8434 IdxHashEntry *pNext; 8435 for(pEntry=pHash->aHash[i]; pEntry; pEntry=pNext){ 8436 pNext = pEntry->pHashNext; 8437 sqlite3_free(pEntry->zVal2); 8438 sqlite3_free(pEntry); 8439 } 8440 } 8441 memset(pHash, 0, sizeof(IdxHash)); 8442 } 8443 8444 /* 8445 ** Return the index of the hash bucket that the string specified by the 8446 ** arguments to this function belongs. 8447 */ 8448 static int idxHashString(const char *z, int n){ 8449 unsigned int ret = 0; 8450 int i; 8451 for(i=0; i<n; i++){ 8452 ret += (ret<<3) + (unsigned char)(z[i]); 8453 } 8454 return (int)(ret % IDX_HASH_SIZE); 8455 } 8456 8457 /* 8458 ** If zKey is already present in the hash table, return non-zero and do 8459 ** nothing. Otherwise, add an entry with key zKey and payload string zVal to 8460 ** the hash table passed as the second argument. 8461 */ 8462 static int idxHashAdd( 8463 int *pRc, 8464 IdxHash *pHash, 8465 const char *zKey, 8466 const char *zVal 8467 ){ 8468 int nKey = STRLEN(zKey); 8469 int iHash = idxHashString(zKey, nKey); 8470 int nVal = (zVal ? STRLEN(zVal) : 0); 8471 IdxHashEntry *pEntry; 8472 assert( iHash>=0 ); 8473 for(pEntry=pHash->aHash[iHash]; pEntry; pEntry=pEntry->pHashNext){ 8474 if( STRLEN(pEntry->zKey)==nKey && 0==memcmp(pEntry->zKey, zKey, nKey) ){ 8475 return 1; 8476 } 8477 } 8478 pEntry = idxMalloc(pRc, sizeof(IdxHashEntry) + nKey+1 + nVal+1); 8479 if( pEntry ){ 8480 pEntry->zKey = (char*)&pEntry[1]; 8481 memcpy(pEntry->zKey, zKey, nKey); 8482 if( zVal ){ 8483 pEntry->zVal = &pEntry->zKey[nKey+1]; 8484 memcpy(pEntry->zVal, zVal, nVal); 8485 } 8486 pEntry->pHashNext = pHash->aHash[iHash]; 8487 pHash->aHash[iHash] = pEntry; 8488 8489 pEntry->pNext = pHash->pFirst; 8490 pHash->pFirst = pEntry; 8491 } 8492 return 0; 8493 } 8494 8495 /* 8496 ** If zKey/nKey is present in the hash table, return a pointer to the 8497 ** hash-entry object. 8498 */ 8499 static IdxHashEntry *idxHashFind(IdxHash *pHash, const char *zKey, int nKey){ 8500 int iHash; 8501 IdxHashEntry *pEntry; 8502 if( nKey<0 ) nKey = STRLEN(zKey); 8503 iHash = idxHashString(zKey, nKey); 8504 assert( iHash>=0 ); 8505 for(pEntry=pHash->aHash[iHash]; pEntry; pEntry=pEntry->pHashNext){ 8506 if( STRLEN(pEntry->zKey)==nKey && 0==memcmp(pEntry->zKey, zKey, nKey) ){ 8507 return pEntry; 8508 } 8509 } 8510 return 0; 8511 } 8512 8513 /* 8514 ** If the hash table contains an entry with a key equal to the string 8515 ** passed as the final two arguments to this function, return a pointer 8516 ** to the payload string. Otherwise, if zKey/nKey is not present in the 8517 ** hash table, return NULL. 8518 */ 8519 static const char *idxHashSearch(IdxHash *pHash, const char *zKey, int nKey){ 8520 IdxHashEntry *pEntry = idxHashFind(pHash, zKey, nKey); 8521 if( pEntry ) return pEntry->zVal; 8522 return 0; 8523 } 8524 8525 /* 8526 ** Allocate and return a new IdxConstraint object. Set the IdxConstraint.zColl 8527 ** variable to point to a copy of nul-terminated string zColl. 8528 */ 8529 static IdxConstraint *idxNewConstraint(int *pRc, const char *zColl){ 8530 IdxConstraint *pNew; 8531 int nColl = STRLEN(zColl); 8532 8533 assert( *pRc==SQLITE_OK ); 8534 pNew = (IdxConstraint*)idxMalloc(pRc, sizeof(IdxConstraint) * nColl + 1); 8535 if( pNew ){ 8536 pNew->zColl = (char*)&pNew[1]; 8537 memcpy(pNew->zColl, zColl, nColl+1); 8538 } 8539 return pNew; 8540 } 8541 8542 /* 8543 ** An error associated with database handle db has just occurred. Pass 8544 ** the error message to callback function xOut. 8545 */ 8546 static void idxDatabaseError( 8547 sqlite3 *db, /* Database handle */ 8548 char **pzErrmsg /* Write error here */ 8549 ){ 8550 *pzErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(db)); 8551 } 8552 8553 /* 8554 ** Prepare an SQL statement. 8555 */ 8556 static int idxPrepareStmt( 8557 sqlite3 *db, /* Database handle to compile against */ 8558 sqlite3_stmt **ppStmt, /* OUT: Compiled SQL statement */ 8559 char **pzErrmsg, /* OUT: sqlite3_malloc()ed error message */ 8560 const char *zSql /* SQL statement to compile */ 8561 ){ 8562 int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0); 8563 if( rc!=SQLITE_OK ){ 8564 *ppStmt = 0; 8565 idxDatabaseError(db, pzErrmsg); 8566 } 8567 return rc; 8568 } 8569 8570 /* 8571 ** Prepare an SQL statement using the results of a printf() formatting. 8572 */ 8573 static int idxPrintfPrepareStmt( 8574 sqlite3 *db, /* Database handle to compile against */ 8575 sqlite3_stmt **ppStmt, /* OUT: Compiled SQL statement */ 8576 char **pzErrmsg, /* OUT: sqlite3_malloc()ed error message */ 8577 const char *zFmt, /* printf() format of SQL statement */ 8578 ... /* Trailing printf() arguments */ 8579 ){ 8580 va_list ap; 8581 int rc; 8582 char *zSql; 8583 va_start(ap, zFmt); 8584 zSql = sqlite3_vmprintf(zFmt, ap); 8585 if( zSql==0 ){ 8586 rc = SQLITE_NOMEM; 8587 }else{ 8588 rc = idxPrepareStmt(db, ppStmt, pzErrmsg, zSql); 8589 sqlite3_free(zSql); 8590 } 8591 va_end(ap); 8592 return rc; 8593 } 8594 8595 8596 /************************************************************************* 8597 ** Beginning of virtual table implementation. 8598 */ 8599 typedef struct ExpertVtab ExpertVtab; 8600 struct ExpertVtab { 8601 sqlite3_vtab base; 8602 IdxTable *pTab; 8603 sqlite3expert *pExpert; 8604 }; 8605 8606 typedef struct ExpertCsr ExpertCsr; 8607 struct ExpertCsr { 8608 sqlite3_vtab_cursor base; 8609 sqlite3_stmt *pData; 8610 }; 8611 8612 static char *expertDequote(const char *zIn){ 8613 int n = STRLEN(zIn); 8614 char *zRet = sqlite3_malloc(n); 8615 8616 assert( zIn[0]=='\'' ); 8617 assert( zIn[n-1]=='\'' ); 8618 8619 if( zRet ){ 8620 int iOut = 0; 8621 int iIn = 0; 8622 for(iIn=1; iIn<(n-1); iIn++){ 8623 if( zIn[iIn]=='\'' ){ 8624 assert( zIn[iIn+1]=='\'' ); 8625 iIn++; 8626 } 8627 zRet[iOut++] = zIn[iIn]; 8628 } 8629 zRet[iOut] = '\0'; 8630 } 8631 8632 return zRet; 8633 } 8634 8635 /* 8636 ** This function is the implementation of both the xConnect and xCreate 8637 ** methods of the r-tree virtual table. 8638 ** 8639 ** argv[0] -> module name 8640 ** argv[1] -> database name 8641 ** argv[2] -> table name 8642 ** argv[...] -> column names... 8643 */ 8644 static int expertConnect( 8645 sqlite3 *db, 8646 void *pAux, 8647 int argc, const char *const*argv, 8648 sqlite3_vtab **ppVtab, 8649 char **pzErr 8650 ){ 8651 sqlite3expert *pExpert = (sqlite3expert*)pAux; 8652 ExpertVtab *p = 0; 8653 int rc; 8654 8655 if( argc!=4 ){ 8656 *pzErr = sqlite3_mprintf("internal error!"); 8657 rc = SQLITE_ERROR; 8658 }else{ 8659 char *zCreateTable = expertDequote(argv[3]); 8660 if( zCreateTable ){ 8661 rc = sqlite3_declare_vtab(db, zCreateTable); 8662 if( rc==SQLITE_OK ){ 8663 p = idxMalloc(&rc, sizeof(ExpertVtab)); 8664 } 8665 if( rc==SQLITE_OK ){ 8666 p->pExpert = pExpert; 8667 p->pTab = pExpert->pTable; 8668 assert( sqlite3_stricmp(p->pTab->zName, argv[2])==0 ); 8669 } 8670 sqlite3_free(zCreateTable); 8671 }else{ 8672 rc = SQLITE_NOMEM; 8673 } 8674 } 8675 8676 *ppVtab = (sqlite3_vtab*)p; 8677 return rc; 8678 } 8679 8680 static int expertDisconnect(sqlite3_vtab *pVtab){ 8681 ExpertVtab *p = (ExpertVtab*)pVtab; 8682 sqlite3_free(p); 8683 return SQLITE_OK; 8684 } 8685 8686 static int expertBestIndex(sqlite3_vtab *pVtab, sqlite3_index_info *pIdxInfo){ 8687 ExpertVtab *p = (ExpertVtab*)pVtab; 8688 int rc = SQLITE_OK; 8689 int n = 0; 8690 IdxScan *pScan; 8691 const int opmask = 8692 SQLITE_INDEX_CONSTRAINT_EQ | SQLITE_INDEX_CONSTRAINT_GT | 8693 SQLITE_INDEX_CONSTRAINT_LT | SQLITE_INDEX_CONSTRAINT_GE | 8694 SQLITE_INDEX_CONSTRAINT_LE; 8695 8696 pScan = idxMalloc(&rc, sizeof(IdxScan)); 8697 if( pScan ){ 8698 int i; 8699 8700 /* Link the new scan object into the list */ 8701 pScan->pTab = p->pTab; 8702 pScan->pNextScan = p->pExpert->pScan; 8703 p->pExpert->pScan = pScan; 8704 8705 /* Add the constraints to the IdxScan object */ 8706 for(i=0; i<pIdxInfo->nConstraint; i++){ 8707 struct sqlite3_index_constraint *pCons = &pIdxInfo->aConstraint[i]; 8708 if( pCons->usable 8709 && pCons->iColumn>=0 8710 && p->pTab->aCol[pCons->iColumn].iPk==0 8711 && (pCons->op & opmask) 8712 ){ 8713 IdxConstraint *pNew; 8714 const char *zColl = sqlite3_vtab_collation(pIdxInfo, i); 8715 pNew = idxNewConstraint(&rc, zColl); 8716 if( pNew ){ 8717 pNew->iCol = pCons->iColumn; 8718 if( pCons->op==SQLITE_INDEX_CONSTRAINT_EQ ){ 8719 pNew->pNext = pScan->pEq; 8720 pScan->pEq = pNew; 8721 }else{ 8722 pNew->bRange = 1; 8723 pNew->pNext = pScan->pRange; 8724 pScan->pRange = pNew; 8725 } 8726 } 8727 n++; 8728 pIdxInfo->aConstraintUsage[i].argvIndex = n; 8729 } 8730 } 8731 8732 /* Add the ORDER BY to the IdxScan object */ 8733 for(i=pIdxInfo->nOrderBy-1; i>=0; i--){ 8734 int iCol = pIdxInfo->aOrderBy[i].iColumn; 8735 if( iCol>=0 ){ 8736 IdxConstraint *pNew = idxNewConstraint(&rc, p->pTab->aCol[iCol].zColl); 8737 if( pNew ){ 8738 pNew->iCol = iCol; 8739 pNew->bDesc = pIdxInfo->aOrderBy[i].desc; 8740 pNew->pNext = pScan->pOrder; 8741 pNew->pLink = pScan->pOrder; 8742 pScan->pOrder = pNew; 8743 n++; 8744 } 8745 } 8746 } 8747 } 8748 8749 pIdxInfo->estimatedCost = 1000000.0 / (n+1); 8750 return rc; 8751 } 8752 8753 static int expertUpdate( 8754 sqlite3_vtab *pVtab, 8755 int nData, 8756 sqlite3_value **azData, 8757 sqlite_int64 *pRowid 8758 ){ 8759 (void)pVtab; 8760 (void)nData; 8761 (void)azData; 8762 (void)pRowid; 8763 return SQLITE_OK; 8764 } 8765 8766 /* 8767 ** Virtual table module xOpen method. 8768 */ 8769 static int expertOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){ 8770 int rc = SQLITE_OK; 8771 ExpertCsr *pCsr; 8772 (void)pVTab; 8773 pCsr = idxMalloc(&rc, sizeof(ExpertCsr)); 8774 *ppCursor = (sqlite3_vtab_cursor*)pCsr; 8775 return rc; 8776 } 8777 8778 /* 8779 ** Virtual table module xClose method. 8780 */ 8781 static int expertClose(sqlite3_vtab_cursor *cur){ 8782 ExpertCsr *pCsr = (ExpertCsr*)cur; 8783 sqlite3_finalize(pCsr->pData); 8784 sqlite3_free(pCsr); 8785 return SQLITE_OK; 8786 } 8787 8788 /* 8789 ** Virtual table module xEof method. 8790 ** 8791 ** Return non-zero if the cursor does not currently point to a valid 8792 ** record (i.e if the scan has finished), or zero otherwise. 8793 */ 8794 static int expertEof(sqlite3_vtab_cursor *cur){ 8795 ExpertCsr *pCsr = (ExpertCsr*)cur; 8796 return pCsr->pData==0; 8797 } 8798 8799 /* 8800 ** Virtual table module xNext method. 8801 */ 8802 static int expertNext(sqlite3_vtab_cursor *cur){ 8803 ExpertCsr *pCsr = (ExpertCsr*)cur; 8804 int rc = SQLITE_OK; 8805 8806 assert( pCsr->pData ); 8807 rc = sqlite3_step(pCsr->pData); 8808 if( rc!=SQLITE_ROW ){ 8809 rc = sqlite3_finalize(pCsr->pData); 8810 pCsr->pData = 0; 8811 }else{ 8812 rc = SQLITE_OK; 8813 } 8814 8815 return rc; 8816 } 8817 8818 /* 8819 ** Virtual table module xRowid method. 8820 */ 8821 static int expertRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ 8822 (void)cur; 8823 *pRowid = 0; 8824 return SQLITE_OK; 8825 } 8826 8827 /* 8828 ** Virtual table module xColumn method. 8829 */ 8830 static int expertColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){ 8831 ExpertCsr *pCsr = (ExpertCsr*)cur; 8832 sqlite3_value *pVal; 8833 pVal = sqlite3_column_value(pCsr->pData, i); 8834 if( pVal ){ 8835 sqlite3_result_value(ctx, pVal); 8836 } 8837 return SQLITE_OK; 8838 } 8839 8840 /* 8841 ** Virtual table module xFilter method. 8842 */ 8843 static int expertFilter( 8844 sqlite3_vtab_cursor *cur, 8845 int idxNum, const char *idxStr, 8846 int argc, sqlite3_value **argv 8847 ){ 8848 ExpertCsr *pCsr = (ExpertCsr*)cur; 8849 ExpertVtab *pVtab = (ExpertVtab*)(cur->pVtab); 8850 sqlite3expert *pExpert = pVtab->pExpert; 8851 int rc; 8852 8853 (void)idxNum; 8854 (void)idxStr; 8855 (void)argc; 8856 (void)argv; 8857 rc = sqlite3_finalize(pCsr->pData); 8858 pCsr->pData = 0; 8859 if( rc==SQLITE_OK ){ 8860 rc = idxPrintfPrepareStmt(pExpert->db, &pCsr->pData, &pVtab->base.zErrMsg, 8861 "SELECT * FROM main.%Q WHERE sample()", pVtab->pTab->zName 8862 ); 8863 } 8864 8865 if( rc==SQLITE_OK ){ 8866 rc = expertNext(cur); 8867 } 8868 return rc; 8869 } 8870 8871 static int idxRegisterVtab(sqlite3expert *p){ 8872 static sqlite3_module expertModule = { 8873 2, /* iVersion */ 8874 expertConnect, /* xCreate - create a table */ 8875 expertConnect, /* xConnect - connect to an existing table */ 8876 expertBestIndex, /* xBestIndex - Determine search strategy */ 8877 expertDisconnect, /* xDisconnect - Disconnect from a table */ 8878 expertDisconnect, /* xDestroy - Drop a table */ 8879 expertOpen, /* xOpen - open a cursor */ 8880 expertClose, /* xClose - close a cursor */ 8881 expertFilter, /* xFilter - configure scan constraints */ 8882 expertNext, /* xNext - advance a cursor */ 8883 expertEof, /* xEof */ 8884 expertColumn, /* xColumn - read data */ 8885 expertRowid, /* xRowid - read data */ 8886 expertUpdate, /* xUpdate - write data */ 8887 0, /* xBegin - begin transaction */ 8888 0, /* xSync - sync transaction */ 8889 0, /* xCommit - commit transaction */ 8890 0, /* xRollback - rollback transaction */ 8891 0, /* xFindFunction - function overloading */ 8892 0, /* xRename - rename the table */ 8893 0, /* xSavepoint */ 8894 0, /* xRelease */ 8895 0, /* xRollbackTo */ 8896 0, /* xShadowName */ 8897 }; 8898 8899 return sqlite3_create_module(p->dbv, "expert", &expertModule, (void*)p); 8900 } 8901 /* 8902 ** End of virtual table implementation. 8903 *************************************************************************/ 8904 /* 8905 ** Finalize SQL statement pStmt. If (*pRc) is SQLITE_OK when this function 8906 ** is called, set it to the return value of sqlite3_finalize() before 8907 ** returning. Otherwise, discard the sqlite3_finalize() return value. 8908 */ 8909 static void idxFinalize(int *pRc, sqlite3_stmt *pStmt){ 8910 int rc = sqlite3_finalize(pStmt); 8911 if( *pRc==SQLITE_OK ) *pRc = rc; 8912 } 8913 8914 /* 8915 ** Attempt to allocate an IdxTable structure corresponding to table zTab 8916 ** in the main database of connection db. If successful, set (*ppOut) to 8917 ** point to the new object and return SQLITE_OK. Otherwise, return an 8918 ** SQLite error code and set (*ppOut) to NULL. In this case *pzErrmsg may be 8919 ** set to point to an error string. 8920 ** 8921 ** It is the responsibility of the caller to eventually free either the 8922 ** IdxTable object or error message using sqlite3_free(). 8923 */ 8924 static int idxGetTableInfo( 8925 sqlite3 *db, /* Database connection to read details from */ 8926 const char *zTab, /* Table name */ 8927 IdxTable **ppOut, /* OUT: New object (if successful) */ 8928 char **pzErrmsg /* OUT: Error message (if not) */ 8929 ){ 8930 sqlite3_stmt *p1 = 0; 8931 int nCol = 0; 8932 int nTab = STRLEN(zTab); 8933 int nByte = sizeof(IdxTable) + nTab + 1; 8934 IdxTable *pNew = 0; 8935 int rc, rc2; 8936 char *pCsr = 0; 8937 int nPk = 0; 8938 8939 rc = idxPrintfPrepareStmt(db, &p1, pzErrmsg, "PRAGMA table_info=%Q", zTab); 8940 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){ 8941 const char *zCol = (const char*)sqlite3_column_text(p1, 1); 8942 nByte += 1 + STRLEN(zCol); 8943 rc = sqlite3_table_column_metadata( 8944 db, "main", zTab, zCol, 0, &zCol, 0, 0, 0 8945 ); 8946 nByte += 1 + STRLEN(zCol); 8947 nCol++; 8948 nPk += (sqlite3_column_int(p1, 5)>0); 8949 } 8950 rc2 = sqlite3_reset(p1); 8951 if( rc==SQLITE_OK ) rc = rc2; 8952 8953 nByte += sizeof(IdxColumn) * nCol; 8954 if( rc==SQLITE_OK ){ 8955 pNew = idxMalloc(&rc, nByte); 8956 } 8957 if( rc==SQLITE_OK ){ 8958 pNew->aCol = (IdxColumn*)&pNew[1]; 8959 pNew->nCol = nCol; 8960 pCsr = (char*)&pNew->aCol[nCol]; 8961 } 8962 8963 nCol = 0; 8964 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){ 8965 const char *zCol = (const char*)sqlite3_column_text(p1, 1); 8966 int nCopy = STRLEN(zCol) + 1; 8967 pNew->aCol[nCol].zName = pCsr; 8968 pNew->aCol[nCol].iPk = (sqlite3_column_int(p1, 5)==1 && nPk==1); 8969 memcpy(pCsr, zCol, nCopy); 8970 pCsr += nCopy; 8971 8972 rc = sqlite3_table_column_metadata( 8973 db, "main", zTab, zCol, 0, &zCol, 0, 0, 0 8974 ); 8975 if( rc==SQLITE_OK ){ 8976 nCopy = STRLEN(zCol) + 1; 8977 pNew->aCol[nCol].zColl = pCsr; 8978 memcpy(pCsr, zCol, nCopy); 8979 pCsr += nCopy; 8980 } 8981 8982 nCol++; 8983 } 8984 idxFinalize(&rc, p1); 8985 8986 if( rc!=SQLITE_OK ){ 8987 sqlite3_free(pNew); 8988 pNew = 0; 8989 }else{ 8990 pNew->zName = pCsr; 8991 memcpy(pNew->zName, zTab, nTab+1); 8992 } 8993 8994 *ppOut = pNew; 8995 return rc; 8996 } 8997 8998 /* 8999 ** This function is a no-op if *pRc is set to anything other than 9000 ** SQLITE_OK when it is called. 9001 ** 9002 ** If *pRc is initially set to SQLITE_OK, then the text specified by 9003 ** the printf() style arguments is appended to zIn and the result returned 9004 ** in a buffer allocated by sqlite3_malloc(). sqlite3_free() is called on 9005 ** zIn before returning. 9006 */ 9007 static char *idxAppendText(int *pRc, char *zIn, const char *zFmt, ...){ 9008 va_list ap; 9009 char *zAppend = 0; 9010 char *zRet = 0; 9011 int nIn = zIn ? STRLEN(zIn) : 0; 9012 int nAppend = 0; 9013 va_start(ap, zFmt); 9014 if( *pRc==SQLITE_OK ){ 9015 zAppend = sqlite3_vmprintf(zFmt, ap); 9016 if( zAppend ){ 9017 nAppend = STRLEN(zAppend); 9018 zRet = (char*)sqlite3_malloc(nIn + nAppend + 1); 9019 } 9020 if( zAppend && zRet ){ 9021 if( nIn ) memcpy(zRet, zIn, nIn); 9022 memcpy(&zRet[nIn], zAppend, nAppend+1); 9023 }else{ 9024 sqlite3_free(zRet); 9025 zRet = 0; 9026 *pRc = SQLITE_NOMEM; 9027 } 9028 sqlite3_free(zAppend); 9029 sqlite3_free(zIn); 9030 } 9031 va_end(ap); 9032 return zRet; 9033 } 9034 9035 /* 9036 ** Return true if zId must be quoted in order to use it as an SQL 9037 ** identifier, or false otherwise. 9038 */ 9039 static int idxIdentifierRequiresQuotes(const char *zId){ 9040 int i; 9041 for(i=0; zId[i]; i++){ 9042 if( !(zId[i]=='_') 9043 && !(zId[i]>='0' && zId[i]<='9') 9044 && !(zId[i]>='a' && zId[i]<='z') 9045 && !(zId[i]>='A' && zId[i]<='Z') 9046 ){ 9047 return 1; 9048 } 9049 } 9050 return 0; 9051 } 9052 9053 /* 9054 ** This function appends an index column definition suitable for constraint 9055 ** pCons to the string passed as zIn and returns the result. 9056 */ 9057 static char *idxAppendColDefn( 9058 int *pRc, /* IN/OUT: Error code */ 9059 char *zIn, /* Column defn accumulated so far */ 9060 IdxTable *pTab, /* Table index will be created on */ 9061 IdxConstraint *pCons 9062 ){ 9063 char *zRet = zIn; 9064 IdxColumn *p = &pTab->aCol[pCons->iCol]; 9065 if( zRet ) zRet = idxAppendText(pRc, zRet, ", "); 9066 9067 if( idxIdentifierRequiresQuotes(p->zName) ){ 9068 zRet = idxAppendText(pRc, zRet, "%Q", p->zName); 9069 }else{ 9070 zRet = idxAppendText(pRc, zRet, "%s", p->zName); 9071 } 9072 9073 if( sqlite3_stricmp(p->zColl, pCons->zColl) ){ 9074 if( idxIdentifierRequiresQuotes(pCons->zColl) ){ 9075 zRet = idxAppendText(pRc, zRet, " COLLATE %Q", pCons->zColl); 9076 }else{ 9077 zRet = idxAppendText(pRc, zRet, " COLLATE %s", pCons->zColl); 9078 } 9079 } 9080 9081 if( pCons->bDesc ){ 9082 zRet = idxAppendText(pRc, zRet, " DESC"); 9083 } 9084 return zRet; 9085 } 9086 9087 /* 9088 ** Search database dbm for an index compatible with the one idxCreateFromCons() 9089 ** would create from arguments pScan, pEq and pTail. If no error occurs and 9090 ** such an index is found, return non-zero. Or, if no such index is found, 9091 ** return zero. 9092 ** 9093 ** If an error occurs, set *pRc to an SQLite error code and return zero. 9094 */ 9095 static int idxFindCompatible( 9096 int *pRc, /* OUT: Error code */ 9097 sqlite3* dbm, /* Database to search */ 9098 IdxScan *pScan, /* Scan for table to search for index on */ 9099 IdxConstraint *pEq, /* List of == constraints */ 9100 IdxConstraint *pTail /* List of range constraints */ 9101 ){ 9102 const char *zTbl = pScan->pTab->zName; 9103 sqlite3_stmt *pIdxList = 0; 9104 IdxConstraint *pIter; 9105 int nEq = 0; /* Number of elements in pEq */ 9106 int rc; 9107 9108 /* Count the elements in list pEq */ 9109 for(pIter=pEq; pIter; pIter=pIter->pLink) nEq++; 9110 9111 rc = idxPrintfPrepareStmt(dbm, &pIdxList, 0, "PRAGMA index_list=%Q", zTbl); 9112 while( rc==SQLITE_OK && sqlite3_step(pIdxList)==SQLITE_ROW ){ 9113 int bMatch = 1; 9114 IdxConstraint *pT = pTail; 9115 sqlite3_stmt *pInfo = 0; 9116 const char *zIdx = (const char*)sqlite3_column_text(pIdxList, 1); 9117 9118 /* Zero the IdxConstraint.bFlag values in the pEq list */ 9119 for(pIter=pEq; pIter; pIter=pIter->pLink) pIter->bFlag = 0; 9120 9121 rc = idxPrintfPrepareStmt(dbm, &pInfo, 0, "PRAGMA index_xInfo=%Q", zIdx); 9122 while( rc==SQLITE_OK && sqlite3_step(pInfo)==SQLITE_ROW ){ 9123 int iIdx = sqlite3_column_int(pInfo, 0); 9124 int iCol = sqlite3_column_int(pInfo, 1); 9125 const char *zColl = (const char*)sqlite3_column_text(pInfo, 4); 9126 9127 if( iIdx<nEq ){ 9128 for(pIter=pEq; pIter; pIter=pIter->pLink){ 9129 if( pIter->bFlag ) continue; 9130 if( pIter->iCol!=iCol ) continue; 9131 if( sqlite3_stricmp(pIter->zColl, zColl) ) continue; 9132 pIter->bFlag = 1; 9133 break; 9134 } 9135 if( pIter==0 ){ 9136 bMatch = 0; 9137 break; 9138 } 9139 }else{ 9140 if( pT ){ 9141 if( pT->iCol!=iCol || sqlite3_stricmp(pT->zColl, zColl) ){ 9142 bMatch = 0; 9143 break; 9144 } 9145 pT = pT->pLink; 9146 } 9147 } 9148 } 9149 idxFinalize(&rc, pInfo); 9150 9151 if( rc==SQLITE_OK && bMatch ){ 9152 sqlite3_finalize(pIdxList); 9153 return 1; 9154 } 9155 } 9156 idxFinalize(&rc, pIdxList); 9157 9158 *pRc = rc; 9159 return 0; 9160 } 9161 9162 static int idxCreateFromCons( 9163 sqlite3expert *p, 9164 IdxScan *pScan, 9165 IdxConstraint *pEq, 9166 IdxConstraint *pTail 9167 ){ 9168 sqlite3 *dbm = p->dbm; 9169 int rc = SQLITE_OK; 9170 if( (pEq || pTail) && 0==idxFindCompatible(&rc, dbm, pScan, pEq, pTail) ){ 9171 IdxTable *pTab = pScan->pTab; 9172 char *zCols = 0; 9173 char *zIdx = 0; 9174 IdxConstraint *pCons; 9175 unsigned int h = 0; 9176 const char *zFmt; 9177 9178 for(pCons=pEq; pCons; pCons=pCons->pLink){ 9179 zCols = idxAppendColDefn(&rc, zCols, pTab, pCons); 9180 } 9181 for(pCons=pTail; pCons; pCons=pCons->pLink){ 9182 zCols = idxAppendColDefn(&rc, zCols, pTab, pCons); 9183 } 9184 9185 if( rc==SQLITE_OK ){ 9186 /* Hash the list of columns to come up with a name for the index */ 9187 const char *zTable = pScan->pTab->zName; 9188 char *zName; /* Index name */ 9189 int i; 9190 for(i=0; zCols[i]; i++){ 9191 h += ((h<<3) + zCols[i]); 9192 } 9193 zName = sqlite3_mprintf("%s_idx_%08x", zTable, h); 9194 if( zName==0 ){ 9195 rc = SQLITE_NOMEM; 9196 }else{ 9197 if( idxIdentifierRequiresQuotes(zTable) ){ 9198 zFmt = "CREATE INDEX '%q' ON %Q(%s)"; 9199 }else{ 9200 zFmt = "CREATE INDEX %s ON %s(%s)"; 9201 } 9202 zIdx = sqlite3_mprintf(zFmt, zName, zTable, zCols); 9203 if( !zIdx ){ 9204 rc = SQLITE_NOMEM; 9205 }else{ 9206 rc = sqlite3_exec(dbm, zIdx, 0, 0, p->pzErrmsg); 9207 idxHashAdd(&rc, &p->hIdx, zName, zIdx); 9208 } 9209 sqlite3_free(zName); 9210 sqlite3_free(zIdx); 9211 } 9212 } 9213 9214 sqlite3_free(zCols); 9215 } 9216 return rc; 9217 } 9218 9219 /* 9220 ** Return true if list pList (linked by IdxConstraint.pLink) contains 9221 ** a constraint compatible with *p. Otherwise return false. 9222 */ 9223 static int idxFindConstraint(IdxConstraint *pList, IdxConstraint *p){ 9224 IdxConstraint *pCmp; 9225 for(pCmp=pList; pCmp; pCmp=pCmp->pLink){ 9226 if( p->iCol==pCmp->iCol ) return 1; 9227 } 9228 return 0; 9229 } 9230 9231 static int idxCreateFromWhere( 9232 sqlite3expert *p, 9233 IdxScan *pScan, /* Create indexes for this scan */ 9234 IdxConstraint *pTail /* range/ORDER BY constraints for inclusion */ 9235 ){ 9236 IdxConstraint *p1 = 0; 9237 IdxConstraint *pCon; 9238 int rc; 9239 9240 /* Gather up all the == constraints. */ 9241 for(pCon=pScan->pEq; pCon; pCon=pCon->pNext){ 9242 if( !idxFindConstraint(p1, pCon) && !idxFindConstraint(pTail, pCon) ){ 9243 pCon->pLink = p1; 9244 p1 = pCon; 9245 } 9246 } 9247 9248 /* Create an index using the == constraints collected above. And the 9249 ** range constraint/ORDER BY terms passed in by the caller, if any. */ 9250 rc = idxCreateFromCons(p, pScan, p1, pTail); 9251 9252 /* If no range/ORDER BY passed by the caller, create a version of the 9253 ** index for each range constraint. */ 9254 if( pTail==0 ){ 9255 for(pCon=pScan->pRange; rc==SQLITE_OK && pCon; pCon=pCon->pNext){ 9256 assert( pCon->pLink==0 ); 9257 if( !idxFindConstraint(p1, pCon) && !idxFindConstraint(pTail, pCon) ){ 9258 rc = idxCreateFromCons(p, pScan, p1, pCon); 9259 } 9260 } 9261 } 9262 9263 return rc; 9264 } 9265 9266 /* 9267 ** Create candidate indexes in database [dbm] based on the data in 9268 ** linked-list pScan. 9269 */ 9270 static int idxCreateCandidates(sqlite3expert *p){ 9271 int rc = SQLITE_OK; 9272 IdxScan *pIter; 9273 9274 for(pIter=p->pScan; pIter && rc==SQLITE_OK; pIter=pIter->pNextScan){ 9275 rc = idxCreateFromWhere(p, pIter, 0); 9276 if( rc==SQLITE_OK && pIter->pOrder ){ 9277 rc = idxCreateFromWhere(p, pIter, pIter->pOrder); 9278 } 9279 } 9280 9281 return rc; 9282 } 9283 9284 /* 9285 ** Free all elements of the linked list starting at pConstraint. 9286 */ 9287 static void idxConstraintFree(IdxConstraint *pConstraint){ 9288 IdxConstraint *pNext; 9289 IdxConstraint *p; 9290 9291 for(p=pConstraint; p; p=pNext){ 9292 pNext = p->pNext; 9293 sqlite3_free(p); 9294 } 9295 } 9296 9297 /* 9298 ** Free all elements of the linked list starting from pScan up until pLast 9299 ** (pLast is not freed). 9300 */ 9301 static void idxScanFree(IdxScan *pScan, IdxScan *pLast){ 9302 IdxScan *p; 9303 IdxScan *pNext; 9304 for(p=pScan; p!=pLast; p=pNext){ 9305 pNext = p->pNextScan; 9306 idxConstraintFree(p->pOrder); 9307 idxConstraintFree(p->pEq); 9308 idxConstraintFree(p->pRange); 9309 sqlite3_free(p); 9310 } 9311 } 9312 9313 /* 9314 ** Free all elements of the linked list starting from pStatement up 9315 ** until pLast (pLast is not freed). 9316 */ 9317 static void idxStatementFree(IdxStatement *pStatement, IdxStatement *pLast){ 9318 IdxStatement *p; 9319 IdxStatement *pNext; 9320 for(p=pStatement; p!=pLast; p=pNext){ 9321 pNext = p->pNext; 9322 sqlite3_free(p->zEQP); 9323 sqlite3_free(p->zIdx); 9324 sqlite3_free(p); 9325 } 9326 } 9327 9328 /* 9329 ** Free the linked list of IdxTable objects starting at pTab. 9330 */ 9331 static void idxTableFree(IdxTable *pTab){ 9332 IdxTable *pIter; 9333 IdxTable *pNext; 9334 for(pIter=pTab; pIter; pIter=pNext){ 9335 pNext = pIter->pNext; 9336 sqlite3_free(pIter); 9337 } 9338 } 9339 9340 /* 9341 ** Free the linked list of IdxWrite objects starting at pTab. 9342 */ 9343 static void idxWriteFree(IdxWrite *pTab){ 9344 IdxWrite *pIter; 9345 IdxWrite *pNext; 9346 for(pIter=pTab; pIter; pIter=pNext){ 9347 pNext = pIter->pNext; 9348 sqlite3_free(pIter); 9349 } 9350 } 9351 9352 9353 9354 /* 9355 ** This function is called after candidate indexes have been created. It 9356 ** runs all the queries to see which indexes they prefer, and populates 9357 ** IdxStatement.zIdx and IdxStatement.zEQP with the results. 9358 */ 9359 int idxFindIndexes( 9360 sqlite3expert *p, 9361 char **pzErr /* OUT: Error message (sqlite3_malloc) */ 9362 ){ 9363 IdxStatement *pStmt; 9364 sqlite3 *dbm = p->dbm; 9365 int rc = SQLITE_OK; 9366 9367 IdxHash hIdx; 9368 idxHashInit(&hIdx); 9369 9370 for(pStmt=p->pStatement; rc==SQLITE_OK && pStmt; pStmt=pStmt->pNext){ 9371 IdxHashEntry *pEntry; 9372 sqlite3_stmt *pExplain = 0; 9373 idxHashClear(&hIdx); 9374 rc = idxPrintfPrepareStmt(dbm, &pExplain, pzErr, 9375 "EXPLAIN QUERY PLAN %s", pStmt->zSql 9376 ); 9377 while( rc==SQLITE_OK && sqlite3_step(pExplain)==SQLITE_ROW ){ 9378 /* int iId = sqlite3_column_int(pExplain, 0); */ 9379 /* int iParent = sqlite3_column_int(pExplain, 1); */ 9380 /* int iNotUsed = sqlite3_column_int(pExplain, 2); */ 9381 const char *zDetail = (const char*)sqlite3_column_text(pExplain, 3); 9382 int nDetail; 9383 int i; 9384 9385 if( !zDetail ) continue; 9386 nDetail = STRLEN(zDetail); 9387 9388 for(i=0; i<nDetail; i++){ 9389 const char *zIdx = 0; 9390 if( i+13<nDetail && memcmp(&zDetail[i], " USING INDEX ", 13)==0 ){ 9391 zIdx = &zDetail[i+13]; 9392 }else if( i+22<nDetail 9393 && memcmp(&zDetail[i], " USING COVERING INDEX ", 22)==0 9394 ){ 9395 zIdx = &zDetail[i+22]; 9396 } 9397 if( zIdx ){ 9398 const char *zSql; 9399 int nIdx = 0; 9400 while( zIdx[nIdx]!='\0' && (zIdx[nIdx]!=' ' || zIdx[nIdx+1]!='(') ){ 9401 nIdx++; 9402 } 9403 zSql = idxHashSearch(&p->hIdx, zIdx, nIdx); 9404 if( zSql ){ 9405 idxHashAdd(&rc, &hIdx, zSql, 0); 9406 if( rc ) goto find_indexes_out; 9407 } 9408 break; 9409 } 9410 } 9411 9412 if( zDetail[0]!='-' ){ 9413 pStmt->zEQP = idxAppendText(&rc, pStmt->zEQP, "%s\n", zDetail); 9414 } 9415 } 9416 9417 for(pEntry=hIdx.pFirst; pEntry; pEntry=pEntry->pNext){ 9418 pStmt->zIdx = idxAppendText(&rc, pStmt->zIdx, "%s;\n", pEntry->zKey); 9419 } 9420 9421 idxFinalize(&rc, pExplain); 9422 } 9423 9424 find_indexes_out: 9425 idxHashClear(&hIdx); 9426 return rc; 9427 } 9428 9429 static int idxAuthCallback( 9430 void *pCtx, 9431 int eOp, 9432 const char *z3, 9433 const char *z4, 9434 const char *zDb, 9435 const char *zTrigger 9436 ){ 9437 int rc = SQLITE_OK; 9438 (void)z4; 9439 (void)zTrigger; 9440 if( eOp==SQLITE_INSERT || eOp==SQLITE_UPDATE || eOp==SQLITE_DELETE ){ 9441 if( sqlite3_stricmp(zDb, "main")==0 ){ 9442 sqlite3expert *p = (sqlite3expert*)pCtx; 9443 IdxTable *pTab; 9444 for(pTab=p->pTable; pTab; pTab=pTab->pNext){ 9445 if( 0==sqlite3_stricmp(z3, pTab->zName) ) break; 9446 } 9447 if( pTab ){ 9448 IdxWrite *pWrite; 9449 for(pWrite=p->pWrite; pWrite; pWrite=pWrite->pNext){ 9450 if( pWrite->pTab==pTab && pWrite->eOp==eOp ) break; 9451 } 9452 if( pWrite==0 ){ 9453 pWrite = idxMalloc(&rc, sizeof(IdxWrite)); 9454 if( rc==SQLITE_OK ){ 9455 pWrite->pTab = pTab; 9456 pWrite->eOp = eOp; 9457 pWrite->pNext = p->pWrite; 9458 p->pWrite = pWrite; 9459 } 9460 } 9461 } 9462 } 9463 } 9464 return rc; 9465 } 9466 9467 static int idxProcessOneTrigger( 9468 sqlite3expert *p, 9469 IdxWrite *pWrite, 9470 char **pzErr 9471 ){ 9472 static const char *zInt = UNIQUE_TABLE_NAME; 9473 static const char *zDrop = "DROP TABLE " UNIQUE_TABLE_NAME; 9474 IdxTable *pTab = pWrite->pTab; 9475 const char *zTab = pTab->zName; 9476 const char *zSql = 9477 "SELECT 'CREATE TEMP' || substr(sql, 7) FROM sqlite_schema " 9478 "WHERE tbl_name = %Q AND type IN ('table', 'trigger') " 9479 "ORDER BY type;"; 9480 sqlite3_stmt *pSelect = 0; 9481 int rc = SQLITE_OK; 9482 char *zWrite = 0; 9483 9484 /* Create the table and its triggers in the temp schema */ 9485 rc = idxPrintfPrepareStmt(p->db, &pSelect, pzErr, zSql, zTab, zTab); 9486 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSelect) ){ 9487 const char *zCreate = (const char*)sqlite3_column_text(pSelect, 0); 9488 rc = sqlite3_exec(p->dbv, zCreate, 0, 0, pzErr); 9489 } 9490 idxFinalize(&rc, pSelect); 9491 9492 /* Rename the table in the temp schema to zInt */ 9493 if( rc==SQLITE_OK ){ 9494 char *z = sqlite3_mprintf("ALTER TABLE temp.%Q RENAME TO %Q", zTab, zInt); 9495 if( z==0 ){ 9496 rc = SQLITE_NOMEM; 9497 }else{ 9498 rc = sqlite3_exec(p->dbv, z, 0, 0, pzErr); 9499 sqlite3_free(z); 9500 } 9501 } 9502 9503 switch( pWrite->eOp ){ 9504 case SQLITE_INSERT: { 9505 int i; 9506 zWrite = idxAppendText(&rc, zWrite, "INSERT INTO %Q VALUES(", zInt); 9507 for(i=0; i<pTab->nCol; i++){ 9508 zWrite = idxAppendText(&rc, zWrite, "%s?", i==0 ? "" : ", "); 9509 } 9510 zWrite = idxAppendText(&rc, zWrite, ")"); 9511 break; 9512 } 9513 case SQLITE_UPDATE: { 9514 int i; 9515 zWrite = idxAppendText(&rc, zWrite, "UPDATE %Q SET ", zInt); 9516 for(i=0; i<pTab->nCol; i++){ 9517 zWrite = idxAppendText(&rc, zWrite, "%s%Q=?", i==0 ? "" : ", ", 9518 pTab->aCol[i].zName 9519 ); 9520 } 9521 break; 9522 } 9523 default: { 9524 assert( pWrite->eOp==SQLITE_DELETE ); 9525 if( rc==SQLITE_OK ){ 9526 zWrite = sqlite3_mprintf("DELETE FROM %Q", zInt); 9527 if( zWrite==0 ) rc = SQLITE_NOMEM; 9528 } 9529 } 9530 } 9531 9532 if( rc==SQLITE_OK ){ 9533 sqlite3_stmt *pX = 0; 9534 rc = sqlite3_prepare_v2(p->dbv, zWrite, -1, &pX, 0); 9535 idxFinalize(&rc, pX); 9536 if( rc!=SQLITE_OK ){ 9537 idxDatabaseError(p->dbv, pzErr); 9538 } 9539 } 9540 sqlite3_free(zWrite); 9541 9542 if( rc==SQLITE_OK ){ 9543 rc = sqlite3_exec(p->dbv, zDrop, 0, 0, pzErr); 9544 } 9545 9546 return rc; 9547 } 9548 9549 static int idxProcessTriggers(sqlite3expert *p, char **pzErr){ 9550 int rc = SQLITE_OK; 9551 IdxWrite *pEnd = 0; 9552 IdxWrite *pFirst = p->pWrite; 9553 9554 while( rc==SQLITE_OK && pFirst!=pEnd ){ 9555 IdxWrite *pIter; 9556 for(pIter=pFirst; rc==SQLITE_OK && pIter!=pEnd; pIter=pIter->pNext){ 9557 rc = idxProcessOneTrigger(p, pIter, pzErr); 9558 } 9559 pEnd = pFirst; 9560 pFirst = p->pWrite; 9561 } 9562 9563 return rc; 9564 } 9565 9566 9567 static int idxCreateVtabSchema(sqlite3expert *p, char **pzErrmsg){ 9568 int rc = idxRegisterVtab(p); 9569 sqlite3_stmt *pSchema = 0; 9570 9571 /* For each table in the main db schema: 9572 ** 9573 ** 1) Add an entry to the p->pTable list, and 9574 ** 2) Create the equivalent virtual table in dbv. 9575 */ 9576 rc = idxPrepareStmt(p->db, &pSchema, pzErrmsg, 9577 "SELECT type, name, sql, 1 FROM sqlite_schema " 9578 "WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%%' " 9579 " UNION ALL " 9580 "SELECT type, name, sql, 2 FROM sqlite_schema " 9581 "WHERE type = 'trigger'" 9582 " AND tbl_name IN(SELECT name FROM sqlite_schema WHERE type = 'view') " 9583 "ORDER BY 4, 1" 9584 ); 9585 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSchema) ){ 9586 const char *zType = (const char*)sqlite3_column_text(pSchema, 0); 9587 const char *zName = (const char*)sqlite3_column_text(pSchema, 1); 9588 const char *zSql = (const char*)sqlite3_column_text(pSchema, 2); 9589 9590 if( zType[0]=='v' || zType[1]=='r' ){ 9591 rc = sqlite3_exec(p->dbv, zSql, 0, 0, pzErrmsg); 9592 }else{ 9593 IdxTable *pTab; 9594 rc = idxGetTableInfo(p->db, zName, &pTab, pzErrmsg); 9595 if( rc==SQLITE_OK ){ 9596 int i; 9597 char *zInner = 0; 9598 char *zOuter = 0; 9599 pTab->pNext = p->pTable; 9600 p->pTable = pTab; 9601 9602 /* The statement the vtab will pass to sqlite3_declare_vtab() */ 9603 zInner = idxAppendText(&rc, 0, "CREATE TABLE x("); 9604 for(i=0; i<pTab->nCol; i++){ 9605 zInner = idxAppendText(&rc, zInner, "%s%Q COLLATE %s", 9606 (i==0 ? "" : ", "), pTab->aCol[i].zName, pTab->aCol[i].zColl 9607 ); 9608 } 9609 zInner = idxAppendText(&rc, zInner, ")"); 9610 9611 /* The CVT statement to create the vtab */ 9612 zOuter = idxAppendText(&rc, 0, 9613 "CREATE VIRTUAL TABLE %Q USING expert(%Q)", zName, zInner 9614 ); 9615 if( rc==SQLITE_OK ){ 9616 rc = sqlite3_exec(p->dbv, zOuter, 0, 0, pzErrmsg); 9617 } 9618 sqlite3_free(zInner); 9619 sqlite3_free(zOuter); 9620 } 9621 } 9622 } 9623 idxFinalize(&rc, pSchema); 9624 return rc; 9625 } 9626 9627 struct IdxSampleCtx { 9628 int iTarget; 9629 double target; /* Target nRet/nRow value */ 9630 double nRow; /* Number of rows seen */ 9631 double nRet; /* Number of rows returned */ 9632 }; 9633 9634 static void idxSampleFunc( 9635 sqlite3_context *pCtx, 9636 int argc, 9637 sqlite3_value **argv 9638 ){ 9639 struct IdxSampleCtx *p = (struct IdxSampleCtx*)sqlite3_user_data(pCtx); 9640 int bRet; 9641 9642 (void)argv; 9643 assert( argc==0 ); 9644 if( p->nRow==0.0 ){ 9645 bRet = 1; 9646 }else{ 9647 bRet = (p->nRet / p->nRow) <= p->target; 9648 if( bRet==0 ){ 9649 unsigned short rnd; 9650 sqlite3_randomness(2, (void*)&rnd); 9651 bRet = ((int)rnd % 100) <= p->iTarget; 9652 } 9653 } 9654 9655 sqlite3_result_int(pCtx, bRet); 9656 p->nRow += 1.0; 9657 p->nRet += (double)bRet; 9658 } 9659 9660 struct IdxRemCtx { 9661 int nSlot; 9662 struct IdxRemSlot { 9663 int eType; /* SQLITE_NULL, INTEGER, REAL, TEXT, BLOB */ 9664 i64 iVal; /* SQLITE_INTEGER value */ 9665 double rVal; /* SQLITE_FLOAT value */ 9666 int nByte; /* Bytes of space allocated at z */ 9667 int n; /* Size of buffer z */ 9668 char *z; /* SQLITE_TEXT/BLOB value */ 9669 } aSlot[1]; 9670 }; 9671 9672 /* 9673 ** Implementation of scalar function rem(). 9674 */ 9675 static void idxRemFunc( 9676 sqlite3_context *pCtx, 9677 int argc, 9678 sqlite3_value **argv 9679 ){ 9680 struct IdxRemCtx *p = (struct IdxRemCtx*)sqlite3_user_data(pCtx); 9681 struct IdxRemSlot *pSlot; 9682 int iSlot; 9683 assert( argc==2 ); 9684 9685 iSlot = sqlite3_value_int(argv[0]); 9686 assert( iSlot<=p->nSlot ); 9687 pSlot = &p->aSlot[iSlot]; 9688 9689 switch( pSlot->eType ){ 9690 case SQLITE_NULL: 9691 /* no-op */ 9692 break; 9693 9694 case SQLITE_INTEGER: 9695 sqlite3_result_int64(pCtx, pSlot->iVal); 9696 break; 9697 9698 case SQLITE_FLOAT: 9699 sqlite3_result_double(pCtx, pSlot->rVal); 9700 break; 9701 9702 case SQLITE_BLOB: 9703 sqlite3_result_blob(pCtx, pSlot->z, pSlot->n, SQLITE_TRANSIENT); 9704 break; 9705 9706 case SQLITE_TEXT: 9707 sqlite3_result_text(pCtx, pSlot->z, pSlot->n, SQLITE_TRANSIENT); 9708 break; 9709 } 9710 9711 pSlot->eType = sqlite3_value_type(argv[1]); 9712 switch( pSlot->eType ){ 9713 case SQLITE_NULL: 9714 /* no-op */ 9715 break; 9716 9717 case SQLITE_INTEGER: 9718 pSlot->iVal = sqlite3_value_int64(argv[1]); 9719 break; 9720 9721 case SQLITE_FLOAT: 9722 pSlot->rVal = sqlite3_value_double(argv[1]); 9723 break; 9724 9725 case SQLITE_BLOB: 9726 case SQLITE_TEXT: { 9727 int nByte = sqlite3_value_bytes(argv[1]); 9728 if( nByte>pSlot->nByte ){ 9729 char *zNew = (char*)sqlite3_realloc(pSlot->z, nByte*2); 9730 if( zNew==0 ){ 9731 sqlite3_result_error_nomem(pCtx); 9732 return; 9733 } 9734 pSlot->nByte = nByte*2; 9735 pSlot->z = zNew; 9736 } 9737 pSlot->n = nByte; 9738 if( pSlot->eType==SQLITE_BLOB ){ 9739 memcpy(pSlot->z, sqlite3_value_blob(argv[1]), nByte); 9740 }else{ 9741 memcpy(pSlot->z, sqlite3_value_text(argv[1]), nByte); 9742 } 9743 break; 9744 } 9745 } 9746 } 9747 9748 static int idxLargestIndex(sqlite3 *db, int *pnMax, char **pzErr){ 9749 int rc = SQLITE_OK; 9750 const char *zMax = 9751 "SELECT max(i.seqno) FROM " 9752 " sqlite_schema AS s, " 9753 " pragma_index_list(s.name) AS l, " 9754 " pragma_index_info(l.name) AS i " 9755 "WHERE s.type = 'table'"; 9756 sqlite3_stmt *pMax = 0; 9757 9758 *pnMax = 0; 9759 rc = idxPrepareStmt(db, &pMax, pzErr, zMax); 9760 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pMax) ){ 9761 *pnMax = sqlite3_column_int(pMax, 0) + 1; 9762 } 9763 idxFinalize(&rc, pMax); 9764 9765 return rc; 9766 } 9767 9768 static int idxPopulateOneStat1( 9769 sqlite3expert *p, 9770 sqlite3_stmt *pIndexXInfo, 9771 sqlite3_stmt *pWriteStat, 9772 const char *zTab, 9773 const char *zIdx, 9774 char **pzErr 9775 ){ 9776 char *zCols = 0; 9777 char *zOrder = 0; 9778 char *zQuery = 0; 9779 int nCol = 0; 9780 int i; 9781 sqlite3_stmt *pQuery = 0; 9782 int *aStat = 0; 9783 int rc = SQLITE_OK; 9784 9785 assert( p->iSample>0 ); 9786 9787 /* Formulate the query text */ 9788 sqlite3_bind_text(pIndexXInfo, 1, zIdx, -1, SQLITE_STATIC); 9789 while( SQLITE_OK==rc && SQLITE_ROW==sqlite3_step(pIndexXInfo) ){ 9790 const char *zComma = zCols==0 ? "" : ", "; 9791 const char *zName = (const char*)sqlite3_column_text(pIndexXInfo, 0); 9792 const char *zColl = (const char*)sqlite3_column_text(pIndexXInfo, 1); 9793 zCols = idxAppendText(&rc, zCols, 9794 "%sx.%Q IS rem(%d, x.%Q) COLLATE %s", zComma, zName, nCol, zName, zColl 9795 ); 9796 zOrder = idxAppendText(&rc, zOrder, "%s%d", zComma, ++nCol); 9797 } 9798 sqlite3_reset(pIndexXInfo); 9799 if( rc==SQLITE_OK ){ 9800 if( p->iSample==100 ){ 9801 zQuery = sqlite3_mprintf( 9802 "SELECT %s FROM %Q x ORDER BY %s", zCols, zTab, zOrder 9803 ); 9804 }else{ 9805 zQuery = sqlite3_mprintf( 9806 "SELECT %s FROM temp."UNIQUE_TABLE_NAME" x ORDER BY %s", zCols, zOrder 9807 ); 9808 } 9809 } 9810 sqlite3_free(zCols); 9811 sqlite3_free(zOrder); 9812 9813 /* Formulate the query text */ 9814 if( rc==SQLITE_OK ){ 9815 sqlite3 *dbrem = (p->iSample==100 ? p->db : p->dbv); 9816 rc = idxPrepareStmt(dbrem, &pQuery, pzErr, zQuery); 9817 } 9818 sqlite3_free(zQuery); 9819 9820 if( rc==SQLITE_OK ){ 9821 aStat = (int*)idxMalloc(&rc, sizeof(int)*(nCol+1)); 9822 } 9823 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pQuery) ){ 9824 IdxHashEntry *pEntry; 9825 char *zStat = 0; 9826 for(i=0; i<=nCol; i++) aStat[i] = 1; 9827 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pQuery) ){ 9828 aStat[0]++; 9829 for(i=0; i<nCol; i++){ 9830 if( sqlite3_column_int(pQuery, i)==0 ) break; 9831 } 9832 for(/*no-op*/; i<nCol; i++){ 9833 aStat[i+1]++; 9834 } 9835 } 9836 9837 if( rc==SQLITE_OK ){ 9838 int s0 = aStat[0]; 9839 zStat = sqlite3_mprintf("%d", s0); 9840 if( zStat==0 ) rc = SQLITE_NOMEM; 9841 for(i=1; rc==SQLITE_OK && i<=nCol; i++){ 9842 zStat = idxAppendText(&rc, zStat, " %d", (s0+aStat[i]/2) / aStat[i]); 9843 } 9844 } 9845 9846 if( rc==SQLITE_OK ){ 9847 sqlite3_bind_text(pWriteStat, 1, zTab, -1, SQLITE_STATIC); 9848 sqlite3_bind_text(pWriteStat, 2, zIdx, -1, SQLITE_STATIC); 9849 sqlite3_bind_text(pWriteStat, 3, zStat, -1, SQLITE_STATIC); 9850 sqlite3_step(pWriteStat); 9851 rc = sqlite3_reset(pWriteStat); 9852 } 9853 9854 pEntry = idxHashFind(&p->hIdx, zIdx, STRLEN(zIdx)); 9855 if( pEntry ){ 9856 assert( pEntry->zVal2==0 ); 9857 pEntry->zVal2 = zStat; 9858 }else{ 9859 sqlite3_free(zStat); 9860 } 9861 } 9862 sqlite3_free(aStat); 9863 idxFinalize(&rc, pQuery); 9864 9865 return rc; 9866 } 9867 9868 static int idxBuildSampleTable(sqlite3expert *p, const char *zTab){ 9869 int rc; 9870 char *zSql; 9871 9872 rc = sqlite3_exec(p->dbv,"DROP TABLE IF EXISTS temp."UNIQUE_TABLE_NAME,0,0,0); 9873 if( rc!=SQLITE_OK ) return rc; 9874 9875 zSql = sqlite3_mprintf( 9876 "CREATE TABLE temp." UNIQUE_TABLE_NAME " AS SELECT * FROM %Q", zTab 9877 ); 9878 if( zSql==0 ) return SQLITE_NOMEM; 9879 rc = sqlite3_exec(p->dbv, zSql, 0, 0, 0); 9880 sqlite3_free(zSql); 9881 9882 return rc; 9883 } 9884 9885 /* 9886 ** This function is called as part of sqlite3_expert_analyze(). Candidate 9887 ** indexes have already been created in database sqlite3expert.dbm, this 9888 ** function populates sqlite_stat1 table in the same database. 9889 ** 9890 ** The stat1 data is generated by querying the 9891 */ 9892 static int idxPopulateStat1(sqlite3expert *p, char **pzErr){ 9893 int rc = SQLITE_OK; 9894 int nMax =0; 9895 struct IdxRemCtx *pCtx = 0; 9896 struct IdxSampleCtx samplectx; 9897 int i; 9898 i64 iPrev = -100000; 9899 sqlite3_stmt *pAllIndex = 0; 9900 sqlite3_stmt *pIndexXInfo = 0; 9901 sqlite3_stmt *pWrite = 0; 9902 9903 const char *zAllIndex = 9904 "SELECT s.rowid, s.name, l.name FROM " 9905 " sqlite_schema AS s, " 9906 " pragma_index_list(s.name) AS l " 9907 "WHERE s.type = 'table'"; 9908 const char *zIndexXInfo = 9909 "SELECT name, coll FROM pragma_index_xinfo(?) WHERE key"; 9910 const char *zWrite = "INSERT INTO sqlite_stat1 VALUES(?, ?, ?)"; 9911 9912 /* If iSample==0, no sqlite_stat1 data is required. */ 9913 if( p->iSample==0 ) return SQLITE_OK; 9914 9915 rc = idxLargestIndex(p->dbm, &nMax, pzErr); 9916 if( nMax<=0 || rc!=SQLITE_OK ) return rc; 9917 9918 rc = sqlite3_exec(p->dbm, "ANALYZE; PRAGMA writable_schema=1", 0, 0, 0); 9919 9920 if( rc==SQLITE_OK ){ 9921 int nByte = sizeof(struct IdxRemCtx) + (sizeof(struct IdxRemSlot) * nMax); 9922 pCtx = (struct IdxRemCtx*)idxMalloc(&rc, nByte); 9923 } 9924 9925 if( rc==SQLITE_OK ){ 9926 sqlite3 *dbrem = (p->iSample==100 ? p->db : p->dbv); 9927 rc = sqlite3_create_function( 9928 dbrem, "rem", 2, SQLITE_UTF8, (void*)pCtx, idxRemFunc, 0, 0 9929 ); 9930 } 9931 if( rc==SQLITE_OK ){ 9932 rc = sqlite3_create_function( 9933 p->db, "sample", 0, SQLITE_UTF8, (void*)&samplectx, idxSampleFunc, 0, 0 9934 ); 9935 } 9936 9937 if( rc==SQLITE_OK ){ 9938 pCtx->nSlot = nMax+1; 9939 rc = idxPrepareStmt(p->dbm, &pAllIndex, pzErr, zAllIndex); 9940 } 9941 if( rc==SQLITE_OK ){ 9942 rc = idxPrepareStmt(p->dbm, &pIndexXInfo, pzErr, zIndexXInfo); 9943 } 9944 if( rc==SQLITE_OK ){ 9945 rc = idxPrepareStmt(p->dbm, &pWrite, pzErr, zWrite); 9946 } 9947 9948 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pAllIndex) ){ 9949 i64 iRowid = sqlite3_column_int64(pAllIndex, 0); 9950 const char *zTab = (const char*)sqlite3_column_text(pAllIndex, 1); 9951 const char *zIdx = (const char*)sqlite3_column_text(pAllIndex, 2); 9952 if( p->iSample<100 && iPrev!=iRowid ){ 9953 samplectx.target = (double)p->iSample / 100.0; 9954 samplectx.iTarget = p->iSample; 9955 samplectx.nRow = 0.0; 9956 samplectx.nRet = 0.0; 9957 rc = idxBuildSampleTable(p, zTab); 9958 if( rc!=SQLITE_OK ) break; 9959 } 9960 rc = idxPopulateOneStat1(p, pIndexXInfo, pWrite, zTab, zIdx, pzErr); 9961 iPrev = iRowid; 9962 } 9963 if( rc==SQLITE_OK && p->iSample<100 ){ 9964 rc = sqlite3_exec(p->dbv, 9965 "DROP TABLE IF EXISTS temp." UNIQUE_TABLE_NAME, 0,0,0 9966 ); 9967 } 9968 9969 idxFinalize(&rc, pAllIndex); 9970 idxFinalize(&rc, pIndexXInfo); 9971 idxFinalize(&rc, pWrite); 9972 9973 if( pCtx ){ 9974 for(i=0; i<pCtx->nSlot; i++){ 9975 sqlite3_free(pCtx->aSlot[i].z); 9976 } 9977 sqlite3_free(pCtx); 9978 } 9979 9980 if( rc==SQLITE_OK ){ 9981 rc = sqlite3_exec(p->dbm, "ANALYZE sqlite_schema", 0, 0, 0); 9982 } 9983 9984 sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp."UNIQUE_TABLE_NAME,0,0,0); 9985 return rc; 9986 } 9987 9988 /* 9989 ** Allocate a new sqlite3expert object. 9990 */ 9991 sqlite3expert *sqlite3_expert_new(sqlite3 *db, char **pzErrmsg){ 9992 int rc = SQLITE_OK; 9993 sqlite3expert *pNew; 9994 9995 pNew = (sqlite3expert*)idxMalloc(&rc, sizeof(sqlite3expert)); 9996 9997 /* Open two in-memory databases to work with. The "vtab database" (dbv) 9998 ** will contain a virtual table corresponding to each real table in 9999 ** the user database schema, and a copy of each view. It is used to 10000 ** collect information regarding the WHERE, ORDER BY and other clauses 10001 ** of the user's query. 10002 */ 10003 if( rc==SQLITE_OK ){ 10004 pNew->db = db; 10005 pNew->iSample = 100; 10006 rc = sqlite3_open(":memory:", &pNew->dbv); 10007 } 10008 if( rc==SQLITE_OK ){ 10009 rc = sqlite3_open(":memory:", &pNew->dbm); 10010 if( rc==SQLITE_OK ){ 10011 sqlite3_db_config(pNew->dbm, SQLITE_DBCONFIG_TRIGGER_EQP, 1, (int*)0); 10012 } 10013 } 10014 10015 10016 /* Copy the entire schema of database [db] into [dbm]. */ 10017 if( rc==SQLITE_OK ){ 10018 sqlite3_stmt *pSql; 10019 rc = idxPrintfPrepareStmt(pNew->db, &pSql, pzErrmsg, 10020 "SELECT sql FROM sqlite_schema WHERE name NOT LIKE 'sqlite_%%'" 10021 " AND sql NOT LIKE 'CREATE VIRTUAL %%'" 10022 ); 10023 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){ 10024 const char *zSql = (const char*)sqlite3_column_text(pSql, 0); 10025 rc = sqlite3_exec(pNew->dbm, zSql, 0, 0, pzErrmsg); 10026 } 10027 idxFinalize(&rc, pSql); 10028 } 10029 10030 /* Create the vtab schema */ 10031 if( rc==SQLITE_OK ){ 10032 rc = idxCreateVtabSchema(pNew, pzErrmsg); 10033 } 10034 10035 /* Register the auth callback with dbv */ 10036 if( rc==SQLITE_OK ){ 10037 sqlite3_set_authorizer(pNew->dbv, idxAuthCallback, (void*)pNew); 10038 } 10039 10040 /* If an error has occurred, free the new object and reutrn NULL. Otherwise, 10041 ** return the new sqlite3expert handle. */ 10042 if( rc!=SQLITE_OK ){ 10043 sqlite3_expert_destroy(pNew); 10044 pNew = 0; 10045 } 10046 return pNew; 10047 } 10048 10049 /* 10050 ** Configure an sqlite3expert object. 10051 */ 10052 int sqlite3_expert_config(sqlite3expert *p, int op, ...){ 10053 int rc = SQLITE_OK; 10054 va_list ap; 10055 va_start(ap, op); 10056 switch( op ){ 10057 case EXPERT_CONFIG_SAMPLE: { 10058 int iVal = va_arg(ap, int); 10059 if( iVal<0 ) iVal = 0; 10060 if( iVal>100 ) iVal = 100; 10061 p->iSample = iVal; 10062 break; 10063 } 10064 default: 10065 rc = SQLITE_NOTFOUND; 10066 break; 10067 } 10068 10069 va_end(ap); 10070 return rc; 10071 } 10072 10073 /* 10074 ** Add an SQL statement to the analysis. 10075 */ 10076 int sqlite3_expert_sql( 10077 sqlite3expert *p, /* From sqlite3_expert_new() */ 10078 const char *zSql, /* SQL statement to add */ 10079 char **pzErr /* OUT: Error message (if any) */ 10080 ){ 10081 IdxScan *pScanOrig = p->pScan; 10082 IdxStatement *pStmtOrig = p->pStatement; 10083 int rc = SQLITE_OK; 10084 const char *zStmt = zSql; 10085 10086 if( p->bRun ) return SQLITE_MISUSE; 10087 10088 while( rc==SQLITE_OK && zStmt && zStmt[0] ){ 10089 sqlite3_stmt *pStmt = 0; 10090 rc = sqlite3_prepare_v2(p->dbv, zStmt, -1, &pStmt, &zStmt); 10091 if( rc==SQLITE_OK ){ 10092 if( pStmt ){ 10093 IdxStatement *pNew; 10094 const char *z = sqlite3_sql(pStmt); 10095 int n = STRLEN(z); 10096 pNew = (IdxStatement*)idxMalloc(&rc, sizeof(IdxStatement) + n+1); 10097 if( rc==SQLITE_OK ){ 10098 pNew->zSql = (char*)&pNew[1]; 10099 memcpy(pNew->zSql, z, n+1); 10100 pNew->pNext = p->pStatement; 10101 if( p->pStatement ) pNew->iId = p->pStatement->iId+1; 10102 p->pStatement = pNew; 10103 } 10104 sqlite3_finalize(pStmt); 10105 } 10106 }else{ 10107 idxDatabaseError(p->dbv, pzErr); 10108 } 10109 } 10110 10111 if( rc!=SQLITE_OK ){ 10112 idxScanFree(p->pScan, pScanOrig); 10113 idxStatementFree(p->pStatement, pStmtOrig); 10114 p->pScan = pScanOrig; 10115 p->pStatement = pStmtOrig; 10116 } 10117 10118 return rc; 10119 } 10120 10121 int sqlite3_expert_analyze(sqlite3expert *p, char **pzErr){ 10122 int rc; 10123 IdxHashEntry *pEntry; 10124 10125 /* Do trigger processing to collect any extra IdxScan structures */ 10126 rc = idxProcessTriggers(p, pzErr); 10127 10128 /* Create candidate indexes within the in-memory database file */ 10129 if( rc==SQLITE_OK ){ 10130 rc = idxCreateCandidates(p); 10131 } 10132 10133 /* Generate the stat1 data */ 10134 if( rc==SQLITE_OK ){ 10135 rc = idxPopulateStat1(p, pzErr); 10136 } 10137 10138 /* Formulate the EXPERT_REPORT_CANDIDATES text */ 10139 for(pEntry=p->hIdx.pFirst; pEntry; pEntry=pEntry->pNext){ 10140 p->zCandidates = idxAppendText(&rc, p->zCandidates, 10141 "%s;%s%s\n", pEntry->zVal, 10142 pEntry->zVal2 ? " -- stat1: " : "", pEntry->zVal2 10143 ); 10144 } 10145 10146 /* Figure out which of the candidate indexes are preferred by the query 10147 ** planner and report the results to the user. */ 10148 if( rc==SQLITE_OK ){ 10149 rc = idxFindIndexes(p, pzErr); 10150 } 10151 10152 if( rc==SQLITE_OK ){ 10153 p->bRun = 1; 10154 } 10155 return rc; 10156 } 10157 10158 /* 10159 ** Return the total number of statements that have been added to this 10160 ** sqlite3expert using sqlite3_expert_sql(). 10161 */ 10162 int sqlite3_expert_count(sqlite3expert *p){ 10163 int nRet = 0; 10164 if( p->pStatement ) nRet = p->pStatement->iId+1; 10165 return nRet; 10166 } 10167 10168 /* 10169 ** Return a component of the report. 10170 */ 10171 const char *sqlite3_expert_report(sqlite3expert *p, int iStmt, int eReport){ 10172 const char *zRet = 0; 10173 IdxStatement *pStmt; 10174 10175 if( p->bRun==0 ) return 0; 10176 for(pStmt=p->pStatement; pStmt && pStmt->iId!=iStmt; pStmt=pStmt->pNext); 10177 switch( eReport ){ 10178 case EXPERT_REPORT_SQL: 10179 if( pStmt ) zRet = pStmt->zSql; 10180 break; 10181 case EXPERT_REPORT_INDEXES: 10182 if( pStmt ) zRet = pStmt->zIdx; 10183 break; 10184 case EXPERT_REPORT_PLAN: 10185 if( pStmt ) zRet = pStmt->zEQP; 10186 break; 10187 case EXPERT_REPORT_CANDIDATES: 10188 zRet = p->zCandidates; 10189 break; 10190 } 10191 return zRet; 10192 } 10193 10194 /* 10195 ** Free an sqlite3expert object. 10196 */ 10197 void sqlite3_expert_destroy(sqlite3expert *p){ 10198 if( p ){ 10199 sqlite3_close(p->dbm); 10200 sqlite3_close(p->dbv); 10201 idxScanFree(p->pScan, 0); 10202 idxStatementFree(p->pStatement, 0); 10203 idxTableFree(p->pTable); 10204 idxWriteFree(p->pWrite); 10205 idxHashClear(&p->hIdx); 10206 sqlite3_free(p->zCandidates); 10207 sqlite3_free(p); 10208 } 10209 } 10210 10211 #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */ 10212 10213 /************************* End ../ext/expert/sqlite3expert.c ********************/ 10214 10215 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) 10216 /************************* Begin ../ext/misc/dbdata.c ******************/ 10217 /* 10218 ** 2019-04-17 10219 ** 10220 ** The author disclaims copyright to this source code. In place of 10221 ** a legal notice, here is a blessing: 10222 ** 10223 ** May you do good and not evil. 10224 ** May you find forgiveness for yourself and forgive others. 10225 ** May you share freely, never taking more than you give. 10226 ** 10227 ****************************************************************************** 10228 ** 10229 ** This file contains an implementation of two eponymous virtual tables, 10230 ** "sqlite_dbdata" and "sqlite_dbptr". Both modules require that the 10231 ** "sqlite_dbpage" eponymous virtual table be available. 10232 ** 10233 ** SQLITE_DBDATA: 10234 ** sqlite_dbdata is used to extract data directly from a database b-tree 10235 ** page and its associated overflow pages, bypassing the b-tree layer. 10236 ** The table schema is equivalent to: 10237 ** 10238 ** CREATE TABLE sqlite_dbdata( 10239 ** pgno INTEGER, 10240 ** cell INTEGER, 10241 ** field INTEGER, 10242 ** value ANY, 10243 ** schema TEXT HIDDEN 10244 ** ); 10245 ** 10246 ** IMPORTANT: THE VIRTUAL TABLE SCHEMA ABOVE IS SUBJECT TO CHANGE. IN THE 10247 ** FUTURE NEW NON-HIDDEN COLUMNS MAY BE ADDED BETWEEN "value" AND 10248 ** "schema". 10249 ** 10250 ** Each page of the database is inspected. If it cannot be interpreted as 10251 ** a b-tree page, or if it is a b-tree page containing 0 entries, the 10252 ** sqlite_dbdata table contains no rows for that page. Otherwise, the 10253 ** table contains one row for each field in the record associated with 10254 ** each cell on the page. For intkey b-trees, the key value is stored in 10255 ** field -1. 10256 ** 10257 ** For example, for the database: 10258 ** 10259 ** CREATE TABLE t1(a, b); -- root page is page 2 10260 ** INSERT INTO t1(rowid, a, b) VALUES(5, 'v', 'five'); 10261 ** INSERT INTO t1(rowid, a, b) VALUES(10, 'x', 'ten'); 10262 ** 10263 ** the sqlite_dbdata table contains, as well as from entries related to 10264 ** page 1, content equivalent to: 10265 ** 10266 ** INSERT INTO sqlite_dbdata(pgno, cell, field, value) VALUES 10267 ** (2, 0, -1, 5 ), 10268 ** (2, 0, 0, 'v' ), 10269 ** (2, 0, 1, 'five'), 10270 ** (2, 1, -1, 10 ), 10271 ** (2, 1, 0, 'x' ), 10272 ** (2, 1, 1, 'ten' ); 10273 ** 10274 ** If database corruption is encountered, this module does not report an 10275 ** error. Instead, it attempts to extract as much data as possible and 10276 ** ignores the corruption. 10277 ** 10278 ** SQLITE_DBPTR: 10279 ** The sqlite_dbptr table has the following schema: 10280 ** 10281 ** CREATE TABLE sqlite_dbptr( 10282 ** pgno INTEGER, 10283 ** child INTEGER, 10284 ** schema TEXT HIDDEN 10285 ** ); 10286 ** 10287 ** It contains one entry for each b-tree pointer between a parent and 10288 ** child page in the database. 10289 */ 10290 #if !defined(SQLITEINT_H) 10291 /* #include "sqlite3ext.h" */ 10292 10293 /* typedef unsigned char u8; */ 10294 10295 #endif 10296 SQLITE_EXTENSION_INIT1 10297 #include <string.h> 10298 #include <assert.h> 10299 10300 #define DBDATA_PADDING_BYTES 100 10301 10302 typedef struct DbdataTable DbdataTable; 10303 typedef struct DbdataCursor DbdataCursor; 10304 10305 /* Cursor object */ 10306 struct DbdataCursor { 10307 sqlite3_vtab_cursor base; /* Base class. Must be first */ 10308 sqlite3_stmt *pStmt; /* For fetching database pages */ 10309 10310 int iPgno; /* Current page number */ 10311 u8 *aPage; /* Buffer containing page */ 10312 int nPage; /* Size of aPage[] in bytes */ 10313 int nCell; /* Number of cells on aPage[] */ 10314 int iCell; /* Current cell number */ 10315 int bOnePage; /* True to stop after one page */ 10316 int szDb; 10317 sqlite3_int64 iRowid; 10318 10319 /* Only for the sqlite_dbdata table */ 10320 u8 *pRec; /* Buffer containing current record */ 10321 int nRec; /* Size of pRec[] in bytes */ 10322 int nHdr; /* Size of header in bytes */ 10323 int iField; /* Current field number */ 10324 u8 *pHdrPtr; 10325 u8 *pPtr; 10326 10327 sqlite3_int64 iIntkey; /* Integer key value */ 10328 }; 10329 10330 /* Table object */ 10331 struct DbdataTable { 10332 sqlite3_vtab base; /* Base class. Must be first */ 10333 sqlite3 *db; /* The database connection */ 10334 sqlite3_stmt *pStmt; /* For fetching database pages */ 10335 int bPtr; /* True for sqlite3_dbptr table */ 10336 }; 10337 10338 /* Column and schema definitions for sqlite_dbdata */ 10339 #define DBDATA_COLUMN_PGNO 0 10340 #define DBDATA_COLUMN_CELL 1 10341 #define DBDATA_COLUMN_FIELD 2 10342 #define DBDATA_COLUMN_VALUE 3 10343 #define DBDATA_COLUMN_SCHEMA 4 10344 #define DBDATA_SCHEMA \ 10345 "CREATE TABLE x(" \ 10346 " pgno INTEGER," \ 10347 " cell INTEGER," \ 10348 " field INTEGER," \ 10349 " value ANY," \ 10350 " schema TEXT HIDDEN" \ 10351 ")" 10352 10353 /* Column and schema definitions for sqlite_dbptr */ 10354 #define DBPTR_COLUMN_PGNO 0 10355 #define DBPTR_COLUMN_CHILD 1 10356 #define DBPTR_COLUMN_SCHEMA 2 10357 #define DBPTR_SCHEMA \ 10358 "CREATE TABLE x(" \ 10359 " pgno INTEGER," \ 10360 " child INTEGER," \ 10361 " schema TEXT HIDDEN" \ 10362 ")" 10363 10364 /* 10365 ** Connect to an sqlite_dbdata (pAux==0) or sqlite_dbptr (pAux!=0) virtual 10366 ** table. 10367 */ 10368 static int dbdataConnect( 10369 sqlite3 *db, 10370 void *pAux, 10371 int argc, const char *const*argv, 10372 sqlite3_vtab **ppVtab, 10373 char **pzErr 10374 ){ 10375 DbdataTable *pTab = 0; 10376 int rc = sqlite3_declare_vtab(db, pAux ? DBPTR_SCHEMA : DBDATA_SCHEMA); 10377 10378 if( rc==SQLITE_OK ){ 10379 pTab = (DbdataTable*)sqlite3_malloc64(sizeof(DbdataTable)); 10380 if( pTab==0 ){ 10381 rc = SQLITE_NOMEM; 10382 }else{ 10383 memset(pTab, 0, sizeof(DbdataTable)); 10384 pTab->db = db; 10385 pTab->bPtr = (pAux!=0); 10386 } 10387 } 10388 10389 *ppVtab = (sqlite3_vtab*)pTab; 10390 return rc; 10391 } 10392 10393 /* 10394 ** Disconnect from or destroy a sqlite_dbdata or sqlite_dbptr virtual table. 10395 */ 10396 static int dbdataDisconnect(sqlite3_vtab *pVtab){ 10397 DbdataTable *pTab = (DbdataTable*)pVtab; 10398 if( pTab ){ 10399 sqlite3_finalize(pTab->pStmt); 10400 sqlite3_free(pVtab); 10401 } 10402 return SQLITE_OK; 10403 } 10404 10405 /* 10406 ** This function interprets two types of constraints: 10407 ** 10408 ** schema=? 10409 ** pgno=? 10410 ** 10411 ** If neither are present, idxNum is set to 0. If schema=? is present, 10412 ** the 0x01 bit in idxNum is set. If pgno=? is present, the 0x02 bit 10413 ** in idxNum is set. 10414 ** 10415 ** If both parameters are present, schema is in position 0 and pgno in 10416 ** position 1. 10417 */ 10418 static int dbdataBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdx){ 10419 DbdataTable *pTab = (DbdataTable*)tab; 10420 int i; 10421 int iSchema = -1; 10422 int iPgno = -1; 10423 int colSchema = (pTab->bPtr ? DBPTR_COLUMN_SCHEMA : DBDATA_COLUMN_SCHEMA); 10424 10425 for(i=0; i<pIdx->nConstraint; i++){ 10426 struct sqlite3_index_constraint *p = &pIdx->aConstraint[i]; 10427 if( p->op==SQLITE_INDEX_CONSTRAINT_EQ ){ 10428 if( p->iColumn==colSchema ){ 10429 if( p->usable==0 ) return SQLITE_CONSTRAINT; 10430 iSchema = i; 10431 } 10432 if( p->iColumn==DBDATA_COLUMN_PGNO && p->usable ){ 10433 iPgno = i; 10434 } 10435 } 10436 } 10437 10438 if( iSchema>=0 ){ 10439 pIdx->aConstraintUsage[iSchema].argvIndex = 1; 10440 pIdx->aConstraintUsage[iSchema].omit = 1; 10441 } 10442 if( iPgno>=0 ){ 10443 pIdx->aConstraintUsage[iPgno].argvIndex = 1 + (iSchema>=0); 10444 pIdx->aConstraintUsage[iPgno].omit = 1; 10445 pIdx->estimatedCost = 100; 10446 pIdx->estimatedRows = 50; 10447 10448 if( pTab->bPtr==0 && pIdx->nOrderBy && pIdx->aOrderBy[0].desc==0 ){ 10449 int iCol = pIdx->aOrderBy[0].iColumn; 10450 if( pIdx->nOrderBy==1 ){ 10451 pIdx->orderByConsumed = (iCol==0 || iCol==1); 10452 }else if( pIdx->nOrderBy==2 && pIdx->aOrderBy[1].desc==0 && iCol==0 ){ 10453 pIdx->orderByConsumed = (pIdx->aOrderBy[1].iColumn==1); 10454 } 10455 } 10456 10457 }else{ 10458 pIdx->estimatedCost = 100000000; 10459 pIdx->estimatedRows = 1000000000; 10460 } 10461 pIdx->idxNum = (iSchema>=0 ? 0x01 : 0x00) | (iPgno>=0 ? 0x02 : 0x00); 10462 return SQLITE_OK; 10463 } 10464 10465 /* 10466 ** Open a new sqlite_dbdata or sqlite_dbptr cursor. 10467 */ 10468 static int dbdataOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){ 10469 DbdataCursor *pCsr; 10470 10471 pCsr = (DbdataCursor*)sqlite3_malloc64(sizeof(DbdataCursor)); 10472 if( pCsr==0 ){ 10473 return SQLITE_NOMEM; 10474 }else{ 10475 memset(pCsr, 0, sizeof(DbdataCursor)); 10476 pCsr->base.pVtab = pVTab; 10477 } 10478 10479 *ppCursor = (sqlite3_vtab_cursor *)pCsr; 10480 return SQLITE_OK; 10481 } 10482 10483 /* 10484 ** Restore a cursor object to the state it was in when first allocated 10485 ** by dbdataOpen(). 10486 */ 10487 static void dbdataResetCursor(DbdataCursor *pCsr){ 10488 DbdataTable *pTab = (DbdataTable*)(pCsr->base.pVtab); 10489 if( pTab->pStmt==0 ){ 10490 pTab->pStmt = pCsr->pStmt; 10491 }else{ 10492 sqlite3_finalize(pCsr->pStmt); 10493 } 10494 pCsr->pStmt = 0; 10495 pCsr->iPgno = 1; 10496 pCsr->iCell = 0; 10497 pCsr->iField = 0; 10498 pCsr->bOnePage = 0; 10499 sqlite3_free(pCsr->aPage); 10500 sqlite3_free(pCsr->pRec); 10501 pCsr->pRec = 0; 10502 pCsr->aPage = 0; 10503 } 10504 10505 /* 10506 ** Close an sqlite_dbdata or sqlite_dbptr cursor. 10507 */ 10508 static int dbdataClose(sqlite3_vtab_cursor *pCursor){ 10509 DbdataCursor *pCsr = (DbdataCursor*)pCursor; 10510 dbdataResetCursor(pCsr); 10511 sqlite3_free(pCsr); 10512 return SQLITE_OK; 10513 } 10514 10515 /* 10516 ** Utility methods to decode 16 and 32-bit big-endian unsigned integers. 10517 */ 10518 static unsigned int get_uint16(unsigned char *a){ 10519 return (a[0]<<8)|a[1]; 10520 } 10521 static unsigned int get_uint32(unsigned char *a){ 10522 return ((unsigned int)a[0]<<24) 10523 | ((unsigned int)a[1]<<16) 10524 | ((unsigned int)a[2]<<8) 10525 | ((unsigned int)a[3]); 10526 } 10527 10528 /* 10529 ** Load page pgno from the database via the sqlite_dbpage virtual table. 10530 ** If successful, set (*ppPage) to point to a buffer containing the page 10531 ** data, (*pnPage) to the size of that buffer in bytes and return 10532 ** SQLITE_OK. In this case it is the responsibility of the caller to 10533 ** eventually free the buffer using sqlite3_free(). 10534 ** 10535 ** Or, if an error occurs, set both (*ppPage) and (*pnPage) to 0 and 10536 ** return an SQLite error code. 10537 */ 10538 static int dbdataLoadPage( 10539 DbdataCursor *pCsr, /* Cursor object */ 10540 unsigned int pgno, /* Page number of page to load */ 10541 u8 **ppPage, /* OUT: pointer to page buffer */ 10542 int *pnPage /* OUT: Size of (*ppPage) in bytes */ 10543 ){ 10544 int rc2; 10545 int rc = SQLITE_OK; 10546 sqlite3_stmt *pStmt = pCsr->pStmt; 10547 10548 *ppPage = 0; 10549 *pnPage = 0; 10550 sqlite3_bind_int64(pStmt, 2, pgno); 10551 if( SQLITE_ROW==sqlite3_step(pStmt) ){ 10552 int nCopy = sqlite3_column_bytes(pStmt, 0); 10553 if( nCopy>0 ){ 10554 u8 *pPage; 10555 pPage = (u8*)sqlite3_malloc64(nCopy + DBDATA_PADDING_BYTES); 10556 if( pPage==0 ){ 10557 rc = SQLITE_NOMEM; 10558 }else{ 10559 const u8 *pCopy = sqlite3_column_blob(pStmt, 0); 10560 memcpy(pPage, pCopy, nCopy); 10561 memset(&pPage[nCopy], 0, DBDATA_PADDING_BYTES); 10562 } 10563 *ppPage = pPage; 10564 *pnPage = nCopy; 10565 } 10566 } 10567 rc2 = sqlite3_reset(pStmt); 10568 if( rc==SQLITE_OK ) rc = rc2; 10569 10570 return rc; 10571 } 10572 10573 /* 10574 ** Read a varint. Put the value in *pVal and return the number of bytes. 10575 */ 10576 static int dbdataGetVarint(const u8 *z, sqlite3_int64 *pVal){ 10577 sqlite3_int64 v = 0; 10578 int i; 10579 for(i=0; i<8; i++){ 10580 v = (v<<7) + (z[i]&0x7f); 10581 if( (z[i]&0x80)==0 ){ *pVal = v; return i+1; } 10582 } 10583 v = (v<<8) + (z[i]&0xff); 10584 *pVal = v; 10585 return 9; 10586 } 10587 10588 /* 10589 ** Return the number of bytes of space used by an SQLite value of type 10590 ** eType. 10591 */ 10592 static int dbdataValueBytes(int eType){ 10593 switch( eType ){ 10594 case 0: case 8: case 9: 10595 case 10: case 11: 10596 return 0; 10597 case 1: 10598 return 1; 10599 case 2: 10600 return 2; 10601 case 3: 10602 return 3; 10603 case 4: 10604 return 4; 10605 case 5: 10606 return 6; 10607 case 6: 10608 case 7: 10609 return 8; 10610 default: 10611 if( eType>0 ){ 10612 return ((eType-12) / 2); 10613 } 10614 return 0; 10615 } 10616 } 10617 10618 /* 10619 ** Load a value of type eType from buffer pData and use it to set the 10620 ** result of context object pCtx. 10621 */ 10622 static void dbdataValue( 10623 sqlite3_context *pCtx, 10624 int eType, 10625 u8 *pData, 10626 int nData 10627 ){ 10628 if( eType>=0 && dbdataValueBytes(eType)<=nData ){ 10629 switch( eType ){ 10630 case 0: 10631 case 10: 10632 case 11: 10633 sqlite3_result_null(pCtx); 10634 break; 10635 10636 case 8: 10637 sqlite3_result_int(pCtx, 0); 10638 break; 10639 case 9: 10640 sqlite3_result_int(pCtx, 1); 10641 break; 10642 10643 case 1: case 2: case 3: case 4: case 5: case 6: case 7: { 10644 sqlite3_uint64 v = (signed char)pData[0]; 10645 pData++; 10646 switch( eType ){ 10647 case 7: 10648 case 6: v = (v<<16) + (pData[0]<<8) + pData[1]; pData += 2; 10649 case 5: v = (v<<16) + (pData[0]<<8) + pData[1]; pData += 2; 10650 case 4: v = (v<<8) + pData[0]; pData++; 10651 case 3: v = (v<<8) + pData[0]; pData++; 10652 case 2: v = (v<<8) + pData[0]; pData++; 10653 } 10654 10655 if( eType==7 ){ 10656 double r; 10657 memcpy(&r, &v, sizeof(r)); 10658 sqlite3_result_double(pCtx, r); 10659 }else{ 10660 sqlite3_result_int64(pCtx, (sqlite3_int64)v); 10661 } 10662 break; 10663 } 10664 10665 default: { 10666 int n = ((eType-12) / 2); 10667 if( eType % 2 ){ 10668 sqlite3_result_text(pCtx, (const char*)pData, n, SQLITE_TRANSIENT); 10669 }else{ 10670 sqlite3_result_blob(pCtx, pData, n, SQLITE_TRANSIENT); 10671 } 10672 } 10673 } 10674 } 10675 } 10676 10677 /* 10678 ** Move an sqlite_dbdata or sqlite_dbptr cursor to the next entry. 10679 */ 10680 static int dbdataNext(sqlite3_vtab_cursor *pCursor){ 10681 DbdataCursor *pCsr = (DbdataCursor*)pCursor; 10682 DbdataTable *pTab = (DbdataTable*)pCursor->pVtab; 10683 10684 pCsr->iRowid++; 10685 while( 1 ){ 10686 int rc; 10687 int iOff = (pCsr->iPgno==1 ? 100 : 0); 10688 int bNextPage = 0; 10689 10690 if( pCsr->aPage==0 ){ 10691 while( 1 ){ 10692 if( pCsr->bOnePage==0 && pCsr->iPgno>pCsr->szDb ) return SQLITE_OK; 10693 rc = dbdataLoadPage(pCsr, pCsr->iPgno, &pCsr->aPage, &pCsr->nPage); 10694 if( rc!=SQLITE_OK ) return rc; 10695 if( pCsr->aPage ) break; 10696 pCsr->iPgno++; 10697 } 10698 pCsr->iCell = pTab->bPtr ? -2 : 0; 10699 pCsr->nCell = get_uint16(&pCsr->aPage[iOff+3]); 10700 } 10701 10702 if( pTab->bPtr ){ 10703 if( pCsr->aPage[iOff]!=0x02 && pCsr->aPage[iOff]!=0x05 ){ 10704 pCsr->iCell = pCsr->nCell; 10705 } 10706 pCsr->iCell++; 10707 if( pCsr->iCell>=pCsr->nCell ){ 10708 sqlite3_free(pCsr->aPage); 10709 pCsr->aPage = 0; 10710 if( pCsr->bOnePage ) return SQLITE_OK; 10711 pCsr->iPgno++; 10712 }else{ 10713 return SQLITE_OK; 10714 } 10715 }else{ 10716 /* If there is no record loaded, load it now. */ 10717 if( pCsr->pRec==0 ){ 10718 int bHasRowid = 0; 10719 int nPointer = 0; 10720 sqlite3_int64 nPayload = 0; 10721 sqlite3_int64 nHdr = 0; 10722 int iHdr; 10723 int U, X; 10724 int nLocal; 10725 10726 switch( pCsr->aPage[iOff] ){ 10727 case 0x02: 10728 nPointer = 4; 10729 break; 10730 case 0x0a: 10731 break; 10732 case 0x0d: 10733 bHasRowid = 1; 10734 break; 10735 default: 10736 /* This is not a b-tree page with records on it. Continue. */ 10737 pCsr->iCell = pCsr->nCell; 10738 break; 10739 } 10740 10741 if( pCsr->iCell>=pCsr->nCell ){ 10742 bNextPage = 1; 10743 }else{ 10744 10745 iOff += 8 + nPointer + pCsr->iCell*2; 10746 if( iOff>pCsr->nPage ){ 10747 bNextPage = 1; 10748 }else{ 10749 iOff = get_uint16(&pCsr->aPage[iOff]); 10750 } 10751 10752 /* For an interior node cell, skip past the child-page number */ 10753 iOff += nPointer; 10754 10755 /* Load the "byte of payload including overflow" field */ 10756 if( bNextPage || iOff>pCsr->nPage ){ 10757 bNextPage = 1; 10758 }else{ 10759 iOff += dbdataGetVarint(&pCsr->aPage[iOff], &nPayload); 10760 } 10761 10762 /* If this is a leaf intkey cell, load the rowid */ 10763 if( bHasRowid && !bNextPage && iOff<pCsr->nPage ){ 10764 iOff += dbdataGetVarint(&pCsr->aPage[iOff], &pCsr->iIntkey); 10765 } 10766 10767 /* Figure out how much data to read from the local page */ 10768 U = pCsr->nPage; 10769 if( bHasRowid ){ 10770 X = U-35; 10771 }else{ 10772 X = ((U-12)*64/255)-23; 10773 } 10774 if( nPayload<=X ){ 10775 nLocal = nPayload; 10776 }else{ 10777 int M, K; 10778 M = ((U-12)*32/255)-23; 10779 K = M+((nPayload-M)%(U-4)); 10780 if( K<=X ){ 10781 nLocal = K; 10782 }else{ 10783 nLocal = M; 10784 } 10785 } 10786 10787 if( bNextPage || nLocal+iOff>pCsr->nPage ){ 10788 bNextPage = 1; 10789 }else{ 10790 10791 /* Allocate space for payload. And a bit more to catch small buffer 10792 ** overruns caused by attempting to read a varint or similar from 10793 ** near the end of a corrupt record. */ 10794 pCsr->pRec = (u8*)sqlite3_malloc64(nPayload+DBDATA_PADDING_BYTES); 10795 if( pCsr->pRec==0 ) return SQLITE_NOMEM; 10796 memset(pCsr->pRec, 0, nPayload+DBDATA_PADDING_BYTES); 10797 pCsr->nRec = nPayload; 10798 10799 /* Load the nLocal bytes of payload */ 10800 memcpy(pCsr->pRec, &pCsr->aPage[iOff], nLocal); 10801 iOff += nLocal; 10802 10803 /* Load content from overflow pages */ 10804 if( nPayload>nLocal ){ 10805 sqlite3_int64 nRem = nPayload - nLocal; 10806 unsigned int pgnoOvfl = get_uint32(&pCsr->aPage[iOff]); 10807 while( nRem>0 ){ 10808 u8 *aOvfl = 0; 10809 int nOvfl = 0; 10810 int nCopy; 10811 rc = dbdataLoadPage(pCsr, pgnoOvfl, &aOvfl, &nOvfl); 10812 assert( rc!=SQLITE_OK || aOvfl==0 || nOvfl==pCsr->nPage ); 10813 if( rc!=SQLITE_OK ) return rc; 10814 if( aOvfl==0 ) break; 10815 10816 nCopy = U-4; 10817 if( nCopy>nRem ) nCopy = nRem; 10818 memcpy(&pCsr->pRec[nPayload-nRem], &aOvfl[4], nCopy); 10819 nRem -= nCopy; 10820 10821 pgnoOvfl = get_uint32(aOvfl); 10822 sqlite3_free(aOvfl); 10823 } 10824 } 10825 10826 iHdr = dbdataGetVarint(pCsr->pRec, &nHdr); 10827 pCsr->nHdr = nHdr; 10828 pCsr->pHdrPtr = &pCsr->pRec[iHdr]; 10829 pCsr->pPtr = &pCsr->pRec[pCsr->nHdr]; 10830 pCsr->iField = (bHasRowid ? -1 : 0); 10831 } 10832 } 10833 }else{ 10834 pCsr->iField++; 10835 if( pCsr->iField>0 ){ 10836 sqlite3_int64 iType; 10837 if( pCsr->pHdrPtr>&pCsr->pRec[pCsr->nRec] ){ 10838 bNextPage = 1; 10839 }else{ 10840 pCsr->pHdrPtr += dbdataGetVarint(pCsr->pHdrPtr, &iType); 10841 pCsr->pPtr += dbdataValueBytes(iType); 10842 } 10843 } 10844 } 10845 10846 if( bNextPage ){ 10847 sqlite3_free(pCsr->aPage); 10848 sqlite3_free(pCsr->pRec); 10849 pCsr->aPage = 0; 10850 pCsr->pRec = 0; 10851 if( pCsr->bOnePage ) return SQLITE_OK; 10852 pCsr->iPgno++; 10853 }else{ 10854 if( pCsr->iField<0 || pCsr->pHdrPtr<&pCsr->pRec[pCsr->nHdr] ){ 10855 return SQLITE_OK; 10856 } 10857 10858 /* Advance to the next cell. The next iteration of the loop will load 10859 ** the record and so on. */ 10860 sqlite3_free(pCsr->pRec); 10861 pCsr->pRec = 0; 10862 pCsr->iCell++; 10863 } 10864 } 10865 } 10866 10867 assert( !"can't get here" ); 10868 return SQLITE_OK; 10869 } 10870 10871 /* 10872 ** Return true if the cursor is at EOF. 10873 */ 10874 static int dbdataEof(sqlite3_vtab_cursor *pCursor){ 10875 DbdataCursor *pCsr = (DbdataCursor*)pCursor; 10876 return pCsr->aPage==0; 10877 } 10878 10879 /* 10880 ** Determine the size in pages of database zSchema (where zSchema is 10881 ** "main", "temp" or the name of an attached database) and set 10882 ** pCsr->szDb accordingly. If successful, return SQLITE_OK. Otherwise, 10883 ** an SQLite error code. 10884 */ 10885 static int dbdataDbsize(DbdataCursor *pCsr, const char *zSchema){ 10886 DbdataTable *pTab = (DbdataTable*)pCsr->base.pVtab; 10887 char *zSql = 0; 10888 int rc, rc2; 10889 sqlite3_stmt *pStmt = 0; 10890 10891 zSql = sqlite3_mprintf("PRAGMA %Q.page_count", zSchema); 10892 if( zSql==0 ) return SQLITE_NOMEM; 10893 rc = sqlite3_prepare_v2(pTab->db, zSql, -1, &pStmt, 0); 10894 sqlite3_free(zSql); 10895 if( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){ 10896 pCsr->szDb = sqlite3_column_int(pStmt, 0); 10897 } 10898 rc2 = sqlite3_finalize(pStmt); 10899 if( rc==SQLITE_OK ) rc = rc2; 10900 return rc; 10901 } 10902 10903 /* 10904 ** xFilter method for sqlite_dbdata and sqlite_dbptr. 10905 */ 10906 static int dbdataFilter( 10907 sqlite3_vtab_cursor *pCursor, 10908 int idxNum, const char *idxStr, 10909 int argc, sqlite3_value **argv 10910 ){ 10911 DbdataCursor *pCsr = (DbdataCursor*)pCursor; 10912 DbdataTable *pTab = (DbdataTable*)pCursor->pVtab; 10913 int rc = SQLITE_OK; 10914 const char *zSchema = "main"; 10915 10916 dbdataResetCursor(pCsr); 10917 assert( pCsr->iPgno==1 ); 10918 if( idxNum & 0x01 ){ 10919 zSchema = (const char*)sqlite3_value_text(argv[0]); 10920 } 10921 if( idxNum & 0x02 ){ 10922 pCsr->iPgno = sqlite3_value_int(argv[(idxNum & 0x01)]); 10923 pCsr->bOnePage = 1; 10924 }else{ 10925 pCsr->nPage = dbdataDbsize(pCsr, zSchema); 10926 rc = dbdataDbsize(pCsr, zSchema); 10927 } 10928 10929 if( rc==SQLITE_OK ){ 10930 if( pTab->pStmt ){ 10931 pCsr->pStmt = pTab->pStmt; 10932 pTab->pStmt = 0; 10933 }else{ 10934 rc = sqlite3_prepare_v2(pTab->db, 10935 "SELECT data FROM sqlite_dbpage(?) WHERE pgno=?", -1, 10936 &pCsr->pStmt, 0 10937 ); 10938 } 10939 } 10940 if( rc==SQLITE_OK ){ 10941 rc = sqlite3_bind_text(pCsr->pStmt, 1, zSchema, -1, SQLITE_TRANSIENT); 10942 }else{ 10943 pTab->base.zErrMsg = sqlite3_mprintf("%s", sqlite3_errmsg(pTab->db)); 10944 } 10945 if( rc==SQLITE_OK ){ 10946 rc = dbdataNext(pCursor); 10947 } 10948 return rc; 10949 } 10950 10951 /* 10952 ** Return a column for the sqlite_dbdata or sqlite_dbptr table. 10953 */ 10954 static int dbdataColumn( 10955 sqlite3_vtab_cursor *pCursor, 10956 sqlite3_context *ctx, 10957 int i 10958 ){ 10959 DbdataCursor *pCsr = (DbdataCursor*)pCursor; 10960 DbdataTable *pTab = (DbdataTable*)pCursor->pVtab; 10961 if( pTab->bPtr ){ 10962 switch( i ){ 10963 case DBPTR_COLUMN_PGNO: 10964 sqlite3_result_int64(ctx, pCsr->iPgno); 10965 break; 10966 case DBPTR_COLUMN_CHILD: { 10967 int iOff = pCsr->iPgno==1 ? 100 : 0; 10968 if( pCsr->iCell<0 ){ 10969 iOff += 8; 10970 }else{ 10971 iOff += 12 + pCsr->iCell*2; 10972 if( iOff>pCsr->nPage ) return SQLITE_OK; 10973 iOff = get_uint16(&pCsr->aPage[iOff]); 10974 } 10975 if( iOff<=pCsr->nPage ){ 10976 sqlite3_result_int64(ctx, get_uint32(&pCsr->aPage[iOff])); 10977 } 10978 break; 10979 } 10980 } 10981 }else{ 10982 switch( i ){ 10983 case DBDATA_COLUMN_PGNO: 10984 sqlite3_result_int64(ctx, pCsr->iPgno); 10985 break; 10986 case DBDATA_COLUMN_CELL: 10987 sqlite3_result_int(ctx, pCsr->iCell); 10988 break; 10989 case DBDATA_COLUMN_FIELD: 10990 sqlite3_result_int(ctx, pCsr->iField); 10991 break; 10992 case DBDATA_COLUMN_VALUE: { 10993 if( pCsr->iField<0 ){ 10994 sqlite3_result_int64(ctx, pCsr->iIntkey); 10995 }else{ 10996 sqlite3_int64 iType; 10997 dbdataGetVarint(pCsr->pHdrPtr, &iType); 10998 dbdataValue( 10999 ctx, iType, pCsr->pPtr, &pCsr->pRec[pCsr->nRec] - pCsr->pPtr 11000 ); 11001 } 11002 break; 11003 } 11004 } 11005 } 11006 return SQLITE_OK; 11007 } 11008 11009 /* 11010 ** Return the rowid for an sqlite_dbdata or sqlite_dptr table. 11011 */ 11012 static int dbdataRowid(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){ 11013 DbdataCursor *pCsr = (DbdataCursor*)pCursor; 11014 *pRowid = pCsr->iRowid; 11015 return SQLITE_OK; 11016 } 11017 11018 11019 /* 11020 ** Invoke this routine to register the "sqlite_dbdata" virtual table module 11021 */ 11022 static int sqlite3DbdataRegister(sqlite3 *db){ 11023 static sqlite3_module dbdata_module = { 11024 0, /* iVersion */ 11025 0, /* xCreate */ 11026 dbdataConnect, /* xConnect */ 11027 dbdataBestIndex, /* xBestIndex */ 11028 dbdataDisconnect, /* xDisconnect */ 11029 0, /* xDestroy */ 11030 dbdataOpen, /* xOpen - open a cursor */ 11031 dbdataClose, /* xClose - close a cursor */ 11032 dbdataFilter, /* xFilter - configure scan constraints */ 11033 dbdataNext, /* xNext - advance a cursor */ 11034 dbdataEof, /* xEof - check for end of scan */ 11035 dbdataColumn, /* xColumn - read data */ 11036 dbdataRowid, /* xRowid - read data */ 11037 0, /* xUpdate */ 11038 0, /* xBegin */ 11039 0, /* xSync */ 11040 0, /* xCommit */ 11041 0, /* xRollback */ 11042 0, /* xFindMethod */ 11043 0, /* xRename */ 11044 0, /* xSavepoint */ 11045 0, /* xRelease */ 11046 0, /* xRollbackTo */ 11047 0 /* xShadowName */ 11048 }; 11049 11050 int rc = sqlite3_create_module(db, "sqlite_dbdata", &dbdata_module, 0); 11051 if( rc==SQLITE_OK ){ 11052 rc = sqlite3_create_module(db, "sqlite_dbptr", &dbdata_module, (void*)1); 11053 } 11054 return rc; 11055 } 11056 11057 #ifdef _WIN32 11058 11059 #endif 11060 int sqlite3_dbdata_init( 11061 sqlite3 *db, 11062 char **pzErrMsg, 11063 const sqlite3_api_routines *pApi 11064 ){ 11065 SQLITE_EXTENSION_INIT2(pApi); 11066 return sqlite3DbdataRegister(db); 11067 } 11068 11069 /************************* End ../ext/misc/dbdata.c ********************/ 11070 #endif 11071 11072 #if defined(SQLITE_ENABLE_SESSION) 11073 /* 11074 ** State information for a single open session 11075 */ 11076 typedef struct OpenSession OpenSession; 11077 struct OpenSession { 11078 char *zName; /* Symbolic name for this session */ 11079 int nFilter; /* Number of xFilter rejection GLOB patterns */ 11080 char **azFilter; /* Array of xFilter rejection GLOB patterns */ 11081 sqlite3_session *p; /* The open session */ 11082 }; 11083 #endif 11084 11085 typedef struct ExpertInfo ExpertInfo; 11086 struct ExpertInfo { 11087 sqlite3expert *pExpert; 11088 int bVerbose; 11089 }; 11090 11091 /* A single line in the EQP output */ 11092 typedef struct EQPGraphRow EQPGraphRow; 11093 struct EQPGraphRow { 11094 int iEqpId; /* ID for this row */ 11095 int iParentId; /* ID of the parent row */ 11096 EQPGraphRow *pNext; /* Next row in sequence */ 11097 char zText[1]; /* Text to display for this row */ 11098 }; 11099 11100 /* All EQP output is collected into an instance of the following */ 11101 typedef struct EQPGraph EQPGraph; 11102 struct EQPGraph { 11103 EQPGraphRow *pRow; /* Linked list of all rows of the EQP output */ 11104 EQPGraphRow *pLast; /* Last element of the pRow list */ 11105 char zPrefix[100]; /* Graph prefix */ 11106 }; 11107 11108 /* 11109 ** State information about the database connection is contained in an 11110 ** instance of the following structure. 11111 */ 11112 typedef struct ShellState ShellState; 11113 struct ShellState { 11114 sqlite3 *db; /* The database */ 11115 u8 autoExplain; /* Automatically turn on .explain mode */ 11116 u8 autoEQP; /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */ 11117 u8 autoEQPtest; /* autoEQP is in test mode */ 11118 u8 autoEQPtrace; /* autoEQP is in trace mode */ 11119 u8 statsOn; /* True to display memory stats before each finalize */ 11120 u8 scanstatsOn; /* True to display scan stats before each finalize */ 11121 u8 openMode; /* SHELL_OPEN_NORMAL, _APPENDVFS, or _ZIPFILE */ 11122 u8 doXdgOpen; /* Invoke start/open/xdg-open in output_reset() */ 11123 u8 nEqpLevel; /* Depth of the EQP output graph */ 11124 u8 eTraceType; /* SHELL_TRACE_* value for type of trace */ 11125 unsigned mEqpLines; /* Mask of veritical lines in the EQP output graph */ 11126 int outCount; /* Revert to stdout when reaching zero */ 11127 int cnt; /* Number of records displayed so far */ 11128 int lineno; /* Line number of last line read from in */ 11129 int openFlags; /* Additional flags to open. (SQLITE_OPEN_NOFOLLOW) */ 11130 FILE *in; /* Read commands from this stream */ 11131 FILE *out; /* Write results here */ 11132 FILE *traceOut; /* Output for sqlite3_trace() */ 11133 int nErr; /* Number of errors seen */ 11134 int mode; /* An output mode setting */ 11135 int modePrior; /* Saved mode */ 11136 int cMode; /* temporary output mode for the current query */ 11137 int normalMode; /* Output mode before ".explain on" */ 11138 int writableSchema; /* True if PRAGMA writable_schema=ON */ 11139 int showHeader; /* True to show column names in List or Column mode */ 11140 int nCheck; /* Number of ".check" commands run */ 11141 unsigned nProgress; /* Number of progress callbacks encountered */ 11142 unsigned mxProgress; /* Maximum progress callbacks before failing */ 11143 unsigned flgProgress; /* Flags for the progress callback */ 11144 unsigned shellFlgs; /* Various flags */ 11145 unsigned priorShFlgs; /* Saved copy of flags */ 11146 sqlite3_int64 szMax; /* --maxsize argument to .open */ 11147 char *zDestTable; /* Name of destination table when MODE_Insert */ 11148 char *zTempFile; /* Temporary file that might need deleting */ 11149 char zTestcase[30]; /* Name of current test case */ 11150 char colSeparator[20]; /* Column separator character for several modes */ 11151 char rowSeparator[20]; /* Row separator character for MODE_Ascii */ 11152 char colSepPrior[20]; /* Saved column separator */ 11153 char rowSepPrior[20]; /* Saved row separator */ 11154 int *colWidth; /* Requested width of each column in columnar modes */ 11155 int *actualWidth; /* Actual width of each column */ 11156 int nWidth; /* Number of slots in colWidth[] and actualWidth[] */ 11157 char nullValue[20]; /* The text to print when a NULL comes back from 11158 ** the database */ 11159 char outfile[FILENAME_MAX]; /* Filename for *out */ 11160 const char *zDbFilename; /* name of the database file */ 11161 char *zFreeOnClose; /* Filename to free when closing */ 11162 const char *zVfs; /* Name of VFS to use */ 11163 sqlite3_stmt *pStmt; /* Current statement if any. */ 11164 FILE *pLog; /* Write log output here */ 11165 int *aiIndent; /* Array of indents used in MODE_Explain */ 11166 int nIndent; /* Size of array aiIndent[] */ 11167 int iIndent; /* Index of current op in aiIndent[] */ 11168 EQPGraph sGraph; /* Information for the graphical EXPLAIN QUERY PLAN */ 11169 #if defined(SQLITE_ENABLE_SESSION) 11170 int nSession; /* Number of active sessions */ 11171 OpenSession aSession[4]; /* Array of sessions. [0] is in focus. */ 11172 #endif 11173 ExpertInfo expert; /* Valid if previous command was ".expert OPT..." */ 11174 }; 11175 11176 11177 /* Allowed values for ShellState.autoEQP 11178 */ 11179 #define AUTOEQP_off 0 /* Automatic EXPLAIN QUERY PLAN is off */ 11180 #define AUTOEQP_on 1 /* Automatic EQP is on */ 11181 #define AUTOEQP_trigger 2 /* On and also show plans for triggers */ 11182 #define AUTOEQP_full 3 /* Show full EXPLAIN */ 11183 11184 /* Allowed values for ShellState.openMode 11185 */ 11186 #define SHELL_OPEN_UNSPEC 0 /* No open-mode specified */ 11187 #define SHELL_OPEN_NORMAL 1 /* Normal database file */ 11188 #define SHELL_OPEN_APPENDVFS 2 /* Use appendvfs */ 11189 #define SHELL_OPEN_ZIPFILE 3 /* Use the zipfile virtual table */ 11190 #define SHELL_OPEN_READONLY 4 /* Open a normal database read-only */ 11191 #define SHELL_OPEN_DESERIALIZE 5 /* Open using sqlite3_deserialize() */ 11192 #define SHELL_OPEN_HEXDB 6 /* Use "dbtotxt" output as data source */ 11193 11194 /* Allowed values for ShellState.eTraceType 11195 */ 11196 #define SHELL_TRACE_PLAIN 0 /* Show input SQL text */ 11197 #define SHELL_TRACE_EXPANDED 1 /* Show expanded SQL text */ 11198 #define SHELL_TRACE_NORMALIZED 2 /* Show normalized SQL text */ 11199 11200 /* Bits in the ShellState.flgProgress variable */ 11201 #define SHELL_PROGRESS_QUIET 0x01 /* Omit announcing every progress callback */ 11202 #define SHELL_PROGRESS_RESET 0x02 /* Reset the count when the progres 11203 ** callback limit is reached, and for each 11204 ** top-level SQL statement */ 11205 #define SHELL_PROGRESS_ONCE 0x04 /* Cancel the --limit after firing once */ 11206 11207 /* 11208 ** These are the allowed shellFlgs values 11209 */ 11210 #define SHFLG_Pagecache 0x00000001 /* The --pagecache option is used */ 11211 #define SHFLG_Lookaside 0x00000002 /* Lookaside memory is used */ 11212 #define SHFLG_Backslash 0x00000004 /* The --backslash option is used */ 11213 #define SHFLG_PreserveRowid 0x00000008 /* .dump preserves rowid values */ 11214 #define SHFLG_Newlines 0x00000010 /* .dump --newline flag */ 11215 #define SHFLG_CountChanges 0x00000020 /* .changes setting */ 11216 #define SHFLG_Echo 0x00000040 /* .echo or --echo setting */ 11217 #define SHFLG_HeaderSet 0x00000080 /* .header has been used */ 11218 #define SHFLG_DumpDataOnly 0x00000100 /* .dump show data only */ 11219 #define SHFLG_DumpNoSys 0x00000200 /* .dump omits system tables */ 11220 11221 /* 11222 ** Macros for testing and setting shellFlgs 11223 */ 11224 #define ShellHasFlag(P,X) (((P)->shellFlgs & (X))!=0) 11225 #define ShellSetFlag(P,X) ((P)->shellFlgs|=(X)) 11226 #define ShellClearFlag(P,X) ((P)->shellFlgs&=(~(X))) 11227 11228 /* 11229 ** These are the allowed modes. 11230 */ 11231 #define MODE_Line 0 /* One column per line. Blank line between records */ 11232 #define MODE_Column 1 /* One record per line in neat columns */ 11233 #define MODE_List 2 /* One record per line with a separator */ 11234 #define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */ 11235 #define MODE_Html 4 /* Generate an XHTML table */ 11236 #define MODE_Insert 5 /* Generate SQL "insert" statements */ 11237 #define MODE_Quote 6 /* Quote values as for SQL */ 11238 #define MODE_Tcl 7 /* Generate ANSI-C or TCL quoted elements */ 11239 #define MODE_Csv 8 /* Quote strings, numbers are plain */ 11240 #define MODE_Explain 9 /* Like MODE_Column, but do not truncate data */ 11241 #define MODE_Ascii 10 /* Use ASCII unit and record separators (0x1F/0x1E) */ 11242 #define MODE_Pretty 11 /* Pretty-print schemas */ 11243 #define MODE_EQP 12 /* Converts EXPLAIN QUERY PLAN output into a graph */ 11244 #define MODE_Json 13 /* Output JSON */ 11245 #define MODE_Markdown 14 /* Markdown formatting */ 11246 #define MODE_Table 15 /* MySQL-style table formatting */ 11247 #define MODE_Box 16 /* Unicode box-drawing characters */ 11248 11249 static const char *modeDescr[] = { 11250 "line", 11251 "column", 11252 "list", 11253 "semi", 11254 "html", 11255 "insert", 11256 "quote", 11257 "tcl", 11258 "csv", 11259 "explain", 11260 "ascii", 11261 "prettyprint", 11262 "eqp", 11263 "json", 11264 "markdown", 11265 "table", 11266 "box" 11267 }; 11268 11269 /* 11270 ** These are the column/row/line separators used by the various 11271 ** import/export modes. 11272 */ 11273 #define SEP_Column "|" 11274 #define SEP_Row "\n" 11275 #define SEP_Tab "\t" 11276 #define SEP_Space " " 11277 #define SEP_Comma "," 11278 #define SEP_CrLf "\r\n" 11279 #define SEP_Unit "\x1F" 11280 #define SEP_Record "\x1E" 11281 11282 /* 11283 ** A callback for the sqlite3_log() interface. 11284 */ 11285 static void shellLog(void *pArg, int iErrCode, const char *zMsg){ 11286 ShellState *p = (ShellState*)pArg; 11287 if( p->pLog==0 ) return; 11288 utf8_printf(p->pLog, "(%d) %s\n", iErrCode, zMsg); 11289 fflush(p->pLog); 11290 } 11291 11292 /* 11293 ** SQL function: shell_putsnl(X) 11294 ** 11295 ** Write the text X to the screen (or whatever output is being directed) 11296 ** adding a newline at the end, and then return X. 11297 */ 11298 static void shellPutsFunc( 11299 sqlite3_context *pCtx, 11300 int nVal, 11301 sqlite3_value **apVal 11302 ){ 11303 ShellState *p = (ShellState*)sqlite3_user_data(pCtx); 11304 (void)nVal; 11305 utf8_printf(p->out, "%s\n", sqlite3_value_text(apVal[0])); 11306 sqlite3_result_value(pCtx, apVal[0]); 11307 } 11308 11309 /* 11310 ** SQL function: edit(VALUE) 11311 ** edit(VALUE,EDITOR) 11312 ** 11313 ** These steps: 11314 ** 11315 ** (1) Write VALUE into a temporary file. 11316 ** (2) Run program EDITOR on that temporary file. 11317 ** (3) Read the temporary file back and return its content as the result. 11318 ** (4) Delete the temporary file 11319 ** 11320 ** If the EDITOR argument is omitted, use the value in the VISUAL 11321 ** environment variable. If still there is no EDITOR, through an error. 11322 ** 11323 ** Also throw an error if the EDITOR program returns a non-zero exit code. 11324 */ 11325 #ifndef SQLITE_NOHAVE_SYSTEM 11326 static void editFunc( 11327 sqlite3_context *context, 11328 int argc, 11329 sqlite3_value **argv 11330 ){ 11331 const char *zEditor; 11332 char *zTempFile = 0; 11333 sqlite3 *db; 11334 char *zCmd = 0; 11335 int bBin; 11336 int rc; 11337 int hasCRNL = 0; 11338 FILE *f = 0; 11339 sqlite3_int64 sz; 11340 sqlite3_int64 x; 11341 unsigned char *p = 0; 11342 11343 if( argc==2 ){ 11344 zEditor = (const char*)sqlite3_value_text(argv[1]); 11345 }else{ 11346 zEditor = getenv("VISUAL"); 11347 } 11348 if( zEditor==0 ){ 11349 sqlite3_result_error(context, "no editor for edit()", -1); 11350 return; 11351 } 11352 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){ 11353 sqlite3_result_error(context, "NULL input to edit()", -1); 11354 return; 11355 } 11356 db = sqlite3_context_db_handle(context); 11357 zTempFile = 0; 11358 sqlite3_file_control(db, 0, SQLITE_FCNTL_TEMPFILENAME, &zTempFile); 11359 if( zTempFile==0 ){ 11360 sqlite3_uint64 r = 0; 11361 sqlite3_randomness(sizeof(r), &r); 11362 zTempFile = sqlite3_mprintf("temp%llx", r); 11363 if( zTempFile==0 ){ 11364 sqlite3_result_error_nomem(context); 11365 return; 11366 } 11367 } 11368 bBin = sqlite3_value_type(argv[0])==SQLITE_BLOB; 11369 /* When writing the file to be edited, do \n to \r\n conversions on systems 11370 ** that want \r\n line endings */ 11371 f = fopen(zTempFile, bBin ? "wb" : "w"); 11372 if( f==0 ){ 11373 sqlite3_result_error(context, "edit() cannot open temp file", -1); 11374 goto edit_func_end; 11375 } 11376 sz = sqlite3_value_bytes(argv[0]); 11377 if( bBin ){ 11378 x = fwrite(sqlite3_value_blob(argv[0]), 1, (size_t)sz, f); 11379 }else{ 11380 const char *z = (const char*)sqlite3_value_text(argv[0]); 11381 /* Remember whether or not the value originally contained \r\n */ 11382 if( z && strstr(z,"\r\n")!=0 ) hasCRNL = 1; 11383 x = fwrite(sqlite3_value_text(argv[0]), 1, (size_t)sz, f); 11384 } 11385 fclose(f); 11386 f = 0; 11387 if( x!=sz ){ 11388 sqlite3_result_error(context, "edit() could not write the whole file", -1); 11389 goto edit_func_end; 11390 } 11391 zCmd = sqlite3_mprintf("%s \"%s\"", zEditor, zTempFile); 11392 if( zCmd==0 ){ 11393 sqlite3_result_error_nomem(context); 11394 goto edit_func_end; 11395 } 11396 rc = system(zCmd); 11397 sqlite3_free(zCmd); 11398 if( rc ){ 11399 sqlite3_result_error(context, "EDITOR returned non-zero", -1); 11400 goto edit_func_end; 11401 } 11402 f = fopen(zTempFile, "rb"); 11403 if( f==0 ){ 11404 sqlite3_result_error(context, 11405 "edit() cannot reopen temp file after edit", -1); 11406 goto edit_func_end; 11407 } 11408 fseek(f, 0, SEEK_END); 11409 sz = ftell(f); 11410 rewind(f); 11411 p = sqlite3_malloc64( sz+1 ); 11412 if( p==0 ){ 11413 sqlite3_result_error_nomem(context); 11414 goto edit_func_end; 11415 } 11416 x = fread(p, 1, (size_t)sz, f); 11417 fclose(f); 11418 f = 0; 11419 if( x!=sz ){ 11420 sqlite3_result_error(context, "could not read back the whole file", -1); 11421 goto edit_func_end; 11422 } 11423 if( bBin ){ 11424 sqlite3_result_blob64(context, p, sz, sqlite3_free); 11425 }else{ 11426 sqlite3_int64 i, j; 11427 if( hasCRNL ){ 11428 /* If the original contains \r\n then do no conversions back to \n */ 11429 j = sz; 11430 }else{ 11431 /* If the file did not originally contain \r\n then convert any new 11432 ** \r\n back into \n */ 11433 for(i=j=0; i<sz; i++){ 11434 if( p[i]=='\r' && p[i+1]=='\n' ) i++; 11435 p[j++] = p[i]; 11436 } 11437 sz = j; 11438 p[sz] = 0; 11439 } 11440 sqlite3_result_text64(context, (const char*)p, sz, 11441 sqlite3_free, SQLITE_UTF8); 11442 } 11443 p = 0; 11444 11445 edit_func_end: 11446 if( f ) fclose(f); 11447 unlink(zTempFile); 11448 sqlite3_free(zTempFile); 11449 sqlite3_free(p); 11450 } 11451 #endif /* SQLITE_NOHAVE_SYSTEM */ 11452 11453 /* 11454 ** Save or restore the current output mode 11455 */ 11456 static void outputModePush(ShellState *p){ 11457 p->modePrior = p->mode; 11458 p->priorShFlgs = p->shellFlgs; 11459 memcpy(p->colSepPrior, p->colSeparator, sizeof(p->colSeparator)); 11460 memcpy(p->rowSepPrior, p->rowSeparator, sizeof(p->rowSeparator)); 11461 } 11462 static void outputModePop(ShellState *p){ 11463 p->mode = p->modePrior; 11464 p->shellFlgs = p->priorShFlgs; 11465 memcpy(p->colSeparator, p->colSepPrior, sizeof(p->colSeparator)); 11466 memcpy(p->rowSeparator, p->rowSepPrior, sizeof(p->rowSeparator)); 11467 } 11468 11469 /* 11470 ** Output the given string as a hex-encoded blob (eg. X'1234' ) 11471 */ 11472 static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){ 11473 int i; 11474 char *zBlob = (char *)pBlob; 11475 raw_printf(out,"X'"); 11476 for(i=0; i<nBlob; i++){ raw_printf(out,"%02x",zBlob[i]&0xff); } 11477 raw_printf(out,"'"); 11478 } 11479 11480 /* 11481 ** Find a string that is not found anywhere in z[]. Return a pointer 11482 ** to that string. 11483 ** 11484 ** Try to use zA and zB first. If both of those are already found in z[] 11485 ** then make up some string and store it in the buffer zBuf. 11486 */ 11487 static const char *unused_string( 11488 const char *z, /* Result must not appear anywhere in z */ 11489 const char *zA, const char *zB, /* Try these first */ 11490 char *zBuf /* Space to store a generated string */ 11491 ){ 11492 unsigned i = 0; 11493 if( strstr(z, zA)==0 ) return zA; 11494 if( strstr(z, zB)==0 ) return zB; 11495 do{ 11496 sqlite3_snprintf(20,zBuf,"(%s%u)", zA, i++); 11497 }while( strstr(z,zBuf)!=0 ); 11498 return zBuf; 11499 } 11500 11501 /* 11502 ** Output the given string as a quoted string using SQL quoting conventions. 11503 ** 11504 ** See also: output_quoted_escaped_string() 11505 */ 11506 static void output_quoted_string(FILE *out, const char *z){ 11507 int i; 11508 char c; 11509 setBinaryMode(out, 1); 11510 for(i=0; (c = z[i])!=0 && c!='\''; i++){} 11511 if( c==0 ){ 11512 utf8_printf(out,"'%s'",z); 11513 }else{ 11514 raw_printf(out, "'"); 11515 while( *z ){ 11516 for(i=0; (c = z[i])!=0 && c!='\''; i++){} 11517 if( c=='\'' ) i++; 11518 if( i ){ 11519 utf8_printf(out, "%.*s", i, z); 11520 z += i; 11521 } 11522 if( c=='\'' ){ 11523 raw_printf(out, "'"); 11524 continue; 11525 } 11526 if( c==0 ){ 11527 break; 11528 } 11529 z++; 11530 } 11531 raw_printf(out, "'"); 11532 } 11533 setTextMode(out, 1); 11534 } 11535 11536 /* 11537 ** Output the given string as a quoted string using SQL quoting conventions. 11538 ** Additionallly , escape the "\n" and "\r" characters so that they do not 11539 ** get corrupted by end-of-line translation facilities in some operating 11540 ** systems. 11541 ** 11542 ** This is like output_quoted_string() but with the addition of the \r\n 11543 ** escape mechanism. 11544 */ 11545 static void output_quoted_escaped_string(FILE *out, const char *z){ 11546 int i; 11547 char c; 11548 setBinaryMode(out, 1); 11549 for(i=0; (c = z[i])!=0 && c!='\'' && c!='\n' && c!='\r'; i++){} 11550 if( c==0 ){ 11551 utf8_printf(out,"'%s'",z); 11552 }else{ 11553 const char *zNL = 0; 11554 const char *zCR = 0; 11555 int nNL = 0; 11556 int nCR = 0; 11557 char zBuf1[20], zBuf2[20]; 11558 for(i=0; z[i]; i++){ 11559 if( z[i]=='\n' ) nNL++; 11560 if( z[i]=='\r' ) nCR++; 11561 } 11562 if( nNL ){ 11563 raw_printf(out, "replace("); 11564 zNL = unused_string(z, "\\n", "\\012", zBuf1); 11565 } 11566 if( nCR ){ 11567 raw_printf(out, "replace("); 11568 zCR = unused_string(z, "\\r", "\\015", zBuf2); 11569 } 11570 raw_printf(out, "'"); 11571 while( *z ){ 11572 for(i=0; (c = z[i])!=0 && c!='\n' && c!='\r' && c!='\''; i++){} 11573 if( c=='\'' ) i++; 11574 if( i ){ 11575 utf8_printf(out, "%.*s", i, z); 11576 z += i; 11577 } 11578 if( c=='\'' ){ 11579 raw_printf(out, "'"); 11580 continue; 11581 } 11582 if( c==0 ){ 11583 break; 11584 } 11585 z++; 11586 if( c=='\n' ){ 11587 raw_printf(out, "%s", zNL); 11588 continue; 11589 } 11590 raw_printf(out, "%s", zCR); 11591 } 11592 raw_printf(out, "'"); 11593 if( nCR ){ 11594 raw_printf(out, ",'%s',char(13))", zCR); 11595 } 11596 if( nNL ){ 11597 raw_printf(out, ",'%s',char(10))", zNL); 11598 } 11599 } 11600 setTextMode(out, 1); 11601 } 11602 11603 /* 11604 ** Output the given string as a quoted according to C or TCL quoting rules. 11605 */ 11606 static void output_c_string(FILE *out, const char *z){ 11607 unsigned int c; 11608 fputc('"', out); 11609 while( (c = *(z++))!=0 ){ 11610 if( c=='\\' ){ 11611 fputc(c, out); 11612 fputc(c, out); 11613 }else if( c=='"' ){ 11614 fputc('\\', out); 11615 fputc('"', out); 11616 }else if( c=='\t' ){ 11617 fputc('\\', out); 11618 fputc('t', out); 11619 }else if( c=='\n' ){ 11620 fputc('\\', out); 11621 fputc('n', out); 11622 }else if( c=='\r' ){ 11623 fputc('\\', out); 11624 fputc('r', out); 11625 }else if( !isprint(c&0xff) ){ 11626 raw_printf(out, "\\%03o", c&0xff); 11627 }else{ 11628 fputc(c, out); 11629 } 11630 } 11631 fputc('"', out); 11632 } 11633 11634 /* 11635 ** Output the given string as a quoted according to JSON quoting rules. 11636 */ 11637 static void output_json_string(FILE *out, const char *z, int n){ 11638 unsigned int c; 11639 if( n<0 ) n = (int)strlen(z); 11640 fputc('"', out); 11641 while( n-- ){ 11642 c = *(z++); 11643 if( c=='\\' || c=='"' ){ 11644 fputc('\\', out); 11645 fputc(c, out); 11646 }else if( c<=0x1f ){ 11647 fputc('\\', out); 11648 if( c=='\b' ){ 11649 fputc('b', out); 11650 }else if( c=='\f' ){ 11651 fputc('f', out); 11652 }else if( c=='\n' ){ 11653 fputc('n', out); 11654 }else if( c=='\r' ){ 11655 fputc('r', out); 11656 }else if( c=='\t' ){ 11657 fputc('t', out); 11658 }else{ 11659 raw_printf(out, "u%04x",c); 11660 } 11661 }else{ 11662 fputc(c, out); 11663 } 11664 } 11665 fputc('"', out); 11666 } 11667 11668 /* 11669 ** Output the given string with characters that are special to 11670 ** HTML escaped. 11671 */ 11672 static void output_html_string(FILE *out, const char *z){ 11673 int i; 11674 if( z==0 ) z = ""; 11675 while( *z ){ 11676 for(i=0; z[i] 11677 && z[i]!='<' 11678 && z[i]!='&' 11679 && z[i]!='>' 11680 && z[i]!='\"' 11681 && z[i]!='\''; 11682 i++){} 11683 if( i>0 ){ 11684 utf8_printf(out,"%.*s",i,z); 11685 } 11686 if( z[i]=='<' ){ 11687 raw_printf(out,"<"); 11688 }else if( z[i]=='&' ){ 11689 raw_printf(out,"&"); 11690 }else if( z[i]=='>' ){ 11691 raw_printf(out,">"); 11692 }else if( z[i]=='\"' ){ 11693 raw_printf(out,"""); 11694 }else if( z[i]=='\'' ){ 11695 raw_printf(out,"'"); 11696 }else{ 11697 break; 11698 } 11699 z += i + 1; 11700 } 11701 } 11702 11703 /* 11704 ** If a field contains any character identified by a 1 in the following 11705 ** array, then the string must be quoted for CSV. 11706 */ 11707 static const char needCsvQuote[] = { 11708 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11709 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11710 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 11711 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11712 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11713 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11714 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11715 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 11716 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11717 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11718 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11719 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11720 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11721 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11722 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11723 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11724 }; 11725 11726 /* 11727 ** Output a single term of CSV. Actually, p->colSeparator is used for 11728 ** the separator, which may or may not be a comma. p->nullValue is 11729 ** the null value. Strings are quoted if necessary. The separator 11730 ** is only issued if bSep is true. 11731 */ 11732 static void output_csv(ShellState *p, const char *z, int bSep){ 11733 FILE *out = p->out; 11734 if( z==0 ){ 11735 utf8_printf(out,"%s",p->nullValue); 11736 }else{ 11737 int i; 11738 int nSep = strlen30(p->colSeparator); 11739 for(i=0; z[i]; i++){ 11740 if( needCsvQuote[((unsigned char*)z)[i]] 11741 || (z[i]==p->colSeparator[0] && 11742 (nSep==1 || memcmp(z, p->colSeparator, nSep)==0)) ){ 11743 i = 0; 11744 break; 11745 } 11746 } 11747 if( i==0 ){ 11748 char *zQuoted = sqlite3_mprintf("\"%w\"", z); 11749 utf8_printf(out, "%s", zQuoted); 11750 sqlite3_free(zQuoted); 11751 }else{ 11752 utf8_printf(out, "%s", z); 11753 } 11754 } 11755 if( bSep ){ 11756 utf8_printf(p->out, "%s", p->colSeparator); 11757 } 11758 } 11759 11760 /* 11761 ** This routine runs when the user presses Ctrl-C 11762 */ 11763 static void interrupt_handler(int NotUsed){ 11764 UNUSED_PARAMETER(NotUsed); 11765 seenInterrupt++; 11766 if( seenInterrupt>2 ) exit(1); 11767 if( globalDb ) sqlite3_interrupt(globalDb); 11768 } 11769 11770 #if (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE) 11771 /* 11772 ** This routine runs for console events (e.g. Ctrl-C) on Win32 11773 */ 11774 static BOOL WINAPI ConsoleCtrlHandler( 11775 DWORD dwCtrlType /* One of the CTRL_*_EVENT constants */ 11776 ){ 11777 if( dwCtrlType==CTRL_C_EVENT ){ 11778 interrupt_handler(0); 11779 return TRUE; 11780 } 11781 return FALSE; 11782 } 11783 #endif 11784 11785 #ifndef SQLITE_OMIT_AUTHORIZATION 11786 /* 11787 ** When the ".auth ON" is set, the following authorizer callback is 11788 ** invoked. It always returns SQLITE_OK. 11789 */ 11790 static int shellAuth( 11791 void *pClientData, 11792 int op, 11793 const char *zA1, 11794 const char *zA2, 11795 const char *zA3, 11796 const char *zA4 11797 ){ 11798 ShellState *p = (ShellState*)pClientData; 11799 static const char *azAction[] = { 0, 11800 "CREATE_INDEX", "CREATE_TABLE", "CREATE_TEMP_INDEX", 11801 "CREATE_TEMP_TABLE", "CREATE_TEMP_TRIGGER", "CREATE_TEMP_VIEW", 11802 "CREATE_TRIGGER", "CREATE_VIEW", "DELETE", 11803 "DROP_INDEX", "DROP_TABLE", "DROP_TEMP_INDEX", 11804 "DROP_TEMP_TABLE", "DROP_TEMP_TRIGGER", "DROP_TEMP_VIEW", 11805 "DROP_TRIGGER", "DROP_VIEW", "INSERT", 11806 "PRAGMA", "READ", "SELECT", 11807 "TRANSACTION", "UPDATE", "ATTACH", 11808 "DETACH", "ALTER_TABLE", "REINDEX", 11809 "ANALYZE", "CREATE_VTABLE", "DROP_VTABLE", 11810 "FUNCTION", "SAVEPOINT", "RECURSIVE" 11811 }; 11812 int i; 11813 const char *az[4]; 11814 az[0] = zA1; 11815 az[1] = zA2; 11816 az[2] = zA3; 11817 az[3] = zA4; 11818 utf8_printf(p->out, "authorizer: %s", azAction[op]); 11819 for(i=0; i<4; i++){ 11820 raw_printf(p->out, " "); 11821 if( az[i] ){ 11822 output_c_string(p->out, az[i]); 11823 }else{ 11824 raw_printf(p->out, "NULL"); 11825 } 11826 } 11827 raw_printf(p->out, "\n"); 11828 return SQLITE_OK; 11829 } 11830 #endif 11831 11832 /* 11833 ** Print a schema statement. Part of MODE_Semi and MODE_Pretty output. 11834 ** 11835 ** This routine converts some CREATE TABLE statements for shadow tables 11836 ** in FTS3/4/5 into CREATE TABLE IF NOT EXISTS statements. 11837 */ 11838 static void printSchemaLine(FILE *out, const char *z, const char *zTail){ 11839 if( z==0 ) return; 11840 if( zTail==0 ) return; 11841 if( sqlite3_strglob("CREATE TABLE ['\"]*", z)==0 ){ 11842 utf8_printf(out, "CREATE TABLE IF NOT EXISTS %s%s", z+13, zTail); 11843 }else{ 11844 utf8_printf(out, "%s%s", z, zTail); 11845 } 11846 } 11847 static void printSchemaLineN(FILE *out, char *z, int n, const char *zTail){ 11848 char c = z[n]; 11849 z[n] = 0; 11850 printSchemaLine(out, z, zTail); 11851 z[n] = c; 11852 } 11853 11854 /* 11855 ** Return true if string z[] has nothing but whitespace and comments to the 11856 ** end of the first line. 11857 */ 11858 static int wsToEol(const char *z){ 11859 int i; 11860 for(i=0; z[i]; i++){ 11861 if( z[i]=='\n' ) return 1; 11862 if( IsSpace(z[i]) ) continue; 11863 if( z[i]=='-' && z[i+1]=='-' ) return 1; 11864 return 0; 11865 } 11866 return 1; 11867 } 11868 11869 /* 11870 ** Add a new entry to the EXPLAIN QUERY PLAN data 11871 */ 11872 static void eqp_append(ShellState *p, int iEqpId, int p2, const char *zText){ 11873 EQPGraphRow *pNew; 11874 int nText = strlen30(zText); 11875 if( p->autoEQPtest ){ 11876 utf8_printf(p->out, "%d,%d,%s\n", iEqpId, p2, zText); 11877 } 11878 pNew = sqlite3_malloc64( sizeof(*pNew) + nText ); 11879 if( pNew==0 ) shell_out_of_memory(); 11880 pNew->iEqpId = iEqpId; 11881 pNew->iParentId = p2; 11882 memcpy(pNew->zText, zText, nText+1); 11883 pNew->pNext = 0; 11884 if( p->sGraph.pLast ){ 11885 p->sGraph.pLast->pNext = pNew; 11886 }else{ 11887 p->sGraph.pRow = pNew; 11888 } 11889 p->sGraph.pLast = pNew; 11890 } 11891 11892 /* 11893 ** Free and reset the EXPLAIN QUERY PLAN data that has been collected 11894 ** in p->sGraph. 11895 */ 11896 static void eqp_reset(ShellState *p){ 11897 EQPGraphRow *pRow, *pNext; 11898 for(pRow = p->sGraph.pRow; pRow; pRow = pNext){ 11899 pNext = pRow->pNext; 11900 sqlite3_free(pRow); 11901 } 11902 memset(&p->sGraph, 0, sizeof(p->sGraph)); 11903 } 11904 11905 /* Return the next EXPLAIN QUERY PLAN line with iEqpId that occurs after 11906 ** pOld, or return the first such line if pOld is NULL 11907 */ 11908 static EQPGraphRow *eqp_next_row(ShellState *p, int iEqpId, EQPGraphRow *pOld){ 11909 EQPGraphRow *pRow = pOld ? pOld->pNext : p->sGraph.pRow; 11910 while( pRow && pRow->iParentId!=iEqpId ) pRow = pRow->pNext; 11911 return pRow; 11912 } 11913 11914 /* Render a single level of the graph that has iEqpId as its parent. Called 11915 ** recursively to render sublevels. 11916 */ 11917 static void eqp_render_level(ShellState *p, int iEqpId){ 11918 EQPGraphRow *pRow, *pNext; 11919 int n = strlen30(p->sGraph.zPrefix); 11920 char *z; 11921 for(pRow = eqp_next_row(p, iEqpId, 0); pRow; pRow = pNext){ 11922 pNext = eqp_next_row(p, iEqpId, pRow); 11923 z = pRow->zText; 11924 utf8_printf(p->out, "%s%s%s\n", p->sGraph.zPrefix, 11925 pNext ? "|--" : "`--", z); 11926 if( n<(int)sizeof(p->sGraph.zPrefix)-7 ){ 11927 memcpy(&p->sGraph.zPrefix[n], pNext ? "| " : " ", 4); 11928 eqp_render_level(p, pRow->iEqpId); 11929 p->sGraph.zPrefix[n] = 0; 11930 } 11931 } 11932 } 11933 11934 /* 11935 ** Display and reset the EXPLAIN QUERY PLAN data 11936 */ 11937 static void eqp_render(ShellState *p){ 11938 EQPGraphRow *pRow = p->sGraph.pRow; 11939 if( pRow ){ 11940 if( pRow->zText[0]=='-' ){ 11941 if( pRow->pNext==0 ){ 11942 eqp_reset(p); 11943 return; 11944 } 11945 utf8_printf(p->out, "%s\n", pRow->zText+3); 11946 p->sGraph.pRow = pRow->pNext; 11947 sqlite3_free(pRow); 11948 }else{ 11949 utf8_printf(p->out, "QUERY PLAN\n"); 11950 } 11951 p->sGraph.zPrefix[0] = 0; 11952 eqp_render_level(p, 0); 11953 eqp_reset(p); 11954 } 11955 } 11956 11957 #ifndef SQLITE_OMIT_PROGRESS_CALLBACK 11958 /* 11959 ** Progress handler callback. 11960 */ 11961 static int progress_handler(void *pClientData) { 11962 ShellState *p = (ShellState*)pClientData; 11963 p->nProgress++; 11964 if( p->nProgress>=p->mxProgress && p->mxProgress>0 ){ 11965 raw_printf(p->out, "Progress limit reached (%u)\n", p->nProgress); 11966 if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0; 11967 if( p->flgProgress & SHELL_PROGRESS_ONCE ) p->mxProgress = 0; 11968 return 1; 11969 } 11970 if( (p->flgProgress & SHELL_PROGRESS_QUIET)==0 ){ 11971 raw_printf(p->out, "Progress %u\n", p->nProgress); 11972 } 11973 return 0; 11974 } 11975 #endif /* SQLITE_OMIT_PROGRESS_CALLBACK */ 11976 11977 /* 11978 ** Print N dashes 11979 */ 11980 static void print_dashes(FILE *out, int N){ 11981 const char zDash[] = "--------------------------------------------------"; 11982 const int nDash = sizeof(zDash) - 1; 11983 while( N>nDash ){ 11984 fputs(zDash, out); 11985 N -= nDash; 11986 } 11987 raw_printf(out, "%.*s", N, zDash); 11988 } 11989 11990 /* 11991 ** Print a markdown or table-style row separator using ascii-art 11992 */ 11993 static void print_row_separator( 11994 ShellState *p, 11995 int nArg, 11996 const char *zSep 11997 ){ 11998 int i; 11999 if( nArg>0 ){ 12000 fputs(zSep, p->out); 12001 print_dashes(p->out, p->actualWidth[0]+2); 12002 for(i=1; i<nArg; i++){ 12003 fputs(zSep, p->out); 12004 print_dashes(p->out, p->actualWidth[i]+2); 12005 } 12006 fputs(zSep, p->out); 12007 } 12008 fputs("\n", p->out); 12009 } 12010 12011 /* 12012 ** This is the callback routine that the shell 12013 ** invokes for each row of a query result. 12014 */ 12015 static int shell_callback( 12016 void *pArg, 12017 int nArg, /* Number of result columns */ 12018 char **azArg, /* Text of each result column */ 12019 char **azCol, /* Column names */ 12020 int *aiType /* Column types. Might be NULL */ 12021 ){ 12022 int i; 12023 ShellState *p = (ShellState*)pArg; 12024 12025 if( azArg==0 ) return 0; 12026 switch( p->cMode ){ 12027 case MODE_Line: { 12028 int w = 5; 12029 if( azArg==0 ) break; 12030 for(i=0; i<nArg; i++){ 12031 int len = strlen30(azCol[i] ? azCol[i] : ""); 12032 if( len>w ) w = len; 12033 } 12034 if( p->cnt++>0 ) utf8_printf(p->out, "%s", p->rowSeparator); 12035 for(i=0; i<nArg; i++){ 12036 utf8_printf(p->out,"%*s = %s%s", w, azCol[i], 12037 azArg[i] ? azArg[i] : p->nullValue, p->rowSeparator); 12038 } 12039 break; 12040 } 12041 case MODE_Explain: { 12042 static const int aExplainWidth[] = {4, 13, 4, 4, 4, 13, 2, 13}; 12043 if( nArg>ArraySize(aExplainWidth) ){ 12044 nArg = ArraySize(aExplainWidth); 12045 } 12046 if( p->cnt++==0 ){ 12047 for(i=0; i<nArg; i++){ 12048 int w = aExplainWidth[i]; 12049 utf8_width_print(p->out, w, azCol[i]); 12050 fputs(i==nArg-1 ? "\n" : " ", p->out); 12051 } 12052 for(i=0; i<nArg; i++){ 12053 int w = aExplainWidth[i]; 12054 print_dashes(p->out, w); 12055 fputs(i==nArg-1 ? "\n" : " ", p->out); 12056 } 12057 } 12058 if( azArg==0 ) break; 12059 for(i=0; i<nArg; i++){ 12060 int w = aExplainWidth[i]; 12061 if( azArg[i] && strlenChar(azArg[i])>w ){ 12062 w = strlenChar(azArg[i]); 12063 } 12064 if( i==1 && p->aiIndent && p->pStmt ){ 12065 if( p->iIndent<p->nIndent ){ 12066 utf8_printf(p->out, "%*.s", p->aiIndent[p->iIndent], ""); 12067 } 12068 p->iIndent++; 12069 } 12070 utf8_width_print(p->out, w, azArg[i] ? azArg[i] : p->nullValue); 12071 fputs(i==nArg-1 ? "\n" : " ", p->out); 12072 } 12073 break; 12074 } 12075 case MODE_Semi: { /* .schema and .fullschema output */ 12076 printSchemaLine(p->out, azArg[0], ";\n"); 12077 break; 12078 } 12079 case MODE_Pretty: { /* .schema and .fullschema with --indent */ 12080 char *z; 12081 int j; 12082 int nParen = 0; 12083 char cEnd = 0; 12084 char c; 12085 int nLine = 0; 12086 assert( nArg==1 ); 12087 if( azArg[0]==0 ) break; 12088 if( sqlite3_strlike("CREATE VIEW%", azArg[0], 0)==0 12089 || sqlite3_strlike("CREATE TRIG%", azArg[0], 0)==0 12090 ){ 12091 utf8_printf(p->out, "%s;\n", azArg[0]); 12092 break; 12093 } 12094 z = sqlite3_mprintf("%s", azArg[0]); 12095 j = 0; 12096 for(i=0; IsSpace(z[i]); i++){} 12097 for(; (c = z[i])!=0; i++){ 12098 if( IsSpace(c) ){ 12099 if( z[j-1]=='\r' ) z[j-1] = '\n'; 12100 if( IsSpace(z[j-1]) || z[j-1]=='(' ) continue; 12101 }else if( (c=='(' || c==')') && j>0 && IsSpace(z[j-1]) ){ 12102 j--; 12103 } 12104 z[j++] = c; 12105 } 12106 while( j>0 && IsSpace(z[j-1]) ){ j--; } 12107 z[j] = 0; 12108 if( strlen30(z)>=79 ){ 12109 for(i=j=0; (c = z[i])!=0; i++){ /* Copy from z[i] back to z[j] */ 12110 if( c==cEnd ){ 12111 cEnd = 0; 12112 }else if( c=='"' || c=='\'' || c=='`' ){ 12113 cEnd = c; 12114 }else if( c=='[' ){ 12115 cEnd = ']'; 12116 }else if( c=='-' && z[i+1]=='-' ){ 12117 cEnd = '\n'; 12118 }else if( c=='(' ){ 12119 nParen++; 12120 }else if( c==')' ){ 12121 nParen--; 12122 if( nLine>0 && nParen==0 && j>0 ){ 12123 printSchemaLineN(p->out, z, j, "\n"); 12124 j = 0; 12125 } 12126 } 12127 z[j++] = c; 12128 if( nParen==1 && cEnd==0 12129 && (c=='(' || c=='\n' || (c==',' && !wsToEol(z+i+1))) 12130 ){ 12131 if( c=='\n' ) j--; 12132 printSchemaLineN(p->out, z, j, "\n "); 12133 j = 0; 12134 nLine++; 12135 while( IsSpace(z[i+1]) ){ i++; } 12136 } 12137 } 12138 z[j] = 0; 12139 } 12140 printSchemaLine(p->out, z, ";\n"); 12141 sqlite3_free(z); 12142 break; 12143 } 12144 case MODE_List: { 12145 if( p->cnt++==0 && p->showHeader ){ 12146 for(i=0; i<nArg; i++){ 12147 utf8_printf(p->out,"%s%s",azCol[i], 12148 i==nArg-1 ? p->rowSeparator : p->colSeparator); 12149 } 12150 } 12151 if( azArg==0 ) break; 12152 for(i=0; i<nArg; i++){ 12153 char *z = azArg[i]; 12154 if( z==0 ) z = p->nullValue; 12155 utf8_printf(p->out, "%s", z); 12156 if( i<nArg-1 ){ 12157 utf8_printf(p->out, "%s", p->colSeparator); 12158 }else{ 12159 utf8_printf(p->out, "%s", p->rowSeparator); 12160 } 12161 } 12162 break; 12163 } 12164 case MODE_Html: { 12165 if( p->cnt++==0 && p->showHeader ){ 12166 raw_printf(p->out,"<TR>"); 12167 for(i=0; i<nArg; i++){ 12168 raw_printf(p->out,"<TH>"); 12169 output_html_string(p->out, azCol[i]); 12170 raw_printf(p->out,"</TH>\n"); 12171 } 12172 raw_printf(p->out,"</TR>\n"); 12173 } 12174 if( azArg==0 ) break; 12175 raw_printf(p->out,"<TR>"); 12176 for(i=0; i<nArg; i++){ 12177 raw_printf(p->out,"<TD>"); 12178 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullValue); 12179 raw_printf(p->out,"</TD>\n"); 12180 } 12181 raw_printf(p->out,"</TR>\n"); 12182 break; 12183 } 12184 case MODE_Tcl: { 12185 if( p->cnt++==0 && p->showHeader ){ 12186 for(i=0; i<nArg; i++){ 12187 output_c_string(p->out,azCol[i] ? azCol[i] : ""); 12188 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator); 12189 } 12190 utf8_printf(p->out, "%s", p->rowSeparator); 12191 } 12192 if( azArg==0 ) break; 12193 for(i=0; i<nArg; i++){ 12194 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullValue); 12195 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator); 12196 } 12197 utf8_printf(p->out, "%s", p->rowSeparator); 12198 break; 12199 } 12200 case MODE_Csv: { 12201 setBinaryMode(p->out, 1); 12202 if( p->cnt++==0 && p->showHeader ){ 12203 for(i=0; i<nArg; i++){ 12204 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1); 12205 } 12206 utf8_printf(p->out, "%s", p->rowSeparator); 12207 } 12208 if( nArg>0 ){ 12209 for(i=0; i<nArg; i++){ 12210 output_csv(p, azArg[i], i<nArg-1); 12211 } 12212 utf8_printf(p->out, "%s", p->rowSeparator); 12213 } 12214 setTextMode(p->out, 1); 12215 break; 12216 } 12217 case MODE_Insert: { 12218 if( azArg==0 ) break; 12219 utf8_printf(p->out,"INSERT INTO %s",p->zDestTable); 12220 if( p->showHeader ){ 12221 raw_printf(p->out,"("); 12222 for(i=0; i<nArg; i++){ 12223 if( i>0 ) raw_printf(p->out, ","); 12224 if( quoteChar(azCol[i]) ){ 12225 char *z = sqlite3_mprintf("\"%w\"", azCol[i]); 12226 utf8_printf(p->out, "%s", z); 12227 sqlite3_free(z); 12228 }else{ 12229 raw_printf(p->out, "%s", azCol[i]); 12230 } 12231 } 12232 raw_printf(p->out,")"); 12233 } 12234 p->cnt++; 12235 for(i=0; i<nArg; i++){ 12236 raw_printf(p->out, i>0 ? "," : " VALUES("); 12237 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){ 12238 utf8_printf(p->out,"NULL"); 12239 }else if( aiType && aiType[i]==SQLITE_TEXT ){ 12240 if( ShellHasFlag(p, SHFLG_Newlines) ){ 12241 output_quoted_string(p->out, azArg[i]); 12242 }else{ 12243 output_quoted_escaped_string(p->out, azArg[i]); 12244 } 12245 }else if( aiType && aiType[i]==SQLITE_INTEGER ){ 12246 utf8_printf(p->out,"%s", azArg[i]); 12247 }else if( aiType && aiType[i]==SQLITE_FLOAT ){ 12248 char z[50]; 12249 double r = sqlite3_column_double(p->pStmt, i); 12250 sqlite3_uint64 ur; 12251 memcpy(&ur,&r,sizeof(r)); 12252 if( ur==0x7ff0000000000000LL ){ 12253 raw_printf(p->out, "1e999"); 12254 }else if( ur==0xfff0000000000000LL ){ 12255 raw_printf(p->out, "-1e999"); 12256 }else{ 12257 sqlite3_snprintf(50,z,"%!.20g", r); 12258 raw_printf(p->out, "%s", z); 12259 } 12260 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){ 12261 const void *pBlob = sqlite3_column_blob(p->pStmt, i); 12262 int nBlob = sqlite3_column_bytes(p->pStmt, i); 12263 output_hex_blob(p->out, pBlob, nBlob); 12264 }else if( isNumber(azArg[i], 0) ){ 12265 utf8_printf(p->out,"%s", azArg[i]); 12266 }else if( ShellHasFlag(p, SHFLG_Newlines) ){ 12267 output_quoted_string(p->out, azArg[i]); 12268 }else{ 12269 output_quoted_escaped_string(p->out, azArg[i]); 12270 } 12271 } 12272 raw_printf(p->out,");\n"); 12273 break; 12274 } 12275 case MODE_Json: { 12276 if( azArg==0 ) break; 12277 if( p->cnt==0 ){ 12278 fputs("[{", p->out); 12279 }else{ 12280 fputs(",\n{", p->out); 12281 } 12282 p->cnt++; 12283 for(i=0; i<nArg; i++){ 12284 output_json_string(p->out, azCol[i], -1); 12285 putc(':', p->out); 12286 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){ 12287 fputs("null",p->out); 12288 }else if( aiType && aiType[i]==SQLITE_FLOAT ){ 12289 char z[50]; 12290 double r = sqlite3_column_double(p->pStmt, i); 12291 sqlite3_uint64 ur; 12292 memcpy(&ur,&r,sizeof(r)); 12293 if( ur==0x7ff0000000000000LL ){ 12294 raw_printf(p->out, "1e999"); 12295 }else if( ur==0xfff0000000000000LL ){ 12296 raw_printf(p->out, "-1e999"); 12297 }else{ 12298 sqlite3_snprintf(50,z,"%!.20g", r); 12299 raw_printf(p->out, "%s", z); 12300 } 12301 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){ 12302 const void *pBlob = sqlite3_column_blob(p->pStmt, i); 12303 int nBlob = sqlite3_column_bytes(p->pStmt, i); 12304 output_json_string(p->out, pBlob, nBlob); 12305 }else if( aiType && aiType[i]==SQLITE_TEXT ){ 12306 output_json_string(p->out, azArg[i], -1); 12307 }else{ 12308 utf8_printf(p->out,"%s", azArg[i]); 12309 } 12310 if( i<nArg-1 ){ 12311 putc(',', p->out); 12312 } 12313 } 12314 putc('}', p->out); 12315 break; 12316 } 12317 case MODE_Quote: { 12318 if( azArg==0 ) break; 12319 if( p->cnt==0 && p->showHeader ){ 12320 for(i=0; i<nArg; i++){ 12321 if( i>0 ) fputs(p->colSeparator, p->out); 12322 output_quoted_string(p->out, azCol[i]); 12323 } 12324 fputs(p->rowSeparator, p->out); 12325 } 12326 p->cnt++; 12327 for(i=0; i<nArg; i++){ 12328 if( i>0 ) fputs(p->colSeparator, p->out); 12329 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){ 12330 utf8_printf(p->out,"NULL"); 12331 }else if( aiType && aiType[i]==SQLITE_TEXT ){ 12332 output_quoted_string(p->out, azArg[i]); 12333 }else if( aiType && aiType[i]==SQLITE_INTEGER ){ 12334 utf8_printf(p->out,"%s", azArg[i]); 12335 }else if( aiType && aiType[i]==SQLITE_FLOAT ){ 12336 char z[50]; 12337 double r = sqlite3_column_double(p->pStmt, i); 12338 sqlite3_snprintf(50,z,"%!.20g", r); 12339 raw_printf(p->out, "%s", z); 12340 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){ 12341 const void *pBlob = sqlite3_column_blob(p->pStmt, i); 12342 int nBlob = sqlite3_column_bytes(p->pStmt, i); 12343 output_hex_blob(p->out, pBlob, nBlob); 12344 }else if( isNumber(azArg[i], 0) ){ 12345 utf8_printf(p->out,"%s", azArg[i]); 12346 }else{ 12347 output_quoted_string(p->out, azArg[i]); 12348 } 12349 } 12350 fputs(p->rowSeparator, p->out); 12351 break; 12352 } 12353 case MODE_Ascii: { 12354 if( p->cnt++==0 && p->showHeader ){ 12355 for(i=0; i<nArg; i++){ 12356 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator); 12357 utf8_printf(p->out,"%s",azCol[i] ? azCol[i] : ""); 12358 } 12359 utf8_printf(p->out, "%s", p->rowSeparator); 12360 } 12361 if( azArg==0 ) break; 12362 for(i=0; i<nArg; i++){ 12363 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator); 12364 utf8_printf(p->out,"%s",azArg[i] ? azArg[i] : p->nullValue); 12365 } 12366 utf8_printf(p->out, "%s", p->rowSeparator); 12367 break; 12368 } 12369 case MODE_EQP: { 12370 eqp_append(p, atoi(azArg[0]), atoi(azArg[1]), azArg[3]); 12371 break; 12372 } 12373 } 12374 return 0; 12375 } 12376 12377 /* 12378 ** This is the callback routine that the SQLite library 12379 ** invokes for each row of a query result. 12380 */ 12381 static int callback(void *pArg, int nArg, char **azArg, char **azCol){ 12382 /* since we don't have type info, call the shell_callback with a NULL value */ 12383 return shell_callback(pArg, nArg, azArg, azCol, NULL); 12384 } 12385 12386 /* 12387 ** This is the callback routine from sqlite3_exec() that appends all 12388 ** output onto the end of a ShellText object. 12389 */ 12390 static int captureOutputCallback(void *pArg, int nArg, char **azArg, char **az){ 12391 ShellText *p = (ShellText*)pArg; 12392 int i; 12393 UNUSED_PARAMETER(az); 12394 if( azArg==0 ) return 0; 12395 if( p->n ) appendText(p, "|", 0); 12396 for(i=0; i<nArg; i++){ 12397 if( i ) appendText(p, ",", 0); 12398 if( azArg[i] ) appendText(p, azArg[i], 0); 12399 } 12400 return 0; 12401 } 12402 12403 /* 12404 ** Generate an appropriate SELFTEST table in the main database. 12405 */ 12406 static void createSelftestTable(ShellState *p){ 12407 char *zErrMsg = 0; 12408 sqlite3_exec(p->db, 12409 "SAVEPOINT selftest_init;\n" 12410 "CREATE TABLE IF NOT EXISTS selftest(\n" 12411 " tno INTEGER PRIMARY KEY,\n" /* Test number */ 12412 " op TEXT,\n" /* Operator: memo run */ 12413 " cmd TEXT,\n" /* Command text */ 12414 " ans TEXT\n" /* Desired answer */ 12415 ");" 12416 "CREATE TEMP TABLE [_shell$self](op,cmd,ans);\n" 12417 "INSERT INTO [_shell$self](rowid,op,cmd)\n" 12418 " VALUES(coalesce((SELECT (max(tno)+100)/10 FROM selftest),10),\n" 12419 " 'memo','Tests generated by --init');\n" 12420 "INSERT INTO [_shell$self]\n" 12421 " SELECT 'run',\n" 12422 " 'SELECT hex(sha3_query(''SELECT type,name,tbl_name,sql " 12423 "FROM sqlite_schema ORDER BY 2'',224))',\n" 12424 " hex(sha3_query('SELECT type,name,tbl_name,sql " 12425 "FROM sqlite_schema ORDER BY 2',224));\n" 12426 "INSERT INTO [_shell$self]\n" 12427 " SELECT 'run'," 12428 " 'SELECT hex(sha3_query(''SELECT * FROM \"' ||" 12429 " printf('%w',name) || '\" NOT INDEXED'',224))',\n" 12430 " hex(sha3_query(printf('SELECT * FROM \"%w\" NOT INDEXED',name),224))\n" 12431 " FROM (\n" 12432 " SELECT name FROM sqlite_schema\n" 12433 " WHERE type='table'\n" 12434 " AND name<>'selftest'\n" 12435 " AND coalesce(rootpage,0)>0\n" 12436 " )\n" 12437 " ORDER BY name;\n" 12438 "INSERT INTO [_shell$self]\n" 12439 " VALUES('run','PRAGMA integrity_check','ok');\n" 12440 "INSERT INTO selftest(tno,op,cmd,ans)" 12441 " SELECT rowid*10,op,cmd,ans FROM [_shell$self];\n" 12442 "DROP TABLE [_shell$self];" 12443 ,0,0,&zErrMsg); 12444 if( zErrMsg ){ 12445 utf8_printf(stderr, "SELFTEST initialization failure: %s\n", zErrMsg); 12446 sqlite3_free(zErrMsg); 12447 } 12448 sqlite3_exec(p->db, "RELEASE selftest_init",0,0,0); 12449 } 12450 12451 12452 /* 12453 ** Set the destination table field of the ShellState structure to 12454 ** the name of the table given. Escape any quote characters in the 12455 ** table name. 12456 */ 12457 static void set_table_name(ShellState *p, const char *zName){ 12458 int i, n; 12459 char cQuote; 12460 char *z; 12461 12462 if( p->zDestTable ){ 12463 free(p->zDestTable); 12464 p->zDestTable = 0; 12465 } 12466 if( zName==0 ) return; 12467 cQuote = quoteChar(zName); 12468 n = strlen30(zName); 12469 if( cQuote ) n += n+2; 12470 z = p->zDestTable = malloc( n+1 ); 12471 if( z==0 ) shell_out_of_memory(); 12472 n = 0; 12473 if( cQuote ) z[n++] = cQuote; 12474 for(i=0; zName[i]; i++){ 12475 z[n++] = zName[i]; 12476 if( zName[i]==cQuote ) z[n++] = cQuote; 12477 } 12478 if( cQuote ) z[n++] = cQuote; 12479 z[n] = 0; 12480 } 12481 12482 12483 /* 12484 ** Execute a query statement that will generate SQL output. Print 12485 ** the result columns, comma-separated, on a line and then add a 12486 ** semicolon terminator to the end of that line. 12487 ** 12488 ** If the number of columns is 1 and that column contains text "--" 12489 ** then write the semicolon on a separate line. That way, if a 12490 ** "--" comment occurs at the end of the statement, the comment 12491 ** won't consume the semicolon terminator. 12492 */ 12493 static int run_table_dump_query( 12494 ShellState *p, /* Query context */ 12495 const char *zSelect /* SELECT statement to extract content */ 12496 ){ 12497 sqlite3_stmt *pSelect; 12498 int rc; 12499 int nResult; 12500 int i; 12501 const char *z; 12502 rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0); 12503 if( rc!=SQLITE_OK || !pSelect ){ 12504 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, 12505 sqlite3_errmsg(p->db)); 12506 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++; 12507 return rc; 12508 } 12509 rc = sqlite3_step(pSelect); 12510 nResult = sqlite3_column_count(pSelect); 12511 while( rc==SQLITE_ROW ){ 12512 z = (const char*)sqlite3_column_text(pSelect, 0); 12513 utf8_printf(p->out, "%s", z); 12514 for(i=1; i<nResult; i++){ 12515 utf8_printf(p->out, ",%s", sqlite3_column_text(pSelect, i)); 12516 } 12517 if( z==0 ) z = ""; 12518 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++; 12519 if( z[0] ){ 12520 raw_printf(p->out, "\n;\n"); 12521 }else{ 12522 raw_printf(p->out, ";\n"); 12523 } 12524 rc = sqlite3_step(pSelect); 12525 } 12526 rc = sqlite3_finalize(pSelect); 12527 if( rc!=SQLITE_OK ){ 12528 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, 12529 sqlite3_errmsg(p->db)); 12530 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++; 12531 } 12532 return rc; 12533 } 12534 12535 /* 12536 ** Allocate space and save off current error string. 12537 */ 12538 static char *save_err_msg( 12539 sqlite3 *db /* Database to query */ 12540 ){ 12541 int nErrMsg = 1+strlen30(sqlite3_errmsg(db)); 12542 char *zErrMsg = sqlite3_malloc64(nErrMsg); 12543 if( zErrMsg ){ 12544 memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg); 12545 } 12546 return zErrMsg; 12547 } 12548 12549 #ifdef __linux__ 12550 /* 12551 ** Attempt to display I/O stats on Linux using /proc/PID/io 12552 */ 12553 static void displayLinuxIoStats(FILE *out){ 12554 FILE *in; 12555 char z[200]; 12556 sqlite3_snprintf(sizeof(z), z, "/proc/%d/io", getpid()); 12557 in = fopen(z, "rb"); 12558 if( in==0 ) return; 12559 while( fgets(z, sizeof(z), in)!=0 ){ 12560 static const struct { 12561 const char *zPattern; 12562 const char *zDesc; 12563 } aTrans[] = { 12564 { "rchar: ", "Bytes received by read():" }, 12565 { "wchar: ", "Bytes sent to write():" }, 12566 { "syscr: ", "Read() system calls:" }, 12567 { "syscw: ", "Write() system calls:" }, 12568 { "read_bytes: ", "Bytes read from storage:" }, 12569 { "write_bytes: ", "Bytes written to storage:" }, 12570 { "cancelled_write_bytes: ", "Cancelled write bytes:" }, 12571 }; 12572 int i; 12573 for(i=0; i<ArraySize(aTrans); i++){ 12574 int n = strlen30(aTrans[i].zPattern); 12575 if( strncmp(aTrans[i].zPattern, z, n)==0 ){ 12576 utf8_printf(out, "%-36s %s", aTrans[i].zDesc, &z[n]); 12577 break; 12578 } 12579 } 12580 } 12581 fclose(in); 12582 } 12583 #endif 12584 12585 /* 12586 ** Display a single line of status using 64-bit values. 12587 */ 12588 static void displayStatLine( 12589 ShellState *p, /* The shell context */ 12590 char *zLabel, /* Label for this one line */ 12591 char *zFormat, /* Format for the result */ 12592 int iStatusCtrl, /* Which status to display */ 12593 int bReset /* True to reset the stats */ 12594 ){ 12595 sqlite3_int64 iCur = -1; 12596 sqlite3_int64 iHiwtr = -1; 12597 int i, nPercent; 12598 char zLine[200]; 12599 sqlite3_status64(iStatusCtrl, &iCur, &iHiwtr, bReset); 12600 for(i=0, nPercent=0; zFormat[i]; i++){ 12601 if( zFormat[i]=='%' ) nPercent++; 12602 } 12603 if( nPercent>1 ){ 12604 sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iCur, iHiwtr); 12605 }else{ 12606 sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iHiwtr); 12607 } 12608 raw_printf(p->out, "%-36s %s\n", zLabel, zLine); 12609 } 12610 12611 /* 12612 ** Display memory stats. 12613 */ 12614 static int display_stats( 12615 sqlite3 *db, /* Database to query */ 12616 ShellState *pArg, /* Pointer to ShellState */ 12617 int bReset /* True to reset the stats */ 12618 ){ 12619 int iCur; 12620 int iHiwtr; 12621 FILE *out; 12622 if( pArg==0 || pArg->out==0 ) return 0; 12623 out = pArg->out; 12624 12625 if( pArg->pStmt && (pArg->statsOn & 2) ){ 12626 int nCol, i, x; 12627 sqlite3_stmt *pStmt = pArg->pStmt; 12628 char z[100]; 12629 nCol = sqlite3_column_count(pStmt); 12630 raw_printf(out, "%-36s %d\n", "Number of output columns:", nCol); 12631 for(i=0; i<nCol; i++){ 12632 sqlite3_snprintf(sizeof(z),z,"Column %d %nname:", i, &x); 12633 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_name(pStmt,i)); 12634 #ifndef SQLITE_OMIT_DECLTYPE 12635 sqlite3_snprintf(30, z+x, "declared type:"); 12636 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_decltype(pStmt, i)); 12637 #endif 12638 #ifdef SQLITE_ENABLE_COLUMN_METADATA 12639 sqlite3_snprintf(30, z+x, "database name:"); 12640 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_database_name(pStmt,i)); 12641 sqlite3_snprintf(30, z+x, "table name:"); 12642 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_table_name(pStmt,i)); 12643 sqlite3_snprintf(30, z+x, "origin name:"); 12644 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_origin_name(pStmt,i)); 12645 #endif 12646 } 12647 } 12648 12649 displayStatLine(pArg, "Memory Used:", 12650 "%lld (max %lld) bytes", SQLITE_STATUS_MEMORY_USED, bReset); 12651 displayStatLine(pArg, "Number of Outstanding Allocations:", 12652 "%lld (max %lld)", SQLITE_STATUS_MALLOC_COUNT, bReset); 12653 if( pArg->shellFlgs & SHFLG_Pagecache ){ 12654 displayStatLine(pArg, "Number of Pcache Pages Used:", 12655 "%lld (max %lld) pages", SQLITE_STATUS_PAGECACHE_USED, bReset); 12656 } 12657 displayStatLine(pArg, "Number of Pcache Overflow Bytes:", 12658 "%lld (max %lld) bytes", SQLITE_STATUS_PAGECACHE_OVERFLOW, bReset); 12659 displayStatLine(pArg, "Largest Allocation:", 12660 "%lld bytes", SQLITE_STATUS_MALLOC_SIZE, bReset); 12661 displayStatLine(pArg, "Largest Pcache Allocation:", 12662 "%lld bytes", SQLITE_STATUS_PAGECACHE_SIZE, bReset); 12663 #ifdef YYTRACKMAXSTACKDEPTH 12664 displayStatLine(pArg, "Deepest Parser Stack:", 12665 "%lld (max %lld)", SQLITE_STATUS_PARSER_STACK, bReset); 12666 #endif 12667 12668 if( db ){ 12669 if( pArg->shellFlgs & SHFLG_Lookaside ){ 12670 iHiwtr = iCur = -1; 12671 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED, 12672 &iCur, &iHiwtr, bReset); 12673 raw_printf(pArg->out, 12674 "Lookaside Slots Used: %d (max %d)\n", 12675 iCur, iHiwtr); 12676 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT, 12677 &iCur, &iHiwtr, bReset); 12678 raw_printf(pArg->out, "Successful lookaside attempts: %d\n", 12679 iHiwtr); 12680 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE, 12681 &iCur, &iHiwtr, bReset); 12682 raw_printf(pArg->out, "Lookaside failures due to size: %d\n", 12683 iHiwtr); 12684 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL, 12685 &iCur, &iHiwtr, bReset); 12686 raw_printf(pArg->out, "Lookaside failures due to OOM: %d\n", 12687 iHiwtr); 12688 } 12689 iHiwtr = iCur = -1; 12690 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset); 12691 raw_printf(pArg->out, "Pager Heap Usage: %d bytes\n", 12692 iCur); 12693 iHiwtr = iCur = -1; 12694 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1); 12695 raw_printf(pArg->out, "Page cache hits: %d\n", iCur); 12696 iHiwtr = iCur = -1; 12697 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1); 12698 raw_printf(pArg->out, "Page cache misses: %d\n", iCur); 12699 iHiwtr = iCur = -1; 12700 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1); 12701 raw_printf(pArg->out, "Page cache writes: %d\n", iCur); 12702 iHiwtr = iCur = -1; 12703 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_SPILL, &iCur, &iHiwtr, 1); 12704 raw_printf(pArg->out, "Page cache spills: %d\n", iCur); 12705 iHiwtr = iCur = -1; 12706 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset); 12707 raw_printf(pArg->out, "Schema Heap Usage: %d bytes\n", 12708 iCur); 12709 iHiwtr = iCur = -1; 12710 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset); 12711 raw_printf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n", 12712 iCur); 12713 } 12714 12715 if( pArg->pStmt ){ 12716 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP, 12717 bReset); 12718 raw_printf(pArg->out, "Fullscan Steps: %d\n", iCur); 12719 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset); 12720 raw_printf(pArg->out, "Sort Operations: %d\n", iCur); 12721 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset); 12722 raw_printf(pArg->out, "Autoindex Inserts: %d\n", iCur); 12723 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset); 12724 raw_printf(pArg->out, "Virtual Machine Steps: %d\n", iCur); 12725 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_REPREPARE,bReset); 12726 raw_printf(pArg->out, "Reprepare operations: %d\n", iCur); 12727 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_RUN, bReset); 12728 raw_printf(pArg->out, "Number of times run: %d\n", iCur); 12729 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_MEMUSED, bReset); 12730 raw_printf(pArg->out, "Memory used by prepared stmt: %d\n", iCur); 12731 } 12732 12733 #ifdef __linux__ 12734 displayLinuxIoStats(pArg->out); 12735 #endif 12736 12737 /* Do not remove this machine readable comment: extra-stats-output-here */ 12738 12739 return 0; 12740 } 12741 12742 /* 12743 ** Display scan stats. 12744 */ 12745 static void display_scanstats( 12746 sqlite3 *db, /* Database to query */ 12747 ShellState *pArg /* Pointer to ShellState */ 12748 ){ 12749 #ifndef SQLITE_ENABLE_STMT_SCANSTATUS 12750 UNUSED_PARAMETER(db); 12751 UNUSED_PARAMETER(pArg); 12752 #else 12753 int i, k, n, mx; 12754 raw_printf(pArg->out, "-------- scanstats --------\n"); 12755 mx = 0; 12756 for(k=0; k<=mx; k++){ 12757 double rEstLoop = 1.0; 12758 for(i=n=0; 1; i++){ 12759 sqlite3_stmt *p = pArg->pStmt; 12760 sqlite3_int64 nLoop, nVisit; 12761 double rEst; 12762 int iSid; 12763 const char *zExplain; 12764 if( sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NLOOP, (void*)&nLoop) ){ 12765 break; 12766 } 12767 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_SELECTID, (void*)&iSid); 12768 if( iSid>mx ) mx = iSid; 12769 if( iSid!=k ) continue; 12770 if( n==0 ){ 12771 rEstLoop = (double)nLoop; 12772 if( k>0 ) raw_printf(pArg->out, "-------- subquery %d -------\n", k); 12773 } 12774 n++; 12775 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NVISIT, (void*)&nVisit); 12776 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EST, (void*)&rEst); 12777 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EXPLAIN, (void*)&zExplain); 12778 utf8_printf(pArg->out, "Loop %2d: %s\n", n, zExplain); 12779 rEstLoop *= rEst; 12780 raw_printf(pArg->out, 12781 " nLoop=%-8lld nRow=%-8lld estRow=%-8lld estRow/Loop=%-8g\n", 12782 nLoop, nVisit, (sqlite3_int64)(rEstLoop+0.5), rEst 12783 ); 12784 } 12785 } 12786 raw_printf(pArg->out, "---------------------------\n"); 12787 #endif 12788 } 12789 12790 /* 12791 ** Parameter azArray points to a zero-terminated array of strings. zStr 12792 ** points to a single nul-terminated string. Return non-zero if zStr 12793 ** is equal, according to strcmp(), to any of the strings in the array. 12794 ** Otherwise, return zero. 12795 */ 12796 static int str_in_array(const char *zStr, const char **azArray){ 12797 int i; 12798 for(i=0; azArray[i]; i++){ 12799 if( 0==strcmp(zStr, azArray[i]) ) return 1; 12800 } 12801 return 0; 12802 } 12803 12804 /* 12805 ** If compiled statement pSql appears to be an EXPLAIN statement, allocate 12806 ** and populate the ShellState.aiIndent[] array with the number of 12807 ** spaces each opcode should be indented before it is output. 12808 ** 12809 ** The indenting rules are: 12810 ** 12811 ** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent 12812 ** all opcodes that occur between the p2 jump destination and the opcode 12813 ** itself by 2 spaces. 12814 ** 12815 ** * For each "Goto", if the jump destination is earlier in the program 12816 ** and ends on one of: 12817 ** Yield SeekGt SeekLt RowSetRead Rewind 12818 ** or if the P1 parameter is one instead of zero, 12819 ** then indent all opcodes between the earlier instruction 12820 ** and "Goto" by 2 spaces. 12821 */ 12822 static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){ 12823 const char *zSql; /* The text of the SQL statement */ 12824 const char *z; /* Used to check if this is an EXPLAIN */ 12825 int *abYield = 0; /* True if op is an OP_Yield */ 12826 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */ 12827 int iOp; /* Index of operation in p->aiIndent[] */ 12828 12829 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext", 0 }; 12830 const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead", 12831 "Rewind", 0 }; 12832 const char *azGoto[] = { "Goto", 0 }; 12833 12834 /* Try to figure out if this is really an EXPLAIN statement. If this 12835 ** cannot be verified, return early. */ 12836 if( sqlite3_column_count(pSql)!=8 ){ 12837 p->cMode = p->mode; 12838 return; 12839 } 12840 zSql = sqlite3_sql(pSql); 12841 if( zSql==0 ) return; 12842 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++); 12843 if( sqlite3_strnicmp(z, "explain", 7) ){ 12844 p->cMode = p->mode; 12845 return; 12846 } 12847 12848 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){ 12849 int i; 12850 int iAddr = sqlite3_column_int(pSql, 0); 12851 const char *zOp = (const char*)sqlite3_column_text(pSql, 1); 12852 12853 /* Set p2 to the P2 field of the current opcode. Then, assuming that 12854 ** p2 is an instruction address, set variable p2op to the index of that 12855 ** instruction in the aiIndent[] array. p2 and p2op may be different if 12856 ** the current instruction is part of a sub-program generated by an 12857 ** SQL trigger or foreign key. */ 12858 int p2 = sqlite3_column_int(pSql, 3); 12859 int p2op = (p2 + (iOp-iAddr)); 12860 12861 /* Grow the p->aiIndent array as required */ 12862 if( iOp>=nAlloc ){ 12863 if( iOp==0 ){ 12864 /* Do further verfication that this is explain output. Abort if 12865 ** it is not */ 12866 static const char *explainCols[] = { 12867 "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment" }; 12868 int jj; 12869 for(jj=0; jj<ArraySize(explainCols); jj++){ 12870 if( strcmp(sqlite3_column_name(pSql,jj),explainCols[jj])!=0 ){ 12871 p->cMode = p->mode; 12872 sqlite3_reset(pSql); 12873 return; 12874 } 12875 } 12876 } 12877 nAlloc += 100; 12878 p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int)); 12879 if( p->aiIndent==0 ) shell_out_of_memory(); 12880 abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int)); 12881 if( abYield==0 ) shell_out_of_memory(); 12882 } 12883 abYield[iOp] = str_in_array(zOp, azYield); 12884 p->aiIndent[iOp] = 0; 12885 p->nIndent = iOp+1; 12886 12887 if( str_in_array(zOp, azNext) ){ 12888 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2; 12889 } 12890 if( str_in_array(zOp, azGoto) && p2op<p->nIndent 12891 && (abYield[p2op] || sqlite3_column_int(pSql, 2)) 12892 ){ 12893 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2; 12894 } 12895 } 12896 12897 p->iIndent = 0; 12898 sqlite3_free(abYield); 12899 sqlite3_reset(pSql); 12900 } 12901 12902 /* 12903 ** Free the array allocated by explain_data_prepare(). 12904 */ 12905 static void explain_data_delete(ShellState *p){ 12906 sqlite3_free(p->aiIndent); 12907 p->aiIndent = 0; 12908 p->nIndent = 0; 12909 p->iIndent = 0; 12910 } 12911 12912 /* 12913 ** Disable and restore .wheretrace and .selecttrace settings. 12914 */ 12915 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE) 12916 extern unsigned int sqlite3_unsupported_selecttrace; 12917 static int savedSelectTrace; 12918 #endif 12919 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE) 12920 extern int sqlite3WhereTrace; 12921 static int savedWhereTrace; 12922 #endif 12923 static void disable_debug_trace_modes(void){ 12924 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE) 12925 savedSelectTrace = sqlite3_unsupported_selecttrace; 12926 sqlite3_unsupported_selecttrace = 0; 12927 #endif 12928 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE) 12929 savedWhereTrace = sqlite3WhereTrace; 12930 sqlite3WhereTrace = 0; 12931 #endif 12932 } 12933 static void restore_debug_trace_modes(void){ 12934 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE) 12935 sqlite3_unsupported_selecttrace = savedSelectTrace; 12936 #endif 12937 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE) 12938 sqlite3WhereTrace = savedWhereTrace; 12939 #endif 12940 } 12941 12942 /* Create the TEMP table used to store parameter bindings */ 12943 static void bind_table_init(ShellState *p){ 12944 int wrSchema = 0; 12945 int defensiveMode = 0; 12946 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, -1, &defensiveMode); 12947 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, 0, 0); 12948 sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, -1, &wrSchema); 12949 sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, 1, 0); 12950 sqlite3_exec(p->db, 12951 "CREATE TABLE IF NOT EXISTS temp.sqlite_parameters(\n" 12952 " key TEXT PRIMARY KEY,\n" 12953 " value ANY\n" 12954 ") WITHOUT ROWID;", 12955 0, 0, 0); 12956 sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, wrSchema, 0); 12957 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, defensiveMode, 0); 12958 } 12959 12960 /* 12961 ** Bind parameters on a prepared statement. 12962 ** 12963 ** Parameter bindings are taken from a TEMP table of the form: 12964 ** 12965 ** CREATE TEMP TABLE sqlite_parameters(key TEXT PRIMARY KEY, value) 12966 ** WITHOUT ROWID; 12967 ** 12968 ** No bindings occur if this table does not exist. The name of the table 12969 ** begins with "sqlite_" so that it will not collide with ordinary application 12970 ** tables. The table must be in the TEMP schema. 12971 */ 12972 static void bind_prepared_stmt(ShellState *pArg, sqlite3_stmt *pStmt){ 12973 int nVar; 12974 int i; 12975 int rc; 12976 sqlite3_stmt *pQ = 0; 12977 12978 nVar = sqlite3_bind_parameter_count(pStmt); 12979 if( nVar==0 ) return; /* Nothing to do */ 12980 if( sqlite3_table_column_metadata(pArg->db, "TEMP", "sqlite_parameters", 12981 "key", 0, 0, 0, 0, 0)!=SQLITE_OK ){ 12982 return; /* Parameter table does not exist */ 12983 } 12984 rc = sqlite3_prepare_v2(pArg->db, 12985 "SELECT value FROM temp.sqlite_parameters" 12986 " WHERE key=?1", -1, &pQ, 0); 12987 if( rc || pQ==0 ) return; 12988 for(i=1; i<=nVar; i++){ 12989 char zNum[30]; 12990 const char *zVar = sqlite3_bind_parameter_name(pStmt, i); 12991 if( zVar==0 ){ 12992 sqlite3_snprintf(sizeof(zNum),zNum,"?%d",i); 12993 zVar = zNum; 12994 } 12995 sqlite3_bind_text(pQ, 1, zVar, -1, SQLITE_STATIC); 12996 if( sqlite3_step(pQ)==SQLITE_ROW ){ 12997 sqlite3_bind_value(pStmt, i, sqlite3_column_value(pQ, 0)); 12998 }else{ 12999 sqlite3_bind_null(pStmt, i); 13000 } 13001 sqlite3_reset(pQ); 13002 } 13003 sqlite3_finalize(pQ); 13004 } 13005 13006 /* 13007 ** UTF8 box-drawing characters. Imagine box lines like this: 13008 ** 13009 ** 1 13010 ** | 13011 ** 4 --+-- 2 13012 ** | 13013 ** 3 13014 ** 13015 ** Each box characters has between 2 and 4 of the lines leading from 13016 ** the center. The characters are here identified by the numbers of 13017 ** their corresponding lines. 13018 */ 13019 #define BOX_24 "\342\224\200" /* U+2500 --- */ 13020 #define BOX_13 "\342\224\202" /* U+2502 | */ 13021 #define BOX_23 "\342\224\214" /* U+250c ,- */ 13022 #define BOX_34 "\342\224\220" /* U+2510 -, */ 13023 #define BOX_12 "\342\224\224" /* U+2514 '- */ 13024 #define BOX_14 "\342\224\230" /* U+2518 -' */ 13025 #define BOX_123 "\342\224\234" /* U+251c |- */ 13026 #define BOX_134 "\342\224\244" /* U+2524 -| */ 13027 #define BOX_234 "\342\224\254" /* U+252c -,- */ 13028 #define BOX_124 "\342\224\264" /* U+2534 -'- */ 13029 #define BOX_1234 "\342\224\274" /* U+253c -|- */ 13030 13031 /* Draw horizontal line N characters long using unicode box 13032 ** characters 13033 */ 13034 static void print_box_line(FILE *out, int N){ 13035 const char zDash[] = 13036 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 13037 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24; 13038 const int nDash = sizeof(zDash) - 1; 13039 N *= 3; 13040 while( N>nDash ){ 13041 utf8_printf(out, zDash); 13042 N -= nDash; 13043 } 13044 utf8_printf(out, "%.*s", N, zDash); 13045 } 13046 13047 /* 13048 ** Draw a horizontal separator for a MODE_Box table. 13049 */ 13050 static void print_box_row_separator( 13051 ShellState *p, 13052 int nArg, 13053 const char *zSep1, 13054 const char *zSep2, 13055 const char *zSep3 13056 ){ 13057 int i; 13058 if( nArg>0 ){ 13059 utf8_printf(p->out, "%s", zSep1); 13060 print_box_line(p->out, p->actualWidth[0]+2); 13061 for(i=1; i<nArg; i++){ 13062 utf8_printf(p->out, "%s", zSep2); 13063 print_box_line(p->out, p->actualWidth[i]+2); 13064 } 13065 utf8_printf(p->out, "%s", zSep3); 13066 } 13067 fputs("\n", p->out); 13068 } 13069 13070 13071 13072 /* 13073 ** Run a prepared statement and output the result in one of the 13074 ** table-oriented formats: MODE_Column, MODE_Markdown, MODE_Table, 13075 ** or MODE_Box. 13076 ** 13077 ** This is different from ordinary exec_prepared_stmt() in that 13078 ** it has to run the entire query and gather the results into memory 13079 ** first, in order to determine column widths, before providing 13080 ** any output. 13081 */ 13082 static void exec_prepared_stmt_columnar( 13083 ShellState *p, /* Pointer to ShellState */ 13084 sqlite3_stmt *pStmt /* Statment to run */ 13085 ){ 13086 sqlite3_int64 nRow = 0; 13087 int nColumn = 0; 13088 char **azData = 0; 13089 sqlite3_int64 nAlloc = 0; 13090 const char *z; 13091 int rc; 13092 sqlite3_int64 i, nData; 13093 int j, nTotal, w, n; 13094 const char *colSep = 0; 13095 const char *rowSep = 0; 13096 13097 rc = sqlite3_step(pStmt); 13098 if( rc!=SQLITE_ROW ) return; 13099 nColumn = sqlite3_column_count(pStmt); 13100 nAlloc = nColumn*4; 13101 azData = sqlite3_malloc64( nAlloc*sizeof(char*) ); 13102 if( azData==0 ) shell_out_of_memory(); 13103 for(i=0; i<nColumn; i++){ 13104 azData[i] = strdup(sqlite3_column_name(pStmt,i)); 13105 } 13106 do{ 13107 if( (nRow+2)*nColumn >= nAlloc ){ 13108 nAlloc *= 2; 13109 azData = sqlite3_realloc64(azData, nAlloc*sizeof(char*)); 13110 if( azData==0 ) shell_out_of_memory(); 13111 } 13112 nRow++; 13113 for(i=0; i<nColumn; i++){ 13114 z = (const char*)sqlite3_column_text(pStmt,i); 13115 azData[nRow*nColumn + i] = z ? strdup(z) : 0; 13116 } 13117 }while( (rc = sqlite3_step(pStmt))==SQLITE_ROW ); 13118 if( nColumn>p->nWidth ){ 13119 p->colWidth = realloc(p->colWidth, nColumn*2*sizeof(int)); 13120 if( p->colWidth==0 ) shell_out_of_memory(); 13121 for(i=p->nWidth; i<nColumn; i++) p->colWidth[i] = 0; 13122 p->nWidth = nColumn; 13123 p->actualWidth = &p->colWidth[nColumn]; 13124 } 13125 memset(p->actualWidth, 0, nColumn*sizeof(int)); 13126 for(i=0; i<nColumn; i++){ 13127 w = p->colWidth[i]; 13128 if( w<0 ) w = -w; 13129 p->actualWidth[i] = w; 13130 } 13131 nTotal = nColumn*(nRow+1); 13132 for(i=0; i<nTotal; i++){ 13133 z = azData[i]; 13134 if( z==0 ) z = p->nullValue; 13135 n = strlenChar(z); 13136 j = i%nColumn; 13137 if( n>p->actualWidth[j] ) p->actualWidth[j] = n; 13138 } 13139 if( seenInterrupt ) goto columnar_end; 13140 switch( p->cMode ){ 13141 case MODE_Column: { 13142 colSep = " "; 13143 rowSep = "\n"; 13144 if( p->showHeader ){ 13145 for(i=0; i<nColumn; i++){ 13146 w = p->actualWidth[i]; 13147 if( p->colWidth[i]<0 ) w = -w; 13148 utf8_width_print(p->out, w, azData[i]); 13149 fputs(i==nColumn-1?"\n":" ", p->out); 13150 } 13151 for(i=0; i<nColumn; i++){ 13152 print_dashes(p->out, p->actualWidth[i]); 13153 fputs(i==nColumn-1?"\n":" ", p->out); 13154 } 13155 } 13156 break; 13157 } 13158 case MODE_Table: { 13159 colSep = " | "; 13160 rowSep = " |\n"; 13161 print_row_separator(p, nColumn, "+"); 13162 fputs("| ", p->out); 13163 for(i=0; i<nColumn; i++){ 13164 w = p->actualWidth[i]; 13165 n = strlenChar(azData[i]); 13166 utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, ""); 13167 fputs(i==nColumn-1?" |\n":" | ", p->out); 13168 } 13169 print_row_separator(p, nColumn, "+"); 13170 break; 13171 } 13172 case MODE_Markdown: { 13173 colSep = " | "; 13174 rowSep = " |\n"; 13175 fputs("| ", p->out); 13176 for(i=0; i<nColumn; i++){ 13177 w = p->actualWidth[i]; 13178 n = strlenChar(azData[i]); 13179 utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, ""); 13180 fputs(i==nColumn-1?" |\n":" | ", p->out); 13181 } 13182 print_row_separator(p, nColumn, "|"); 13183 break; 13184 } 13185 case MODE_Box: { 13186 colSep = " " BOX_13 " "; 13187 rowSep = " " BOX_13 "\n"; 13188 print_box_row_separator(p, nColumn, BOX_23, BOX_234, BOX_34); 13189 utf8_printf(p->out, BOX_13 " "); 13190 for(i=0; i<nColumn; i++){ 13191 w = p->actualWidth[i]; 13192 n = strlenChar(azData[i]); 13193 utf8_printf(p->out, "%*s%s%*s%s", 13194 (w-n)/2, "", azData[i], (w-n+1)/2, "", 13195 i==nColumn-1?" "BOX_13"\n":" "BOX_13" "); 13196 } 13197 print_box_row_separator(p, nColumn, BOX_123, BOX_1234, BOX_134); 13198 break; 13199 } 13200 } 13201 for(i=nColumn, j=0; i<nTotal; i++, j++){ 13202 if( j==0 && p->cMode!=MODE_Column ){ 13203 utf8_printf(p->out, "%s", p->cMode==MODE_Box?BOX_13" ":"| "); 13204 } 13205 z = azData[i]; 13206 if( z==0 ) z = p->nullValue; 13207 w = p->actualWidth[j]; 13208 if( p->colWidth[j]<0 ) w = -w; 13209 utf8_width_print(p->out, w, z); 13210 if( j==nColumn-1 ){ 13211 utf8_printf(p->out, "%s", rowSep); 13212 j = -1; 13213 if( seenInterrupt ) goto columnar_end; 13214 }else{ 13215 utf8_printf(p->out, "%s", colSep); 13216 } 13217 } 13218 if( p->cMode==MODE_Table ){ 13219 print_row_separator(p, nColumn, "+"); 13220 }else if( p->cMode==MODE_Box ){ 13221 print_box_row_separator(p, nColumn, BOX_12, BOX_124, BOX_14); 13222 } 13223 columnar_end: 13224 if( seenInterrupt ){ 13225 utf8_printf(p->out, "Interrupt\n"); 13226 } 13227 nData = (nRow+1)*nColumn; 13228 for(i=0; i<nData; i++) free(azData[i]); 13229 sqlite3_free(azData); 13230 } 13231 13232 /* 13233 ** Run a prepared statement 13234 */ 13235 static void exec_prepared_stmt( 13236 ShellState *pArg, /* Pointer to ShellState */ 13237 sqlite3_stmt *pStmt /* Statment to run */ 13238 ){ 13239 int rc; 13240 13241 if( pArg->cMode==MODE_Column 13242 || pArg->cMode==MODE_Table 13243 || pArg->cMode==MODE_Box 13244 || pArg->cMode==MODE_Markdown 13245 ){ 13246 exec_prepared_stmt_columnar(pArg, pStmt); 13247 return; 13248 } 13249 13250 /* perform the first step. this will tell us if we 13251 ** have a result set or not and how wide it is. 13252 */ 13253 rc = sqlite3_step(pStmt); 13254 /* if we have a result set... */ 13255 if( SQLITE_ROW == rc ){ 13256 /* allocate space for col name ptr, value ptr, and type */ 13257 int nCol = sqlite3_column_count(pStmt); 13258 void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1); 13259 if( !pData ){ 13260 rc = SQLITE_NOMEM; 13261 }else{ 13262 char **azCols = (char **)pData; /* Names of result columns */ 13263 char **azVals = &azCols[nCol]; /* Results */ 13264 int *aiTypes = (int *)&azVals[nCol]; /* Result types */ 13265 int i, x; 13266 assert(sizeof(int) <= sizeof(char *)); 13267 /* save off ptrs to column names */ 13268 for(i=0; i<nCol; i++){ 13269 azCols[i] = (char *)sqlite3_column_name(pStmt, i); 13270 } 13271 do{ 13272 /* extract the data and data types */ 13273 for(i=0; i<nCol; i++){ 13274 aiTypes[i] = x = sqlite3_column_type(pStmt, i); 13275 if( x==SQLITE_BLOB && pArg && pArg->cMode==MODE_Insert ){ 13276 azVals[i] = ""; 13277 }else{ 13278 azVals[i] = (char*)sqlite3_column_text(pStmt, i); 13279 } 13280 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){ 13281 rc = SQLITE_NOMEM; 13282 break; /* from for */ 13283 } 13284 } /* end for */ 13285 13286 /* if data and types extracted successfully... */ 13287 if( SQLITE_ROW == rc ){ 13288 /* call the supplied callback with the result row data */ 13289 if( shell_callback(pArg, nCol, azVals, azCols, aiTypes) ){ 13290 rc = SQLITE_ABORT; 13291 }else{ 13292 rc = sqlite3_step(pStmt); 13293 } 13294 } 13295 } while( SQLITE_ROW == rc ); 13296 sqlite3_free(pData); 13297 if( pArg->cMode==MODE_Json ){ 13298 fputs("]\n", pArg->out); 13299 } 13300 } 13301 } 13302 } 13303 13304 #ifndef SQLITE_OMIT_VIRTUALTABLE 13305 /* 13306 ** This function is called to process SQL if the previous shell command 13307 ** was ".expert". It passes the SQL in the second argument directly to 13308 ** the sqlite3expert object. 13309 ** 13310 ** If successful, SQLITE_OK is returned. Otherwise, an SQLite error 13311 ** code. In this case, (*pzErr) may be set to point to a buffer containing 13312 ** an English language error message. It is the responsibility of the 13313 ** caller to eventually free this buffer using sqlite3_free(). 13314 */ 13315 static int expertHandleSQL( 13316 ShellState *pState, 13317 const char *zSql, 13318 char **pzErr 13319 ){ 13320 assert( pState->expert.pExpert ); 13321 assert( pzErr==0 || *pzErr==0 ); 13322 return sqlite3_expert_sql(pState->expert.pExpert, zSql, pzErr); 13323 } 13324 13325 /* 13326 ** This function is called either to silently clean up the object 13327 ** created by the ".expert" command (if bCancel==1), or to generate a 13328 ** report from it and then clean it up (if bCancel==0). 13329 ** 13330 ** If successful, SQLITE_OK is returned. Otherwise, an SQLite error 13331 ** code. In this case, (*pzErr) may be set to point to a buffer containing 13332 ** an English language error message. It is the responsibility of the 13333 ** caller to eventually free this buffer using sqlite3_free(). 13334 */ 13335 static int expertFinish( 13336 ShellState *pState, 13337 int bCancel, 13338 char **pzErr 13339 ){ 13340 int rc = SQLITE_OK; 13341 sqlite3expert *p = pState->expert.pExpert; 13342 assert( p ); 13343 assert( bCancel || pzErr==0 || *pzErr==0 ); 13344 if( bCancel==0 ){ 13345 FILE *out = pState->out; 13346 int bVerbose = pState->expert.bVerbose; 13347 13348 rc = sqlite3_expert_analyze(p, pzErr); 13349 if( rc==SQLITE_OK ){ 13350 int nQuery = sqlite3_expert_count(p); 13351 int i; 13352 13353 if( bVerbose ){ 13354 const char *zCand = sqlite3_expert_report(p,0,EXPERT_REPORT_CANDIDATES); 13355 raw_printf(out, "-- Candidates -----------------------------\n"); 13356 raw_printf(out, "%s\n", zCand); 13357 } 13358 for(i=0; i<nQuery; i++){ 13359 const char *zSql = sqlite3_expert_report(p, i, EXPERT_REPORT_SQL); 13360 const char *zIdx = sqlite3_expert_report(p, i, EXPERT_REPORT_INDEXES); 13361 const char *zEQP = sqlite3_expert_report(p, i, EXPERT_REPORT_PLAN); 13362 if( zIdx==0 ) zIdx = "(no new indexes)\n"; 13363 if( bVerbose ){ 13364 raw_printf(out, "-- Query %d --------------------------------\n",i+1); 13365 raw_printf(out, "%s\n\n", zSql); 13366 } 13367 raw_printf(out, "%s\n", zIdx); 13368 raw_printf(out, "%s\n", zEQP); 13369 } 13370 } 13371 } 13372 sqlite3_expert_destroy(p); 13373 pState->expert.pExpert = 0; 13374 return rc; 13375 } 13376 13377 /* 13378 ** Implementation of ".expert" dot command. 13379 */ 13380 static int expertDotCommand( 13381 ShellState *pState, /* Current shell tool state */ 13382 char **azArg, /* Array of arguments passed to dot command */ 13383 int nArg /* Number of entries in azArg[] */ 13384 ){ 13385 int rc = SQLITE_OK; 13386 char *zErr = 0; 13387 int i; 13388 int iSample = 0; 13389 13390 assert( pState->expert.pExpert==0 ); 13391 memset(&pState->expert, 0, sizeof(ExpertInfo)); 13392 13393 for(i=1; rc==SQLITE_OK && i<nArg; i++){ 13394 char *z = azArg[i]; 13395 int n; 13396 if( z[0]=='-' && z[1]=='-' ) z++; 13397 n = strlen30(z); 13398 if( n>=2 && 0==strncmp(z, "-verbose", n) ){ 13399 pState->expert.bVerbose = 1; 13400 } 13401 else if( n>=2 && 0==strncmp(z, "-sample", n) ){ 13402 if( i==(nArg-1) ){ 13403 raw_printf(stderr, "option requires an argument: %s\n", z); 13404 rc = SQLITE_ERROR; 13405 }else{ 13406 iSample = (int)integerValue(azArg[++i]); 13407 if( iSample<0 || iSample>100 ){ 13408 raw_printf(stderr, "value out of range: %s\n", azArg[i]); 13409 rc = SQLITE_ERROR; 13410 } 13411 } 13412 } 13413 else{ 13414 raw_printf(stderr, "unknown option: %s\n", z); 13415 rc = SQLITE_ERROR; 13416 } 13417 } 13418 13419 if( rc==SQLITE_OK ){ 13420 pState->expert.pExpert = sqlite3_expert_new(pState->db, &zErr); 13421 if( pState->expert.pExpert==0 ){ 13422 raw_printf(stderr, "sqlite3_expert_new: %s\n", zErr); 13423 rc = SQLITE_ERROR; 13424 }else{ 13425 sqlite3_expert_config( 13426 pState->expert.pExpert, EXPERT_CONFIG_SAMPLE, iSample 13427 ); 13428 } 13429 } 13430 13431 return rc; 13432 } 13433 #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */ 13434 13435 /* 13436 ** Execute a statement or set of statements. Print 13437 ** any result rows/columns depending on the current mode 13438 ** set via the supplied callback. 13439 ** 13440 ** This is very similar to SQLite's built-in sqlite3_exec() 13441 ** function except it takes a slightly different callback 13442 ** and callback data argument. 13443 */ 13444 static int shell_exec( 13445 ShellState *pArg, /* Pointer to ShellState */ 13446 const char *zSql, /* SQL to be evaluated */ 13447 char **pzErrMsg /* Error msg written here */ 13448 ){ 13449 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */ 13450 int rc = SQLITE_OK; /* Return Code */ 13451 int rc2; 13452 const char *zLeftover; /* Tail of unprocessed SQL */ 13453 sqlite3 *db = pArg->db; 13454 13455 if( pzErrMsg ){ 13456 *pzErrMsg = NULL; 13457 } 13458 13459 #ifndef SQLITE_OMIT_VIRTUALTABLE 13460 if( pArg->expert.pExpert ){ 13461 rc = expertHandleSQL(pArg, zSql, pzErrMsg); 13462 return expertFinish(pArg, (rc!=SQLITE_OK), pzErrMsg); 13463 } 13464 #endif 13465 13466 while( zSql[0] && (SQLITE_OK == rc) ){ 13467 static const char *zStmtSql; 13468 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover); 13469 if( SQLITE_OK != rc ){ 13470 if( pzErrMsg ){ 13471 *pzErrMsg = save_err_msg(db); 13472 } 13473 }else{ 13474 if( !pStmt ){ 13475 /* this happens for a comment or white-space */ 13476 zSql = zLeftover; 13477 while( IsSpace(zSql[0]) ) zSql++; 13478 continue; 13479 } 13480 zStmtSql = sqlite3_sql(pStmt); 13481 if( zStmtSql==0 ) zStmtSql = ""; 13482 while( IsSpace(zStmtSql[0]) ) zStmtSql++; 13483 13484 /* save off the prepared statment handle and reset row count */ 13485 if( pArg ){ 13486 pArg->pStmt = pStmt; 13487 pArg->cnt = 0; 13488 } 13489 13490 /* echo the sql statement if echo on */ 13491 if( pArg && ShellHasFlag(pArg, SHFLG_Echo) ){ 13492 utf8_printf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql); 13493 } 13494 13495 /* Show the EXPLAIN QUERY PLAN if .eqp is on */ 13496 if( pArg && pArg->autoEQP && sqlite3_stmt_isexplain(pStmt)==0 ){ 13497 sqlite3_stmt *pExplain; 13498 char *zEQP; 13499 int triggerEQP = 0; 13500 disable_debug_trace_modes(); 13501 sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, -1, &triggerEQP); 13502 if( pArg->autoEQP>=AUTOEQP_trigger ){ 13503 sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 1, 0); 13504 } 13505 zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", zStmtSql); 13506 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0); 13507 if( rc==SQLITE_OK ){ 13508 while( sqlite3_step(pExplain)==SQLITE_ROW ){ 13509 const char *zEQPLine = (const char*)sqlite3_column_text(pExplain,3); 13510 int iEqpId = sqlite3_column_int(pExplain, 0); 13511 int iParentId = sqlite3_column_int(pExplain, 1); 13512 if( zEQPLine==0 ) zEQPLine = ""; 13513 if( zEQPLine[0]=='-' ) eqp_render(pArg); 13514 eqp_append(pArg, iEqpId, iParentId, zEQPLine); 13515 } 13516 eqp_render(pArg); 13517 } 13518 sqlite3_finalize(pExplain); 13519 sqlite3_free(zEQP); 13520 if( pArg->autoEQP>=AUTOEQP_full ){ 13521 /* Also do an EXPLAIN for ".eqp full" mode */ 13522 zEQP = sqlite3_mprintf("EXPLAIN %s", zStmtSql); 13523 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0); 13524 if( rc==SQLITE_OK ){ 13525 pArg->cMode = MODE_Explain; 13526 explain_data_prepare(pArg, pExplain); 13527 exec_prepared_stmt(pArg, pExplain); 13528 explain_data_delete(pArg); 13529 } 13530 sqlite3_finalize(pExplain); 13531 sqlite3_free(zEQP); 13532 } 13533 if( pArg->autoEQP>=AUTOEQP_trigger && triggerEQP==0 ){ 13534 sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 0, 0); 13535 /* Reprepare pStmt before reactiving trace modes */ 13536 sqlite3_finalize(pStmt); 13537 sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); 13538 if( pArg ) pArg->pStmt = pStmt; 13539 } 13540 restore_debug_trace_modes(); 13541 } 13542 13543 if( pArg ){ 13544 pArg->cMode = pArg->mode; 13545 if( pArg->autoExplain ){ 13546 if( sqlite3_stmt_isexplain(pStmt)==1 ){ 13547 pArg->cMode = MODE_Explain; 13548 } 13549 if( sqlite3_stmt_isexplain(pStmt)==2 ){ 13550 pArg->cMode = MODE_EQP; 13551 } 13552 } 13553 13554 /* If the shell is currently in ".explain" mode, gather the extra 13555 ** data required to add indents to the output.*/ 13556 if( pArg->cMode==MODE_Explain ){ 13557 explain_data_prepare(pArg, pStmt); 13558 } 13559 } 13560 13561 bind_prepared_stmt(pArg, pStmt); 13562 exec_prepared_stmt(pArg, pStmt); 13563 explain_data_delete(pArg); 13564 eqp_render(pArg); 13565 13566 /* print usage stats if stats on */ 13567 if( pArg && pArg->statsOn ){ 13568 display_stats(db, pArg, 0); 13569 } 13570 13571 /* print loop-counters if required */ 13572 if( pArg && pArg->scanstatsOn ){ 13573 display_scanstats(db, pArg); 13574 } 13575 13576 /* Finalize the statement just executed. If this fails, save a 13577 ** copy of the error message. Otherwise, set zSql to point to the 13578 ** next statement to execute. */ 13579 rc2 = sqlite3_finalize(pStmt); 13580 if( rc!=SQLITE_NOMEM ) rc = rc2; 13581 if( rc==SQLITE_OK ){ 13582 zSql = zLeftover; 13583 while( IsSpace(zSql[0]) ) zSql++; 13584 }else if( pzErrMsg ){ 13585 *pzErrMsg = save_err_msg(db); 13586 } 13587 13588 /* clear saved stmt handle */ 13589 if( pArg ){ 13590 pArg->pStmt = NULL; 13591 } 13592 } 13593 } /* end while */ 13594 13595 return rc; 13596 } 13597 13598 /* 13599 ** Release memory previously allocated by tableColumnList(). 13600 */ 13601 static void freeColumnList(char **azCol){ 13602 int i; 13603 for(i=1; azCol[i]; i++){ 13604 sqlite3_free(azCol[i]); 13605 } 13606 /* azCol[0] is a static string */ 13607 sqlite3_free(azCol); 13608 } 13609 13610 /* 13611 ** Return a list of pointers to strings which are the names of all 13612 ** columns in table zTab. The memory to hold the names is dynamically 13613 ** allocated and must be released by the caller using a subsequent call 13614 ** to freeColumnList(). 13615 ** 13616 ** The azCol[0] entry is usually NULL. However, if zTab contains a rowid 13617 ** value that needs to be preserved, then azCol[0] is filled in with the 13618 ** name of the rowid column. 13619 ** 13620 ** The first regular column in the table is azCol[1]. The list is terminated 13621 ** by an entry with azCol[i]==0. 13622 */ 13623 static char **tableColumnList(ShellState *p, const char *zTab){ 13624 char **azCol = 0; 13625 sqlite3_stmt *pStmt; 13626 char *zSql; 13627 int nCol = 0; 13628 int nAlloc = 0; 13629 int nPK = 0; /* Number of PRIMARY KEY columns seen */ 13630 int isIPK = 0; /* True if one PRIMARY KEY column of type INTEGER */ 13631 int preserveRowid = ShellHasFlag(p, SHFLG_PreserveRowid); 13632 int rc; 13633 13634 zSql = sqlite3_mprintf("PRAGMA table_info=%Q", zTab); 13635 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 13636 sqlite3_free(zSql); 13637 if( rc ) return 0; 13638 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 13639 if( nCol>=nAlloc-2 ){ 13640 nAlloc = nAlloc*2 + nCol + 10; 13641 azCol = sqlite3_realloc(azCol, nAlloc*sizeof(azCol[0])); 13642 if( azCol==0 ) shell_out_of_memory(); 13643 } 13644 azCol[++nCol] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 1)); 13645 if( sqlite3_column_int(pStmt, 5) ){ 13646 nPK++; 13647 if( nPK==1 13648 && sqlite3_stricmp((const char*)sqlite3_column_text(pStmt,2), 13649 "INTEGER")==0 13650 ){ 13651 isIPK = 1; 13652 }else{ 13653 isIPK = 0; 13654 } 13655 } 13656 } 13657 sqlite3_finalize(pStmt); 13658 if( azCol==0 ) return 0; 13659 azCol[0] = 0; 13660 azCol[nCol+1] = 0; 13661 13662 /* The decision of whether or not a rowid really needs to be preserved 13663 ** is tricky. We never need to preserve a rowid for a WITHOUT ROWID table 13664 ** or a table with an INTEGER PRIMARY KEY. We are unable to preserve 13665 ** rowids on tables where the rowid is inaccessible because there are other 13666 ** columns in the table named "rowid", "_rowid_", and "oid". 13667 */ 13668 if( preserveRowid && isIPK ){ 13669 /* If a single PRIMARY KEY column with type INTEGER was seen, then it 13670 ** might be an alise for the ROWID. But it might also be a WITHOUT ROWID 13671 ** table or a INTEGER PRIMARY KEY DESC column, neither of which are 13672 ** ROWID aliases. To distinguish these cases, check to see if 13673 ** there is a "pk" entry in "PRAGMA index_list". There will be 13674 ** no "pk" index if the PRIMARY KEY really is an alias for the ROWID. 13675 */ 13676 zSql = sqlite3_mprintf("SELECT 1 FROM pragma_index_list(%Q)" 13677 " WHERE origin='pk'", zTab); 13678 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 13679 sqlite3_free(zSql); 13680 if( rc ){ 13681 freeColumnList(azCol); 13682 return 0; 13683 } 13684 rc = sqlite3_step(pStmt); 13685 sqlite3_finalize(pStmt); 13686 preserveRowid = rc==SQLITE_ROW; 13687 } 13688 if( preserveRowid ){ 13689 /* Only preserve the rowid if we can find a name to use for the 13690 ** rowid */ 13691 static char *azRowid[] = { "rowid", "_rowid_", "oid" }; 13692 int i, j; 13693 for(j=0; j<3; j++){ 13694 for(i=1; i<=nCol; i++){ 13695 if( sqlite3_stricmp(azRowid[j],azCol[i])==0 ) break; 13696 } 13697 if( i>nCol ){ 13698 /* At this point, we know that azRowid[j] is not the name of any 13699 ** ordinary column in the table. Verify that azRowid[j] is a valid 13700 ** name for the rowid before adding it to azCol[0]. WITHOUT ROWID 13701 ** tables will fail this last check */ 13702 rc = sqlite3_table_column_metadata(p->db,0,zTab,azRowid[j],0,0,0,0,0); 13703 if( rc==SQLITE_OK ) azCol[0] = azRowid[j]; 13704 break; 13705 } 13706 } 13707 } 13708 return azCol; 13709 } 13710 13711 /* 13712 ** Toggle the reverse_unordered_selects setting. 13713 */ 13714 static void toggleSelectOrder(sqlite3 *db){ 13715 sqlite3_stmt *pStmt = 0; 13716 int iSetting = 0; 13717 char zStmt[100]; 13718 sqlite3_prepare_v2(db, "PRAGMA reverse_unordered_selects", -1, &pStmt, 0); 13719 if( sqlite3_step(pStmt)==SQLITE_ROW ){ 13720 iSetting = sqlite3_column_int(pStmt, 0); 13721 } 13722 sqlite3_finalize(pStmt); 13723 sqlite3_snprintf(sizeof(zStmt), zStmt, 13724 "PRAGMA reverse_unordered_selects(%d)", !iSetting); 13725 sqlite3_exec(db, zStmt, 0, 0, 0); 13726 } 13727 13728 /* 13729 ** This is a different callback routine used for dumping the database. 13730 ** Each row received by this callback consists of a table name, 13731 ** the table type ("index" or "table") and SQL to create the table. 13732 ** This routine should print text sufficient to recreate the table. 13733 */ 13734 static int dump_callback(void *pArg, int nArg, char **azArg, char **azNotUsed){ 13735 int rc; 13736 const char *zTable; 13737 const char *zType; 13738 const char *zSql; 13739 ShellState *p = (ShellState *)pArg; 13740 int dataOnly; 13741 int noSys; 13742 13743 UNUSED_PARAMETER(azNotUsed); 13744 if( nArg!=3 || azArg==0 ) return 0; 13745 zTable = azArg[0]; 13746 zType = azArg[1]; 13747 zSql = azArg[2]; 13748 dataOnly = (p->shellFlgs & SHFLG_DumpDataOnly)!=0; 13749 noSys = (p->shellFlgs & SHFLG_DumpNoSys)!=0; 13750 13751 if( strcmp(zTable, "sqlite_sequence")==0 && !noSys ){ 13752 if( !dataOnly ) raw_printf(p->out, "DELETE FROM sqlite_sequence;\n"); 13753 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 && !noSys ){ 13754 if( !dataOnly ) raw_printf(p->out, "ANALYZE sqlite_schema;\n"); 13755 }else if( strncmp(zTable, "sqlite_", 7)==0 ){ 13756 return 0; 13757 }else if( dataOnly ){ 13758 /* no-op */ 13759 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){ 13760 char *zIns; 13761 if( !p->writableSchema ){ 13762 raw_printf(p->out, "PRAGMA writable_schema=ON;\n"); 13763 p->writableSchema = 1; 13764 } 13765 zIns = sqlite3_mprintf( 13766 "INSERT INTO sqlite_schema(type,name,tbl_name,rootpage,sql)" 13767 "VALUES('table','%q','%q',0,'%q');", 13768 zTable, zTable, zSql); 13769 utf8_printf(p->out, "%s\n", zIns); 13770 sqlite3_free(zIns); 13771 return 0; 13772 }else{ 13773 printSchemaLine(p->out, zSql, ";\n"); 13774 } 13775 13776 if( strcmp(zType, "table")==0 ){ 13777 ShellText sSelect; 13778 ShellText sTable; 13779 char **azCol; 13780 int i; 13781 char *savedDestTable; 13782 int savedMode; 13783 13784 azCol = tableColumnList(p, zTable); 13785 if( azCol==0 ){ 13786 p->nErr++; 13787 return 0; 13788 } 13789 13790 /* Always quote the table name, even if it appears to be pure ascii, 13791 ** in case it is a keyword. Ex: INSERT INTO "table" ... */ 13792 initText(&sTable); 13793 appendText(&sTable, zTable, quoteChar(zTable)); 13794 /* If preserving the rowid, add a column list after the table name. 13795 ** In other words: "INSERT INTO tab(rowid,a,b,c,...) VALUES(...)" 13796 ** instead of the usual "INSERT INTO tab VALUES(...)". 13797 */ 13798 if( azCol[0] ){ 13799 appendText(&sTable, "(", 0); 13800 appendText(&sTable, azCol[0], 0); 13801 for(i=1; azCol[i]; i++){ 13802 appendText(&sTable, ",", 0); 13803 appendText(&sTable, azCol[i], quoteChar(azCol[i])); 13804 } 13805 appendText(&sTable, ")", 0); 13806 } 13807 13808 /* Build an appropriate SELECT statement */ 13809 initText(&sSelect); 13810 appendText(&sSelect, "SELECT ", 0); 13811 if( azCol[0] ){ 13812 appendText(&sSelect, azCol[0], 0); 13813 appendText(&sSelect, ",", 0); 13814 } 13815 for(i=1; azCol[i]; i++){ 13816 appendText(&sSelect, azCol[i], quoteChar(azCol[i])); 13817 if( azCol[i+1] ){ 13818 appendText(&sSelect, ",", 0); 13819 } 13820 } 13821 freeColumnList(azCol); 13822 appendText(&sSelect, " FROM ", 0); 13823 appendText(&sSelect, zTable, quoteChar(zTable)); 13824 13825 savedDestTable = p->zDestTable; 13826 savedMode = p->mode; 13827 p->zDestTable = sTable.z; 13828 p->mode = p->cMode = MODE_Insert; 13829 rc = shell_exec(p, sSelect.z, 0); 13830 if( (rc&0xff)==SQLITE_CORRUPT ){ 13831 raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n"); 13832 toggleSelectOrder(p->db); 13833 shell_exec(p, sSelect.z, 0); 13834 toggleSelectOrder(p->db); 13835 } 13836 p->zDestTable = savedDestTable; 13837 p->mode = savedMode; 13838 freeText(&sTable); 13839 freeText(&sSelect); 13840 if( rc ) p->nErr++; 13841 } 13842 return 0; 13843 } 13844 13845 /* 13846 ** Run zQuery. Use dump_callback() as the callback routine so that 13847 ** the contents of the query are output as SQL statements. 13848 ** 13849 ** If we get a SQLITE_CORRUPT error, rerun the query after appending 13850 ** "ORDER BY rowid DESC" to the end. 13851 */ 13852 static int run_schema_dump_query( 13853 ShellState *p, 13854 const char *zQuery 13855 ){ 13856 int rc; 13857 char *zErr = 0; 13858 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr); 13859 if( rc==SQLITE_CORRUPT ){ 13860 char *zQ2; 13861 int len = strlen30(zQuery); 13862 raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n"); 13863 if( zErr ){ 13864 utf8_printf(p->out, "/****** %s ******/\n", zErr); 13865 sqlite3_free(zErr); 13866 zErr = 0; 13867 } 13868 zQ2 = malloc( len+100 ); 13869 if( zQ2==0 ) return rc; 13870 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery); 13871 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr); 13872 if( rc ){ 13873 utf8_printf(p->out, "/****** ERROR: %s ******/\n", zErr); 13874 }else{ 13875 rc = SQLITE_CORRUPT; 13876 } 13877 sqlite3_free(zErr); 13878 free(zQ2); 13879 } 13880 return rc; 13881 } 13882 13883 /* 13884 ** Text of help messages. 13885 ** 13886 ** The help text for each individual command begins with a line that starts 13887 ** with ".". Subsequent lines are supplimental information. 13888 ** 13889 ** There must be two or more spaces between the end of the command and the 13890 ** start of the description of what that command does. 13891 */ 13892 static const char *(azHelp[]) = { 13893 #if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE) 13894 ".archive ... Manage SQL archives", 13895 " Each command must have exactly one of the following options:", 13896 " -c, --create Create a new archive", 13897 " -u, --update Add or update files with changed mtime", 13898 " -i, --insert Like -u but always add even if unchanged", 13899 " -t, --list List contents of archive", 13900 " -x, --extract Extract files from archive", 13901 " Optional arguments:", 13902 " -v, --verbose Print each filename as it is processed", 13903 " -f FILE, --file FILE Use archive FILE (default is current db)", 13904 " -a FILE, --append FILE Open FILE using the apndvfs VFS", 13905 " -C DIR, --directory DIR Read/extract files from directory DIR", 13906 " -n, --dryrun Show the SQL that would have occurred", 13907 " Examples:", 13908 " .ar -cf ARCHIVE foo bar # Create ARCHIVE from files foo and bar", 13909 " .ar -tf ARCHIVE # List members of ARCHIVE", 13910 " .ar -xvf ARCHIVE # Verbosely extract files from ARCHIVE", 13911 " See also:", 13912 " http://sqlite.org/cli.html#sqlar_archive_support", 13913 #endif 13914 #ifndef SQLITE_OMIT_AUTHORIZATION 13915 ".auth ON|OFF Show authorizer callbacks", 13916 #endif 13917 ".backup ?DB? FILE Backup DB (default \"main\") to FILE", 13918 " --append Use the appendvfs", 13919 " --async Write to FILE without journal and fsync()", 13920 ".bail on|off Stop after hitting an error. Default OFF", 13921 ".binary on|off Turn binary output on or off. Default OFF", 13922 ".cd DIRECTORY Change the working directory to DIRECTORY", 13923 ".changes on|off Show number of rows changed by SQL", 13924 ".check GLOB Fail if output since .testcase does not match", 13925 ".clone NEWDB Clone data into NEWDB from the existing database", 13926 ".databases List names and files of attached databases", 13927 ".dbconfig ?op? ?val? List or change sqlite3_db_config() options", 13928 ".dbinfo ?DB? Show status information about the database", 13929 ".dump ?TABLE? Render database content as SQL", 13930 " Options:", 13931 " --data-only Output only INSERT statements", 13932 " --newlines Allow unescaped newline characters in output", 13933 " --nosys Omit system tables (ex: \"sqlite_stat1\")", 13934 " --preserve-rowids Include ROWID values in the output", 13935 " TABLE is a LIKE pattern for the tables to dump", 13936 " Additional LIKE patterns can be given in subsequent arguments", 13937 ".echo on|off Turn command echo on or off", 13938 ".eqp on|off|full|... Enable or disable automatic EXPLAIN QUERY PLAN", 13939 " Other Modes:", 13940 #ifdef SQLITE_DEBUG 13941 " test Show raw EXPLAIN QUERY PLAN output", 13942 " trace Like \"full\" but enable \"PRAGMA vdbe_trace\"", 13943 #endif 13944 " trigger Like \"full\" but also show trigger bytecode", 13945 ".excel Display the output of next command in spreadsheet", 13946 " --bom Put a UTF8 byte-order mark on intermediate file", 13947 ".exit ?CODE? Exit this program with return-code CODE", 13948 ".expert EXPERIMENTAL. Suggest indexes for queries", 13949 ".explain ?on|off|auto? Change the EXPLAIN formatting mode. Default: auto", 13950 ".filectrl CMD ... Run various sqlite3_file_control() operations", 13951 " --schema SCHEMA Use SCHEMA instead of \"main\"", 13952 " --help Show CMD details", 13953 ".fullschema ?--indent? Show schema and the content of sqlite_stat tables", 13954 ".headers on|off Turn display of headers on or off", 13955 ".help ?-all? ?PATTERN? Show help text for PATTERN", 13956 ".import FILE TABLE Import data from FILE into TABLE", 13957 " Options:", 13958 " --ascii Use \\037 and \\036 as column and row separators", 13959 " --csv Use , and \\n as column and row separators", 13960 " --skip N Skip the first N rows of input", 13961 " -v \"Verbose\" - increase auxiliary output", 13962 " Notes:", 13963 " * If TABLE does not exist, it is created. The first row of input", 13964 " determines the column names.", 13965 " * If neither --csv or --ascii are used, the input mode is derived", 13966 " from the \".mode\" output mode", 13967 " * If FILE begins with \"|\" then it is a command that generates the", 13968 " input text.", 13969 #ifndef SQLITE_OMIT_TEST_CONTROL 13970 ".imposter INDEX TABLE Create imposter table TABLE on index INDEX", 13971 #endif 13972 ".indexes ?TABLE? Show names of indexes", 13973 " If TABLE is specified, only show indexes for", 13974 " tables matching TABLE using the LIKE operator.", 13975 #ifdef SQLITE_ENABLE_IOTRACE 13976 ".iotrace FILE Enable I/O diagnostic logging to FILE", 13977 #endif 13978 ".limit ?LIMIT? ?VAL? Display or change the value of an SQLITE_LIMIT", 13979 ".lint OPTIONS Report potential schema issues.", 13980 " Options:", 13981 " fkey-indexes Find missing foreign key indexes", 13982 #ifndef SQLITE_OMIT_LOAD_EXTENSION 13983 ".load FILE ?ENTRY? Load an extension library", 13984 #endif 13985 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout", 13986 ".mode MODE ?TABLE? Set output mode", 13987 " MODE is one of:", 13988 " ascii Columns/rows delimited by 0x1F and 0x1E", 13989 " box Tables using unicode box-drawing characters", 13990 " csv Comma-separated values", 13991 " column Output in columns. (See .width)", 13992 " html HTML <table> code", 13993 " insert SQL insert statements for TABLE", 13994 " json Results in a JSON array", 13995 " line One value per line", 13996 " list Values delimited by \"|\"", 13997 " markdown Markdown table format", 13998 " quote Escape answers as for SQL", 13999 " table ASCII-art table", 14000 " tabs Tab-separated values", 14001 " tcl TCL list elements", 14002 ".nullvalue STRING Use STRING in place of NULL values", 14003 ".once ?OPTIONS? ?FILE? Output for the next SQL command only to FILE", 14004 " If FILE begins with '|' then open as a pipe", 14005 " --bom Put a UTF8 byte-order mark at the beginning", 14006 " -e Send output to the system text editor", 14007 " -x Send output as CSV to a spreadsheet (same as \".excel\")", 14008 #ifdef SQLITE_DEBUG 14009 ".oom ?--repeat M? ?N? Simulate an OOM error on the N-th allocation", 14010 #endif 14011 ".open ?OPTIONS? ?FILE? Close existing database and reopen FILE", 14012 " Options:", 14013 " --append Use appendvfs to append database to the end of FILE", 14014 #ifdef SQLITE_ENABLE_DESERIALIZE 14015 " --deserialize Load into memory useing sqlite3_deserialize()", 14016 " --hexdb Load the output of \"dbtotxt\" as an in-memory db", 14017 " --maxsize N Maximum size for --hexdb or --deserialized database", 14018 #endif 14019 " --new Initialize FILE to an empty database", 14020 " --nofollow Do not follow symbolic links", 14021 " --readonly Open FILE readonly", 14022 " --zip FILE is a ZIP archive", 14023 ".output ?FILE? Send output to FILE or stdout if FILE is omitted", 14024 " If FILE begins with '|' then open it as a pipe.", 14025 " Options:", 14026 " --bom Prefix output with a UTF8 byte-order mark", 14027 " -e Send output to the system text editor", 14028 " -x Send output as CSV to a spreadsheet", 14029 ".parameter CMD ... Manage SQL parameter bindings", 14030 " clear Erase all bindings", 14031 " init Initialize the TEMP table that holds bindings", 14032 " list List the current parameter bindings", 14033 " set PARAMETER VALUE Given SQL parameter PARAMETER a value of VALUE", 14034 " PARAMETER should start with one of: $ : @ ?", 14035 " unset PARAMETER Remove PARAMETER from the binding table", 14036 ".print STRING... Print literal STRING", 14037 #ifndef SQLITE_OMIT_PROGRESS_CALLBACK 14038 ".progress N Invoke progress handler after every N opcodes", 14039 " --limit N Interrupt after N progress callbacks", 14040 " --once Do no more than one progress interrupt", 14041 " --quiet|-q No output except at interrupts", 14042 " --reset Reset the count for each input and interrupt", 14043 #endif 14044 ".prompt MAIN CONTINUE Replace the standard prompts", 14045 ".quit Exit this program", 14046 ".read FILE Read input from FILE", 14047 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) 14048 ".recover Recover as much data as possible from corrupt db.", 14049 " --freelist-corrupt Assume the freelist is corrupt", 14050 " --recovery-db NAME Store recovery metadata in database file NAME", 14051 " --lost-and-found TABLE Alternative name for the lost-and-found table", 14052 " --no-rowids Do not attempt to recover rowid values", 14053 " that are not also INTEGER PRIMARY KEYs", 14054 #endif 14055 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE", 14056 ".save FILE Write in-memory database into FILE", 14057 ".scanstats on|off Turn sqlite3_stmt_scanstatus() metrics on or off", 14058 ".schema ?PATTERN? Show the CREATE statements matching PATTERN", 14059 " Options:", 14060 " --indent Try to pretty-print the schema", 14061 " --nosys Omit objects whose names start with \"sqlite_\"", 14062 ".selftest ?OPTIONS? Run tests defined in the SELFTEST table", 14063 " Options:", 14064 " --init Create a new SELFTEST table", 14065 " -v Verbose output", 14066 ".separator COL ?ROW? Change the column and row separators", 14067 #if defined(SQLITE_ENABLE_SESSION) 14068 ".session ?NAME? CMD ... Create or control sessions", 14069 " Subcommands:", 14070 " attach TABLE Attach TABLE", 14071 " changeset FILE Write a changeset into FILE", 14072 " close Close one session", 14073 " enable ?BOOLEAN? Set or query the enable bit", 14074 " filter GLOB... Reject tables matching GLOBs", 14075 " indirect ?BOOLEAN? Mark or query the indirect status", 14076 " isempty Query whether the session is empty", 14077 " list List currently open session names", 14078 " open DB NAME Open a new session on DB", 14079 " patchset FILE Write a patchset into FILE", 14080 " If ?NAME? is omitted, the first defined session is used.", 14081 #endif 14082 ".sha3sum ... Compute a SHA3 hash of database content", 14083 " Options:", 14084 " --schema Also hash the sqlite_schema table", 14085 " --sha3-224 Use the sha3-224 algorithm", 14086 " --sha3-256 Use the sha3-256 algorithm (default)", 14087 " --sha3-384 Use the sha3-384 algorithm", 14088 " --sha3-512 Use the sha3-512 algorithm", 14089 " Any other argument is a LIKE pattern for tables to hash", 14090 #ifndef SQLITE_NOHAVE_SYSTEM 14091 ".shell CMD ARGS... Run CMD ARGS... in a system shell", 14092 #endif 14093 ".show Show the current values for various settings", 14094 ".stats ?on|off? Show stats or turn stats on or off", 14095 #ifndef SQLITE_NOHAVE_SYSTEM 14096 ".system CMD ARGS... Run CMD ARGS... in a system shell", 14097 #endif 14098 ".tables ?TABLE? List names of tables matching LIKE pattern TABLE", 14099 ".testcase NAME Begin redirecting output to 'testcase-out.txt'", 14100 ".testctrl CMD ... Run various sqlite3_test_control() operations", 14101 " Run \".testctrl\" with no arguments for details", 14102 ".timeout MS Try opening locked tables for MS milliseconds", 14103 ".timer on|off Turn SQL timer on or off", 14104 #ifndef SQLITE_OMIT_TRACE 14105 ".trace ?OPTIONS? Output each SQL statement as it is run", 14106 " FILE Send output to FILE", 14107 " stdout Send output to stdout", 14108 " stderr Send output to stderr", 14109 " off Disable tracing", 14110 " --expanded Expand query parameters", 14111 #ifdef SQLITE_ENABLE_NORMALIZE 14112 " --normalized Normal the SQL statements", 14113 #endif 14114 " --plain Show SQL as it is input", 14115 " --stmt Trace statement execution (SQLITE_TRACE_STMT)", 14116 " --profile Profile statements (SQLITE_TRACE_PROFILE)", 14117 " --row Trace each row (SQLITE_TRACE_ROW)", 14118 " --close Trace connection close (SQLITE_TRACE_CLOSE)", 14119 #endif /* SQLITE_OMIT_TRACE */ 14120 #ifdef SQLITE_DEBUG 14121 ".unmodule NAME ... Unregister virtual table modules", 14122 " --allexcept Unregister everything except those named", 14123 #endif 14124 ".vfsinfo ?AUX? Information about the top-level VFS", 14125 ".vfslist List all available VFSes", 14126 ".vfsname ?AUX? Print the name of the VFS stack", 14127 ".width NUM1 NUM2 ... Set minimum column widths for columnar output", 14128 " Negative values right-justify", 14129 }; 14130 14131 /* 14132 ** Output help text. 14133 ** 14134 ** zPattern describes the set of commands for which help text is provided. 14135 ** If zPattern is NULL, then show all commands, but only give a one-line 14136 ** description of each. 14137 ** 14138 ** Return the number of matches. 14139 */ 14140 static int showHelp(FILE *out, const char *zPattern){ 14141 int i = 0; 14142 int j = 0; 14143 int n = 0; 14144 char *zPat; 14145 if( zPattern==0 14146 || zPattern[0]=='0' 14147 || strcmp(zPattern,"-a")==0 14148 || strcmp(zPattern,"-all")==0 14149 || strcmp(zPattern,"--all")==0 14150 ){ 14151 /* Show all commands, but only one line per command */ 14152 if( zPattern==0 ) zPattern = ""; 14153 for(i=0; i<ArraySize(azHelp); i++){ 14154 if( azHelp[i][0]=='.' || zPattern[0] ){ 14155 utf8_printf(out, "%s\n", azHelp[i]); 14156 n++; 14157 } 14158 } 14159 }else{ 14160 /* Look for commands that for which zPattern is an exact prefix */ 14161 zPat = sqlite3_mprintf(".%s*", zPattern); 14162 for(i=0; i<ArraySize(azHelp); i++){ 14163 if( sqlite3_strglob(zPat, azHelp[i])==0 ){ 14164 utf8_printf(out, "%s\n", azHelp[i]); 14165 j = i+1; 14166 n++; 14167 } 14168 } 14169 sqlite3_free(zPat); 14170 if( n ){ 14171 if( n==1 ){ 14172 /* when zPattern is a prefix of exactly one command, then include the 14173 ** details of that command, which should begin at offset j */ 14174 while( j<ArraySize(azHelp)-1 && azHelp[j][0]!='.' ){ 14175 utf8_printf(out, "%s\n", azHelp[j]); 14176 j++; 14177 } 14178 } 14179 return n; 14180 } 14181 /* Look for commands that contain zPattern anywhere. Show the complete 14182 ** text of all commands that match. */ 14183 zPat = sqlite3_mprintf("%%%s%%", zPattern); 14184 for(i=0; i<ArraySize(azHelp); i++){ 14185 if( azHelp[i][0]=='.' ) j = i; 14186 if( sqlite3_strlike(zPat, azHelp[i], 0)==0 ){ 14187 utf8_printf(out, "%s\n", azHelp[j]); 14188 while( j<ArraySize(azHelp)-1 && azHelp[j+1][0]!='.' ){ 14189 j++; 14190 utf8_printf(out, "%s\n", azHelp[j]); 14191 } 14192 i = j; 14193 n++; 14194 } 14195 } 14196 sqlite3_free(zPat); 14197 } 14198 return n; 14199 } 14200 14201 /* Forward reference */ 14202 static int process_input(ShellState *p); 14203 14204 /* 14205 ** Read the content of file zName into memory obtained from sqlite3_malloc64() 14206 ** and return a pointer to the buffer. The caller is responsible for freeing 14207 ** the memory. 14208 ** 14209 ** If parameter pnByte is not NULL, (*pnByte) is set to the number of bytes 14210 ** read. 14211 ** 14212 ** For convenience, a nul-terminator byte is always appended to the data read 14213 ** from the file before the buffer is returned. This byte is not included in 14214 ** the final value of (*pnByte), if applicable. 14215 ** 14216 ** NULL is returned if any error is encountered. The final value of *pnByte 14217 ** is undefined in this case. 14218 */ 14219 static char *readFile(const char *zName, int *pnByte){ 14220 FILE *in = fopen(zName, "rb"); 14221 long nIn; 14222 size_t nRead; 14223 char *pBuf; 14224 if( in==0 ) return 0; 14225 fseek(in, 0, SEEK_END); 14226 nIn = ftell(in); 14227 rewind(in); 14228 pBuf = sqlite3_malloc64( nIn+1 ); 14229 if( pBuf==0 ){ fclose(in); return 0; } 14230 nRead = fread(pBuf, nIn, 1, in); 14231 fclose(in); 14232 if( nRead!=1 ){ 14233 sqlite3_free(pBuf); 14234 return 0; 14235 } 14236 pBuf[nIn] = 0; 14237 if( pnByte ) *pnByte = nIn; 14238 return pBuf; 14239 } 14240 14241 #if defined(SQLITE_ENABLE_SESSION) 14242 /* 14243 ** Close a single OpenSession object and release all of its associated 14244 ** resources. 14245 */ 14246 static void session_close(OpenSession *pSession){ 14247 int i; 14248 sqlite3session_delete(pSession->p); 14249 sqlite3_free(pSession->zName); 14250 for(i=0; i<pSession->nFilter; i++){ 14251 sqlite3_free(pSession->azFilter[i]); 14252 } 14253 sqlite3_free(pSession->azFilter); 14254 memset(pSession, 0, sizeof(OpenSession)); 14255 } 14256 #endif 14257 14258 /* 14259 ** Close all OpenSession objects and release all associated resources. 14260 */ 14261 #if defined(SQLITE_ENABLE_SESSION) 14262 static void session_close_all(ShellState *p){ 14263 int i; 14264 for(i=0; i<p->nSession; i++){ 14265 session_close(&p->aSession[i]); 14266 } 14267 p->nSession = 0; 14268 } 14269 #else 14270 # define session_close_all(X) 14271 #endif 14272 14273 /* 14274 ** Implementation of the xFilter function for an open session. Omit 14275 ** any tables named by ".session filter" but let all other table through. 14276 */ 14277 #if defined(SQLITE_ENABLE_SESSION) 14278 static int session_filter(void *pCtx, const char *zTab){ 14279 OpenSession *pSession = (OpenSession*)pCtx; 14280 int i; 14281 for(i=0; i<pSession->nFilter; i++){ 14282 if( sqlite3_strglob(pSession->azFilter[i], zTab)==0 ) return 0; 14283 } 14284 return 1; 14285 } 14286 #endif 14287 14288 /* 14289 ** Try to deduce the type of file for zName based on its content. Return 14290 ** one of the SHELL_OPEN_* constants. 14291 ** 14292 ** If the file does not exist or is empty but its name looks like a ZIP 14293 ** archive and the dfltZip flag is true, then assume it is a ZIP archive. 14294 ** Otherwise, assume an ordinary database regardless of the filename if 14295 ** the type cannot be determined from content. 14296 */ 14297 int deduceDatabaseType(const char *zName, int dfltZip){ 14298 FILE *f = fopen(zName, "rb"); 14299 size_t n; 14300 int rc = SHELL_OPEN_UNSPEC; 14301 char zBuf[100]; 14302 if( f==0 ){ 14303 if( dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){ 14304 return SHELL_OPEN_ZIPFILE; 14305 }else{ 14306 return SHELL_OPEN_NORMAL; 14307 } 14308 } 14309 n = fread(zBuf, 16, 1, f); 14310 if( n==1 && memcmp(zBuf, "SQLite format 3", 16)==0 ){ 14311 fclose(f); 14312 return SHELL_OPEN_NORMAL; 14313 } 14314 fseek(f, -25, SEEK_END); 14315 n = fread(zBuf, 25, 1, f); 14316 if( n==1 && memcmp(zBuf, "Start-Of-SQLite3-", 17)==0 ){ 14317 rc = SHELL_OPEN_APPENDVFS; 14318 }else{ 14319 fseek(f, -22, SEEK_END); 14320 n = fread(zBuf, 22, 1, f); 14321 if( n==1 && zBuf[0]==0x50 && zBuf[1]==0x4b && zBuf[2]==0x05 14322 && zBuf[3]==0x06 ){ 14323 rc = SHELL_OPEN_ZIPFILE; 14324 }else if( n==0 && dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){ 14325 rc = SHELL_OPEN_ZIPFILE; 14326 } 14327 } 14328 fclose(f); 14329 return rc; 14330 } 14331 14332 #ifdef SQLITE_ENABLE_DESERIALIZE 14333 /* 14334 ** Reconstruct an in-memory database using the output from the "dbtotxt" 14335 ** program. Read content from the file in p->zDbFilename. If p->zDbFilename 14336 ** is 0, then read from standard input. 14337 */ 14338 static unsigned char *readHexDb(ShellState *p, int *pnData){ 14339 unsigned char *a = 0; 14340 int nLine; 14341 int n = 0; 14342 int pgsz = 0; 14343 int iOffset = 0; 14344 int j, k; 14345 int rc; 14346 FILE *in; 14347 unsigned int x[16]; 14348 char zLine[1000]; 14349 if( p->zDbFilename ){ 14350 in = fopen(p->zDbFilename, "r"); 14351 if( in==0 ){ 14352 utf8_printf(stderr, "cannot open \"%s\" for reading\n", p->zDbFilename); 14353 return 0; 14354 } 14355 nLine = 0; 14356 }else{ 14357 in = p->in; 14358 nLine = p->lineno; 14359 if( in==0 ) in = stdin; 14360 } 14361 *pnData = 0; 14362 nLine++; 14363 if( fgets(zLine, sizeof(zLine), in)==0 ) goto readHexDb_error; 14364 rc = sscanf(zLine, "| size %d pagesize %d", &n, &pgsz); 14365 if( rc!=2 ) goto readHexDb_error; 14366 if( n<0 ) goto readHexDb_error; 14367 if( pgsz<512 || pgsz>65536 || (pgsz&(pgsz-1))!=0 ) goto readHexDb_error; 14368 n = (n+pgsz-1)&~(pgsz-1); /* Round n up to the next multiple of pgsz */ 14369 a = sqlite3_malloc( n ? n : 1 ); 14370 if( a==0 ){ 14371 utf8_printf(stderr, "Out of memory!\n"); 14372 goto readHexDb_error; 14373 } 14374 memset(a, 0, n); 14375 if( pgsz<512 || pgsz>65536 || (pgsz & (pgsz-1))!=0 ){ 14376 utf8_printf(stderr, "invalid pagesize\n"); 14377 goto readHexDb_error; 14378 } 14379 for(nLine++; fgets(zLine, sizeof(zLine), in)!=0; nLine++){ 14380 rc = sscanf(zLine, "| page %d offset %d", &j, &k); 14381 if( rc==2 ){ 14382 iOffset = k; 14383 continue; 14384 } 14385 if( strncmp(zLine, "| end ", 6)==0 ){ 14386 break; 14387 } 14388 rc = sscanf(zLine,"| %d: %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x", 14389 &j, &x[0], &x[1], &x[2], &x[3], &x[4], &x[5], &x[6], &x[7], 14390 &x[8], &x[9], &x[10], &x[11], &x[12], &x[13], &x[14], &x[15]); 14391 if( rc==17 ){ 14392 k = iOffset+j; 14393 if( k+16<=n ){ 14394 int ii; 14395 for(ii=0; ii<16; ii++) a[k+ii] = x[ii]&0xff; 14396 } 14397 } 14398 } 14399 *pnData = n; 14400 if( in!=p->in ){ 14401 fclose(in); 14402 }else{ 14403 p->lineno = nLine; 14404 } 14405 return a; 14406 14407 readHexDb_error: 14408 if( in!=p->in ){ 14409 fclose(in); 14410 }else{ 14411 while( fgets(zLine, sizeof(zLine), p->in)!=0 ){ 14412 nLine++; 14413 if(strncmp(zLine, "| end ", 6)==0 ) break; 14414 } 14415 p->lineno = nLine; 14416 } 14417 sqlite3_free(a); 14418 utf8_printf(stderr,"Error on line %d of --hexdb input\n", nLine); 14419 return 0; 14420 } 14421 #endif /* SQLITE_ENABLE_DESERIALIZE */ 14422 14423 /* 14424 ** Scalar function "shell_int32". The first argument to this function 14425 ** must be a blob. The second a non-negative integer. This function 14426 ** reads and returns a 32-bit big-endian integer from byte 14427 ** offset (4*<arg2>) of the blob. 14428 */ 14429 static void shellInt32( 14430 sqlite3_context *context, 14431 int argc, 14432 sqlite3_value **argv 14433 ){ 14434 const unsigned char *pBlob; 14435 int nBlob; 14436 int iInt; 14437 14438 UNUSED_PARAMETER(argc); 14439 nBlob = sqlite3_value_bytes(argv[0]); 14440 pBlob = (const unsigned char*)sqlite3_value_blob(argv[0]); 14441 iInt = sqlite3_value_int(argv[1]); 14442 14443 if( iInt>=0 && (iInt+1)*4<=nBlob ){ 14444 const unsigned char *a = &pBlob[iInt*4]; 14445 sqlite3_int64 iVal = ((sqlite3_int64)a[0]<<24) 14446 + ((sqlite3_int64)a[1]<<16) 14447 + ((sqlite3_int64)a[2]<< 8) 14448 + ((sqlite3_int64)a[3]<< 0); 14449 sqlite3_result_int64(context, iVal); 14450 } 14451 } 14452 14453 /* 14454 ** Scalar function "shell_idquote(X)" returns string X quoted as an identifier, 14455 ** using "..." with internal double-quote characters doubled. 14456 */ 14457 static void shellIdQuote( 14458 sqlite3_context *context, 14459 int argc, 14460 sqlite3_value **argv 14461 ){ 14462 const char *zName = (const char*)sqlite3_value_text(argv[0]); 14463 UNUSED_PARAMETER(argc); 14464 if( zName ){ 14465 char *z = sqlite3_mprintf("\"%w\"", zName); 14466 sqlite3_result_text(context, z, -1, sqlite3_free); 14467 } 14468 } 14469 14470 /* 14471 ** Scalar function "usleep(X)" invokes sqlite3_sleep(X) and returns X. 14472 */ 14473 static void shellUSleepFunc( 14474 sqlite3_context *context, 14475 int argcUnused, 14476 sqlite3_value **argv 14477 ){ 14478 int sleep = sqlite3_value_int(argv[0]); 14479 (void)argcUnused; 14480 sqlite3_sleep(sleep/1000); 14481 sqlite3_result_int(context, sleep); 14482 } 14483 14484 /* 14485 ** Scalar function "shell_escape_crnl" used by the .recover command. 14486 ** The argument passed to this function is the output of built-in 14487 ** function quote(). If the first character of the input is "'", 14488 ** indicating that the value passed to quote() was a text value, 14489 ** then this function searches the input for "\n" and "\r" characters 14490 ** and adds a wrapper similar to the following: 14491 ** 14492 ** replace(replace(<input>, '\n', char(10), '\r', char(13)); 14493 ** 14494 ** Or, if the first character of the input is not "'", then a copy 14495 ** of the input is returned. 14496 */ 14497 static void shellEscapeCrnl( 14498 sqlite3_context *context, 14499 int argc, 14500 sqlite3_value **argv 14501 ){ 14502 const char *zText = (const char*)sqlite3_value_text(argv[0]); 14503 UNUSED_PARAMETER(argc); 14504 if( zText[0]=='\'' ){ 14505 int nText = sqlite3_value_bytes(argv[0]); 14506 int i; 14507 char zBuf1[20]; 14508 char zBuf2[20]; 14509 const char *zNL = 0; 14510 const char *zCR = 0; 14511 int nCR = 0; 14512 int nNL = 0; 14513 14514 for(i=0; zText[i]; i++){ 14515 if( zNL==0 && zText[i]=='\n' ){ 14516 zNL = unused_string(zText, "\\n", "\\012", zBuf1); 14517 nNL = (int)strlen(zNL); 14518 } 14519 if( zCR==0 && zText[i]=='\r' ){ 14520 zCR = unused_string(zText, "\\r", "\\015", zBuf2); 14521 nCR = (int)strlen(zCR); 14522 } 14523 } 14524 14525 if( zNL || zCR ){ 14526 int iOut = 0; 14527 i64 nMax = (nNL > nCR) ? nNL : nCR; 14528 i64 nAlloc = nMax * nText + (nMax+64)*2; 14529 char *zOut = (char*)sqlite3_malloc64(nAlloc); 14530 if( zOut==0 ){ 14531 sqlite3_result_error_nomem(context); 14532 return; 14533 } 14534 14535 if( zNL && zCR ){ 14536 memcpy(&zOut[iOut], "replace(replace(", 16); 14537 iOut += 16; 14538 }else{ 14539 memcpy(&zOut[iOut], "replace(", 8); 14540 iOut += 8; 14541 } 14542 for(i=0; zText[i]; i++){ 14543 if( zText[i]=='\n' ){ 14544 memcpy(&zOut[iOut], zNL, nNL); 14545 iOut += nNL; 14546 }else if( zText[i]=='\r' ){ 14547 memcpy(&zOut[iOut], zCR, nCR); 14548 iOut += nCR; 14549 }else{ 14550 zOut[iOut] = zText[i]; 14551 iOut++; 14552 } 14553 } 14554 14555 if( zNL ){ 14556 memcpy(&zOut[iOut], ",'", 2); iOut += 2; 14557 memcpy(&zOut[iOut], zNL, nNL); iOut += nNL; 14558 memcpy(&zOut[iOut], "', char(10))", 12); iOut += 12; 14559 } 14560 if( zCR ){ 14561 memcpy(&zOut[iOut], ",'", 2); iOut += 2; 14562 memcpy(&zOut[iOut], zCR, nCR); iOut += nCR; 14563 memcpy(&zOut[iOut], "', char(13))", 12); iOut += 12; 14564 } 14565 14566 sqlite3_result_text(context, zOut, iOut, SQLITE_TRANSIENT); 14567 sqlite3_free(zOut); 14568 return; 14569 } 14570 } 14571 14572 sqlite3_result_value(context, argv[0]); 14573 } 14574 14575 /* Flags for open_db(). 14576 ** 14577 ** The default behavior of open_db() is to exit(1) if the database fails to 14578 ** open. The OPEN_DB_KEEPALIVE flag changes that so that it prints an error 14579 ** but still returns without calling exit. 14580 ** 14581 ** The OPEN_DB_ZIPFILE flag causes open_db() to prefer to open files as a 14582 ** ZIP archive if the file does not exist or is empty and its name matches 14583 ** the *.zip pattern. 14584 */ 14585 #define OPEN_DB_KEEPALIVE 0x001 /* Return after error if true */ 14586 #define OPEN_DB_ZIPFILE 0x002 /* Open as ZIP if name matches *.zip */ 14587 14588 /* 14589 ** Make sure the database is open. If it is not, then open it. If 14590 ** the database fails to open, print an error message and exit. 14591 */ 14592 static void open_db(ShellState *p, int openFlags){ 14593 if( p->db==0 ){ 14594 if( p->openMode==SHELL_OPEN_UNSPEC ){ 14595 if( p->zDbFilename==0 || p->zDbFilename[0]==0 ){ 14596 p->openMode = SHELL_OPEN_NORMAL; 14597 }else{ 14598 p->openMode = (u8)deduceDatabaseType(p->zDbFilename, 14599 (openFlags & OPEN_DB_ZIPFILE)!=0); 14600 } 14601 } 14602 switch( p->openMode ){ 14603 case SHELL_OPEN_APPENDVFS: { 14604 sqlite3_open_v2(p->zDbFilename, &p->db, 14605 SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, "apndvfs"); 14606 break; 14607 } 14608 case SHELL_OPEN_HEXDB: 14609 case SHELL_OPEN_DESERIALIZE: { 14610 sqlite3_open(0, &p->db); 14611 break; 14612 } 14613 case SHELL_OPEN_ZIPFILE: { 14614 sqlite3_open(":memory:", &p->db); 14615 break; 14616 } 14617 case SHELL_OPEN_READONLY: { 14618 sqlite3_open_v2(p->zDbFilename, &p->db, 14619 SQLITE_OPEN_READONLY|p->openFlags, 0); 14620 break; 14621 } 14622 case SHELL_OPEN_UNSPEC: 14623 case SHELL_OPEN_NORMAL: { 14624 sqlite3_open_v2(p->zDbFilename, &p->db, 14625 SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, 0); 14626 break; 14627 } 14628 } 14629 globalDb = p->db; 14630 if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){ 14631 utf8_printf(stderr,"Error: unable to open database \"%s\": %s\n", 14632 p->zDbFilename, sqlite3_errmsg(p->db)); 14633 if( openFlags & OPEN_DB_KEEPALIVE ){ 14634 sqlite3_open(":memory:", &p->db); 14635 return; 14636 } 14637 exit(1); 14638 } 14639 #ifndef SQLITE_OMIT_LOAD_EXTENSION 14640 sqlite3_enable_load_extension(p->db, 1); 14641 #endif 14642 sqlite3_fileio_init(p->db, 0, 0); 14643 sqlite3_shathree_init(p->db, 0, 0); 14644 sqlite3_completion_init(p->db, 0, 0); 14645 sqlite3_uint_init(p->db, 0, 0); 14646 sqlite3_decimal_init(p->db, 0, 0); 14647 sqlite3_ieee_init(p->db, 0, 0); 14648 sqlite3_series_init(p->db, 0, 0); 14649 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) 14650 sqlite3_dbdata_init(p->db, 0, 0); 14651 #endif 14652 #ifdef SQLITE_HAVE_ZLIB 14653 sqlite3_zipfile_init(p->db, 0, 0); 14654 sqlite3_sqlar_init(p->db, 0, 0); 14655 #endif 14656 sqlite3_create_function(p->db, "shell_add_schema", 3, SQLITE_UTF8, 0, 14657 shellAddSchemaName, 0, 0); 14658 sqlite3_create_function(p->db, "shell_module_schema", 1, SQLITE_UTF8, 0, 14659 shellModuleSchema, 0, 0); 14660 sqlite3_create_function(p->db, "shell_putsnl", 1, SQLITE_UTF8, p, 14661 shellPutsFunc, 0, 0); 14662 sqlite3_create_function(p->db, "shell_escape_crnl", 1, SQLITE_UTF8, 0, 14663 shellEscapeCrnl, 0, 0); 14664 sqlite3_create_function(p->db, "shell_int32", 2, SQLITE_UTF8, 0, 14665 shellInt32, 0, 0); 14666 sqlite3_create_function(p->db, "shell_idquote", 1, SQLITE_UTF8, 0, 14667 shellIdQuote, 0, 0); 14668 sqlite3_create_function(p->db, "usleep",1,SQLITE_UTF8,0, 14669 shellUSleepFunc, 0, 0); 14670 #ifndef SQLITE_NOHAVE_SYSTEM 14671 sqlite3_create_function(p->db, "edit", 1, SQLITE_UTF8, 0, 14672 editFunc, 0, 0); 14673 sqlite3_create_function(p->db, "edit", 2, SQLITE_UTF8, 0, 14674 editFunc, 0, 0); 14675 #endif 14676 if( p->openMode==SHELL_OPEN_ZIPFILE ){ 14677 char *zSql = sqlite3_mprintf( 14678 "CREATE VIRTUAL TABLE zip USING zipfile(%Q);", p->zDbFilename); 14679 sqlite3_exec(p->db, zSql, 0, 0, 0); 14680 sqlite3_free(zSql); 14681 } 14682 #ifdef SQLITE_ENABLE_DESERIALIZE 14683 else 14684 if( p->openMode==SHELL_OPEN_DESERIALIZE || p->openMode==SHELL_OPEN_HEXDB ){ 14685 int rc; 14686 int nData = 0; 14687 unsigned char *aData; 14688 if( p->openMode==SHELL_OPEN_DESERIALIZE ){ 14689 aData = (unsigned char*)readFile(p->zDbFilename, &nData); 14690 }else{ 14691 aData = readHexDb(p, &nData); 14692 if( aData==0 ){ 14693 return; 14694 } 14695 } 14696 rc = sqlite3_deserialize(p->db, "main", aData, nData, nData, 14697 SQLITE_DESERIALIZE_RESIZEABLE | 14698 SQLITE_DESERIALIZE_FREEONCLOSE); 14699 if( rc ){ 14700 utf8_printf(stderr, "Error: sqlite3_deserialize() returns %d\n", rc); 14701 } 14702 if( p->szMax>0 ){ 14703 sqlite3_file_control(p->db, "main", SQLITE_FCNTL_SIZE_LIMIT, &p->szMax); 14704 } 14705 } 14706 #endif 14707 } 14708 } 14709 14710 /* 14711 ** Attempt to close the databaes connection. Report errors. 14712 */ 14713 void close_db(sqlite3 *db){ 14714 int rc = sqlite3_close(db); 14715 if( rc ){ 14716 utf8_printf(stderr, "Error: sqlite3_close() returns %d: %s\n", 14717 rc, sqlite3_errmsg(db)); 14718 } 14719 } 14720 14721 #if HAVE_READLINE || HAVE_EDITLINE 14722 /* 14723 ** Readline completion callbacks 14724 */ 14725 static char *readline_completion_generator(const char *text, int state){ 14726 static sqlite3_stmt *pStmt = 0; 14727 char *zRet; 14728 if( state==0 ){ 14729 char *zSql; 14730 sqlite3_finalize(pStmt); 14731 zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase" 14732 " FROM completion(%Q) ORDER BY 1", text); 14733 sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0); 14734 sqlite3_free(zSql); 14735 } 14736 if( sqlite3_step(pStmt)==SQLITE_ROW ){ 14737 zRet = strdup((const char*)sqlite3_column_text(pStmt, 0)); 14738 }else{ 14739 sqlite3_finalize(pStmt); 14740 pStmt = 0; 14741 zRet = 0; 14742 } 14743 return zRet; 14744 } 14745 static char **readline_completion(const char *zText, int iStart, int iEnd){ 14746 rl_attempted_completion_over = 1; 14747 return rl_completion_matches(zText, readline_completion_generator); 14748 } 14749 14750 #elif HAVE_LINENOISE 14751 /* 14752 ** Linenoise completion callback 14753 */ 14754 static void linenoise_completion(const char *zLine, linenoiseCompletions *lc){ 14755 int nLine = strlen30(zLine); 14756 int i, iStart; 14757 sqlite3_stmt *pStmt = 0; 14758 char *zSql; 14759 char zBuf[1000]; 14760 14761 if( nLine>sizeof(zBuf)-30 ) return; 14762 if( zLine[0]=='.' || zLine[0]=='#') return; 14763 for(i=nLine-1; i>=0 && (isalnum(zLine[i]) || zLine[i]=='_'); i--){} 14764 if( i==nLine-1 ) return; 14765 iStart = i+1; 14766 memcpy(zBuf, zLine, iStart); 14767 zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase" 14768 " FROM completion(%Q,%Q) ORDER BY 1", 14769 &zLine[iStart], zLine); 14770 sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0); 14771 sqlite3_free(zSql); 14772 sqlite3_exec(globalDb, "PRAGMA page_count", 0, 0, 0); /* Load the schema */ 14773 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 14774 const char *zCompletion = (const char*)sqlite3_column_text(pStmt, 0); 14775 int nCompletion = sqlite3_column_bytes(pStmt, 0); 14776 if( iStart+nCompletion < sizeof(zBuf)-1 ){ 14777 memcpy(zBuf+iStart, zCompletion, nCompletion+1); 14778 linenoiseAddCompletion(lc, zBuf); 14779 } 14780 } 14781 sqlite3_finalize(pStmt); 14782 } 14783 #endif 14784 14785 /* 14786 ** Do C-language style dequoting. 14787 ** 14788 ** \a -> alarm 14789 ** \b -> backspace 14790 ** \t -> tab 14791 ** \n -> newline 14792 ** \v -> vertical tab 14793 ** \f -> form feed 14794 ** \r -> carriage return 14795 ** \s -> space 14796 ** \" -> " 14797 ** \' -> ' 14798 ** \\ -> backslash 14799 ** \NNN -> ascii character NNN in octal 14800 */ 14801 static void resolve_backslashes(char *z){ 14802 int i, j; 14803 char c; 14804 while( *z && *z!='\\' ) z++; 14805 for(i=j=0; (c = z[i])!=0; i++, j++){ 14806 if( c=='\\' && z[i+1]!=0 ){ 14807 c = z[++i]; 14808 if( c=='a' ){ 14809 c = '\a'; 14810 }else if( c=='b' ){ 14811 c = '\b'; 14812 }else if( c=='t' ){ 14813 c = '\t'; 14814 }else if( c=='n' ){ 14815 c = '\n'; 14816 }else if( c=='v' ){ 14817 c = '\v'; 14818 }else if( c=='f' ){ 14819 c = '\f'; 14820 }else if( c=='r' ){ 14821 c = '\r'; 14822 }else if( c=='"' ){ 14823 c = '"'; 14824 }else if( c=='\'' ){ 14825 c = '\''; 14826 }else if( c=='\\' ){ 14827 c = '\\'; 14828 }else if( c>='0' && c<='7' ){ 14829 c -= '0'; 14830 if( z[i+1]>='0' && z[i+1]<='7' ){ 14831 i++; 14832 c = (c<<3) + z[i] - '0'; 14833 if( z[i+1]>='0' && z[i+1]<='7' ){ 14834 i++; 14835 c = (c<<3) + z[i] - '0'; 14836 } 14837 } 14838 } 14839 } 14840 z[j] = c; 14841 } 14842 if( j<i ) z[j] = 0; 14843 } 14844 14845 /* 14846 ** Interpret zArg as either an integer or a boolean value. Return 1 or 0 14847 ** for TRUE and FALSE. Return the integer value if appropriate. 14848 */ 14849 static int booleanValue(const char *zArg){ 14850 int i; 14851 if( zArg[0]=='0' && zArg[1]=='x' ){ 14852 for(i=2; hexDigitValue(zArg[i])>=0; i++){} 14853 }else{ 14854 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){} 14855 } 14856 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff); 14857 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){ 14858 return 1; 14859 } 14860 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){ 14861 return 0; 14862 } 14863 utf8_printf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n", 14864 zArg); 14865 return 0; 14866 } 14867 14868 /* 14869 ** Set or clear a shell flag according to a boolean value. 14870 */ 14871 static void setOrClearFlag(ShellState *p, unsigned mFlag, const char *zArg){ 14872 if( booleanValue(zArg) ){ 14873 ShellSetFlag(p, mFlag); 14874 }else{ 14875 ShellClearFlag(p, mFlag); 14876 } 14877 } 14878 14879 /* 14880 ** Close an output file, assuming it is not stderr or stdout 14881 */ 14882 static void output_file_close(FILE *f){ 14883 if( f && f!=stdout && f!=stderr ) fclose(f); 14884 } 14885 14886 /* 14887 ** Try to open an output file. The names "stdout" and "stderr" are 14888 ** recognized and do the right thing. NULL is returned if the output 14889 ** filename is "off". 14890 */ 14891 static FILE *output_file_open(const char *zFile, int bTextMode){ 14892 FILE *f; 14893 if( strcmp(zFile,"stdout")==0 ){ 14894 f = stdout; 14895 }else if( strcmp(zFile, "stderr")==0 ){ 14896 f = stderr; 14897 }else if( strcmp(zFile, "off")==0 ){ 14898 f = 0; 14899 }else{ 14900 f = fopen(zFile, bTextMode ? "w" : "wb"); 14901 if( f==0 ){ 14902 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile); 14903 } 14904 } 14905 return f; 14906 } 14907 14908 #ifndef SQLITE_OMIT_TRACE 14909 /* 14910 ** A routine for handling output from sqlite3_trace(). 14911 */ 14912 static int sql_trace_callback( 14913 unsigned mType, /* The trace type */ 14914 void *pArg, /* The ShellState pointer */ 14915 void *pP, /* Usually a pointer to sqlite_stmt */ 14916 void *pX /* Auxiliary output */ 14917 ){ 14918 ShellState *p = (ShellState*)pArg; 14919 sqlite3_stmt *pStmt; 14920 const char *zSql; 14921 int nSql; 14922 if( p->traceOut==0 ) return 0; 14923 if( mType==SQLITE_TRACE_CLOSE ){ 14924 utf8_printf(p->traceOut, "-- closing database connection\n"); 14925 return 0; 14926 } 14927 if( mType!=SQLITE_TRACE_ROW && ((const char*)pX)[0]=='-' ){ 14928 zSql = (const char*)pX; 14929 }else{ 14930 pStmt = (sqlite3_stmt*)pP; 14931 switch( p->eTraceType ){ 14932 case SHELL_TRACE_EXPANDED: { 14933 zSql = sqlite3_expanded_sql(pStmt); 14934 break; 14935 } 14936 #ifdef SQLITE_ENABLE_NORMALIZE 14937 case SHELL_TRACE_NORMALIZED: { 14938 zSql = sqlite3_normalized_sql(pStmt); 14939 break; 14940 } 14941 #endif 14942 default: { 14943 zSql = sqlite3_sql(pStmt); 14944 break; 14945 } 14946 } 14947 } 14948 if( zSql==0 ) return 0; 14949 nSql = strlen30(zSql); 14950 while( nSql>0 && zSql[nSql-1]==';' ){ nSql--; } 14951 switch( mType ){ 14952 case SQLITE_TRACE_ROW: 14953 case SQLITE_TRACE_STMT: { 14954 utf8_printf(p->traceOut, "%.*s;\n", nSql, zSql); 14955 break; 14956 } 14957 case SQLITE_TRACE_PROFILE: { 14958 sqlite3_int64 nNanosec = *(sqlite3_int64*)pX; 14959 utf8_printf(p->traceOut, "%.*s; -- %lld ns\n", nSql, zSql, nNanosec); 14960 break; 14961 } 14962 } 14963 return 0; 14964 } 14965 #endif 14966 14967 /* 14968 ** A no-op routine that runs with the ".breakpoint" doc-command. This is 14969 ** a useful spot to set a debugger breakpoint. 14970 */ 14971 static void test_breakpoint(void){ 14972 static int nCall = 0; 14973 nCall++; 14974 } 14975 14976 /* 14977 ** An object used to read a CSV and other files for import. 14978 */ 14979 typedef struct ImportCtx ImportCtx; 14980 struct ImportCtx { 14981 const char *zFile; /* Name of the input file */ 14982 FILE *in; /* Read the CSV text from this input stream */ 14983 int (SQLITE_CDECL *xCloser)(FILE*); /* Func to close in */ 14984 char *z; /* Accumulated text for a field */ 14985 int n; /* Number of bytes in z */ 14986 int nAlloc; /* Space allocated for z[] */ 14987 int nLine; /* Current line number */ 14988 int nRow; /* Number of rows imported */ 14989 int nErr; /* Number of errors encountered */ 14990 int bNotFirst; /* True if one or more bytes already read */ 14991 int cTerm; /* Character that terminated the most recent field */ 14992 int cColSep; /* The column separator character. (Usually ",") */ 14993 int cRowSep; /* The row separator character. (Usually "\n") */ 14994 }; 14995 14996 /* Clean up resourced used by an ImportCtx */ 14997 static void import_cleanup(ImportCtx *p){ 14998 if( p->in!=0 && p->xCloser!=0 ){ 14999 p->xCloser(p->in); 15000 p->in = 0; 15001 } 15002 sqlite3_free(p->z); 15003 p->z = 0; 15004 } 15005 15006 /* Append a single byte to z[] */ 15007 static void import_append_char(ImportCtx *p, int c){ 15008 if( p->n+1>=p->nAlloc ){ 15009 p->nAlloc += p->nAlloc + 100; 15010 p->z = sqlite3_realloc64(p->z, p->nAlloc); 15011 if( p->z==0 ) shell_out_of_memory(); 15012 } 15013 p->z[p->n++] = (char)c; 15014 } 15015 15016 /* Read a single field of CSV text. Compatible with rfc4180 and extended 15017 ** with the option of having a separator other than ",". 15018 ** 15019 ** + Input comes from p->in. 15020 ** + Store results in p->z of length p->n. Space to hold p->z comes 15021 ** from sqlite3_malloc64(). 15022 ** + Use p->cSep as the column separator. The default is ",". 15023 ** + Use p->rSep as the row separator. The default is "\n". 15024 ** + Keep track of the line number in p->nLine. 15025 ** + Store the character that terminates the field in p->cTerm. Store 15026 ** EOF on end-of-file. 15027 ** + Report syntax errors on stderr 15028 */ 15029 static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){ 15030 int c; 15031 int cSep = p->cColSep; 15032 int rSep = p->cRowSep; 15033 p->n = 0; 15034 c = fgetc(p->in); 15035 if( c==EOF || seenInterrupt ){ 15036 p->cTerm = EOF; 15037 return 0; 15038 } 15039 if( c=='"' ){ 15040 int pc, ppc; 15041 int startLine = p->nLine; 15042 int cQuote = c; 15043 pc = ppc = 0; 15044 while( 1 ){ 15045 c = fgetc(p->in); 15046 if( c==rSep ) p->nLine++; 15047 if( c==cQuote ){ 15048 if( pc==cQuote ){ 15049 pc = 0; 15050 continue; 15051 } 15052 } 15053 if( (c==cSep && pc==cQuote) 15054 || (c==rSep && pc==cQuote) 15055 || (c==rSep && pc=='\r' && ppc==cQuote) 15056 || (c==EOF && pc==cQuote) 15057 ){ 15058 do{ p->n--; }while( p->z[p->n]!=cQuote ); 15059 p->cTerm = c; 15060 break; 15061 } 15062 if( pc==cQuote && c!='\r' ){ 15063 utf8_printf(stderr, "%s:%d: unescaped %c character\n", 15064 p->zFile, p->nLine, cQuote); 15065 } 15066 if( c==EOF ){ 15067 utf8_printf(stderr, "%s:%d: unterminated %c-quoted field\n", 15068 p->zFile, startLine, cQuote); 15069 p->cTerm = c; 15070 break; 15071 } 15072 import_append_char(p, c); 15073 ppc = pc; 15074 pc = c; 15075 } 15076 }else{ 15077 /* If this is the first field being parsed and it begins with the 15078 ** UTF-8 BOM (0xEF BB BF) then skip the BOM */ 15079 if( (c&0xff)==0xef && p->bNotFirst==0 ){ 15080 import_append_char(p, c); 15081 c = fgetc(p->in); 15082 if( (c&0xff)==0xbb ){ 15083 import_append_char(p, c); 15084 c = fgetc(p->in); 15085 if( (c&0xff)==0xbf ){ 15086 p->bNotFirst = 1; 15087 p->n = 0; 15088 return csv_read_one_field(p); 15089 } 15090 } 15091 } 15092 while( c!=EOF && c!=cSep && c!=rSep ){ 15093 import_append_char(p, c); 15094 c = fgetc(p->in); 15095 } 15096 if( c==rSep ){ 15097 p->nLine++; 15098 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--; 15099 } 15100 p->cTerm = c; 15101 } 15102 if( p->z ) p->z[p->n] = 0; 15103 p->bNotFirst = 1; 15104 return p->z; 15105 } 15106 15107 /* Read a single field of ASCII delimited text. 15108 ** 15109 ** + Input comes from p->in. 15110 ** + Store results in p->z of length p->n. Space to hold p->z comes 15111 ** from sqlite3_malloc64(). 15112 ** + Use p->cSep as the column separator. The default is "\x1F". 15113 ** + Use p->rSep as the row separator. The default is "\x1E". 15114 ** + Keep track of the row number in p->nLine. 15115 ** + Store the character that terminates the field in p->cTerm. Store 15116 ** EOF on end-of-file. 15117 ** + Report syntax errors on stderr 15118 */ 15119 static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){ 15120 int c; 15121 int cSep = p->cColSep; 15122 int rSep = p->cRowSep; 15123 p->n = 0; 15124 c = fgetc(p->in); 15125 if( c==EOF || seenInterrupt ){ 15126 p->cTerm = EOF; 15127 return 0; 15128 } 15129 while( c!=EOF && c!=cSep && c!=rSep ){ 15130 import_append_char(p, c); 15131 c = fgetc(p->in); 15132 } 15133 if( c==rSep ){ 15134 p->nLine++; 15135 } 15136 p->cTerm = c; 15137 if( p->z ) p->z[p->n] = 0; 15138 return p->z; 15139 } 15140 15141 /* 15142 ** Try to transfer data for table zTable. If an error is seen while 15143 ** moving forward, try to go backwards. The backwards movement won't 15144 ** work for WITHOUT ROWID tables. 15145 */ 15146 static void tryToCloneData( 15147 ShellState *p, 15148 sqlite3 *newDb, 15149 const char *zTable 15150 ){ 15151 sqlite3_stmt *pQuery = 0; 15152 sqlite3_stmt *pInsert = 0; 15153 char *zQuery = 0; 15154 char *zInsert = 0; 15155 int rc; 15156 int i, j, n; 15157 int nTable = strlen30(zTable); 15158 int k = 0; 15159 int cnt = 0; 15160 const int spinRate = 10000; 15161 15162 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable); 15163 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0); 15164 if( rc ){ 15165 utf8_printf(stderr, "Error %d: %s on [%s]\n", 15166 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db), 15167 zQuery); 15168 goto end_data_xfer; 15169 } 15170 n = sqlite3_column_count(pQuery); 15171 zInsert = sqlite3_malloc64(200 + nTable + n*3); 15172 if( zInsert==0 ) shell_out_of_memory(); 15173 sqlite3_snprintf(200+nTable,zInsert, 15174 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable); 15175 i = strlen30(zInsert); 15176 for(j=1; j<n; j++){ 15177 memcpy(zInsert+i, ",?", 2); 15178 i += 2; 15179 } 15180 memcpy(zInsert+i, ");", 3); 15181 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0); 15182 if( rc ){ 15183 utf8_printf(stderr, "Error %d: %s on [%s]\n", 15184 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb), 15185 zQuery); 15186 goto end_data_xfer; 15187 } 15188 for(k=0; k<2; k++){ 15189 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){ 15190 for(i=0; i<n; i++){ 15191 switch( sqlite3_column_type(pQuery, i) ){ 15192 case SQLITE_NULL: { 15193 sqlite3_bind_null(pInsert, i+1); 15194 break; 15195 } 15196 case SQLITE_INTEGER: { 15197 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i)); 15198 break; 15199 } 15200 case SQLITE_FLOAT: { 15201 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i)); 15202 break; 15203 } 15204 case SQLITE_TEXT: { 15205 sqlite3_bind_text(pInsert, i+1, 15206 (const char*)sqlite3_column_text(pQuery,i), 15207 -1, SQLITE_STATIC); 15208 break; 15209 } 15210 case SQLITE_BLOB: { 15211 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i), 15212 sqlite3_column_bytes(pQuery,i), 15213 SQLITE_STATIC); 15214 break; 15215 } 15216 } 15217 } /* End for */ 15218 rc = sqlite3_step(pInsert); 15219 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){ 15220 utf8_printf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb), 15221 sqlite3_errmsg(newDb)); 15222 } 15223 sqlite3_reset(pInsert); 15224 cnt++; 15225 if( (cnt%spinRate)==0 ){ 15226 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]); 15227 fflush(stdout); 15228 } 15229 } /* End while */ 15230 if( rc==SQLITE_DONE ) break; 15231 sqlite3_finalize(pQuery); 15232 sqlite3_free(zQuery); 15233 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;", 15234 zTable); 15235 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0); 15236 if( rc ){ 15237 utf8_printf(stderr, "Warning: cannot step \"%s\" backwards", zTable); 15238 break; 15239 } 15240 } /* End for(k=0...) */ 15241 15242 end_data_xfer: 15243 sqlite3_finalize(pQuery); 15244 sqlite3_finalize(pInsert); 15245 sqlite3_free(zQuery); 15246 sqlite3_free(zInsert); 15247 } 15248 15249 15250 /* 15251 ** Try to transfer all rows of the schema that match zWhere. For 15252 ** each row, invoke xForEach() on the object defined by that row. 15253 ** If an error is encountered while moving forward through the 15254 ** sqlite_schema table, try again moving backwards. 15255 */ 15256 static void tryToCloneSchema( 15257 ShellState *p, 15258 sqlite3 *newDb, 15259 const char *zWhere, 15260 void (*xForEach)(ShellState*,sqlite3*,const char*) 15261 ){ 15262 sqlite3_stmt *pQuery = 0; 15263 char *zQuery = 0; 15264 int rc; 15265 const unsigned char *zName; 15266 const unsigned char *zSql; 15267 char *zErrMsg = 0; 15268 15269 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema" 15270 " WHERE %s", zWhere); 15271 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0); 15272 if( rc ){ 15273 utf8_printf(stderr, "Error: (%d) %s on [%s]\n", 15274 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db), 15275 zQuery); 15276 goto end_schema_xfer; 15277 } 15278 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){ 15279 zName = sqlite3_column_text(pQuery, 0); 15280 zSql = sqlite3_column_text(pQuery, 1); 15281 printf("%s... ", zName); fflush(stdout); 15282 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg); 15283 if( zErrMsg ){ 15284 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql); 15285 sqlite3_free(zErrMsg); 15286 zErrMsg = 0; 15287 } 15288 if( xForEach ){ 15289 xForEach(p, newDb, (const char*)zName); 15290 } 15291 printf("done\n"); 15292 } 15293 if( rc!=SQLITE_DONE ){ 15294 sqlite3_finalize(pQuery); 15295 sqlite3_free(zQuery); 15296 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema" 15297 " WHERE %s ORDER BY rowid DESC", zWhere); 15298 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0); 15299 if( rc ){ 15300 utf8_printf(stderr, "Error: (%d) %s on [%s]\n", 15301 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db), 15302 zQuery); 15303 goto end_schema_xfer; 15304 } 15305 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){ 15306 zName = sqlite3_column_text(pQuery, 0); 15307 zSql = sqlite3_column_text(pQuery, 1); 15308 printf("%s... ", zName); fflush(stdout); 15309 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg); 15310 if( zErrMsg ){ 15311 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql); 15312 sqlite3_free(zErrMsg); 15313 zErrMsg = 0; 15314 } 15315 if( xForEach ){ 15316 xForEach(p, newDb, (const char*)zName); 15317 } 15318 printf("done\n"); 15319 } 15320 } 15321 end_schema_xfer: 15322 sqlite3_finalize(pQuery); 15323 sqlite3_free(zQuery); 15324 } 15325 15326 /* 15327 ** Open a new database file named "zNewDb". Try to recover as much information 15328 ** as possible out of the main database (which might be corrupt) and write it 15329 ** into zNewDb. 15330 */ 15331 static void tryToClone(ShellState *p, const char *zNewDb){ 15332 int rc; 15333 sqlite3 *newDb = 0; 15334 if( access(zNewDb,0)==0 ){ 15335 utf8_printf(stderr, "File \"%s\" already exists.\n", zNewDb); 15336 return; 15337 } 15338 rc = sqlite3_open(zNewDb, &newDb); 15339 if( rc ){ 15340 utf8_printf(stderr, "Cannot create output database: %s\n", 15341 sqlite3_errmsg(newDb)); 15342 }else{ 15343 sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0); 15344 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0); 15345 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData); 15346 tryToCloneSchema(p, newDb, "type!='table'", 0); 15347 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0); 15348 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0); 15349 } 15350 close_db(newDb); 15351 } 15352 15353 /* 15354 ** Change the output file back to stdout. 15355 ** 15356 ** If the p->doXdgOpen flag is set, that means the output was being 15357 ** redirected to a temporary file named by p->zTempFile. In that case, 15358 ** launch start/open/xdg-open on that temporary file. 15359 */ 15360 static void output_reset(ShellState *p){ 15361 if( p->outfile[0]=='|' ){ 15362 #ifndef SQLITE_OMIT_POPEN 15363 pclose(p->out); 15364 #endif 15365 }else{ 15366 output_file_close(p->out); 15367 #ifndef SQLITE_NOHAVE_SYSTEM 15368 if( p->doXdgOpen ){ 15369 const char *zXdgOpenCmd = 15370 #if defined(_WIN32) 15371 "start"; 15372 #elif defined(__APPLE__) 15373 "open"; 15374 #else 15375 "xdg-open"; 15376 #endif 15377 char *zCmd; 15378 zCmd = sqlite3_mprintf("%s %s", zXdgOpenCmd, p->zTempFile); 15379 if( system(zCmd) ){ 15380 utf8_printf(stderr, "Failed: [%s]\n", zCmd); 15381 }else{ 15382 /* Give the start/open/xdg-open command some time to get 15383 ** going before we continue, and potential delete the 15384 ** p->zTempFile data file out from under it */ 15385 sqlite3_sleep(2000); 15386 } 15387 sqlite3_free(zCmd); 15388 outputModePop(p); 15389 p->doXdgOpen = 0; 15390 } 15391 #endif /* !defined(SQLITE_NOHAVE_SYSTEM) */ 15392 } 15393 p->outfile[0] = 0; 15394 p->out = stdout; 15395 } 15396 15397 /* 15398 ** Run an SQL command and return the single integer result. 15399 */ 15400 static int db_int(ShellState *p, const char *zSql){ 15401 sqlite3_stmt *pStmt; 15402 int res = 0; 15403 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 15404 if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){ 15405 res = sqlite3_column_int(pStmt,0); 15406 } 15407 sqlite3_finalize(pStmt); 15408 return res; 15409 } 15410 15411 /* 15412 ** Convert a 2-byte or 4-byte big-endian integer into a native integer 15413 */ 15414 static unsigned int get2byteInt(unsigned char *a){ 15415 return (a[0]<<8) + a[1]; 15416 } 15417 static unsigned int get4byteInt(unsigned char *a){ 15418 return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3]; 15419 } 15420 15421 /* 15422 ** Implementation of the ".dbinfo" command. 15423 ** 15424 ** Return 1 on error, 2 to exit, and 0 otherwise. 15425 */ 15426 static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){ 15427 static const struct { const char *zName; int ofst; } aField[] = { 15428 { "file change counter:", 24 }, 15429 { "database page count:", 28 }, 15430 { "freelist page count:", 36 }, 15431 { "schema cookie:", 40 }, 15432 { "schema format:", 44 }, 15433 { "default cache size:", 48 }, 15434 { "autovacuum top root:", 52 }, 15435 { "incremental vacuum:", 64 }, 15436 { "text encoding:", 56 }, 15437 { "user version:", 60 }, 15438 { "application id:", 68 }, 15439 { "software version:", 96 }, 15440 }; 15441 static const struct { const char *zName; const char *zSql; } aQuery[] = { 15442 { "number of tables:", 15443 "SELECT count(*) FROM %s WHERE type='table'" }, 15444 { "number of indexes:", 15445 "SELECT count(*) FROM %s WHERE type='index'" }, 15446 { "number of triggers:", 15447 "SELECT count(*) FROM %s WHERE type='trigger'" }, 15448 { "number of views:", 15449 "SELECT count(*) FROM %s WHERE type='view'" }, 15450 { "schema size:", 15451 "SELECT total(length(sql)) FROM %s" }, 15452 }; 15453 int i, rc; 15454 unsigned iDataVersion; 15455 char *zSchemaTab; 15456 char *zDb = nArg>=2 ? azArg[1] : "main"; 15457 sqlite3_stmt *pStmt = 0; 15458 unsigned char aHdr[100]; 15459 open_db(p, 0); 15460 if( p->db==0 ) return 1; 15461 rc = sqlite3_prepare_v2(p->db, 15462 "SELECT data FROM sqlite_dbpage(?1) WHERE pgno=1", 15463 -1, &pStmt, 0); 15464 if( rc ){ 15465 utf8_printf(stderr, "error: %s\n", sqlite3_errmsg(p->db)); 15466 sqlite3_finalize(pStmt); 15467 return 1; 15468 } 15469 sqlite3_bind_text(pStmt, 1, zDb, -1, SQLITE_STATIC); 15470 if( sqlite3_step(pStmt)==SQLITE_ROW 15471 && sqlite3_column_bytes(pStmt,0)>100 15472 ){ 15473 memcpy(aHdr, sqlite3_column_blob(pStmt,0), 100); 15474 sqlite3_finalize(pStmt); 15475 }else{ 15476 raw_printf(stderr, "unable to read database header\n"); 15477 sqlite3_finalize(pStmt); 15478 return 1; 15479 } 15480 i = get2byteInt(aHdr+16); 15481 if( i==1 ) i = 65536; 15482 utf8_printf(p->out, "%-20s %d\n", "database page size:", i); 15483 utf8_printf(p->out, "%-20s %d\n", "write format:", aHdr[18]); 15484 utf8_printf(p->out, "%-20s %d\n", "read format:", aHdr[19]); 15485 utf8_printf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]); 15486 for(i=0; i<ArraySize(aField); i++){ 15487 int ofst = aField[i].ofst; 15488 unsigned int val = get4byteInt(aHdr + ofst); 15489 utf8_printf(p->out, "%-20s %u", aField[i].zName, val); 15490 switch( ofst ){ 15491 case 56: { 15492 if( val==1 ) raw_printf(p->out, " (utf8)"); 15493 if( val==2 ) raw_printf(p->out, " (utf16le)"); 15494 if( val==3 ) raw_printf(p->out, " (utf16be)"); 15495 } 15496 } 15497 raw_printf(p->out, "\n"); 15498 } 15499 if( zDb==0 ){ 15500 zSchemaTab = sqlite3_mprintf("main.sqlite_schema"); 15501 }else if( strcmp(zDb,"temp")==0 ){ 15502 zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_schema"); 15503 }else{ 15504 zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_schema", zDb); 15505 } 15506 for(i=0; i<ArraySize(aQuery); i++){ 15507 char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab); 15508 int val = db_int(p, zSql); 15509 sqlite3_free(zSql); 15510 utf8_printf(p->out, "%-20s %d\n", aQuery[i].zName, val); 15511 } 15512 sqlite3_free(zSchemaTab); 15513 sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_DATA_VERSION, &iDataVersion); 15514 utf8_printf(p->out, "%-20s %u\n", "data version", iDataVersion); 15515 return 0; 15516 } 15517 15518 /* 15519 ** Print the current sqlite3_errmsg() value to stderr and return 1. 15520 */ 15521 static int shellDatabaseError(sqlite3 *db){ 15522 const char *zErr = sqlite3_errmsg(db); 15523 utf8_printf(stderr, "Error: %s\n", zErr); 15524 return 1; 15525 } 15526 15527 /* 15528 ** Compare the pattern in zGlob[] against the text in z[]. Return TRUE 15529 ** if they match and FALSE (0) if they do not match. 15530 ** 15531 ** Globbing rules: 15532 ** 15533 ** '*' Matches any sequence of zero or more characters. 15534 ** 15535 ** '?' Matches exactly one character. 15536 ** 15537 ** [...] Matches one character from the enclosed list of 15538 ** characters. 15539 ** 15540 ** [^...] Matches one character not in the enclosed list. 15541 ** 15542 ** '#' Matches any sequence of one or more digits with an 15543 ** optional + or - sign in front 15544 ** 15545 ** ' ' Any span of whitespace matches any other span of 15546 ** whitespace. 15547 ** 15548 ** Extra whitespace at the end of z[] is ignored. 15549 */ 15550 static int testcase_glob(const char *zGlob, const char *z){ 15551 int c, c2; 15552 int invert; 15553 int seen; 15554 15555 while( (c = (*(zGlob++)))!=0 ){ 15556 if( IsSpace(c) ){ 15557 if( !IsSpace(*z) ) return 0; 15558 while( IsSpace(*zGlob) ) zGlob++; 15559 while( IsSpace(*z) ) z++; 15560 }else if( c=='*' ){ 15561 while( (c=(*(zGlob++))) == '*' || c=='?' ){ 15562 if( c=='?' && (*(z++))==0 ) return 0; 15563 } 15564 if( c==0 ){ 15565 return 1; 15566 }else if( c=='[' ){ 15567 while( *z && testcase_glob(zGlob-1,z)==0 ){ 15568 z++; 15569 } 15570 return (*z)!=0; 15571 } 15572 while( (c2 = (*(z++)))!=0 ){ 15573 while( c2!=c ){ 15574 c2 = *(z++); 15575 if( c2==0 ) return 0; 15576 } 15577 if( testcase_glob(zGlob,z) ) return 1; 15578 } 15579 return 0; 15580 }else if( c=='?' ){ 15581 if( (*(z++))==0 ) return 0; 15582 }else if( c=='[' ){ 15583 int prior_c = 0; 15584 seen = 0; 15585 invert = 0; 15586 c = *(z++); 15587 if( c==0 ) return 0; 15588 c2 = *(zGlob++); 15589 if( c2=='^' ){ 15590 invert = 1; 15591 c2 = *(zGlob++); 15592 } 15593 if( c2==']' ){ 15594 if( c==']' ) seen = 1; 15595 c2 = *(zGlob++); 15596 } 15597 while( c2 && c2!=']' ){ 15598 if( c2=='-' && zGlob[0]!=']' && zGlob[0]!=0 && prior_c>0 ){ 15599 c2 = *(zGlob++); 15600 if( c>=prior_c && c<=c2 ) seen = 1; 15601 prior_c = 0; 15602 }else{ 15603 if( c==c2 ){ 15604 seen = 1; 15605 } 15606 prior_c = c2; 15607 } 15608 c2 = *(zGlob++); 15609 } 15610 if( c2==0 || (seen ^ invert)==0 ) return 0; 15611 }else if( c=='#' ){ 15612 if( (z[0]=='-' || z[0]=='+') && IsDigit(z[1]) ) z++; 15613 if( !IsDigit(z[0]) ) return 0; 15614 z++; 15615 while( IsDigit(z[0]) ){ z++; } 15616 }else{ 15617 if( c!=(*(z++)) ) return 0; 15618 } 15619 } 15620 while( IsSpace(*z) ){ z++; } 15621 return *z==0; 15622 } 15623 15624 15625 /* 15626 ** Compare the string as a command-line option with either one or two 15627 ** initial "-" characters. 15628 */ 15629 static int optionMatch(const char *zStr, const char *zOpt){ 15630 if( zStr[0]!='-' ) return 0; 15631 zStr++; 15632 if( zStr[0]=='-' ) zStr++; 15633 return strcmp(zStr, zOpt)==0; 15634 } 15635 15636 /* 15637 ** Delete a file. 15638 */ 15639 int shellDeleteFile(const char *zFilename){ 15640 int rc; 15641 #ifdef _WIN32 15642 wchar_t *z = sqlite3_win32_utf8_to_unicode(zFilename); 15643 rc = _wunlink(z); 15644 sqlite3_free(z); 15645 #else 15646 rc = unlink(zFilename); 15647 #endif 15648 return rc; 15649 } 15650 15651 /* 15652 ** Try to delete the temporary file (if there is one) and free the 15653 ** memory used to hold the name of the temp file. 15654 */ 15655 static void clearTempFile(ShellState *p){ 15656 if( p->zTempFile==0 ) return; 15657 if( p->doXdgOpen ) return; 15658 if( shellDeleteFile(p->zTempFile) ) return; 15659 sqlite3_free(p->zTempFile); 15660 p->zTempFile = 0; 15661 } 15662 15663 /* 15664 ** Create a new temp file name with the given suffix. 15665 */ 15666 static void newTempFile(ShellState *p, const char *zSuffix){ 15667 clearTempFile(p); 15668 sqlite3_free(p->zTempFile); 15669 p->zTempFile = 0; 15670 if( p->db ){ 15671 sqlite3_file_control(p->db, 0, SQLITE_FCNTL_TEMPFILENAME, &p->zTempFile); 15672 } 15673 if( p->zTempFile==0 ){ 15674 /* If p->db is an in-memory database then the TEMPFILENAME file-control 15675 ** will not work and we will need to fallback to guessing */ 15676 char *zTemp; 15677 sqlite3_uint64 r; 15678 sqlite3_randomness(sizeof(r), &r); 15679 zTemp = getenv("TEMP"); 15680 if( zTemp==0 ) zTemp = getenv("TMP"); 15681 if( zTemp==0 ){ 15682 #ifdef _WIN32 15683 zTemp = "\\tmp"; 15684 #else 15685 zTemp = "/tmp"; 15686 #endif 15687 } 15688 p->zTempFile = sqlite3_mprintf("%s/temp%llx.%s", zTemp, r, zSuffix); 15689 }else{ 15690 p->zTempFile = sqlite3_mprintf("%z.%s", p->zTempFile, zSuffix); 15691 } 15692 if( p->zTempFile==0 ){ 15693 raw_printf(stderr, "out of memory\n"); 15694 exit(1); 15695 } 15696 } 15697 15698 15699 /* 15700 ** The implementation of SQL scalar function fkey_collate_clause(), used 15701 ** by the ".lint fkey-indexes" command. This scalar function is always 15702 ** called with four arguments - the parent table name, the parent column name, 15703 ** the child table name and the child column name. 15704 ** 15705 ** fkey_collate_clause('parent-tab', 'parent-col', 'child-tab', 'child-col') 15706 ** 15707 ** If either of the named tables or columns do not exist, this function 15708 ** returns an empty string. An empty string is also returned if both tables 15709 ** and columns exist but have the same default collation sequence. Or, 15710 ** if both exist but the default collation sequences are different, this 15711 ** function returns the string " COLLATE <parent-collation>", where 15712 ** <parent-collation> is the default collation sequence of the parent column. 15713 */ 15714 static void shellFkeyCollateClause( 15715 sqlite3_context *pCtx, 15716 int nVal, 15717 sqlite3_value **apVal 15718 ){ 15719 sqlite3 *db = sqlite3_context_db_handle(pCtx); 15720 const char *zParent; 15721 const char *zParentCol; 15722 const char *zParentSeq; 15723 const char *zChild; 15724 const char *zChildCol; 15725 const char *zChildSeq = 0; /* Initialize to avoid false-positive warning */ 15726 int rc; 15727 15728 assert( nVal==4 ); 15729 zParent = (const char*)sqlite3_value_text(apVal[0]); 15730 zParentCol = (const char*)sqlite3_value_text(apVal[1]); 15731 zChild = (const char*)sqlite3_value_text(apVal[2]); 15732 zChildCol = (const char*)sqlite3_value_text(apVal[3]); 15733 15734 sqlite3_result_text(pCtx, "", -1, SQLITE_STATIC); 15735 rc = sqlite3_table_column_metadata( 15736 db, "main", zParent, zParentCol, 0, &zParentSeq, 0, 0, 0 15737 ); 15738 if( rc==SQLITE_OK ){ 15739 rc = sqlite3_table_column_metadata( 15740 db, "main", zChild, zChildCol, 0, &zChildSeq, 0, 0, 0 15741 ); 15742 } 15743 15744 if( rc==SQLITE_OK && sqlite3_stricmp(zParentSeq, zChildSeq) ){ 15745 char *z = sqlite3_mprintf(" COLLATE %s", zParentSeq); 15746 sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT); 15747 sqlite3_free(z); 15748 } 15749 } 15750 15751 15752 /* 15753 ** The implementation of dot-command ".lint fkey-indexes". 15754 */ 15755 static int lintFkeyIndexes( 15756 ShellState *pState, /* Current shell tool state */ 15757 char **azArg, /* Array of arguments passed to dot command */ 15758 int nArg /* Number of entries in azArg[] */ 15759 ){ 15760 sqlite3 *db = pState->db; /* Database handle to query "main" db of */ 15761 FILE *out = pState->out; /* Stream to write non-error output to */ 15762 int bVerbose = 0; /* If -verbose is present */ 15763 int bGroupByParent = 0; /* If -groupbyparent is present */ 15764 int i; /* To iterate through azArg[] */ 15765 const char *zIndent = ""; /* How much to indent CREATE INDEX by */ 15766 int rc; /* Return code */ 15767 sqlite3_stmt *pSql = 0; /* Compiled version of SQL statement below */ 15768 15769 /* 15770 ** This SELECT statement returns one row for each foreign key constraint 15771 ** in the schema of the main database. The column values are: 15772 ** 15773 ** 0. The text of an SQL statement similar to: 15774 ** 15775 ** "EXPLAIN QUERY PLAN SELECT 1 FROM child_table WHERE child_key=?" 15776 ** 15777 ** This SELECT is similar to the one that the foreign keys implementation 15778 ** needs to run internally on child tables. If there is an index that can 15779 ** be used to optimize this query, then it can also be used by the FK 15780 ** implementation to optimize DELETE or UPDATE statements on the parent 15781 ** table. 15782 ** 15783 ** 1. A GLOB pattern suitable for sqlite3_strglob(). If the plan output by 15784 ** the EXPLAIN QUERY PLAN command matches this pattern, then the schema 15785 ** contains an index that can be used to optimize the query. 15786 ** 15787 ** 2. Human readable text that describes the child table and columns. e.g. 15788 ** 15789 ** "child_table(child_key1, child_key2)" 15790 ** 15791 ** 3. Human readable text that describes the parent table and columns. e.g. 15792 ** 15793 ** "parent_table(parent_key1, parent_key2)" 15794 ** 15795 ** 4. A full CREATE INDEX statement for an index that could be used to 15796 ** optimize DELETE or UPDATE statements on the parent table. e.g. 15797 ** 15798 ** "CREATE INDEX child_table_child_key ON child_table(child_key)" 15799 ** 15800 ** 5. The name of the parent table. 15801 ** 15802 ** These six values are used by the C logic below to generate the report. 15803 */ 15804 const char *zSql = 15805 "SELECT " 15806 " 'EXPLAIN QUERY PLAN SELECT 1 FROM ' || quote(s.name) || ' WHERE '" 15807 " || group_concat(quote(s.name) || '.' || quote(f.[from]) || '=?' " 15808 " || fkey_collate_clause(" 15809 " f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]),' AND ')" 15810 ", " 15811 " 'SEARCH TABLE ' || s.name || ' USING COVERING INDEX*('" 15812 " || group_concat('*=?', ' AND ') || ')'" 15813 ", " 15814 " s.name || '(' || group_concat(f.[from], ', ') || ')'" 15815 ", " 15816 " f.[table] || '(' || group_concat(COALESCE(f.[to], p.[name])) || ')'" 15817 ", " 15818 " 'CREATE INDEX ' || quote(s.name ||'_'|| group_concat(f.[from], '_'))" 15819 " || ' ON ' || quote(s.name) || '('" 15820 " || group_concat(quote(f.[from]) ||" 15821 " fkey_collate_clause(" 15822 " f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]), ', ')" 15823 " || ');'" 15824 ", " 15825 " f.[table] " 15826 "FROM sqlite_schema AS s, pragma_foreign_key_list(s.name) AS f " 15827 "LEFT JOIN pragma_table_info AS p ON (pk-1=seq AND p.arg=f.[table]) " 15828 "GROUP BY s.name, f.id " 15829 "ORDER BY (CASE WHEN ? THEN f.[table] ELSE s.name END)" 15830 ; 15831 const char *zGlobIPK = "SEARCH TABLE * USING INTEGER PRIMARY KEY (rowid=?)"; 15832 15833 for(i=2; i<nArg; i++){ 15834 int n = strlen30(azArg[i]); 15835 if( n>1 && sqlite3_strnicmp("-verbose", azArg[i], n)==0 ){ 15836 bVerbose = 1; 15837 } 15838 else if( n>1 && sqlite3_strnicmp("-groupbyparent", azArg[i], n)==0 ){ 15839 bGroupByParent = 1; 15840 zIndent = " "; 15841 } 15842 else{ 15843 raw_printf(stderr, "Usage: %s %s ?-verbose? ?-groupbyparent?\n", 15844 azArg[0], azArg[1] 15845 ); 15846 return SQLITE_ERROR; 15847 } 15848 } 15849 15850 /* Register the fkey_collate_clause() SQL function */ 15851 rc = sqlite3_create_function(db, "fkey_collate_clause", 4, SQLITE_UTF8, 15852 0, shellFkeyCollateClause, 0, 0 15853 ); 15854 15855 15856 if( rc==SQLITE_OK ){ 15857 rc = sqlite3_prepare_v2(db, zSql, -1, &pSql, 0); 15858 } 15859 if( rc==SQLITE_OK ){ 15860 sqlite3_bind_int(pSql, 1, bGroupByParent); 15861 } 15862 15863 if( rc==SQLITE_OK ){ 15864 int rc2; 15865 char *zPrev = 0; 15866 while( SQLITE_ROW==sqlite3_step(pSql) ){ 15867 int res = -1; 15868 sqlite3_stmt *pExplain = 0; 15869 const char *zEQP = (const char*)sqlite3_column_text(pSql, 0); 15870 const char *zGlob = (const char*)sqlite3_column_text(pSql, 1); 15871 const char *zFrom = (const char*)sqlite3_column_text(pSql, 2); 15872 const char *zTarget = (const char*)sqlite3_column_text(pSql, 3); 15873 const char *zCI = (const char*)sqlite3_column_text(pSql, 4); 15874 const char *zParent = (const char*)sqlite3_column_text(pSql, 5); 15875 15876 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0); 15877 if( rc!=SQLITE_OK ) break; 15878 if( SQLITE_ROW==sqlite3_step(pExplain) ){ 15879 const char *zPlan = (const char*)sqlite3_column_text(pExplain, 3); 15880 res = ( 15881 0==sqlite3_strglob(zGlob, zPlan) 15882 || 0==sqlite3_strglob(zGlobIPK, zPlan) 15883 ); 15884 } 15885 rc = sqlite3_finalize(pExplain); 15886 if( rc!=SQLITE_OK ) break; 15887 15888 if( res<0 ){ 15889 raw_printf(stderr, "Error: internal error"); 15890 break; 15891 }else{ 15892 if( bGroupByParent 15893 && (bVerbose || res==0) 15894 && (zPrev==0 || sqlite3_stricmp(zParent, zPrev)) 15895 ){ 15896 raw_printf(out, "-- Parent table %s\n", zParent); 15897 sqlite3_free(zPrev); 15898 zPrev = sqlite3_mprintf("%s", zParent); 15899 } 15900 15901 if( res==0 ){ 15902 raw_printf(out, "%s%s --> %s\n", zIndent, zCI, zTarget); 15903 }else if( bVerbose ){ 15904 raw_printf(out, "%s/* no extra indexes required for %s -> %s */\n", 15905 zIndent, zFrom, zTarget 15906 ); 15907 } 15908 } 15909 } 15910 sqlite3_free(zPrev); 15911 15912 if( rc!=SQLITE_OK ){ 15913 raw_printf(stderr, "%s\n", sqlite3_errmsg(db)); 15914 } 15915 15916 rc2 = sqlite3_finalize(pSql); 15917 if( rc==SQLITE_OK && rc2!=SQLITE_OK ){ 15918 rc = rc2; 15919 raw_printf(stderr, "%s\n", sqlite3_errmsg(db)); 15920 } 15921 }else{ 15922 raw_printf(stderr, "%s\n", sqlite3_errmsg(db)); 15923 } 15924 15925 return rc; 15926 } 15927 15928 /* 15929 ** Implementation of ".lint" dot command. 15930 */ 15931 static int lintDotCommand( 15932 ShellState *pState, /* Current shell tool state */ 15933 char **azArg, /* Array of arguments passed to dot command */ 15934 int nArg /* Number of entries in azArg[] */ 15935 ){ 15936 int n; 15937 n = (nArg>=2 ? strlen30(azArg[1]) : 0); 15938 if( n<1 || sqlite3_strnicmp(azArg[1], "fkey-indexes", n) ) goto usage; 15939 return lintFkeyIndexes(pState, azArg, nArg); 15940 15941 usage: 15942 raw_printf(stderr, "Usage %s sub-command ?switches...?\n", azArg[0]); 15943 raw_printf(stderr, "Where sub-commands are:\n"); 15944 raw_printf(stderr, " fkey-indexes\n"); 15945 return SQLITE_ERROR; 15946 } 15947 15948 #if !defined SQLITE_OMIT_VIRTUALTABLE 15949 static void shellPrepare( 15950 sqlite3 *db, 15951 int *pRc, 15952 const char *zSql, 15953 sqlite3_stmt **ppStmt 15954 ){ 15955 *ppStmt = 0; 15956 if( *pRc==SQLITE_OK ){ 15957 int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0); 15958 if( rc!=SQLITE_OK ){ 15959 raw_printf(stderr, "sql error: %s (%d)\n", 15960 sqlite3_errmsg(db), sqlite3_errcode(db) 15961 ); 15962 *pRc = rc; 15963 } 15964 } 15965 } 15966 15967 /* 15968 ** Create a prepared statement using printf-style arguments for the SQL. 15969 ** 15970 ** This routine is could be marked "static". But it is not always used, 15971 ** depending on compile-time options. By omitting the "static", we avoid 15972 ** nuisance compiler warnings about "defined but not used". 15973 */ 15974 void shellPreparePrintf( 15975 sqlite3 *db, 15976 int *pRc, 15977 sqlite3_stmt **ppStmt, 15978 const char *zFmt, 15979 ... 15980 ){ 15981 *ppStmt = 0; 15982 if( *pRc==SQLITE_OK ){ 15983 va_list ap; 15984 char *z; 15985 va_start(ap, zFmt); 15986 z = sqlite3_vmprintf(zFmt, ap); 15987 va_end(ap); 15988 if( z==0 ){ 15989 *pRc = SQLITE_NOMEM; 15990 }else{ 15991 shellPrepare(db, pRc, z, ppStmt); 15992 sqlite3_free(z); 15993 } 15994 } 15995 } 15996 15997 /* Finalize the prepared statement created using shellPreparePrintf(). 15998 ** 15999 ** This routine is could be marked "static". But it is not always used, 16000 ** depending on compile-time options. By omitting the "static", we avoid 16001 ** nuisance compiler warnings about "defined but not used". 16002 */ 16003 void shellFinalize( 16004 int *pRc, 16005 sqlite3_stmt *pStmt 16006 ){ 16007 if( pStmt ){ 16008 sqlite3 *db = sqlite3_db_handle(pStmt); 16009 int rc = sqlite3_finalize(pStmt); 16010 if( *pRc==SQLITE_OK ){ 16011 if( rc!=SQLITE_OK ){ 16012 raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db)); 16013 } 16014 *pRc = rc; 16015 } 16016 } 16017 } 16018 16019 /* Reset the prepared statement created using shellPreparePrintf(). 16020 ** 16021 ** This routine is could be marked "static". But it is not always used, 16022 ** depending on compile-time options. By omitting the "static", we avoid 16023 ** nuisance compiler warnings about "defined but not used". 16024 */ 16025 void shellReset( 16026 int *pRc, 16027 sqlite3_stmt *pStmt 16028 ){ 16029 int rc = sqlite3_reset(pStmt); 16030 if( *pRc==SQLITE_OK ){ 16031 if( rc!=SQLITE_OK ){ 16032 sqlite3 *db = sqlite3_db_handle(pStmt); 16033 raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db)); 16034 } 16035 *pRc = rc; 16036 } 16037 } 16038 #endif /* !defined SQLITE_OMIT_VIRTUALTABLE */ 16039 16040 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) 16041 /****************************************************************************** 16042 ** The ".archive" or ".ar" command. 16043 */ 16044 /* 16045 ** Structure representing a single ".ar" command. 16046 */ 16047 typedef struct ArCommand ArCommand; 16048 struct ArCommand { 16049 u8 eCmd; /* An AR_CMD_* value */ 16050 u8 bVerbose; /* True if --verbose */ 16051 u8 bZip; /* True if the archive is a ZIP */ 16052 u8 bDryRun; /* True if --dry-run */ 16053 u8 bAppend; /* True if --append */ 16054 u8 fromCmdLine; /* Run from -A instead of .archive */ 16055 int nArg; /* Number of command arguments */ 16056 char *zSrcTable; /* "sqlar", "zipfile($file)" or "zip" */ 16057 const char *zFile; /* --file argument, or NULL */ 16058 const char *zDir; /* --directory argument, or NULL */ 16059 char **azArg; /* Array of command arguments */ 16060 ShellState *p; /* Shell state */ 16061 sqlite3 *db; /* Database containing the archive */ 16062 }; 16063 16064 /* 16065 ** Print a usage message for the .ar command to stderr and return SQLITE_ERROR. 16066 */ 16067 static int arUsage(FILE *f){ 16068 showHelp(f,"archive"); 16069 return SQLITE_ERROR; 16070 } 16071 16072 /* 16073 ** Print an error message for the .ar command to stderr and return 16074 ** SQLITE_ERROR. 16075 */ 16076 static int arErrorMsg(ArCommand *pAr, const char *zFmt, ...){ 16077 va_list ap; 16078 char *z; 16079 va_start(ap, zFmt); 16080 z = sqlite3_vmprintf(zFmt, ap); 16081 va_end(ap); 16082 utf8_printf(stderr, "Error: %s\n", z); 16083 if( pAr->fromCmdLine ){ 16084 utf8_printf(stderr, "Use \"-A\" for more help\n"); 16085 }else{ 16086 utf8_printf(stderr, "Use \".archive --help\" for more help\n"); 16087 } 16088 sqlite3_free(z); 16089 return SQLITE_ERROR; 16090 } 16091 16092 /* 16093 ** Values for ArCommand.eCmd. 16094 */ 16095 #define AR_CMD_CREATE 1 16096 #define AR_CMD_UPDATE 2 16097 #define AR_CMD_INSERT 3 16098 #define AR_CMD_EXTRACT 4 16099 #define AR_CMD_LIST 5 16100 #define AR_CMD_HELP 6 16101 16102 /* 16103 ** Other (non-command) switches. 16104 */ 16105 #define AR_SWITCH_VERBOSE 7 16106 #define AR_SWITCH_FILE 8 16107 #define AR_SWITCH_DIRECTORY 9 16108 #define AR_SWITCH_APPEND 10 16109 #define AR_SWITCH_DRYRUN 11 16110 16111 static int arProcessSwitch(ArCommand *pAr, int eSwitch, const char *zArg){ 16112 switch( eSwitch ){ 16113 case AR_CMD_CREATE: 16114 case AR_CMD_EXTRACT: 16115 case AR_CMD_LIST: 16116 case AR_CMD_UPDATE: 16117 case AR_CMD_INSERT: 16118 case AR_CMD_HELP: 16119 if( pAr->eCmd ){ 16120 return arErrorMsg(pAr, "multiple command options"); 16121 } 16122 pAr->eCmd = eSwitch; 16123 break; 16124 16125 case AR_SWITCH_DRYRUN: 16126 pAr->bDryRun = 1; 16127 break; 16128 case AR_SWITCH_VERBOSE: 16129 pAr->bVerbose = 1; 16130 break; 16131 case AR_SWITCH_APPEND: 16132 pAr->bAppend = 1; 16133 /* Fall thru into --file */ 16134 case AR_SWITCH_FILE: 16135 pAr->zFile = zArg; 16136 break; 16137 case AR_SWITCH_DIRECTORY: 16138 pAr->zDir = zArg; 16139 break; 16140 } 16141 16142 return SQLITE_OK; 16143 } 16144 16145 /* 16146 ** Parse the command line for an ".ar" command. The results are written into 16147 ** structure (*pAr). SQLITE_OK is returned if the command line is parsed 16148 ** successfully, otherwise an error message is written to stderr and 16149 ** SQLITE_ERROR returned. 16150 */ 16151 static int arParseCommand( 16152 char **azArg, /* Array of arguments passed to dot command */ 16153 int nArg, /* Number of entries in azArg[] */ 16154 ArCommand *pAr /* Populate this object */ 16155 ){ 16156 struct ArSwitch { 16157 const char *zLong; 16158 char cShort; 16159 u8 eSwitch; 16160 u8 bArg; 16161 } aSwitch[] = { 16162 { "create", 'c', AR_CMD_CREATE, 0 }, 16163 { "extract", 'x', AR_CMD_EXTRACT, 0 }, 16164 { "insert", 'i', AR_CMD_INSERT, 0 }, 16165 { "list", 't', AR_CMD_LIST, 0 }, 16166 { "update", 'u', AR_CMD_UPDATE, 0 }, 16167 { "help", 'h', AR_CMD_HELP, 0 }, 16168 { "verbose", 'v', AR_SWITCH_VERBOSE, 0 }, 16169 { "file", 'f', AR_SWITCH_FILE, 1 }, 16170 { "append", 'a', AR_SWITCH_APPEND, 1 }, 16171 { "directory", 'C', AR_SWITCH_DIRECTORY, 1 }, 16172 { "dryrun", 'n', AR_SWITCH_DRYRUN, 0 }, 16173 }; 16174 int nSwitch = sizeof(aSwitch) / sizeof(struct ArSwitch); 16175 struct ArSwitch *pEnd = &aSwitch[nSwitch]; 16176 16177 if( nArg<=1 ){ 16178 utf8_printf(stderr, "Wrong number of arguments. Usage:\n"); 16179 return arUsage(stderr); 16180 }else{ 16181 char *z = azArg[1]; 16182 if( z[0]!='-' ){ 16183 /* Traditional style [tar] invocation */ 16184 int i; 16185 int iArg = 2; 16186 for(i=0; z[i]; i++){ 16187 const char *zArg = 0; 16188 struct ArSwitch *pOpt; 16189 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){ 16190 if( z[i]==pOpt->cShort ) break; 16191 } 16192 if( pOpt==pEnd ){ 16193 return arErrorMsg(pAr, "unrecognized option: %c", z[i]); 16194 } 16195 if( pOpt->bArg ){ 16196 if( iArg>=nArg ){ 16197 return arErrorMsg(pAr, "option requires an argument: %c",z[i]); 16198 } 16199 zArg = azArg[iArg++]; 16200 } 16201 if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR; 16202 } 16203 pAr->nArg = nArg-iArg; 16204 if( pAr->nArg>0 ){ 16205 pAr->azArg = &azArg[iArg]; 16206 } 16207 }else{ 16208 /* Non-traditional invocation */ 16209 int iArg; 16210 for(iArg=1; iArg<nArg; iArg++){ 16211 int n; 16212 z = azArg[iArg]; 16213 if( z[0]!='-' ){ 16214 /* All remaining command line words are command arguments. */ 16215 pAr->azArg = &azArg[iArg]; 16216 pAr->nArg = nArg-iArg; 16217 break; 16218 } 16219 n = strlen30(z); 16220 16221 if( z[1]!='-' ){ 16222 int i; 16223 /* One or more short options */ 16224 for(i=1; i<n; i++){ 16225 const char *zArg = 0; 16226 struct ArSwitch *pOpt; 16227 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){ 16228 if( z[i]==pOpt->cShort ) break; 16229 } 16230 if( pOpt==pEnd ){ 16231 return arErrorMsg(pAr, "unrecognized option: %c", z[i]); 16232 } 16233 if( pOpt->bArg ){ 16234 if( i<(n-1) ){ 16235 zArg = &z[i+1]; 16236 i = n; 16237 }else{ 16238 if( iArg>=(nArg-1) ){ 16239 return arErrorMsg(pAr, "option requires an argument: %c", 16240 z[i]); 16241 } 16242 zArg = azArg[++iArg]; 16243 } 16244 } 16245 if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR; 16246 } 16247 }else if( z[2]=='\0' ){ 16248 /* A -- option, indicating that all remaining command line words 16249 ** are command arguments. */ 16250 pAr->azArg = &azArg[iArg+1]; 16251 pAr->nArg = nArg-iArg-1; 16252 break; 16253 }else{ 16254 /* A long option */ 16255 const char *zArg = 0; /* Argument for option, if any */ 16256 struct ArSwitch *pMatch = 0; /* Matching option */ 16257 struct ArSwitch *pOpt; /* Iterator */ 16258 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){ 16259 const char *zLong = pOpt->zLong; 16260 if( (n-2)<=strlen30(zLong) && 0==memcmp(&z[2], zLong, n-2) ){ 16261 if( pMatch ){ 16262 return arErrorMsg(pAr, "ambiguous option: %s",z); 16263 }else{ 16264 pMatch = pOpt; 16265 } 16266 } 16267 } 16268 16269 if( pMatch==0 ){ 16270 return arErrorMsg(pAr, "unrecognized option: %s", z); 16271 } 16272 if( pMatch->bArg ){ 16273 if( iArg>=(nArg-1) ){ 16274 return arErrorMsg(pAr, "option requires an argument: %s", z); 16275 } 16276 zArg = azArg[++iArg]; 16277 } 16278 if( arProcessSwitch(pAr, pMatch->eSwitch, zArg) ) return SQLITE_ERROR; 16279 } 16280 } 16281 } 16282 } 16283 16284 return SQLITE_OK; 16285 } 16286 16287 /* 16288 ** This function assumes that all arguments within the ArCommand.azArg[] 16289 ** array refer to archive members, as for the --extract or --list commands. 16290 ** It checks that each of them are present. If any specified file is not 16291 ** present in the archive, an error is printed to stderr and an error 16292 ** code returned. Otherwise, if all specified arguments are present in 16293 ** the archive, SQLITE_OK is returned. 16294 ** 16295 ** This function strips any trailing '/' characters from each argument. 16296 ** This is consistent with the way the [tar] command seems to work on 16297 ** Linux. 16298 */ 16299 static int arCheckEntries(ArCommand *pAr){ 16300 int rc = SQLITE_OK; 16301 if( pAr->nArg ){ 16302 int i, j; 16303 sqlite3_stmt *pTest = 0; 16304 16305 shellPreparePrintf(pAr->db, &rc, &pTest, 16306 "SELECT name FROM %s WHERE name=$name", 16307 pAr->zSrcTable 16308 ); 16309 j = sqlite3_bind_parameter_index(pTest, "$name"); 16310 for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){ 16311 char *z = pAr->azArg[i]; 16312 int n = strlen30(z); 16313 int bOk = 0; 16314 while( n>0 && z[n-1]=='/' ) n--; 16315 z[n] = '\0'; 16316 sqlite3_bind_text(pTest, j, z, -1, SQLITE_STATIC); 16317 if( SQLITE_ROW==sqlite3_step(pTest) ){ 16318 bOk = 1; 16319 } 16320 shellReset(&rc, pTest); 16321 if( rc==SQLITE_OK && bOk==0 ){ 16322 utf8_printf(stderr, "not found in archive: %s\n", z); 16323 rc = SQLITE_ERROR; 16324 } 16325 } 16326 shellFinalize(&rc, pTest); 16327 } 16328 return rc; 16329 } 16330 16331 /* 16332 ** Format a WHERE clause that can be used against the "sqlar" table to 16333 ** identify all archive members that match the command arguments held 16334 ** in (*pAr). Leave this WHERE clause in (*pzWhere) before returning. 16335 ** The caller is responsible for eventually calling sqlite3_free() on 16336 ** any non-NULL (*pzWhere) value. 16337 */ 16338 static void arWhereClause( 16339 int *pRc, 16340 ArCommand *pAr, 16341 char **pzWhere /* OUT: New WHERE clause */ 16342 ){ 16343 char *zWhere = 0; 16344 if( *pRc==SQLITE_OK ){ 16345 if( pAr->nArg==0 ){ 16346 zWhere = sqlite3_mprintf("1"); 16347 }else{ 16348 int i; 16349 const char *zSep = ""; 16350 for(i=0; i<pAr->nArg; i++){ 16351 const char *z = pAr->azArg[i]; 16352 zWhere = sqlite3_mprintf( 16353 "%z%s name = '%q' OR substr(name,1,%d) = '%q/'", 16354 zWhere, zSep, z, strlen30(z)+1, z 16355 ); 16356 if( zWhere==0 ){ 16357 *pRc = SQLITE_NOMEM; 16358 break; 16359 } 16360 zSep = " OR "; 16361 } 16362 } 16363 } 16364 *pzWhere = zWhere; 16365 } 16366 16367 /* 16368 ** Implementation of .ar "lisT" command. 16369 */ 16370 static int arListCommand(ArCommand *pAr){ 16371 const char *zSql = "SELECT %s FROM %s WHERE %s"; 16372 const char *azCols[] = { 16373 "name", 16374 "lsmode(mode), sz, datetime(mtime, 'unixepoch'), name" 16375 }; 16376 16377 char *zWhere = 0; 16378 sqlite3_stmt *pSql = 0; 16379 int rc; 16380 16381 rc = arCheckEntries(pAr); 16382 arWhereClause(&rc, pAr, &zWhere); 16383 16384 shellPreparePrintf(pAr->db, &rc, &pSql, zSql, azCols[pAr->bVerbose], 16385 pAr->zSrcTable, zWhere); 16386 if( pAr->bDryRun ){ 16387 utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql)); 16388 }else{ 16389 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){ 16390 if( pAr->bVerbose ){ 16391 utf8_printf(pAr->p->out, "%s % 10d %s %s\n", 16392 sqlite3_column_text(pSql, 0), 16393 sqlite3_column_int(pSql, 1), 16394 sqlite3_column_text(pSql, 2), 16395 sqlite3_column_text(pSql, 3) 16396 ); 16397 }else{ 16398 utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0)); 16399 } 16400 } 16401 } 16402 shellFinalize(&rc, pSql); 16403 sqlite3_free(zWhere); 16404 return rc; 16405 } 16406 16407 16408 /* 16409 ** Implementation of .ar "eXtract" command. 16410 */ 16411 static int arExtractCommand(ArCommand *pAr){ 16412 const char *zSql1 = 16413 "SELECT " 16414 " ($dir || name)," 16415 " writefile(($dir || name), %s, mode, mtime) " 16416 "FROM %s WHERE (%s) AND (data IS NULL OR $dirOnly = 0)" 16417 " AND name NOT GLOB '*..[/\\]*'"; 16418 16419 const char *azExtraArg[] = { 16420 "sqlar_uncompress(data, sz)", 16421 "data" 16422 }; 16423 16424 sqlite3_stmt *pSql = 0; 16425 int rc = SQLITE_OK; 16426 char *zDir = 0; 16427 char *zWhere = 0; 16428 int i, j; 16429 16430 /* If arguments are specified, check that they actually exist within 16431 ** the archive before proceeding. And formulate a WHERE clause to 16432 ** match them. */ 16433 rc = arCheckEntries(pAr); 16434 arWhereClause(&rc, pAr, &zWhere); 16435 16436 if( rc==SQLITE_OK ){ 16437 if( pAr->zDir ){ 16438 zDir = sqlite3_mprintf("%s/", pAr->zDir); 16439 }else{ 16440 zDir = sqlite3_mprintf(""); 16441 } 16442 if( zDir==0 ) rc = SQLITE_NOMEM; 16443 } 16444 16445 shellPreparePrintf(pAr->db, &rc, &pSql, zSql1, 16446 azExtraArg[pAr->bZip], pAr->zSrcTable, zWhere 16447 ); 16448 16449 if( rc==SQLITE_OK ){ 16450 j = sqlite3_bind_parameter_index(pSql, "$dir"); 16451 sqlite3_bind_text(pSql, j, zDir, -1, SQLITE_STATIC); 16452 16453 /* Run the SELECT statement twice. The first time, writefile() is called 16454 ** for all archive members that should be extracted. The second time, 16455 ** only for the directories. This is because the timestamps for 16456 ** extracted directories must be reset after they are populated (as 16457 ** populating them changes the timestamp). */ 16458 for(i=0; i<2; i++){ 16459 j = sqlite3_bind_parameter_index(pSql, "$dirOnly"); 16460 sqlite3_bind_int(pSql, j, i); 16461 if( pAr->bDryRun ){ 16462 utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql)); 16463 }else{ 16464 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){ 16465 if( i==0 && pAr->bVerbose ){ 16466 utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0)); 16467 } 16468 } 16469 } 16470 shellReset(&rc, pSql); 16471 } 16472 shellFinalize(&rc, pSql); 16473 } 16474 16475 sqlite3_free(zDir); 16476 sqlite3_free(zWhere); 16477 return rc; 16478 } 16479 16480 /* 16481 ** Run the SQL statement in zSql. Or if doing a --dryrun, merely print it out. 16482 */ 16483 static int arExecSql(ArCommand *pAr, const char *zSql){ 16484 int rc; 16485 if( pAr->bDryRun ){ 16486 utf8_printf(pAr->p->out, "%s\n", zSql); 16487 rc = SQLITE_OK; 16488 }else{ 16489 char *zErr = 0; 16490 rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr); 16491 if( zErr ){ 16492 utf8_printf(stdout, "ERROR: %s\n", zErr); 16493 sqlite3_free(zErr); 16494 } 16495 } 16496 return rc; 16497 } 16498 16499 16500 /* 16501 ** Implementation of .ar "create", "insert", and "update" commands. 16502 ** 16503 ** create -> Create a new SQL archive 16504 ** insert -> Insert or reinsert all files listed 16505 ** update -> Insert files that have changed or that were not 16506 ** previously in the archive 16507 ** 16508 ** Create the "sqlar" table in the database if it does not already exist. 16509 ** Then add each file in the azFile[] array to the archive. Directories 16510 ** are added recursively. If argument bVerbose is non-zero, a message is 16511 ** printed on stdout for each file archived. 16512 ** 16513 ** The create command is the same as update, except that it drops 16514 ** any existing "sqlar" table before beginning. The "insert" command 16515 ** always overwrites every file named on the command-line, where as 16516 ** "update" only overwrites if the size or mtime or mode has changed. 16517 */ 16518 static int arCreateOrUpdateCommand( 16519 ArCommand *pAr, /* Command arguments and options */ 16520 int bUpdate, /* true for a --create. */ 16521 int bOnlyIfChanged /* Only update if file has changed */ 16522 ){ 16523 const char *zCreate = 16524 "CREATE TABLE IF NOT EXISTS sqlar(\n" 16525 " name TEXT PRIMARY KEY, -- name of the file\n" 16526 " mode INT, -- access permissions\n" 16527 " mtime INT, -- last modification time\n" 16528 " sz INT, -- original file size\n" 16529 " data BLOB -- compressed content\n" 16530 ")"; 16531 const char *zDrop = "DROP TABLE IF EXISTS sqlar"; 16532 const char *zInsertFmt[2] = { 16533 "REPLACE INTO %s(name,mode,mtime,sz,data)\n" 16534 " SELECT\n" 16535 " %s,\n" 16536 " mode,\n" 16537 " mtime,\n" 16538 " CASE substr(lsmode(mode),1,1)\n" 16539 " WHEN '-' THEN length(data)\n" 16540 " WHEN 'd' THEN 0\n" 16541 " ELSE -1 END,\n" 16542 " sqlar_compress(data)\n" 16543 " FROM fsdir(%Q,%Q) AS disk\n" 16544 " WHERE lsmode(mode) NOT LIKE '?%%'%s;" 16545 , 16546 "REPLACE INTO %s(name,mode,mtime,data)\n" 16547 " SELECT\n" 16548 " %s,\n" 16549 " mode,\n" 16550 " mtime,\n" 16551 " data\n" 16552 " FROM fsdir(%Q,%Q) AS disk\n" 16553 " WHERE lsmode(mode) NOT LIKE '?%%'%s;" 16554 }; 16555 int i; /* For iterating through azFile[] */ 16556 int rc; /* Return code */ 16557 const char *zTab = 0; /* SQL table into which to insert */ 16558 char *zSql; 16559 char zTemp[50]; 16560 char *zExists = 0; 16561 16562 arExecSql(pAr, "PRAGMA page_size=512"); 16563 rc = arExecSql(pAr, "SAVEPOINT ar;"); 16564 if( rc!=SQLITE_OK ) return rc; 16565 zTemp[0] = 0; 16566 if( pAr->bZip ){ 16567 /* Initialize the zipfile virtual table, if necessary */ 16568 if( pAr->zFile ){ 16569 sqlite3_uint64 r; 16570 sqlite3_randomness(sizeof(r),&r); 16571 sqlite3_snprintf(sizeof(zTemp),zTemp,"zip%016llx",r); 16572 zTab = zTemp; 16573 zSql = sqlite3_mprintf( 16574 "CREATE VIRTUAL TABLE temp.%s USING zipfile(%Q)", 16575 zTab, pAr->zFile 16576 ); 16577 rc = arExecSql(pAr, zSql); 16578 sqlite3_free(zSql); 16579 }else{ 16580 zTab = "zip"; 16581 } 16582 }else{ 16583 /* Initialize the table for an SQLAR */ 16584 zTab = "sqlar"; 16585 if( bUpdate==0 ){ 16586 rc = arExecSql(pAr, zDrop); 16587 if( rc!=SQLITE_OK ) goto end_ar_transaction; 16588 } 16589 rc = arExecSql(pAr, zCreate); 16590 } 16591 if( bOnlyIfChanged ){ 16592 zExists = sqlite3_mprintf( 16593 " AND NOT EXISTS(" 16594 "SELECT 1 FROM %s AS mem" 16595 " WHERE mem.name=disk.name" 16596 " AND mem.mtime=disk.mtime" 16597 " AND mem.mode=disk.mode)", zTab); 16598 }else{ 16599 zExists = sqlite3_mprintf(""); 16600 } 16601 if( zExists==0 ) rc = SQLITE_NOMEM; 16602 for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){ 16603 char *zSql2 = sqlite3_mprintf(zInsertFmt[pAr->bZip], zTab, 16604 pAr->bVerbose ? "shell_putsnl(name)" : "name", 16605 pAr->azArg[i], pAr->zDir, zExists); 16606 rc = arExecSql(pAr, zSql2); 16607 sqlite3_free(zSql2); 16608 } 16609 end_ar_transaction: 16610 if( rc!=SQLITE_OK ){ 16611 sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0); 16612 }else{ 16613 rc = arExecSql(pAr, "RELEASE ar;"); 16614 if( pAr->bZip && pAr->zFile ){ 16615 zSql = sqlite3_mprintf("DROP TABLE %s", zTemp); 16616 arExecSql(pAr, zSql); 16617 sqlite3_free(zSql); 16618 } 16619 } 16620 sqlite3_free(zExists); 16621 return rc; 16622 } 16623 16624 /* 16625 ** Implementation of ".ar" dot command. 16626 */ 16627 static int arDotCommand( 16628 ShellState *pState, /* Current shell tool state */ 16629 int fromCmdLine, /* True if -A command-line option, not .ar cmd */ 16630 char **azArg, /* Array of arguments passed to dot command */ 16631 int nArg /* Number of entries in azArg[] */ 16632 ){ 16633 ArCommand cmd; 16634 int rc; 16635 memset(&cmd, 0, sizeof(cmd)); 16636 cmd.fromCmdLine = fromCmdLine; 16637 rc = arParseCommand(azArg, nArg, &cmd); 16638 if( rc==SQLITE_OK ){ 16639 int eDbType = SHELL_OPEN_UNSPEC; 16640 cmd.p = pState; 16641 cmd.db = pState->db; 16642 if( cmd.zFile ){ 16643 eDbType = deduceDatabaseType(cmd.zFile, 1); 16644 }else{ 16645 eDbType = pState->openMode; 16646 } 16647 if( eDbType==SHELL_OPEN_ZIPFILE ){ 16648 if( cmd.eCmd==AR_CMD_EXTRACT || cmd.eCmd==AR_CMD_LIST ){ 16649 if( cmd.zFile==0 ){ 16650 cmd.zSrcTable = sqlite3_mprintf("zip"); 16651 }else{ 16652 cmd.zSrcTable = sqlite3_mprintf("zipfile(%Q)", cmd.zFile); 16653 } 16654 } 16655 cmd.bZip = 1; 16656 }else if( cmd.zFile ){ 16657 int flags; 16658 if( cmd.bAppend ) eDbType = SHELL_OPEN_APPENDVFS; 16659 if( cmd.eCmd==AR_CMD_CREATE || cmd.eCmd==AR_CMD_INSERT 16660 || cmd.eCmd==AR_CMD_UPDATE ){ 16661 flags = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE; 16662 }else{ 16663 flags = SQLITE_OPEN_READONLY; 16664 } 16665 cmd.db = 0; 16666 if( cmd.bDryRun ){ 16667 utf8_printf(pState->out, "-- open database '%s'%s\n", cmd.zFile, 16668 eDbType==SHELL_OPEN_APPENDVFS ? " using 'apndvfs'" : ""); 16669 } 16670 rc = sqlite3_open_v2(cmd.zFile, &cmd.db, flags, 16671 eDbType==SHELL_OPEN_APPENDVFS ? "apndvfs" : 0); 16672 if( rc!=SQLITE_OK ){ 16673 utf8_printf(stderr, "cannot open file: %s (%s)\n", 16674 cmd.zFile, sqlite3_errmsg(cmd.db) 16675 ); 16676 goto end_ar_command; 16677 } 16678 sqlite3_fileio_init(cmd.db, 0, 0); 16679 sqlite3_sqlar_init(cmd.db, 0, 0); 16680 sqlite3_create_function(cmd.db, "shell_putsnl", 1, SQLITE_UTF8, cmd.p, 16681 shellPutsFunc, 0, 0); 16682 16683 } 16684 if( cmd.zSrcTable==0 && cmd.bZip==0 && cmd.eCmd!=AR_CMD_HELP ){ 16685 if( cmd.eCmd!=AR_CMD_CREATE 16686 && sqlite3_table_column_metadata(cmd.db,0,"sqlar","name",0,0,0,0,0) 16687 ){ 16688 utf8_printf(stderr, "database does not contain an 'sqlar' table\n"); 16689 rc = SQLITE_ERROR; 16690 goto end_ar_command; 16691 } 16692 cmd.zSrcTable = sqlite3_mprintf("sqlar"); 16693 } 16694 16695 switch( cmd.eCmd ){ 16696 case AR_CMD_CREATE: 16697 rc = arCreateOrUpdateCommand(&cmd, 0, 0); 16698 break; 16699 16700 case AR_CMD_EXTRACT: 16701 rc = arExtractCommand(&cmd); 16702 break; 16703 16704 case AR_CMD_LIST: 16705 rc = arListCommand(&cmd); 16706 break; 16707 16708 case AR_CMD_HELP: 16709 arUsage(pState->out); 16710 break; 16711 16712 case AR_CMD_INSERT: 16713 rc = arCreateOrUpdateCommand(&cmd, 1, 0); 16714 break; 16715 16716 default: 16717 assert( cmd.eCmd==AR_CMD_UPDATE ); 16718 rc = arCreateOrUpdateCommand(&cmd, 1, 1); 16719 break; 16720 } 16721 } 16722 end_ar_command: 16723 if( cmd.db!=pState->db ){ 16724 close_db(cmd.db); 16725 } 16726 sqlite3_free(cmd.zSrcTable); 16727 16728 return rc; 16729 } 16730 /* End of the ".archive" or ".ar" command logic 16731 *******************************************************************************/ 16732 #endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) */ 16733 16734 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) 16735 /* 16736 ** If (*pRc) is not SQLITE_OK when this function is called, it is a no-op. 16737 ** Otherwise, the SQL statement or statements in zSql are executed using 16738 ** database connection db and the error code written to *pRc before 16739 ** this function returns. 16740 */ 16741 static void shellExec(sqlite3 *db, int *pRc, const char *zSql){ 16742 int rc = *pRc; 16743 if( rc==SQLITE_OK ){ 16744 char *zErr = 0; 16745 rc = sqlite3_exec(db, zSql, 0, 0, &zErr); 16746 if( rc!=SQLITE_OK ){ 16747 raw_printf(stderr, "SQL error: %s\n", zErr); 16748 } 16749 *pRc = rc; 16750 } 16751 } 16752 16753 /* 16754 ** Like shellExec(), except that zFmt is a printf() style format string. 16755 */ 16756 static void shellExecPrintf(sqlite3 *db, int *pRc, const char *zFmt, ...){ 16757 char *z = 0; 16758 if( *pRc==SQLITE_OK ){ 16759 va_list ap; 16760 va_start(ap, zFmt); 16761 z = sqlite3_vmprintf(zFmt, ap); 16762 va_end(ap); 16763 if( z==0 ){ 16764 *pRc = SQLITE_NOMEM; 16765 }else{ 16766 shellExec(db, pRc, z); 16767 } 16768 sqlite3_free(z); 16769 } 16770 } 16771 16772 /* 16773 ** If *pRc is not SQLITE_OK when this function is called, it is a no-op. 16774 ** Otherwise, an attempt is made to allocate, zero and return a pointer 16775 ** to a buffer nByte bytes in size. If an OOM error occurs, *pRc is set 16776 ** to SQLITE_NOMEM and NULL returned. 16777 */ 16778 static void *shellMalloc(int *pRc, sqlite3_int64 nByte){ 16779 void *pRet = 0; 16780 if( *pRc==SQLITE_OK ){ 16781 pRet = sqlite3_malloc64(nByte); 16782 if( pRet==0 ){ 16783 *pRc = SQLITE_NOMEM; 16784 }else{ 16785 memset(pRet, 0, nByte); 16786 } 16787 } 16788 return pRet; 16789 } 16790 16791 /* 16792 ** If *pRc is not SQLITE_OK when this function is called, it is a no-op. 16793 ** Otherwise, zFmt is treated as a printf() style string. The result of 16794 ** formatting it along with any trailing arguments is written into a 16795 ** buffer obtained from sqlite3_malloc(), and pointer to which is returned. 16796 ** It is the responsibility of the caller to eventually free this buffer 16797 ** using a call to sqlite3_free(). 16798 ** 16799 ** If an OOM error occurs, (*pRc) is set to SQLITE_NOMEM and a NULL 16800 ** pointer returned. 16801 */ 16802 static char *shellMPrintf(int *pRc, const char *zFmt, ...){ 16803 char *z = 0; 16804 if( *pRc==SQLITE_OK ){ 16805 va_list ap; 16806 va_start(ap, zFmt); 16807 z = sqlite3_vmprintf(zFmt, ap); 16808 va_end(ap); 16809 if( z==0 ){ 16810 *pRc = SQLITE_NOMEM; 16811 } 16812 } 16813 return z; 16814 } 16815 16816 /* 16817 ** When running the ".recover" command, each output table, and the special 16818 ** orphaned row table if it is required, is represented by an instance 16819 ** of the following struct. 16820 */ 16821 typedef struct RecoverTable RecoverTable; 16822 struct RecoverTable { 16823 char *zQuoted; /* Quoted version of table name */ 16824 int nCol; /* Number of columns in table */ 16825 char **azlCol; /* Array of column lists */ 16826 int iPk; /* Index of IPK column */ 16827 }; 16828 16829 /* 16830 ** Free a RecoverTable object allocated by recoverFindTable() or 16831 ** recoverOrphanTable(). 16832 */ 16833 static void recoverFreeTable(RecoverTable *pTab){ 16834 if( pTab ){ 16835 sqlite3_free(pTab->zQuoted); 16836 if( pTab->azlCol ){ 16837 int i; 16838 for(i=0; i<=pTab->nCol; i++){ 16839 sqlite3_free(pTab->azlCol[i]); 16840 } 16841 sqlite3_free(pTab->azlCol); 16842 } 16843 sqlite3_free(pTab); 16844 } 16845 } 16846 16847 /* 16848 ** This function is a no-op if (*pRc) is not SQLITE_OK when it is called. 16849 ** Otherwise, it allocates and returns a RecoverTable object based on the 16850 ** final four arguments passed to this function. It is the responsibility 16851 ** of the caller to eventually free the returned object using 16852 ** recoverFreeTable(). 16853 */ 16854 static RecoverTable *recoverNewTable( 16855 int *pRc, /* IN/OUT: Error code */ 16856 const char *zName, /* Name of table */ 16857 const char *zSql, /* CREATE TABLE statement */ 16858 int bIntkey, 16859 int nCol 16860 ){ 16861 sqlite3 *dbtmp = 0; /* sqlite3 handle for testing CREATE TABLE */ 16862 int rc = *pRc; 16863 RecoverTable *pTab = 0; 16864 16865 pTab = (RecoverTable*)shellMalloc(&rc, sizeof(RecoverTable)); 16866 if( rc==SQLITE_OK ){ 16867 int nSqlCol = 0; 16868 int bSqlIntkey = 0; 16869 sqlite3_stmt *pStmt = 0; 16870 16871 rc = sqlite3_open("", &dbtmp); 16872 if( rc==SQLITE_OK ){ 16873 sqlite3_create_function(dbtmp, "shell_idquote", 1, SQLITE_UTF8, 0, 16874 shellIdQuote, 0, 0); 16875 } 16876 if( rc==SQLITE_OK ){ 16877 rc = sqlite3_exec(dbtmp, "PRAGMA writable_schema = on", 0, 0, 0); 16878 } 16879 if( rc==SQLITE_OK ){ 16880 rc = sqlite3_exec(dbtmp, zSql, 0, 0, 0); 16881 if( rc==SQLITE_ERROR ){ 16882 rc = SQLITE_OK; 16883 goto finished; 16884 } 16885 } 16886 shellPreparePrintf(dbtmp, &rc, &pStmt, 16887 "SELECT count(*) FROM pragma_table_info(%Q)", zName 16888 ); 16889 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ 16890 nSqlCol = sqlite3_column_int(pStmt, 0); 16891 } 16892 shellFinalize(&rc, pStmt); 16893 16894 if( rc!=SQLITE_OK || nSqlCol<nCol ){ 16895 goto finished; 16896 } 16897 16898 shellPreparePrintf(dbtmp, &rc, &pStmt, 16899 "SELECT (" 16900 " SELECT substr(data,1,1)==X'0D' FROM sqlite_dbpage WHERE pgno=rootpage" 16901 ") FROM sqlite_schema WHERE name = %Q", zName 16902 ); 16903 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ 16904 bSqlIntkey = sqlite3_column_int(pStmt, 0); 16905 } 16906 shellFinalize(&rc, pStmt); 16907 16908 if( bIntkey==bSqlIntkey ){ 16909 int i; 16910 const char *zPk = "_rowid_"; 16911 sqlite3_stmt *pPkFinder = 0; 16912 16913 /* If this is an intkey table and there is an INTEGER PRIMARY KEY, 16914 ** set zPk to the name of the PK column, and pTab->iPk to the index 16915 ** of the column, where columns are 0-numbered from left to right. 16916 ** Or, if this is a WITHOUT ROWID table or if there is no IPK column, 16917 ** leave zPk as "_rowid_" and pTab->iPk at -2. */ 16918 pTab->iPk = -2; 16919 if( bIntkey ){ 16920 shellPreparePrintf(dbtmp, &rc, &pPkFinder, 16921 "SELECT cid, name FROM pragma_table_info(%Q) " 16922 " WHERE pk=1 AND type='integer' COLLATE nocase" 16923 " AND NOT EXISTS (SELECT cid FROM pragma_table_info(%Q) WHERE pk=2)" 16924 , zName, zName 16925 ); 16926 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPkFinder) ){ 16927 pTab->iPk = sqlite3_column_int(pPkFinder, 0); 16928 zPk = (const char*)sqlite3_column_text(pPkFinder, 1); 16929 } 16930 } 16931 16932 pTab->zQuoted = shellMPrintf(&rc, "\"%w\"", zName); 16933 pTab->azlCol = (char**)shellMalloc(&rc, sizeof(char*) * (nSqlCol+1)); 16934 pTab->nCol = nSqlCol; 16935 16936 if( bIntkey ){ 16937 pTab->azlCol[0] = shellMPrintf(&rc, "\"%w\"", zPk); 16938 }else{ 16939 pTab->azlCol[0] = shellMPrintf(&rc, ""); 16940 } 16941 i = 1; 16942 shellPreparePrintf(dbtmp, &rc, &pStmt, 16943 "SELECT %Q || group_concat(shell_idquote(name), ', ') " 16944 " FILTER (WHERE cid!=%d) OVER (ORDER BY %s cid) " 16945 "FROM pragma_table_info(%Q)", 16946 bIntkey ? ", " : "", pTab->iPk, 16947 bIntkey ? "" : "(CASE WHEN pk=0 THEN 1000000 ELSE pk END), ", 16948 zName 16949 ); 16950 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ 16951 const char *zText = (const char*)sqlite3_column_text(pStmt, 0); 16952 pTab->azlCol[i] = shellMPrintf(&rc, "%s%s", pTab->azlCol[0], zText); 16953 i++; 16954 } 16955 shellFinalize(&rc, pStmt); 16956 16957 shellFinalize(&rc, pPkFinder); 16958 } 16959 } 16960 16961 finished: 16962 sqlite3_close(dbtmp); 16963 *pRc = rc; 16964 if( rc!=SQLITE_OK || (pTab && pTab->zQuoted==0) ){ 16965 recoverFreeTable(pTab); 16966 pTab = 0; 16967 } 16968 return pTab; 16969 } 16970 16971 /* 16972 ** This function is called to search the schema recovered from the 16973 ** sqlite_schema table of the (possibly) corrupt database as part 16974 ** of a ".recover" command. Specifically, for a table with root page 16975 ** iRoot and at least nCol columns. Additionally, if bIntkey is 0, the 16976 ** table must be a WITHOUT ROWID table, or if non-zero, not one of 16977 ** those. 16978 ** 16979 ** If a table is found, a (RecoverTable*) object is returned. Or, if 16980 ** no such table is found, but bIntkey is false and iRoot is the 16981 ** root page of an index in the recovered schema, then (*pbNoop) is 16982 ** set to true and NULL returned. Or, if there is no such table or 16983 ** index, NULL is returned and (*pbNoop) set to 0, indicating that 16984 ** the caller should write data to the orphans table. 16985 */ 16986 static RecoverTable *recoverFindTable( 16987 ShellState *pState, /* Shell state object */ 16988 int *pRc, /* IN/OUT: Error code */ 16989 int iRoot, /* Root page of table */ 16990 int bIntkey, /* True for an intkey table */ 16991 int nCol, /* Number of columns in table */ 16992 int *pbNoop /* OUT: True if iRoot is root of index */ 16993 ){ 16994 sqlite3_stmt *pStmt = 0; 16995 RecoverTable *pRet = 0; 16996 int bNoop = 0; 16997 const char *zSql = 0; 16998 const char *zName = 0; 16999 17000 /* Search the recovered schema for an object with root page iRoot. */ 17001 shellPreparePrintf(pState->db, pRc, &pStmt, 17002 "SELECT type, name, sql FROM recovery.schema WHERE rootpage=%d", iRoot 17003 ); 17004 while( *pRc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ 17005 const char *zType = (const char*)sqlite3_column_text(pStmt, 0); 17006 if( bIntkey==0 && sqlite3_stricmp(zType, "index")==0 ){ 17007 bNoop = 1; 17008 break; 17009 } 17010 if( sqlite3_stricmp(zType, "table")==0 ){ 17011 zName = (const char*)sqlite3_column_text(pStmt, 1); 17012 zSql = (const char*)sqlite3_column_text(pStmt, 2); 17013 pRet = recoverNewTable(pRc, zName, zSql, bIntkey, nCol); 17014 break; 17015 } 17016 } 17017 17018 shellFinalize(pRc, pStmt); 17019 *pbNoop = bNoop; 17020 return pRet; 17021 } 17022 17023 /* 17024 ** Return a RecoverTable object representing the orphans table. 17025 */ 17026 static RecoverTable *recoverOrphanTable( 17027 ShellState *pState, /* Shell state object */ 17028 int *pRc, /* IN/OUT: Error code */ 17029 const char *zLostAndFound, /* Base name for orphans table */ 17030 int nCol /* Number of user data columns */ 17031 ){ 17032 RecoverTable *pTab = 0; 17033 if( nCol>=0 && *pRc==SQLITE_OK ){ 17034 int i; 17035 17036 /* This block determines the name of the orphan table. The prefered 17037 ** name is zLostAndFound. But if that clashes with another name 17038 ** in the recovered schema, try zLostAndFound_0, zLostAndFound_1 17039 ** and so on until a non-clashing name is found. */ 17040 int iTab = 0; 17041 char *zTab = shellMPrintf(pRc, "%s", zLostAndFound); 17042 sqlite3_stmt *pTest = 0; 17043 shellPrepare(pState->db, pRc, 17044 "SELECT 1 FROM recovery.schema WHERE name=?", &pTest 17045 ); 17046 if( pTest ) sqlite3_bind_text(pTest, 1, zTab, -1, SQLITE_TRANSIENT); 17047 while( *pRc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pTest) ){ 17048 shellReset(pRc, pTest); 17049 sqlite3_free(zTab); 17050 zTab = shellMPrintf(pRc, "%s_%d", zLostAndFound, iTab++); 17051 sqlite3_bind_text(pTest, 1, zTab, -1, SQLITE_TRANSIENT); 17052 } 17053 shellFinalize(pRc, pTest); 17054 17055 pTab = (RecoverTable*)shellMalloc(pRc, sizeof(RecoverTable)); 17056 if( pTab ){ 17057 pTab->zQuoted = shellMPrintf(pRc, "\"%w\"", zTab); 17058 pTab->nCol = nCol; 17059 pTab->iPk = -2; 17060 if( nCol>0 ){ 17061 pTab->azlCol = (char**)shellMalloc(pRc, sizeof(char*) * (nCol+1)); 17062 if( pTab->azlCol ){ 17063 pTab->azlCol[nCol] = shellMPrintf(pRc, ""); 17064 for(i=nCol-1; i>=0; i--){ 17065 pTab->azlCol[i] = shellMPrintf(pRc, "%s, NULL", pTab->azlCol[i+1]); 17066 } 17067 } 17068 } 17069 17070 if( *pRc!=SQLITE_OK ){ 17071 recoverFreeTable(pTab); 17072 pTab = 0; 17073 }else{ 17074 raw_printf(pState->out, 17075 "CREATE TABLE %s(rootpgno INTEGER, " 17076 "pgno INTEGER, nfield INTEGER, id INTEGER", pTab->zQuoted 17077 ); 17078 for(i=0; i<nCol; i++){ 17079 raw_printf(pState->out, ", c%d", i); 17080 } 17081 raw_printf(pState->out, ");\n"); 17082 } 17083 } 17084 sqlite3_free(zTab); 17085 } 17086 return pTab; 17087 } 17088 17089 /* 17090 ** This function is called to recover data from the database. A script 17091 ** to construct a new database containing all recovered data is output 17092 ** on stream pState->out. 17093 */ 17094 static int recoverDatabaseCmd(ShellState *pState, int nArg, char **azArg){ 17095 int rc = SQLITE_OK; 17096 sqlite3_stmt *pLoop = 0; /* Loop through all root pages */ 17097 sqlite3_stmt *pPages = 0; /* Loop through all pages in a group */ 17098 sqlite3_stmt *pCells = 0; /* Loop through all cells in a page */ 17099 const char *zRecoveryDb = ""; /* Name of "recovery" database */ 17100 const char *zLostAndFound = "lost_and_found"; 17101 int i; 17102 int nOrphan = -1; 17103 RecoverTable *pOrphan = 0; 17104 17105 int bFreelist = 1; /* 0 if --freelist-corrupt is specified */ 17106 int bRowids = 1; /* 0 if --no-rowids */ 17107 for(i=1; i<nArg; i++){ 17108 char *z = azArg[i]; 17109 int n; 17110 if( z[0]=='-' && z[1]=='-' ) z++; 17111 n = strlen30(z); 17112 if( n<=17 && memcmp("-freelist-corrupt", z, n)==0 ){ 17113 bFreelist = 0; 17114 }else 17115 if( n<=12 && memcmp("-recovery-db", z, n)==0 && i<(nArg-1) ){ 17116 i++; 17117 zRecoveryDb = azArg[i]; 17118 }else 17119 if( n<=15 && memcmp("-lost-and-found", z, n)==0 && i<(nArg-1) ){ 17120 i++; 17121 zLostAndFound = azArg[i]; 17122 }else 17123 if( n<=10 && memcmp("-no-rowids", z, n)==0 ){ 17124 bRowids = 0; 17125 } 17126 else{ 17127 utf8_printf(stderr, "unexpected option: %s\n", azArg[i]); 17128 showHelp(pState->out, azArg[0]); 17129 return 1; 17130 } 17131 } 17132 17133 shellExecPrintf(pState->db, &rc, 17134 /* Attach an in-memory database named 'recovery'. Create an indexed 17135 ** cache of the sqlite_dbptr virtual table. */ 17136 "PRAGMA writable_schema = on;" 17137 "ATTACH %Q AS recovery;" 17138 "DROP TABLE IF EXISTS recovery.dbptr;" 17139 "DROP TABLE IF EXISTS recovery.freelist;" 17140 "DROP TABLE IF EXISTS recovery.map;" 17141 "DROP TABLE IF EXISTS recovery.schema;" 17142 "CREATE TABLE recovery.freelist(pgno INTEGER PRIMARY KEY);", zRecoveryDb 17143 ); 17144 17145 if( bFreelist ){ 17146 shellExec(pState->db, &rc, 17147 "WITH trunk(pgno) AS (" 17148 " SELECT shell_int32(" 17149 " (SELECT data FROM sqlite_dbpage WHERE pgno=1), 8) AS x " 17150 " WHERE x>0" 17151 " UNION" 17152 " SELECT shell_int32(" 17153 " (SELECT data FROM sqlite_dbpage WHERE pgno=trunk.pgno), 0) AS x " 17154 " FROM trunk WHERE x>0" 17155 ")," 17156 "freelist(data, n, freepgno) AS (" 17157 " SELECT data, min(16384, shell_int32(data, 1)-1), t.pgno " 17158 " FROM trunk t, sqlite_dbpage s WHERE s.pgno=t.pgno" 17159 " UNION ALL" 17160 " SELECT data, n-1, shell_int32(data, 2+n) " 17161 " FROM freelist WHERE n>=0" 17162 ")" 17163 "REPLACE INTO recovery.freelist SELECT freepgno FROM freelist;" 17164 ); 17165 } 17166 17167 /* If this is an auto-vacuum database, add all pointer-map pages to 17168 ** the freelist table. Do this regardless of whether or not 17169 ** --freelist-corrupt was specified. */ 17170 shellExec(pState->db, &rc, 17171 "WITH ptrmap(pgno) AS (" 17172 " SELECT 2 WHERE shell_int32(" 17173 " (SELECT data FROM sqlite_dbpage WHERE pgno=1), 13" 17174 " )" 17175 " UNION ALL " 17176 " SELECT pgno+1+(SELECT page_size FROM pragma_page_size)/5 AS pp " 17177 " FROM ptrmap WHERE pp<=(SELECT page_count FROM pragma_page_count)" 17178 ")" 17179 "REPLACE INTO recovery.freelist SELECT pgno FROM ptrmap" 17180 ); 17181 17182 shellExec(pState->db, &rc, 17183 "CREATE TABLE recovery.dbptr(" 17184 " pgno, child, PRIMARY KEY(child, pgno)" 17185 ") WITHOUT ROWID;" 17186 "INSERT OR IGNORE INTO recovery.dbptr(pgno, child) " 17187 " SELECT * FROM sqlite_dbptr" 17188 " WHERE pgno NOT IN freelist AND child NOT IN freelist;" 17189 17190 /* Delete any pointer to page 1. This ensures that page 1 is considered 17191 ** a root page, regardless of how corrupt the db is. */ 17192 "DELETE FROM recovery.dbptr WHERE child = 1;" 17193 17194 /* Delete all pointers to any pages that have more than one pointer 17195 ** to them. Such pages will be treated as root pages when recovering 17196 ** data. */ 17197 "DELETE FROM recovery.dbptr WHERE child IN (" 17198 " SELECT child FROM recovery.dbptr GROUP BY child HAVING count(*)>1" 17199 ");" 17200 17201 /* Create the "map" table that will (eventually) contain instructions 17202 ** for dealing with each page in the db that contains one or more 17203 ** records. */ 17204 "CREATE TABLE recovery.map(" 17205 "pgno INTEGER PRIMARY KEY, maxlen INT, intkey, root INT" 17206 ");" 17207 17208 /* Populate table [map]. If there are circular loops of pages in the 17209 ** database, the following adds all pages in such a loop to the map 17210 ** as individual root pages. This could be handled better. */ 17211 "WITH pages(i, maxlen) AS (" 17212 " SELECT page_count, (" 17213 " SELECT max(field+1) FROM sqlite_dbdata WHERE pgno=page_count" 17214 " ) FROM pragma_page_count WHERE page_count>0" 17215 " UNION ALL" 17216 " SELECT i-1, (" 17217 " SELECT max(field+1) FROM sqlite_dbdata WHERE pgno=i-1" 17218 " ) FROM pages WHERE i>=2" 17219 ")" 17220 "INSERT INTO recovery.map(pgno, maxlen, intkey, root) " 17221 " SELECT i, maxlen, NULL, (" 17222 " WITH p(orig, pgno, parent) AS (" 17223 " SELECT 0, i, (SELECT pgno FROM recovery.dbptr WHERE child=i)" 17224 " UNION " 17225 " SELECT i, p.parent, " 17226 " (SELECT pgno FROM recovery.dbptr WHERE child=p.parent) FROM p" 17227 " )" 17228 " SELECT pgno FROM p WHERE (parent IS NULL OR pgno = orig)" 17229 ") " 17230 "FROM pages WHERE maxlen IS NOT NULL AND i NOT IN freelist;" 17231 "UPDATE recovery.map AS o SET intkey = (" 17232 " SELECT substr(data, 1, 1)==X'0D' FROM sqlite_dbpage WHERE pgno=o.pgno" 17233 ");" 17234 17235 /* Extract data from page 1 and any linked pages into table 17236 ** recovery.schema. With the same schema as an sqlite_schema table. */ 17237 "CREATE TABLE recovery.schema(type, name, tbl_name, rootpage, sql);" 17238 "INSERT INTO recovery.schema SELECT " 17239 " max(CASE WHEN field=0 THEN value ELSE NULL END)," 17240 " max(CASE WHEN field=1 THEN value ELSE NULL END)," 17241 " max(CASE WHEN field=2 THEN value ELSE NULL END)," 17242 " max(CASE WHEN field=3 THEN value ELSE NULL END)," 17243 " max(CASE WHEN field=4 THEN value ELSE NULL END)" 17244 "FROM sqlite_dbdata WHERE pgno IN (" 17245 " SELECT pgno FROM recovery.map WHERE root=1" 17246 ")" 17247 "GROUP BY pgno, cell;" 17248 "CREATE INDEX recovery.schema_rootpage ON schema(rootpage);" 17249 ); 17250 17251 /* Open a transaction, then print out all non-virtual, non-"sqlite_%" 17252 ** CREATE TABLE statements that extracted from the existing schema. */ 17253 if( rc==SQLITE_OK ){ 17254 sqlite3_stmt *pStmt = 0; 17255 /* ".recover" might output content in an order which causes immediate 17256 ** foreign key constraints to be violated. So disable foreign-key 17257 ** constraint enforcement to prevent problems when running the output 17258 ** script. */ 17259 raw_printf(pState->out, "PRAGMA foreign_keys=OFF;\n"); 17260 raw_printf(pState->out, "BEGIN;\n"); 17261 raw_printf(pState->out, "PRAGMA writable_schema = on;\n"); 17262 shellPrepare(pState->db, &rc, 17263 "SELECT sql FROM recovery.schema " 17264 "WHERE type='table' AND sql LIKE 'create table%'", &pStmt 17265 ); 17266 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ 17267 const char *zCreateTable = (const char*)sqlite3_column_text(pStmt, 0); 17268 raw_printf(pState->out, "CREATE TABLE IF NOT EXISTS %s;\n", 17269 &zCreateTable[12] 17270 ); 17271 } 17272 shellFinalize(&rc, pStmt); 17273 } 17274 17275 /* Figure out if an orphan table will be required. And if so, how many 17276 ** user columns it should contain */ 17277 shellPrepare(pState->db, &rc, 17278 "SELECT coalesce(max(maxlen), -2) FROM recovery.map WHERE root>1" 17279 , &pLoop 17280 ); 17281 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pLoop) ){ 17282 nOrphan = sqlite3_column_int(pLoop, 0); 17283 } 17284 shellFinalize(&rc, pLoop); 17285 pLoop = 0; 17286 17287 shellPrepare(pState->db, &rc, 17288 "SELECT pgno FROM recovery.map WHERE root=?", &pPages 17289 ); 17290 17291 shellPrepare(pState->db, &rc, 17292 "SELECT max(field), group_concat(shell_escape_crnl(quote" 17293 "(case when (? AND field<0) then NULL else value end)" 17294 "), ', ')" 17295 ", min(field) " 17296 "FROM sqlite_dbdata WHERE pgno = ? AND field != ?" 17297 "GROUP BY cell", &pCells 17298 ); 17299 17300 /* Loop through each root page. */ 17301 shellPrepare(pState->db, &rc, 17302 "SELECT root, intkey, max(maxlen) FROM recovery.map" 17303 " WHERE root>1 GROUP BY root, intkey ORDER BY root=(" 17304 " SELECT rootpage FROM recovery.schema WHERE name='sqlite_sequence'" 17305 ")", &pLoop 17306 ); 17307 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pLoop) ){ 17308 int iRoot = sqlite3_column_int(pLoop, 0); 17309 int bIntkey = sqlite3_column_int(pLoop, 1); 17310 int nCol = sqlite3_column_int(pLoop, 2); 17311 int bNoop = 0; 17312 RecoverTable *pTab; 17313 17314 assert( bIntkey==0 || bIntkey==1 ); 17315 pTab = recoverFindTable(pState, &rc, iRoot, bIntkey, nCol, &bNoop); 17316 if( bNoop || rc ) continue; 17317 if( pTab==0 ){ 17318 if( pOrphan==0 ){ 17319 pOrphan = recoverOrphanTable(pState, &rc, zLostAndFound, nOrphan); 17320 } 17321 pTab = pOrphan; 17322 if( pTab==0 ) break; 17323 } 17324 17325 if( 0==sqlite3_stricmp(pTab->zQuoted, "\"sqlite_sequence\"") ){ 17326 raw_printf(pState->out, "DELETE FROM sqlite_sequence;\n"); 17327 } 17328 sqlite3_bind_int(pPages, 1, iRoot); 17329 if( bRowids==0 && pTab->iPk<0 ){ 17330 sqlite3_bind_int(pCells, 1, 1); 17331 }else{ 17332 sqlite3_bind_int(pCells, 1, 0); 17333 } 17334 sqlite3_bind_int(pCells, 3, pTab->iPk); 17335 17336 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPages) ){ 17337 int iPgno = sqlite3_column_int(pPages, 0); 17338 sqlite3_bind_int(pCells, 2, iPgno); 17339 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pCells) ){ 17340 int nField = sqlite3_column_int(pCells, 0); 17341 int iMin = sqlite3_column_int(pCells, 2); 17342 const char *zVal = (const char*)sqlite3_column_text(pCells, 1); 17343 17344 RecoverTable *pTab2 = pTab; 17345 if( pTab!=pOrphan && (iMin<0)!=bIntkey ){ 17346 if( pOrphan==0 ){ 17347 pOrphan = recoverOrphanTable(pState, &rc, zLostAndFound, nOrphan); 17348 } 17349 pTab2 = pOrphan; 17350 if( pTab2==0 ) break; 17351 } 17352 17353 nField = nField+1; 17354 if( pTab2==pOrphan ){ 17355 raw_printf(pState->out, 17356 "INSERT INTO %s VALUES(%d, %d, %d, %s%s%s);\n", 17357 pTab2->zQuoted, iRoot, iPgno, nField, 17358 iMin<0 ? "" : "NULL, ", zVal, pTab2->azlCol[nField] 17359 ); 17360 }else{ 17361 raw_printf(pState->out, "INSERT INTO %s(%s) VALUES( %s );\n", 17362 pTab2->zQuoted, pTab2->azlCol[nField], zVal 17363 ); 17364 } 17365 } 17366 shellReset(&rc, pCells); 17367 } 17368 shellReset(&rc, pPages); 17369 if( pTab!=pOrphan ) recoverFreeTable(pTab); 17370 } 17371 shellFinalize(&rc, pLoop); 17372 shellFinalize(&rc, pPages); 17373 shellFinalize(&rc, pCells); 17374 recoverFreeTable(pOrphan); 17375 17376 /* The rest of the schema */ 17377 if( rc==SQLITE_OK ){ 17378 sqlite3_stmt *pStmt = 0; 17379 shellPrepare(pState->db, &rc, 17380 "SELECT sql, name FROM recovery.schema " 17381 "WHERE sql NOT LIKE 'create table%'", &pStmt 17382 ); 17383 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ 17384 const char *zSql = (const char*)sqlite3_column_text(pStmt, 0); 17385 if( sqlite3_strnicmp(zSql, "create virt", 11)==0 ){ 17386 const char *zName = (const char*)sqlite3_column_text(pStmt, 1); 17387 char *zPrint = shellMPrintf(&rc, 17388 "INSERT INTO sqlite_schema VALUES('table', %Q, %Q, 0, %Q)", 17389 zName, zName, zSql 17390 ); 17391 raw_printf(pState->out, "%s;\n", zPrint); 17392 sqlite3_free(zPrint); 17393 }else{ 17394 raw_printf(pState->out, "%s;\n", zSql); 17395 } 17396 } 17397 shellFinalize(&rc, pStmt); 17398 } 17399 17400 if( rc==SQLITE_OK ){ 17401 raw_printf(pState->out, "PRAGMA writable_schema = off;\n"); 17402 raw_printf(pState->out, "COMMIT;\n"); 17403 } 17404 sqlite3_exec(pState->db, "DETACH recovery", 0, 0, 0); 17405 return rc; 17406 } 17407 #endif /* !(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) */ 17408 17409 17410 /* 17411 ** If an input line begins with "." then invoke this routine to 17412 ** process that line. 17413 ** 17414 ** Return 1 on error, 2 to exit, and 0 otherwise. 17415 */ 17416 static int do_meta_command(char *zLine, ShellState *p){ 17417 int h = 1; 17418 int nArg = 0; 17419 int n, c; 17420 int rc = 0; 17421 char *azArg[52]; 17422 17423 #ifndef SQLITE_OMIT_VIRTUALTABLE 17424 if( p->expert.pExpert ){ 17425 expertFinish(p, 1, 0); 17426 } 17427 #endif 17428 17429 /* Parse the input line into tokens. 17430 */ 17431 while( zLine[h] && nArg<ArraySize(azArg)-1 ){ 17432 while( IsSpace(zLine[h]) ){ h++; } 17433 if( zLine[h]==0 ) break; 17434 if( zLine[h]=='\'' || zLine[h]=='"' ){ 17435 int delim = zLine[h++]; 17436 azArg[nArg++] = &zLine[h]; 17437 while( zLine[h] && zLine[h]!=delim ){ 17438 if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++; 17439 h++; 17440 } 17441 if( zLine[h]==delim ){ 17442 zLine[h++] = 0; 17443 } 17444 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]); 17445 }else{ 17446 azArg[nArg++] = &zLine[h]; 17447 while( zLine[h] && !IsSpace(zLine[h]) ){ h++; } 17448 if( zLine[h] ) zLine[h++] = 0; 17449 resolve_backslashes(azArg[nArg-1]); 17450 } 17451 } 17452 azArg[nArg] = 0; 17453 17454 /* Process the input line. 17455 */ 17456 if( nArg==0 ) return 0; /* no tokens, no error */ 17457 n = strlen30(azArg[0]); 17458 c = azArg[0][0]; 17459 clearTempFile(p); 17460 17461 #ifndef SQLITE_OMIT_AUTHORIZATION 17462 if( c=='a' && strncmp(azArg[0], "auth", n)==0 ){ 17463 if( nArg!=2 ){ 17464 raw_printf(stderr, "Usage: .auth ON|OFF\n"); 17465 rc = 1; 17466 goto meta_command_exit; 17467 } 17468 open_db(p, 0); 17469 if( booleanValue(azArg[1]) ){ 17470 sqlite3_set_authorizer(p->db, shellAuth, p); 17471 }else{ 17472 sqlite3_set_authorizer(p->db, 0, 0); 17473 } 17474 }else 17475 #endif 17476 17477 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) 17478 if( c=='a' && strncmp(azArg[0], "archive", n)==0 ){ 17479 open_db(p, 0); 17480 rc = arDotCommand(p, 0, azArg, nArg); 17481 }else 17482 #endif 17483 17484 if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0) 17485 || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0) 17486 ){ 17487 const char *zDestFile = 0; 17488 const char *zDb = 0; 17489 sqlite3 *pDest; 17490 sqlite3_backup *pBackup; 17491 int j; 17492 int bAsync = 0; 17493 const char *zVfs = 0; 17494 for(j=1; j<nArg; j++){ 17495 const char *z = azArg[j]; 17496 if( z[0]=='-' ){ 17497 if( z[1]=='-' ) z++; 17498 if( strcmp(z, "-append")==0 ){ 17499 zVfs = "apndvfs"; 17500 }else 17501 if( strcmp(z, "-async")==0 ){ 17502 bAsync = 1; 17503 }else 17504 { 17505 utf8_printf(stderr, "unknown option: %s\n", azArg[j]); 17506 return 1; 17507 } 17508 }else if( zDestFile==0 ){ 17509 zDestFile = azArg[j]; 17510 }else if( zDb==0 ){ 17511 zDb = zDestFile; 17512 zDestFile = azArg[j]; 17513 }else{ 17514 raw_printf(stderr, "Usage: .backup ?DB? ?OPTIONS? FILENAME\n"); 17515 return 1; 17516 } 17517 } 17518 if( zDestFile==0 ){ 17519 raw_printf(stderr, "missing FILENAME argument on .backup\n"); 17520 return 1; 17521 } 17522 if( zDb==0 ) zDb = "main"; 17523 rc = sqlite3_open_v2(zDestFile, &pDest, 17524 SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, zVfs); 17525 if( rc!=SQLITE_OK ){ 17526 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zDestFile); 17527 close_db(pDest); 17528 return 1; 17529 } 17530 if( bAsync ){ 17531 sqlite3_exec(pDest, "PRAGMA synchronous=OFF; PRAGMA journal_mode=OFF;", 17532 0, 0, 0); 17533 } 17534 open_db(p, 0); 17535 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb); 17536 if( pBackup==0 ){ 17537 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest)); 17538 close_db(pDest); 17539 return 1; 17540 } 17541 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){} 17542 sqlite3_backup_finish(pBackup); 17543 if( rc==SQLITE_DONE ){ 17544 rc = 0; 17545 }else{ 17546 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest)); 17547 rc = 1; 17548 } 17549 close_db(pDest); 17550 }else 17551 17552 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){ 17553 if( nArg==2 ){ 17554 bail_on_error = booleanValue(azArg[1]); 17555 }else{ 17556 raw_printf(stderr, "Usage: .bail on|off\n"); 17557 rc = 1; 17558 } 17559 }else 17560 17561 if( c=='b' && n>=3 && strncmp(azArg[0], "binary", n)==0 ){ 17562 if( nArg==2 ){ 17563 if( booleanValue(azArg[1]) ){ 17564 setBinaryMode(p->out, 1); 17565 }else{ 17566 setTextMode(p->out, 1); 17567 } 17568 }else{ 17569 raw_printf(stderr, "Usage: .binary on|off\n"); 17570 rc = 1; 17571 } 17572 }else 17573 17574 if( c=='c' && strcmp(azArg[0],"cd")==0 ){ 17575 if( nArg==2 ){ 17576 #if defined(_WIN32) || defined(WIN32) 17577 wchar_t *z = sqlite3_win32_utf8_to_unicode(azArg[1]); 17578 rc = !SetCurrentDirectoryW(z); 17579 sqlite3_free(z); 17580 #else 17581 rc = chdir(azArg[1]); 17582 #endif 17583 if( rc ){ 17584 utf8_printf(stderr, "Cannot change to directory \"%s\"\n", azArg[1]); 17585 rc = 1; 17586 } 17587 }else{ 17588 raw_printf(stderr, "Usage: .cd DIRECTORY\n"); 17589 rc = 1; 17590 } 17591 }else 17592 17593 /* The undocumented ".breakpoint" command causes a call to the no-op 17594 ** routine named test_breakpoint(). 17595 */ 17596 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){ 17597 test_breakpoint(); 17598 }else 17599 17600 if( c=='c' && n>=3 && strncmp(azArg[0], "changes", n)==0 ){ 17601 if( nArg==2 ){ 17602 setOrClearFlag(p, SHFLG_CountChanges, azArg[1]); 17603 }else{ 17604 raw_printf(stderr, "Usage: .changes on|off\n"); 17605 rc = 1; 17606 } 17607 }else 17608 17609 /* Cancel output redirection, if it is currently set (by .testcase) 17610 ** Then read the content of the testcase-out.txt file and compare against 17611 ** azArg[1]. If there are differences, report an error and exit. 17612 */ 17613 if( c=='c' && n>=3 && strncmp(azArg[0], "check", n)==0 ){ 17614 char *zRes = 0; 17615 output_reset(p); 17616 if( nArg!=2 ){ 17617 raw_printf(stderr, "Usage: .check GLOB-PATTERN\n"); 17618 rc = 2; 17619 }else if( (zRes = readFile("testcase-out.txt", 0))==0 ){ 17620 raw_printf(stderr, "Error: cannot read 'testcase-out.txt'\n"); 17621 rc = 2; 17622 }else if( testcase_glob(azArg[1],zRes)==0 ){ 17623 utf8_printf(stderr, 17624 "testcase-%s FAILED\n Expected: [%s]\n Got: [%s]\n", 17625 p->zTestcase, azArg[1], zRes); 17626 rc = 1; 17627 }else{ 17628 utf8_printf(stdout, "testcase-%s ok\n", p->zTestcase); 17629 p->nCheck++; 17630 } 17631 sqlite3_free(zRes); 17632 }else 17633 17634 if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){ 17635 if( nArg==2 ){ 17636 tryToClone(p, azArg[1]); 17637 }else{ 17638 raw_printf(stderr, "Usage: .clone FILENAME\n"); 17639 rc = 1; 17640 } 17641 }else 17642 17643 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){ 17644 char **azName = 0; 17645 int nName = 0; 17646 sqlite3_stmt *pStmt; 17647 int i; 17648 open_db(p, 0); 17649 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0); 17650 if( rc ){ 17651 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); 17652 rc = 1; 17653 }else{ 17654 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 17655 const char *zSchema = (const char *)sqlite3_column_text(pStmt,1); 17656 const char *zFile = (const char*)sqlite3_column_text(pStmt,2); 17657 azName = sqlite3_realloc(azName, (nName+1)*2*sizeof(char*)); 17658 if( azName==0 ){ shell_out_of_memory(); /* Does not return */ } 17659 azName[nName*2] = strdup(zSchema); 17660 azName[nName*2+1] = strdup(zFile); 17661 nName++; 17662 } 17663 } 17664 sqlite3_finalize(pStmt); 17665 for(i=0; i<nName; i++){ 17666 int eTxn = sqlite3_txn_state(p->db, azName[i*2]); 17667 int bRdonly = sqlite3_db_readonly(p->db, azName[i*2]); 17668 const char *z = azName[i*2+1]; 17669 utf8_printf(p->out, "%s: %s %s%s\n", 17670 azName[i*2], 17671 z && z[0] ? z : "\"\"", 17672 bRdonly ? "r/o" : "r/w", 17673 eTxn==SQLITE_TXN_NONE ? "" : 17674 eTxn==SQLITE_TXN_READ ? " read-txn" : " write-txn"); 17675 free(azName[i*2]); 17676 free(azName[i*2+1]); 17677 } 17678 sqlite3_free(azName); 17679 }else 17680 17681 if( c=='d' && n>=3 && strncmp(azArg[0], "dbconfig", n)==0 ){ 17682 static const struct DbConfigChoices { 17683 const char *zName; 17684 int op; 17685 } aDbConfig[] = { 17686 { "defensive", SQLITE_DBCONFIG_DEFENSIVE }, 17687 { "dqs_ddl", SQLITE_DBCONFIG_DQS_DDL }, 17688 { "dqs_dml", SQLITE_DBCONFIG_DQS_DML }, 17689 { "enable_fkey", SQLITE_DBCONFIG_ENABLE_FKEY }, 17690 { "enable_qpsg", SQLITE_DBCONFIG_ENABLE_QPSG }, 17691 { "enable_trigger", SQLITE_DBCONFIG_ENABLE_TRIGGER }, 17692 { "enable_view", SQLITE_DBCONFIG_ENABLE_VIEW }, 17693 { "fts3_tokenizer", SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER }, 17694 { "legacy_alter_table", SQLITE_DBCONFIG_LEGACY_ALTER_TABLE }, 17695 { "legacy_file_format", SQLITE_DBCONFIG_LEGACY_FILE_FORMAT }, 17696 { "load_extension", SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION }, 17697 { "no_ckpt_on_close", SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE }, 17698 { "reset_database", SQLITE_DBCONFIG_RESET_DATABASE }, 17699 { "trigger_eqp", SQLITE_DBCONFIG_TRIGGER_EQP }, 17700 { "trusted_schema", SQLITE_DBCONFIG_TRUSTED_SCHEMA }, 17701 { "writable_schema", SQLITE_DBCONFIG_WRITABLE_SCHEMA }, 17702 }; 17703 int ii, v; 17704 open_db(p, 0); 17705 for(ii=0; ii<ArraySize(aDbConfig); ii++){ 17706 if( nArg>1 && strcmp(azArg[1], aDbConfig[ii].zName)!=0 ) continue; 17707 if( nArg>=3 ){ 17708 sqlite3_db_config(p->db, aDbConfig[ii].op, booleanValue(azArg[2]), 0); 17709 } 17710 sqlite3_db_config(p->db, aDbConfig[ii].op, -1, &v); 17711 utf8_printf(p->out, "%19s %s\n", aDbConfig[ii].zName, v ? "on" : "off"); 17712 if( nArg>1 ) break; 17713 } 17714 if( nArg>1 && ii==ArraySize(aDbConfig) ){ 17715 utf8_printf(stderr, "Error: unknown dbconfig \"%s\"\n", azArg[1]); 17716 utf8_printf(stderr, "Enter \".dbconfig\" with no arguments for a list\n"); 17717 } 17718 }else 17719 17720 if( c=='d' && n>=3 && strncmp(azArg[0], "dbinfo", n)==0 ){ 17721 rc = shell_dbinfo_command(p, nArg, azArg); 17722 }else 17723 17724 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) 17725 if( c=='r' && strncmp(azArg[0], "recover", n)==0 ){ 17726 open_db(p, 0); 17727 rc = recoverDatabaseCmd(p, nArg, azArg); 17728 }else 17729 #endif /* !(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) */ 17730 17731 if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){ 17732 char *zLike = 0; 17733 char *zSql; 17734 int i; 17735 int savedShowHeader = p->showHeader; 17736 int savedShellFlags = p->shellFlgs; 17737 ShellClearFlag(p, 17738 SHFLG_PreserveRowid|SHFLG_Newlines|SHFLG_Echo 17739 |SHFLG_DumpDataOnly|SHFLG_DumpNoSys); 17740 for(i=1; i<nArg; i++){ 17741 if( azArg[i][0]=='-' ){ 17742 const char *z = azArg[i]+1; 17743 if( z[0]=='-' ) z++; 17744 if( strcmp(z,"preserve-rowids")==0 ){ 17745 #ifdef SQLITE_OMIT_VIRTUALTABLE 17746 raw_printf(stderr, "The --preserve-rowids option is not compatible" 17747 " with SQLITE_OMIT_VIRTUALTABLE\n"); 17748 rc = 1; 17749 sqlite3_free(zLike); 17750 goto meta_command_exit; 17751 #else 17752 ShellSetFlag(p, SHFLG_PreserveRowid); 17753 #endif 17754 }else 17755 if( strcmp(z,"newlines")==0 ){ 17756 ShellSetFlag(p, SHFLG_Newlines); 17757 }else 17758 if( strcmp(z,"data-only")==0 ){ 17759 ShellSetFlag(p, SHFLG_DumpDataOnly); 17760 }else 17761 if( strcmp(z,"nosys")==0 ){ 17762 ShellSetFlag(p, SHFLG_DumpNoSys); 17763 }else 17764 { 17765 raw_printf(stderr, "Unknown option \"%s\" on \".dump\"\n", azArg[i]); 17766 rc = 1; 17767 sqlite3_free(zLike); 17768 goto meta_command_exit; 17769 } 17770 }else if( zLike ){ 17771 zLike = sqlite3_mprintf("%z OR name LIKE %Q ESCAPE '\\'", 17772 zLike, azArg[i]); 17773 }else{ 17774 zLike = sqlite3_mprintf("name LIKE %Q ESCAPE '\\'", azArg[i]); 17775 } 17776 } 17777 17778 open_db(p, 0); 17779 17780 if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){ 17781 /* When playing back a "dump", the content might appear in an order 17782 ** which causes immediate foreign key constraints to be violated. 17783 ** So disable foreign-key constraint enforcement to prevent problems. */ 17784 raw_printf(p->out, "PRAGMA foreign_keys=OFF;\n"); 17785 raw_printf(p->out, "BEGIN TRANSACTION;\n"); 17786 } 17787 p->writableSchema = 0; 17788 p->showHeader = 0; 17789 /* Set writable_schema=ON since doing so forces SQLite to initialize 17790 ** as much of the schema as it can even if the sqlite_schema table is 17791 ** corrupt. */ 17792 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0); 17793 p->nErr = 0; 17794 if( zLike==0 ) zLike = sqlite3_mprintf("true"); 17795 zSql = sqlite3_mprintf( 17796 "SELECT name, type, sql FROM sqlite_schema " 17797 "WHERE (%s) AND type=='table'" 17798 " AND sql NOT NULL" 17799 " ORDER BY tbl_name='sqlite_sequence', rowid", 17800 zLike 17801 ); 17802 run_schema_dump_query(p,zSql); 17803 sqlite3_free(zSql); 17804 if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){ 17805 zSql = sqlite3_mprintf( 17806 "SELECT sql FROM sqlite_schema " 17807 "WHERE (%s) AND sql NOT NULL" 17808 " AND type IN ('index','trigger','view')", 17809 zLike 17810 ); 17811 run_table_dump_query(p, zSql); 17812 sqlite3_free(zSql); 17813 } 17814 sqlite3_free(zLike); 17815 if( p->writableSchema ){ 17816 raw_printf(p->out, "PRAGMA writable_schema=OFF;\n"); 17817 p->writableSchema = 0; 17818 } 17819 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0); 17820 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0); 17821 if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){ 17822 raw_printf(p->out, p->nErr?"ROLLBACK; -- due to errors\n":"COMMIT;\n"); 17823 } 17824 p->showHeader = savedShowHeader; 17825 p->shellFlgs = savedShellFlags; 17826 }else 17827 17828 if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){ 17829 if( nArg==2 ){ 17830 setOrClearFlag(p, SHFLG_Echo, azArg[1]); 17831 }else{ 17832 raw_printf(stderr, "Usage: .echo on|off\n"); 17833 rc = 1; 17834 } 17835 }else 17836 17837 if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){ 17838 if( nArg==2 ){ 17839 p->autoEQPtest = 0; 17840 if( p->autoEQPtrace ){ 17841 if( p->db ) sqlite3_exec(p->db, "PRAGMA vdbe_trace=OFF;", 0, 0, 0); 17842 p->autoEQPtrace = 0; 17843 } 17844 if( strcmp(azArg[1],"full")==0 ){ 17845 p->autoEQP = AUTOEQP_full; 17846 }else if( strcmp(azArg[1],"trigger")==0 ){ 17847 p->autoEQP = AUTOEQP_trigger; 17848 #ifdef SQLITE_DEBUG 17849 }else if( strcmp(azArg[1],"test")==0 ){ 17850 p->autoEQP = AUTOEQP_on; 17851 p->autoEQPtest = 1; 17852 }else if( strcmp(azArg[1],"trace")==0 ){ 17853 p->autoEQP = AUTOEQP_full; 17854 p->autoEQPtrace = 1; 17855 open_db(p, 0); 17856 sqlite3_exec(p->db, "SELECT name FROM sqlite_schema LIMIT 1", 0, 0, 0); 17857 sqlite3_exec(p->db, "PRAGMA vdbe_trace=ON;", 0, 0, 0); 17858 #endif 17859 }else{ 17860 p->autoEQP = (u8)booleanValue(azArg[1]); 17861 } 17862 }else{ 17863 raw_printf(stderr, "Usage: .eqp off|on|trace|trigger|full\n"); 17864 rc = 1; 17865 } 17866 }else 17867 17868 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){ 17869 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc); 17870 rc = 2; 17871 }else 17872 17873 /* The ".explain" command is automatic now. It is largely pointless. It 17874 ** retained purely for backwards compatibility */ 17875 if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){ 17876 int val = 1; 17877 if( nArg>=2 ){ 17878 if( strcmp(azArg[1],"auto")==0 ){ 17879 val = 99; 17880 }else{ 17881 val = booleanValue(azArg[1]); 17882 } 17883 } 17884 if( val==1 && p->mode!=MODE_Explain ){ 17885 p->normalMode = p->mode; 17886 p->mode = MODE_Explain; 17887 p->autoExplain = 0; 17888 }else if( val==0 ){ 17889 if( p->mode==MODE_Explain ) p->mode = p->normalMode; 17890 p->autoExplain = 0; 17891 }else if( val==99 ){ 17892 if( p->mode==MODE_Explain ) p->mode = p->normalMode; 17893 p->autoExplain = 1; 17894 } 17895 }else 17896 17897 #ifndef SQLITE_OMIT_VIRTUALTABLE 17898 if( c=='e' && strncmp(azArg[0], "expert", n)==0 ){ 17899 open_db(p, 0); 17900 expertDotCommand(p, azArg, nArg); 17901 }else 17902 #endif 17903 17904 if( c=='f' && strncmp(azArg[0], "filectrl", n)==0 ){ 17905 static const struct { 17906 const char *zCtrlName; /* Name of a test-control option */ 17907 int ctrlCode; /* Integer code for that option */ 17908 const char *zUsage; /* Usage notes */ 17909 } aCtrl[] = { 17910 { "size_limit", SQLITE_FCNTL_SIZE_LIMIT, "[LIMIT]" }, 17911 { "chunk_size", SQLITE_FCNTL_CHUNK_SIZE, "SIZE" }, 17912 /* { "win32_av_retry", SQLITE_FCNTL_WIN32_AV_RETRY, "COUNT DELAY" },*/ 17913 { "persist_wal", SQLITE_FCNTL_PERSIST_WAL, "[BOOLEAN]" }, 17914 { "psow", SQLITE_FCNTL_POWERSAFE_OVERWRITE, "[BOOLEAN]" }, 17915 /* { "pragma", SQLITE_FCNTL_PRAGMA, "NAME ARG" },*/ 17916 { "tempfilename", SQLITE_FCNTL_TEMPFILENAME, "" }, 17917 { "has_moved", SQLITE_FCNTL_HAS_MOVED, "" }, 17918 { "lock_timeout", SQLITE_FCNTL_LOCK_TIMEOUT, "MILLISEC" }, 17919 { "reserve_bytes", SQLITE_FCNTL_RESERVE_BYTES, "[N]" }, 17920 }; 17921 int filectrl = -1; 17922 int iCtrl = -1; 17923 sqlite3_int64 iRes = 0; /* Integer result to display if rc2==1 */ 17924 int isOk = 0; /* 0: usage 1: %lld 2: no-result */ 17925 int n2, i; 17926 const char *zCmd = 0; 17927 const char *zSchema = 0; 17928 17929 open_db(p, 0); 17930 zCmd = nArg>=2 ? azArg[1] : "help"; 17931 17932 if( zCmd[0]=='-' 17933 && (strcmp(zCmd,"--schema")==0 || strcmp(zCmd,"-schema")==0) 17934 && nArg>=4 17935 ){ 17936 zSchema = azArg[2]; 17937 for(i=3; i<nArg; i++) azArg[i-2] = azArg[i]; 17938 nArg -= 2; 17939 zCmd = azArg[1]; 17940 } 17941 17942 /* The argument can optionally begin with "-" or "--" */ 17943 if( zCmd[0]=='-' && zCmd[1] ){ 17944 zCmd++; 17945 if( zCmd[0]=='-' && zCmd[1] ) zCmd++; 17946 } 17947 17948 /* --help lists all file-controls */ 17949 if( strcmp(zCmd,"help")==0 ){ 17950 utf8_printf(p->out, "Available file-controls:\n"); 17951 for(i=0; i<ArraySize(aCtrl); i++){ 17952 utf8_printf(p->out, " .filectrl %s %s\n", 17953 aCtrl[i].zCtrlName, aCtrl[i].zUsage); 17954 } 17955 rc = 1; 17956 goto meta_command_exit; 17957 } 17958 17959 /* convert filectrl text option to value. allow any unique prefix 17960 ** of the option name, or a numerical value. */ 17961 n2 = strlen30(zCmd); 17962 for(i=0; i<ArraySize(aCtrl); i++){ 17963 if( strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){ 17964 if( filectrl<0 ){ 17965 filectrl = aCtrl[i].ctrlCode; 17966 iCtrl = i; 17967 }else{ 17968 utf8_printf(stderr, "Error: ambiguous file-control: \"%s\"\n" 17969 "Use \".filectrl --help\" for help\n", zCmd); 17970 rc = 1; 17971 goto meta_command_exit; 17972 } 17973 } 17974 } 17975 if( filectrl<0 ){ 17976 utf8_printf(stderr,"Error: unknown file-control: %s\n" 17977 "Use \".filectrl --help\" for help\n", zCmd); 17978 }else{ 17979 switch(filectrl){ 17980 case SQLITE_FCNTL_SIZE_LIMIT: { 17981 if( nArg!=2 && nArg!=3 ) break; 17982 iRes = nArg==3 ? integerValue(azArg[2]) : -1; 17983 sqlite3_file_control(p->db, zSchema, SQLITE_FCNTL_SIZE_LIMIT, &iRes); 17984 isOk = 1; 17985 break; 17986 } 17987 case SQLITE_FCNTL_LOCK_TIMEOUT: 17988 case SQLITE_FCNTL_CHUNK_SIZE: { 17989 int x; 17990 if( nArg!=3 ) break; 17991 x = (int)integerValue(azArg[2]); 17992 sqlite3_file_control(p->db, zSchema, filectrl, &x); 17993 isOk = 2; 17994 break; 17995 } 17996 case SQLITE_FCNTL_PERSIST_WAL: 17997 case SQLITE_FCNTL_POWERSAFE_OVERWRITE: { 17998 int x; 17999 if( nArg!=2 && nArg!=3 ) break; 18000 x = nArg==3 ? booleanValue(azArg[2]) : -1; 18001 sqlite3_file_control(p->db, zSchema, filectrl, &x); 18002 iRes = x; 18003 isOk = 1; 18004 break; 18005 } 18006 case SQLITE_FCNTL_HAS_MOVED: { 18007 int x; 18008 if( nArg!=2 ) break; 18009 sqlite3_file_control(p->db, zSchema, filectrl, &x); 18010 iRes = x; 18011 isOk = 1; 18012 break; 18013 } 18014 case SQLITE_FCNTL_TEMPFILENAME: { 18015 char *z = 0; 18016 if( nArg!=2 ) break; 18017 sqlite3_file_control(p->db, zSchema, filectrl, &z); 18018 if( z ){ 18019 utf8_printf(p->out, "%s\n", z); 18020 sqlite3_free(z); 18021 } 18022 isOk = 2; 18023 break; 18024 } 18025 case SQLITE_FCNTL_RESERVE_BYTES: { 18026 int x; 18027 if( nArg>=3 ){ 18028 x = atoi(azArg[2]); 18029 sqlite3_file_control(p->db, zSchema, filectrl, &x); 18030 } 18031 x = -1; 18032 sqlite3_file_control(p->db, zSchema, filectrl, &x); 18033 utf8_printf(p->out,"%d\n", x); 18034 isOk = 2; 18035 break; 18036 } 18037 } 18038 } 18039 if( isOk==0 && iCtrl>=0 ){ 18040 utf8_printf(p->out, "Usage: .filectrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage); 18041 rc = 1; 18042 }else if( isOk==1 ){ 18043 char zBuf[100]; 18044 sqlite3_snprintf(sizeof(zBuf), zBuf, "%lld", iRes); 18045 raw_printf(p->out, "%s\n", zBuf); 18046 } 18047 }else 18048 18049 if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){ 18050 ShellState data; 18051 char *zErrMsg = 0; 18052 int doStats = 0; 18053 memcpy(&data, p, sizeof(data)); 18054 data.showHeader = 0; 18055 data.cMode = data.mode = MODE_Semi; 18056 if( nArg==2 && optionMatch(azArg[1], "indent") ){ 18057 data.cMode = data.mode = MODE_Pretty; 18058 nArg = 1; 18059 } 18060 if( nArg!=1 ){ 18061 raw_printf(stderr, "Usage: .fullschema ?--indent?\n"); 18062 rc = 1; 18063 goto meta_command_exit; 18064 } 18065 open_db(p, 0); 18066 rc = sqlite3_exec(p->db, 18067 "SELECT sql FROM" 18068 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x" 18069 " FROM sqlite_schema UNION ALL" 18070 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_schema) " 18071 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' " 18072 "ORDER BY rowid", 18073 callback, &data, &zErrMsg 18074 ); 18075 if( rc==SQLITE_OK ){ 18076 sqlite3_stmt *pStmt; 18077 rc = sqlite3_prepare_v2(p->db, 18078 "SELECT rowid FROM sqlite_schema" 18079 " WHERE name GLOB 'sqlite_stat[134]'", 18080 -1, &pStmt, 0); 18081 doStats = sqlite3_step(pStmt)==SQLITE_ROW; 18082 sqlite3_finalize(pStmt); 18083 } 18084 if( doStats==0 ){ 18085 raw_printf(p->out, "/* No STAT tables available */\n"); 18086 }else{ 18087 raw_printf(p->out, "ANALYZE sqlite_schema;\n"); 18088 sqlite3_exec(p->db, "SELECT 'ANALYZE sqlite_schema'", 18089 callback, &data, &zErrMsg); 18090 data.cMode = data.mode = MODE_Insert; 18091 data.zDestTable = "sqlite_stat1"; 18092 shell_exec(&data, "SELECT * FROM sqlite_stat1", &zErrMsg); 18093 data.zDestTable = "sqlite_stat4"; 18094 shell_exec(&data, "SELECT * FROM sqlite_stat4", &zErrMsg); 18095 raw_printf(p->out, "ANALYZE sqlite_schema;\n"); 18096 } 18097 }else 18098 18099 if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){ 18100 if( nArg==2 ){ 18101 p->showHeader = booleanValue(azArg[1]); 18102 p->shellFlgs |= SHFLG_HeaderSet; 18103 }else{ 18104 raw_printf(stderr, "Usage: .headers on|off\n"); 18105 rc = 1; 18106 } 18107 }else 18108 18109 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){ 18110 if( nArg>=2 ){ 18111 n = showHelp(p->out, azArg[1]); 18112 if( n==0 ){ 18113 utf8_printf(p->out, "Nothing matches '%s'\n", azArg[1]); 18114 } 18115 }else{ 18116 showHelp(p->out, 0); 18117 } 18118 }else 18119 18120 if( c=='i' && strncmp(azArg[0], "import", n)==0 ){ 18121 char *zTable = 0; /* Insert data into this table */ 18122 char *zFile = 0; /* Name of file to extra content from */ 18123 sqlite3_stmt *pStmt = NULL; /* A statement */ 18124 int nCol; /* Number of columns in the table */ 18125 int nByte; /* Number of bytes in an SQL string */ 18126 int i, j; /* Loop counters */ 18127 int needCommit; /* True to COMMIT or ROLLBACK at end */ 18128 int nSep; /* Number of bytes in p->colSeparator[] */ 18129 char *zSql; /* An SQL statement */ 18130 ImportCtx sCtx; /* Reader context */ 18131 char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */ 18132 int eVerbose = 0; /* Larger for more console output */ 18133 int nSkip = 0; /* Initial lines to skip */ 18134 int useOutputMode = 1; /* Use output mode to determine separators */ 18135 18136 memset(&sCtx, 0, sizeof(sCtx)); 18137 if( p->mode==MODE_Ascii ){ 18138 xRead = ascii_read_one_field; 18139 }else{ 18140 xRead = csv_read_one_field; 18141 } 18142 for(i=1; i<nArg; i++){ 18143 char *z = azArg[i]; 18144 if( z[0]=='-' && z[1]=='-' ) z++; 18145 if( z[0]!='-' ){ 18146 if( zFile==0 ){ 18147 zFile = z; 18148 }else if( zTable==0 ){ 18149 zTable = z; 18150 }else{ 18151 utf8_printf(p->out, "ERROR: extra argument: \"%s\". Usage:\n", z); 18152 showHelp(p->out, "import"); 18153 rc = 1; 18154 goto meta_command_exit; 18155 } 18156 }else if( strcmp(z,"-v")==0 ){ 18157 eVerbose++; 18158 }else if( strcmp(z,"-skip")==0 && i<nArg-1 ){ 18159 nSkip = integerValue(azArg[++i]); 18160 }else if( strcmp(z,"-ascii")==0 ){ 18161 sCtx.cColSep = SEP_Unit[0]; 18162 sCtx.cRowSep = SEP_Record[0]; 18163 xRead = ascii_read_one_field; 18164 useOutputMode = 0; 18165 }else if( strcmp(z,"-csv")==0 ){ 18166 sCtx.cColSep = ','; 18167 sCtx.cRowSep = '\n'; 18168 xRead = csv_read_one_field; 18169 useOutputMode = 0; 18170 }else{ 18171 utf8_printf(p->out, "ERROR: unknown option: \"%s\". Usage:\n", z); 18172 showHelp(p->out, "import"); 18173 rc = 1; 18174 goto meta_command_exit; 18175 } 18176 } 18177 if( zTable==0 ){ 18178 utf8_printf(p->out, "ERROR: missing %s argument. Usage:\n", 18179 zFile==0 ? "FILE" : "TABLE"); 18180 showHelp(p->out, "import"); 18181 rc = 1; 18182 goto meta_command_exit; 18183 } 18184 seenInterrupt = 0; 18185 open_db(p, 0); 18186 if( useOutputMode ){ 18187 /* If neither the --csv or --ascii options are specified, then set 18188 ** the column and row separator characters from the output mode. */ 18189 nSep = strlen30(p->colSeparator); 18190 if( nSep==0 ){ 18191 raw_printf(stderr, 18192 "Error: non-null column separator required for import\n"); 18193 rc = 1; 18194 goto meta_command_exit; 18195 } 18196 if( nSep>1 ){ 18197 raw_printf(stderr, 18198 "Error: multi-character column separators not allowed" 18199 " for import\n"); 18200 rc = 1; 18201 goto meta_command_exit; 18202 } 18203 nSep = strlen30(p->rowSeparator); 18204 if( nSep==0 ){ 18205 raw_printf(stderr, 18206 "Error: non-null row separator required for import\n"); 18207 rc = 1; 18208 goto meta_command_exit; 18209 } 18210 if( nSep==2 && p->mode==MODE_Csv && strcmp(p->rowSeparator,SEP_CrLf)==0 ){ 18211 /* When importing CSV (only), if the row separator is set to the 18212 ** default output row separator, change it to the default input 18213 ** row separator. This avoids having to maintain different input 18214 ** and output row separators. */ 18215 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 18216 nSep = strlen30(p->rowSeparator); 18217 } 18218 if( nSep>1 ){ 18219 raw_printf(stderr, "Error: multi-character row separators not allowed" 18220 " for import\n"); 18221 rc = 1; 18222 goto meta_command_exit; 18223 } 18224 sCtx.cColSep = p->colSeparator[0]; 18225 sCtx.cRowSep = p->rowSeparator[0]; 18226 } 18227 sCtx.zFile = zFile; 18228 sCtx.nLine = 1; 18229 if( sCtx.zFile[0]=='|' ){ 18230 #ifdef SQLITE_OMIT_POPEN 18231 raw_printf(stderr, "Error: pipes are not supported in this OS\n"); 18232 rc = 1; 18233 goto meta_command_exit; 18234 #else 18235 sCtx.in = popen(sCtx.zFile+1, "r"); 18236 sCtx.zFile = "<pipe>"; 18237 sCtx.xCloser = pclose; 18238 #endif 18239 }else{ 18240 sCtx.in = fopen(sCtx.zFile, "rb"); 18241 sCtx.xCloser = fclose; 18242 } 18243 if( sCtx.in==0 ){ 18244 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile); 18245 rc = 1; 18246 goto meta_command_exit; 18247 } 18248 if( eVerbose>=2 || (eVerbose>=1 && useOutputMode) ){ 18249 char zSep[2]; 18250 zSep[1] = 0; 18251 zSep[0] = sCtx.cColSep; 18252 utf8_printf(p->out, "Column separator "); 18253 output_c_string(p->out, zSep); 18254 utf8_printf(p->out, ", row separator "); 18255 zSep[0] = sCtx.cRowSep; 18256 output_c_string(p->out, zSep); 18257 utf8_printf(p->out, "\n"); 18258 } 18259 while( (nSkip--)>0 ){ 18260 while( xRead(&sCtx) && sCtx.cTerm==sCtx.cColSep ){} 18261 } 18262 zSql = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable); 18263 if( zSql==0 ){ 18264 import_cleanup(&sCtx); 18265 shell_out_of_memory(); 18266 } 18267 nByte = strlen30(zSql); 18268 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 18269 import_append_char(&sCtx, 0); /* To ensure sCtx.z is allocated */ 18270 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){ 18271 char *zCreate = sqlite3_mprintf("CREATE TABLE \"%w\"", zTable); 18272 char cSep = '('; 18273 while( xRead(&sCtx) ){ 18274 zCreate = sqlite3_mprintf("%z%c\n \"%w\" TEXT", zCreate, cSep, sCtx.z); 18275 cSep = ','; 18276 if( sCtx.cTerm!=sCtx.cColSep ) break; 18277 } 18278 if( cSep=='(' ){ 18279 sqlite3_free(zCreate); 18280 import_cleanup(&sCtx); 18281 utf8_printf(stderr,"%s: empty file\n", sCtx.zFile); 18282 rc = 1; 18283 goto meta_command_exit; 18284 } 18285 zCreate = sqlite3_mprintf("%z\n)", zCreate); 18286 if( eVerbose>=1 ){ 18287 utf8_printf(p->out, "%s\n", zCreate); 18288 } 18289 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0); 18290 sqlite3_free(zCreate); 18291 if( rc ){ 18292 utf8_printf(stderr, "CREATE TABLE \"%s\"(...) failed: %s\n", zTable, 18293 sqlite3_errmsg(p->db)); 18294 import_cleanup(&sCtx); 18295 rc = 1; 18296 goto meta_command_exit; 18297 } 18298 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 18299 } 18300 sqlite3_free(zSql); 18301 if( rc ){ 18302 if (pStmt) sqlite3_finalize(pStmt); 18303 utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db)); 18304 import_cleanup(&sCtx); 18305 rc = 1; 18306 goto meta_command_exit; 18307 } 18308 nCol = sqlite3_column_count(pStmt); 18309 sqlite3_finalize(pStmt); 18310 pStmt = 0; 18311 if( nCol==0 ) return 0; /* no columns, no error */ 18312 zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 ); 18313 if( zSql==0 ){ 18314 import_cleanup(&sCtx); 18315 shell_out_of_memory(); 18316 } 18317 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable); 18318 j = strlen30(zSql); 18319 for(i=1; i<nCol; i++){ 18320 zSql[j++] = ','; 18321 zSql[j++] = '?'; 18322 } 18323 zSql[j++] = ')'; 18324 zSql[j] = 0; 18325 if( eVerbose>=2 ){ 18326 utf8_printf(p->out, "Insert using: %s\n", zSql); 18327 } 18328 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 18329 sqlite3_free(zSql); 18330 if( rc ){ 18331 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); 18332 if (pStmt) sqlite3_finalize(pStmt); 18333 import_cleanup(&sCtx); 18334 rc = 1; 18335 goto meta_command_exit; 18336 } 18337 needCommit = sqlite3_get_autocommit(p->db); 18338 if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0); 18339 do{ 18340 int startLine = sCtx.nLine; 18341 for(i=0; i<nCol; i++){ 18342 char *z = xRead(&sCtx); 18343 /* 18344 ** Did we reach end-of-file before finding any columns? 18345 ** If so, stop instead of NULL filling the remaining columns. 18346 */ 18347 if( z==0 && i==0 ) break; 18348 /* 18349 ** Did we reach end-of-file OR end-of-line before finding any 18350 ** columns in ASCII mode? If so, stop instead of NULL filling 18351 ** the remaining columns. 18352 */ 18353 if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break; 18354 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT); 18355 if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){ 18356 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - " 18357 "filling the rest with NULL\n", 18358 sCtx.zFile, startLine, nCol, i+1); 18359 i += 2; 18360 while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; } 18361 } 18362 } 18363 if( sCtx.cTerm==sCtx.cColSep ){ 18364 do{ 18365 xRead(&sCtx); 18366 i++; 18367 }while( sCtx.cTerm==sCtx.cColSep ); 18368 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - " 18369 "extras ignored\n", 18370 sCtx.zFile, startLine, nCol, i); 18371 } 18372 if( i>=nCol ){ 18373 sqlite3_step(pStmt); 18374 rc = sqlite3_reset(pStmt); 18375 if( rc!=SQLITE_OK ){ 18376 utf8_printf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile, 18377 startLine, sqlite3_errmsg(p->db)); 18378 sCtx.nErr++; 18379 }else{ 18380 sCtx.nRow++; 18381 } 18382 } 18383 }while( sCtx.cTerm!=EOF ); 18384 18385 import_cleanup(&sCtx); 18386 sqlite3_finalize(pStmt); 18387 if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0); 18388 if( eVerbose>0 ){ 18389 utf8_printf(p->out, 18390 "Added %d rows with %d errors using %d lines of input\n", 18391 sCtx.nRow, sCtx.nErr, sCtx.nLine-1); 18392 } 18393 }else 18394 18395 #ifndef SQLITE_UNTESTABLE 18396 if( c=='i' && strncmp(azArg[0], "imposter", n)==0 ){ 18397 char *zSql; 18398 char *zCollist = 0; 18399 sqlite3_stmt *pStmt; 18400 int tnum = 0; 18401 int isWO = 0; /* True if making an imposter of a WITHOUT ROWID table */ 18402 int lenPK = 0; /* Length of the PRIMARY KEY string for isWO tables */ 18403 int i; 18404 if( !(nArg==3 || (nArg==2 && sqlite3_stricmp(azArg[1],"off")==0)) ){ 18405 utf8_printf(stderr, "Usage: .imposter INDEX IMPOSTER\n" 18406 " .imposter off\n"); 18407 /* Also allowed, but not documented: 18408 ** 18409 ** .imposter TABLE IMPOSTER 18410 ** 18411 ** where TABLE is a WITHOUT ROWID table. In that case, the 18412 ** imposter is another WITHOUT ROWID table with the columns in 18413 ** storage order. */ 18414 rc = 1; 18415 goto meta_command_exit; 18416 } 18417 open_db(p, 0); 18418 if( nArg==2 ){ 18419 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 1); 18420 goto meta_command_exit; 18421 } 18422 zSql = sqlite3_mprintf( 18423 "SELECT rootpage, 0 FROM sqlite_schema" 18424 " WHERE name='%q' AND type='index'" 18425 "UNION ALL " 18426 "SELECT rootpage, 1 FROM sqlite_schema" 18427 " WHERE name='%q' AND type='table'" 18428 " AND sql LIKE '%%without%%rowid%%'", 18429 azArg[1], azArg[1] 18430 ); 18431 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 18432 sqlite3_free(zSql); 18433 if( sqlite3_step(pStmt)==SQLITE_ROW ){ 18434 tnum = sqlite3_column_int(pStmt, 0); 18435 isWO = sqlite3_column_int(pStmt, 1); 18436 } 18437 sqlite3_finalize(pStmt); 18438 zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]); 18439 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 18440 sqlite3_free(zSql); 18441 i = 0; 18442 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 18443 char zLabel[20]; 18444 const char *zCol = (const char*)sqlite3_column_text(pStmt,2); 18445 i++; 18446 if( zCol==0 ){ 18447 if( sqlite3_column_int(pStmt,1)==-1 ){ 18448 zCol = "_ROWID_"; 18449 }else{ 18450 sqlite3_snprintf(sizeof(zLabel),zLabel,"expr%d",i); 18451 zCol = zLabel; 18452 } 18453 } 18454 if( isWO && lenPK==0 && sqlite3_column_int(pStmt,5)==0 && zCollist ){ 18455 lenPK = (int)strlen(zCollist); 18456 } 18457 if( zCollist==0 ){ 18458 zCollist = sqlite3_mprintf("\"%w\"", zCol); 18459 }else{ 18460 zCollist = sqlite3_mprintf("%z,\"%w\"", zCollist, zCol); 18461 } 18462 } 18463 sqlite3_finalize(pStmt); 18464 if( i==0 || tnum==0 ){ 18465 utf8_printf(stderr, "no such index: \"%s\"\n", azArg[1]); 18466 rc = 1; 18467 sqlite3_free(zCollist); 18468 goto meta_command_exit; 18469 } 18470 if( lenPK==0 ) lenPK = 100000; 18471 zSql = sqlite3_mprintf( 18472 "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%.*s))WITHOUT ROWID", 18473 azArg[2], zCollist, lenPK, zCollist); 18474 sqlite3_free(zCollist); 18475 rc = sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 1, tnum); 18476 if( rc==SQLITE_OK ){ 18477 rc = sqlite3_exec(p->db, zSql, 0, 0, 0); 18478 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 0); 18479 if( rc ){ 18480 utf8_printf(stderr, "Error in [%s]: %s\n", zSql, sqlite3_errmsg(p->db)); 18481 }else{ 18482 utf8_printf(stdout, "%s;\n", zSql); 18483 raw_printf(stdout, 18484 "WARNING: writing to an imposter table will corrupt the \"%s\" %s!\n", 18485 azArg[1], isWO ? "table" : "index" 18486 ); 18487 } 18488 }else{ 18489 raw_printf(stderr, "SQLITE_TESTCTRL_IMPOSTER returns %d\n", rc); 18490 rc = 1; 18491 } 18492 sqlite3_free(zSql); 18493 }else 18494 #endif /* !defined(SQLITE_OMIT_TEST_CONTROL) */ 18495 18496 #ifdef SQLITE_ENABLE_IOTRACE 18497 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){ 18498 SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...); 18499 if( iotrace && iotrace!=stdout ) fclose(iotrace); 18500 iotrace = 0; 18501 if( nArg<2 ){ 18502 sqlite3IoTrace = 0; 18503 }else if( strcmp(azArg[1], "-")==0 ){ 18504 sqlite3IoTrace = iotracePrintf; 18505 iotrace = stdout; 18506 }else{ 18507 iotrace = fopen(azArg[1], "w"); 18508 if( iotrace==0 ){ 18509 utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]); 18510 sqlite3IoTrace = 0; 18511 rc = 1; 18512 }else{ 18513 sqlite3IoTrace = iotracePrintf; 18514 } 18515 } 18516 }else 18517 #endif 18518 18519 if( c=='l' && n>=5 && strncmp(azArg[0], "limits", n)==0 ){ 18520 static const struct { 18521 const char *zLimitName; /* Name of a limit */ 18522 int limitCode; /* Integer code for that limit */ 18523 } aLimit[] = { 18524 { "length", SQLITE_LIMIT_LENGTH }, 18525 { "sql_length", SQLITE_LIMIT_SQL_LENGTH }, 18526 { "column", SQLITE_LIMIT_COLUMN }, 18527 { "expr_depth", SQLITE_LIMIT_EXPR_DEPTH }, 18528 { "compound_select", SQLITE_LIMIT_COMPOUND_SELECT }, 18529 { "vdbe_op", SQLITE_LIMIT_VDBE_OP }, 18530 { "function_arg", SQLITE_LIMIT_FUNCTION_ARG }, 18531 { "attached", SQLITE_LIMIT_ATTACHED }, 18532 { "like_pattern_length", SQLITE_LIMIT_LIKE_PATTERN_LENGTH }, 18533 { "variable_number", SQLITE_LIMIT_VARIABLE_NUMBER }, 18534 { "trigger_depth", SQLITE_LIMIT_TRIGGER_DEPTH }, 18535 { "worker_threads", SQLITE_LIMIT_WORKER_THREADS }, 18536 }; 18537 int i, n2; 18538 open_db(p, 0); 18539 if( nArg==1 ){ 18540 for(i=0; i<ArraySize(aLimit); i++){ 18541 printf("%20s %d\n", aLimit[i].zLimitName, 18542 sqlite3_limit(p->db, aLimit[i].limitCode, -1)); 18543 } 18544 }else if( nArg>3 ){ 18545 raw_printf(stderr, "Usage: .limit NAME ?NEW-VALUE?\n"); 18546 rc = 1; 18547 goto meta_command_exit; 18548 }else{ 18549 int iLimit = -1; 18550 n2 = strlen30(azArg[1]); 18551 for(i=0; i<ArraySize(aLimit); i++){ 18552 if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){ 18553 if( iLimit<0 ){ 18554 iLimit = i; 18555 }else{ 18556 utf8_printf(stderr, "ambiguous limit: \"%s\"\n", azArg[1]); 18557 rc = 1; 18558 goto meta_command_exit; 18559 } 18560 } 18561 } 18562 if( iLimit<0 ){ 18563 utf8_printf(stderr, "unknown limit: \"%s\"\n" 18564 "enter \".limits\" with no arguments for a list.\n", 18565 azArg[1]); 18566 rc = 1; 18567 goto meta_command_exit; 18568 } 18569 if( nArg==3 ){ 18570 sqlite3_limit(p->db, aLimit[iLimit].limitCode, 18571 (int)integerValue(azArg[2])); 18572 } 18573 printf("%20s %d\n", aLimit[iLimit].zLimitName, 18574 sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1)); 18575 } 18576 }else 18577 18578 if( c=='l' && n>2 && strncmp(azArg[0], "lint", n)==0 ){ 18579 open_db(p, 0); 18580 lintDotCommand(p, azArg, nArg); 18581 }else 18582 18583 #ifndef SQLITE_OMIT_LOAD_EXTENSION 18584 if( c=='l' && strncmp(azArg[0], "load", n)==0 ){ 18585 const char *zFile, *zProc; 18586 char *zErrMsg = 0; 18587 if( nArg<2 ){ 18588 raw_printf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n"); 18589 rc = 1; 18590 goto meta_command_exit; 18591 } 18592 zFile = azArg[1]; 18593 zProc = nArg>=3 ? azArg[2] : 0; 18594 open_db(p, 0); 18595 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg); 18596 if( rc!=SQLITE_OK ){ 18597 utf8_printf(stderr, "Error: %s\n", zErrMsg); 18598 sqlite3_free(zErrMsg); 18599 rc = 1; 18600 } 18601 }else 18602 #endif 18603 18604 if( c=='l' && strncmp(azArg[0], "log", n)==0 ){ 18605 if( nArg!=2 ){ 18606 raw_printf(stderr, "Usage: .log FILENAME\n"); 18607 rc = 1; 18608 }else{ 18609 const char *zFile = azArg[1]; 18610 output_file_close(p->pLog); 18611 p->pLog = output_file_open(zFile, 0); 18612 } 18613 }else 18614 18615 if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){ 18616 const char *zMode = nArg>=2 ? azArg[1] : ""; 18617 int n2 = strlen30(zMode); 18618 int c2 = zMode[0]; 18619 if( c2=='l' && n2>2 && strncmp(azArg[1],"lines",n2)==0 ){ 18620 p->mode = MODE_Line; 18621 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 18622 }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){ 18623 p->mode = MODE_Column; 18624 if( (p->shellFlgs & SHFLG_HeaderSet)==0 ){ 18625 p->showHeader = 1; 18626 } 18627 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 18628 }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){ 18629 p->mode = MODE_List; 18630 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Column); 18631 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 18632 }else if( c2=='h' && strncmp(azArg[1],"html",n2)==0 ){ 18633 p->mode = MODE_Html; 18634 }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){ 18635 p->mode = MODE_Tcl; 18636 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space); 18637 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 18638 }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){ 18639 p->mode = MODE_Csv; 18640 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma); 18641 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf); 18642 }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){ 18643 p->mode = MODE_List; 18644 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab); 18645 }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){ 18646 p->mode = MODE_Insert; 18647 set_table_name(p, nArg>=3 ? azArg[2] : "table"); 18648 }else if( c2=='q' && strncmp(azArg[1],"quote",n2)==0 ){ 18649 p->mode = MODE_Quote; 18650 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma); 18651 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 18652 }else if( c2=='a' && strncmp(azArg[1],"ascii",n2)==0 ){ 18653 p->mode = MODE_Ascii; 18654 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit); 18655 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record); 18656 }else if( c2=='m' && strncmp(azArg[1],"markdown",n2)==0 ){ 18657 p->mode = MODE_Markdown; 18658 }else if( c2=='t' && strncmp(azArg[1],"table",n2)==0 ){ 18659 p->mode = MODE_Table; 18660 }else if( c2=='b' && strncmp(azArg[1],"box",n2)==0 ){ 18661 p->mode = MODE_Box; 18662 }else if( c2=='j' && strncmp(azArg[1],"json",n2)==0 ){ 18663 p->mode = MODE_Json; 18664 }else if( nArg==1 ){ 18665 raw_printf(p->out, "current output mode: %s\n", modeDescr[p->mode]); 18666 }else{ 18667 raw_printf(stderr, "Error: mode should be one of: " 18668 "ascii box column csv html insert json line list markdown " 18669 "quote table tabs tcl\n"); 18670 rc = 1; 18671 } 18672 p->cMode = p->mode; 18673 }else 18674 18675 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){ 18676 if( nArg==2 ){ 18677 sqlite3_snprintf(sizeof(p->nullValue), p->nullValue, 18678 "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]); 18679 }else{ 18680 raw_printf(stderr, "Usage: .nullvalue STRING\n"); 18681 rc = 1; 18682 } 18683 }else 18684 18685 #ifdef SQLITE_DEBUG 18686 if( c=='o' && strcmp(azArg[0],"oom")==0 ){ 18687 int i; 18688 for(i=1; i<nArg; i++){ 18689 const char *z = azArg[i]; 18690 if( z[0]=='-' && z[1]=='-' ) z++; 18691 if( strcmp(z,"-repeat")==0 ){ 18692 if( i==nArg-1 ){ 18693 raw_printf(p->out, "missing argument on \"%s\"\n", azArg[i]); 18694 rc = 1; 18695 }else{ 18696 oomRepeat = (int)integerValue(azArg[++i]); 18697 } 18698 }else if( IsDigit(z[0]) ){ 18699 oomCounter = (int)integerValue(azArg[i]); 18700 }else{ 18701 raw_printf(p->out, "unknown argument: \"%s\"\n", azArg[i]); 18702 raw_printf(p->out, "Usage: .oom [--repeat N] [M]\n"); 18703 rc = 1; 18704 } 18705 } 18706 if( rc==0 ){ 18707 raw_printf(p->out, "oomCounter = %d\n", oomCounter); 18708 raw_printf(p->out, "oomRepeat = %d\n", oomRepeat); 18709 } 18710 }else 18711 #endif /* SQLITE_DEBUG */ 18712 18713 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){ 18714 char *zNewFilename; /* Name of the database file to open */ 18715 int iName = 1; /* Index in azArg[] of the filename */ 18716 int newFlag = 0; /* True to delete file before opening */ 18717 /* Close the existing database */ 18718 session_close_all(p); 18719 close_db(p->db); 18720 p->db = 0; 18721 p->zDbFilename = 0; 18722 sqlite3_free(p->zFreeOnClose); 18723 p->zFreeOnClose = 0; 18724 p->openMode = SHELL_OPEN_UNSPEC; 18725 p->openFlags = 0; 18726 p->szMax = 0; 18727 /* Check for command-line arguments */ 18728 for(iName=1; iName<nArg && azArg[iName][0]=='-'; iName++){ 18729 const char *z = azArg[iName]; 18730 if( optionMatch(z,"new") ){ 18731 newFlag = 1; 18732 #ifdef SQLITE_HAVE_ZLIB 18733 }else if( optionMatch(z, "zip") ){ 18734 p->openMode = SHELL_OPEN_ZIPFILE; 18735 #endif 18736 }else if( optionMatch(z, "append") ){ 18737 p->openMode = SHELL_OPEN_APPENDVFS; 18738 }else if( optionMatch(z, "readonly") ){ 18739 p->openMode = SHELL_OPEN_READONLY; 18740 }else if( optionMatch(z, "nofollow") ){ 18741 p->openFlags |= SQLITE_OPEN_NOFOLLOW; 18742 #ifdef SQLITE_ENABLE_DESERIALIZE 18743 }else if( optionMatch(z, "deserialize") ){ 18744 p->openMode = SHELL_OPEN_DESERIALIZE; 18745 }else if( optionMatch(z, "hexdb") ){ 18746 p->openMode = SHELL_OPEN_HEXDB; 18747 }else if( optionMatch(z, "maxsize") && iName+1<nArg ){ 18748 p->szMax = integerValue(azArg[++iName]); 18749 #endif /* SQLITE_ENABLE_DESERIALIZE */ 18750 }else if( z[0]=='-' ){ 18751 utf8_printf(stderr, "unknown option: %s\n", z); 18752 rc = 1; 18753 goto meta_command_exit; 18754 } 18755 } 18756 /* If a filename is specified, try to open it first */ 18757 zNewFilename = nArg>iName ? sqlite3_mprintf("%s", azArg[iName]) : 0; 18758 if( zNewFilename || p->openMode==SHELL_OPEN_HEXDB ){ 18759 if( newFlag ) shellDeleteFile(zNewFilename); 18760 p->zDbFilename = zNewFilename; 18761 open_db(p, OPEN_DB_KEEPALIVE); 18762 if( p->db==0 ){ 18763 utf8_printf(stderr, "Error: cannot open '%s'\n", zNewFilename); 18764 sqlite3_free(zNewFilename); 18765 }else{ 18766 p->zFreeOnClose = zNewFilename; 18767 } 18768 } 18769 if( p->db==0 ){ 18770 /* As a fall-back open a TEMP database */ 18771 p->zDbFilename = 0; 18772 open_db(p, 0); 18773 } 18774 }else 18775 18776 if( (c=='o' 18777 && (strncmp(azArg[0], "output", n)==0||strncmp(azArg[0], "once", n)==0)) 18778 || (c=='e' && n==5 && strcmp(azArg[0],"excel")==0) 18779 ){ 18780 const char *zFile = 0; 18781 int bTxtMode = 0; 18782 int i; 18783 int eMode = 0; 18784 int bBOM = 0; 18785 int bOnce = 0; /* 0: .output, 1: .once, 2: .excel */ 18786 18787 if( c=='e' ){ 18788 eMode = 'x'; 18789 bOnce = 2; 18790 }else if( strncmp(azArg[0],"once",n)==0 ){ 18791 bOnce = 1; 18792 } 18793 for(i=1; i<nArg; i++){ 18794 char *z = azArg[i]; 18795 if( z[0]=='-' ){ 18796 if( z[1]=='-' ) z++; 18797 if( strcmp(z,"-bom")==0 ){ 18798 bBOM = 1; 18799 }else if( c!='e' && strcmp(z,"-x")==0 ){ 18800 eMode = 'x'; /* spreadsheet */ 18801 }else if( c!='e' && strcmp(z,"-e")==0 ){ 18802 eMode = 'e'; /* text editor */ 18803 }else{ 18804 utf8_printf(p->out, "ERROR: unknown option: \"%s\". Usage:\n", 18805 azArg[i]); 18806 showHelp(p->out, azArg[0]); 18807 rc = 1; 18808 goto meta_command_exit; 18809 } 18810 }else if( zFile==0 ){ 18811 zFile = z; 18812 }else{ 18813 utf8_printf(p->out,"ERROR: extra parameter: \"%s\". Usage:\n", 18814 azArg[i]); 18815 showHelp(p->out, azArg[0]); 18816 rc = 1; 18817 goto meta_command_exit; 18818 } 18819 } 18820 if( zFile==0 ) zFile = "stdout"; 18821 if( bOnce ){ 18822 p->outCount = 2; 18823 }else{ 18824 p->outCount = 0; 18825 } 18826 output_reset(p); 18827 #ifndef SQLITE_NOHAVE_SYSTEM 18828 if( eMode=='e' || eMode=='x' ){ 18829 p->doXdgOpen = 1; 18830 outputModePush(p); 18831 if( eMode=='x' ){ 18832 /* spreadsheet mode. Output as CSV. */ 18833 newTempFile(p, "csv"); 18834 ShellClearFlag(p, SHFLG_Echo); 18835 p->mode = MODE_Csv; 18836 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma); 18837 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf); 18838 }else{ 18839 /* text editor mode */ 18840 newTempFile(p, "txt"); 18841 bTxtMode = 1; 18842 } 18843 zFile = p->zTempFile; 18844 } 18845 #endif /* SQLITE_NOHAVE_SYSTEM */ 18846 if( zFile[0]=='|' ){ 18847 #ifdef SQLITE_OMIT_POPEN 18848 raw_printf(stderr, "Error: pipes are not supported in this OS\n"); 18849 rc = 1; 18850 p->out = stdout; 18851 #else 18852 p->out = popen(zFile + 1, "w"); 18853 if( p->out==0 ){ 18854 utf8_printf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1); 18855 p->out = stdout; 18856 rc = 1; 18857 }else{ 18858 if( bBOM ) fprintf(p->out,"\357\273\277"); 18859 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile); 18860 } 18861 #endif 18862 }else{ 18863 p->out = output_file_open(zFile, bTxtMode); 18864 if( p->out==0 ){ 18865 if( strcmp(zFile,"off")!=0 ){ 18866 utf8_printf(stderr,"Error: cannot write to \"%s\"\n", zFile); 18867 } 18868 p->out = stdout; 18869 rc = 1; 18870 } else { 18871 if( bBOM ) fprintf(p->out,"\357\273\277"); 18872 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile); 18873 } 18874 } 18875 }else 18876 18877 if( c=='p' && n>=3 && strncmp(azArg[0], "parameter", n)==0 ){ 18878 open_db(p,0); 18879 if( nArg<=1 ) goto parameter_syntax_error; 18880 18881 /* .parameter clear 18882 ** Clear all bind parameters by dropping the TEMP table that holds them. 18883 */ 18884 if( nArg==2 && strcmp(azArg[1],"clear")==0 ){ 18885 sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp.sqlite_parameters;", 18886 0, 0, 0); 18887 }else 18888 18889 /* .parameter list 18890 ** List all bind parameters. 18891 */ 18892 if( nArg==2 && strcmp(azArg[1],"list")==0 ){ 18893 sqlite3_stmt *pStmt = 0; 18894 int rx; 18895 int len = 0; 18896 rx = sqlite3_prepare_v2(p->db, 18897 "SELECT max(length(key)) " 18898 "FROM temp.sqlite_parameters;", -1, &pStmt, 0); 18899 if( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){ 18900 len = sqlite3_column_int(pStmt, 0); 18901 if( len>40 ) len = 40; 18902 } 18903 sqlite3_finalize(pStmt); 18904 pStmt = 0; 18905 if( len ){ 18906 rx = sqlite3_prepare_v2(p->db, 18907 "SELECT key, quote(value) " 18908 "FROM temp.sqlite_parameters;", -1, &pStmt, 0); 18909 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 18910 utf8_printf(p->out, "%-*s %s\n", len, sqlite3_column_text(pStmt,0), 18911 sqlite3_column_text(pStmt,1)); 18912 } 18913 sqlite3_finalize(pStmt); 18914 } 18915 }else 18916 18917 /* .parameter init 18918 ** Make sure the TEMP table used to hold bind parameters exists. 18919 ** Create it if necessary. 18920 */ 18921 if( nArg==2 && strcmp(azArg[1],"init")==0 ){ 18922 bind_table_init(p); 18923 }else 18924 18925 /* .parameter set NAME VALUE 18926 ** Set or reset a bind parameter. NAME should be the full parameter 18927 ** name exactly as it appears in the query. (ex: $abc, @def). The 18928 ** VALUE can be in either SQL literal notation, or if not it will be 18929 ** understood to be a text string. 18930 */ 18931 if( nArg==4 && strcmp(azArg[1],"set")==0 ){ 18932 int rx; 18933 char *zSql; 18934 sqlite3_stmt *pStmt; 18935 const char *zKey = azArg[2]; 18936 const char *zValue = azArg[3]; 18937 bind_table_init(p); 18938 zSql = sqlite3_mprintf( 18939 "REPLACE INTO temp.sqlite_parameters(key,value)" 18940 "VALUES(%Q,%s);", zKey, zValue); 18941 if( zSql==0 ) shell_out_of_memory(); 18942 pStmt = 0; 18943 rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 18944 sqlite3_free(zSql); 18945 if( rx!=SQLITE_OK ){ 18946 sqlite3_finalize(pStmt); 18947 pStmt = 0; 18948 zSql = sqlite3_mprintf( 18949 "REPLACE INTO temp.sqlite_parameters(key,value)" 18950 "VALUES(%Q,%Q);", zKey, zValue); 18951 if( zSql==0 ) shell_out_of_memory(); 18952 rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 18953 sqlite3_free(zSql); 18954 if( rx!=SQLITE_OK ){ 18955 utf8_printf(p->out, "Error: %s\n", sqlite3_errmsg(p->db)); 18956 sqlite3_finalize(pStmt); 18957 pStmt = 0; 18958 rc = 1; 18959 } 18960 } 18961 sqlite3_step(pStmt); 18962 sqlite3_finalize(pStmt); 18963 }else 18964 18965 /* .parameter unset NAME 18966 ** Remove the NAME binding from the parameter binding table, if it 18967 ** exists. 18968 */ 18969 if( nArg==3 && strcmp(azArg[1],"unset")==0 ){ 18970 char *zSql = sqlite3_mprintf( 18971 "DELETE FROM temp.sqlite_parameters WHERE key=%Q", azArg[2]); 18972 if( zSql==0 ) shell_out_of_memory(); 18973 sqlite3_exec(p->db, zSql, 0, 0, 0); 18974 sqlite3_free(zSql); 18975 }else 18976 /* If no command name matches, show a syntax error */ 18977 parameter_syntax_error: 18978 showHelp(p->out, "parameter"); 18979 }else 18980 18981 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){ 18982 int i; 18983 for(i=1; i<nArg; i++){ 18984 if( i>1 ) raw_printf(p->out, " "); 18985 utf8_printf(p->out, "%s", azArg[i]); 18986 } 18987 raw_printf(p->out, "\n"); 18988 }else 18989 18990 #ifndef SQLITE_OMIT_PROGRESS_CALLBACK 18991 if( c=='p' && n>=3 && strncmp(azArg[0], "progress", n)==0 ){ 18992 int i; 18993 int nn = 0; 18994 p->flgProgress = 0; 18995 p->mxProgress = 0; 18996 p->nProgress = 0; 18997 for(i=1; i<nArg; i++){ 18998 const char *z = azArg[i]; 18999 if( z[0]=='-' ){ 19000 z++; 19001 if( z[0]=='-' ) z++; 19002 if( strcmp(z,"quiet")==0 || strcmp(z,"q")==0 ){ 19003 p->flgProgress |= SHELL_PROGRESS_QUIET; 19004 continue; 19005 } 19006 if( strcmp(z,"reset")==0 ){ 19007 p->flgProgress |= SHELL_PROGRESS_RESET; 19008 continue; 19009 } 19010 if( strcmp(z,"once")==0 ){ 19011 p->flgProgress |= SHELL_PROGRESS_ONCE; 19012 continue; 19013 } 19014 if( strcmp(z,"limit")==0 ){ 19015 if( i+1>=nArg ){ 19016 utf8_printf(stderr, "Error: missing argument on --limit\n"); 19017 rc = 1; 19018 goto meta_command_exit; 19019 }else{ 19020 p->mxProgress = (int)integerValue(azArg[++i]); 19021 } 19022 continue; 19023 } 19024 utf8_printf(stderr, "Error: unknown option: \"%s\"\n", azArg[i]); 19025 rc = 1; 19026 goto meta_command_exit; 19027 }else{ 19028 nn = (int)integerValue(z); 19029 } 19030 } 19031 open_db(p, 0); 19032 sqlite3_progress_handler(p->db, nn, progress_handler, p); 19033 }else 19034 #endif /* SQLITE_OMIT_PROGRESS_CALLBACK */ 19035 19036 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){ 19037 if( nArg >= 2) { 19038 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1); 19039 } 19040 if( nArg >= 3) { 19041 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1); 19042 } 19043 }else 19044 19045 if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){ 19046 rc = 2; 19047 }else 19048 19049 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){ 19050 FILE *inSaved = p->in; 19051 int savedLineno = p->lineno; 19052 if( nArg!=2 ){ 19053 raw_printf(stderr, "Usage: .read FILE\n"); 19054 rc = 1; 19055 goto meta_command_exit; 19056 } 19057 if( azArg[1][0]=='|' ){ 19058 p->in = popen(azArg[1]+1, "r"); 19059 if( p->in==0 ){ 19060 utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]); 19061 rc = 1; 19062 }else{ 19063 rc = process_input(p); 19064 pclose(p->in); 19065 } 19066 }else if( notNormalFile(azArg[1]) || (p->in = fopen(azArg[1], "rb"))==0 ){ 19067 utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]); 19068 rc = 1; 19069 }else{ 19070 rc = process_input(p); 19071 fclose(p->in); 19072 } 19073 p->in = inSaved; 19074 p->lineno = savedLineno; 19075 }else 19076 19077 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){ 19078 const char *zSrcFile; 19079 const char *zDb; 19080 sqlite3 *pSrc; 19081 sqlite3_backup *pBackup; 19082 int nTimeout = 0; 19083 19084 if( nArg==2 ){ 19085 zSrcFile = azArg[1]; 19086 zDb = "main"; 19087 }else if( nArg==3 ){ 19088 zSrcFile = azArg[2]; 19089 zDb = azArg[1]; 19090 }else{ 19091 raw_printf(stderr, "Usage: .restore ?DB? FILE\n"); 19092 rc = 1; 19093 goto meta_command_exit; 19094 } 19095 rc = sqlite3_open(zSrcFile, &pSrc); 19096 if( rc!=SQLITE_OK ){ 19097 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zSrcFile); 19098 close_db(pSrc); 19099 return 1; 19100 } 19101 open_db(p, 0); 19102 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main"); 19103 if( pBackup==0 ){ 19104 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); 19105 close_db(pSrc); 19106 return 1; 19107 } 19108 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK 19109 || rc==SQLITE_BUSY ){ 19110 if( rc==SQLITE_BUSY ){ 19111 if( nTimeout++ >= 3 ) break; 19112 sqlite3_sleep(100); 19113 } 19114 } 19115 sqlite3_backup_finish(pBackup); 19116 if( rc==SQLITE_DONE ){ 19117 rc = 0; 19118 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){ 19119 raw_printf(stderr, "Error: source database is busy\n"); 19120 rc = 1; 19121 }else{ 19122 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); 19123 rc = 1; 19124 } 19125 close_db(pSrc); 19126 }else 19127 19128 if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){ 19129 if( nArg==2 ){ 19130 p->scanstatsOn = (u8)booleanValue(azArg[1]); 19131 #ifndef SQLITE_ENABLE_STMT_SCANSTATUS 19132 raw_printf(stderr, "Warning: .scanstats not available in this build.\n"); 19133 #endif 19134 }else{ 19135 raw_printf(stderr, "Usage: .scanstats on|off\n"); 19136 rc = 1; 19137 } 19138 }else 19139 19140 if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){ 19141 ShellText sSelect; 19142 ShellState data; 19143 char *zErrMsg = 0; 19144 const char *zDiv = "("; 19145 const char *zName = 0; 19146 int iSchema = 0; 19147 int bDebug = 0; 19148 int bNoSystemTabs = 0; 19149 int ii; 19150 19151 open_db(p, 0); 19152 memcpy(&data, p, sizeof(data)); 19153 data.showHeader = 0; 19154 data.cMode = data.mode = MODE_Semi; 19155 initText(&sSelect); 19156 for(ii=1; ii<nArg; ii++){ 19157 if( optionMatch(azArg[ii],"indent") ){ 19158 data.cMode = data.mode = MODE_Pretty; 19159 }else if( optionMatch(azArg[ii],"debug") ){ 19160 bDebug = 1; 19161 }else if( optionMatch(azArg[ii],"nosys") ){ 19162 bNoSystemTabs = 1; 19163 }else if( azArg[ii][0]=='-' ){ 19164 utf8_printf(stderr, "Unknown option: \"%s\"\n", azArg[ii]); 19165 rc = 1; 19166 goto meta_command_exit; 19167 }else if( zName==0 ){ 19168 zName = azArg[ii]; 19169 }else{ 19170 raw_printf(stderr, "Usage: .schema ?--indent? ?--nosys? ?LIKE-PATTERN?\n"); 19171 rc = 1; 19172 goto meta_command_exit; 19173 } 19174 } 19175 if( zName!=0 ){ 19176 int isSchema = sqlite3_strlike(zName, "sqlite_master", '\\')==0 19177 || sqlite3_strlike(zName, "sqlite_schema", '\\')==0 19178 || sqlite3_strlike(zName,"sqlite_temp_master", '\\')==0 19179 || sqlite3_strlike(zName,"sqlite_temp_schema", '\\')==0; 19180 if( isSchema ){ 19181 char *new_argv[2], *new_colv[2]; 19182 new_argv[0] = sqlite3_mprintf( 19183 "CREATE TABLE %s (\n" 19184 " type text,\n" 19185 " name text,\n" 19186 " tbl_name text,\n" 19187 " rootpage integer,\n" 19188 " sql text\n" 19189 ")", zName); 19190 new_argv[1] = 0; 19191 new_colv[0] = "sql"; 19192 new_colv[1] = 0; 19193 callback(&data, 1, new_argv, new_colv); 19194 sqlite3_free(new_argv[0]); 19195 } 19196 } 19197 if( zDiv ){ 19198 sqlite3_stmt *pStmt = 0; 19199 rc = sqlite3_prepare_v2(p->db, "SELECT name FROM pragma_database_list", 19200 -1, &pStmt, 0); 19201 if( rc ){ 19202 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); 19203 sqlite3_finalize(pStmt); 19204 rc = 1; 19205 goto meta_command_exit; 19206 } 19207 appendText(&sSelect, "SELECT sql FROM", 0); 19208 iSchema = 0; 19209 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 19210 const char *zDb = (const char*)sqlite3_column_text(pStmt, 0); 19211 char zScNum[30]; 19212 sqlite3_snprintf(sizeof(zScNum), zScNum, "%d", ++iSchema); 19213 appendText(&sSelect, zDiv, 0); 19214 zDiv = " UNION ALL "; 19215 appendText(&sSelect, "SELECT shell_add_schema(sql,", 0); 19216 if( sqlite3_stricmp(zDb, "main")!=0 ){ 19217 appendText(&sSelect, zDb, '\''); 19218 }else{ 19219 appendText(&sSelect, "NULL", 0); 19220 } 19221 appendText(&sSelect, ",name) AS sql, type, tbl_name, name, rowid,", 0); 19222 appendText(&sSelect, zScNum, 0); 19223 appendText(&sSelect, " AS snum, ", 0); 19224 appendText(&sSelect, zDb, '\''); 19225 appendText(&sSelect, " AS sname FROM ", 0); 19226 appendText(&sSelect, zDb, quoteChar(zDb)); 19227 appendText(&sSelect, ".sqlite_schema", 0); 19228 } 19229 sqlite3_finalize(pStmt); 19230 #ifndef SQLITE_OMIT_INTROSPECTION_PRAGMAS 19231 if( zName ){ 19232 appendText(&sSelect, 19233 " UNION ALL SELECT shell_module_schema(name)," 19234 " 'table', name, name, name, 9e+99, 'main' FROM pragma_module_list", 19235 0); 19236 } 19237 #endif 19238 appendText(&sSelect, ") WHERE ", 0); 19239 if( zName ){ 19240 char *zQarg = sqlite3_mprintf("%Q", zName); 19241 int bGlob = strchr(zName, '*') != 0 || strchr(zName, '?') != 0 || 19242 strchr(zName, '[') != 0; 19243 if( strchr(zName, '.') ){ 19244 appendText(&sSelect, "lower(printf('%s.%s',sname,tbl_name))", 0); 19245 }else{ 19246 appendText(&sSelect, "lower(tbl_name)", 0); 19247 } 19248 appendText(&sSelect, bGlob ? " GLOB " : " LIKE ", 0); 19249 appendText(&sSelect, zQarg, 0); 19250 if( !bGlob ){ 19251 appendText(&sSelect, " ESCAPE '\\' ", 0); 19252 } 19253 appendText(&sSelect, " AND ", 0); 19254 sqlite3_free(zQarg); 19255 } 19256 if( bNoSystemTabs ){ 19257 appendText(&sSelect, "name NOT LIKE 'sqlite_%%' AND ", 0); 19258 } 19259 appendText(&sSelect, "sql IS NOT NULL" 19260 " ORDER BY snum, rowid", 0); 19261 if( bDebug ){ 19262 utf8_printf(p->out, "SQL: %s;\n", sSelect.z); 19263 }else{ 19264 rc = sqlite3_exec(p->db, sSelect.z, callback, &data, &zErrMsg); 19265 } 19266 freeText(&sSelect); 19267 } 19268 if( zErrMsg ){ 19269 utf8_printf(stderr,"Error: %s\n", zErrMsg); 19270 sqlite3_free(zErrMsg); 19271 rc = 1; 19272 }else if( rc != SQLITE_OK ){ 19273 raw_printf(stderr,"Error: querying schema information\n"); 19274 rc = 1; 19275 }else{ 19276 rc = 0; 19277 } 19278 }else 19279 19280 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE) 19281 if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){ 19282 sqlite3_unsupported_selecttrace = nArg>=2 ? (int)integerValue(azArg[1]) : 0xffff; 19283 }else 19284 #endif 19285 19286 #if defined(SQLITE_ENABLE_SESSION) 19287 if( c=='s' && strncmp(azArg[0],"session",n)==0 && n>=3 ){ 19288 OpenSession *pSession = &p->aSession[0]; 19289 char **azCmd = &azArg[1]; 19290 int iSes = 0; 19291 int nCmd = nArg - 1; 19292 int i; 19293 if( nArg<=1 ) goto session_syntax_error; 19294 open_db(p, 0); 19295 if( nArg>=3 ){ 19296 for(iSes=0; iSes<p->nSession; iSes++){ 19297 if( strcmp(p->aSession[iSes].zName, azArg[1])==0 ) break; 19298 } 19299 if( iSes<p->nSession ){ 19300 pSession = &p->aSession[iSes]; 19301 azCmd++; 19302 nCmd--; 19303 }else{ 19304 pSession = &p->aSession[0]; 19305 iSes = 0; 19306 } 19307 } 19308 19309 /* .session attach TABLE 19310 ** Invoke the sqlite3session_attach() interface to attach a particular 19311 ** table so that it is never filtered. 19312 */ 19313 if( strcmp(azCmd[0],"attach")==0 ){ 19314 if( nCmd!=2 ) goto session_syntax_error; 19315 if( pSession->p==0 ){ 19316 session_not_open: 19317 raw_printf(stderr, "ERROR: No sessions are open\n"); 19318 }else{ 19319 rc = sqlite3session_attach(pSession->p, azCmd[1]); 19320 if( rc ){ 19321 raw_printf(stderr, "ERROR: sqlite3session_attach() returns %d\n", rc); 19322 rc = 0; 19323 } 19324 } 19325 }else 19326 19327 /* .session changeset FILE 19328 ** .session patchset FILE 19329 ** Write a changeset or patchset into a file. The file is overwritten. 19330 */ 19331 if( strcmp(azCmd[0],"changeset")==0 || strcmp(azCmd[0],"patchset")==0 ){ 19332 FILE *out = 0; 19333 if( nCmd!=2 ) goto session_syntax_error; 19334 if( pSession->p==0 ) goto session_not_open; 19335 out = fopen(azCmd[1], "wb"); 19336 if( out==0 ){ 19337 utf8_printf(stderr, "ERROR: cannot open \"%s\" for writing\n", 19338 azCmd[1]); 19339 }else{ 19340 int szChng; 19341 void *pChng; 19342 if( azCmd[0][0]=='c' ){ 19343 rc = sqlite3session_changeset(pSession->p, &szChng, &pChng); 19344 }else{ 19345 rc = sqlite3session_patchset(pSession->p, &szChng, &pChng); 19346 } 19347 if( rc ){ 19348 printf("Error: error code %d\n", rc); 19349 rc = 0; 19350 } 19351 if( pChng 19352 && fwrite(pChng, szChng, 1, out)!=1 ){ 19353 raw_printf(stderr, "ERROR: Failed to write entire %d-byte output\n", 19354 szChng); 19355 } 19356 sqlite3_free(pChng); 19357 fclose(out); 19358 } 19359 }else 19360 19361 /* .session close 19362 ** Close the identified session 19363 */ 19364 if( strcmp(azCmd[0], "close")==0 ){ 19365 if( nCmd!=1 ) goto session_syntax_error; 19366 if( p->nSession ){ 19367 session_close(pSession); 19368 p->aSession[iSes] = p->aSession[--p->nSession]; 19369 } 19370 }else 19371 19372 /* .session enable ?BOOLEAN? 19373 ** Query or set the enable flag 19374 */ 19375 if( strcmp(azCmd[0], "enable")==0 ){ 19376 int ii; 19377 if( nCmd>2 ) goto session_syntax_error; 19378 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]); 19379 if( p->nSession ){ 19380 ii = sqlite3session_enable(pSession->p, ii); 19381 utf8_printf(p->out, "session %s enable flag = %d\n", 19382 pSession->zName, ii); 19383 } 19384 }else 19385 19386 /* .session filter GLOB .... 19387 ** Set a list of GLOB patterns of table names to be excluded. 19388 */ 19389 if( strcmp(azCmd[0], "filter")==0 ){ 19390 int ii, nByte; 19391 if( nCmd<2 ) goto session_syntax_error; 19392 if( p->nSession ){ 19393 for(ii=0; ii<pSession->nFilter; ii++){ 19394 sqlite3_free(pSession->azFilter[ii]); 19395 } 19396 sqlite3_free(pSession->azFilter); 19397 nByte = sizeof(pSession->azFilter[0])*(nCmd-1); 19398 pSession->azFilter = sqlite3_malloc( nByte ); 19399 if( pSession->azFilter==0 ){ 19400 raw_printf(stderr, "Error: out or memory\n"); 19401 exit(1); 19402 } 19403 for(ii=1; ii<nCmd; ii++){ 19404 pSession->azFilter[ii-1] = sqlite3_mprintf("%s", azCmd[ii]); 19405 } 19406 pSession->nFilter = ii-1; 19407 } 19408 }else 19409 19410 /* .session indirect ?BOOLEAN? 19411 ** Query or set the indirect flag 19412 */ 19413 if( strcmp(azCmd[0], "indirect")==0 ){ 19414 int ii; 19415 if( nCmd>2 ) goto session_syntax_error; 19416 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]); 19417 if( p->nSession ){ 19418 ii = sqlite3session_indirect(pSession->p, ii); 19419 utf8_printf(p->out, "session %s indirect flag = %d\n", 19420 pSession->zName, ii); 19421 } 19422 }else 19423 19424 /* .session isempty 19425 ** Determine if the session is empty 19426 */ 19427 if( strcmp(azCmd[0], "isempty")==0 ){ 19428 int ii; 19429 if( nCmd!=1 ) goto session_syntax_error; 19430 if( p->nSession ){ 19431 ii = sqlite3session_isempty(pSession->p); 19432 utf8_printf(p->out, "session %s isempty flag = %d\n", 19433 pSession->zName, ii); 19434 } 19435 }else 19436 19437 /* .session list 19438 ** List all currently open sessions 19439 */ 19440 if( strcmp(azCmd[0],"list")==0 ){ 19441 for(i=0; i<p->nSession; i++){ 19442 utf8_printf(p->out, "%d %s\n", i, p->aSession[i].zName); 19443 } 19444 }else 19445 19446 /* .session open DB NAME 19447 ** Open a new session called NAME on the attached database DB. 19448 ** DB is normally "main". 19449 */ 19450 if( strcmp(azCmd[0],"open")==0 ){ 19451 char *zName; 19452 if( nCmd!=3 ) goto session_syntax_error; 19453 zName = azCmd[2]; 19454 if( zName[0]==0 ) goto session_syntax_error; 19455 for(i=0; i<p->nSession; i++){ 19456 if( strcmp(p->aSession[i].zName,zName)==0 ){ 19457 utf8_printf(stderr, "Session \"%s\" already exists\n", zName); 19458 goto meta_command_exit; 19459 } 19460 } 19461 if( p->nSession>=ArraySize(p->aSession) ){ 19462 raw_printf(stderr, "Maximum of %d sessions\n", ArraySize(p->aSession)); 19463 goto meta_command_exit; 19464 } 19465 pSession = &p->aSession[p->nSession]; 19466 rc = sqlite3session_create(p->db, azCmd[1], &pSession->p); 19467 if( rc ){ 19468 raw_printf(stderr, "Cannot open session: error code=%d\n", rc); 19469 rc = 0; 19470 goto meta_command_exit; 19471 } 19472 pSession->nFilter = 0; 19473 sqlite3session_table_filter(pSession->p, session_filter, pSession); 19474 p->nSession++; 19475 pSession->zName = sqlite3_mprintf("%s", zName); 19476 }else 19477 /* If no command name matches, show a syntax error */ 19478 session_syntax_error: 19479 showHelp(p->out, "session"); 19480 }else 19481 #endif 19482 19483 #ifdef SQLITE_DEBUG 19484 /* Undocumented commands for internal testing. Subject to change 19485 ** without notice. */ 19486 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){ 19487 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){ 19488 int i, v; 19489 for(i=1; i<nArg; i++){ 19490 v = booleanValue(azArg[i]); 19491 utf8_printf(p->out, "%s: %d 0x%x\n", azArg[i], v, v); 19492 } 19493 } 19494 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){ 19495 int i; sqlite3_int64 v; 19496 for(i=1; i<nArg; i++){ 19497 char zBuf[200]; 19498 v = integerValue(azArg[i]); 19499 sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v); 19500 utf8_printf(p->out, "%s", zBuf); 19501 } 19502 } 19503 }else 19504 #endif 19505 19506 if( c=='s' && n>=4 && strncmp(azArg[0],"selftest",n)==0 ){ 19507 int bIsInit = 0; /* True to initialize the SELFTEST table */ 19508 int bVerbose = 0; /* Verbose output */ 19509 int bSelftestExists; /* True if SELFTEST already exists */ 19510 int i, k; /* Loop counters */ 19511 int nTest = 0; /* Number of tests runs */ 19512 int nErr = 0; /* Number of errors seen */ 19513 ShellText str; /* Answer for a query */ 19514 sqlite3_stmt *pStmt = 0; /* Query against the SELFTEST table */ 19515 19516 open_db(p,0); 19517 for(i=1; i<nArg; i++){ 19518 const char *z = azArg[i]; 19519 if( z[0]=='-' && z[1]=='-' ) z++; 19520 if( strcmp(z,"-init")==0 ){ 19521 bIsInit = 1; 19522 }else 19523 if( strcmp(z,"-v")==0 ){ 19524 bVerbose++; 19525 }else 19526 { 19527 utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n", 19528 azArg[i], azArg[0]); 19529 raw_printf(stderr, "Should be one of: --init -v\n"); 19530 rc = 1; 19531 goto meta_command_exit; 19532 } 19533 } 19534 if( sqlite3_table_column_metadata(p->db,"main","selftest",0,0,0,0,0,0) 19535 != SQLITE_OK ){ 19536 bSelftestExists = 0; 19537 }else{ 19538 bSelftestExists = 1; 19539 } 19540 if( bIsInit ){ 19541 createSelftestTable(p); 19542 bSelftestExists = 1; 19543 } 19544 initText(&str); 19545 appendText(&str, "x", 0); 19546 for(k=bSelftestExists; k>=0; k--){ 19547 if( k==1 ){ 19548 rc = sqlite3_prepare_v2(p->db, 19549 "SELECT tno,op,cmd,ans FROM selftest ORDER BY tno", 19550 -1, &pStmt, 0); 19551 }else{ 19552 rc = sqlite3_prepare_v2(p->db, 19553 "VALUES(0,'memo','Missing SELFTEST table - default checks only','')," 19554 " (1,'run','PRAGMA integrity_check','ok')", 19555 -1, &pStmt, 0); 19556 } 19557 if( rc ){ 19558 raw_printf(stderr, "Error querying the selftest table\n"); 19559 rc = 1; 19560 sqlite3_finalize(pStmt); 19561 goto meta_command_exit; 19562 } 19563 for(i=1; sqlite3_step(pStmt)==SQLITE_ROW; i++){ 19564 int tno = sqlite3_column_int(pStmt, 0); 19565 const char *zOp = (const char*)sqlite3_column_text(pStmt, 1); 19566 const char *zSql = (const char*)sqlite3_column_text(pStmt, 2); 19567 const char *zAns = (const char*)sqlite3_column_text(pStmt, 3); 19568 19569 k = 0; 19570 if( bVerbose>0 ){ 19571 char *zQuote = sqlite3_mprintf("%q", zSql); 19572 printf("%d: %s %s\n", tno, zOp, zSql); 19573 sqlite3_free(zQuote); 19574 } 19575 if( strcmp(zOp,"memo")==0 ){ 19576 utf8_printf(p->out, "%s\n", zSql); 19577 }else 19578 if( strcmp(zOp,"run")==0 ){ 19579 char *zErrMsg = 0; 19580 str.n = 0; 19581 str.z[0] = 0; 19582 rc = sqlite3_exec(p->db, zSql, captureOutputCallback, &str, &zErrMsg); 19583 nTest++; 19584 if( bVerbose ){ 19585 utf8_printf(p->out, "Result: %s\n", str.z); 19586 } 19587 if( rc || zErrMsg ){ 19588 nErr++; 19589 rc = 1; 19590 utf8_printf(p->out, "%d: error-code-%d: %s\n", tno, rc, zErrMsg); 19591 sqlite3_free(zErrMsg); 19592 }else if( strcmp(zAns,str.z)!=0 ){ 19593 nErr++; 19594 rc = 1; 19595 utf8_printf(p->out, "%d: Expected: [%s]\n", tno, zAns); 19596 utf8_printf(p->out, "%d: Got: [%s]\n", tno, str.z); 19597 } 19598 }else 19599 { 19600 utf8_printf(stderr, 19601 "Unknown operation \"%s\" on selftest line %d\n", zOp, tno); 19602 rc = 1; 19603 break; 19604 } 19605 } /* End loop over rows of content from SELFTEST */ 19606 sqlite3_finalize(pStmt); 19607 } /* End loop over k */ 19608 freeText(&str); 19609 utf8_printf(p->out, "%d errors out of %d tests\n", nErr, nTest); 19610 }else 19611 19612 if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){ 19613 if( nArg<2 || nArg>3 ){ 19614 raw_printf(stderr, "Usage: .separator COL ?ROW?\n"); 19615 rc = 1; 19616 } 19617 if( nArg>=2 ){ 19618 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, 19619 "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]); 19620 } 19621 if( nArg>=3 ){ 19622 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, 19623 "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]); 19624 } 19625 }else 19626 19627 if( c=='s' && n>=4 && strncmp(azArg[0],"sha3sum",n)==0 ){ 19628 const char *zLike = 0; /* Which table to checksum. 0 means everything */ 19629 int i; /* Loop counter */ 19630 int bSchema = 0; /* Also hash the schema */ 19631 int bSeparate = 0; /* Hash each table separately */ 19632 int iSize = 224; /* Hash algorithm to use */ 19633 int bDebug = 0; /* Only show the query that would have run */ 19634 sqlite3_stmt *pStmt; /* For querying tables names */ 19635 char *zSql; /* SQL to be run */ 19636 char *zSep; /* Separator */ 19637 ShellText sSql; /* Complete SQL for the query to run the hash */ 19638 ShellText sQuery; /* Set of queries used to read all content */ 19639 open_db(p, 0); 19640 for(i=1; i<nArg; i++){ 19641 const char *z = azArg[i]; 19642 if( z[0]=='-' ){ 19643 z++; 19644 if( z[0]=='-' ) z++; 19645 if( strcmp(z,"schema")==0 ){ 19646 bSchema = 1; 19647 }else 19648 if( strcmp(z,"sha3-224")==0 || strcmp(z,"sha3-256")==0 19649 || strcmp(z,"sha3-384")==0 || strcmp(z,"sha3-512")==0 19650 ){ 19651 iSize = atoi(&z[5]); 19652 }else 19653 if( strcmp(z,"debug")==0 ){ 19654 bDebug = 1; 19655 }else 19656 { 19657 utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n", 19658 azArg[i], azArg[0]); 19659 showHelp(p->out, azArg[0]); 19660 rc = 1; 19661 goto meta_command_exit; 19662 } 19663 }else if( zLike ){ 19664 raw_printf(stderr, "Usage: .sha3sum ?OPTIONS? ?LIKE-PATTERN?\n"); 19665 rc = 1; 19666 goto meta_command_exit; 19667 }else{ 19668 zLike = z; 19669 bSeparate = 1; 19670 if( sqlite3_strlike("sqlite\\_%", zLike, '\\')==0 ) bSchema = 1; 19671 } 19672 } 19673 if( bSchema ){ 19674 zSql = "SELECT lower(name) FROM sqlite_schema" 19675 " WHERE type='table' AND coalesce(rootpage,0)>1" 19676 " UNION ALL SELECT 'sqlite_schema'" 19677 " ORDER BY 1 collate nocase"; 19678 }else{ 19679 zSql = "SELECT lower(name) FROM sqlite_schema" 19680 " WHERE type='table' AND coalesce(rootpage,0)>1" 19681 " AND name NOT LIKE 'sqlite_%'" 19682 " ORDER BY 1 collate nocase"; 19683 } 19684 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 19685 initText(&sQuery); 19686 initText(&sSql); 19687 appendText(&sSql, "WITH [sha3sum$query](a,b) AS(",0); 19688 zSep = "VALUES("; 19689 while( SQLITE_ROW==sqlite3_step(pStmt) ){ 19690 const char *zTab = (const char*)sqlite3_column_text(pStmt,0); 19691 if( zLike && sqlite3_strlike(zLike, zTab, 0)!=0 ) continue; 19692 if( strncmp(zTab, "sqlite_",7)!=0 ){ 19693 appendText(&sQuery,"SELECT * FROM ", 0); 19694 appendText(&sQuery,zTab,'"'); 19695 appendText(&sQuery," NOT INDEXED;", 0); 19696 }else if( strcmp(zTab, "sqlite_schema")==0 ){ 19697 appendText(&sQuery,"SELECT type,name,tbl_name,sql FROM sqlite_schema" 19698 " ORDER BY name;", 0); 19699 }else if( strcmp(zTab, "sqlite_sequence")==0 ){ 19700 appendText(&sQuery,"SELECT name,seq FROM sqlite_sequence" 19701 " ORDER BY name;", 0); 19702 }else if( strcmp(zTab, "sqlite_stat1")==0 ){ 19703 appendText(&sQuery,"SELECT tbl,idx,stat FROM sqlite_stat1" 19704 " ORDER BY tbl,idx;", 0); 19705 }else if( strcmp(zTab, "sqlite_stat4")==0 ){ 19706 appendText(&sQuery, "SELECT * FROM ", 0); 19707 appendText(&sQuery, zTab, 0); 19708 appendText(&sQuery, " ORDER BY tbl, idx, rowid;\n", 0); 19709 } 19710 appendText(&sSql, zSep, 0); 19711 appendText(&sSql, sQuery.z, '\''); 19712 sQuery.n = 0; 19713 appendText(&sSql, ",", 0); 19714 appendText(&sSql, zTab, '\''); 19715 zSep = "),("; 19716 } 19717 sqlite3_finalize(pStmt); 19718 if( bSeparate ){ 19719 zSql = sqlite3_mprintf( 19720 "%s))" 19721 " SELECT lower(hex(sha3_query(a,%d))) AS hash, b AS label" 19722 " FROM [sha3sum$query]", 19723 sSql.z, iSize); 19724 }else{ 19725 zSql = sqlite3_mprintf( 19726 "%s))" 19727 " SELECT lower(hex(sha3_query(group_concat(a,''),%d))) AS hash" 19728 " FROM [sha3sum$query]", 19729 sSql.z, iSize); 19730 } 19731 freeText(&sQuery); 19732 freeText(&sSql); 19733 if( bDebug ){ 19734 utf8_printf(p->out, "%s\n", zSql); 19735 }else{ 19736 shell_exec(p, zSql, 0); 19737 } 19738 sqlite3_free(zSql); 19739 }else 19740 19741 #ifndef SQLITE_NOHAVE_SYSTEM 19742 if( c=='s' 19743 && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0) 19744 ){ 19745 char *zCmd; 19746 int i, x; 19747 if( nArg<2 ){ 19748 raw_printf(stderr, "Usage: .system COMMAND\n"); 19749 rc = 1; 19750 goto meta_command_exit; 19751 } 19752 zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]); 19753 for(i=2; i<nArg; i++){ 19754 zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"", 19755 zCmd, azArg[i]); 19756 } 19757 x = system(zCmd); 19758 sqlite3_free(zCmd); 19759 if( x ) raw_printf(stderr, "System command returns %d\n", x); 19760 }else 19761 #endif /* !defined(SQLITE_NOHAVE_SYSTEM) */ 19762 19763 if( c=='s' && strncmp(azArg[0], "show", n)==0 ){ 19764 static const char *azBool[] = { "off", "on", "trigger", "full"}; 19765 int i; 19766 if( nArg!=1 ){ 19767 raw_printf(stderr, "Usage: .show\n"); 19768 rc = 1; 19769 goto meta_command_exit; 19770 } 19771 utf8_printf(p->out, "%12.12s: %s\n","echo", 19772 azBool[ShellHasFlag(p, SHFLG_Echo)]); 19773 utf8_printf(p->out, "%12.12s: %s\n","eqp", azBool[p->autoEQP&3]); 19774 utf8_printf(p->out, "%12.12s: %s\n","explain", 19775 p->mode==MODE_Explain ? "on" : p->autoExplain ? "auto" : "off"); 19776 utf8_printf(p->out,"%12.12s: %s\n","headers", azBool[p->showHeader!=0]); 19777 utf8_printf(p->out, "%12.12s: %s\n","mode", modeDescr[p->mode]); 19778 utf8_printf(p->out, "%12.12s: ", "nullvalue"); 19779 output_c_string(p->out, p->nullValue); 19780 raw_printf(p->out, "\n"); 19781 utf8_printf(p->out,"%12.12s: %s\n","output", 19782 strlen30(p->outfile) ? p->outfile : "stdout"); 19783 utf8_printf(p->out,"%12.12s: ", "colseparator"); 19784 output_c_string(p->out, p->colSeparator); 19785 raw_printf(p->out, "\n"); 19786 utf8_printf(p->out,"%12.12s: ", "rowseparator"); 19787 output_c_string(p->out, p->rowSeparator); 19788 raw_printf(p->out, "\n"); 19789 utf8_printf(p->out, "%12.12s: %s\n","stats", azBool[p->statsOn!=0]); 19790 utf8_printf(p->out, "%12.12s: ", "width"); 19791 for (i=0;i<p->nWidth;i++) { 19792 raw_printf(p->out, "%d ", p->colWidth[i]); 19793 } 19794 raw_printf(p->out, "\n"); 19795 utf8_printf(p->out, "%12.12s: %s\n", "filename", 19796 p->zDbFilename ? p->zDbFilename : ""); 19797 }else 19798 19799 if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){ 19800 if( nArg==2 ){ 19801 p->statsOn = (u8)booleanValue(azArg[1]); 19802 }else if( nArg==1 ){ 19803 display_stats(p->db, p, 0); 19804 }else{ 19805 raw_printf(stderr, "Usage: .stats ?on|off?\n"); 19806 rc = 1; 19807 } 19808 }else 19809 19810 if( (c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0) 19811 || (c=='i' && (strncmp(azArg[0], "indices", n)==0 19812 || strncmp(azArg[0], "indexes", n)==0) ) 19813 ){ 19814 sqlite3_stmt *pStmt; 19815 char **azResult; 19816 int nRow, nAlloc; 19817 int ii; 19818 ShellText s; 19819 initText(&s); 19820 open_db(p, 0); 19821 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0); 19822 if( rc ){ 19823 sqlite3_finalize(pStmt); 19824 return shellDatabaseError(p->db); 19825 } 19826 19827 if( nArg>2 && c=='i' ){ 19828 /* It is an historical accident that the .indexes command shows an error 19829 ** when called with the wrong number of arguments whereas the .tables 19830 ** command does not. */ 19831 raw_printf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n"); 19832 rc = 1; 19833 sqlite3_finalize(pStmt); 19834 goto meta_command_exit; 19835 } 19836 for(ii=0; sqlite3_step(pStmt)==SQLITE_ROW; ii++){ 19837 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1); 19838 if( zDbName==0 ) continue; 19839 if( s.z && s.z[0] ) appendText(&s, " UNION ALL ", 0); 19840 if( sqlite3_stricmp(zDbName, "main")==0 ){ 19841 appendText(&s, "SELECT name FROM ", 0); 19842 }else{ 19843 appendText(&s, "SELECT ", 0); 19844 appendText(&s, zDbName, '\''); 19845 appendText(&s, "||'.'||name FROM ", 0); 19846 } 19847 appendText(&s, zDbName, '"'); 19848 appendText(&s, ".sqlite_schema ", 0); 19849 if( c=='t' ){ 19850 appendText(&s," WHERE type IN ('table','view')" 19851 " AND name NOT LIKE 'sqlite_%'" 19852 " AND name LIKE ?1", 0); 19853 }else{ 19854 appendText(&s," WHERE type='index'" 19855 " AND tbl_name LIKE ?1", 0); 19856 } 19857 } 19858 rc = sqlite3_finalize(pStmt); 19859 appendText(&s, " ORDER BY 1", 0); 19860 rc = sqlite3_prepare_v2(p->db, s.z, -1, &pStmt, 0); 19861 freeText(&s); 19862 if( rc ) return shellDatabaseError(p->db); 19863 19864 /* Run the SQL statement prepared by the above block. Store the results 19865 ** as an array of nul-terminated strings in azResult[]. */ 19866 nRow = nAlloc = 0; 19867 azResult = 0; 19868 if( nArg>1 ){ 19869 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT); 19870 }else{ 19871 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC); 19872 } 19873 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 19874 if( nRow>=nAlloc ){ 19875 char **azNew; 19876 int n2 = nAlloc*2 + 10; 19877 azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2); 19878 if( azNew==0 ) shell_out_of_memory(); 19879 nAlloc = n2; 19880 azResult = azNew; 19881 } 19882 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0)); 19883 if( 0==azResult[nRow] ) shell_out_of_memory(); 19884 nRow++; 19885 } 19886 if( sqlite3_finalize(pStmt)!=SQLITE_OK ){ 19887 rc = shellDatabaseError(p->db); 19888 } 19889 19890 /* Pretty-print the contents of array azResult[] to the output */ 19891 if( rc==0 && nRow>0 ){ 19892 int len, maxlen = 0; 19893 int i, j; 19894 int nPrintCol, nPrintRow; 19895 for(i=0; i<nRow; i++){ 19896 len = strlen30(azResult[i]); 19897 if( len>maxlen ) maxlen = len; 19898 } 19899 nPrintCol = 80/(maxlen+2); 19900 if( nPrintCol<1 ) nPrintCol = 1; 19901 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol; 19902 for(i=0; i<nPrintRow; i++){ 19903 for(j=i; j<nRow; j+=nPrintRow){ 19904 char *zSp = j<nPrintRow ? "" : " "; 19905 utf8_printf(p->out, "%s%-*s", zSp, maxlen, 19906 azResult[j] ? azResult[j]:""); 19907 } 19908 raw_printf(p->out, "\n"); 19909 } 19910 } 19911 19912 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]); 19913 sqlite3_free(azResult); 19914 }else 19915 19916 /* Begin redirecting output to the file "testcase-out.txt" */ 19917 if( c=='t' && strcmp(azArg[0],"testcase")==0 ){ 19918 output_reset(p); 19919 p->out = output_file_open("testcase-out.txt", 0); 19920 if( p->out==0 ){ 19921 raw_printf(stderr, "Error: cannot open 'testcase-out.txt'\n"); 19922 } 19923 if( nArg>=2 ){ 19924 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "%s", azArg[1]); 19925 }else{ 19926 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "?"); 19927 } 19928 }else 19929 19930 #ifndef SQLITE_UNTESTABLE 19931 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 ){ 19932 static const struct { 19933 const char *zCtrlName; /* Name of a test-control option */ 19934 int ctrlCode; /* Integer code for that option */ 19935 const char *zUsage; /* Usage notes */ 19936 } aCtrl[] = { 19937 { "always", SQLITE_TESTCTRL_ALWAYS, "BOOLEAN" }, 19938 { "assert", SQLITE_TESTCTRL_ASSERT, "BOOLEAN" }, 19939 /*{ "benign_malloc_hooks",SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS, "" },*/ 19940 /*{ "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST, "" },*/ 19941 { "byteorder", SQLITE_TESTCTRL_BYTEORDER, "" }, 19942 { "extra_schema_checks",SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS,"BOOLEAN" }, 19943 /*{ "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL, "" },*/ 19944 { "imposter", SQLITE_TESTCTRL_IMPOSTER, "SCHEMA ON/OFF ROOTPAGE"}, 19945 { "internal_functions", SQLITE_TESTCTRL_INTERNAL_FUNCTIONS, "" }, 19946 { "localtime_fault", SQLITE_TESTCTRL_LOCALTIME_FAULT,"BOOLEAN" }, 19947 { "never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT, "BOOLEAN" }, 19948 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS, "DISABLE-MASK" }, 19949 #ifdef YYCOVERAGE 19950 { "parser_coverage", SQLITE_TESTCTRL_PARSER_COVERAGE, "" }, 19951 #endif 19952 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE, "OFFSET " }, 19953 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE, "" }, 19954 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE, "" }, 19955 { "prng_seed", SQLITE_TESTCTRL_PRNG_SEED, "SEED ?db?" }, 19956 { "seek_count", SQLITE_TESTCTRL_SEEK_COUNT, "" }, 19957 }; 19958 int testctrl = -1; 19959 int iCtrl = -1; 19960 int rc2 = 0; /* 0: usage. 1: %d 2: %x 3: no-output */ 19961 int isOk = 0; 19962 int i, n2; 19963 const char *zCmd = 0; 19964 19965 open_db(p, 0); 19966 zCmd = nArg>=2 ? azArg[1] : "help"; 19967 19968 /* The argument can optionally begin with "-" or "--" */ 19969 if( zCmd[0]=='-' && zCmd[1] ){ 19970 zCmd++; 19971 if( zCmd[0]=='-' && zCmd[1] ) zCmd++; 19972 } 19973 19974 /* --help lists all test-controls */ 19975 if( strcmp(zCmd,"help")==0 ){ 19976 utf8_printf(p->out, "Available test-controls:\n"); 19977 for(i=0; i<ArraySize(aCtrl); i++){ 19978 utf8_printf(p->out, " .testctrl %s %s\n", 19979 aCtrl[i].zCtrlName, aCtrl[i].zUsage); 19980 } 19981 rc = 1; 19982 goto meta_command_exit; 19983 } 19984 19985 /* convert testctrl text option to value. allow any unique prefix 19986 ** of the option name, or a numerical value. */ 19987 n2 = strlen30(zCmd); 19988 for(i=0; i<ArraySize(aCtrl); i++){ 19989 if( strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){ 19990 if( testctrl<0 ){ 19991 testctrl = aCtrl[i].ctrlCode; 19992 iCtrl = i; 19993 }else{ 19994 utf8_printf(stderr, "Error: ambiguous test-control: \"%s\"\n" 19995 "Use \".testctrl --help\" for help\n", zCmd); 19996 rc = 1; 19997 goto meta_command_exit; 19998 } 19999 } 20000 } 20001 if( testctrl<0 ){ 20002 utf8_printf(stderr,"Error: unknown test-control: %s\n" 20003 "Use \".testctrl --help\" for help\n", zCmd); 20004 }else{ 20005 switch(testctrl){ 20006 20007 /* sqlite3_test_control(int, db, int) */ 20008 case SQLITE_TESTCTRL_OPTIMIZATIONS: 20009 if( nArg==3 ){ 20010 int opt = (int)strtol(azArg[2], 0, 0); 20011 rc2 = sqlite3_test_control(testctrl, p->db, opt); 20012 isOk = 3; 20013 } 20014 break; 20015 20016 /* sqlite3_test_control(int) */ 20017 case SQLITE_TESTCTRL_PRNG_SAVE: 20018 case SQLITE_TESTCTRL_PRNG_RESTORE: 20019 case SQLITE_TESTCTRL_BYTEORDER: 20020 if( nArg==2 ){ 20021 rc2 = sqlite3_test_control(testctrl); 20022 isOk = testctrl==SQLITE_TESTCTRL_BYTEORDER ? 1 : 3; 20023 } 20024 break; 20025 20026 /* sqlite3_test_control(int, uint) */ 20027 case SQLITE_TESTCTRL_PENDING_BYTE: 20028 if( nArg==3 ){ 20029 unsigned int opt = (unsigned int)integerValue(azArg[2]); 20030 rc2 = sqlite3_test_control(testctrl, opt); 20031 isOk = 3; 20032 } 20033 break; 20034 20035 /* sqlite3_test_control(int, int, sqlite3*) */ 20036 case SQLITE_TESTCTRL_PRNG_SEED: 20037 if( nArg==3 || nArg==4 ){ 20038 int ii = (int)integerValue(azArg[2]); 20039 sqlite3 *db; 20040 if( ii==0 && strcmp(azArg[2],"random")==0 ){ 20041 sqlite3_randomness(sizeof(ii),&ii); 20042 printf("-- random seed: %d\n", ii); 20043 } 20044 if( nArg==3 ){ 20045 db = 0; 20046 }else{ 20047 db = p->db; 20048 /* Make sure the schema has been loaded */ 20049 sqlite3_table_column_metadata(db, 0, "x", 0, 0, 0, 0, 0, 0); 20050 } 20051 rc2 = sqlite3_test_control(testctrl, ii, db); 20052 isOk = 3; 20053 } 20054 break; 20055 20056 /* sqlite3_test_control(int, int) */ 20057 case SQLITE_TESTCTRL_ASSERT: 20058 case SQLITE_TESTCTRL_ALWAYS: 20059 if( nArg==3 ){ 20060 int opt = booleanValue(azArg[2]); 20061 rc2 = sqlite3_test_control(testctrl, opt); 20062 isOk = 1; 20063 } 20064 break; 20065 20066 /* sqlite3_test_control(int, int) */ 20067 case SQLITE_TESTCTRL_LOCALTIME_FAULT: 20068 case SQLITE_TESTCTRL_NEVER_CORRUPT: 20069 if( nArg==3 ){ 20070 int opt = booleanValue(azArg[2]); 20071 rc2 = sqlite3_test_control(testctrl, opt); 20072 isOk = 3; 20073 } 20074 break; 20075 20076 /* sqlite3_test_control(sqlite3*) */ 20077 case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS: 20078 rc2 = sqlite3_test_control(testctrl, p->db); 20079 isOk = 3; 20080 break; 20081 20082 case SQLITE_TESTCTRL_IMPOSTER: 20083 if( nArg==5 ){ 20084 rc2 = sqlite3_test_control(testctrl, p->db, 20085 azArg[2], 20086 integerValue(azArg[3]), 20087 integerValue(azArg[4])); 20088 isOk = 3; 20089 } 20090 break; 20091 20092 case SQLITE_TESTCTRL_SEEK_COUNT: { 20093 u64 x = 0; 20094 rc2 = sqlite3_test_control(testctrl, p->db, &x); 20095 utf8_printf(p->out, "%llu\n", x); 20096 isOk = 3; 20097 break; 20098 } 20099 20100 #ifdef YYCOVERAGE 20101 case SQLITE_TESTCTRL_PARSER_COVERAGE: 20102 if( nArg==2 ){ 20103 sqlite3_test_control(testctrl, p->out); 20104 isOk = 3; 20105 } 20106 #endif 20107 } 20108 } 20109 if( isOk==0 && iCtrl>=0 ){ 20110 utf8_printf(p->out, "Usage: .testctrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage); 20111 rc = 1; 20112 }else if( isOk==1 ){ 20113 raw_printf(p->out, "%d\n", rc2); 20114 }else if( isOk==2 ){ 20115 raw_printf(p->out, "0x%08x\n", rc2); 20116 } 20117 }else 20118 #endif /* !defined(SQLITE_UNTESTABLE) */ 20119 20120 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){ 20121 open_db(p, 0); 20122 sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0); 20123 }else 20124 20125 if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){ 20126 if( nArg==2 ){ 20127 enableTimer = booleanValue(azArg[1]); 20128 if( enableTimer && !HAS_TIMER ){ 20129 raw_printf(stderr, "Error: timer not available on this system.\n"); 20130 enableTimer = 0; 20131 } 20132 }else{ 20133 raw_printf(stderr, "Usage: .timer on|off\n"); 20134 rc = 1; 20135 } 20136 }else 20137 20138 #ifndef SQLITE_OMIT_TRACE 20139 if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){ 20140 int mType = 0; 20141 int jj; 20142 open_db(p, 0); 20143 for(jj=1; jj<nArg; jj++){ 20144 const char *z = azArg[jj]; 20145 if( z[0]=='-' ){ 20146 if( optionMatch(z, "expanded") ){ 20147 p->eTraceType = SHELL_TRACE_EXPANDED; 20148 } 20149 #ifdef SQLITE_ENABLE_NORMALIZE 20150 else if( optionMatch(z, "normalized") ){ 20151 p->eTraceType = SHELL_TRACE_NORMALIZED; 20152 } 20153 #endif 20154 else if( optionMatch(z, "plain") ){ 20155 p->eTraceType = SHELL_TRACE_PLAIN; 20156 } 20157 else if( optionMatch(z, "profile") ){ 20158 mType |= SQLITE_TRACE_PROFILE; 20159 } 20160 else if( optionMatch(z, "row") ){ 20161 mType |= SQLITE_TRACE_ROW; 20162 } 20163 else if( optionMatch(z, "stmt") ){ 20164 mType |= SQLITE_TRACE_STMT; 20165 } 20166 else if( optionMatch(z, "close") ){ 20167 mType |= SQLITE_TRACE_CLOSE; 20168 } 20169 else { 20170 raw_printf(stderr, "Unknown option \"%s\" on \".trace\"\n", z); 20171 rc = 1; 20172 goto meta_command_exit; 20173 } 20174 }else{ 20175 output_file_close(p->traceOut); 20176 p->traceOut = output_file_open(azArg[1], 0); 20177 } 20178 } 20179 if( p->traceOut==0 ){ 20180 sqlite3_trace_v2(p->db, 0, 0, 0); 20181 }else{ 20182 if( mType==0 ) mType = SQLITE_TRACE_STMT; 20183 sqlite3_trace_v2(p->db, mType, sql_trace_callback, p); 20184 } 20185 }else 20186 #endif /* !defined(SQLITE_OMIT_TRACE) */ 20187 20188 #if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_VIRTUALTABLE) 20189 if( c=='u' && strncmp(azArg[0], "unmodule", n)==0 ){ 20190 int ii; 20191 int lenOpt; 20192 char *zOpt; 20193 if( nArg<2 ){ 20194 raw_printf(stderr, "Usage: .unmodule [--allexcept] NAME ...\n"); 20195 rc = 1; 20196 goto meta_command_exit; 20197 } 20198 open_db(p, 0); 20199 zOpt = azArg[1]; 20200 if( zOpt[0]=='-' && zOpt[1]=='-' && zOpt[2]!=0 ) zOpt++; 20201 lenOpt = (int)strlen(zOpt); 20202 if( lenOpt>=3 && strncmp(zOpt, "-allexcept",lenOpt)==0 ){ 20203 assert( azArg[nArg]==0 ); 20204 sqlite3_drop_modules(p->db, nArg>2 ? (const char**)(azArg+2) : 0); 20205 }else{ 20206 for(ii=1; ii<nArg; ii++){ 20207 sqlite3_create_module(p->db, azArg[ii], 0, 0); 20208 } 20209 } 20210 }else 20211 #endif 20212 20213 #if SQLITE_USER_AUTHENTICATION 20214 if( c=='u' && strncmp(azArg[0], "user", n)==0 ){ 20215 if( nArg<2 ){ 20216 raw_printf(stderr, "Usage: .user SUBCOMMAND ...\n"); 20217 rc = 1; 20218 goto meta_command_exit; 20219 } 20220 open_db(p, 0); 20221 if( strcmp(azArg[1],"login")==0 ){ 20222 if( nArg!=4 ){ 20223 raw_printf(stderr, "Usage: .user login USER PASSWORD\n"); 20224 rc = 1; 20225 goto meta_command_exit; 20226 } 20227 rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3], 20228 strlen30(azArg[3])); 20229 if( rc ){ 20230 utf8_printf(stderr, "Authentication failed for user %s\n", azArg[2]); 20231 rc = 1; 20232 } 20233 }else if( strcmp(azArg[1],"add")==0 ){ 20234 if( nArg!=5 ){ 20235 raw_printf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n"); 20236 rc = 1; 20237 goto meta_command_exit; 20238 } 20239 rc = sqlite3_user_add(p->db, azArg[2], azArg[3], strlen30(azArg[3]), 20240 booleanValue(azArg[4])); 20241 if( rc ){ 20242 raw_printf(stderr, "User-Add failed: %d\n", rc); 20243 rc = 1; 20244 } 20245 }else if( strcmp(azArg[1],"edit")==0 ){ 20246 if( nArg!=5 ){ 20247 raw_printf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n"); 20248 rc = 1; 20249 goto meta_command_exit; 20250 } 20251 rc = sqlite3_user_change(p->db, azArg[2], azArg[3], strlen30(azArg[3]), 20252 booleanValue(azArg[4])); 20253 if( rc ){ 20254 raw_printf(stderr, "User-Edit failed: %d\n", rc); 20255 rc = 1; 20256 } 20257 }else if( strcmp(azArg[1],"delete")==0 ){ 20258 if( nArg!=3 ){ 20259 raw_printf(stderr, "Usage: .user delete USER\n"); 20260 rc = 1; 20261 goto meta_command_exit; 20262 } 20263 rc = sqlite3_user_delete(p->db, azArg[2]); 20264 if( rc ){ 20265 raw_printf(stderr, "User-Delete failed: %d\n", rc); 20266 rc = 1; 20267 } 20268 }else{ 20269 raw_printf(stderr, "Usage: .user login|add|edit|delete ...\n"); 20270 rc = 1; 20271 goto meta_command_exit; 20272 } 20273 }else 20274 #endif /* SQLITE_USER_AUTHENTICATION */ 20275 20276 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){ 20277 utf8_printf(p->out, "SQLite %s %s\n" /*extra-version-info*/, 20278 sqlite3_libversion(), sqlite3_sourceid()); 20279 #if SQLITE_HAVE_ZLIB 20280 utf8_printf(p->out, "zlib version %s\n", zlibVersion()); 20281 #endif 20282 #define CTIMEOPT_VAL_(opt) #opt 20283 #define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt) 20284 #if defined(__clang__) && defined(__clang_major__) 20285 utf8_printf(p->out, "clang-" CTIMEOPT_VAL(__clang_major__) "." 20286 CTIMEOPT_VAL(__clang_minor__) "." 20287 CTIMEOPT_VAL(__clang_patchlevel__) "\n"); 20288 #elif defined(_MSC_VER) 20289 utf8_printf(p->out, "msvc-" CTIMEOPT_VAL(_MSC_VER) "\n"); 20290 #elif defined(__GNUC__) && defined(__VERSION__) 20291 utf8_printf(p->out, "gcc-" __VERSION__ "\n"); 20292 #endif 20293 }else 20294 20295 if( c=='v' && strncmp(azArg[0], "vfsinfo", n)==0 ){ 20296 const char *zDbName = nArg==2 ? azArg[1] : "main"; 20297 sqlite3_vfs *pVfs = 0; 20298 if( p->db ){ 20299 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFS_POINTER, &pVfs); 20300 if( pVfs ){ 20301 utf8_printf(p->out, "vfs.zName = \"%s\"\n", pVfs->zName); 20302 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion); 20303 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile); 20304 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname); 20305 } 20306 } 20307 }else 20308 20309 if( c=='v' && strncmp(azArg[0], "vfslist", n)==0 ){ 20310 sqlite3_vfs *pVfs; 20311 sqlite3_vfs *pCurrent = 0; 20312 if( p->db ){ 20313 sqlite3_file_control(p->db, "main", SQLITE_FCNTL_VFS_POINTER, &pCurrent); 20314 } 20315 for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){ 20316 utf8_printf(p->out, "vfs.zName = \"%s\"%s\n", pVfs->zName, 20317 pVfs==pCurrent ? " <--- CURRENT" : ""); 20318 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion); 20319 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile); 20320 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname); 20321 if( pVfs->pNext ){ 20322 raw_printf(p->out, "-----------------------------------\n"); 20323 } 20324 } 20325 }else 20326 20327 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){ 20328 const char *zDbName = nArg==2 ? azArg[1] : "main"; 20329 char *zVfsName = 0; 20330 if( p->db ){ 20331 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName); 20332 if( zVfsName ){ 20333 utf8_printf(p->out, "%s\n", zVfsName); 20334 sqlite3_free(zVfsName); 20335 } 20336 } 20337 }else 20338 20339 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE) 20340 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){ 20341 sqlite3WhereTrace = nArg>=2 ? booleanValue(azArg[1]) : 0xff; 20342 }else 20343 #endif 20344 20345 if( c=='w' && strncmp(azArg[0], "width", n)==0 ){ 20346 int j; 20347 assert( nArg<=ArraySize(azArg) ); 20348 p->nWidth = nArg-1; 20349 p->colWidth = realloc(p->colWidth, p->nWidth*sizeof(int)*2); 20350 if( p->colWidth==0 && p->nWidth>0 ) shell_out_of_memory(); 20351 if( p->nWidth ) p->actualWidth = &p->colWidth[p->nWidth]; 20352 for(j=1; j<nArg; j++){ 20353 p->colWidth[j-1] = (int)integerValue(azArg[j]); 20354 } 20355 }else 20356 20357 { 20358 utf8_printf(stderr, "Error: unknown command or invalid arguments: " 20359 " \"%s\". Enter \".help\" for help\n", azArg[0]); 20360 rc = 1; 20361 } 20362 20363 meta_command_exit: 20364 if( p->outCount ){ 20365 p->outCount--; 20366 if( p->outCount==0 ) output_reset(p); 20367 } 20368 return rc; 20369 } 20370 20371 /* 20372 ** Return TRUE if a semicolon occurs anywhere in the first N characters 20373 ** of string z[]. 20374 */ 20375 static int line_contains_semicolon(const char *z, int N){ 20376 int i; 20377 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; } 20378 return 0; 20379 } 20380 20381 /* 20382 ** Test to see if a line consists entirely of whitespace. 20383 */ 20384 static int _all_whitespace(const char *z){ 20385 for(; *z; z++){ 20386 if( IsSpace(z[0]) ) continue; 20387 if( *z=='/' && z[1]=='*' ){ 20388 z += 2; 20389 while( *z && (*z!='*' || z[1]!='/') ){ z++; } 20390 if( *z==0 ) return 0; 20391 z++; 20392 continue; 20393 } 20394 if( *z=='-' && z[1]=='-' ){ 20395 z += 2; 20396 while( *z && *z!='\n' ){ z++; } 20397 if( *z==0 ) return 1; 20398 continue; 20399 } 20400 return 0; 20401 } 20402 return 1; 20403 } 20404 20405 /* 20406 ** Return TRUE if the line typed in is an SQL command terminator other 20407 ** than a semi-colon. The SQL Server style "go" command is understood 20408 ** as is the Oracle "/". 20409 */ 20410 static int line_is_command_terminator(const char *zLine){ 20411 while( IsSpace(zLine[0]) ){ zLine++; }; 20412 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){ 20413 return 1; /* Oracle */ 20414 } 20415 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o' 20416 && _all_whitespace(&zLine[2]) ){ 20417 return 1; /* SQL Server */ 20418 } 20419 return 0; 20420 } 20421 20422 /* 20423 ** We need a default sqlite3_complete() implementation to use in case 20424 ** the shell is compiled with SQLITE_OMIT_COMPLETE. The default assumes 20425 ** any arbitrary text is a complete SQL statement. This is not very 20426 ** user-friendly, but it does seem to work. 20427 */ 20428 #ifdef SQLITE_OMIT_COMPLETE 20429 #define sqlite3_complete(x) 1 20430 #endif 20431 20432 /* 20433 ** Return true if zSql is a complete SQL statement. Return false if it 20434 ** ends in the middle of a string literal or C-style comment. 20435 */ 20436 static int line_is_complete(char *zSql, int nSql){ 20437 int rc; 20438 if( zSql==0 ) return 1; 20439 zSql[nSql] = ';'; 20440 zSql[nSql+1] = 0; 20441 rc = sqlite3_complete(zSql); 20442 zSql[nSql] = 0; 20443 return rc; 20444 } 20445 20446 /* 20447 ** Run a single line of SQL. Return the number of errors. 20448 */ 20449 static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){ 20450 int rc; 20451 char *zErrMsg = 0; 20452 20453 open_db(p, 0); 20454 if( ShellHasFlag(p,SHFLG_Backslash) ) resolve_backslashes(zSql); 20455 if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0; 20456 BEGIN_TIMER; 20457 rc = shell_exec(p, zSql, &zErrMsg); 20458 END_TIMER; 20459 if( rc || zErrMsg ){ 20460 char zPrefix[100]; 20461 if( in!=0 || !stdin_is_interactive ){ 20462 sqlite3_snprintf(sizeof(zPrefix), zPrefix, 20463 "Error: near line %d:", startline); 20464 }else{ 20465 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:"); 20466 } 20467 if( zErrMsg!=0 ){ 20468 utf8_printf(stderr, "%s %s\n", zPrefix, zErrMsg); 20469 sqlite3_free(zErrMsg); 20470 zErrMsg = 0; 20471 }else{ 20472 utf8_printf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db)); 20473 } 20474 return 1; 20475 }else if( ShellHasFlag(p, SHFLG_CountChanges) ){ 20476 raw_printf(p->out, "changes: %3d total_changes: %d\n", 20477 sqlite3_changes(p->db), sqlite3_total_changes(p->db)); 20478 } 20479 return 0; 20480 } 20481 20482 20483 /* 20484 ** Read input from *in and process it. If *in==0 then input 20485 ** is interactive - the user is typing it it. Otherwise, input 20486 ** is coming from a file or device. A prompt is issued and history 20487 ** is saved only if input is interactive. An interrupt signal will 20488 ** cause this routine to exit immediately, unless input is interactive. 20489 ** 20490 ** Return the number of errors. 20491 */ 20492 static int process_input(ShellState *p){ 20493 char *zLine = 0; /* A single input line */ 20494 char *zSql = 0; /* Accumulated SQL text */ 20495 int nLine; /* Length of current line */ 20496 int nSql = 0; /* Bytes of zSql[] used */ 20497 int nAlloc = 0; /* Allocated zSql[] space */ 20498 int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */ 20499 int rc; /* Error code */ 20500 int errCnt = 0; /* Number of errors seen */ 20501 int startline = 0; /* Line number for start of current input */ 20502 20503 p->lineno = 0; 20504 while( errCnt==0 || !bail_on_error || (p->in==0 && stdin_is_interactive) ){ 20505 fflush(p->out); 20506 zLine = one_input_line(p->in, zLine, nSql>0); 20507 if( zLine==0 ){ 20508 /* End of input */ 20509 if( p->in==0 && stdin_is_interactive ) printf("\n"); 20510 break; 20511 } 20512 if( seenInterrupt ){ 20513 if( p->in!=0 ) break; 20514 seenInterrupt = 0; 20515 } 20516 p->lineno++; 20517 if( nSql==0 && _all_whitespace(zLine) ){ 20518 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine); 20519 continue; 20520 } 20521 if( zLine && (zLine[0]=='.' || zLine[0]=='#') && nSql==0 ){ 20522 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine); 20523 if( zLine[0]=='.' ){ 20524 rc = do_meta_command(zLine, p); 20525 if( rc==2 ){ /* exit requested */ 20526 break; 20527 }else if( rc ){ 20528 errCnt++; 20529 } 20530 } 20531 continue; 20532 } 20533 if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){ 20534 memcpy(zLine,";",2); 20535 } 20536 nLine = strlen30(zLine); 20537 if( nSql+nLine+2>=nAlloc ){ 20538 nAlloc = nSql+nLine+100; 20539 zSql = realloc(zSql, nAlloc); 20540 if( zSql==0 ) shell_out_of_memory(); 20541 } 20542 nSqlPrior = nSql; 20543 if( nSql==0 ){ 20544 int i; 20545 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){} 20546 assert( nAlloc>0 && zSql!=0 ); 20547 memcpy(zSql, zLine+i, nLine+1-i); 20548 startline = p->lineno; 20549 nSql = nLine-i; 20550 }else{ 20551 zSql[nSql++] = '\n'; 20552 memcpy(zSql+nSql, zLine, nLine+1); 20553 nSql += nLine; 20554 } 20555 if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior) 20556 && sqlite3_complete(zSql) ){ 20557 errCnt += runOneSqlLine(p, zSql, p->in, startline); 20558 nSql = 0; 20559 if( p->outCount ){ 20560 output_reset(p); 20561 p->outCount = 0; 20562 }else{ 20563 clearTempFile(p); 20564 } 20565 }else if( nSql && _all_whitespace(zSql) ){ 20566 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zSql); 20567 nSql = 0; 20568 } 20569 } 20570 if( nSql && !_all_whitespace(zSql) ){ 20571 errCnt += runOneSqlLine(p, zSql, p->in, startline); 20572 } 20573 free(zSql); 20574 free(zLine); 20575 return errCnt>0; 20576 } 20577 20578 /* 20579 ** Return a pathname which is the user's home directory. A 20580 ** 0 return indicates an error of some kind. 20581 */ 20582 static char *find_home_dir(int clearFlag){ 20583 static char *home_dir = NULL; 20584 if( clearFlag ){ 20585 free(home_dir); 20586 home_dir = 0; 20587 return 0; 20588 } 20589 if( home_dir ) return home_dir; 20590 20591 #if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \ 20592 && !defined(__RTP__) && !defined(_WRS_KERNEL) 20593 { 20594 struct passwd *pwent; 20595 uid_t uid = getuid(); 20596 if( (pwent=getpwuid(uid)) != NULL) { 20597 home_dir = pwent->pw_dir; 20598 } 20599 } 20600 #endif 20601 20602 #if defined(_WIN32_WCE) 20603 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv() 20604 */ 20605 home_dir = "/"; 20606 #else 20607 20608 #if defined(_WIN32) || defined(WIN32) 20609 if (!home_dir) { 20610 home_dir = getenv("USERPROFILE"); 20611 } 20612 #endif 20613 20614 if (!home_dir) { 20615 home_dir = getenv("HOME"); 20616 } 20617 20618 #if defined(_WIN32) || defined(WIN32) 20619 if (!home_dir) { 20620 char *zDrive, *zPath; 20621 int n; 20622 zDrive = getenv("HOMEDRIVE"); 20623 zPath = getenv("HOMEPATH"); 20624 if( zDrive && zPath ){ 20625 n = strlen30(zDrive) + strlen30(zPath) + 1; 20626 home_dir = malloc( n ); 20627 if( home_dir==0 ) return 0; 20628 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath); 20629 return home_dir; 20630 } 20631 home_dir = "c:\\"; 20632 } 20633 #endif 20634 20635 #endif /* !_WIN32_WCE */ 20636 20637 if( home_dir ){ 20638 int n = strlen30(home_dir) + 1; 20639 char *z = malloc( n ); 20640 if( z ) memcpy(z, home_dir, n); 20641 home_dir = z; 20642 } 20643 20644 return home_dir; 20645 } 20646 20647 /* 20648 ** Read input from the file given by sqliterc_override. Or if that 20649 ** parameter is NULL, take input from ~/.sqliterc 20650 ** 20651 ** Returns the number of errors. 20652 */ 20653 static void process_sqliterc( 20654 ShellState *p, /* Configuration data */ 20655 const char *sqliterc_override /* Name of config file. NULL to use default */ 20656 ){ 20657 char *home_dir = NULL; 20658 const char *sqliterc = sqliterc_override; 20659 char *zBuf = 0; 20660 FILE *inSaved = p->in; 20661 int savedLineno = p->lineno; 20662 20663 if (sqliterc == NULL) { 20664 home_dir = find_home_dir(0); 20665 if( home_dir==0 ){ 20666 raw_printf(stderr, "-- warning: cannot find home directory;" 20667 " cannot read ~/.sqliterc\n"); 20668 return; 20669 } 20670 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir); 20671 sqliterc = zBuf; 20672 } 20673 p->in = fopen(sqliterc,"rb"); 20674 if( p->in ){ 20675 if( stdin_is_interactive ){ 20676 utf8_printf(stderr,"-- Loading resources from %s\n",sqliterc); 20677 } 20678 if( process_input(p) && bail_on_error ) exit(1); 20679 fclose(p->in); 20680 }else if( sqliterc_override!=0 ){ 20681 utf8_printf(stderr,"cannot open: \"%s\"\n", sqliterc); 20682 if( bail_on_error ) exit(1); 20683 } 20684 p->in = inSaved; 20685 p->lineno = savedLineno; 20686 sqlite3_free(zBuf); 20687 } 20688 20689 /* 20690 ** Show available command line options 20691 */ 20692 static const char zOptions[] = 20693 #if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE) 20694 " -A ARGS... run \".archive ARGS\" and exit\n" 20695 #endif 20696 " -append append the database to the end of the file\n" 20697 " -ascii set output mode to 'ascii'\n" 20698 " -bail stop after hitting an error\n" 20699 " -batch force batch I/O\n" 20700 " -box set output mode to 'box'\n" 20701 " -column set output mode to 'column'\n" 20702 " -cmd COMMAND run \"COMMAND\" before reading stdin\n" 20703 " -csv set output mode to 'csv'\n" 20704 #if defined(SQLITE_ENABLE_DESERIALIZE) 20705 " -deserialize open the database using sqlite3_deserialize()\n" 20706 #endif 20707 " -echo print commands before execution\n" 20708 " -init FILENAME read/process named file\n" 20709 " -[no]header turn headers on or off\n" 20710 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5) 20711 " -heap SIZE Size of heap for memsys3 or memsys5\n" 20712 #endif 20713 " -help show this message\n" 20714 " -html set output mode to HTML\n" 20715 " -interactive force interactive I/O\n" 20716 " -json set output mode to 'json'\n" 20717 " -line set output mode to 'line'\n" 20718 " -list set output mode to 'list'\n" 20719 " -lookaside SIZE N use N entries of SZ bytes for lookaside memory\n" 20720 " -markdown set output mode to 'markdown'\n" 20721 #if defined(SQLITE_ENABLE_DESERIALIZE) 20722 " -maxsize N maximum size for a --deserialize database\n" 20723 #endif 20724 " -memtrace trace all memory allocations and deallocations\n" 20725 " -mmap N default mmap size set to N\n" 20726 #ifdef SQLITE_ENABLE_MULTIPLEX 20727 " -multiplex enable the multiplexor VFS\n" 20728 #endif 20729 " -newline SEP set output row separator. Default: '\\n'\n" 20730 " -nofollow refuse to open symbolic links to database files\n" 20731 " -nullvalue TEXT set text string for NULL values. Default ''\n" 20732 " -pagecache SIZE N use N slots of SZ bytes each for page cache memory\n" 20733 " -quote set output mode to 'quote'\n" 20734 " -readonly open the database read-only\n" 20735 " -separator SEP set output column separator. Default: '|'\n" 20736 #ifdef SQLITE_ENABLE_SORTER_REFERENCES 20737 " -sorterref SIZE sorter references threshold size\n" 20738 #endif 20739 " -stats print memory stats before each finalize\n" 20740 " -table set output mode to 'table'\n" 20741 " -tabs set output mode to 'tabs'\n" 20742 " -version show SQLite version\n" 20743 " -vfs NAME use NAME as the default VFS\n" 20744 #ifdef SQLITE_ENABLE_VFSTRACE 20745 " -vfstrace enable tracing of all VFS calls\n" 20746 #endif 20747 #ifdef SQLITE_HAVE_ZLIB 20748 " -zip open the file as a ZIP Archive\n" 20749 #endif 20750 ; 20751 static void usage(int showDetail){ 20752 utf8_printf(stderr, 20753 "Usage: %s [OPTIONS] FILENAME [SQL]\n" 20754 "FILENAME is the name of an SQLite database. A new database is created\n" 20755 "if the file does not previously exist.\n", Argv0); 20756 if( showDetail ){ 20757 utf8_printf(stderr, "OPTIONS include:\n%s", zOptions); 20758 }else{ 20759 raw_printf(stderr, "Use the -help option for additional information\n"); 20760 } 20761 exit(1); 20762 } 20763 20764 /* 20765 ** Internal check: Verify that the SQLite is uninitialized. Print a 20766 ** error message if it is initialized. 20767 */ 20768 static void verify_uninitialized(void){ 20769 if( sqlite3_config(-1)==SQLITE_MISUSE ){ 20770 utf8_printf(stdout, "WARNING: attempt to configure SQLite after" 20771 " initialization.\n"); 20772 } 20773 } 20774 20775 /* 20776 ** Initialize the state information in data 20777 */ 20778 static void main_init(ShellState *data) { 20779 memset(data, 0, sizeof(*data)); 20780 data->normalMode = data->cMode = data->mode = MODE_List; 20781 data->autoExplain = 1; 20782 memcpy(data->colSeparator,SEP_Column, 2); 20783 memcpy(data->rowSeparator,SEP_Row, 2); 20784 data->showHeader = 0; 20785 data->shellFlgs = SHFLG_Lookaside; 20786 verify_uninitialized(); 20787 sqlite3_config(SQLITE_CONFIG_URI, 1); 20788 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data); 20789 sqlite3_config(SQLITE_CONFIG_MULTITHREAD); 20790 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> "); 20791 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> "); 20792 } 20793 20794 /* 20795 ** Output text to the console in a font that attracts extra attention. 20796 */ 20797 #ifdef _WIN32 20798 static void printBold(const char *zText){ 20799 #if !SQLITE_OS_WINRT 20800 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE); 20801 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo; 20802 GetConsoleScreenBufferInfo(out, &defaultScreenInfo); 20803 SetConsoleTextAttribute(out, 20804 FOREGROUND_RED|FOREGROUND_INTENSITY 20805 ); 20806 #endif 20807 printf("%s", zText); 20808 #if !SQLITE_OS_WINRT 20809 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes); 20810 #endif 20811 } 20812 #else 20813 static void printBold(const char *zText){ 20814 printf("\033[1m%s\033[0m", zText); 20815 } 20816 #endif 20817 20818 /* 20819 ** Get the argument to an --option. Throw an error and die if no argument 20820 ** is available. 20821 */ 20822 static char *cmdline_option_value(int argc, char **argv, int i){ 20823 if( i==argc ){ 20824 utf8_printf(stderr, "%s: Error: missing argument to %s\n", 20825 argv[0], argv[argc-1]); 20826 exit(1); 20827 } 20828 return argv[i]; 20829 } 20830 20831 #ifndef SQLITE_SHELL_IS_UTF8 20832 # if (defined(_WIN32) || defined(WIN32)) && defined(_MSC_VER) 20833 # define SQLITE_SHELL_IS_UTF8 (0) 20834 # else 20835 # define SQLITE_SHELL_IS_UTF8 (1) 20836 # endif 20837 #endif 20838 20839 #if SQLITE_SHELL_IS_UTF8 20840 int SQLITE_CDECL main(int argc, char **argv){ 20841 #else 20842 int SQLITE_CDECL wmain(int argc, wchar_t **wargv){ 20843 char **argv; 20844 #endif 20845 char *zErrMsg = 0; 20846 ShellState data; 20847 const char *zInitFile = 0; 20848 int i; 20849 int rc = 0; 20850 int warnInmemoryDb = 0; 20851 int readStdin = 1; 20852 int nCmd = 0; 20853 char **azCmd = 0; 20854 const char *zVfs = 0; /* Value of -vfs command-line option */ 20855 #if !SQLITE_SHELL_IS_UTF8 20856 char **argvToFree = 0; 20857 int argcToFree = 0; 20858 #endif 20859 20860 setBinaryMode(stdin, 0); 20861 setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */ 20862 stdin_is_interactive = isatty(0); 20863 stdout_is_console = isatty(1); 20864 20865 #ifdef SQLITE_DEBUG 20866 registerOomSimulator(); 20867 #endif 20868 20869 #if !defined(_WIN32_WCE) 20870 if( getenv("SQLITE_DEBUG_BREAK") ){ 20871 if( isatty(0) && isatty(2) ){ 20872 fprintf(stderr, 20873 "attach debugger to process %d and press any key to continue.\n", 20874 GETPID()); 20875 fgetc(stdin); 20876 }else{ 20877 #if defined(_WIN32) || defined(WIN32) 20878 #if SQLITE_OS_WINRT 20879 __debugbreak(); 20880 #else 20881 DebugBreak(); 20882 #endif 20883 #elif defined(SIGTRAP) 20884 raise(SIGTRAP); 20885 #endif 20886 } 20887 } 20888 #endif 20889 20890 #if USE_SYSTEM_SQLITE+0!=1 20891 if( strncmp(sqlite3_sourceid(),SQLITE_SOURCE_ID,60)!=0 ){ 20892 utf8_printf(stderr, "SQLite header and source version mismatch\n%s\n%s\n", 20893 sqlite3_sourceid(), SQLITE_SOURCE_ID); 20894 exit(1); 20895 } 20896 #endif 20897 main_init(&data); 20898 20899 /* On Windows, we must translate command-line arguments into UTF-8. 20900 ** The SQLite memory allocator subsystem has to be enabled in order to 20901 ** do this. But we want to run an sqlite3_shutdown() afterwards so that 20902 ** subsequent sqlite3_config() calls will work. So copy all results into 20903 ** memory that does not come from the SQLite memory allocator. 20904 */ 20905 #if !SQLITE_SHELL_IS_UTF8 20906 sqlite3_initialize(); 20907 argvToFree = malloc(sizeof(argv[0])*argc*2); 20908 argcToFree = argc; 20909 argv = argvToFree + argc; 20910 if( argv==0 ) shell_out_of_memory(); 20911 for(i=0; i<argc; i++){ 20912 char *z = sqlite3_win32_unicode_to_utf8(wargv[i]); 20913 int n; 20914 if( z==0 ) shell_out_of_memory(); 20915 n = (int)strlen(z); 20916 argv[i] = malloc( n+1 ); 20917 if( argv[i]==0 ) shell_out_of_memory(); 20918 memcpy(argv[i], z, n+1); 20919 argvToFree[i] = argv[i]; 20920 sqlite3_free(z); 20921 } 20922 sqlite3_shutdown(); 20923 #endif 20924 20925 assert( argc>=1 && argv && argv[0] ); 20926 Argv0 = argv[0]; 20927 20928 /* Make sure we have a valid signal handler early, before anything 20929 ** else is done. 20930 */ 20931 #ifdef SIGINT 20932 signal(SIGINT, interrupt_handler); 20933 #elif (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE) 20934 SetConsoleCtrlHandler(ConsoleCtrlHandler, TRUE); 20935 #endif 20936 20937 #ifdef SQLITE_SHELL_DBNAME_PROC 20938 { 20939 /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name 20940 ** of a C-function that will provide the name of the database file. Use 20941 ** this compile-time option to embed this shell program in larger 20942 ** applications. */ 20943 extern void SQLITE_SHELL_DBNAME_PROC(const char**); 20944 SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename); 20945 warnInmemoryDb = 0; 20946 } 20947 #endif 20948 20949 /* Do an initial pass through the command-line argument to locate 20950 ** the name of the database file, the name of the initialization file, 20951 ** the size of the alternative malloc heap, 20952 ** and the first command to execute. 20953 */ 20954 verify_uninitialized(); 20955 for(i=1; i<argc; i++){ 20956 char *z; 20957 z = argv[i]; 20958 if( z[0]!='-' ){ 20959 if( data.zDbFilename==0 ){ 20960 data.zDbFilename = z; 20961 }else{ 20962 /* Excesss arguments are interpreted as SQL (or dot-commands) and 20963 ** mean that nothing is read from stdin */ 20964 readStdin = 0; 20965 nCmd++; 20966 azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd); 20967 if( azCmd==0 ) shell_out_of_memory(); 20968 azCmd[nCmd-1] = z; 20969 } 20970 } 20971 if( z[1]=='-' ) z++; 20972 if( strcmp(z,"-separator")==0 20973 || strcmp(z,"-nullvalue")==0 20974 || strcmp(z,"-newline")==0 20975 || strcmp(z,"-cmd")==0 20976 ){ 20977 (void)cmdline_option_value(argc, argv, ++i); 20978 }else if( strcmp(z,"-init")==0 ){ 20979 zInitFile = cmdline_option_value(argc, argv, ++i); 20980 }else if( strcmp(z,"-batch")==0 ){ 20981 /* Need to check for batch mode here to so we can avoid printing 20982 ** informational messages (like from process_sqliterc) before 20983 ** we do the actual processing of arguments later in a second pass. 20984 */ 20985 stdin_is_interactive = 0; 20986 }else if( strcmp(z,"-heap")==0 ){ 20987 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5) 20988 const char *zSize; 20989 sqlite3_int64 szHeap; 20990 20991 zSize = cmdline_option_value(argc, argv, ++i); 20992 szHeap = integerValue(zSize); 20993 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000; 20994 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64); 20995 #else 20996 (void)cmdline_option_value(argc, argv, ++i); 20997 #endif 20998 }else if( strcmp(z,"-pagecache")==0 ){ 20999 sqlite3_int64 n, sz; 21000 sz = integerValue(cmdline_option_value(argc,argv,++i)); 21001 if( sz>70000 ) sz = 70000; 21002 if( sz<0 ) sz = 0; 21003 n = integerValue(cmdline_option_value(argc,argv,++i)); 21004 if( sz>0 && n>0 && 0xffffffffffffLL/sz<n ){ 21005 n = 0xffffffffffffLL/sz; 21006 } 21007 sqlite3_config(SQLITE_CONFIG_PAGECACHE, 21008 (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n); 21009 data.shellFlgs |= SHFLG_Pagecache; 21010 }else if( strcmp(z,"-lookaside")==0 ){ 21011 int n, sz; 21012 sz = (int)integerValue(cmdline_option_value(argc,argv,++i)); 21013 if( sz<0 ) sz = 0; 21014 n = (int)integerValue(cmdline_option_value(argc,argv,++i)); 21015 if( n<0 ) n = 0; 21016 sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n); 21017 if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside; 21018 #ifdef SQLITE_ENABLE_VFSTRACE 21019 }else if( strcmp(z,"-vfstrace")==0 ){ 21020 extern int vfstrace_register( 21021 const char *zTraceName, 21022 const char *zOldVfsName, 21023 int (*xOut)(const char*,void*), 21024 void *pOutArg, 21025 int makeDefault 21026 ); 21027 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1); 21028 #endif 21029 #ifdef SQLITE_ENABLE_MULTIPLEX 21030 }else if( strcmp(z,"-multiplex")==0 ){ 21031 extern int sqlite3_multiple_initialize(const char*,int); 21032 sqlite3_multiplex_initialize(0, 1); 21033 #endif 21034 }else if( strcmp(z,"-mmap")==0 ){ 21035 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i)); 21036 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz); 21037 #ifdef SQLITE_ENABLE_SORTER_REFERENCES 21038 }else if( strcmp(z,"-sorterref")==0 ){ 21039 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i)); 21040 sqlite3_config(SQLITE_CONFIG_SORTERREF_SIZE, (int)sz); 21041 #endif 21042 }else if( strcmp(z,"-vfs")==0 ){ 21043 zVfs = cmdline_option_value(argc, argv, ++i); 21044 #ifdef SQLITE_HAVE_ZLIB 21045 }else if( strcmp(z,"-zip")==0 ){ 21046 data.openMode = SHELL_OPEN_ZIPFILE; 21047 #endif 21048 }else if( strcmp(z,"-append")==0 ){ 21049 data.openMode = SHELL_OPEN_APPENDVFS; 21050 #ifdef SQLITE_ENABLE_DESERIALIZE 21051 }else if( strcmp(z,"-deserialize")==0 ){ 21052 data.openMode = SHELL_OPEN_DESERIALIZE; 21053 }else if( strcmp(z,"-maxsize")==0 && i+1<argc ){ 21054 data.szMax = integerValue(argv[++i]); 21055 #endif 21056 }else if( strcmp(z,"-readonly")==0 ){ 21057 data.openMode = SHELL_OPEN_READONLY; 21058 }else if( strcmp(z,"-nofollow")==0 ){ 21059 data.openFlags = SQLITE_OPEN_NOFOLLOW; 21060 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) 21061 }else if( strncmp(z, "-A",2)==0 ){ 21062 /* All remaining command-line arguments are passed to the ".archive" 21063 ** command, so ignore them */ 21064 break; 21065 #endif 21066 }else if( strcmp(z, "-memtrace")==0 ){ 21067 sqlite3MemTraceActivate(stderr); 21068 }else if( strcmp(z,"-bail")==0 ){ 21069 bail_on_error = 1; 21070 } 21071 } 21072 verify_uninitialized(); 21073 21074 21075 #ifdef SQLITE_SHELL_INIT_PROC 21076 { 21077 /* If the SQLITE_SHELL_INIT_PROC macro is defined, then it is the name 21078 ** of a C-function that will perform initialization actions on SQLite that 21079 ** occur just before or after sqlite3_initialize(). Use this compile-time 21080 ** option to embed this shell program in larger applications. */ 21081 extern void SQLITE_SHELL_INIT_PROC(void); 21082 SQLITE_SHELL_INIT_PROC(); 21083 } 21084 #else 21085 /* All the sqlite3_config() calls have now been made. So it is safe 21086 ** to call sqlite3_initialize() and process any command line -vfs option. */ 21087 sqlite3_initialize(); 21088 #endif 21089 21090 if( zVfs ){ 21091 sqlite3_vfs *pVfs = sqlite3_vfs_find(zVfs); 21092 if( pVfs ){ 21093 sqlite3_vfs_register(pVfs, 1); 21094 }else{ 21095 utf8_printf(stderr, "no such VFS: \"%s\"\n", argv[i]); 21096 exit(1); 21097 } 21098 } 21099 21100 if( data.zDbFilename==0 ){ 21101 #ifndef SQLITE_OMIT_MEMORYDB 21102 data.zDbFilename = ":memory:"; 21103 warnInmemoryDb = argc==1; 21104 #else 21105 utf8_printf(stderr,"%s: Error: no database filename specified\n", Argv0); 21106 return 1; 21107 #endif 21108 } 21109 data.out = stdout; 21110 sqlite3_appendvfs_init(0,0,0); 21111 21112 /* Go ahead and open the database file if it already exists. If the 21113 ** file does not exist, delay opening it. This prevents empty database 21114 ** files from being created if a user mistypes the database name argument 21115 ** to the sqlite command-line tool. 21116 */ 21117 if( access(data.zDbFilename, 0)==0 ){ 21118 open_db(&data, 0); 21119 } 21120 21121 /* Process the initialization file if there is one. If no -init option 21122 ** is given on the command line, look for a file named ~/.sqliterc and 21123 ** try to process it. 21124 */ 21125 process_sqliterc(&data,zInitFile); 21126 21127 /* Make a second pass through the command-line argument and set 21128 ** options. This second pass is delayed until after the initialization 21129 ** file is processed so that the command-line arguments will override 21130 ** settings in the initialization file. 21131 */ 21132 for(i=1; i<argc; i++){ 21133 char *z = argv[i]; 21134 if( z[0]!='-' ) continue; 21135 if( z[1]=='-' ){ z++; } 21136 if( strcmp(z,"-init")==0 ){ 21137 i++; 21138 }else if( strcmp(z,"-html")==0 ){ 21139 data.mode = MODE_Html; 21140 }else if( strcmp(z,"-list")==0 ){ 21141 data.mode = MODE_List; 21142 }else if( strcmp(z,"-quote")==0 ){ 21143 data.mode = MODE_Quote; 21144 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Comma); 21145 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Row); 21146 }else if( strcmp(z,"-line")==0 ){ 21147 data.mode = MODE_Line; 21148 }else if( strcmp(z,"-column")==0 ){ 21149 data.mode = MODE_Column; 21150 }else if( strcmp(z,"-json")==0 ){ 21151 data.mode = MODE_Json; 21152 }else if( strcmp(z,"-markdown")==0 ){ 21153 data.mode = MODE_Markdown; 21154 }else if( strcmp(z,"-table")==0 ){ 21155 data.mode = MODE_Table; 21156 }else if( strcmp(z,"-box")==0 ){ 21157 data.mode = MODE_Box; 21158 }else if( strcmp(z,"-csv")==0 ){ 21159 data.mode = MODE_Csv; 21160 memcpy(data.colSeparator,",",2); 21161 #ifdef SQLITE_HAVE_ZLIB 21162 }else if( strcmp(z,"-zip")==0 ){ 21163 data.openMode = SHELL_OPEN_ZIPFILE; 21164 #endif 21165 }else if( strcmp(z,"-append")==0 ){ 21166 data.openMode = SHELL_OPEN_APPENDVFS; 21167 #ifdef SQLITE_ENABLE_DESERIALIZE 21168 }else if( strcmp(z,"-deserialize")==0 ){ 21169 data.openMode = SHELL_OPEN_DESERIALIZE; 21170 }else if( strcmp(z,"-maxsize")==0 && i+1<argc ){ 21171 data.szMax = integerValue(argv[++i]); 21172 #endif 21173 }else if( strcmp(z,"-readonly")==0 ){ 21174 data.openMode = SHELL_OPEN_READONLY; 21175 }else if( strcmp(z,"-nofollow")==0 ){ 21176 data.openFlags |= SQLITE_OPEN_NOFOLLOW; 21177 }else if( strcmp(z,"-ascii")==0 ){ 21178 data.mode = MODE_Ascii; 21179 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Unit); 21180 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Record); 21181 }else if( strcmp(z,"-tabs")==0 ){ 21182 data.mode = MODE_List; 21183 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Tab); 21184 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Row); 21185 }else if( strcmp(z,"-separator")==0 ){ 21186 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, 21187 "%s",cmdline_option_value(argc,argv,++i)); 21188 }else if( strcmp(z,"-newline")==0 ){ 21189 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, 21190 "%s",cmdline_option_value(argc,argv,++i)); 21191 }else if( strcmp(z,"-nullvalue")==0 ){ 21192 sqlite3_snprintf(sizeof(data.nullValue), data.nullValue, 21193 "%s",cmdline_option_value(argc,argv,++i)); 21194 }else if( strcmp(z,"-header")==0 ){ 21195 data.showHeader = 1; 21196 }else if( strcmp(z,"-noheader")==0 ){ 21197 data.showHeader = 0; 21198 }else if( strcmp(z,"-echo")==0 ){ 21199 ShellSetFlag(&data, SHFLG_Echo); 21200 }else if( strcmp(z,"-eqp")==0 ){ 21201 data.autoEQP = AUTOEQP_on; 21202 }else if( strcmp(z,"-eqpfull")==0 ){ 21203 data.autoEQP = AUTOEQP_full; 21204 }else if( strcmp(z,"-stats")==0 ){ 21205 data.statsOn = 1; 21206 }else if( strcmp(z,"-scanstats")==0 ){ 21207 data.scanstatsOn = 1; 21208 }else if( strcmp(z,"-backslash")==0 ){ 21209 /* Undocumented command-line option: -backslash 21210 ** Causes C-style backslash escapes to be evaluated in SQL statements 21211 ** prior to sending the SQL into SQLite. Useful for injecting 21212 ** crazy bytes in the middle of SQL statements for testing and debugging. 21213 */ 21214 ShellSetFlag(&data, SHFLG_Backslash); 21215 }else if( strcmp(z,"-bail")==0 ){ 21216 /* No-op. The bail_on_error flag should already be set. */ 21217 }else if( strcmp(z,"-version")==0 ){ 21218 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid()); 21219 return 0; 21220 }else if( strcmp(z,"-interactive")==0 ){ 21221 stdin_is_interactive = 1; 21222 }else if( strcmp(z,"-batch")==0 ){ 21223 stdin_is_interactive = 0; 21224 }else if( strcmp(z,"-heap")==0 ){ 21225 i++; 21226 }else if( strcmp(z,"-pagecache")==0 ){ 21227 i+=2; 21228 }else if( strcmp(z,"-lookaside")==0 ){ 21229 i+=2; 21230 }else if( strcmp(z,"-mmap")==0 ){ 21231 i++; 21232 }else if( strcmp(z,"-memtrace")==0 ){ 21233 i++; 21234 #ifdef SQLITE_ENABLE_SORTER_REFERENCES 21235 }else if( strcmp(z,"-sorterref")==0 ){ 21236 i++; 21237 #endif 21238 }else if( strcmp(z,"-vfs")==0 ){ 21239 i++; 21240 #ifdef SQLITE_ENABLE_VFSTRACE 21241 }else if( strcmp(z,"-vfstrace")==0 ){ 21242 i++; 21243 #endif 21244 #ifdef SQLITE_ENABLE_MULTIPLEX 21245 }else if( strcmp(z,"-multiplex")==0 ){ 21246 i++; 21247 #endif 21248 }else if( strcmp(z,"-help")==0 ){ 21249 usage(1); 21250 }else if( strcmp(z,"-cmd")==0 ){ 21251 /* Run commands that follow -cmd first and separately from commands 21252 ** that simply appear on the command-line. This seems goofy. It would 21253 ** be better if all commands ran in the order that they appear. But 21254 ** we retain the goofy behavior for historical compatibility. */ 21255 if( i==argc-1 ) break; 21256 z = cmdline_option_value(argc,argv,++i); 21257 if( z[0]=='.' ){ 21258 rc = do_meta_command(z, &data); 21259 if( rc && bail_on_error ) return rc==2 ? 0 : rc; 21260 }else{ 21261 open_db(&data, 0); 21262 rc = shell_exec(&data, z, &zErrMsg); 21263 if( zErrMsg!=0 ){ 21264 utf8_printf(stderr,"Error: %s\n", zErrMsg); 21265 if( bail_on_error ) return rc!=0 ? rc : 1; 21266 }else if( rc!=0 ){ 21267 utf8_printf(stderr,"Error: unable to process SQL \"%s\"\n", z); 21268 if( bail_on_error ) return rc; 21269 } 21270 } 21271 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) 21272 }else if( strncmp(z, "-A", 2)==0 ){ 21273 if( nCmd>0 ){ 21274 utf8_printf(stderr, "Error: cannot mix regular SQL or dot-commands" 21275 " with \"%s\"\n", z); 21276 return 1; 21277 } 21278 open_db(&data, OPEN_DB_ZIPFILE); 21279 if( z[2] ){ 21280 argv[i] = &z[2]; 21281 arDotCommand(&data, 1, argv+(i-1), argc-(i-1)); 21282 }else{ 21283 arDotCommand(&data, 1, argv+i, argc-i); 21284 } 21285 readStdin = 0; 21286 break; 21287 #endif 21288 }else{ 21289 utf8_printf(stderr,"%s: Error: unknown option: %s\n", Argv0, z); 21290 raw_printf(stderr,"Use -help for a list of options.\n"); 21291 return 1; 21292 } 21293 data.cMode = data.mode; 21294 } 21295 21296 if( !readStdin ){ 21297 /* Run all arguments that do not begin with '-' as if they were separate 21298 ** command-line inputs, except for the argToSkip argument which contains 21299 ** the database filename. 21300 */ 21301 for(i=0; i<nCmd; i++){ 21302 if( azCmd[i][0]=='.' ){ 21303 rc = do_meta_command(azCmd[i], &data); 21304 if( rc ){ 21305 free(azCmd); 21306 return rc==2 ? 0 : rc; 21307 } 21308 }else{ 21309 open_db(&data, 0); 21310 rc = shell_exec(&data, azCmd[i], &zErrMsg); 21311 if( zErrMsg || rc ){ 21312 if( zErrMsg!=0 ){ 21313 utf8_printf(stderr,"Error: %s\n", zErrMsg); 21314 }else{ 21315 utf8_printf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]); 21316 } 21317 sqlite3_free(zErrMsg); 21318 free(azCmd); 21319 return rc!=0 ? rc : 1; 21320 } 21321 } 21322 } 21323 }else{ 21324 /* Run commands received from standard input 21325 */ 21326 if( stdin_is_interactive ){ 21327 char *zHome; 21328 char *zHistory; 21329 int nHistory; 21330 printf( 21331 "SQLite version %s %.19s\n" /*extra-version-info*/ 21332 "Enter \".help\" for usage hints.\n", 21333 sqlite3_libversion(), sqlite3_sourceid() 21334 ); 21335 if( warnInmemoryDb ){ 21336 printf("Connected to a "); 21337 printBold("transient in-memory database"); 21338 printf(".\nUse \".open FILENAME\" to reopen on a " 21339 "persistent database.\n"); 21340 } 21341 zHistory = getenv("SQLITE_HISTORY"); 21342 if( zHistory ){ 21343 zHistory = strdup(zHistory); 21344 }else if( (zHome = find_home_dir(0))!=0 ){ 21345 nHistory = strlen30(zHome) + 20; 21346 if( (zHistory = malloc(nHistory))!=0 ){ 21347 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome); 21348 } 21349 } 21350 if( zHistory ){ shell_read_history(zHistory); } 21351 #if HAVE_READLINE || HAVE_EDITLINE 21352 rl_attempted_completion_function = readline_completion; 21353 #elif HAVE_LINENOISE 21354 linenoiseSetCompletionCallback(linenoise_completion); 21355 #endif 21356 data.in = 0; 21357 rc = process_input(&data); 21358 if( zHistory ){ 21359 shell_stifle_history(2000); 21360 shell_write_history(zHistory); 21361 free(zHistory); 21362 } 21363 }else{ 21364 data.in = stdin; 21365 rc = process_input(&data); 21366 } 21367 } 21368 free(azCmd); 21369 set_table_name(&data, 0); 21370 if( data.db ){ 21371 session_close_all(&data); 21372 close_db(data.db); 21373 } 21374 sqlite3_free(data.zFreeOnClose); 21375 find_home_dir(1); 21376 output_reset(&data); 21377 data.doXdgOpen = 0; 21378 clearTempFile(&data); 21379 #if !SQLITE_SHELL_IS_UTF8 21380 for(i=0; i<argcToFree; i++) free(argvToFree[i]); 21381 free(argvToFree); 21382 #endif 21383 free(data.colWidth); 21384 /* Clear the global data structure so that valgrind will detect memory 21385 ** leaks */ 21386 memset(&data, 0, sizeof(data)); 21387 return rc; 21388 } 21389