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 ** Optionally #include a user-defined header, whereby compilation options 40 ** may be set prior to where they take effect, but after platform setup. 41 ** If SQLITE_CUSTOM_INCLUDE=? is defined, its value names the #include 42 ** file. Note that this macro has a like effect on sqlite3.c compilation. 43 */ 44 #ifdef SQLITE_CUSTOM_INCLUDE 45 # define INC_STRINGIFY_(f) #f 46 # define INC_STRINGIFY(f) INC_STRINGIFY_(f) 47 # include INC_STRINGIFY(SQLITE_CUSTOM_INCLUDE) 48 #endif 49 50 /* 51 ** Determine if we are dealing with WinRT, which provides only a subset of 52 ** the full Win32 API. 53 */ 54 #if !defined(SQLITE_OS_WINRT) 55 # define SQLITE_OS_WINRT 0 56 #endif 57 58 /* 59 ** Warning pragmas copied from msvc.h in the core. 60 */ 61 #if defined(_MSC_VER) 62 #pragma warning(disable : 4054) 63 #pragma warning(disable : 4055) 64 #pragma warning(disable : 4100) 65 #pragma warning(disable : 4127) 66 #pragma warning(disable : 4130) 67 #pragma warning(disable : 4152) 68 #pragma warning(disable : 4189) 69 #pragma warning(disable : 4206) 70 #pragma warning(disable : 4210) 71 #pragma warning(disable : 4232) 72 #pragma warning(disable : 4244) 73 #pragma warning(disable : 4305) 74 #pragma warning(disable : 4306) 75 #pragma warning(disable : 4702) 76 #pragma warning(disable : 4706) 77 #endif /* defined(_MSC_VER) */ 78 79 /* 80 ** No support for loadable extensions in VxWorks. 81 */ 82 #if (defined(__RTP__) || defined(_WRS_KERNEL)) && !SQLITE_OMIT_LOAD_EXTENSION 83 # define SQLITE_OMIT_LOAD_EXTENSION 1 84 #endif 85 86 /* 87 ** Enable large-file support for fopen() and friends on unix. 88 */ 89 #ifndef SQLITE_DISABLE_LFS 90 # define _LARGE_FILE 1 91 # ifndef _FILE_OFFSET_BITS 92 # define _FILE_OFFSET_BITS 64 93 # endif 94 # define _LARGEFILE_SOURCE 1 95 #endif 96 97 #include <stdlib.h> 98 #include <string.h> 99 #include <stdio.h> 100 #include <assert.h> 101 #include "sqlite3.h" 102 typedef sqlite3_int64 i64; 103 typedef sqlite3_uint64 u64; 104 typedef unsigned char u8; 105 #if SQLITE_USER_AUTHENTICATION 106 # include "sqlite3userauth.h" 107 #endif 108 #include <ctype.h> 109 #include <stdarg.h> 110 111 #if !defined(_WIN32) && !defined(WIN32) 112 # include <signal.h> 113 # if !defined(__RTP__) && !defined(_WRS_KERNEL) 114 # include <pwd.h> 115 # endif 116 #endif 117 #if (!defined(_WIN32) && !defined(WIN32)) || defined(__MINGW32__) 118 # include <unistd.h> 119 # include <dirent.h> 120 # define GETPID getpid 121 # if defined(__MINGW32__) 122 # define DIRENT dirent 123 # ifndef S_ISLNK 124 # define S_ISLNK(mode) (0) 125 # endif 126 # endif 127 #else 128 # define GETPID (int)GetCurrentProcessId 129 #endif 130 #include <sys/types.h> 131 #include <sys/stat.h> 132 133 #if HAVE_READLINE 134 # include <readline/readline.h> 135 # include <readline/history.h> 136 #endif 137 138 #if HAVE_EDITLINE 139 # include <editline/readline.h> 140 #endif 141 142 #if HAVE_EDITLINE || HAVE_READLINE 143 144 # define shell_add_history(X) add_history(X) 145 # define shell_read_history(X) read_history(X) 146 # define shell_write_history(X) write_history(X) 147 # define shell_stifle_history(X) stifle_history(X) 148 # define shell_readline(X) readline(X) 149 150 #elif HAVE_LINENOISE 151 152 # include "linenoise.h" 153 # define shell_add_history(X) linenoiseHistoryAdd(X) 154 # define shell_read_history(X) linenoiseHistoryLoad(X) 155 # define shell_write_history(X) linenoiseHistorySave(X) 156 # define shell_stifle_history(X) linenoiseHistorySetMaxLen(X) 157 # define shell_readline(X) linenoise(X) 158 159 #else 160 161 # define shell_read_history(X) 162 # define shell_write_history(X) 163 # define shell_stifle_history(X) 164 165 # define SHELL_USE_LOCAL_GETLINE 1 166 #endif 167 168 169 #if defined(_WIN32) || defined(WIN32) 170 # if SQLITE_OS_WINRT 171 # define SQLITE_OMIT_POPEN 1 172 # else 173 # include <io.h> 174 # include <fcntl.h> 175 # define isatty(h) _isatty(h) 176 # ifndef access 177 # define access(f,m) _access((f),(m)) 178 # endif 179 # ifndef unlink 180 # define unlink _unlink 181 # endif 182 # ifndef strdup 183 # define strdup _strdup 184 # endif 185 # undef popen 186 # define popen _popen 187 # undef pclose 188 # define pclose _pclose 189 # endif 190 #else 191 /* Make sure isatty() has a prototype. */ 192 extern int isatty(int); 193 194 # if !defined(__RTP__) && !defined(_WRS_KERNEL) 195 /* popen and pclose are not C89 functions and so are 196 ** sometimes omitted from the <stdio.h> header */ 197 extern FILE *popen(const char*,const char*); 198 extern int pclose(FILE*); 199 # else 200 # define SQLITE_OMIT_POPEN 1 201 # endif 202 #endif 203 204 #if defined(_WIN32_WCE) 205 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty() 206 * thus we always assume that we have a console. That can be 207 * overridden with the -batch command line option. 208 */ 209 #define isatty(x) 1 210 #endif 211 212 /* ctype macros that work with signed characters */ 213 #define IsSpace(X) isspace((unsigned char)X) 214 #define IsDigit(X) isdigit((unsigned char)X) 215 #define ToLower(X) (char)tolower((unsigned char)X) 216 217 #if defined(_WIN32) || defined(WIN32) 218 #if SQLITE_OS_WINRT 219 #include <intrin.h> 220 #endif 221 #include <windows.h> 222 223 /* string conversion routines only needed on Win32 */ 224 extern char *sqlite3_win32_unicode_to_utf8(LPCWSTR); 225 extern char *sqlite3_win32_mbcs_to_utf8_v2(const char *, int); 226 extern char *sqlite3_win32_utf8_to_mbcs_v2(const char *, int); 227 extern LPWSTR sqlite3_win32_utf8_to_unicode(const char *zText); 228 #endif 229 230 /* On Windows, we normally run with output mode of TEXT so that \n characters 231 ** are automatically translated into \r\n. However, this behavior needs 232 ** to be disabled in some cases (ex: when generating CSV output and when 233 ** rendering quoted strings that contain \n characters). The following 234 ** routines take care of that. 235 */ 236 #if (defined(_WIN32) || defined(WIN32)) && !SQLITE_OS_WINRT 237 static void setBinaryMode(FILE *file, int isOutput){ 238 if( isOutput ) fflush(file); 239 _setmode(_fileno(file), _O_BINARY); 240 } 241 static void setTextMode(FILE *file, int isOutput){ 242 if( isOutput ) fflush(file); 243 _setmode(_fileno(file), _O_TEXT); 244 } 245 #else 246 # define setBinaryMode(X,Y) 247 # define setTextMode(X,Y) 248 #endif 249 250 251 /* True if the timer is enabled */ 252 static int enableTimer = 0; 253 254 /* Return the current wall-clock time */ 255 static sqlite3_int64 timeOfDay(void){ 256 static sqlite3_vfs *clockVfs = 0; 257 sqlite3_int64 t; 258 if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0); 259 if( clockVfs==0 ) return 0; /* Never actually happens */ 260 if( clockVfs->iVersion>=2 && clockVfs->xCurrentTimeInt64!=0 ){ 261 clockVfs->xCurrentTimeInt64(clockVfs, &t); 262 }else{ 263 double r; 264 clockVfs->xCurrentTime(clockVfs, &r); 265 t = (sqlite3_int64)(r*86400000.0); 266 } 267 return t; 268 } 269 270 #if !defined(_WIN32) && !defined(WIN32) && !defined(__minux) 271 #include <sys/time.h> 272 #include <sys/resource.h> 273 274 /* VxWorks does not support getrusage() as far as we can determine */ 275 #if defined(_WRS_KERNEL) || defined(__RTP__) 276 struct rusage { 277 struct timeval ru_utime; /* user CPU time used */ 278 struct timeval ru_stime; /* system CPU time used */ 279 }; 280 #define getrusage(A,B) memset(B,0,sizeof(*B)) 281 #endif 282 283 /* Saved resource information for the beginning of an operation */ 284 static struct rusage sBegin; /* CPU time at start */ 285 static sqlite3_int64 iBegin; /* Wall-clock time at start */ 286 287 /* 288 ** Begin timing an operation 289 */ 290 static void beginTimer(void){ 291 if( enableTimer ){ 292 getrusage(RUSAGE_SELF, &sBegin); 293 iBegin = timeOfDay(); 294 } 295 } 296 297 /* Return the difference of two time_structs in seconds */ 298 static double timeDiff(struct timeval *pStart, struct timeval *pEnd){ 299 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 + 300 (double)(pEnd->tv_sec - pStart->tv_sec); 301 } 302 303 /* 304 ** Print the timing results. 305 */ 306 static void endTimer(void){ 307 if( enableTimer ){ 308 sqlite3_int64 iEnd = timeOfDay(); 309 struct rusage sEnd; 310 getrusage(RUSAGE_SELF, &sEnd); 311 printf("Run Time: real %.3f user %f sys %f\n", 312 (iEnd - iBegin)*0.001, 313 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime), 314 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime)); 315 } 316 } 317 318 #define BEGIN_TIMER beginTimer() 319 #define END_TIMER endTimer() 320 #define HAS_TIMER 1 321 322 #elif (defined(_WIN32) || defined(WIN32)) 323 324 /* Saved resource information for the beginning of an operation */ 325 static HANDLE hProcess; 326 static FILETIME ftKernelBegin; 327 static FILETIME ftUserBegin; 328 static sqlite3_int64 ftWallBegin; 329 typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME, 330 LPFILETIME, LPFILETIME); 331 static GETPROCTIMES getProcessTimesAddr = NULL; 332 333 /* 334 ** Check to see if we have timer support. Return 1 if necessary 335 ** support found (or found previously). 336 */ 337 static int hasTimer(void){ 338 if( getProcessTimesAddr ){ 339 return 1; 340 } else { 341 #if !SQLITE_OS_WINRT 342 /* GetProcessTimes() isn't supported in WIN95 and some other Windows 343 ** versions. See if the version we are running on has it, and if it 344 ** does, save off a pointer to it and the current process handle. 345 */ 346 hProcess = GetCurrentProcess(); 347 if( hProcess ){ 348 HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll")); 349 if( NULL != hinstLib ){ 350 getProcessTimesAddr = 351 (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes"); 352 if( NULL != getProcessTimesAddr ){ 353 return 1; 354 } 355 FreeLibrary(hinstLib); 356 } 357 } 358 #endif 359 } 360 return 0; 361 } 362 363 /* 364 ** Begin timing an operation 365 */ 366 static void beginTimer(void){ 367 if( enableTimer && getProcessTimesAddr ){ 368 FILETIME ftCreation, ftExit; 369 getProcessTimesAddr(hProcess,&ftCreation,&ftExit, 370 &ftKernelBegin,&ftUserBegin); 371 ftWallBegin = timeOfDay(); 372 } 373 } 374 375 /* Return the difference of two FILETIME structs in seconds */ 376 static double timeDiff(FILETIME *pStart, FILETIME *pEnd){ 377 sqlite_int64 i64Start = *((sqlite_int64 *) pStart); 378 sqlite_int64 i64End = *((sqlite_int64 *) pEnd); 379 return (double) ((i64End - i64Start) / 10000000.0); 380 } 381 382 /* 383 ** Print the timing results. 384 */ 385 static void endTimer(void){ 386 if( enableTimer && getProcessTimesAddr){ 387 FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd; 388 sqlite3_int64 ftWallEnd = timeOfDay(); 389 getProcessTimesAddr(hProcess,&ftCreation,&ftExit,&ftKernelEnd,&ftUserEnd); 390 printf("Run Time: real %.3f user %f sys %f\n", 391 (ftWallEnd - ftWallBegin)*0.001, 392 timeDiff(&ftUserBegin, &ftUserEnd), 393 timeDiff(&ftKernelBegin, &ftKernelEnd)); 394 } 395 } 396 397 #define BEGIN_TIMER beginTimer() 398 #define END_TIMER endTimer() 399 #define HAS_TIMER hasTimer() 400 401 #else 402 #define BEGIN_TIMER 403 #define END_TIMER 404 #define HAS_TIMER 0 405 #endif 406 407 /* 408 ** Used to prevent warnings about unused parameters 409 */ 410 #define UNUSED_PARAMETER(x) (void)(x) 411 412 /* 413 ** Number of elements in an array 414 */ 415 #define ArraySize(X) (int)(sizeof(X)/sizeof(X[0])) 416 417 /* 418 ** If the following flag is set, then command execution stops 419 ** at an error if we are not interactive. 420 */ 421 static int bail_on_error = 0; 422 423 /* 424 ** Threat stdin as an interactive input if the following variable 425 ** is true. Otherwise, assume stdin is connected to a file or pipe. 426 */ 427 static int stdin_is_interactive = 1; 428 429 /* 430 ** On Windows systems we have to know if standard output is a console 431 ** in order to translate UTF-8 into MBCS. The following variable is 432 ** true if translation is required. 433 */ 434 static int stdout_is_console = 1; 435 436 /* 437 ** The following is the open SQLite database. We make a pointer 438 ** to this database a static variable so that it can be accessed 439 ** by the SIGINT handler to interrupt database processing. 440 */ 441 static sqlite3 *globalDb = 0; 442 443 /* 444 ** True if an interrupt (Control-C) has been received. 445 */ 446 static volatile int seenInterrupt = 0; 447 448 #ifdef SQLITE_DEBUG 449 /* 450 ** Out-of-memory simulator variables 451 */ 452 static unsigned int oomCounter = 0; /* Simulate OOM when equals 1 */ 453 static unsigned int oomRepeat = 0; /* Number of OOMs in a row */ 454 static void*(*defaultMalloc)(int) = 0; /* The low-level malloc routine */ 455 #endif /* SQLITE_DEBUG */ 456 457 /* 458 ** This is the name of our program. It is set in main(), used 459 ** in a number of other places, mostly for error messages. 460 */ 461 static char *Argv0; 462 463 /* 464 ** Prompt strings. Initialized in main. Settable with 465 ** .prompt main continue 466 */ 467 static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/ 468 static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */ 469 470 /* 471 ** Render output like fprintf(). Except, if the output is going to the 472 ** console and if this is running on a Windows machine, translate the 473 ** output from UTF-8 into MBCS. 474 */ 475 #if defined(_WIN32) || defined(WIN32) 476 void utf8_printf(FILE *out, const char *zFormat, ...){ 477 va_list ap; 478 va_start(ap, zFormat); 479 if( stdout_is_console && (out==stdout || out==stderr) ){ 480 char *z1 = sqlite3_vmprintf(zFormat, ap); 481 char *z2 = sqlite3_win32_utf8_to_mbcs_v2(z1, 0); 482 sqlite3_free(z1); 483 fputs(z2, out); 484 sqlite3_free(z2); 485 }else{ 486 vfprintf(out, zFormat, ap); 487 } 488 va_end(ap); 489 } 490 #elif !defined(utf8_printf) 491 # define utf8_printf fprintf 492 #endif 493 494 /* 495 ** Render output like fprintf(). This should not be used on anything that 496 ** includes string formatting (e.g. "%s"). 497 */ 498 #if !defined(raw_printf) 499 # define raw_printf fprintf 500 #endif 501 502 /* Indicate out-of-memory and exit. */ 503 static void shell_out_of_memory(void){ 504 raw_printf(stderr,"Error: out of memory\n"); 505 exit(1); 506 } 507 508 #ifdef SQLITE_DEBUG 509 /* This routine is called when a simulated OOM occurs. It is broken 510 ** out as a separate routine to make it easy to set a breakpoint on 511 ** the OOM 512 */ 513 void shellOomFault(void){ 514 if( oomRepeat>0 ){ 515 oomRepeat--; 516 }else{ 517 oomCounter--; 518 } 519 } 520 #endif /* SQLITE_DEBUG */ 521 522 #ifdef SQLITE_DEBUG 523 /* This routine is a replacement malloc() that is used to simulate 524 ** Out-Of-Memory (OOM) errors for testing purposes. 525 */ 526 static void *oomMalloc(int nByte){ 527 if( oomCounter ){ 528 if( oomCounter==1 ){ 529 shellOomFault(); 530 return 0; 531 }else{ 532 oomCounter--; 533 } 534 } 535 return defaultMalloc(nByte); 536 } 537 #endif /* SQLITE_DEBUG */ 538 539 #ifdef SQLITE_DEBUG 540 /* Register the OOM simulator. This must occur before any memory 541 ** allocations */ 542 static void registerOomSimulator(void){ 543 sqlite3_mem_methods mem; 544 sqlite3_config(SQLITE_CONFIG_GETMALLOC, &mem); 545 defaultMalloc = mem.xMalloc; 546 mem.xMalloc = oomMalloc; 547 sqlite3_config(SQLITE_CONFIG_MALLOC, &mem); 548 } 549 #endif 550 551 /* 552 ** Write I/O traces to the following stream. 553 */ 554 #ifdef SQLITE_ENABLE_IOTRACE 555 static FILE *iotrace = 0; 556 #endif 557 558 /* 559 ** This routine works like printf in that its first argument is a 560 ** format string and subsequent arguments are values to be substituted 561 ** in place of % fields. The result of formatting this string 562 ** is written to iotrace. 563 */ 564 #ifdef SQLITE_ENABLE_IOTRACE 565 static void SQLITE_CDECL iotracePrintf(const char *zFormat, ...){ 566 va_list ap; 567 char *z; 568 if( iotrace==0 ) return; 569 va_start(ap, zFormat); 570 z = sqlite3_vmprintf(zFormat, ap); 571 va_end(ap); 572 utf8_printf(iotrace, "%s", z); 573 sqlite3_free(z); 574 } 575 #endif 576 577 /* 578 ** Output string zUtf to stream pOut as w characters. If w is negative, 579 ** then right-justify the text. W is the width in UTF-8 characters, not 580 ** in bytes. This is different from the %*.*s specification in printf 581 ** since with %*.*s the width is measured in bytes, not characters. 582 */ 583 static void utf8_width_print(FILE *pOut, int w, const char *zUtf){ 584 int i; 585 int n; 586 int aw = w<0 ? -w : w; 587 for(i=n=0; zUtf[i]; i++){ 588 if( (zUtf[i]&0xc0)!=0x80 ){ 589 n++; 590 if( n==aw ){ 591 do{ i++; }while( (zUtf[i]&0xc0)==0x80 ); 592 break; 593 } 594 } 595 } 596 if( n>=aw ){ 597 utf8_printf(pOut, "%.*s", i, zUtf); 598 }else if( w<0 ){ 599 utf8_printf(pOut, "%*s%s", aw-n, "", zUtf); 600 }else{ 601 utf8_printf(pOut, "%s%*s", zUtf, aw-n, ""); 602 } 603 } 604 605 606 /* 607 ** Determines if a string is a number of not. 608 */ 609 static int isNumber(const char *z, int *realnum){ 610 if( *z=='-' || *z=='+' ) z++; 611 if( !IsDigit(*z) ){ 612 return 0; 613 } 614 z++; 615 if( realnum ) *realnum = 0; 616 while( IsDigit(*z) ){ z++; } 617 if( *z=='.' ){ 618 z++; 619 if( !IsDigit(*z) ) return 0; 620 while( IsDigit(*z) ){ z++; } 621 if( realnum ) *realnum = 1; 622 } 623 if( *z=='e' || *z=='E' ){ 624 z++; 625 if( *z=='+' || *z=='-' ) z++; 626 if( !IsDigit(*z) ) return 0; 627 while( IsDigit(*z) ){ z++; } 628 if( realnum ) *realnum = 1; 629 } 630 return *z==0; 631 } 632 633 /* 634 ** Compute a string length that is limited to what can be stored in 635 ** lower 30 bits of a 32-bit signed integer. 636 */ 637 static int strlen30(const char *z){ 638 const char *z2 = z; 639 while( *z2 ){ z2++; } 640 return 0x3fffffff & (int)(z2 - z); 641 } 642 643 /* 644 ** Return the length of a string in characters. Multibyte UTF8 characters 645 ** count as a single character. 646 */ 647 static int strlenChar(const char *z){ 648 int n = 0; 649 while( *z ){ 650 if( (0xc0&*(z++))!=0x80 ) n++; 651 } 652 return n; 653 } 654 655 /* 656 ** Return open FILE * if zFile exists, can be opened for read 657 ** and is an ordinary file or a character stream source. 658 ** Otherwise return 0. 659 */ 660 static FILE * openChrSource(const char *zFile){ 661 #ifdef _WIN32 662 struct _stat x = {0}; 663 # define STAT_CHR_SRC(mode) ((mode & (_S_IFCHR|_S_IFIFO|_S_IFREG))!=0) 664 /* On Windows, open first, then check the stream nature. This order 665 ** is necessary because _stat() and sibs, when checking a named pipe, 666 ** effectively break the pipe as its supplier sees it. */ 667 FILE *rv = fopen(zFile, "rb"); 668 if( rv==0 ) return 0; 669 if( _fstat(_fileno(rv), &x) != 0 670 || !STAT_CHR_SRC(x.st_mode)){ 671 fclose(rv); 672 rv = 0; 673 } 674 return rv; 675 #else 676 struct stat x = {0}; 677 int rc = stat(zFile, &x); 678 # define STAT_CHR_SRC(mode) (S_ISREG(mode)||S_ISFIFO(mode)||S_ISCHR(mode)) 679 if( rc!=0 ) return 0; 680 if( STAT_CHR_SRC(x.st_mode) ){ 681 return fopen(zFile, "rb"); 682 }else{ 683 return 0; 684 } 685 #endif 686 #undef STAT_CHR_SRC 687 } 688 689 /* 690 ** This routine reads a line of text from FILE in, stores 691 ** the text in memory obtained from malloc() and returns a pointer 692 ** to the text. NULL is returned at end of file, or if malloc() 693 ** fails. 694 ** 695 ** If zLine is not NULL then it is a malloced buffer returned from 696 ** a previous call to this routine that may be reused. 697 */ 698 static char *local_getline(char *zLine, FILE *in){ 699 int nLine = zLine==0 ? 0 : 100; 700 int n = 0; 701 702 while( 1 ){ 703 if( n+100>nLine ){ 704 nLine = nLine*2 + 100; 705 zLine = realloc(zLine, nLine); 706 if( zLine==0 ) shell_out_of_memory(); 707 } 708 if( fgets(&zLine[n], nLine - n, in)==0 ){ 709 if( n==0 ){ 710 free(zLine); 711 return 0; 712 } 713 zLine[n] = 0; 714 break; 715 } 716 while( zLine[n] ) n++; 717 if( n>0 && zLine[n-1]=='\n' ){ 718 n--; 719 if( n>0 && zLine[n-1]=='\r' ) n--; 720 zLine[n] = 0; 721 break; 722 } 723 } 724 #if defined(_WIN32) || defined(WIN32) 725 /* For interactive input on Windows systems, translate the 726 ** multi-byte characterset characters into UTF-8. */ 727 if( stdin_is_interactive && in==stdin ){ 728 char *zTrans = sqlite3_win32_mbcs_to_utf8_v2(zLine, 0); 729 if( zTrans ){ 730 int nTrans = strlen30(zTrans)+1; 731 if( nTrans>nLine ){ 732 zLine = realloc(zLine, nTrans); 733 if( zLine==0 ) shell_out_of_memory(); 734 } 735 memcpy(zLine, zTrans, nTrans); 736 sqlite3_free(zTrans); 737 } 738 } 739 #endif /* defined(_WIN32) || defined(WIN32) */ 740 return zLine; 741 } 742 743 /* 744 ** Retrieve a single line of input text. 745 ** 746 ** If in==0 then read from standard input and prompt before each line. 747 ** If isContinuation is true, then a continuation prompt is appropriate. 748 ** If isContinuation is zero, then the main prompt should be used. 749 ** 750 ** If zPrior is not NULL then it is a buffer from a prior call to this 751 ** routine that can be reused. 752 ** 753 ** The result is stored in space obtained from malloc() and must either 754 ** be freed by the caller or else passed back into this routine via the 755 ** zPrior argument for reuse. 756 */ 757 static char *one_input_line(FILE *in, char *zPrior, int isContinuation){ 758 char *zPrompt; 759 char *zResult; 760 if( in!=0 ){ 761 zResult = local_getline(zPrior, in); 762 }else{ 763 zPrompt = isContinuation ? continuePrompt : mainPrompt; 764 #if SHELL_USE_LOCAL_GETLINE 765 printf("%s", zPrompt); 766 fflush(stdout); 767 zResult = local_getline(zPrior, stdin); 768 #else 769 free(zPrior); 770 zResult = shell_readline(zPrompt); 771 if( zResult && *zResult ) shell_add_history(zResult); 772 #endif 773 } 774 return zResult; 775 } 776 777 778 /* 779 ** Return the value of a hexadecimal digit. Return -1 if the input 780 ** is not a hex digit. 781 */ 782 static int hexDigitValue(char c){ 783 if( c>='0' && c<='9' ) return c - '0'; 784 if( c>='a' && c<='f' ) return c - 'a' + 10; 785 if( c>='A' && c<='F' ) return c - 'A' + 10; 786 return -1; 787 } 788 789 /* 790 ** Interpret zArg as an integer value, possibly with suffixes. 791 */ 792 static sqlite3_int64 integerValue(const char *zArg){ 793 sqlite3_int64 v = 0; 794 static const struct { char *zSuffix; int iMult; } aMult[] = { 795 { "KiB", 1024 }, 796 { "MiB", 1024*1024 }, 797 { "GiB", 1024*1024*1024 }, 798 { "KB", 1000 }, 799 { "MB", 1000000 }, 800 { "GB", 1000000000 }, 801 { "K", 1000 }, 802 { "M", 1000000 }, 803 { "G", 1000000000 }, 804 }; 805 int i; 806 int isNeg = 0; 807 if( zArg[0]=='-' ){ 808 isNeg = 1; 809 zArg++; 810 }else if( zArg[0]=='+' ){ 811 zArg++; 812 } 813 if( zArg[0]=='0' && zArg[1]=='x' ){ 814 int x; 815 zArg += 2; 816 while( (x = hexDigitValue(zArg[0]))>=0 ){ 817 v = (v<<4) + x; 818 zArg++; 819 } 820 }else{ 821 while( IsDigit(zArg[0]) ){ 822 v = v*10 + zArg[0] - '0'; 823 zArg++; 824 } 825 } 826 for(i=0; i<ArraySize(aMult); i++){ 827 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){ 828 v *= aMult[i].iMult; 829 break; 830 } 831 } 832 return isNeg? -v : v; 833 } 834 835 /* 836 ** A variable length string to which one can append text. 837 */ 838 typedef struct ShellText ShellText; 839 struct ShellText { 840 char *z; 841 int n; 842 int nAlloc; 843 }; 844 845 /* 846 ** Initialize and destroy a ShellText object 847 */ 848 static void initText(ShellText *p){ 849 memset(p, 0, sizeof(*p)); 850 } 851 static void freeText(ShellText *p){ 852 free(p->z); 853 initText(p); 854 } 855 856 /* zIn is either a pointer to a NULL-terminated string in memory obtained 857 ** from malloc(), or a NULL pointer. The string pointed to by zAppend is 858 ** added to zIn, and the result returned in memory obtained from malloc(). 859 ** zIn, if it was not NULL, is freed. 860 ** 861 ** If the third argument, quote, is not '\0', then it is used as a 862 ** quote character for zAppend. 863 */ 864 static void appendText(ShellText *p, char const *zAppend, char quote){ 865 int len; 866 int i; 867 int nAppend = strlen30(zAppend); 868 869 len = nAppend+p->n+1; 870 if( quote ){ 871 len += 2; 872 for(i=0; i<nAppend; i++){ 873 if( zAppend[i]==quote ) len++; 874 } 875 } 876 877 if( p->z==0 || p->n+len>=p->nAlloc ){ 878 p->nAlloc = p->nAlloc*2 + len + 20; 879 p->z = realloc(p->z, p->nAlloc); 880 if( p->z==0 ) shell_out_of_memory(); 881 } 882 883 if( quote ){ 884 char *zCsr = p->z+p->n; 885 *zCsr++ = quote; 886 for(i=0; i<nAppend; i++){ 887 *zCsr++ = zAppend[i]; 888 if( zAppend[i]==quote ) *zCsr++ = quote; 889 } 890 *zCsr++ = quote; 891 p->n = (int)(zCsr - p->z); 892 *zCsr = '\0'; 893 }else{ 894 memcpy(p->z+p->n, zAppend, nAppend); 895 p->n += nAppend; 896 p->z[p->n] = '\0'; 897 } 898 } 899 900 /* 901 ** Attempt to determine if identifier zName needs to be quoted, either 902 ** because it contains non-alphanumeric characters, or because it is an 903 ** SQLite keyword. Be conservative in this estimate: When in doubt assume 904 ** that quoting is required. 905 ** 906 ** Return '"' if quoting is required. Return 0 if no quoting is required. 907 */ 908 static char quoteChar(const char *zName){ 909 int i; 910 if( !isalpha((unsigned char)zName[0]) && zName[0]!='_' ) return '"'; 911 for(i=0; zName[i]; i++){ 912 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ) return '"'; 913 } 914 return sqlite3_keyword_check(zName, i) ? '"' : 0; 915 } 916 917 /* 918 ** Construct a fake object name and column list to describe the structure 919 ** of the view, virtual table, or table valued function zSchema.zName. 920 */ 921 static char *shellFakeSchema( 922 sqlite3 *db, /* The database connection containing the vtab */ 923 const char *zSchema, /* Schema of the database holding the vtab */ 924 const char *zName /* The name of the virtual table */ 925 ){ 926 sqlite3_stmt *pStmt = 0; 927 char *zSql; 928 ShellText s; 929 char cQuote; 930 char *zDiv = "("; 931 int nRow = 0; 932 933 zSql = sqlite3_mprintf("PRAGMA \"%w\".table_info=%Q;", 934 zSchema ? zSchema : "main", zName); 935 sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); 936 sqlite3_free(zSql); 937 initText(&s); 938 if( zSchema ){ 939 cQuote = quoteChar(zSchema); 940 if( cQuote && sqlite3_stricmp(zSchema,"temp")==0 ) cQuote = 0; 941 appendText(&s, zSchema, cQuote); 942 appendText(&s, ".", 0); 943 } 944 cQuote = quoteChar(zName); 945 appendText(&s, zName, cQuote); 946 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 947 const char *zCol = (const char*)sqlite3_column_text(pStmt, 1); 948 nRow++; 949 appendText(&s, zDiv, 0); 950 zDiv = ","; 951 cQuote = quoteChar(zCol); 952 appendText(&s, zCol, cQuote); 953 } 954 appendText(&s, ")", 0); 955 sqlite3_finalize(pStmt); 956 if( nRow==0 ){ 957 freeText(&s); 958 s.z = 0; 959 } 960 return s.z; 961 } 962 963 /* 964 ** SQL function: shell_module_schema(X) 965 ** 966 ** Return a fake schema for the table-valued function or eponymous virtual 967 ** table X. 968 */ 969 static void shellModuleSchema( 970 sqlite3_context *pCtx, 971 int nVal, 972 sqlite3_value **apVal 973 ){ 974 const char *zName = (const char*)sqlite3_value_text(apVal[0]); 975 char *zFake = shellFakeSchema(sqlite3_context_db_handle(pCtx), 0, zName); 976 UNUSED_PARAMETER(nVal); 977 if( zFake ){ 978 sqlite3_result_text(pCtx, sqlite3_mprintf("/* %s */", zFake), 979 -1, sqlite3_free); 980 free(zFake); 981 } 982 } 983 984 /* 985 ** SQL function: shell_add_schema(S,X) 986 ** 987 ** Add the schema name X to the CREATE statement in S and return the result. 988 ** Examples: 989 ** 990 ** CREATE TABLE t1(x) -> CREATE TABLE xyz.t1(x); 991 ** 992 ** Also works on 993 ** 994 ** CREATE INDEX 995 ** CREATE UNIQUE INDEX 996 ** CREATE VIEW 997 ** CREATE TRIGGER 998 ** CREATE VIRTUAL TABLE 999 ** 1000 ** This UDF is used by the .schema command to insert the schema name of 1001 ** attached databases into the middle of the sqlite_schema.sql field. 1002 */ 1003 static void shellAddSchemaName( 1004 sqlite3_context *pCtx, 1005 int nVal, 1006 sqlite3_value **apVal 1007 ){ 1008 static const char *aPrefix[] = { 1009 "TABLE", 1010 "INDEX", 1011 "UNIQUE INDEX", 1012 "VIEW", 1013 "TRIGGER", 1014 "VIRTUAL TABLE" 1015 }; 1016 int i = 0; 1017 const char *zIn = (const char*)sqlite3_value_text(apVal[0]); 1018 const char *zSchema = (const char*)sqlite3_value_text(apVal[1]); 1019 const char *zName = (const char*)sqlite3_value_text(apVal[2]); 1020 sqlite3 *db = sqlite3_context_db_handle(pCtx); 1021 UNUSED_PARAMETER(nVal); 1022 if( zIn!=0 && strncmp(zIn, "CREATE ", 7)==0 ){ 1023 for(i=0; i<ArraySize(aPrefix); i++){ 1024 int n = strlen30(aPrefix[i]); 1025 if( strncmp(zIn+7, aPrefix[i], n)==0 && zIn[n+7]==' ' ){ 1026 char *z = 0; 1027 char *zFake = 0; 1028 if( zSchema ){ 1029 char cQuote = quoteChar(zSchema); 1030 if( cQuote && sqlite3_stricmp(zSchema,"temp")!=0 ){ 1031 z = sqlite3_mprintf("%.*s \"%w\".%s", n+7, zIn, zSchema, zIn+n+8); 1032 }else{ 1033 z = sqlite3_mprintf("%.*s %s.%s", n+7, zIn, zSchema, zIn+n+8); 1034 } 1035 } 1036 if( zName 1037 && aPrefix[i][0]=='V' 1038 && (zFake = shellFakeSchema(db, zSchema, zName))!=0 1039 ){ 1040 if( z==0 ){ 1041 z = sqlite3_mprintf("%s\n/* %s */", zIn, zFake); 1042 }else{ 1043 z = sqlite3_mprintf("%z\n/* %s */", z, zFake); 1044 } 1045 free(zFake); 1046 } 1047 if( z ){ 1048 sqlite3_result_text(pCtx, z, -1, sqlite3_free); 1049 return; 1050 } 1051 } 1052 } 1053 } 1054 sqlite3_result_value(pCtx, apVal[0]); 1055 } 1056 1057 /* 1058 ** The source code for several run-time loadable extensions is inserted 1059 ** below by the ../tool/mkshellc.tcl script. Before processing that included 1060 ** code, we need to override some macros to make the included program code 1061 ** work here in the middle of this regular program. 1062 */ 1063 #define SQLITE_EXTENSION_INIT1 1064 #define SQLITE_EXTENSION_INIT2(X) (void)(X) 1065 1066 #if defined(_WIN32) && defined(_MSC_VER) 1067 /************************* Begin test_windirent.h ******************/ 1068 /* 1069 ** 2015 November 30 1070 ** 1071 ** The author disclaims copyright to this source code. In place of 1072 ** a legal notice, here is a blessing: 1073 ** 1074 ** May you do good and not evil. 1075 ** May you find forgiveness for yourself and forgive others. 1076 ** May you share freely, never taking more than you give. 1077 ** 1078 ************************************************************************* 1079 ** This file contains declarations for most of the opendir() family of 1080 ** POSIX functions on Win32 using the MSVCRT. 1081 */ 1082 1083 #if defined(_WIN32) && defined(_MSC_VER) && !defined(SQLITE_WINDIRENT_H) 1084 #define SQLITE_WINDIRENT_H 1085 1086 /* 1087 ** We need several data types from the Windows SDK header. 1088 */ 1089 1090 #ifndef WIN32_LEAN_AND_MEAN 1091 #define WIN32_LEAN_AND_MEAN 1092 #endif 1093 1094 #include "windows.h" 1095 1096 /* 1097 ** We need several support functions from the SQLite core. 1098 */ 1099 1100 /* #include "sqlite3.h" */ 1101 1102 /* 1103 ** We need several things from the ANSI and MSVCRT headers. 1104 */ 1105 1106 #include <stdio.h> 1107 #include <stdlib.h> 1108 #include <errno.h> 1109 #include <io.h> 1110 #include <limits.h> 1111 #include <sys/types.h> 1112 #include <sys/stat.h> 1113 1114 /* 1115 ** We may need several defines that should have been in "sys/stat.h". 1116 */ 1117 1118 #ifndef S_ISREG 1119 #define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG) 1120 #endif 1121 1122 #ifndef S_ISDIR 1123 #define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) 1124 #endif 1125 1126 #ifndef S_ISLNK 1127 #define S_ISLNK(mode) (0) 1128 #endif 1129 1130 /* 1131 ** We may need to provide the "mode_t" type. 1132 */ 1133 1134 #ifndef MODE_T_DEFINED 1135 #define MODE_T_DEFINED 1136 typedef unsigned short mode_t; 1137 #endif 1138 1139 /* 1140 ** We may need to provide the "ino_t" type. 1141 */ 1142 1143 #ifndef INO_T_DEFINED 1144 #define INO_T_DEFINED 1145 typedef unsigned short ino_t; 1146 #endif 1147 1148 /* 1149 ** We need to define "NAME_MAX" if it was not present in "limits.h". 1150 */ 1151 1152 #ifndef NAME_MAX 1153 # ifdef FILENAME_MAX 1154 # define NAME_MAX (FILENAME_MAX) 1155 # else 1156 # define NAME_MAX (260) 1157 # endif 1158 #endif 1159 1160 /* 1161 ** We need to define "NULL_INTPTR_T" and "BAD_INTPTR_T". 1162 */ 1163 1164 #ifndef NULL_INTPTR_T 1165 # define NULL_INTPTR_T ((intptr_t)(0)) 1166 #endif 1167 1168 #ifndef BAD_INTPTR_T 1169 # define BAD_INTPTR_T ((intptr_t)(-1)) 1170 #endif 1171 1172 /* 1173 ** We need to provide the necessary structures and related types. 1174 */ 1175 1176 #ifndef DIRENT_DEFINED 1177 #define DIRENT_DEFINED 1178 typedef struct DIRENT DIRENT; 1179 typedef DIRENT *LPDIRENT; 1180 struct DIRENT { 1181 ino_t d_ino; /* Sequence number, do not use. */ 1182 unsigned d_attributes; /* Win32 file attributes. */ 1183 char d_name[NAME_MAX + 1]; /* Name within the directory. */ 1184 }; 1185 #endif 1186 1187 #ifndef DIR_DEFINED 1188 #define DIR_DEFINED 1189 typedef struct DIR DIR; 1190 typedef DIR *LPDIR; 1191 struct DIR { 1192 intptr_t d_handle; /* Value returned by "_findfirst". */ 1193 DIRENT d_first; /* DIRENT constructed based on "_findfirst". */ 1194 DIRENT d_next; /* DIRENT constructed based on "_findnext". */ 1195 }; 1196 #endif 1197 1198 /* 1199 ** Provide a macro, for use by the implementation, to determine if a 1200 ** particular directory entry should be skipped over when searching for 1201 ** the next directory entry that should be returned by the readdir() or 1202 ** readdir_r() functions. 1203 */ 1204 1205 #ifndef is_filtered 1206 # define is_filtered(a) ((((a).attrib)&_A_HIDDEN) || (((a).attrib)&_A_SYSTEM)) 1207 #endif 1208 1209 /* 1210 ** Provide the function prototype for the POSIX compatiable getenv() 1211 ** function. This function is not thread-safe. 1212 */ 1213 1214 extern const char *windirent_getenv(const char *name); 1215 1216 /* 1217 ** Finally, we can provide the function prototypes for the opendir(), 1218 ** readdir(), readdir_r(), and closedir() POSIX functions. 1219 */ 1220 1221 extern LPDIR opendir(const char *dirname); 1222 extern LPDIRENT readdir(LPDIR dirp); 1223 extern INT readdir_r(LPDIR dirp, LPDIRENT entry, LPDIRENT *result); 1224 extern INT closedir(LPDIR dirp); 1225 1226 #endif /* defined(WIN32) && defined(_MSC_VER) */ 1227 1228 /************************* End test_windirent.h ********************/ 1229 /************************* Begin test_windirent.c ******************/ 1230 /* 1231 ** 2015 November 30 1232 ** 1233 ** The author disclaims copyright to this source code. In place of 1234 ** a legal notice, here is a blessing: 1235 ** 1236 ** May you do good and not evil. 1237 ** May you find forgiveness for yourself and forgive others. 1238 ** May you share freely, never taking more than you give. 1239 ** 1240 ************************************************************************* 1241 ** This file contains code to implement most of the opendir() family of 1242 ** POSIX functions on Win32 using the MSVCRT. 1243 */ 1244 1245 #if defined(_WIN32) && defined(_MSC_VER) 1246 /* #include "test_windirent.h" */ 1247 1248 /* 1249 ** Implementation of the POSIX getenv() function using the Win32 API. 1250 ** This function is not thread-safe. 1251 */ 1252 const char *windirent_getenv( 1253 const char *name 1254 ){ 1255 static char value[32768]; /* Maximum length, per MSDN */ 1256 DWORD dwSize = sizeof(value) / sizeof(char); /* Size in chars */ 1257 DWORD dwRet; /* Value returned by GetEnvironmentVariableA() */ 1258 1259 memset(value, 0, sizeof(value)); 1260 dwRet = GetEnvironmentVariableA(name, value, dwSize); 1261 if( dwRet==0 || dwRet>dwSize ){ 1262 /* 1263 ** The function call to GetEnvironmentVariableA() failed -OR- 1264 ** the buffer is not large enough. Either way, return NULL. 1265 */ 1266 return 0; 1267 }else{ 1268 /* 1269 ** The function call to GetEnvironmentVariableA() succeeded 1270 ** -AND- the buffer contains the entire value. 1271 */ 1272 return value; 1273 } 1274 } 1275 1276 /* 1277 ** Implementation of the POSIX opendir() function using the MSVCRT. 1278 */ 1279 LPDIR opendir( 1280 const char *dirname 1281 ){ 1282 struct _finddata_t data; 1283 LPDIR dirp = (LPDIR)sqlite3_malloc(sizeof(DIR)); 1284 SIZE_T namesize = sizeof(data.name) / sizeof(data.name[0]); 1285 1286 if( dirp==NULL ) return NULL; 1287 memset(dirp, 0, sizeof(DIR)); 1288 1289 /* TODO: Remove this if Unix-style root paths are not used. */ 1290 if( sqlite3_stricmp(dirname, "/")==0 ){ 1291 dirname = windirent_getenv("SystemDrive"); 1292 } 1293 1294 memset(&data, 0, sizeof(struct _finddata_t)); 1295 _snprintf(data.name, namesize, "%s\\*", dirname); 1296 dirp->d_handle = _findfirst(data.name, &data); 1297 1298 if( dirp->d_handle==BAD_INTPTR_T ){ 1299 closedir(dirp); 1300 return NULL; 1301 } 1302 1303 /* TODO: Remove this block to allow hidden and/or system files. */ 1304 if( is_filtered(data) ){ 1305 next: 1306 1307 memset(&data, 0, sizeof(struct _finddata_t)); 1308 if( _findnext(dirp->d_handle, &data)==-1 ){ 1309 closedir(dirp); 1310 return NULL; 1311 } 1312 1313 /* TODO: Remove this block to allow hidden and/or system files. */ 1314 if( is_filtered(data) ) goto next; 1315 } 1316 1317 dirp->d_first.d_attributes = data.attrib; 1318 strncpy(dirp->d_first.d_name, data.name, NAME_MAX); 1319 dirp->d_first.d_name[NAME_MAX] = '\0'; 1320 1321 return dirp; 1322 } 1323 1324 /* 1325 ** Implementation of the POSIX readdir() function using the MSVCRT. 1326 */ 1327 LPDIRENT readdir( 1328 LPDIR dirp 1329 ){ 1330 struct _finddata_t data; 1331 1332 if( dirp==NULL ) return NULL; 1333 1334 if( dirp->d_first.d_ino==0 ){ 1335 dirp->d_first.d_ino++; 1336 dirp->d_next.d_ino++; 1337 1338 return &dirp->d_first; 1339 } 1340 1341 next: 1342 1343 memset(&data, 0, sizeof(struct _finddata_t)); 1344 if( _findnext(dirp->d_handle, &data)==-1 ) return NULL; 1345 1346 /* TODO: Remove this block to allow hidden and/or system files. */ 1347 if( is_filtered(data) ) goto next; 1348 1349 dirp->d_next.d_ino++; 1350 dirp->d_next.d_attributes = data.attrib; 1351 strncpy(dirp->d_next.d_name, data.name, NAME_MAX); 1352 dirp->d_next.d_name[NAME_MAX] = '\0'; 1353 1354 return &dirp->d_next; 1355 } 1356 1357 /* 1358 ** Implementation of the POSIX readdir_r() function using the MSVCRT. 1359 */ 1360 INT readdir_r( 1361 LPDIR dirp, 1362 LPDIRENT entry, 1363 LPDIRENT *result 1364 ){ 1365 struct _finddata_t data; 1366 1367 if( dirp==NULL ) return EBADF; 1368 1369 if( dirp->d_first.d_ino==0 ){ 1370 dirp->d_first.d_ino++; 1371 dirp->d_next.d_ino++; 1372 1373 entry->d_ino = dirp->d_first.d_ino; 1374 entry->d_attributes = dirp->d_first.d_attributes; 1375 strncpy(entry->d_name, dirp->d_first.d_name, NAME_MAX); 1376 entry->d_name[NAME_MAX] = '\0'; 1377 1378 *result = entry; 1379 return 0; 1380 } 1381 1382 next: 1383 1384 memset(&data, 0, sizeof(struct _finddata_t)); 1385 if( _findnext(dirp->d_handle, &data)==-1 ){ 1386 *result = NULL; 1387 return ENOENT; 1388 } 1389 1390 /* TODO: Remove this block to allow hidden and/or system files. */ 1391 if( is_filtered(data) ) goto next; 1392 1393 entry->d_ino = (ino_t)-1; /* not available */ 1394 entry->d_attributes = data.attrib; 1395 strncpy(entry->d_name, data.name, NAME_MAX); 1396 entry->d_name[NAME_MAX] = '\0'; 1397 1398 *result = entry; 1399 return 0; 1400 } 1401 1402 /* 1403 ** Implementation of the POSIX closedir() function using the MSVCRT. 1404 */ 1405 INT closedir( 1406 LPDIR dirp 1407 ){ 1408 INT result = 0; 1409 1410 if( dirp==NULL ) return EINVAL; 1411 1412 if( dirp->d_handle!=NULL_INTPTR_T && dirp->d_handle!=BAD_INTPTR_T ){ 1413 result = _findclose(dirp->d_handle); 1414 } 1415 1416 sqlite3_free(dirp); 1417 return result; 1418 } 1419 1420 #endif /* defined(WIN32) && defined(_MSC_VER) */ 1421 1422 /************************* End test_windirent.c ********************/ 1423 #define dirent DIRENT 1424 #endif 1425 /************************* Begin ../ext/misc/shathree.c ******************/ 1426 /* 1427 ** 2017-03-08 1428 ** 1429 ** The author disclaims copyright to this source code. In place of 1430 ** a legal notice, here is a blessing: 1431 ** 1432 ** May you do good and not evil. 1433 ** May you find forgiveness for yourself and forgive others. 1434 ** May you share freely, never taking more than you give. 1435 ** 1436 ****************************************************************************** 1437 ** 1438 ** This SQLite extension implements functions that compute SHA3 hashes. 1439 ** Two SQL functions are implemented: 1440 ** 1441 ** sha3(X,SIZE) 1442 ** sha3_query(Y,SIZE) 1443 ** 1444 ** The sha3(X) function computes the SHA3 hash of the input X, or NULL if 1445 ** X is NULL. 1446 ** 1447 ** The sha3_query(Y) function evalutes all queries in the SQL statements of Y 1448 ** and returns a hash of their results. 1449 ** 1450 ** The SIZE argument is optional. If omitted, the SHA3-256 hash algorithm 1451 ** is used. If SIZE is included it must be one of the integers 224, 256, 1452 ** 384, or 512, to determine SHA3 hash variant that is computed. 1453 */ 1454 /* #include "sqlite3ext.h" */ 1455 SQLITE_EXTENSION_INIT1 1456 #include <assert.h> 1457 #include <string.h> 1458 #include <stdarg.h> 1459 1460 #ifndef SQLITE_AMALGAMATION 1461 /* typedef sqlite3_uint64 u64; */ 1462 #endif /* SQLITE_AMALGAMATION */ 1463 1464 /****************************************************************************** 1465 ** The Hash Engine 1466 */ 1467 /* 1468 ** Macros to determine whether the machine is big or little endian, 1469 ** and whether or not that determination is run-time or compile-time. 1470 ** 1471 ** For best performance, an attempt is made to guess at the byte-order 1472 ** using C-preprocessor macros. If that is unsuccessful, or if 1473 ** -DSHA3_BYTEORDER=0 is set, then byte-order is determined 1474 ** at run-time. 1475 */ 1476 #ifndef SHA3_BYTEORDER 1477 # if defined(i386) || defined(__i386__) || defined(_M_IX86) || \ 1478 defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || \ 1479 defined(_M_AMD64) || defined(_M_ARM) || defined(__x86) || \ 1480 defined(__arm__) 1481 # define SHA3_BYTEORDER 1234 1482 # elif defined(sparc) || defined(__ppc__) 1483 # define SHA3_BYTEORDER 4321 1484 # else 1485 # define SHA3_BYTEORDER 0 1486 # endif 1487 #endif 1488 1489 1490 /* 1491 ** State structure for a SHA3 hash in progress 1492 */ 1493 typedef struct SHA3Context SHA3Context; 1494 struct SHA3Context { 1495 union { 1496 u64 s[25]; /* Keccak state. 5x5 lines of 64 bits each */ 1497 unsigned char x[1600]; /* ... or 1600 bytes */ 1498 } u; 1499 unsigned nRate; /* Bytes of input accepted per Keccak iteration */ 1500 unsigned nLoaded; /* Input bytes loaded into u.x[] so far this cycle */ 1501 unsigned ixMask; /* Insert next input into u.x[nLoaded^ixMask]. */ 1502 }; 1503 1504 /* 1505 ** A single step of the Keccak mixing function for a 1600-bit state 1506 */ 1507 static void KeccakF1600Step(SHA3Context *p){ 1508 int i; 1509 u64 b0, b1, b2, b3, b4; 1510 u64 c0, c1, c2, c3, c4; 1511 u64 d0, d1, d2, d3, d4; 1512 static const u64 RC[] = { 1513 0x0000000000000001ULL, 0x0000000000008082ULL, 1514 0x800000000000808aULL, 0x8000000080008000ULL, 1515 0x000000000000808bULL, 0x0000000080000001ULL, 1516 0x8000000080008081ULL, 0x8000000000008009ULL, 1517 0x000000000000008aULL, 0x0000000000000088ULL, 1518 0x0000000080008009ULL, 0x000000008000000aULL, 1519 0x000000008000808bULL, 0x800000000000008bULL, 1520 0x8000000000008089ULL, 0x8000000000008003ULL, 1521 0x8000000000008002ULL, 0x8000000000000080ULL, 1522 0x000000000000800aULL, 0x800000008000000aULL, 1523 0x8000000080008081ULL, 0x8000000000008080ULL, 1524 0x0000000080000001ULL, 0x8000000080008008ULL 1525 }; 1526 # define a00 (p->u.s[0]) 1527 # define a01 (p->u.s[1]) 1528 # define a02 (p->u.s[2]) 1529 # define a03 (p->u.s[3]) 1530 # define a04 (p->u.s[4]) 1531 # define a10 (p->u.s[5]) 1532 # define a11 (p->u.s[6]) 1533 # define a12 (p->u.s[7]) 1534 # define a13 (p->u.s[8]) 1535 # define a14 (p->u.s[9]) 1536 # define a20 (p->u.s[10]) 1537 # define a21 (p->u.s[11]) 1538 # define a22 (p->u.s[12]) 1539 # define a23 (p->u.s[13]) 1540 # define a24 (p->u.s[14]) 1541 # define a30 (p->u.s[15]) 1542 # define a31 (p->u.s[16]) 1543 # define a32 (p->u.s[17]) 1544 # define a33 (p->u.s[18]) 1545 # define a34 (p->u.s[19]) 1546 # define a40 (p->u.s[20]) 1547 # define a41 (p->u.s[21]) 1548 # define a42 (p->u.s[22]) 1549 # define a43 (p->u.s[23]) 1550 # define a44 (p->u.s[24]) 1551 # define ROL64(a,x) ((a<<x)|(a>>(64-x))) 1552 1553 for(i=0; i<24; i+=4){ 1554 c0 = a00^a10^a20^a30^a40; 1555 c1 = a01^a11^a21^a31^a41; 1556 c2 = a02^a12^a22^a32^a42; 1557 c3 = a03^a13^a23^a33^a43; 1558 c4 = a04^a14^a24^a34^a44; 1559 d0 = c4^ROL64(c1, 1); 1560 d1 = c0^ROL64(c2, 1); 1561 d2 = c1^ROL64(c3, 1); 1562 d3 = c2^ROL64(c4, 1); 1563 d4 = c3^ROL64(c0, 1); 1564 1565 b0 = (a00^d0); 1566 b1 = ROL64((a11^d1), 44); 1567 b2 = ROL64((a22^d2), 43); 1568 b3 = ROL64((a33^d3), 21); 1569 b4 = ROL64((a44^d4), 14); 1570 a00 = b0 ^((~b1)& b2 ); 1571 a00 ^= RC[i]; 1572 a11 = b1 ^((~b2)& b3 ); 1573 a22 = b2 ^((~b3)& b4 ); 1574 a33 = b3 ^((~b4)& b0 ); 1575 a44 = b4 ^((~b0)& b1 ); 1576 1577 b2 = ROL64((a20^d0), 3); 1578 b3 = ROL64((a31^d1), 45); 1579 b4 = ROL64((a42^d2), 61); 1580 b0 = ROL64((a03^d3), 28); 1581 b1 = ROL64((a14^d4), 20); 1582 a20 = b0 ^((~b1)& b2 ); 1583 a31 = b1 ^((~b2)& b3 ); 1584 a42 = b2 ^((~b3)& b4 ); 1585 a03 = b3 ^((~b4)& b0 ); 1586 a14 = b4 ^((~b0)& b1 ); 1587 1588 b4 = ROL64((a40^d0), 18); 1589 b0 = ROL64((a01^d1), 1); 1590 b1 = ROL64((a12^d2), 6); 1591 b2 = ROL64((a23^d3), 25); 1592 b3 = ROL64((a34^d4), 8); 1593 a40 = b0 ^((~b1)& b2 ); 1594 a01 = b1 ^((~b2)& b3 ); 1595 a12 = b2 ^((~b3)& b4 ); 1596 a23 = b3 ^((~b4)& b0 ); 1597 a34 = b4 ^((~b0)& b1 ); 1598 1599 b1 = ROL64((a10^d0), 36); 1600 b2 = ROL64((a21^d1), 10); 1601 b3 = ROL64((a32^d2), 15); 1602 b4 = ROL64((a43^d3), 56); 1603 b0 = ROL64((a04^d4), 27); 1604 a10 = b0 ^((~b1)& b2 ); 1605 a21 = b1 ^((~b2)& b3 ); 1606 a32 = b2 ^((~b3)& b4 ); 1607 a43 = b3 ^((~b4)& b0 ); 1608 a04 = b4 ^((~b0)& b1 ); 1609 1610 b3 = ROL64((a30^d0), 41); 1611 b4 = ROL64((a41^d1), 2); 1612 b0 = ROL64((a02^d2), 62); 1613 b1 = ROL64((a13^d3), 55); 1614 b2 = ROL64((a24^d4), 39); 1615 a30 = b0 ^((~b1)& b2 ); 1616 a41 = b1 ^((~b2)& b3 ); 1617 a02 = b2 ^((~b3)& b4 ); 1618 a13 = b3 ^((~b4)& b0 ); 1619 a24 = b4 ^((~b0)& b1 ); 1620 1621 c0 = a00^a20^a40^a10^a30; 1622 c1 = a11^a31^a01^a21^a41; 1623 c2 = a22^a42^a12^a32^a02; 1624 c3 = a33^a03^a23^a43^a13; 1625 c4 = a44^a14^a34^a04^a24; 1626 d0 = c4^ROL64(c1, 1); 1627 d1 = c0^ROL64(c2, 1); 1628 d2 = c1^ROL64(c3, 1); 1629 d3 = c2^ROL64(c4, 1); 1630 d4 = c3^ROL64(c0, 1); 1631 1632 b0 = (a00^d0); 1633 b1 = ROL64((a31^d1), 44); 1634 b2 = ROL64((a12^d2), 43); 1635 b3 = ROL64((a43^d3), 21); 1636 b4 = ROL64((a24^d4), 14); 1637 a00 = b0 ^((~b1)& b2 ); 1638 a00 ^= RC[i+1]; 1639 a31 = b1 ^((~b2)& b3 ); 1640 a12 = b2 ^((~b3)& b4 ); 1641 a43 = b3 ^((~b4)& b0 ); 1642 a24 = b4 ^((~b0)& b1 ); 1643 1644 b2 = ROL64((a40^d0), 3); 1645 b3 = ROL64((a21^d1), 45); 1646 b4 = ROL64((a02^d2), 61); 1647 b0 = ROL64((a33^d3), 28); 1648 b1 = ROL64((a14^d4), 20); 1649 a40 = b0 ^((~b1)& b2 ); 1650 a21 = b1 ^((~b2)& b3 ); 1651 a02 = b2 ^((~b3)& b4 ); 1652 a33 = b3 ^((~b4)& b0 ); 1653 a14 = b4 ^((~b0)& b1 ); 1654 1655 b4 = ROL64((a30^d0), 18); 1656 b0 = ROL64((a11^d1), 1); 1657 b1 = ROL64((a42^d2), 6); 1658 b2 = ROL64((a23^d3), 25); 1659 b3 = ROL64((a04^d4), 8); 1660 a30 = b0 ^((~b1)& b2 ); 1661 a11 = b1 ^((~b2)& b3 ); 1662 a42 = b2 ^((~b3)& b4 ); 1663 a23 = b3 ^((~b4)& b0 ); 1664 a04 = b4 ^((~b0)& b1 ); 1665 1666 b1 = ROL64((a20^d0), 36); 1667 b2 = ROL64((a01^d1), 10); 1668 b3 = ROL64((a32^d2), 15); 1669 b4 = ROL64((a13^d3), 56); 1670 b0 = ROL64((a44^d4), 27); 1671 a20 = b0 ^((~b1)& b2 ); 1672 a01 = b1 ^((~b2)& b3 ); 1673 a32 = b2 ^((~b3)& b4 ); 1674 a13 = b3 ^((~b4)& b0 ); 1675 a44 = b4 ^((~b0)& b1 ); 1676 1677 b3 = ROL64((a10^d0), 41); 1678 b4 = ROL64((a41^d1), 2); 1679 b0 = ROL64((a22^d2), 62); 1680 b1 = ROL64((a03^d3), 55); 1681 b2 = ROL64((a34^d4), 39); 1682 a10 = b0 ^((~b1)& b2 ); 1683 a41 = b1 ^((~b2)& b3 ); 1684 a22 = b2 ^((~b3)& b4 ); 1685 a03 = b3 ^((~b4)& b0 ); 1686 a34 = b4 ^((~b0)& b1 ); 1687 1688 c0 = a00^a40^a30^a20^a10; 1689 c1 = a31^a21^a11^a01^a41; 1690 c2 = a12^a02^a42^a32^a22; 1691 c3 = a43^a33^a23^a13^a03; 1692 c4 = a24^a14^a04^a44^a34; 1693 d0 = c4^ROL64(c1, 1); 1694 d1 = c0^ROL64(c2, 1); 1695 d2 = c1^ROL64(c3, 1); 1696 d3 = c2^ROL64(c4, 1); 1697 d4 = c3^ROL64(c0, 1); 1698 1699 b0 = (a00^d0); 1700 b1 = ROL64((a21^d1), 44); 1701 b2 = ROL64((a42^d2), 43); 1702 b3 = ROL64((a13^d3), 21); 1703 b4 = ROL64((a34^d4), 14); 1704 a00 = b0 ^((~b1)& b2 ); 1705 a00 ^= RC[i+2]; 1706 a21 = b1 ^((~b2)& b3 ); 1707 a42 = b2 ^((~b3)& b4 ); 1708 a13 = b3 ^((~b4)& b0 ); 1709 a34 = b4 ^((~b0)& b1 ); 1710 1711 b2 = ROL64((a30^d0), 3); 1712 b3 = ROL64((a01^d1), 45); 1713 b4 = ROL64((a22^d2), 61); 1714 b0 = ROL64((a43^d3), 28); 1715 b1 = ROL64((a14^d4), 20); 1716 a30 = b0 ^((~b1)& b2 ); 1717 a01 = b1 ^((~b2)& b3 ); 1718 a22 = b2 ^((~b3)& b4 ); 1719 a43 = b3 ^((~b4)& b0 ); 1720 a14 = b4 ^((~b0)& b1 ); 1721 1722 b4 = ROL64((a10^d0), 18); 1723 b0 = ROL64((a31^d1), 1); 1724 b1 = ROL64((a02^d2), 6); 1725 b2 = ROL64((a23^d3), 25); 1726 b3 = ROL64((a44^d4), 8); 1727 a10 = b0 ^((~b1)& b2 ); 1728 a31 = b1 ^((~b2)& b3 ); 1729 a02 = b2 ^((~b3)& b4 ); 1730 a23 = b3 ^((~b4)& b0 ); 1731 a44 = b4 ^((~b0)& b1 ); 1732 1733 b1 = ROL64((a40^d0), 36); 1734 b2 = ROL64((a11^d1), 10); 1735 b3 = ROL64((a32^d2), 15); 1736 b4 = ROL64((a03^d3), 56); 1737 b0 = ROL64((a24^d4), 27); 1738 a40 = b0 ^((~b1)& b2 ); 1739 a11 = b1 ^((~b2)& b3 ); 1740 a32 = b2 ^((~b3)& b4 ); 1741 a03 = b3 ^((~b4)& b0 ); 1742 a24 = b4 ^((~b0)& b1 ); 1743 1744 b3 = ROL64((a20^d0), 41); 1745 b4 = ROL64((a41^d1), 2); 1746 b0 = ROL64((a12^d2), 62); 1747 b1 = ROL64((a33^d3), 55); 1748 b2 = ROL64((a04^d4), 39); 1749 a20 = b0 ^((~b1)& b2 ); 1750 a41 = b1 ^((~b2)& b3 ); 1751 a12 = b2 ^((~b3)& b4 ); 1752 a33 = b3 ^((~b4)& b0 ); 1753 a04 = b4 ^((~b0)& b1 ); 1754 1755 c0 = a00^a30^a10^a40^a20; 1756 c1 = a21^a01^a31^a11^a41; 1757 c2 = a42^a22^a02^a32^a12; 1758 c3 = a13^a43^a23^a03^a33; 1759 c4 = a34^a14^a44^a24^a04; 1760 d0 = c4^ROL64(c1, 1); 1761 d1 = c0^ROL64(c2, 1); 1762 d2 = c1^ROL64(c3, 1); 1763 d3 = c2^ROL64(c4, 1); 1764 d4 = c3^ROL64(c0, 1); 1765 1766 b0 = (a00^d0); 1767 b1 = ROL64((a01^d1), 44); 1768 b2 = ROL64((a02^d2), 43); 1769 b3 = ROL64((a03^d3), 21); 1770 b4 = ROL64((a04^d4), 14); 1771 a00 = b0 ^((~b1)& b2 ); 1772 a00 ^= RC[i+3]; 1773 a01 = b1 ^((~b2)& b3 ); 1774 a02 = b2 ^((~b3)& b4 ); 1775 a03 = b3 ^((~b4)& b0 ); 1776 a04 = b4 ^((~b0)& b1 ); 1777 1778 b2 = ROL64((a10^d0), 3); 1779 b3 = ROL64((a11^d1), 45); 1780 b4 = ROL64((a12^d2), 61); 1781 b0 = ROL64((a13^d3), 28); 1782 b1 = ROL64((a14^d4), 20); 1783 a10 = b0 ^((~b1)& b2 ); 1784 a11 = b1 ^((~b2)& b3 ); 1785 a12 = b2 ^((~b3)& b4 ); 1786 a13 = b3 ^((~b4)& b0 ); 1787 a14 = b4 ^((~b0)& b1 ); 1788 1789 b4 = ROL64((a20^d0), 18); 1790 b0 = ROL64((a21^d1), 1); 1791 b1 = ROL64((a22^d2), 6); 1792 b2 = ROL64((a23^d3), 25); 1793 b3 = ROL64((a24^d4), 8); 1794 a20 = b0 ^((~b1)& b2 ); 1795 a21 = b1 ^((~b2)& b3 ); 1796 a22 = b2 ^((~b3)& b4 ); 1797 a23 = b3 ^((~b4)& b0 ); 1798 a24 = b4 ^((~b0)& b1 ); 1799 1800 b1 = ROL64((a30^d0), 36); 1801 b2 = ROL64((a31^d1), 10); 1802 b3 = ROL64((a32^d2), 15); 1803 b4 = ROL64((a33^d3), 56); 1804 b0 = ROL64((a34^d4), 27); 1805 a30 = b0 ^((~b1)& b2 ); 1806 a31 = b1 ^((~b2)& b3 ); 1807 a32 = b2 ^((~b3)& b4 ); 1808 a33 = b3 ^((~b4)& b0 ); 1809 a34 = b4 ^((~b0)& b1 ); 1810 1811 b3 = ROL64((a40^d0), 41); 1812 b4 = ROL64((a41^d1), 2); 1813 b0 = ROL64((a42^d2), 62); 1814 b1 = ROL64((a43^d3), 55); 1815 b2 = ROL64((a44^d4), 39); 1816 a40 = b0 ^((~b1)& b2 ); 1817 a41 = b1 ^((~b2)& b3 ); 1818 a42 = b2 ^((~b3)& b4 ); 1819 a43 = b3 ^((~b4)& b0 ); 1820 a44 = b4 ^((~b0)& b1 ); 1821 } 1822 } 1823 1824 /* 1825 ** Initialize a new hash. iSize determines the size of the hash 1826 ** in bits and should be one of 224, 256, 384, or 512. Or iSize 1827 ** can be zero to use the default hash size of 256 bits. 1828 */ 1829 static void SHA3Init(SHA3Context *p, int iSize){ 1830 memset(p, 0, sizeof(*p)); 1831 if( iSize>=128 && iSize<=512 ){ 1832 p->nRate = (1600 - ((iSize + 31)&~31)*2)/8; 1833 }else{ 1834 p->nRate = (1600 - 2*256)/8; 1835 } 1836 #if SHA3_BYTEORDER==1234 1837 /* Known to be little-endian at compile-time. No-op */ 1838 #elif SHA3_BYTEORDER==4321 1839 p->ixMask = 7; /* Big-endian */ 1840 #else 1841 { 1842 static unsigned int one = 1; 1843 if( 1==*(unsigned char*)&one ){ 1844 /* Little endian. No byte swapping. */ 1845 p->ixMask = 0; 1846 }else{ 1847 /* Big endian. Byte swap. */ 1848 p->ixMask = 7; 1849 } 1850 } 1851 #endif 1852 } 1853 1854 /* 1855 ** Make consecutive calls to the SHA3Update function to add new content 1856 ** to the hash 1857 */ 1858 static void SHA3Update( 1859 SHA3Context *p, 1860 const unsigned char *aData, 1861 unsigned int nData 1862 ){ 1863 unsigned int i = 0; 1864 #if SHA3_BYTEORDER==1234 1865 if( (p->nLoaded % 8)==0 && ((aData - (const unsigned char*)0)&7)==0 ){ 1866 for(; i+7<nData; i+=8){ 1867 p->u.s[p->nLoaded/8] ^= *(u64*)&aData[i]; 1868 p->nLoaded += 8; 1869 if( p->nLoaded>=p->nRate ){ 1870 KeccakF1600Step(p); 1871 p->nLoaded = 0; 1872 } 1873 } 1874 } 1875 #endif 1876 for(; i<nData; i++){ 1877 #if SHA3_BYTEORDER==1234 1878 p->u.x[p->nLoaded] ^= aData[i]; 1879 #elif SHA3_BYTEORDER==4321 1880 p->u.x[p->nLoaded^0x07] ^= aData[i]; 1881 #else 1882 p->u.x[p->nLoaded^p->ixMask] ^= aData[i]; 1883 #endif 1884 p->nLoaded++; 1885 if( p->nLoaded==p->nRate ){ 1886 KeccakF1600Step(p); 1887 p->nLoaded = 0; 1888 } 1889 } 1890 } 1891 1892 /* 1893 ** After all content has been added, invoke SHA3Final() to compute 1894 ** the final hash. The function returns a pointer to the binary 1895 ** hash value. 1896 */ 1897 static unsigned char *SHA3Final(SHA3Context *p){ 1898 unsigned int i; 1899 if( p->nLoaded==p->nRate-1 ){ 1900 const unsigned char c1 = 0x86; 1901 SHA3Update(p, &c1, 1); 1902 }else{ 1903 const unsigned char c2 = 0x06; 1904 const unsigned char c3 = 0x80; 1905 SHA3Update(p, &c2, 1); 1906 p->nLoaded = p->nRate - 1; 1907 SHA3Update(p, &c3, 1); 1908 } 1909 for(i=0; i<p->nRate; i++){ 1910 p->u.x[i+p->nRate] = p->u.x[i^p->ixMask]; 1911 } 1912 return &p->u.x[p->nRate]; 1913 } 1914 /* End of the hashing logic 1915 *****************************************************************************/ 1916 1917 /* 1918 ** Implementation of the sha3(X,SIZE) function. 1919 ** 1920 ** Return a BLOB which is the SIZE-bit SHA3 hash of X. The default 1921 ** size is 256. If X is a BLOB, it is hashed as is. 1922 ** For all other non-NULL types of input, X is converted into a UTF-8 string 1923 ** and the string is hashed without the trailing 0x00 terminator. The hash 1924 ** of a NULL value is NULL. 1925 */ 1926 static void sha3Func( 1927 sqlite3_context *context, 1928 int argc, 1929 sqlite3_value **argv 1930 ){ 1931 SHA3Context cx; 1932 int eType = sqlite3_value_type(argv[0]); 1933 int nByte = sqlite3_value_bytes(argv[0]); 1934 int iSize; 1935 if( argc==1 ){ 1936 iSize = 256; 1937 }else{ 1938 iSize = sqlite3_value_int(argv[1]); 1939 if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){ 1940 sqlite3_result_error(context, "SHA3 size should be one of: 224 256 " 1941 "384 512", -1); 1942 return; 1943 } 1944 } 1945 if( eType==SQLITE_NULL ) return; 1946 SHA3Init(&cx, iSize); 1947 if( eType==SQLITE_BLOB ){ 1948 SHA3Update(&cx, sqlite3_value_blob(argv[0]), nByte); 1949 }else{ 1950 SHA3Update(&cx, sqlite3_value_text(argv[0]), nByte); 1951 } 1952 sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT); 1953 } 1954 1955 /* Compute a string using sqlite3_vsnprintf() with a maximum length 1956 ** of 50 bytes and add it to the hash. 1957 */ 1958 static void hash_step_vformat( 1959 SHA3Context *p, /* Add content to this context */ 1960 const char *zFormat, 1961 ... 1962 ){ 1963 va_list ap; 1964 int n; 1965 char zBuf[50]; 1966 va_start(ap, zFormat); 1967 sqlite3_vsnprintf(sizeof(zBuf),zBuf,zFormat,ap); 1968 va_end(ap); 1969 n = (int)strlen(zBuf); 1970 SHA3Update(p, (unsigned char*)zBuf, n); 1971 } 1972 1973 /* 1974 ** Implementation of the sha3_query(SQL,SIZE) function. 1975 ** 1976 ** This function compiles and runs the SQL statement(s) given in the 1977 ** argument. The results are hashed using a SIZE-bit SHA3. The default 1978 ** size is 256. 1979 ** 1980 ** The format of the byte stream that is hashed is summarized as follows: 1981 ** 1982 ** S<n>:<sql> 1983 ** R 1984 ** N 1985 ** I<int> 1986 ** F<ieee-float> 1987 ** B<size>:<bytes> 1988 ** T<size>:<text> 1989 ** 1990 ** <sql> is the original SQL text for each statement run and <n> is 1991 ** the size of that text. The SQL text is UTF-8. A single R character 1992 ** occurs before the start of each row. N means a NULL value. 1993 ** I mean an 8-byte little-endian integer <int>. F is a floating point 1994 ** number with an 8-byte little-endian IEEE floating point value <ieee-float>. 1995 ** B means blobs of <size> bytes. T means text rendered as <size> 1996 ** bytes of UTF-8. The <n> and <size> values are expressed as an ASCII 1997 ** text integers. 1998 ** 1999 ** For each SQL statement in the X input, there is one S segment. Each 2000 ** S segment is followed by zero or more R segments, one for each row in the 2001 ** result set. After each R, there are one or more N, I, F, B, or T segments, 2002 ** one for each column in the result set. Segments are concatentated directly 2003 ** with no delimiters of any kind. 2004 */ 2005 static void sha3QueryFunc( 2006 sqlite3_context *context, 2007 int argc, 2008 sqlite3_value **argv 2009 ){ 2010 sqlite3 *db = sqlite3_context_db_handle(context); 2011 const char *zSql = (const char*)sqlite3_value_text(argv[0]); 2012 sqlite3_stmt *pStmt = 0; 2013 int nCol; /* Number of columns in the result set */ 2014 int i; /* Loop counter */ 2015 int rc; 2016 int n; 2017 const char *z; 2018 SHA3Context cx; 2019 int iSize; 2020 2021 if( argc==1 ){ 2022 iSize = 256; 2023 }else{ 2024 iSize = sqlite3_value_int(argv[1]); 2025 if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){ 2026 sqlite3_result_error(context, "SHA3 size should be one of: 224 256 " 2027 "384 512", -1); 2028 return; 2029 } 2030 } 2031 if( zSql==0 ) return; 2032 SHA3Init(&cx, iSize); 2033 while( zSql[0] ){ 2034 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zSql); 2035 if( rc ){ 2036 char *zMsg = sqlite3_mprintf("error SQL statement [%s]: %s", 2037 zSql, sqlite3_errmsg(db)); 2038 sqlite3_finalize(pStmt); 2039 sqlite3_result_error(context, zMsg, -1); 2040 sqlite3_free(zMsg); 2041 return; 2042 } 2043 if( !sqlite3_stmt_readonly(pStmt) ){ 2044 char *zMsg = sqlite3_mprintf("non-query: [%s]", sqlite3_sql(pStmt)); 2045 sqlite3_finalize(pStmt); 2046 sqlite3_result_error(context, zMsg, -1); 2047 sqlite3_free(zMsg); 2048 return; 2049 } 2050 nCol = sqlite3_column_count(pStmt); 2051 z = sqlite3_sql(pStmt); 2052 if( z ){ 2053 n = (int)strlen(z); 2054 hash_step_vformat(&cx,"S%d:",n); 2055 SHA3Update(&cx,(unsigned char*)z,n); 2056 } 2057 2058 /* Compute a hash over the result of the query */ 2059 while( SQLITE_ROW==sqlite3_step(pStmt) ){ 2060 SHA3Update(&cx,(const unsigned char*)"R",1); 2061 for(i=0; i<nCol; i++){ 2062 switch( sqlite3_column_type(pStmt,i) ){ 2063 case SQLITE_NULL: { 2064 SHA3Update(&cx, (const unsigned char*)"N",1); 2065 break; 2066 } 2067 case SQLITE_INTEGER: { 2068 sqlite3_uint64 u; 2069 int j; 2070 unsigned char x[9]; 2071 sqlite3_int64 v = sqlite3_column_int64(pStmt,i); 2072 memcpy(&u, &v, 8); 2073 for(j=8; j>=1; j--){ 2074 x[j] = u & 0xff; 2075 u >>= 8; 2076 } 2077 x[0] = 'I'; 2078 SHA3Update(&cx, x, 9); 2079 break; 2080 } 2081 case SQLITE_FLOAT: { 2082 sqlite3_uint64 u; 2083 int j; 2084 unsigned char x[9]; 2085 double r = sqlite3_column_double(pStmt,i); 2086 memcpy(&u, &r, 8); 2087 for(j=8; j>=1; j--){ 2088 x[j] = u & 0xff; 2089 u >>= 8; 2090 } 2091 x[0] = 'F'; 2092 SHA3Update(&cx,x,9); 2093 break; 2094 } 2095 case SQLITE_TEXT: { 2096 int n2 = sqlite3_column_bytes(pStmt, i); 2097 const unsigned char *z2 = sqlite3_column_text(pStmt, i); 2098 hash_step_vformat(&cx,"T%d:",n2); 2099 SHA3Update(&cx, z2, n2); 2100 break; 2101 } 2102 case SQLITE_BLOB: { 2103 int n2 = sqlite3_column_bytes(pStmt, i); 2104 const unsigned char *z2 = sqlite3_column_blob(pStmt, i); 2105 hash_step_vformat(&cx,"B%d:",n2); 2106 SHA3Update(&cx, z2, n2); 2107 break; 2108 } 2109 } 2110 } 2111 } 2112 sqlite3_finalize(pStmt); 2113 } 2114 sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT); 2115 } 2116 2117 2118 #ifdef _WIN32 2119 2120 #endif 2121 int sqlite3_shathree_init( 2122 sqlite3 *db, 2123 char **pzErrMsg, 2124 const sqlite3_api_routines *pApi 2125 ){ 2126 int rc = SQLITE_OK; 2127 SQLITE_EXTENSION_INIT2(pApi); 2128 (void)pzErrMsg; /* Unused parameter */ 2129 rc = sqlite3_create_function(db, "sha3", 1, 2130 SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC, 2131 0, sha3Func, 0, 0); 2132 if( rc==SQLITE_OK ){ 2133 rc = sqlite3_create_function(db, "sha3", 2, 2134 SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC, 2135 0, sha3Func, 0, 0); 2136 } 2137 if( rc==SQLITE_OK ){ 2138 rc = sqlite3_create_function(db, "sha3_query", 1, 2139 SQLITE_UTF8 | SQLITE_DIRECTONLY, 2140 0, sha3QueryFunc, 0, 0); 2141 } 2142 if( rc==SQLITE_OK ){ 2143 rc = sqlite3_create_function(db, "sha3_query", 2, 2144 SQLITE_UTF8 | SQLITE_DIRECTONLY, 2145 0, sha3QueryFunc, 0, 0); 2146 } 2147 return rc; 2148 } 2149 2150 /************************* End ../ext/misc/shathree.c ********************/ 2151 /************************* Begin ../ext/misc/fileio.c ******************/ 2152 /* 2153 ** 2014-06-13 2154 ** 2155 ** The author disclaims copyright to this source code. In place of 2156 ** a legal notice, here is a blessing: 2157 ** 2158 ** May you do good and not evil. 2159 ** May you find forgiveness for yourself and forgive others. 2160 ** May you share freely, never taking more than you give. 2161 ** 2162 ****************************************************************************** 2163 ** 2164 ** This SQLite extension implements SQL functions readfile() and 2165 ** writefile(), and eponymous virtual type "fsdir". 2166 ** 2167 ** WRITEFILE(FILE, DATA [, MODE [, MTIME]]): 2168 ** 2169 ** If neither of the optional arguments is present, then this UDF 2170 ** function writes blob DATA to file FILE. If successful, the number 2171 ** of bytes written is returned. If an error occurs, NULL is returned. 2172 ** 2173 ** If the first option argument - MODE - is present, then it must 2174 ** be passed an integer value that corresponds to a POSIX mode 2175 ** value (file type + permissions, as returned in the stat.st_mode 2176 ** field by the stat() system call). Three types of files may 2177 ** be written/created: 2178 ** 2179 ** regular files: (mode & 0170000)==0100000 2180 ** symbolic links: (mode & 0170000)==0120000 2181 ** directories: (mode & 0170000)==0040000 2182 ** 2183 ** For a directory, the DATA is ignored. For a symbolic link, it is 2184 ** interpreted as text and used as the target of the link. For a 2185 ** regular file, it is interpreted as a blob and written into the 2186 ** named file. Regardless of the type of file, its permissions are 2187 ** set to (mode & 0777) before returning. 2188 ** 2189 ** If the optional MTIME argument is present, then it is interpreted 2190 ** as an integer - the number of seconds since the unix epoch. The 2191 ** modification-time of the target file is set to this value before 2192 ** returning. 2193 ** 2194 ** If three or more arguments are passed to this function and an 2195 ** error is encountered, an exception is raised. 2196 ** 2197 ** READFILE(FILE): 2198 ** 2199 ** Read and return the contents of file FILE (type blob) from disk. 2200 ** 2201 ** FSDIR: 2202 ** 2203 ** Used as follows: 2204 ** 2205 ** SELECT * FROM fsdir($path [, $dir]); 2206 ** 2207 ** Parameter $path is an absolute or relative pathname. If the file that it 2208 ** refers to does not exist, it is an error. If the path refers to a regular 2209 ** file or symbolic link, it returns a single row. Or, if the path refers 2210 ** to a directory, it returns one row for the directory, and one row for each 2211 ** file within the hierarchy rooted at $path. 2212 ** 2213 ** Each row has the following columns: 2214 ** 2215 ** name: Path to file or directory (text value). 2216 ** mode: Value of stat.st_mode for directory entry (an integer). 2217 ** mtime: Value of stat.st_mtime for directory entry (an integer). 2218 ** data: For a regular file, a blob containing the file data. For a 2219 ** symlink, a text value containing the text of the link. For a 2220 ** directory, NULL. 2221 ** 2222 ** If a non-NULL value is specified for the optional $dir parameter and 2223 ** $path is a relative path, then $path is interpreted relative to $dir. 2224 ** And the paths returned in the "name" column of the table are also 2225 ** relative to directory $dir. 2226 ** 2227 ** Notes on building this extension for Windows: 2228 ** Unless linked statically with the SQLite library, a preprocessor 2229 ** symbol, FILEIO_WIN32_DLL, must be #define'd to create a stand-alone 2230 ** DLL form of this extension for WIN32. See its use below for details. 2231 */ 2232 /* #include "sqlite3ext.h" */ 2233 SQLITE_EXTENSION_INIT1 2234 #include <stdio.h> 2235 #include <string.h> 2236 #include <assert.h> 2237 2238 #include <sys/types.h> 2239 #include <sys/stat.h> 2240 #include <fcntl.h> 2241 #if !defined(_WIN32) && !defined(WIN32) 2242 # include <unistd.h> 2243 # include <dirent.h> 2244 # include <utime.h> 2245 # include <sys/time.h> 2246 #else 2247 # include "windows.h" 2248 # include <io.h> 2249 # include <direct.h> 2250 /* # include "test_windirent.h" */ 2251 # define dirent DIRENT 2252 # ifndef chmod 2253 # define chmod _chmod 2254 # endif 2255 # ifndef stat 2256 # define stat _stat 2257 # endif 2258 # define mkdir(path,mode) _mkdir(path) 2259 # define lstat(path,buf) stat(path,buf) 2260 #endif 2261 #include <time.h> 2262 #include <errno.h> 2263 2264 2265 /* 2266 ** Structure of the fsdir() table-valued function 2267 */ 2268 /* 0 1 2 3 4 5 */ 2269 #define FSDIR_SCHEMA "(name,mode,mtime,data,path HIDDEN,dir HIDDEN)" 2270 #define FSDIR_COLUMN_NAME 0 /* Name of the file */ 2271 #define FSDIR_COLUMN_MODE 1 /* Access mode */ 2272 #define FSDIR_COLUMN_MTIME 2 /* Last modification time */ 2273 #define FSDIR_COLUMN_DATA 3 /* File content */ 2274 #define FSDIR_COLUMN_PATH 4 /* Path to top of search */ 2275 #define FSDIR_COLUMN_DIR 5 /* Path is relative to this directory */ 2276 2277 2278 /* 2279 ** Set the result stored by context ctx to a blob containing the 2280 ** contents of file zName. Or, leave the result unchanged (NULL) 2281 ** if the file does not exist or is unreadable. 2282 ** 2283 ** If the file exceeds the SQLite blob size limit, through an 2284 ** SQLITE_TOOBIG error. 2285 ** 2286 ** Throw an SQLITE_IOERR if there are difficulties pulling the file 2287 ** off of disk. 2288 */ 2289 static void readFileContents(sqlite3_context *ctx, const char *zName){ 2290 FILE *in; 2291 sqlite3_int64 nIn; 2292 void *pBuf; 2293 sqlite3 *db; 2294 int mxBlob; 2295 2296 in = fopen(zName, "rb"); 2297 if( in==0 ){ 2298 /* File does not exist or is unreadable. Leave the result set to NULL. */ 2299 return; 2300 } 2301 fseek(in, 0, SEEK_END); 2302 nIn = ftell(in); 2303 rewind(in); 2304 db = sqlite3_context_db_handle(ctx); 2305 mxBlob = sqlite3_limit(db, SQLITE_LIMIT_LENGTH, -1); 2306 if( nIn>mxBlob ){ 2307 sqlite3_result_error_code(ctx, SQLITE_TOOBIG); 2308 fclose(in); 2309 return; 2310 } 2311 pBuf = sqlite3_malloc64( nIn ? nIn : 1 ); 2312 if( pBuf==0 ){ 2313 sqlite3_result_error_nomem(ctx); 2314 fclose(in); 2315 return; 2316 } 2317 if( nIn==(sqlite3_int64)fread(pBuf, 1, (size_t)nIn, in) ){ 2318 sqlite3_result_blob64(ctx, pBuf, nIn, sqlite3_free); 2319 }else{ 2320 sqlite3_result_error_code(ctx, SQLITE_IOERR); 2321 sqlite3_free(pBuf); 2322 } 2323 fclose(in); 2324 } 2325 2326 /* 2327 ** Implementation of the "readfile(X)" SQL function. The entire content 2328 ** of the file named X is read and returned as a BLOB. NULL is returned 2329 ** if the file does not exist or is unreadable. 2330 */ 2331 static void readfileFunc( 2332 sqlite3_context *context, 2333 int argc, 2334 sqlite3_value **argv 2335 ){ 2336 const char *zName; 2337 (void)(argc); /* Unused parameter */ 2338 zName = (const char*)sqlite3_value_text(argv[0]); 2339 if( zName==0 ) return; 2340 readFileContents(context, zName); 2341 } 2342 2343 /* 2344 ** Set the error message contained in context ctx to the results of 2345 ** vprintf(zFmt, ...). 2346 */ 2347 static void ctxErrorMsg(sqlite3_context *ctx, const char *zFmt, ...){ 2348 char *zMsg = 0; 2349 va_list ap; 2350 va_start(ap, zFmt); 2351 zMsg = sqlite3_vmprintf(zFmt, ap); 2352 sqlite3_result_error(ctx, zMsg, -1); 2353 sqlite3_free(zMsg); 2354 va_end(ap); 2355 } 2356 2357 #if defined(_WIN32) 2358 /* 2359 ** This function is designed to convert a Win32 FILETIME structure into the 2360 ** number of seconds since the Unix Epoch (1970-01-01 00:00:00 UTC). 2361 */ 2362 static sqlite3_uint64 fileTimeToUnixTime( 2363 LPFILETIME pFileTime 2364 ){ 2365 SYSTEMTIME epochSystemTime; 2366 ULARGE_INTEGER epochIntervals; 2367 FILETIME epochFileTime; 2368 ULARGE_INTEGER fileIntervals; 2369 2370 memset(&epochSystemTime, 0, sizeof(SYSTEMTIME)); 2371 epochSystemTime.wYear = 1970; 2372 epochSystemTime.wMonth = 1; 2373 epochSystemTime.wDay = 1; 2374 SystemTimeToFileTime(&epochSystemTime, &epochFileTime); 2375 epochIntervals.LowPart = epochFileTime.dwLowDateTime; 2376 epochIntervals.HighPart = epochFileTime.dwHighDateTime; 2377 2378 fileIntervals.LowPart = pFileTime->dwLowDateTime; 2379 fileIntervals.HighPart = pFileTime->dwHighDateTime; 2380 2381 return (fileIntervals.QuadPart - epochIntervals.QuadPart) / 10000000; 2382 } 2383 2384 2385 #if defined(FILEIO_WIN32_DLL) && (defined(_WIN32) || defined(WIN32)) 2386 # /* To allow a standalone DLL, use this next replacement function: */ 2387 # undef sqlite3_win32_utf8_to_unicode 2388 # define sqlite3_win32_utf8_to_unicode utf8_to_utf16 2389 # 2390 LPWSTR utf8_to_utf16(const char *z){ 2391 int nAllot = MultiByteToWideChar(CP_UTF8, 0, z, -1, NULL, 0); 2392 LPWSTR rv = sqlite3_malloc(nAllot * sizeof(WCHAR)); 2393 if( rv!=0 && 0 < MultiByteToWideChar(CP_UTF8, 0, z, -1, rv, nAllot) ) 2394 return rv; 2395 sqlite3_free(rv); 2396 return 0; 2397 } 2398 #endif 2399 2400 /* 2401 ** This function attempts to normalize the time values found in the stat() 2402 ** buffer to UTC. This is necessary on Win32, where the runtime library 2403 ** appears to return these values as local times. 2404 */ 2405 static void statTimesToUtc( 2406 const char *zPath, 2407 struct stat *pStatBuf 2408 ){ 2409 HANDLE hFindFile; 2410 WIN32_FIND_DATAW fd; 2411 LPWSTR zUnicodeName; 2412 extern LPWSTR sqlite3_win32_utf8_to_unicode(const char*); 2413 zUnicodeName = sqlite3_win32_utf8_to_unicode(zPath); 2414 if( zUnicodeName ){ 2415 memset(&fd, 0, sizeof(WIN32_FIND_DATAW)); 2416 hFindFile = FindFirstFileW(zUnicodeName, &fd); 2417 if( hFindFile!=NULL ){ 2418 pStatBuf->st_ctime = (time_t)fileTimeToUnixTime(&fd.ftCreationTime); 2419 pStatBuf->st_atime = (time_t)fileTimeToUnixTime(&fd.ftLastAccessTime); 2420 pStatBuf->st_mtime = (time_t)fileTimeToUnixTime(&fd.ftLastWriteTime); 2421 FindClose(hFindFile); 2422 } 2423 sqlite3_free(zUnicodeName); 2424 } 2425 } 2426 #endif 2427 2428 /* 2429 ** This function is used in place of stat(). On Windows, special handling 2430 ** is required in order for the included time to be returned as UTC. On all 2431 ** other systems, this function simply calls stat(). 2432 */ 2433 static int fileStat( 2434 const char *zPath, 2435 struct stat *pStatBuf 2436 ){ 2437 #if defined(_WIN32) 2438 int rc = stat(zPath, pStatBuf); 2439 if( rc==0 ) statTimesToUtc(zPath, pStatBuf); 2440 return rc; 2441 #else 2442 return stat(zPath, pStatBuf); 2443 #endif 2444 } 2445 2446 /* 2447 ** This function is used in place of lstat(). On Windows, special handling 2448 ** is required in order for the included time to be returned as UTC. On all 2449 ** other systems, this function simply calls lstat(). 2450 */ 2451 static int fileLinkStat( 2452 const char *zPath, 2453 struct stat *pStatBuf 2454 ){ 2455 #if defined(_WIN32) 2456 int rc = lstat(zPath, pStatBuf); 2457 if( rc==0 ) statTimesToUtc(zPath, pStatBuf); 2458 return rc; 2459 #else 2460 return lstat(zPath, pStatBuf); 2461 #endif 2462 } 2463 2464 /* 2465 ** Argument zFile is the name of a file that will be created and/or written 2466 ** by SQL function writefile(). This function ensures that the directory 2467 ** zFile will be written to exists, creating it if required. The permissions 2468 ** for any path components created by this function are set in accordance 2469 ** with the current umask. 2470 ** 2471 ** If an OOM condition is encountered, SQLITE_NOMEM is returned. Otherwise, 2472 ** SQLITE_OK is returned if the directory is successfully created, or 2473 ** SQLITE_ERROR otherwise. 2474 */ 2475 static int makeDirectory( 2476 const char *zFile 2477 ){ 2478 char *zCopy = sqlite3_mprintf("%s", zFile); 2479 int rc = SQLITE_OK; 2480 2481 if( zCopy==0 ){ 2482 rc = SQLITE_NOMEM; 2483 }else{ 2484 int nCopy = (int)strlen(zCopy); 2485 int i = 1; 2486 2487 while( rc==SQLITE_OK ){ 2488 struct stat sStat; 2489 int rc2; 2490 2491 for(; zCopy[i]!='/' && i<nCopy; i++); 2492 if( i==nCopy ) break; 2493 zCopy[i] = '\0'; 2494 2495 rc2 = fileStat(zCopy, &sStat); 2496 if( rc2!=0 ){ 2497 if( mkdir(zCopy, 0777) ) rc = SQLITE_ERROR; 2498 }else{ 2499 if( !S_ISDIR(sStat.st_mode) ) rc = SQLITE_ERROR; 2500 } 2501 zCopy[i] = '/'; 2502 i++; 2503 } 2504 2505 sqlite3_free(zCopy); 2506 } 2507 2508 return rc; 2509 } 2510 2511 /* 2512 ** This function does the work for the writefile() UDF. Refer to 2513 ** header comments at the top of this file for details. 2514 */ 2515 static int writeFile( 2516 sqlite3_context *pCtx, /* Context to return bytes written in */ 2517 const char *zFile, /* File to write */ 2518 sqlite3_value *pData, /* Data to write */ 2519 mode_t mode, /* MODE parameter passed to writefile() */ 2520 sqlite3_int64 mtime /* MTIME parameter (or -1 to not set time) */ 2521 ){ 2522 #if !defined(_WIN32) && !defined(WIN32) 2523 if( S_ISLNK(mode) ){ 2524 const char *zTo = (const char*)sqlite3_value_text(pData); 2525 if( symlink(zTo, zFile)<0 ) return 1; 2526 }else 2527 #endif 2528 { 2529 if( S_ISDIR(mode) ){ 2530 if( mkdir(zFile, mode) ){ 2531 /* The mkdir() call to create the directory failed. This might not 2532 ** be an error though - if there is already a directory at the same 2533 ** path and either the permissions already match or can be changed 2534 ** to do so using chmod(), it is not an error. */ 2535 struct stat sStat; 2536 if( errno!=EEXIST 2537 || 0!=fileStat(zFile, &sStat) 2538 || !S_ISDIR(sStat.st_mode) 2539 || ((sStat.st_mode&0777)!=(mode&0777) && 0!=chmod(zFile, mode&0777)) 2540 ){ 2541 return 1; 2542 } 2543 } 2544 }else{ 2545 sqlite3_int64 nWrite = 0; 2546 const char *z; 2547 int rc = 0; 2548 FILE *out = fopen(zFile, "wb"); 2549 if( out==0 ) return 1; 2550 z = (const char*)sqlite3_value_blob(pData); 2551 if( z ){ 2552 sqlite3_int64 n = fwrite(z, 1, sqlite3_value_bytes(pData), out); 2553 nWrite = sqlite3_value_bytes(pData); 2554 if( nWrite!=n ){ 2555 rc = 1; 2556 } 2557 } 2558 fclose(out); 2559 if( rc==0 && mode && chmod(zFile, mode & 0777) ){ 2560 rc = 1; 2561 } 2562 if( rc ) return 2; 2563 sqlite3_result_int64(pCtx, nWrite); 2564 } 2565 } 2566 2567 if( mtime>=0 ){ 2568 #if defined(_WIN32) 2569 #if !SQLITE_OS_WINRT 2570 /* Windows */ 2571 FILETIME lastAccess; 2572 FILETIME lastWrite; 2573 SYSTEMTIME currentTime; 2574 LONGLONG intervals; 2575 HANDLE hFile; 2576 LPWSTR zUnicodeName; 2577 extern LPWSTR sqlite3_win32_utf8_to_unicode(const char*); 2578 2579 GetSystemTime(¤tTime); 2580 SystemTimeToFileTime(¤tTime, &lastAccess); 2581 intervals = Int32x32To64(mtime, 10000000) + 116444736000000000; 2582 lastWrite.dwLowDateTime = (DWORD)intervals; 2583 lastWrite.dwHighDateTime = intervals >> 32; 2584 zUnicodeName = sqlite3_win32_utf8_to_unicode(zFile); 2585 if( zUnicodeName==0 ){ 2586 return 1; 2587 } 2588 hFile = CreateFileW( 2589 zUnicodeName, FILE_WRITE_ATTRIBUTES, 0, NULL, OPEN_EXISTING, 2590 FILE_FLAG_BACKUP_SEMANTICS, NULL 2591 ); 2592 sqlite3_free(zUnicodeName); 2593 if( hFile!=INVALID_HANDLE_VALUE ){ 2594 BOOL bResult = SetFileTime(hFile, NULL, &lastAccess, &lastWrite); 2595 CloseHandle(hFile); 2596 return !bResult; 2597 }else{ 2598 return 1; 2599 } 2600 #endif 2601 #elif defined(AT_FDCWD) && 0 /* utimensat() is not universally available */ 2602 /* Recent unix */ 2603 struct timespec times[2]; 2604 times[0].tv_nsec = times[1].tv_nsec = 0; 2605 times[0].tv_sec = time(0); 2606 times[1].tv_sec = mtime; 2607 if( utimensat(AT_FDCWD, zFile, times, AT_SYMLINK_NOFOLLOW) ){ 2608 return 1; 2609 } 2610 #else 2611 /* Legacy unix */ 2612 struct timeval times[2]; 2613 times[0].tv_usec = times[1].tv_usec = 0; 2614 times[0].tv_sec = time(0); 2615 times[1].tv_sec = mtime; 2616 if( utimes(zFile, times) ){ 2617 return 1; 2618 } 2619 #endif 2620 } 2621 2622 return 0; 2623 } 2624 2625 /* 2626 ** Implementation of the "writefile(W,X[,Y[,Z]]])" SQL function. 2627 ** Refer to header comments at the top of this file for details. 2628 */ 2629 static void writefileFunc( 2630 sqlite3_context *context, 2631 int argc, 2632 sqlite3_value **argv 2633 ){ 2634 const char *zFile; 2635 mode_t mode = 0; 2636 int res; 2637 sqlite3_int64 mtime = -1; 2638 2639 if( argc<2 || argc>4 ){ 2640 sqlite3_result_error(context, 2641 "wrong number of arguments to function writefile()", -1 2642 ); 2643 return; 2644 } 2645 2646 zFile = (const char*)sqlite3_value_text(argv[0]); 2647 if( zFile==0 ) return; 2648 if( argc>=3 ){ 2649 mode = (mode_t)sqlite3_value_int(argv[2]); 2650 } 2651 if( argc==4 ){ 2652 mtime = sqlite3_value_int64(argv[3]); 2653 } 2654 2655 res = writeFile(context, zFile, argv[1], mode, mtime); 2656 if( res==1 && errno==ENOENT ){ 2657 if( makeDirectory(zFile)==SQLITE_OK ){ 2658 res = writeFile(context, zFile, argv[1], mode, mtime); 2659 } 2660 } 2661 2662 if( argc>2 && res!=0 ){ 2663 if( S_ISLNK(mode) ){ 2664 ctxErrorMsg(context, "failed to create symlink: %s", zFile); 2665 }else if( S_ISDIR(mode) ){ 2666 ctxErrorMsg(context, "failed to create directory: %s", zFile); 2667 }else{ 2668 ctxErrorMsg(context, "failed to write file: %s", zFile); 2669 } 2670 } 2671 } 2672 2673 /* 2674 ** SQL function: lsmode(MODE) 2675 ** 2676 ** Given a numberic st_mode from stat(), convert it into a human-readable 2677 ** text string in the style of "ls -l". 2678 */ 2679 static void lsModeFunc( 2680 sqlite3_context *context, 2681 int argc, 2682 sqlite3_value **argv 2683 ){ 2684 int i; 2685 int iMode = sqlite3_value_int(argv[0]); 2686 char z[16]; 2687 (void)argc; 2688 if( S_ISLNK(iMode) ){ 2689 z[0] = 'l'; 2690 }else if( S_ISREG(iMode) ){ 2691 z[0] = '-'; 2692 }else if( S_ISDIR(iMode) ){ 2693 z[0] = 'd'; 2694 }else{ 2695 z[0] = '?'; 2696 } 2697 for(i=0; i<3; i++){ 2698 int m = (iMode >> ((2-i)*3)); 2699 char *a = &z[1 + i*3]; 2700 a[0] = (m & 0x4) ? 'r' : '-'; 2701 a[1] = (m & 0x2) ? 'w' : '-'; 2702 a[2] = (m & 0x1) ? 'x' : '-'; 2703 } 2704 z[10] = '\0'; 2705 sqlite3_result_text(context, z, -1, SQLITE_TRANSIENT); 2706 } 2707 2708 #ifndef SQLITE_OMIT_VIRTUALTABLE 2709 2710 /* 2711 ** Cursor type for recursively iterating through a directory structure. 2712 */ 2713 typedef struct fsdir_cursor fsdir_cursor; 2714 typedef struct FsdirLevel FsdirLevel; 2715 2716 struct FsdirLevel { 2717 DIR *pDir; /* From opendir() */ 2718 char *zDir; /* Name of directory (nul-terminated) */ 2719 }; 2720 2721 struct fsdir_cursor { 2722 sqlite3_vtab_cursor base; /* Base class - must be first */ 2723 2724 int nLvl; /* Number of entries in aLvl[] array */ 2725 int iLvl; /* Index of current entry */ 2726 FsdirLevel *aLvl; /* Hierarchy of directories being traversed */ 2727 2728 const char *zBase; 2729 int nBase; 2730 2731 struct stat sStat; /* Current lstat() results */ 2732 char *zPath; /* Path to current entry */ 2733 sqlite3_int64 iRowid; /* Current rowid */ 2734 }; 2735 2736 typedef struct fsdir_tab fsdir_tab; 2737 struct fsdir_tab { 2738 sqlite3_vtab base; /* Base class - must be first */ 2739 }; 2740 2741 /* 2742 ** Construct a new fsdir virtual table object. 2743 */ 2744 static int fsdirConnect( 2745 sqlite3 *db, 2746 void *pAux, 2747 int argc, const char *const*argv, 2748 sqlite3_vtab **ppVtab, 2749 char **pzErr 2750 ){ 2751 fsdir_tab *pNew = 0; 2752 int rc; 2753 (void)pAux; 2754 (void)argc; 2755 (void)argv; 2756 (void)pzErr; 2757 rc = sqlite3_declare_vtab(db, "CREATE TABLE x" FSDIR_SCHEMA); 2758 if( rc==SQLITE_OK ){ 2759 pNew = (fsdir_tab*)sqlite3_malloc( sizeof(*pNew) ); 2760 if( pNew==0 ) return SQLITE_NOMEM; 2761 memset(pNew, 0, sizeof(*pNew)); 2762 sqlite3_vtab_config(db, SQLITE_VTAB_DIRECTONLY); 2763 } 2764 *ppVtab = (sqlite3_vtab*)pNew; 2765 return rc; 2766 } 2767 2768 /* 2769 ** This method is the destructor for fsdir vtab objects. 2770 */ 2771 static int fsdirDisconnect(sqlite3_vtab *pVtab){ 2772 sqlite3_free(pVtab); 2773 return SQLITE_OK; 2774 } 2775 2776 /* 2777 ** Constructor for a new fsdir_cursor object. 2778 */ 2779 static int fsdirOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ 2780 fsdir_cursor *pCur; 2781 (void)p; 2782 pCur = sqlite3_malloc( sizeof(*pCur) ); 2783 if( pCur==0 ) return SQLITE_NOMEM; 2784 memset(pCur, 0, sizeof(*pCur)); 2785 pCur->iLvl = -1; 2786 *ppCursor = &pCur->base; 2787 return SQLITE_OK; 2788 } 2789 2790 /* 2791 ** Reset a cursor back to the state it was in when first returned 2792 ** by fsdirOpen(). 2793 */ 2794 static void fsdirResetCursor(fsdir_cursor *pCur){ 2795 int i; 2796 for(i=0; i<=pCur->iLvl; i++){ 2797 FsdirLevel *pLvl = &pCur->aLvl[i]; 2798 if( pLvl->pDir ) closedir(pLvl->pDir); 2799 sqlite3_free(pLvl->zDir); 2800 } 2801 sqlite3_free(pCur->zPath); 2802 sqlite3_free(pCur->aLvl); 2803 pCur->aLvl = 0; 2804 pCur->zPath = 0; 2805 pCur->zBase = 0; 2806 pCur->nBase = 0; 2807 pCur->nLvl = 0; 2808 pCur->iLvl = -1; 2809 pCur->iRowid = 1; 2810 } 2811 2812 /* 2813 ** Destructor for an fsdir_cursor. 2814 */ 2815 static int fsdirClose(sqlite3_vtab_cursor *cur){ 2816 fsdir_cursor *pCur = (fsdir_cursor*)cur; 2817 2818 fsdirResetCursor(pCur); 2819 sqlite3_free(pCur); 2820 return SQLITE_OK; 2821 } 2822 2823 /* 2824 ** Set the error message for the virtual table associated with cursor 2825 ** pCur to the results of vprintf(zFmt, ...). 2826 */ 2827 static void fsdirSetErrmsg(fsdir_cursor *pCur, const char *zFmt, ...){ 2828 va_list ap; 2829 va_start(ap, zFmt); 2830 pCur->base.pVtab->zErrMsg = sqlite3_vmprintf(zFmt, ap); 2831 va_end(ap); 2832 } 2833 2834 2835 /* 2836 ** Advance an fsdir_cursor to its next row of output. 2837 */ 2838 static int fsdirNext(sqlite3_vtab_cursor *cur){ 2839 fsdir_cursor *pCur = (fsdir_cursor*)cur; 2840 mode_t m = pCur->sStat.st_mode; 2841 2842 pCur->iRowid++; 2843 if( S_ISDIR(m) ){ 2844 /* Descend into this directory */ 2845 int iNew = pCur->iLvl + 1; 2846 FsdirLevel *pLvl; 2847 if( iNew>=pCur->nLvl ){ 2848 int nNew = iNew+1; 2849 sqlite3_int64 nByte = nNew*sizeof(FsdirLevel); 2850 FsdirLevel *aNew = (FsdirLevel*)sqlite3_realloc64(pCur->aLvl, nByte); 2851 if( aNew==0 ) return SQLITE_NOMEM; 2852 memset(&aNew[pCur->nLvl], 0, sizeof(FsdirLevel)*(nNew-pCur->nLvl)); 2853 pCur->aLvl = aNew; 2854 pCur->nLvl = nNew; 2855 } 2856 pCur->iLvl = iNew; 2857 pLvl = &pCur->aLvl[iNew]; 2858 2859 pLvl->zDir = pCur->zPath; 2860 pCur->zPath = 0; 2861 pLvl->pDir = opendir(pLvl->zDir); 2862 if( pLvl->pDir==0 ){ 2863 fsdirSetErrmsg(pCur, "cannot read directory: %s", pCur->zPath); 2864 return SQLITE_ERROR; 2865 } 2866 } 2867 2868 while( pCur->iLvl>=0 ){ 2869 FsdirLevel *pLvl = &pCur->aLvl[pCur->iLvl]; 2870 struct dirent *pEntry = readdir(pLvl->pDir); 2871 if( pEntry ){ 2872 if( pEntry->d_name[0]=='.' ){ 2873 if( pEntry->d_name[1]=='.' && pEntry->d_name[2]=='\0' ) continue; 2874 if( pEntry->d_name[1]=='\0' ) continue; 2875 } 2876 sqlite3_free(pCur->zPath); 2877 pCur->zPath = sqlite3_mprintf("%s/%s", pLvl->zDir, pEntry->d_name); 2878 if( pCur->zPath==0 ) return SQLITE_NOMEM; 2879 if( fileLinkStat(pCur->zPath, &pCur->sStat) ){ 2880 fsdirSetErrmsg(pCur, "cannot stat file: %s", pCur->zPath); 2881 return SQLITE_ERROR; 2882 } 2883 return SQLITE_OK; 2884 } 2885 closedir(pLvl->pDir); 2886 sqlite3_free(pLvl->zDir); 2887 pLvl->pDir = 0; 2888 pLvl->zDir = 0; 2889 pCur->iLvl--; 2890 } 2891 2892 /* EOF */ 2893 sqlite3_free(pCur->zPath); 2894 pCur->zPath = 0; 2895 return SQLITE_OK; 2896 } 2897 2898 /* 2899 ** Return values of columns for the row at which the series_cursor 2900 ** is currently pointing. 2901 */ 2902 static int fsdirColumn( 2903 sqlite3_vtab_cursor *cur, /* The cursor */ 2904 sqlite3_context *ctx, /* First argument to sqlite3_result_...() */ 2905 int i /* Which column to return */ 2906 ){ 2907 fsdir_cursor *pCur = (fsdir_cursor*)cur; 2908 switch( i ){ 2909 case FSDIR_COLUMN_NAME: { 2910 sqlite3_result_text(ctx, &pCur->zPath[pCur->nBase], -1, SQLITE_TRANSIENT); 2911 break; 2912 } 2913 2914 case FSDIR_COLUMN_MODE: 2915 sqlite3_result_int64(ctx, pCur->sStat.st_mode); 2916 break; 2917 2918 case FSDIR_COLUMN_MTIME: 2919 sqlite3_result_int64(ctx, pCur->sStat.st_mtime); 2920 break; 2921 2922 case FSDIR_COLUMN_DATA: { 2923 mode_t m = pCur->sStat.st_mode; 2924 if( S_ISDIR(m) ){ 2925 sqlite3_result_null(ctx); 2926 #if !defined(_WIN32) && !defined(WIN32) 2927 }else if( S_ISLNK(m) ){ 2928 char aStatic[64]; 2929 char *aBuf = aStatic; 2930 sqlite3_int64 nBuf = 64; 2931 int n; 2932 2933 while( 1 ){ 2934 n = readlink(pCur->zPath, aBuf, nBuf); 2935 if( n<nBuf ) break; 2936 if( aBuf!=aStatic ) sqlite3_free(aBuf); 2937 nBuf = nBuf*2; 2938 aBuf = sqlite3_malloc64(nBuf); 2939 if( aBuf==0 ){ 2940 sqlite3_result_error_nomem(ctx); 2941 return SQLITE_NOMEM; 2942 } 2943 } 2944 2945 sqlite3_result_text(ctx, aBuf, n, SQLITE_TRANSIENT); 2946 if( aBuf!=aStatic ) sqlite3_free(aBuf); 2947 #endif 2948 }else{ 2949 readFileContents(ctx, pCur->zPath); 2950 } 2951 } 2952 case FSDIR_COLUMN_PATH: 2953 default: { 2954 /* The FSDIR_COLUMN_PATH and FSDIR_COLUMN_DIR are input parameters. 2955 ** always return their values as NULL */ 2956 break; 2957 } 2958 } 2959 return SQLITE_OK; 2960 } 2961 2962 /* 2963 ** Return the rowid for the current row. In this implementation, the 2964 ** first row returned is assigned rowid value 1, and each subsequent 2965 ** row a value 1 more than that of the previous. 2966 */ 2967 static int fsdirRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ 2968 fsdir_cursor *pCur = (fsdir_cursor*)cur; 2969 *pRowid = pCur->iRowid; 2970 return SQLITE_OK; 2971 } 2972 2973 /* 2974 ** Return TRUE if the cursor has been moved off of the last 2975 ** row of output. 2976 */ 2977 static int fsdirEof(sqlite3_vtab_cursor *cur){ 2978 fsdir_cursor *pCur = (fsdir_cursor*)cur; 2979 return (pCur->zPath==0); 2980 } 2981 2982 /* 2983 ** xFilter callback. 2984 ** 2985 ** idxNum==1 PATH parameter only 2986 ** idxNum==2 Both PATH and DIR supplied 2987 */ 2988 static int fsdirFilter( 2989 sqlite3_vtab_cursor *cur, 2990 int idxNum, const char *idxStr, 2991 int argc, sqlite3_value **argv 2992 ){ 2993 const char *zDir = 0; 2994 fsdir_cursor *pCur = (fsdir_cursor*)cur; 2995 (void)idxStr; 2996 fsdirResetCursor(pCur); 2997 2998 if( idxNum==0 ){ 2999 fsdirSetErrmsg(pCur, "table function fsdir requires an argument"); 3000 return SQLITE_ERROR; 3001 } 3002 3003 assert( argc==idxNum && (argc==1 || argc==2) ); 3004 zDir = (const char*)sqlite3_value_text(argv[0]); 3005 if( zDir==0 ){ 3006 fsdirSetErrmsg(pCur, "table function fsdir requires a non-NULL argument"); 3007 return SQLITE_ERROR; 3008 } 3009 if( argc==2 ){ 3010 pCur->zBase = (const char*)sqlite3_value_text(argv[1]); 3011 } 3012 if( pCur->zBase ){ 3013 pCur->nBase = (int)strlen(pCur->zBase)+1; 3014 pCur->zPath = sqlite3_mprintf("%s/%s", pCur->zBase, zDir); 3015 }else{ 3016 pCur->zPath = sqlite3_mprintf("%s", zDir); 3017 } 3018 3019 if( pCur->zPath==0 ){ 3020 return SQLITE_NOMEM; 3021 } 3022 if( fileLinkStat(pCur->zPath, &pCur->sStat) ){ 3023 fsdirSetErrmsg(pCur, "cannot stat file: %s", pCur->zPath); 3024 return SQLITE_ERROR; 3025 } 3026 3027 return SQLITE_OK; 3028 } 3029 3030 /* 3031 ** SQLite will invoke this method one or more times while planning a query 3032 ** that uses the generate_series virtual table. This routine needs to create 3033 ** a query plan for each invocation and compute an estimated cost for that 3034 ** plan. 3035 ** 3036 ** In this implementation idxNum is used to represent the 3037 ** query plan. idxStr is unused. 3038 ** 3039 ** The query plan is represented by values of idxNum: 3040 ** 3041 ** (1) The path value is supplied by argv[0] 3042 ** (2) Path is in argv[0] and dir is in argv[1] 3043 */ 3044 static int fsdirBestIndex( 3045 sqlite3_vtab *tab, 3046 sqlite3_index_info *pIdxInfo 3047 ){ 3048 int i; /* Loop over constraints */ 3049 int idxPath = -1; /* Index in pIdxInfo->aConstraint of PATH= */ 3050 int idxDir = -1; /* Index in pIdxInfo->aConstraint of DIR= */ 3051 int seenPath = 0; /* True if an unusable PATH= constraint is seen */ 3052 int seenDir = 0; /* True if an unusable DIR= constraint is seen */ 3053 const struct sqlite3_index_constraint *pConstraint; 3054 3055 (void)tab; 3056 pConstraint = pIdxInfo->aConstraint; 3057 for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){ 3058 if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue; 3059 switch( pConstraint->iColumn ){ 3060 case FSDIR_COLUMN_PATH: { 3061 if( pConstraint->usable ){ 3062 idxPath = i; 3063 seenPath = 0; 3064 }else if( idxPath<0 ){ 3065 seenPath = 1; 3066 } 3067 break; 3068 } 3069 case FSDIR_COLUMN_DIR: { 3070 if( pConstraint->usable ){ 3071 idxDir = i; 3072 seenDir = 0; 3073 }else if( idxDir<0 ){ 3074 seenDir = 1; 3075 } 3076 break; 3077 } 3078 } 3079 } 3080 if( seenPath || seenDir ){ 3081 /* If input parameters are unusable, disallow this plan */ 3082 return SQLITE_CONSTRAINT; 3083 } 3084 3085 if( idxPath<0 ){ 3086 pIdxInfo->idxNum = 0; 3087 /* The pIdxInfo->estimatedCost should have been initialized to a huge 3088 ** number. Leave it unchanged. */ 3089 pIdxInfo->estimatedRows = 0x7fffffff; 3090 }else{ 3091 pIdxInfo->aConstraintUsage[idxPath].omit = 1; 3092 pIdxInfo->aConstraintUsage[idxPath].argvIndex = 1; 3093 if( idxDir>=0 ){ 3094 pIdxInfo->aConstraintUsage[idxDir].omit = 1; 3095 pIdxInfo->aConstraintUsage[idxDir].argvIndex = 2; 3096 pIdxInfo->idxNum = 2; 3097 pIdxInfo->estimatedCost = 10.0; 3098 }else{ 3099 pIdxInfo->idxNum = 1; 3100 pIdxInfo->estimatedCost = 100.0; 3101 } 3102 } 3103 3104 return SQLITE_OK; 3105 } 3106 3107 /* 3108 ** Register the "fsdir" virtual table. 3109 */ 3110 static int fsdirRegister(sqlite3 *db){ 3111 static sqlite3_module fsdirModule = { 3112 0, /* iVersion */ 3113 0, /* xCreate */ 3114 fsdirConnect, /* xConnect */ 3115 fsdirBestIndex, /* xBestIndex */ 3116 fsdirDisconnect, /* xDisconnect */ 3117 0, /* xDestroy */ 3118 fsdirOpen, /* xOpen - open a cursor */ 3119 fsdirClose, /* xClose - close a cursor */ 3120 fsdirFilter, /* xFilter - configure scan constraints */ 3121 fsdirNext, /* xNext - advance a cursor */ 3122 fsdirEof, /* xEof - check for end of scan */ 3123 fsdirColumn, /* xColumn - read data */ 3124 fsdirRowid, /* xRowid - read data */ 3125 0, /* xUpdate */ 3126 0, /* xBegin */ 3127 0, /* xSync */ 3128 0, /* xCommit */ 3129 0, /* xRollback */ 3130 0, /* xFindMethod */ 3131 0, /* xRename */ 3132 0, /* xSavepoint */ 3133 0, /* xRelease */ 3134 0, /* xRollbackTo */ 3135 0, /* xShadowName */ 3136 }; 3137 3138 int rc = sqlite3_create_module(db, "fsdir", &fsdirModule, 0); 3139 return rc; 3140 } 3141 #else /* SQLITE_OMIT_VIRTUALTABLE */ 3142 # define fsdirRegister(x) SQLITE_OK 3143 #endif 3144 3145 #ifdef _WIN32 3146 3147 #endif 3148 int sqlite3_fileio_init( 3149 sqlite3 *db, 3150 char **pzErrMsg, 3151 const sqlite3_api_routines *pApi 3152 ){ 3153 int rc = SQLITE_OK; 3154 SQLITE_EXTENSION_INIT2(pApi); 3155 (void)pzErrMsg; /* Unused parameter */ 3156 rc = sqlite3_create_function(db, "readfile", 1, 3157 SQLITE_UTF8|SQLITE_DIRECTONLY, 0, 3158 readfileFunc, 0, 0); 3159 if( rc==SQLITE_OK ){ 3160 rc = sqlite3_create_function(db, "writefile", -1, 3161 SQLITE_UTF8|SQLITE_DIRECTONLY, 0, 3162 writefileFunc, 0, 0); 3163 } 3164 if( rc==SQLITE_OK ){ 3165 rc = sqlite3_create_function(db, "lsmode", 1, SQLITE_UTF8, 0, 3166 lsModeFunc, 0, 0); 3167 } 3168 if( rc==SQLITE_OK ){ 3169 rc = fsdirRegister(db); 3170 } 3171 return rc; 3172 } 3173 3174 #if defined(FILEIO_WIN32_DLL) && (defined(_WIN32) || defined(WIN32)) 3175 /* To allow a standalone DLL, make test_windirent.c use the same 3176 * redefined SQLite API calls as the above extension code does. 3177 * Just pull in this .c to accomplish this. As a beneficial side 3178 * effect, this extension becomes a single translation unit. */ 3179 # include "test_windirent.c" 3180 #endif 3181 3182 /************************* End ../ext/misc/fileio.c ********************/ 3183 /************************* Begin ../ext/misc/completion.c ******************/ 3184 /* 3185 ** 2017-07-10 3186 ** 3187 ** The author disclaims copyright to this source code. In place of 3188 ** a legal notice, here is a blessing: 3189 ** 3190 ** May you do good and not evil. 3191 ** May you find forgiveness for yourself and forgive others. 3192 ** May you share freely, never taking more than you give. 3193 ** 3194 ************************************************************************* 3195 ** 3196 ** This file implements an eponymous virtual table that returns suggested 3197 ** completions for a partial SQL input. 3198 ** 3199 ** Suggested usage: 3200 ** 3201 ** SELECT DISTINCT candidate COLLATE nocase 3202 ** FROM completion($prefix,$wholeline) 3203 ** ORDER BY 1; 3204 ** 3205 ** The two query parameters are optional. $prefix is the text of the 3206 ** current word being typed and that is to be completed. $wholeline is 3207 ** the complete input line, used for context. 3208 ** 3209 ** The raw completion() table might return the same candidate multiple 3210 ** times, for example if the same column name is used to two or more 3211 ** tables. And the candidates are returned in an arbitrary order. Hence, 3212 ** the DISTINCT and ORDER BY are recommended. 3213 ** 3214 ** This virtual table operates at the speed of human typing, and so there 3215 ** is no attempt to make it fast. Even a slow implementation will be much 3216 ** faster than any human can type. 3217 ** 3218 */ 3219 /* #include "sqlite3ext.h" */ 3220 SQLITE_EXTENSION_INIT1 3221 #include <assert.h> 3222 #include <string.h> 3223 #include <ctype.h> 3224 3225 #ifndef SQLITE_OMIT_VIRTUALTABLE 3226 3227 /* completion_vtab is a subclass of sqlite3_vtab which will 3228 ** serve as the underlying representation of a completion virtual table 3229 */ 3230 typedef struct completion_vtab completion_vtab; 3231 struct completion_vtab { 3232 sqlite3_vtab base; /* Base class - must be first */ 3233 sqlite3 *db; /* Database connection for this completion vtab */ 3234 }; 3235 3236 /* completion_cursor is a subclass of sqlite3_vtab_cursor which will 3237 ** serve as the underlying representation of a cursor that scans 3238 ** over rows of the result 3239 */ 3240 typedef struct completion_cursor completion_cursor; 3241 struct completion_cursor { 3242 sqlite3_vtab_cursor base; /* Base class - must be first */ 3243 sqlite3 *db; /* Database connection for this cursor */ 3244 int nPrefix, nLine; /* Number of bytes in zPrefix and zLine */ 3245 char *zPrefix; /* The prefix for the word we want to complete */ 3246 char *zLine; /* The whole that we want to complete */ 3247 const char *zCurrentRow; /* Current output row */ 3248 int szRow; /* Length of the zCurrentRow string */ 3249 sqlite3_stmt *pStmt; /* Current statement */ 3250 sqlite3_int64 iRowid; /* The rowid */ 3251 int ePhase; /* Current phase */ 3252 int j; /* inter-phase counter */ 3253 }; 3254 3255 /* Values for ePhase: 3256 */ 3257 #define COMPLETION_FIRST_PHASE 1 3258 #define COMPLETION_KEYWORDS 1 3259 #define COMPLETION_PRAGMAS 2 3260 #define COMPLETION_FUNCTIONS 3 3261 #define COMPLETION_COLLATIONS 4 3262 #define COMPLETION_INDEXES 5 3263 #define COMPLETION_TRIGGERS 6 3264 #define COMPLETION_DATABASES 7 3265 #define COMPLETION_TABLES 8 /* Also VIEWs and TRIGGERs */ 3266 #define COMPLETION_COLUMNS 9 3267 #define COMPLETION_MODULES 10 3268 #define COMPLETION_EOF 11 3269 3270 /* 3271 ** The completionConnect() method is invoked to create a new 3272 ** completion_vtab that describes the completion virtual table. 3273 ** 3274 ** Think of this routine as the constructor for completion_vtab objects. 3275 ** 3276 ** All this routine needs to do is: 3277 ** 3278 ** (1) Allocate the completion_vtab object and initialize all fields. 3279 ** 3280 ** (2) Tell SQLite (via the sqlite3_declare_vtab() interface) what the 3281 ** result set of queries against completion will look like. 3282 */ 3283 static int completionConnect( 3284 sqlite3 *db, 3285 void *pAux, 3286 int argc, const char *const*argv, 3287 sqlite3_vtab **ppVtab, 3288 char **pzErr 3289 ){ 3290 completion_vtab *pNew; 3291 int rc; 3292 3293 (void)(pAux); /* Unused parameter */ 3294 (void)(argc); /* Unused parameter */ 3295 (void)(argv); /* Unused parameter */ 3296 (void)(pzErr); /* Unused parameter */ 3297 3298 /* Column numbers */ 3299 #define COMPLETION_COLUMN_CANDIDATE 0 /* Suggested completion of the input */ 3300 #define COMPLETION_COLUMN_PREFIX 1 /* Prefix of the word to be completed */ 3301 #define COMPLETION_COLUMN_WHOLELINE 2 /* Entire line seen so far */ 3302 #define COMPLETION_COLUMN_PHASE 3 /* ePhase - used for debugging only */ 3303 3304 sqlite3_vtab_config(db, SQLITE_VTAB_INNOCUOUS); 3305 rc = sqlite3_declare_vtab(db, 3306 "CREATE TABLE x(" 3307 " candidate TEXT," 3308 " prefix TEXT HIDDEN," 3309 " wholeline TEXT HIDDEN," 3310 " phase INT HIDDEN" /* Used for debugging only */ 3311 ")"); 3312 if( rc==SQLITE_OK ){ 3313 pNew = sqlite3_malloc( sizeof(*pNew) ); 3314 *ppVtab = (sqlite3_vtab*)pNew; 3315 if( pNew==0 ) return SQLITE_NOMEM; 3316 memset(pNew, 0, sizeof(*pNew)); 3317 pNew->db = db; 3318 } 3319 return rc; 3320 } 3321 3322 /* 3323 ** This method is the destructor for completion_cursor objects. 3324 */ 3325 static int completionDisconnect(sqlite3_vtab *pVtab){ 3326 sqlite3_free(pVtab); 3327 return SQLITE_OK; 3328 } 3329 3330 /* 3331 ** Constructor for a new completion_cursor object. 3332 */ 3333 static int completionOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ 3334 completion_cursor *pCur; 3335 pCur = sqlite3_malloc( sizeof(*pCur) ); 3336 if( pCur==0 ) return SQLITE_NOMEM; 3337 memset(pCur, 0, sizeof(*pCur)); 3338 pCur->db = ((completion_vtab*)p)->db; 3339 *ppCursor = &pCur->base; 3340 return SQLITE_OK; 3341 } 3342 3343 /* 3344 ** Reset the completion_cursor. 3345 */ 3346 static void completionCursorReset(completion_cursor *pCur){ 3347 sqlite3_free(pCur->zPrefix); pCur->zPrefix = 0; pCur->nPrefix = 0; 3348 sqlite3_free(pCur->zLine); pCur->zLine = 0; pCur->nLine = 0; 3349 sqlite3_finalize(pCur->pStmt); pCur->pStmt = 0; 3350 pCur->j = 0; 3351 } 3352 3353 /* 3354 ** Destructor for a completion_cursor. 3355 */ 3356 static int completionClose(sqlite3_vtab_cursor *cur){ 3357 completionCursorReset((completion_cursor*)cur); 3358 sqlite3_free(cur); 3359 return SQLITE_OK; 3360 } 3361 3362 /* 3363 ** Advance a completion_cursor to its next row of output. 3364 ** 3365 ** The ->ePhase, ->j, and ->pStmt fields of the completion_cursor object 3366 ** record the current state of the scan. This routine sets ->zCurrentRow 3367 ** to the current row of output and then returns. If no more rows remain, 3368 ** then ->ePhase is set to COMPLETION_EOF which will signal the virtual 3369 ** table that has reached the end of its scan. 3370 ** 3371 ** The current implementation just lists potential identifiers and 3372 ** keywords and filters them by zPrefix. Future enhancements should 3373 ** take zLine into account to try to restrict the set of identifiers and 3374 ** keywords based on what would be legal at the current point of input. 3375 */ 3376 static int completionNext(sqlite3_vtab_cursor *cur){ 3377 completion_cursor *pCur = (completion_cursor*)cur; 3378 int eNextPhase = 0; /* Next phase to try if current phase reaches end */ 3379 int iCol = -1; /* If >=0, step pCur->pStmt and use the i-th column */ 3380 pCur->iRowid++; 3381 while( pCur->ePhase!=COMPLETION_EOF ){ 3382 switch( pCur->ePhase ){ 3383 case COMPLETION_KEYWORDS: { 3384 if( pCur->j >= sqlite3_keyword_count() ){ 3385 pCur->zCurrentRow = 0; 3386 pCur->ePhase = COMPLETION_DATABASES; 3387 }else{ 3388 sqlite3_keyword_name(pCur->j++, &pCur->zCurrentRow, &pCur->szRow); 3389 } 3390 iCol = -1; 3391 break; 3392 } 3393 case COMPLETION_DATABASES: { 3394 if( pCur->pStmt==0 ){ 3395 sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1, 3396 &pCur->pStmt, 0); 3397 } 3398 iCol = 1; 3399 eNextPhase = COMPLETION_TABLES; 3400 break; 3401 } 3402 case COMPLETION_TABLES: { 3403 if( pCur->pStmt==0 ){ 3404 sqlite3_stmt *pS2; 3405 char *zSql = 0; 3406 const char *zSep = ""; 3407 sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1, &pS2, 0); 3408 while( sqlite3_step(pS2)==SQLITE_ROW ){ 3409 const char *zDb = (const char*)sqlite3_column_text(pS2, 1); 3410 zSql = sqlite3_mprintf( 3411 "%z%s" 3412 "SELECT name FROM \"%w\".sqlite_schema", 3413 zSql, zSep, zDb 3414 ); 3415 if( zSql==0 ) return SQLITE_NOMEM; 3416 zSep = " UNION "; 3417 } 3418 sqlite3_finalize(pS2); 3419 sqlite3_prepare_v2(pCur->db, zSql, -1, &pCur->pStmt, 0); 3420 sqlite3_free(zSql); 3421 } 3422 iCol = 0; 3423 eNextPhase = COMPLETION_COLUMNS; 3424 break; 3425 } 3426 case COMPLETION_COLUMNS: { 3427 if( pCur->pStmt==0 ){ 3428 sqlite3_stmt *pS2; 3429 char *zSql = 0; 3430 const char *zSep = ""; 3431 sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1, &pS2, 0); 3432 while( sqlite3_step(pS2)==SQLITE_ROW ){ 3433 const char *zDb = (const char*)sqlite3_column_text(pS2, 1); 3434 zSql = sqlite3_mprintf( 3435 "%z%s" 3436 "SELECT pti.name FROM \"%w\".sqlite_schema AS sm" 3437 " JOIN pragma_table_info(sm.name,%Q) AS pti" 3438 " WHERE sm.type='table'", 3439 zSql, zSep, zDb, zDb 3440 ); 3441 if( zSql==0 ) return SQLITE_NOMEM; 3442 zSep = " UNION "; 3443 } 3444 sqlite3_finalize(pS2); 3445 sqlite3_prepare_v2(pCur->db, zSql, -1, &pCur->pStmt, 0); 3446 sqlite3_free(zSql); 3447 } 3448 iCol = 0; 3449 eNextPhase = COMPLETION_EOF; 3450 break; 3451 } 3452 } 3453 if( iCol<0 ){ 3454 /* This case is when the phase presets zCurrentRow */ 3455 if( pCur->zCurrentRow==0 ) continue; 3456 }else{ 3457 if( sqlite3_step(pCur->pStmt)==SQLITE_ROW ){ 3458 /* Extract the next row of content */ 3459 pCur->zCurrentRow = (const char*)sqlite3_column_text(pCur->pStmt, iCol); 3460 pCur->szRow = sqlite3_column_bytes(pCur->pStmt, iCol); 3461 }else{ 3462 /* When all rows are finished, advance to the next phase */ 3463 sqlite3_finalize(pCur->pStmt); 3464 pCur->pStmt = 0; 3465 pCur->ePhase = eNextPhase; 3466 continue; 3467 } 3468 } 3469 if( pCur->nPrefix==0 ) break; 3470 if( pCur->nPrefix<=pCur->szRow 3471 && sqlite3_strnicmp(pCur->zPrefix, pCur->zCurrentRow, pCur->nPrefix)==0 3472 ){ 3473 break; 3474 } 3475 } 3476 3477 return SQLITE_OK; 3478 } 3479 3480 /* 3481 ** Return values of columns for the row at which the completion_cursor 3482 ** is currently pointing. 3483 */ 3484 static int completionColumn( 3485 sqlite3_vtab_cursor *cur, /* The cursor */ 3486 sqlite3_context *ctx, /* First argument to sqlite3_result_...() */ 3487 int i /* Which column to return */ 3488 ){ 3489 completion_cursor *pCur = (completion_cursor*)cur; 3490 switch( i ){ 3491 case COMPLETION_COLUMN_CANDIDATE: { 3492 sqlite3_result_text(ctx, pCur->zCurrentRow, pCur->szRow,SQLITE_TRANSIENT); 3493 break; 3494 } 3495 case COMPLETION_COLUMN_PREFIX: { 3496 sqlite3_result_text(ctx, pCur->zPrefix, -1, SQLITE_TRANSIENT); 3497 break; 3498 } 3499 case COMPLETION_COLUMN_WHOLELINE: { 3500 sqlite3_result_text(ctx, pCur->zLine, -1, SQLITE_TRANSIENT); 3501 break; 3502 } 3503 case COMPLETION_COLUMN_PHASE: { 3504 sqlite3_result_int(ctx, pCur->ePhase); 3505 break; 3506 } 3507 } 3508 return SQLITE_OK; 3509 } 3510 3511 /* 3512 ** Return the rowid for the current row. In this implementation, the 3513 ** rowid is the same as the output value. 3514 */ 3515 static int completionRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ 3516 completion_cursor *pCur = (completion_cursor*)cur; 3517 *pRowid = pCur->iRowid; 3518 return SQLITE_OK; 3519 } 3520 3521 /* 3522 ** Return TRUE if the cursor has been moved off of the last 3523 ** row of output. 3524 */ 3525 static int completionEof(sqlite3_vtab_cursor *cur){ 3526 completion_cursor *pCur = (completion_cursor*)cur; 3527 return pCur->ePhase >= COMPLETION_EOF; 3528 } 3529 3530 /* 3531 ** This method is called to "rewind" the completion_cursor object back 3532 ** to the first row of output. This method is always called at least 3533 ** once prior to any call to completionColumn() or completionRowid() or 3534 ** completionEof(). 3535 */ 3536 static int completionFilter( 3537 sqlite3_vtab_cursor *pVtabCursor, 3538 int idxNum, const char *idxStr, 3539 int argc, sqlite3_value **argv 3540 ){ 3541 completion_cursor *pCur = (completion_cursor *)pVtabCursor; 3542 int iArg = 0; 3543 (void)(idxStr); /* Unused parameter */ 3544 (void)(argc); /* Unused parameter */ 3545 completionCursorReset(pCur); 3546 if( idxNum & 1 ){ 3547 pCur->nPrefix = sqlite3_value_bytes(argv[iArg]); 3548 if( pCur->nPrefix>0 ){ 3549 pCur->zPrefix = sqlite3_mprintf("%s", sqlite3_value_text(argv[iArg])); 3550 if( pCur->zPrefix==0 ) return SQLITE_NOMEM; 3551 } 3552 iArg = 1; 3553 } 3554 if( idxNum & 2 ){ 3555 pCur->nLine = sqlite3_value_bytes(argv[iArg]); 3556 if( pCur->nLine>0 ){ 3557 pCur->zLine = sqlite3_mprintf("%s", sqlite3_value_text(argv[iArg])); 3558 if( pCur->zLine==0 ) return SQLITE_NOMEM; 3559 } 3560 } 3561 if( pCur->zLine!=0 && pCur->zPrefix==0 ){ 3562 int i = pCur->nLine; 3563 while( i>0 && (isalnum(pCur->zLine[i-1]) || pCur->zLine[i-1]=='_') ){ 3564 i--; 3565 } 3566 pCur->nPrefix = pCur->nLine - i; 3567 if( pCur->nPrefix>0 ){ 3568 pCur->zPrefix = sqlite3_mprintf("%.*s", pCur->nPrefix, pCur->zLine + i); 3569 if( pCur->zPrefix==0 ) return SQLITE_NOMEM; 3570 } 3571 } 3572 pCur->iRowid = 0; 3573 pCur->ePhase = COMPLETION_FIRST_PHASE; 3574 return completionNext(pVtabCursor); 3575 } 3576 3577 /* 3578 ** SQLite will invoke this method one or more times while planning a query 3579 ** that uses the completion virtual table. This routine needs to create 3580 ** a query plan for each invocation and compute an estimated cost for that 3581 ** plan. 3582 ** 3583 ** There are two hidden parameters that act as arguments to the table-valued 3584 ** function: "prefix" and "wholeline". Bit 0 of idxNum is set if "prefix" 3585 ** is available and bit 1 is set if "wholeline" is available. 3586 */ 3587 static int completionBestIndex( 3588 sqlite3_vtab *tab, 3589 sqlite3_index_info *pIdxInfo 3590 ){ 3591 int i; /* Loop over constraints */ 3592 int idxNum = 0; /* The query plan bitmask */ 3593 int prefixIdx = -1; /* Index of the start= constraint, or -1 if none */ 3594 int wholelineIdx = -1; /* Index of the stop= constraint, or -1 if none */ 3595 int nArg = 0; /* Number of arguments that completeFilter() expects */ 3596 const struct sqlite3_index_constraint *pConstraint; 3597 3598 (void)(tab); /* Unused parameter */ 3599 pConstraint = pIdxInfo->aConstraint; 3600 for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){ 3601 if( pConstraint->usable==0 ) continue; 3602 if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue; 3603 switch( pConstraint->iColumn ){ 3604 case COMPLETION_COLUMN_PREFIX: 3605 prefixIdx = i; 3606 idxNum |= 1; 3607 break; 3608 case COMPLETION_COLUMN_WHOLELINE: 3609 wholelineIdx = i; 3610 idxNum |= 2; 3611 break; 3612 } 3613 } 3614 if( prefixIdx>=0 ){ 3615 pIdxInfo->aConstraintUsage[prefixIdx].argvIndex = ++nArg; 3616 pIdxInfo->aConstraintUsage[prefixIdx].omit = 1; 3617 } 3618 if( wholelineIdx>=0 ){ 3619 pIdxInfo->aConstraintUsage[wholelineIdx].argvIndex = ++nArg; 3620 pIdxInfo->aConstraintUsage[wholelineIdx].omit = 1; 3621 } 3622 pIdxInfo->idxNum = idxNum; 3623 pIdxInfo->estimatedCost = (double)5000 - 1000*nArg; 3624 pIdxInfo->estimatedRows = 500 - 100*nArg; 3625 return SQLITE_OK; 3626 } 3627 3628 /* 3629 ** This following structure defines all the methods for the 3630 ** completion virtual table. 3631 */ 3632 static sqlite3_module completionModule = { 3633 0, /* iVersion */ 3634 0, /* xCreate */ 3635 completionConnect, /* xConnect */ 3636 completionBestIndex, /* xBestIndex */ 3637 completionDisconnect, /* xDisconnect */ 3638 0, /* xDestroy */ 3639 completionOpen, /* xOpen - open a cursor */ 3640 completionClose, /* xClose - close a cursor */ 3641 completionFilter, /* xFilter - configure scan constraints */ 3642 completionNext, /* xNext - advance a cursor */ 3643 completionEof, /* xEof - check for end of scan */ 3644 completionColumn, /* xColumn - read data */ 3645 completionRowid, /* xRowid - read data */ 3646 0, /* xUpdate */ 3647 0, /* xBegin */ 3648 0, /* xSync */ 3649 0, /* xCommit */ 3650 0, /* xRollback */ 3651 0, /* xFindMethod */ 3652 0, /* xRename */ 3653 0, /* xSavepoint */ 3654 0, /* xRelease */ 3655 0, /* xRollbackTo */ 3656 0 /* xShadowName */ 3657 }; 3658 3659 #endif /* SQLITE_OMIT_VIRTUALTABLE */ 3660 3661 int sqlite3CompletionVtabInit(sqlite3 *db){ 3662 int rc = SQLITE_OK; 3663 #ifndef SQLITE_OMIT_VIRTUALTABLE 3664 rc = sqlite3_create_module(db, "completion", &completionModule, 0); 3665 #endif 3666 return rc; 3667 } 3668 3669 #ifdef _WIN32 3670 3671 #endif 3672 int sqlite3_completion_init( 3673 sqlite3 *db, 3674 char **pzErrMsg, 3675 const sqlite3_api_routines *pApi 3676 ){ 3677 int rc = SQLITE_OK; 3678 SQLITE_EXTENSION_INIT2(pApi); 3679 (void)(pzErrMsg); /* Unused parameter */ 3680 #ifndef SQLITE_OMIT_VIRTUALTABLE 3681 rc = sqlite3CompletionVtabInit(db); 3682 #endif 3683 return rc; 3684 } 3685 3686 /************************* End ../ext/misc/completion.c ********************/ 3687 /************************* Begin ../ext/misc/appendvfs.c ******************/ 3688 /* 3689 ** 2017-10-20 3690 ** 3691 ** The author disclaims copyright to this source code. In place of 3692 ** a legal notice, here is a blessing: 3693 ** 3694 ** May you do good and not evil. 3695 ** May you find forgiveness for yourself and forgive others. 3696 ** May you share freely, never taking more than you give. 3697 ** 3698 ****************************************************************************** 3699 ** 3700 ** This file implements a VFS shim that allows an SQLite database to be 3701 ** appended onto the end of some other file, such as an executable. 3702 ** 3703 ** A special record must appear at the end of the file that identifies the 3704 ** file as an appended database and provides the offset to the first page 3705 ** of the exposed content. (Or, it is the length of the content prefix.) 3706 ** For best performance page 1 should be located at a disk page boundary, 3707 ** though that is not required. 3708 ** 3709 ** When opening a database using this VFS, the connection might treat 3710 ** the file as an ordinary SQLite database, or it might treat it as a 3711 ** database appended onto some other file. The decision is made by 3712 ** applying the following rules in order: 3713 ** 3714 ** (1) An empty file is an ordinary database. 3715 ** 3716 ** (2) If the file ends with the appendvfs trailer string 3717 ** "Start-Of-SQLite3-NNNNNNNN" that file is an appended database. 3718 ** 3719 ** (3) If the file begins with the standard SQLite prefix string 3720 ** "SQLite format 3", that file is an ordinary database. 3721 ** 3722 ** (4) If none of the above apply and the SQLITE_OPEN_CREATE flag is 3723 ** set, then a new database is appended to the already existing file. 3724 ** 3725 ** (5) Otherwise, SQLITE_CANTOPEN is returned. 3726 ** 3727 ** To avoid unnecessary complications with the PENDING_BYTE, the size of 3728 ** the file containing the database is limited to 1GiB. (1073741824 bytes) 3729 ** This VFS will not read or write past the 1GiB mark. This restriction 3730 ** might be lifted in future versions. For now, if you need a larger 3731 ** database, then keep it in a separate file. 3732 ** 3733 ** If the file being opened is a plain database (not an appended one), then 3734 ** this shim is a pass-through into the default underlying VFS. (rule 3) 3735 **/ 3736 /* #include "sqlite3ext.h" */ 3737 SQLITE_EXTENSION_INIT1 3738 #include <string.h> 3739 #include <assert.h> 3740 3741 /* The append mark at the end of the database is: 3742 ** 3743 ** Start-Of-SQLite3-NNNNNNNN 3744 ** 123456789 123456789 12345 3745 ** 3746 ** The NNNNNNNN represents a 64-bit big-endian unsigned integer which is 3747 ** the offset to page 1, and also the length of the prefix content. 3748 */ 3749 #define APND_MARK_PREFIX "Start-Of-SQLite3-" 3750 #define APND_MARK_PREFIX_SZ 17 3751 #define APND_MARK_FOS_SZ 8 3752 #define APND_MARK_SIZE (APND_MARK_PREFIX_SZ+APND_MARK_FOS_SZ) 3753 3754 /* 3755 ** Maximum size of the combined prefix + database + append-mark. This 3756 ** must be less than 0x40000000 to avoid locking issues on Windows. 3757 */ 3758 #define APND_MAX_SIZE (0x40000000) 3759 3760 /* 3761 ** Try to align the database to an even multiple of APND_ROUNDUP bytes. 3762 */ 3763 #ifndef APND_ROUNDUP 3764 #define APND_ROUNDUP 4096 3765 #endif 3766 #define APND_ALIGN_MASK ((sqlite3_int64)(APND_ROUNDUP-1)) 3767 #define APND_START_ROUNDUP(fsz) (((fsz)+APND_ALIGN_MASK) & ~APND_ALIGN_MASK) 3768 3769 /* 3770 ** Forward declaration of objects used by this utility 3771 */ 3772 typedef struct sqlite3_vfs ApndVfs; 3773 typedef struct ApndFile ApndFile; 3774 3775 /* Access to a lower-level VFS that (might) implement dynamic loading, 3776 ** access to randomness, etc. 3777 */ 3778 #define ORIGVFS(p) ((sqlite3_vfs*)((p)->pAppData)) 3779 #define ORIGFILE(p) ((sqlite3_file*)(((ApndFile*)(p))+1)) 3780 3781 /* An open appendvfs file 3782 ** 3783 ** An instance of this structure describes the appended database file. 3784 ** A separate sqlite3_file object is always appended. The appended 3785 ** sqlite3_file object (which can be accessed using ORIGFILE()) describes 3786 ** the entire file, including the prefix, the database, and the 3787 ** append-mark. 3788 ** 3789 ** The structure of an AppendVFS database is like this: 3790 ** 3791 ** +-------------+---------+----------+-------------+ 3792 ** | prefix-file | padding | database | append-mark | 3793 ** +-------------+---------+----------+-------------+ 3794 ** ^ ^ 3795 ** | | 3796 ** iPgOne iMark 3797 ** 3798 ** 3799 ** "prefix file" - file onto which the database has been appended. 3800 ** "padding" - zero or more bytes inserted so that "database" 3801 ** starts on an APND_ROUNDUP boundary 3802 ** "database" - The SQLite database file 3803 ** "append-mark" - The 25-byte "Start-Of-SQLite3-NNNNNNNN" that indicates 3804 ** the offset from the start of prefix-file to the start 3805 ** of "database". 3806 ** 3807 ** The size of the database is iMark - iPgOne. 3808 ** 3809 ** The NNNNNNNN in the "Start-Of-SQLite3-NNNNNNNN" suffix is the value 3810 ** of iPgOne stored as a big-ending 64-bit integer. 3811 ** 3812 ** iMark will be the size of the underlying file minus 25 (APND_MARKSIZE). 3813 ** Or, iMark is -1 to indicate that it has not yet been written. 3814 */ 3815 struct ApndFile { 3816 sqlite3_file base; /* Subclass. MUST BE FIRST! */ 3817 sqlite3_int64 iPgOne; /* Offset to the start of the database */ 3818 sqlite3_int64 iMark; /* Offset of the append mark. -1 if unwritten */ 3819 /* Always followed by another sqlite3_file that describes the whole file */ 3820 }; 3821 3822 /* 3823 ** Methods for ApndFile 3824 */ 3825 static int apndClose(sqlite3_file*); 3826 static int apndRead(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst); 3827 static int apndWrite(sqlite3_file*,const void*,int iAmt, sqlite3_int64 iOfst); 3828 static int apndTruncate(sqlite3_file*, sqlite3_int64 size); 3829 static int apndSync(sqlite3_file*, int flags); 3830 static int apndFileSize(sqlite3_file*, sqlite3_int64 *pSize); 3831 static int apndLock(sqlite3_file*, int); 3832 static int apndUnlock(sqlite3_file*, int); 3833 static int apndCheckReservedLock(sqlite3_file*, int *pResOut); 3834 static int apndFileControl(sqlite3_file*, int op, void *pArg); 3835 static int apndSectorSize(sqlite3_file*); 3836 static int apndDeviceCharacteristics(sqlite3_file*); 3837 static int apndShmMap(sqlite3_file*, int iPg, int pgsz, int, void volatile**); 3838 static int apndShmLock(sqlite3_file*, int offset, int n, int flags); 3839 static void apndShmBarrier(sqlite3_file*); 3840 static int apndShmUnmap(sqlite3_file*, int deleteFlag); 3841 static int apndFetch(sqlite3_file*, sqlite3_int64 iOfst, int iAmt, void **pp); 3842 static int apndUnfetch(sqlite3_file*, sqlite3_int64 iOfst, void *p); 3843 3844 /* 3845 ** Methods for ApndVfs 3846 */ 3847 static int apndOpen(sqlite3_vfs*, const char *, sqlite3_file*, int , int *); 3848 static int apndDelete(sqlite3_vfs*, const char *zName, int syncDir); 3849 static int apndAccess(sqlite3_vfs*, const char *zName, int flags, int *); 3850 static int apndFullPathname(sqlite3_vfs*, const char *zName, int, char *zOut); 3851 static void *apndDlOpen(sqlite3_vfs*, const char *zFilename); 3852 static void apndDlError(sqlite3_vfs*, int nByte, char *zErrMsg); 3853 static void (*apndDlSym(sqlite3_vfs *pVfs, void *p, const char*zSym))(void); 3854 static void apndDlClose(sqlite3_vfs*, void*); 3855 static int apndRandomness(sqlite3_vfs*, int nByte, char *zOut); 3856 static int apndSleep(sqlite3_vfs*, int microseconds); 3857 static int apndCurrentTime(sqlite3_vfs*, double*); 3858 static int apndGetLastError(sqlite3_vfs*, int, char *); 3859 static int apndCurrentTimeInt64(sqlite3_vfs*, sqlite3_int64*); 3860 static int apndSetSystemCall(sqlite3_vfs*, const char*,sqlite3_syscall_ptr); 3861 static sqlite3_syscall_ptr apndGetSystemCall(sqlite3_vfs*, const char *z); 3862 static const char *apndNextSystemCall(sqlite3_vfs*, const char *zName); 3863 3864 static sqlite3_vfs apnd_vfs = { 3865 3, /* iVersion (set when registered) */ 3866 0, /* szOsFile (set when registered) */ 3867 1024, /* mxPathname */ 3868 0, /* pNext */ 3869 "apndvfs", /* zName */ 3870 0, /* pAppData (set when registered) */ 3871 apndOpen, /* xOpen */ 3872 apndDelete, /* xDelete */ 3873 apndAccess, /* xAccess */ 3874 apndFullPathname, /* xFullPathname */ 3875 apndDlOpen, /* xDlOpen */ 3876 apndDlError, /* xDlError */ 3877 apndDlSym, /* xDlSym */ 3878 apndDlClose, /* xDlClose */ 3879 apndRandomness, /* xRandomness */ 3880 apndSleep, /* xSleep */ 3881 apndCurrentTime, /* xCurrentTime */ 3882 apndGetLastError, /* xGetLastError */ 3883 apndCurrentTimeInt64, /* xCurrentTimeInt64 */ 3884 apndSetSystemCall, /* xSetSystemCall */ 3885 apndGetSystemCall, /* xGetSystemCall */ 3886 apndNextSystemCall /* xNextSystemCall */ 3887 }; 3888 3889 static const sqlite3_io_methods apnd_io_methods = { 3890 3, /* iVersion */ 3891 apndClose, /* xClose */ 3892 apndRead, /* xRead */ 3893 apndWrite, /* xWrite */ 3894 apndTruncate, /* xTruncate */ 3895 apndSync, /* xSync */ 3896 apndFileSize, /* xFileSize */ 3897 apndLock, /* xLock */ 3898 apndUnlock, /* xUnlock */ 3899 apndCheckReservedLock, /* xCheckReservedLock */ 3900 apndFileControl, /* xFileControl */ 3901 apndSectorSize, /* xSectorSize */ 3902 apndDeviceCharacteristics, /* xDeviceCharacteristics */ 3903 apndShmMap, /* xShmMap */ 3904 apndShmLock, /* xShmLock */ 3905 apndShmBarrier, /* xShmBarrier */ 3906 apndShmUnmap, /* xShmUnmap */ 3907 apndFetch, /* xFetch */ 3908 apndUnfetch /* xUnfetch */ 3909 }; 3910 3911 /* 3912 ** Close an apnd-file. 3913 */ 3914 static int apndClose(sqlite3_file *pFile){ 3915 pFile = ORIGFILE(pFile); 3916 return pFile->pMethods->xClose(pFile); 3917 } 3918 3919 /* 3920 ** Read data from an apnd-file. 3921 */ 3922 static int apndRead( 3923 sqlite3_file *pFile, 3924 void *zBuf, 3925 int iAmt, 3926 sqlite_int64 iOfst 3927 ){ 3928 ApndFile *paf = (ApndFile *)pFile; 3929 pFile = ORIGFILE(pFile); 3930 return pFile->pMethods->xRead(pFile, zBuf, iAmt, paf->iPgOne+iOfst); 3931 } 3932 3933 /* 3934 ** Add the append-mark onto what should become the end of the file. 3935 * If and only if this succeeds, internal ApndFile.iMark is updated. 3936 * Parameter iWriteEnd is the appendvfs-relative offset of the new mark. 3937 */ 3938 static int apndWriteMark( 3939 ApndFile *paf, 3940 sqlite3_file *pFile, 3941 sqlite_int64 iWriteEnd 3942 ){ 3943 sqlite_int64 iPgOne = paf->iPgOne; 3944 unsigned char a[APND_MARK_SIZE]; 3945 int i = APND_MARK_FOS_SZ; 3946 int rc; 3947 assert(pFile == ORIGFILE(paf)); 3948 memcpy(a, APND_MARK_PREFIX, APND_MARK_PREFIX_SZ); 3949 while( --i >= 0 ){ 3950 a[APND_MARK_PREFIX_SZ+i] = (unsigned char)(iPgOne & 0xff); 3951 iPgOne >>= 8; 3952 } 3953 iWriteEnd += paf->iPgOne; 3954 if( SQLITE_OK==(rc = pFile->pMethods->xWrite 3955 (pFile, a, APND_MARK_SIZE, iWriteEnd)) ){ 3956 paf->iMark = iWriteEnd; 3957 } 3958 return rc; 3959 } 3960 3961 /* 3962 ** Write data to an apnd-file. 3963 */ 3964 static int apndWrite( 3965 sqlite3_file *pFile, 3966 const void *zBuf, 3967 int iAmt, 3968 sqlite_int64 iOfst 3969 ){ 3970 ApndFile *paf = (ApndFile *)pFile; 3971 sqlite_int64 iWriteEnd = iOfst + iAmt; 3972 if( iWriteEnd>=APND_MAX_SIZE ) return SQLITE_FULL; 3973 pFile = ORIGFILE(pFile); 3974 /* If append-mark is absent or will be overwritten, write it. */ 3975 if( paf->iMark < 0 || paf->iPgOne + iWriteEnd > paf->iMark ){ 3976 int rc = apndWriteMark(paf, pFile, iWriteEnd); 3977 if( SQLITE_OK!=rc ) return rc; 3978 } 3979 return pFile->pMethods->xWrite(pFile, zBuf, iAmt, paf->iPgOne+iOfst); 3980 } 3981 3982 /* 3983 ** Truncate an apnd-file. 3984 */ 3985 static int apndTruncate(sqlite3_file *pFile, sqlite_int64 size){ 3986 ApndFile *paf = (ApndFile *)pFile; 3987 pFile = ORIGFILE(pFile); 3988 /* The append mark goes out first so truncate failure does not lose it. */ 3989 if( SQLITE_OK!=apndWriteMark(paf, pFile, size) ) return SQLITE_IOERR; 3990 /* Truncate underlying file just past append mark */ 3991 return pFile->pMethods->xTruncate(pFile, paf->iMark+APND_MARK_SIZE); 3992 } 3993 3994 /* 3995 ** Sync an apnd-file. 3996 */ 3997 static int apndSync(sqlite3_file *pFile, int flags){ 3998 pFile = ORIGFILE(pFile); 3999 return pFile->pMethods->xSync(pFile, flags); 4000 } 4001 4002 /* 4003 ** Return the current file-size of an apnd-file. 4004 ** If the append mark is not yet there, the file-size is 0. 4005 */ 4006 static int apndFileSize(sqlite3_file *pFile, sqlite_int64 *pSize){ 4007 ApndFile *paf = (ApndFile *)pFile; 4008 *pSize = ( paf->iMark >= 0 )? (paf->iMark - paf->iPgOne) : 0; 4009 return SQLITE_OK; 4010 } 4011 4012 /* 4013 ** Lock an apnd-file. 4014 */ 4015 static int apndLock(sqlite3_file *pFile, int eLock){ 4016 pFile = ORIGFILE(pFile); 4017 return pFile->pMethods->xLock(pFile, eLock); 4018 } 4019 4020 /* 4021 ** Unlock an apnd-file. 4022 */ 4023 static int apndUnlock(sqlite3_file *pFile, int eLock){ 4024 pFile = ORIGFILE(pFile); 4025 return pFile->pMethods->xUnlock(pFile, eLock); 4026 } 4027 4028 /* 4029 ** Check if another file-handle holds a RESERVED lock on an apnd-file. 4030 */ 4031 static int apndCheckReservedLock(sqlite3_file *pFile, int *pResOut){ 4032 pFile = ORIGFILE(pFile); 4033 return pFile->pMethods->xCheckReservedLock(pFile, pResOut); 4034 } 4035 4036 /* 4037 ** File control method. For custom operations on an apnd-file. 4038 */ 4039 static int apndFileControl(sqlite3_file *pFile, int op, void *pArg){ 4040 ApndFile *paf = (ApndFile *)pFile; 4041 int rc; 4042 pFile = ORIGFILE(pFile); 4043 if( op==SQLITE_FCNTL_SIZE_HINT ) *(sqlite3_int64*)pArg += paf->iPgOne; 4044 rc = pFile->pMethods->xFileControl(pFile, op, pArg); 4045 if( rc==SQLITE_OK && op==SQLITE_FCNTL_VFSNAME ){ 4046 *(char**)pArg = sqlite3_mprintf("apnd(%lld)/%z", paf->iPgOne,*(char**)pArg); 4047 } 4048 return rc; 4049 } 4050 4051 /* 4052 ** Return the sector-size in bytes for an apnd-file. 4053 */ 4054 static int apndSectorSize(sqlite3_file *pFile){ 4055 pFile = ORIGFILE(pFile); 4056 return pFile->pMethods->xSectorSize(pFile); 4057 } 4058 4059 /* 4060 ** Return the device characteristic flags supported by an apnd-file. 4061 */ 4062 static int apndDeviceCharacteristics(sqlite3_file *pFile){ 4063 pFile = ORIGFILE(pFile); 4064 return pFile->pMethods->xDeviceCharacteristics(pFile); 4065 } 4066 4067 /* Create a shared memory file mapping */ 4068 static int apndShmMap( 4069 sqlite3_file *pFile, 4070 int iPg, 4071 int pgsz, 4072 int bExtend, 4073 void volatile **pp 4074 ){ 4075 pFile = ORIGFILE(pFile); 4076 return pFile->pMethods->xShmMap(pFile,iPg,pgsz,bExtend,pp); 4077 } 4078 4079 /* Perform locking on a shared-memory segment */ 4080 static int apndShmLock(sqlite3_file *pFile, int offset, int n, int flags){ 4081 pFile = ORIGFILE(pFile); 4082 return pFile->pMethods->xShmLock(pFile,offset,n,flags); 4083 } 4084 4085 /* Memory barrier operation on shared memory */ 4086 static void apndShmBarrier(sqlite3_file *pFile){ 4087 pFile = ORIGFILE(pFile); 4088 pFile->pMethods->xShmBarrier(pFile); 4089 } 4090 4091 /* Unmap a shared memory segment */ 4092 static int apndShmUnmap(sqlite3_file *pFile, int deleteFlag){ 4093 pFile = ORIGFILE(pFile); 4094 return pFile->pMethods->xShmUnmap(pFile,deleteFlag); 4095 } 4096 4097 /* Fetch a page of a memory-mapped file */ 4098 static int apndFetch( 4099 sqlite3_file *pFile, 4100 sqlite3_int64 iOfst, 4101 int iAmt, 4102 void **pp 4103 ){ 4104 ApndFile *p = (ApndFile *)pFile; 4105 if( p->iMark < 0 || iOfst+iAmt > p->iMark ){ 4106 return SQLITE_IOERR; /* Cannot read what is not yet there. */ 4107 } 4108 pFile = ORIGFILE(pFile); 4109 return pFile->pMethods->xFetch(pFile, iOfst+p->iPgOne, iAmt, pp); 4110 } 4111 4112 /* Release a memory-mapped page */ 4113 static int apndUnfetch(sqlite3_file *pFile, sqlite3_int64 iOfst, void *pPage){ 4114 ApndFile *p = (ApndFile *)pFile; 4115 pFile = ORIGFILE(pFile); 4116 return pFile->pMethods->xUnfetch(pFile, iOfst+p->iPgOne, pPage); 4117 } 4118 4119 /* 4120 ** Try to read the append-mark off the end of a file. Return the 4121 ** start of the appended database if the append-mark is present. 4122 ** If there is no valid append-mark, return -1; 4123 ** 4124 ** An append-mark is only valid if the NNNNNNNN start-of-database offset 4125 ** indicates that the appended database contains at least one page. The 4126 ** start-of-database value must be a multiple of 512. 4127 */ 4128 static sqlite3_int64 apndReadMark(sqlite3_int64 sz, sqlite3_file *pFile){ 4129 int rc, i; 4130 sqlite3_int64 iMark; 4131 int msbs = 8 * (APND_MARK_FOS_SZ-1); 4132 unsigned char a[APND_MARK_SIZE]; 4133 4134 if( APND_MARK_SIZE!=(sz & 0x1ff) ) return -1; 4135 rc = pFile->pMethods->xRead(pFile, a, APND_MARK_SIZE, sz-APND_MARK_SIZE); 4136 if( rc ) return -1; 4137 if( memcmp(a, APND_MARK_PREFIX, APND_MARK_PREFIX_SZ)!=0 ) return -1; 4138 iMark = ((sqlite3_int64)(a[APND_MARK_PREFIX_SZ] & 0x7f)) << msbs; 4139 for(i=1; i<8; i++){ 4140 msbs -= 8; 4141 iMark |= (sqlite3_int64)a[APND_MARK_PREFIX_SZ+i]<<msbs; 4142 } 4143 if( iMark > (sz - APND_MARK_SIZE - 512) ) return -1; 4144 if( iMark & 0x1ff ) return -1; 4145 return iMark; 4146 } 4147 4148 static const char apvfsSqliteHdr[] = "SQLite format 3"; 4149 /* 4150 ** Check to see if the file is an appendvfs SQLite database file. 4151 ** Return true iff it is such. Parameter sz is the file's size. 4152 */ 4153 static int apndIsAppendvfsDatabase(sqlite3_int64 sz, sqlite3_file *pFile){ 4154 int rc; 4155 char zHdr[16]; 4156 sqlite3_int64 iMark = apndReadMark(sz, pFile); 4157 if( iMark>=0 ){ 4158 /* If file has the correct end-marker, the expected odd size, and the 4159 ** SQLite DB type marker where the end-marker puts it, then it 4160 ** is an appendvfs database. 4161 */ 4162 rc = pFile->pMethods->xRead(pFile, zHdr, sizeof(zHdr), iMark); 4163 if( SQLITE_OK==rc 4164 && memcmp(zHdr, apvfsSqliteHdr, sizeof(zHdr))==0 4165 && (sz & 0x1ff) == APND_MARK_SIZE 4166 && sz>=512+APND_MARK_SIZE 4167 ){ 4168 return 1; /* It's an appendvfs database */ 4169 } 4170 } 4171 return 0; 4172 } 4173 4174 /* 4175 ** Check to see if the file is an ordinary SQLite database file. 4176 ** Return true iff so. Parameter sz is the file's size. 4177 */ 4178 static int apndIsOrdinaryDatabaseFile(sqlite3_int64 sz, sqlite3_file *pFile){ 4179 char zHdr[16]; 4180 if( apndIsAppendvfsDatabase(sz, pFile) /* rule 2 */ 4181 || (sz & 0x1ff) != 0 4182 || SQLITE_OK!=pFile->pMethods->xRead(pFile, zHdr, sizeof(zHdr), 0) 4183 || memcmp(zHdr, apvfsSqliteHdr, sizeof(zHdr))!=0 4184 ){ 4185 return 0; 4186 }else{ 4187 return 1; 4188 } 4189 } 4190 4191 /* 4192 ** Open an apnd file handle. 4193 */ 4194 static int apndOpen( 4195 sqlite3_vfs *pApndVfs, 4196 const char *zName, 4197 sqlite3_file *pFile, 4198 int flags, 4199 int *pOutFlags 4200 ){ 4201 ApndFile *pApndFile = (ApndFile*)pFile; 4202 sqlite3_file *pBaseFile = ORIGFILE(pFile); 4203 sqlite3_vfs *pBaseVfs = ORIGVFS(pApndVfs); 4204 int rc; 4205 sqlite3_int64 sz = 0; 4206 if( (flags & SQLITE_OPEN_MAIN_DB)==0 ){ 4207 /* The appendvfs is not to be used for transient or temporary databases. 4208 ** Just use the base VFS open to initialize the given file object and 4209 ** open the underlying file. (Appendvfs is then unused for this file.) 4210 */ 4211 return pBaseVfs->xOpen(pBaseVfs, zName, pFile, flags, pOutFlags); 4212 } 4213 memset(pApndFile, 0, sizeof(ApndFile)); 4214 pFile->pMethods = &apnd_io_methods; 4215 pApndFile->iMark = -1; /* Append mark not yet written */ 4216 4217 rc = pBaseVfs->xOpen(pBaseVfs, zName, pBaseFile, flags, pOutFlags); 4218 if( rc==SQLITE_OK ){ 4219 rc = pBaseFile->pMethods->xFileSize(pBaseFile, &sz); 4220 if( rc ){ 4221 pBaseFile->pMethods->xClose(pBaseFile); 4222 } 4223 } 4224 if( rc ){ 4225 pFile->pMethods = 0; 4226 return rc; 4227 } 4228 if( apndIsOrdinaryDatabaseFile(sz, pBaseFile) ){ 4229 /* The file being opened appears to be just an ordinary DB. Copy 4230 ** the base dispatch-table so this instance mimics the base VFS. 4231 */ 4232 memmove(pApndFile, pBaseFile, pBaseVfs->szOsFile); 4233 return SQLITE_OK; 4234 } 4235 pApndFile->iPgOne = apndReadMark(sz, pFile); 4236 if( pApndFile->iPgOne>=0 ){ 4237 pApndFile->iMark = sz - APND_MARK_SIZE; /* Append mark found */ 4238 return SQLITE_OK; 4239 } 4240 if( (flags & SQLITE_OPEN_CREATE)==0 ){ 4241 pBaseFile->pMethods->xClose(pBaseFile); 4242 rc = SQLITE_CANTOPEN; 4243 pFile->pMethods = 0; 4244 }else{ 4245 /* Round newly added appendvfs location to #define'd page boundary. 4246 ** Note that nothing has yet been written to the underlying file. 4247 ** The append mark will be written along with first content write. 4248 ** Until then, paf->iMark value indicates it is not yet written. 4249 */ 4250 pApndFile->iPgOne = APND_START_ROUNDUP(sz); 4251 } 4252 return rc; 4253 } 4254 4255 /* 4256 ** Delete an apnd file. 4257 ** For an appendvfs, this could mean delete the appendvfs portion, 4258 ** leaving the appendee as it was before it gained an appendvfs. 4259 ** For now, this code deletes the underlying file too. 4260 */ 4261 static int apndDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){ 4262 return ORIGVFS(pVfs)->xDelete(ORIGVFS(pVfs), zPath, dirSync); 4263 } 4264 4265 /* 4266 ** All other VFS methods are pass-thrus. 4267 */ 4268 static int apndAccess( 4269 sqlite3_vfs *pVfs, 4270 const char *zPath, 4271 int flags, 4272 int *pResOut 4273 ){ 4274 return ORIGVFS(pVfs)->xAccess(ORIGVFS(pVfs), zPath, flags, pResOut); 4275 } 4276 static int apndFullPathname( 4277 sqlite3_vfs *pVfs, 4278 const char *zPath, 4279 int nOut, 4280 char *zOut 4281 ){ 4282 return ORIGVFS(pVfs)->xFullPathname(ORIGVFS(pVfs),zPath,nOut,zOut); 4283 } 4284 static void *apndDlOpen(sqlite3_vfs *pVfs, const char *zPath){ 4285 return ORIGVFS(pVfs)->xDlOpen(ORIGVFS(pVfs), zPath); 4286 } 4287 static void apndDlError(sqlite3_vfs *pVfs, int nByte, char *zErrMsg){ 4288 ORIGVFS(pVfs)->xDlError(ORIGVFS(pVfs), nByte, zErrMsg); 4289 } 4290 static void (*apndDlSym(sqlite3_vfs *pVfs, void *p, const char *zSym))(void){ 4291 return ORIGVFS(pVfs)->xDlSym(ORIGVFS(pVfs), p, zSym); 4292 } 4293 static void apndDlClose(sqlite3_vfs *pVfs, void *pHandle){ 4294 ORIGVFS(pVfs)->xDlClose(ORIGVFS(pVfs), pHandle); 4295 } 4296 static int apndRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){ 4297 return ORIGVFS(pVfs)->xRandomness(ORIGVFS(pVfs), nByte, zBufOut); 4298 } 4299 static int apndSleep(sqlite3_vfs *pVfs, int nMicro){ 4300 return ORIGVFS(pVfs)->xSleep(ORIGVFS(pVfs), nMicro); 4301 } 4302 static int apndCurrentTime(sqlite3_vfs *pVfs, double *pTimeOut){ 4303 return ORIGVFS(pVfs)->xCurrentTime(ORIGVFS(pVfs), pTimeOut); 4304 } 4305 static int apndGetLastError(sqlite3_vfs *pVfs, int a, char *b){ 4306 return ORIGVFS(pVfs)->xGetLastError(ORIGVFS(pVfs), a, b); 4307 } 4308 static int apndCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *p){ 4309 return ORIGVFS(pVfs)->xCurrentTimeInt64(ORIGVFS(pVfs), p); 4310 } 4311 static int apndSetSystemCall( 4312 sqlite3_vfs *pVfs, 4313 const char *zName, 4314 sqlite3_syscall_ptr pCall 4315 ){ 4316 return ORIGVFS(pVfs)->xSetSystemCall(ORIGVFS(pVfs),zName,pCall); 4317 } 4318 static sqlite3_syscall_ptr apndGetSystemCall( 4319 sqlite3_vfs *pVfs, 4320 const char *zName 4321 ){ 4322 return ORIGVFS(pVfs)->xGetSystemCall(ORIGVFS(pVfs),zName); 4323 } 4324 static const char *apndNextSystemCall(sqlite3_vfs *pVfs, const char *zName){ 4325 return ORIGVFS(pVfs)->xNextSystemCall(ORIGVFS(pVfs), zName); 4326 } 4327 4328 4329 #ifdef _WIN32 4330 4331 #endif 4332 /* 4333 ** This routine is called when the extension is loaded. 4334 ** Register the new VFS. 4335 */ 4336 int sqlite3_appendvfs_init( 4337 sqlite3 *db, 4338 char **pzErrMsg, 4339 const sqlite3_api_routines *pApi 4340 ){ 4341 int rc = SQLITE_OK; 4342 sqlite3_vfs *pOrig; 4343 SQLITE_EXTENSION_INIT2(pApi); 4344 (void)pzErrMsg; 4345 (void)db; 4346 pOrig = sqlite3_vfs_find(0); 4347 if( pOrig==0 ) return SQLITE_ERROR; 4348 apnd_vfs.iVersion = pOrig->iVersion; 4349 apnd_vfs.pAppData = pOrig; 4350 apnd_vfs.szOsFile = pOrig->szOsFile + sizeof(ApndFile); 4351 rc = sqlite3_vfs_register(&apnd_vfs, 0); 4352 #ifdef APPENDVFS_TEST 4353 if( rc==SQLITE_OK ){ 4354 rc = sqlite3_auto_extension((void(*)(void))apndvfsRegister); 4355 } 4356 #endif 4357 if( rc==SQLITE_OK ) rc = SQLITE_OK_LOAD_PERMANENTLY; 4358 return rc; 4359 } 4360 4361 /************************* End ../ext/misc/appendvfs.c ********************/ 4362 /************************* Begin ../ext/misc/memtrace.c ******************/ 4363 /* 4364 ** 2019-01-21 4365 ** 4366 ** The author disclaims copyright to this source code. In place of 4367 ** a legal notice, here is a blessing: 4368 ** 4369 ** May you do good and not evil. 4370 ** May you find forgiveness for yourself and forgive others. 4371 ** May you share freely, never taking more than you give. 4372 ** 4373 ************************************************************************* 4374 ** 4375 ** This file implements an extension that uses the SQLITE_CONFIG_MALLOC 4376 ** mechanism to add a tracing layer on top of SQLite. If this extension 4377 ** is registered prior to sqlite3_initialize(), it will cause all memory 4378 ** allocation activities to be logged on standard output, or to some other 4379 ** FILE specified by the initializer. 4380 ** 4381 ** This file needs to be compiled into the application that uses it. 4382 ** 4383 ** This extension is used to implement the --memtrace option of the 4384 ** command-line shell. 4385 */ 4386 #include <assert.h> 4387 #include <string.h> 4388 #include <stdio.h> 4389 4390 /* The original memory allocation routines */ 4391 static sqlite3_mem_methods memtraceBase; 4392 static FILE *memtraceOut; 4393 4394 /* Methods that trace memory allocations */ 4395 static void *memtraceMalloc(int n){ 4396 if( memtraceOut ){ 4397 fprintf(memtraceOut, "MEMTRACE: allocate %d bytes\n", 4398 memtraceBase.xRoundup(n)); 4399 } 4400 return memtraceBase.xMalloc(n); 4401 } 4402 static void memtraceFree(void *p){ 4403 if( p==0 ) return; 4404 if( memtraceOut ){ 4405 fprintf(memtraceOut, "MEMTRACE: free %d bytes\n", memtraceBase.xSize(p)); 4406 } 4407 memtraceBase.xFree(p); 4408 } 4409 static void *memtraceRealloc(void *p, int n){ 4410 if( p==0 ) return memtraceMalloc(n); 4411 if( n==0 ){ 4412 memtraceFree(p); 4413 return 0; 4414 } 4415 if( memtraceOut ){ 4416 fprintf(memtraceOut, "MEMTRACE: resize %d -> %d bytes\n", 4417 memtraceBase.xSize(p), memtraceBase.xRoundup(n)); 4418 } 4419 return memtraceBase.xRealloc(p, n); 4420 } 4421 static int memtraceSize(void *p){ 4422 return memtraceBase.xSize(p); 4423 } 4424 static int memtraceRoundup(int n){ 4425 return memtraceBase.xRoundup(n); 4426 } 4427 static int memtraceInit(void *p){ 4428 return memtraceBase.xInit(p); 4429 } 4430 static void memtraceShutdown(void *p){ 4431 memtraceBase.xShutdown(p); 4432 } 4433 4434 /* The substitute memory allocator */ 4435 static sqlite3_mem_methods ersaztMethods = { 4436 memtraceMalloc, 4437 memtraceFree, 4438 memtraceRealloc, 4439 memtraceSize, 4440 memtraceRoundup, 4441 memtraceInit, 4442 memtraceShutdown, 4443 0 4444 }; 4445 4446 /* Begin tracing memory allocations to out. */ 4447 int sqlite3MemTraceActivate(FILE *out){ 4448 int rc = SQLITE_OK; 4449 if( memtraceBase.xMalloc==0 ){ 4450 rc = sqlite3_config(SQLITE_CONFIG_GETMALLOC, &memtraceBase); 4451 if( rc==SQLITE_OK ){ 4452 rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &ersaztMethods); 4453 } 4454 } 4455 memtraceOut = out; 4456 return rc; 4457 } 4458 4459 /* Deactivate memory tracing */ 4460 int sqlite3MemTraceDeactivate(void){ 4461 int rc = SQLITE_OK; 4462 if( memtraceBase.xMalloc!=0 ){ 4463 rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &memtraceBase); 4464 if( rc==SQLITE_OK ){ 4465 memset(&memtraceBase, 0, sizeof(memtraceBase)); 4466 } 4467 } 4468 memtraceOut = 0; 4469 return rc; 4470 } 4471 4472 /************************* End ../ext/misc/memtrace.c ********************/ 4473 /************************* Begin ../ext/misc/uint.c ******************/ 4474 /* 4475 ** 2020-04-14 4476 ** 4477 ** The author disclaims copyright to this source code. In place of 4478 ** a legal notice, here is a blessing: 4479 ** 4480 ** May you do good and not evil. 4481 ** May you find forgiveness for yourself and forgive others. 4482 ** May you share freely, never taking more than you give. 4483 ** 4484 ****************************************************************************** 4485 ** 4486 ** This SQLite extension implements the UINT collating sequence. 4487 ** 4488 ** UINT works like BINARY for text, except that embedded strings 4489 ** of digits compare in numeric order. 4490 ** 4491 ** * Leading zeros are handled properly, in the sense that 4492 ** they do not mess of the maginitude comparison of embedded 4493 ** strings of digits. "x00123y" is equal to "x123y". 4494 ** 4495 ** * Only unsigned integers are recognized. Plus and minus 4496 ** signs are ignored. Decimal points and exponential notation 4497 ** are ignored. 4498 ** 4499 ** * Embedded integers can be of arbitrary length. Comparison 4500 ** is *not* limited integers that can be expressed as a 4501 ** 64-bit machine integer. 4502 */ 4503 /* #include "sqlite3ext.h" */ 4504 SQLITE_EXTENSION_INIT1 4505 #include <assert.h> 4506 #include <string.h> 4507 #include <ctype.h> 4508 4509 /* 4510 ** Compare text in lexicographic order, except strings of digits 4511 ** compare in numeric order. 4512 */ 4513 static int uintCollFunc( 4514 void *notUsed, 4515 int nKey1, const void *pKey1, 4516 int nKey2, const void *pKey2 4517 ){ 4518 const unsigned char *zA = (const unsigned char*)pKey1; 4519 const unsigned char *zB = (const unsigned char*)pKey2; 4520 int i=0, j=0, x; 4521 (void)notUsed; 4522 while( i<nKey1 && j<nKey2 ){ 4523 x = zA[i] - zB[j]; 4524 if( isdigit(zA[i]) ){ 4525 int k; 4526 if( !isdigit(zB[j]) ) return x; 4527 while( i<nKey1 && zA[i]=='0' ){ i++; } 4528 while( j<nKey2 && zB[j]=='0' ){ j++; } 4529 k = 0; 4530 while( i+k<nKey1 && isdigit(zA[i+k]) 4531 && j+k<nKey2 && isdigit(zB[j+k]) ){ 4532 k++; 4533 } 4534 if( i+k<nKey1 && isdigit(zA[i+k]) ){ 4535 return +1; 4536 }else if( j+k<nKey2 && isdigit(zB[j+k]) ){ 4537 return -1; 4538 }else{ 4539 x = memcmp(zA+i, zB+j, k); 4540 if( x ) return x; 4541 i += k; 4542 j += k; 4543 } 4544 }else if( x ){ 4545 return x; 4546 }else{ 4547 i++; 4548 j++; 4549 } 4550 } 4551 return (nKey1 - i) - (nKey2 - j); 4552 } 4553 4554 #ifdef _WIN32 4555 4556 #endif 4557 int sqlite3_uint_init( 4558 sqlite3 *db, 4559 char **pzErrMsg, 4560 const sqlite3_api_routines *pApi 4561 ){ 4562 SQLITE_EXTENSION_INIT2(pApi); 4563 (void)pzErrMsg; /* Unused parameter */ 4564 return sqlite3_create_collation(db, "uint", SQLITE_UTF8, 0, uintCollFunc); 4565 } 4566 4567 /************************* End ../ext/misc/uint.c ********************/ 4568 /************************* Begin ../ext/misc/decimal.c ******************/ 4569 /* 4570 ** 2020-06-22 4571 ** 4572 ** The author disclaims copyright to this source code. In place of 4573 ** a legal notice, here is a blessing: 4574 ** 4575 ** May you do good and not evil. 4576 ** May you find forgiveness for yourself and forgive others. 4577 ** May you share freely, never taking more than you give. 4578 ** 4579 ****************************************************************************** 4580 ** 4581 ** Routines to implement arbitrary-precision decimal math. 4582 ** 4583 ** The focus here is on simplicity and correctness, not performance. 4584 */ 4585 /* #include "sqlite3ext.h" */ 4586 SQLITE_EXTENSION_INIT1 4587 #include <assert.h> 4588 #include <string.h> 4589 #include <ctype.h> 4590 #include <stdlib.h> 4591 4592 /* Mark a function parameter as unused, to suppress nuisance compiler 4593 ** warnings. */ 4594 #ifndef UNUSED_PARAMETER 4595 # define UNUSED_PARAMETER(X) (void)(X) 4596 #endif 4597 4598 4599 /* A decimal object */ 4600 typedef struct Decimal Decimal; 4601 struct Decimal { 4602 char sign; /* 0 for positive, 1 for negative */ 4603 char oom; /* True if an OOM is encountered */ 4604 char isNull; /* True if holds a NULL rather than a number */ 4605 char isInit; /* True upon initialization */ 4606 int nDigit; /* Total number of digits */ 4607 int nFrac; /* Number of digits to the right of the decimal point */ 4608 signed char *a; /* Array of digits. Most significant first. */ 4609 }; 4610 4611 /* 4612 ** Release memory held by a Decimal, but do not free the object itself. 4613 */ 4614 static void decimal_clear(Decimal *p){ 4615 sqlite3_free(p->a); 4616 } 4617 4618 /* 4619 ** Destroy a Decimal object 4620 */ 4621 static void decimal_free(Decimal *p){ 4622 if( p ){ 4623 decimal_clear(p); 4624 sqlite3_free(p); 4625 } 4626 } 4627 4628 /* 4629 ** Allocate a new Decimal object. Initialize it to the number given 4630 ** by the input string. 4631 */ 4632 static Decimal *decimal_new( 4633 sqlite3_context *pCtx, 4634 sqlite3_value *pIn, 4635 int nAlt, 4636 const unsigned char *zAlt 4637 ){ 4638 Decimal *p; 4639 int n, i; 4640 const unsigned char *zIn; 4641 int iExp = 0; 4642 p = sqlite3_malloc( sizeof(*p) ); 4643 if( p==0 ) goto new_no_mem; 4644 p->sign = 0; 4645 p->oom = 0; 4646 p->isInit = 1; 4647 p->isNull = 0; 4648 p->nDigit = 0; 4649 p->nFrac = 0; 4650 if( zAlt ){ 4651 n = nAlt, 4652 zIn = zAlt; 4653 }else{ 4654 if( sqlite3_value_type(pIn)==SQLITE_NULL ){ 4655 p->a = 0; 4656 p->isNull = 1; 4657 return p; 4658 } 4659 n = sqlite3_value_bytes(pIn); 4660 zIn = sqlite3_value_text(pIn); 4661 } 4662 p->a = sqlite3_malloc64( n+1 ); 4663 if( p->a==0 ) goto new_no_mem; 4664 for(i=0; isspace(zIn[i]); i++){} 4665 if( zIn[i]=='-' ){ 4666 p->sign = 1; 4667 i++; 4668 }else if( zIn[i]=='+' ){ 4669 i++; 4670 } 4671 while( i<n && zIn[i]=='0' ) i++; 4672 while( i<n ){ 4673 char c = zIn[i]; 4674 if( c>='0' && c<='9' ){ 4675 p->a[p->nDigit++] = c - '0'; 4676 }else if( c=='.' ){ 4677 p->nFrac = p->nDigit + 1; 4678 }else if( c=='e' || c=='E' ){ 4679 int j = i+1; 4680 int neg = 0; 4681 if( j>=n ) break; 4682 if( zIn[j]=='-' ){ 4683 neg = 1; 4684 j++; 4685 }else if( zIn[j]=='+' ){ 4686 j++; 4687 } 4688 while( j<n && iExp<1000000 ){ 4689 if( zIn[j]>='0' && zIn[j]<='9' ){ 4690 iExp = iExp*10 + zIn[j] - '0'; 4691 } 4692 j++; 4693 } 4694 if( neg ) iExp = -iExp; 4695 break; 4696 } 4697 i++; 4698 } 4699 if( p->nFrac ){ 4700 p->nFrac = p->nDigit - (p->nFrac - 1); 4701 } 4702 if( iExp>0 ){ 4703 if( p->nFrac>0 ){ 4704 if( iExp<=p->nFrac ){ 4705 p->nFrac -= iExp; 4706 iExp = 0; 4707 }else{ 4708 iExp -= p->nFrac; 4709 p->nFrac = 0; 4710 } 4711 } 4712 if( iExp>0 ){ 4713 p->a = sqlite3_realloc64(p->a, p->nDigit + iExp + 1 ); 4714 if( p->a==0 ) goto new_no_mem; 4715 memset(p->a+p->nDigit, 0, iExp); 4716 p->nDigit += iExp; 4717 } 4718 }else if( iExp<0 ){ 4719 int nExtra; 4720 iExp = -iExp; 4721 nExtra = p->nDigit - p->nFrac - 1; 4722 if( nExtra ){ 4723 if( nExtra>=iExp ){ 4724 p->nFrac += iExp; 4725 iExp = 0; 4726 }else{ 4727 iExp -= nExtra; 4728 p->nFrac = p->nDigit - 1; 4729 } 4730 } 4731 if( iExp>0 ){ 4732 p->a = sqlite3_realloc64(p->a, p->nDigit + iExp + 1 ); 4733 if( p->a==0 ) goto new_no_mem; 4734 memmove(p->a+iExp, p->a, p->nDigit); 4735 memset(p->a, 0, iExp); 4736 p->nDigit += iExp; 4737 p->nFrac += iExp; 4738 } 4739 } 4740 return p; 4741 4742 new_no_mem: 4743 if( pCtx ) sqlite3_result_error_nomem(pCtx); 4744 sqlite3_free(p); 4745 return 0; 4746 } 4747 4748 /* 4749 ** Make the given Decimal the result. 4750 */ 4751 static void decimal_result(sqlite3_context *pCtx, Decimal *p){ 4752 char *z; 4753 int i, j; 4754 int n; 4755 if( p==0 || p->oom ){ 4756 sqlite3_result_error_nomem(pCtx); 4757 return; 4758 } 4759 if( p->isNull ){ 4760 sqlite3_result_null(pCtx); 4761 return; 4762 } 4763 z = sqlite3_malloc( p->nDigit+4 ); 4764 if( z==0 ){ 4765 sqlite3_result_error_nomem(pCtx); 4766 return; 4767 } 4768 i = 0; 4769 if( p->nDigit==0 || (p->nDigit==1 && p->a[0]==0) ){ 4770 p->sign = 0; 4771 } 4772 if( p->sign ){ 4773 z[0] = '-'; 4774 i = 1; 4775 } 4776 n = p->nDigit - p->nFrac; 4777 if( n<=0 ){ 4778 z[i++] = '0'; 4779 } 4780 j = 0; 4781 while( n>1 && p->a[j]==0 ){ 4782 j++; 4783 n--; 4784 } 4785 while( n>0 ){ 4786 z[i++] = p->a[j] + '0'; 4787 j++; 4788 n--; 4789 } 4790 if( p->nFrac ){ 4791 z[i++] = '.'; 4792 do{ 4793 z[i++] = p->a[j] + '0'; 4794 j++; 4795 }while( j<p->nDigit ); 4796 } 4797 z[i] = 0; 4798 sqlite3_result_text(pCtx, z, i, sqlite3_free); 4799 } 4800 4801 /* 4802 ** SQL Function: decimal(X) 4803 ** 4804 ** Convert input X into decimal and then back into text 4805 */ 4806 static void decimalFunc( 4807 sqlite3_context *context, 4808 int argc, 4809 sqlite3_value **argv 4810 ){ 4811 Decimal *p = decimal_new(context, argv[0], 0, 0); 4812 UNUSED_PARAMETER(argc); 4813 decimal_result(context, p); 4814 decimal_free(p); 4815 } 4816 4817 /* 4818 ** Compare to Decimal objects. Return negative, 0, or positive if the 4819 ** first object is less than, equal to, or greater than the second. 4820 ** 4821 ** Preconditions for this routine: 4822 ** 4823 ** pA!=0 4824 ** pA->isNull==0 4825 ** pB!=0 4826 ** pB->isNull==0 4827 */ 4828 static int decimal_cmp(const Decimal *pA, const Decimal *pB){ 4829 int nASig, nBSig, rc, n; 4830 if( pA->sign!=pB->sign ){ 4831 return pA->sign ? -1 : +1; 4832 } 4833 if( pA->sign ){ 4834 const Decimal *pTemp = pA; 4835 pA = pB; 4836 pB = pTemp; 4837 } 4838 nASig = pA->nDigit - pA->nFrac; 4839 nBSig = pB->nDigit - pB->nFrac; 4840 if( nASig!=nBSig ){ 4841 return nASig - nBSig; 4842 } 4843 n = pA->nDigit; 4844 if( n>pB->nDigit ) n = pB->nDigit; 4845 rc = memcmp(pA->a, pB->a, n); 4846 if( rc==0 ){ 4847 rc = pA->nDigit - pB->nDigit; 4848 } 4849 return rc; 4850 } 4851 4852 /* 4853 ** SQL Function: decimal_cmp(X, Y) 4854 ** 4855 ** Return negative, zero, or positive if X is less then, equal to, or 4856 ** greater than Y. 4857 */ 4858 static void decimalCmpFunc( 4859 sqlite3_context *context, 4860 int argc, 4861 sqlite3_value **argv 4862 ){ 4863 Decimal *pA = 0, *pB = 0; 4864 int rc; 4865 4866 UNUSED_PARAMETER(argc); 4867 pA = decimal_new(context, argv[0], 0, 0); 4868 if( pA==0 || pA->isNull ) goto cmp_done; 4869 pB = decimal_new(context, argv[1], 0, 0); 4870 if( pB==0 || pB->isNull ) goto cmp_done; 4871 rc = decimal_cmp(pA, pB); 4872 if( rc<0 ) rc = -1; 4873 else if( rc>0 ) rc = +1; 4874 sqlite3_result_int(context, rc); 4875 cmp_done: 4876 decimal_free(pA); 4877 decimal_free(pB); 4878 } 4879 4880 /* 4881 ** Expand the Decimal so that it has a least nDigit digits and nFrac 4882 ** digits to the right of the decimal point. 4883 */ 4884 static void decimal_expand(Decimal *p, int nDigit, int nFrac){ 4885 int nAddSig; 4886 int nAddFrac; 4887 if( p==0 ) return; 4888 nAddFrac = nFrac - p->nFrac; 4889 nAddSig = (nDigit - p->nDigit) - nAddFrac; 4890 if( nAddFrac==0 && nAddSig==0 ) return; 4891 p->a = sqlite3_realloc64(p->a, nDigit+1); 4892 if( p->a==0 ){ 4893 p->oom = 1; 4894 return; 4895 } 4896 if( nAddSig ){ 4897 memmove(p->a+nAddSig, p->a, p->nDigit); 4898 memset(p->a, 0, nAddSig); 4899 p->nDigit += nAddSig; 4900 } 4901 if( nAddFrac ){ 4902 memset(p->a+p->nDigit, 0, nAddFrac); 4903 p->nDigit += nAddFrac; 4904 p->nFrac += nAddFrac; 4905 } 4906 } 4907 4908 /* 4909 ** Add the value pB into pA. 4910 ** 4911 ** Both pA and pB might become denormalized by this routine. 4912 */ 4913 static void decimal_add(Decimal *pA, Decimal *pB){ 4914 int nSig, nFrac, nDigit; 4915 int i, rc; 4916 if( pA==0 ){ 4917 return; 4918 } 4919 if( pA->oom || pB==0 || pB->oom ){ 4920 pA->oom = 1; 4921 return; 4922 } 4923 if( pA->isNull || pB->isNull ){ 4924 pA->isNull = 1; 4925 return; 4926 } 4927 nSig = pA->nDigit - pA->nFrac; 4928 if( nSig && pA->a[0]==0 ) nSig--; 4929 if( nSig<pB->nDigit-pB->nFrac ){ 4930 nSig = pB->nDigit - pB->nFrac; 4931 } 4932 nFrac = pA->nFrac; 4933 if( nFrac<pB->nFrac ) nFrac = pB->nFrac; 4934 nDigit = nSig + nFrac + 1; 4935 decimal_expand(pA, nDigit, nFrac); 4936 decimal_expand(pB, nDigit, nFrac); 4937 if( pA->oom || pB->oom ){ 4938 pA->oom = 1; 4939 }else{ 4940 if( pA->sign==pB->sign ){ 4941 int carry = 0; 4942 for(i=nDigit-1; i>=0; i--){ 4943 int x = pA->a[i] + pB->a[i] + carry; 4944 if( x>=10 ){ 4945 carry = 1; 4946 pA->a[i] = x - 10; 4947 }else{ 4948 carry = 0; 4949 pA->a[i] = x; 4950 } 4951 } 4952 }else{ 4953 signed char *aA, *aB; 4954 int borrow = 0; 4955 rc = memcmp(pA->a, pB->a, nDigit); 4956 if( rc<0 ){ 4957 aA = pB->a; 4958 aB = pA->a; 4959 pA->sign = !pA->sign; 4960 }else{ 4961 aA = pA->a; 4962 aB = pB->a; 4963 } 4964 for(i=nDigit-1; i>=0; i--){ 4965 int x = aA[i] - aB[i] - borrow; 4966 if( x<0 ){ 4967 pA->a[i] = x+10; 4968 borrow = 1; 4969 }else{ 4970 pA->a[i] = x; 4971 borrow = 0; 4972 } 4973 } 4974 } 4975 } 4976 } 4977 4978 /* 4979 ** Compare text in decimal order. 4980 */ 4981 static int decimalCollFunc( 4982 void *notUsed, 4983 int nKey1, const void *pKey1, 4984 int nKey2, const void *pKey2 4985 ){ 4986 const unsigned char *zA = (const unsigned char*)pKey1; 4987 const unsigned char *zB = (const unsigned char*)pKey2; 4988 Decimal *pA = decimal_new(0, 0, nKey1, zA); 4989 Decimal *pB = decimal_new(0, 0, nKey2, zB); 4990 int rc; 4991 UNUSED_PARAMETER(notUsed); 4992 if( pA==0 || pB==0 ){ 4993 rc = 0; 4994 }else{ 4995 rc = decimal_cmp(pA, pB); 4996 } 4997 decimal_free(pA); 4998 decimal_free(pB); 4999 return rc; 5000 } 5001 5002 5003 /* 5004 ** SQL Function: decimal_add(X, Y) 5005 ** decimal_sub(X, Y) 5006 ** 5007 ** Return the sum or difference of X and Y. 5008 */ 5009 static void decimalAddFunc( 5010 sqlite3_context *context, 5011 int argc, 5012 sqlite3_value **argv 5013 ){ 5014 Decimal *pA = decimal_new(context, argv[0], 0, 0); 5015 Decimal *pB = decimal_new(context, argv[1], 0, 0); 5016 UNUSED_PARAMETER(argc); 5017 decimal_add(pA, pB); 5018 decimal_result(context, pA); 5019 decimal_free(pA); 5020 decimal_free(pB); 5021 } 5022 static void decimalSubFunc( 5023 sqlite3_context *context, 5024 int argc, 5025 sqlite3_value **argv 5026 ){ 5027 Decimal *pA = decimal_new(context, argv[0], 0, 0); 5028 Decimal *pB = decimal_new(context, argv[1], 0, 0); 5029 UNUSED_PARAMETER(argc); 5030 if( pB ){ 5031 pB->sign = !pB->sign; 5032 decimal_add(pA, pB); 5033 decimal_result(context, pA); 5034 } 5035 decimal_free(pA); 5036 decimal_free(pB); 5037 } 5038 5039 /* Aggregate funcion: decimal_sum(X) 5040 ** 5041 ** Works like sum() except that it uses decimal arithmetic for unlimited 5042 ** precision. 5043 */ 5044 static void decimalSumStep( 5045 sqlite3_context *context, 5046 int argc, 5047 sqlite3_value **argv 5048 ){ 5049 Decimal *p; 5050 Decimal *pArg; 5051 UNUSED_PARAMETER(argc); 5052 p = sqlite3_aggregate_context(context, sizeof(*p)); 5053 if( p==0 ) return; 5054 if( !p->isInit ){ 5055 p->isInit = 1; 5056 p->a = sqlite3_malloc(2); 5057 if( p->a==0 ){ 5058 p->oom = 1; 5059 }else{ 5060 p->a[0] = 0; 5061 } 5062 p->nDigit = 1; 5063 p->nFrac = 0; 5064 } 5065 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; 5066 pArg = decimal_new(context, argv[0], 0, 0); 5067 decimal_add(p, pArg); 5068 decimal_free(pArg); 5069 } 5070 static void decimalSumInverse( 5071 sqlite3_context *context, 5072 int argc, 5073 sqlite3_value **argv 5074 ){ 5075 Decimal *p; 5076 Decimal *pArg; 5077 UNUSED_PARAMETER(argc); 5078 p = sqlite3_aggregate_context(context, sizeof(*p)); 5079 if( p==0 ) return; 5080 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; 5081 pArg = decimal_new(context, argv[0], 0, 0); 5082 if( pArg ) pArg->sign = !pArg->sign; 5083 decimal_add(p, pArg); 5084 decimal_free(pArg); 5085 } 5086 static void decimalSumValue(sqlite3_context *context){ 5087 Decimal *p = sqlite3_aggregate_context(context, 0); 5088 if( p==0 ) return; 5089 decimal_result(context, p); 5090 } 5091 static void decimalSumFinalize(sqlite3_context *context){ 5092 Decimal *p = sqlite3_aggregate_context(context, 0); 5093 if( p==0 ) return; 5094 decimal_result(context, p); 5095 decimal_clear(p); 5096 } 5097 5098 /* 5099 ** SQL Function: decimal_mul(X, Y) 5100 ** 5101 ** Return the product of X and Y. 5102 ** 5103 ** All significant digits after the decimal point are retained. 5104 ** Trailing zeros after the decimal point are omitted as long as 5105 ** the number of digits after the decimal point is no less than 5106 ** either the number of digits in either input. 5107 */ 5108 static void decimalMulFunc( 5109 sqlite3_context *context, 5110 int argc, 5111 sqlite3_value **argv 5112 ){ 5113 Decimal *pA = decimal_new(context, argv[0], 0, 0); 5114 Decimal *pB = decimal_new(context, argv[1], 0, 0); 5115 signed char *acc = 0; 5116 int i, j, k; 5117 int minFrac; 5118 UNUSED_PARAMETER(argc); 5119 if( pA==0 || pA->oom || pA->isNull 5120 || pB==0 || pB->oom || pB->isNull 5121 ){ 5122 goto mul_end; 5123 } 5124 acc = sqlite3_malloc64( pA->nDigit + pB->nDigit + 2 ); 5125 if( acc==0 ){ 5126 sqlite3_result_error_nomem(context); 5127 goto mul_end; 5128 } 5129 memset(acc, 0, pA->nDigit + pB->nDigit + 2); 5130 minFrac = pA->nFrac; 5131 if( pB->nFrac<minFrac ) minFrac = pB->nFrac; 5132 for(i=pA->nDigit-1; i>=0; i--){ 5133 signed char f = pA->a[i]; 5134 int carry = 0, x; 5135 for(j=pB->nDigit-1, k=i+j+3; j>=0; j--, k--){ 5136 x = acc[k] + f*pB->a[j] + carry; 5137 acc[k] = x%10; 5138 carry = x/10; 5139 } 5140 x = acc[k] + carry; 5141 acc[k] = x%10; 5142 acc[k-1] += x/10; 5143 } 5144 sqlite3_free(pA->a); 5145 pA->a = acc; 5146 acc = 0; 5147 pA->nDigit += pB->nDigit + 2; 5148 pA->nFrac += pB->nFrac; 5149 pA->sign ^= pB->sign; 5150 while( pA->nFrac>minFrac && pA->a[pA->nDigit-1]==0 ){ 5151 pA->nFrac--; 5152 pA->nDigit--; 5153 } 5154 decimal_result(context, pA); 5155 5156 mul_end: 5157 sqlite3_free(acc); 5158 decimal_free(pA); 5159 decimal_free(pB); 5160 } 5161 5162 #ifdef _WIN32 5163 5164 #endif 5165 int sqlite3_decimal_init( 5166 sqlite3 *db, 5167 char **pzErrMsg, 5168 const sqlite3_api_routines *pApi 5169 ){ 5170 int rc = SQLITE_OK; 5171 static const struct { 5172 const char *zFuncName; 5173 int nArg; 5174 void (*xFunc)(sqlite3_context*,int,sqlite3_value**); 5175 } aFunc[] = { 5176 { "decimal", 1, decimalFunc }, 5177 { "decimal_cmp", 2, decimalCmpFunc }, 5178 { "decimal_add", 2, decimalAddFunc }, 5179 { "decimal_sub", 2, decimalSubFunc }, 5180 { "decimal_mul", 2, decimalMulFunc }, 5181 }; 5182 unsigned int i; 5183 (void)pzErrMsg; /* Unused parameter */ 5184 5185 SQLITE_EXTENSION_INIT2(pApi); 5186 5187 for(i=0; i<sizeof(aFunc)/sizeof(aFunc[0]) && rc==SQLITE_OK; i++){ 5188 rc = sqlite3_create_function(db, aFunc[i].zFuncName, aFunc[i].nArg, 5189 SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC, 5190 0, aFunc[i].xFunc, 0, 0); 5191 } 5192 if( rc==SQLITE_OK ){ 5193 rc = sqlite3_create_window_function(db, "decimal_sum", 1, 5194 SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC, 0, 5195 decimalSumStep, decimalSumFinalize, 5196 decimalSumValue, decimalSumInverse, 0); 5197 } 5198 if( rc==SQLITE_OK ){ 5199 rc = sqlite3_create_collation(db, "decimal", SQLITE_UTF8, 5200 0, decimalCollFunc); 5201 } 5202 return rc; 5203 } 5204 5205 /************************* End ../ext/misc/decimal.c ********************/ 5206 /************************* Begin ../ext/misc/ieee754.c ******************/ 5207 /* 5208 ** 2013-04-17 5209 ** 5210 ** The author disclaims copyright to this source code. In place of 5211 ** a legal notice, here is a blessing: 5212 ** 5213 ** May you do good and not evil. 5214 ** May you find forgiveness for yourself and forgive others. 5215 ** May you share freely, never taking more than you give. 5216 ** 5217 ****************************************************************************** 5218 ** 5219 ** This SQLite extension implements functions for the exact display 5220 ** and input of IEEE754 Binary64 floating-point numbers. 5221 ** 5222 ** ieee754(X) 5223 ** ieee754(Y,Z) 5224 ** 5225 ** In the first form, the value X should be a floating-point number. 5226 ** The function will return a string of the form 'ieee754(Y,Z)' where 5227 ** Y and Z are integers such that X==Y*pow(2,Z). 5228 ** 5229 ** In the second form, Y and Z are integers which are the mantissa and 5230 ** base-2 exponent of a new floating point number. The function returns 5231 ** a floating-point value equal to Y*pow(2,Z). 5232 ** 5233 ** Examples: 5234 ** 5235 ** ieee754(2.0) -> 'ieee754(2,0)' 5236 ** ieee754(45.25) -> 'ieee754(181,-2)' 5237 ** ieee754(2, 0) -> 2.0 5238 ** ieee754(181, -2) -> 45.25 5239 ** 5240 ** Two additional functions break apart the one-argument ieee754() 5241 ** result into separate integer values: 5242 ** 5243 ** ieee754_mantissa(45.25) -> 181 5244 ** ieee754_exponent(45.25) -> -2 5245 ** 5246 ** These functions convert binary64 numbers into blobs and back again. 5247 ** 5248 ** ieee754_from_blob(x'3ff0000000000000') -> 1.0 5249 ** ieee754_to_blob(1.0) -> x'3ff0000000000000' 5250 ** 5251 ** In all single-argument functions, if the argument is an 8-byte blob 5252 ** then that blob is interpreted as a big-endian binary64 value. 5253 ** 5254 ** 5255 ** EXACT DECIMAL REPRESENTATION OF BINARY64 VALUES 5256 ** ----------------------------------------------- 5257 ** 5258 ** This extension in combination with the separate 'decimal' extension 5259 ** can be used to compute the exact decimal representation of binary64 5260 ** values. To begin, first compute a table of exponent values: 5261 ** 5262 ** CREATE TABLE pow2(x INTEGER PRIMARY KEY, v TEXT); 5263 ** WITH RECURSIVE c(x,v) AS ( 5264 ** VALUES(0,'1') 5265 ** UNION ALL 5266 ** SELECT x+1, decimal_mul(v,'2') FROM c WHERE x+1<=971 5267 ** ) INSERT INTO pow2(x,v) SELECT x, v FROM c; 5268 ** WITH RECURSIVE c(x,v) AS ( 5269 ** VALUES(-1,'0.5') 5270 ** UNION ALL 5271 ** SELECT x-1, decimal_mul(v,'0.5') FROM c WHERE x-1>=-1075 5272 ** ) INSERT INTO pow2(x,v) SELECT x, v FROM c; 5273 ** 5274 ** Then, to compute the exact decimal representation of a floating 5275 ** point value (the value 47.49 is used in the example) do: 5276 ** 5277 ** WITH c(n) AS (VALUES(47.49)) 5278 ** ---------------^^^^^---- Replace with whatever you want 5279 ** SELECT decimal_mul(ieee754_mantissa(c.n),pow2.v) 5280 ** FROM pow2, c WHERE pow2.x=ieee754_exponent(c.n); 5281 ** 5282 ** Here is a query to show various boundry values for the binary64 5283 ** number format: 5284 ** 5285 ** WITH c(name,bin) AS (VALUES 5286 ** ('minimum positive value', x'0000000000000001'), 5287 ** ('maximum subnormal value', x'000fffffffffffff'), 5288 ** ('mininum positive nornal value', x'0010000000000000'), 5289 ** ('maximum value', x'7fefffffffffffff')) 5290 ** SELECT c.name, decimal_mul(ieee754_mantissa(c.bin),pow2.v) 5291 ** FROM pow2, c WHERE pow2.x=ieee754_exponent(c.bin); 5292 ** 5293 */ 5294 /* #include "sqlite3ext.h" */ 5295 SQLITE_EXTENSION_INIT1 5296 #include <assert.h> 5297 #include <string.h> 5298 5299 /* Mark a function parameter as unused, to suppress nuisance compiler 5300 ** warnings. */ 5301 #ifndef UNUSED_PARAMETER 5302 # define UNUSED_PARAMETER(X) (void)(X) 5303 #endif 5304 5305 /* 5306 ** Implementation of the ieee754() function 5307 */ 5308 static void ieee754func( 5309 sqlite3_context *context, 5310 int argc, 5311 sqlite3_value **argv 5312 ){ 5313 if( argc==1 ){ 5314 sqlite3_int64 m, a; 5315 double r; 5316 int e; 5317 int isNeg; 5318 char zResult[100]; 5319 assert( sizeof(m)==sizeof(r) ); 5320 if( sqlite3_value_type(argv[0])==SQLITE_BLOB 5321 && sqlite3_value_bytes(argv[0])==sizeof(r) 5322 ){ 5323 const unsigned char *x = sqlite3_value_blob(argv[0]); 5324 unsigned int i; 5325 sqlite3_uint64 v = 0; 5326 for(i=0; i<sizeof(r); i++){ 5327 v = (v<<8) | x[i]; 5328 } 5329 memcpy(&r, &v, sizeof(r)); 5330 }else{ 5331 r = sqlite3_value_double(argv[0]); 5332 } 5333 if( r<0.0 ){ 5334 isNeg = 1; 5335 r = -r; 5336 }else{ 5337 isNeg = 0; 5338 } 5339 memcpy(&a,&r,sizeof(a)); 5340 if( a==0 ){ 5341 e = 0; 5342 m = 0; 5343 }else{ 5344 e = a>>52; 5345 m = a & ((((sqlite3_int64)1)<<52)-1); 5346 if( e==0 ){ 5347 m <<= 1; 5348 }else{ 5349 m |= ((sqlite3_int64)1)<<52; 5350 } 5351 while( e<1075 && m>0 && (m&1)==0 ){ 5352 m >>= 1; 5353 e++; 5354 } 5355 if( isNeg ) m = -m; 5356 } 5357 switch( *(int*)sqlite3_user_data(context) ){ 5358 case 0: 5359 sqlite3_snprintf(sizeof(zResult), zResult, "ieee754(%lld,%d)", 5360 m, e-1075); 5361 sqlite3_result_text(context, zResult, -1, SQLITE_TRANSIENT); 5362 break; 5363 case 1: 5364 sqlite3_result_int64(context, m); 5365 break; 5366 case 2: 5367 sqlite3_result_int(context, e-1075); 5368 break; 5369 } 5370 }else{ 5371 sqlite3_int64 m, e, a; 5372 double r; 5373 int isNeg = 0; 5374 m = sqlite3_value_int64(argv[0]); 5375 e = sqlite3_value_int64(argv[1]); 5376 5377 /* Limit the range of e. Ticket 22dea1cfdb9151e4 2021-03-02 */ 5378 if( e>10000 ){ 5379 e = 10000; 5380 }else if( e<-10000 ){ 5381 e = -10000; 5382 } 5383 5384 if( m<0 ){ 5385 isNeg = 1; 5386 m = -m; 5387 if( m<0 ) return; 5388 }else if( m==0 && e>-1000 && e<1000 ){ 5389 sqlite3_result_double(context, 0.0); 5390 return; 5391 } 5392 while( (m>>32)&0xffe00000 ){ 5393 m >>= 1; 5394 e++; 5395 } 5396 while( m!=0 && ((m>>32)&0xfff00000)==0 ){ 5397 m <<= 1; 5398 e--; 5399 } 5400 e += 1075; 5401 if( e<=0 ){ 5402 /* Subnormal */ 5403 if( 1-e >= 64 ){ 5404 m = 0; 5405 }else{ 5406 m >>= 1-e; 5407 } 5408 e = 0; 5409 }else if( e>0x7ff ){ 5410 e = 0x7ff; 5411 } 5412 a = m & ((((sqlite3_int64)1)<<52)-1); 5413 a |= e<<52; 5414 if( isNeg ) a |= ((sqlite3_uint64)1)<<63; 5415 memcpy(&r, &a, sizeof(r)); 5416 sqlite3_result_double(context, r); 5417 } 5418 } 5419 5420 /* 5421 ** Functions to convert between blobs and floats. 5422 */ 5423 static void ieee754func_from_blob( 5424 sqlite3_context *context, 5425 int argc, 5426 sqlite3_value **argv 5427 ){ 5428 UNUSED_PARAMETER(argc); 5429 if( sqlite3_value_type(argv[0])==SQLITE_BLOB 5430 && sqlite3_value_bytes(argv[0])==sizeof(double) 5431 ){ 5432 double r; 5433 const unsigned char *x = sqlite3_value_blob(argv[0]); 5434 unsigned int i; 5435 sqlite3_uint64 v = 0; 5436 for(i=0; i<sizeof(r); i++){ 5437 v = (v<<8) | x[i]; 5438 } 5439 memcpy(&r, &v, sizeof(r)); 5440 sqlite3_result_double(context, r); 5441 } 5442 } 5443 static void ieee754func_to_blob( 5444 sqlite3_context *context, 5445 int argc, 5446 sqlite3_value **argv 5447 ){ 5448 UNUSED_PARAMETER(argc); 5449 if( sqlite3_value_type(argv[0])==SQLITE_FLOAT 5450 || sqlite3_value_type(argv[0])==SQLITE_INTEGER 5451 ){ 5452 double r = sqlite3_value_double(argv[0]); 5453 sqlite3_uint64 v; 5454 unsigned char a[sizeof(r)]; 5455 unsigned int i; 5456 memcpy(&v, &r, sizeof(r)); 5457 for(i=1; i<=sizeof(r); i++){ 5458 a[sizeof(r)-i] = v&0xff; 5459 v >>= 8; 5460 } 5461 sqlite3_result_blob(context, a, sizeof(r), SQLITE_TRANSIENT); 5462 } 5463 } 5464 5465 5466 #ifdef _WIN32 5467 5468 #endif 5469 int sqlite3_ieee_init( 5470 sqlite3 *db, 5471 char **pzErrMsg, 5472 const sqlite3_api_routines *pApi 5473 ){ 5474 static const struct { 5475 char *zFName; 5476 int nArg; 5477 int iAux; 5478 void (*xFunc)(sqlite3_context*,int,sqlite3_value**); 5479 } aFunc[] = { 5480 { "ieee754", 1, 0, ieee754func }, 5481 { "ieee754", 2, 0, ieee754func }, 5482 { "ieee754_mantissa", 1, 1, ieee754func }, 5483 { "ieee754_exponent", 1, 2, ieee754func }, 5484 { "ieee754_to_blob", 1, 0, ieee754func_to_blob }, 5485 { "ieee754_from_blob", 1, 0, ieee754func_from_blob }, 5486 5487 }; 5488 unsigned int i; 5489 int rc = SQLITE_OK; 5490 SQLITE_EXTENSION_INIT2(pApi); 5491 (void)pzErrMsg; /* Unused parameter */ 5492 for(i=0; i<sizeof(aFunc)/sizeof(aFunc[0]) && rc==SQLITE_OK; i++){ 5493 rc = sqlite3_create_function(db, aFunc[i].zFName, aFunc[i].nArg, 5494 SQLITE_UTF8|SQLITE_INNOCUOUS, 5495 (void*)&aFunc[i].iAux, 5496 aFunc[i].xFunc, 0, 0); 5497 } 5498 return rc; 5499 } 5500 5501 /************************* End ../ext/misc/ieee754.c ********************/ 5502 /************************* Begin ../ext/misc/series.c ******************/ 5503 /* 5504 ** 2015-08-18 5505 ** 5506 ** The author disclaims copyright to this source code. In place of 5507 ** a legal notice, here is a blessing: 5508 ** 5509 ** May you do good and not evil. 5510 ** May you find forgiveness for yourself and forgive others. 5511 ** May you share freely, never taking more than you give. 5512 ** 5513 ************************************************************************* 5514 ** 5515 ** This file demonstrates how to create a table-valued-function using 5516 ** a virtual table. This demo implements the generate_series() function 5517 ** which gives similar results to the eponymous function in PostgreSQL. 5518 ** Examples: 5519 ** 5520 ** SELECT * FROM generate_series(0,100,5); 5521 ** 5522 ** The query above returns integers from 0 through 100 counting by steps 5523 ** of 5. 5524 ** 5525 ** SELECT * FROM generate_series(0,100); 5526 ** 5527 ** Integers from 0 through 100 with a step size of 1. 5528 ** 5529 ** SELECT * FROM generate_series(20) LIMIT 10; 5530 ** 5531 ** Integers 20 through 29. 5532 ** 5533 ** HOW IT WORKS 5534 ** 5535 ** The generate_series "function" is really a virtual table with the 5536 ** following schema: 5537 ** 5538 ** CREATE TABLE generate_series( 5539 ** value, 5540 ** start HIDDEN, 5541 ** stop HIDDEN, 5542 ** step HIDDEN 5543 ** ); 5544 ** 5545 ** Function arguments in queries against this virtual table are translated 5546 ** into equality constraints against successive hidden columns. In other 5547 ** words, the following pairs of queries are equivalent to each other: 5548 ** 5549 ** SELECT * FROM generate_series(0,100,5); 5550 ** SELECT * FROM generate_series WHERE start=0 AND stop=100 AND step=5; 5551 ** 5552 ** SELECT * FROM generate_series(0,100); 5553 ** SELECT * FROM generate_series WHERE start=0 AND stop=100; 5554 ** 5555 ** SELECT * FROM generate_series(20) LIMIT 10; 5556 ** SELECT * FROM generate_series WHERE start=20 LIMIT 10; 5557 ** 5558 ** The generate_series virtual table implementation leaves the xCreate method 5559 ** set to NULL. This means that it is not possible to do a CREATE VIRTUAL 5560 ** TABLE command with "generate_series" as the USING argument. Instead, there 5561 ** is a single generate_series virtual table that is always available without 5562 ** having to be created first. 5563 ** 5564 ** The xBestIndex method looks for equality constraints against the hidden 5565 ** start, stop, and step columns, and if present, it uses those constraints 5566 ** to bound the sequence of generated values. If the equality constraints 5567 ** are missing, it uses 0 for start, 4294967295 for stop, and 1 for step. 5568 ** xBestIndex returns a small cost when both start and stop are available, 5569 ** and a very large cost if either start or stop are unavailable. This 5570 ** encourages the query planner to order joins such that the bounds of the 5571 ** series are well-defined. 5572 */ 5573 /* #include "sqlite3ext.h" */ 5574 SQLITE_EXTENSION_INIT1 5575 #include <assert.h> 5576 #include <string.h> 5577 5578 #ifndef SQLITE_OMIT_VIRTUALTABLE 5579 5580 5581 /* series_cursor is a subclass of sqlite3_vtab_cursor which will 5582 ** serve as the underlying representation of a cursor that scans 5583 ** over rows of the result 5584 */ 5585 typedef struct series_cursor series_cursor; 5586 struct series_cursor { 5587 sqlite3_vtab_cursor base; /* Base class - must be first */ 5588 int isDesc; /* True to count down rather than up */ 5589 sqlite3_int64 iRowid; /* The rowid */ 5590 sqlite3_int64 iValue; /* Current value ("value") */ 5591 sqlite3_int64 mnValue; /* Mimimum value ("start") */ 5592 sqlite3_int64 mxValue; /* Maximum value ("stop") */ 5593 sqlite3_int64 iStep; /* Increment ("step") */ 5594 }; 5595 5596 /* 5597 ** The seriesConnect() method is invoked to create a new 5598 ** series_vtab that describes the generate_series virtual table. 5599 ** 5600 ** Think of this routine as the constructor for series_vtab objects. 5601 ** 5602 ** All this routine needs to do is: 5603 ** 5604 ** (1) Allocate the series_vtab object and initialize all fields. 5605 ** 5606 ** (2) Tell SQLite (via the sqlite3_declare_vtab() interface) what the 5607 ** result set of queries against generate_series will look like. 5608 */ 5609 static int seriesConnect( 5610 sqlite3 *db, 5611 void *pUnused, 5612 int argcUnused, const char *const*argvUnused, 5613 sqlite3_vtab **ppVtab, 5614 char **pzErrUnused 5615 ){ 5616 sqlite3_vtab *pNew; 5617 int rc; 5618 5619 /* Column numbers */ 5620 #define SERIES_COLUMN_VALUE 0 5621 #define SERIES_COLUMN_START 1 5622 #define SERIES_COLUMN_STOP 2 5623 #define SERIES_COLUMN_STEP 3 5624 5625 (void)pUnused; 5626 (void)argcUnused; 5627 (void)argvUnused; 5628 (void)pzErrUnused; 5629 rc = sqlite3_declare_vtab(db, 5630 "CREATE TABLE x(value,start hidden,stop hidden,step hidden)"); 5631 if( rc==SQLITE_OK ){ 5632 pNew = *ppVtab = sqlite3_malloc( sizeof(*pNew) ); 5633 if( pNew==0 ) return SQLITE_NOMEM; 5634 memset(pNew, 0, sizeof(*pNew)); 5635 sqlite3_vtab_config(db, SQLITE_VTAB_INNOCUOUS); 5636 } 5637 return rc; 5638 } 5639 5640 /* 5641 ** This method is the destructor for series_cursor objects. 5642 */ 5643 static int seriesDisconnect(sqlite3_vtab *pVtab){ 5644 sqlite3_free(pVtab); 5645 return SQLITE_OK; 5646 } 5647 5648 /* 5649 ** Constructor for a new series_cursor object. 5650 */ 5651 static int seriesOpen(sqlite3_vtab *pUnused, sqlite3_vtab_cursor **ppCursor){ 5652 series_cursor *pCur; 5653 (void)pUnused; 5654 pCur = sqlite3_malloc( sizeof(*pCur) ); 5655 if( pCur==0 ) return SQLITE_NOMEM; 5656 memset(pCur, 0, sizeof(*pCur)); 5657 *ppCursor = &pCur->base; 5658 return SQLITE_OK; 5659 } 5660 5661 /* 5662 ** Destructor for a series_cursor. 5663 */ 5664 static int seriesClose(sqlite3_vtab_cursor *cur){ 5665 sqlite3_free(cur); 5666 return SQLITE_OK; 5667 } 5668 5669 5670 /* 5671 ** Advance a series_cursor to its next row of output. 5672 */ 5673 static int seriesNext(sqlite3_vtab_cursor *cur){ 5674 series_cursor *pCur = (series_cursor*)cur; 5675 if( pCur->isDesc ){ 5676 pCur->iValue -= pCur->iStep; 5677 }else{ 5678 pCur->iValue += pCur->iStep; 5679 } 5680 pCur->iRowid++; 5681 return SQLITE_OK; 5682 } 5683 5684 /* 5685 ** Return values of columns for the row at which the series_cursor 5686 ** is currently pointing. 5687 */ 5688 static int seriesColumn( 5689 sqlite3_vtab_cursor *cur, /* The cursor */ 5690 sqlite3_context *ctx, /* First argument to sqlite3_result_...() */ 5691 int i /* Which column to return */ 5692 ){ 5693 series_cursor *pCur = (series_cursor*)cur; 5694 sqlite3_int64 x = 0; 5695 switch( i ){ 5696 case SERIES_COLUMN_START: x = pCur->mnValue; break; 5697 case SERIES_COLUMN_STOP: x = pCur->mxValue; break; 5698 case SERIES_COLUMN_STEP: x = pCur->iStep; break; 5699 default: x = pCur->iValue; break; 5700 } 5701 sqlite3_result_int64(ctx, x); 5702 return SQLITE_OK; 5703 } 5704 5705 /* 5706 ** Return the rowid for the current row. In this implementation, the 5707 ** first row returned is assigned rowid value 1, and each subsequent 5708 ** row a value 1 more than that of the previous. 5709 */ 5710 static int seriesRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ 5711 series_cursor *pCur = (series_cursor*)cur; 5712 *pRowid = pCur->iRowid; 5713 return SQLITE_OK; 5714 } 5715 5716 /* 5717 ** Return TRUE if the cursor has been moved off of the last 5718 ** row of output. 5719 */ 5720 static int seriesEof(sqlite3_vtab_cursor *cur){ 5721 series_cursor *pCur = (series_cursor*)cur; 5722 if( pCur->isDesc ){ 5723 return pCur->iValue < pCur->mnValue; 5724 }else{ 5725 return pCur->iValue > pCur->mxValue; 5726 } 5727 } 5728 5729 /* True to cause run-time checking of the start=, stop=, and/or step= 5730 ** parameters. The only reason to do this is for testing the 5731 ** constraint checking logic for virtual tables in the SQLite core. 5732 */ 5733 #ifndef SQLITE_SERIES_CONSTRAINT_VERIFY 5734 # define SQLITE_SERIES_CONSTRAINT_VERIFY 0 5735 #endif 5736 5737 /* 5738 ** This method is called to "rewind" the series_cursor object back 5739 ** to the first row of output. This method is always called at least 5740 ** once prior to any call to seriesColumn() or seriesRowid() or 5741 ** seriesEof(). 5742 ** 5743 ** The query plan selected by seriesBestIndex is passed in the idxNum 5744 ** parameter. (idxStr is not used in this implementation.) idxNum 5745 ** is a bitmask showing which constraints are available: 5746 ** 5747 ** 1: start=VALUE 5748 ** 2: stop=VALUE 5749 ** 4: step=VALUE 5750 ** 5751 ** Also, if bit 8 is set, that means that the series should be output 5752 ** in descending order rather than in ascending order. If bit 16 is 5753 ** set, then output must appear in ascending order. 5754 ** 5755 ** This routine should initialize the cursor and position it so that it 5756 ** is pointing at the first row, or pointing off the end of the table 5757 ** (so that seriesEof() will return true) if the table is empty. 5758 */ 5759 static int seriesFilter( 5760 sqlite3_vtab_cursor *pVtabCursor, 5761 int idxNum, const char *idxStrUnused, 5762 int argc, sqlite3_value **argv 5763 ){ 5764 series_cursor *pCur = (series_cursor *)pVtabCursor; 5765 int i = 0; 5766 (void)idxStrUnused; 5767 if( idxNum & 1 ){ 5768 pCur->mnValue = sqlite3_value_int64(argv[i++]); 5769 }else{ 5770 pCur->mnValue = 0; 5771 } 5772 if( idxNum & 2 ){ 5773 pCur->mxValue = sqlite3_value_int64(argv[i++]); 5774 }else{ 5775 pCur->mxValue = 0xffffffff; 5776 } 5777 if( idxNum & 4 ){ 5778 pCur->iStep = sqlite3_value_int64(argv[i++]); 5779 if( pCur->iStep==0 ){ 5780 pCur->iStep = 1; 5781 }else if( pCur->iStep<0 ){ 5782 pCur->iStep = -pCur->iStep; 5783 if( (idxNum & 16)==0 ) idxNum |= 8; 5784 } 5785 }else{ 5786 pCur->iStep = 1; 5787 } 5788 for(i=0; i<argc; i++){ 5789 if( sqlite3_value_type(argv[i])==SQLITE_NULL ){ 5790 /* If any of the constraints have a NULL value, then return no rows. 5791 ** See ticket https://www.sqlite.org/src/info/fac496b61722daf2 */ 5792 pCur->mnValue = 1; 5793 pCur->mxValue = 0; 5794 break; 5795 } 5796 } 5797 if( idxNum & 8 ){ 5798 pCur->isDesc = 1; 5799 pCur->iValue = pCur->mxValue; 5800 if( pCur->iStep>0 ){ 5801 pCur->iValue -= (pCur->mxValue - pCur->mnValue)%pCur->iStep; 5802 } 5803 }else{ 5804 pCur->isDesc = 0; 5805 pCur->iValue = pCur->mnValue; 5806 } 5807 pCur->iRowid = 1; 5808 return SQLITE_OK; 5809 } 5810 5811 /* 5812 ** SQLite will invoke this method one or more times while planning a query 5813 ** that uses the generate_series virtual table. This routine needs to create 5814 ** a query plan for each invocation and compute an estimated cost for that 5815 ** plan. 5816 ** 5817 ** In this implementation idxNum is used to represent the 5818 ** query plan. idxStr is unused. 5819 ** 5820 ** The query plan is represented by bits in idxNum: 5821 ** 5822 ** (1) start = $value -- constraint exists 5823 ** (2) stop = $value -- constraint exists 5824 ** (4) step = $value -- constraint exists 5825 ** (8) output in descending order 5826 */ 5827 static int seriesBestIndex( 5828 sqlite3_vtab *pVTab, 5829 sqlite3_index_info *pIdxInfo 5830 ){ 5831 int i, j; /* Loop over constraints */ 5832 int idxNum = 0; /* The query plan bitmask */ 5833 int bStartSeen = 0; /* EQ constraint seen on the START column */ 5834 int unusableMask = 0; /* Mask of unusable constraints */ 5835 int nArg = 0; /* Number of arguments that seriesFilter() expects */ 5836 int aIdx[3]; /* Constraints on start, stop, and step */ 5837 const struct sqlite3_index_constraint *pConstraint; 5838 5839 /* This implementation assumes that the start, stop, and step columns 5840 ** are the last three columns in the virtual table. */ 5841 assert( SERIES_COLUMN_STOP == SERIES_COLUMN_START+1 ); 5842 assert( SERIES_COLUMN_STEP == SERIES_COLUMN_START+2 ); 5843 5844 aIdx[0] = aIdx[1] = aIdx[2] = -1; 5845 pConstraint = pIdxInfo->aConstraint; 5846 for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){ 5847 int iCol; /* 0 for start, 1 for stop, 2 for step */ 5848 int iMask; /* bitmask for those column */ 5849 if( pConstraint->iColumn<SERIES_COLUMN_START ) continue; 5850 iCol = pConstraint->iColumn - SERIES_COLUMN_START; 5851 assert( iCol>=0 && iCol<=2 ); 5852 iMask = 1 << iCol; 5853 if( iCol==0 ) bStartSeen = 1; 5854 if( pConstraint->usable==0 ){ 5855 unusableMask |= iMask; 5856 continue; 5857 }else if( pConstraint->op==SQLITE_INDEX_CONSTRAINT_EQ ){ 5858 idxNum |= iMask; 5859 aIdx[iCol] = i; 5860 } 5861 } 5862 for(i=0; i<3; i++){ 5863 if( (j = aIdx[i])>=0 ){ 5864 pIdxInfo->aConstraintUsage[j].argvIndex = ++nArg; 5865 pIdxInfo->aConstraintUsage[j].omit = !SQLITE_SERIES_CONSTRAINT_VERIFY; 5866 } 5867 } 5868 /* The current generate_column() implementation requires at least one 5869 ** argument (the START value). Legacy versions assumed START=0 if the 5870 ** first argument was omitted. Compile with -DZERO_ARGUMENT_GENERATE_SERIES 5871 ** to obtain the legacy behavior */ 5872 #ifndef ZERO_ARGUMENT_GENERATE_SERIES 5873 if( !bStartSeen ){ 5874 sqlite3_free(pVTab->zErrMsg); 5875 pVTab->zErrMsg = sqlite3_mprintf( 5876 "first argument to \"generate_series()\" missing or unusable"); 5877 return SQLITE_ERROR; 5878 } 5879 #endif 5880 if( (unusableMask & ~idxNum)!=0 ){ 5881 /* The start, stop, and step columns are inputs. Therefore if there 5882 ** are unusable constraints on any of start, stop, or step then 5883 ** this plan is unusable */ 5884 return SQLITE_CONSTRAINT; 5885 } 5886 if( (idxNum & 3)==3 ){ 5887 /* Both start= and stop= boundaries are available. This is the 5888 ** the preferred case */ 5889 pIdxInfo->estimatedCost = (double)(2 - ((idxNum&4)!=0)); 5890 pIdxInfo->estimatedRows = 1000; 5891 if( pIdxInfo->nOrderBy==1 ){ 5892 if( pIdxInfo->aOrderBy[0].desc ){ 5893 idxNum |= 8; 5894 }else{ 5895 idxNum |= 16; 5896 } 5897 pIdxInfo->orderByConsumed = 1; 5898 } 5899 }else{ 5900 /* If either boundary is missing, we have to generate a huge span 5901 ** of numbers. Make this case very expensive so that the query 5902 ** planner will work hard to avoid it. */ 5903 pIdxInfo->estimatedRows = 2147483647; 5904 } 5905 pIdxInfo->idxNum = idxNum; 5906 return SQLITE_OK; 5907 } 5908 5909 /* 5910 ** This following structure defines all the methods for the 5911 ** generate_series virtual table. 5912 */ 5913 static sqlite3_module seriesModule = { 5914 0, /* iVersion */ 5915 0, /* xCreate */ 5916 seriesConnect, /* xConnect */ 5917 seriesBestIndex, /* xBestIndex */ 5918 seriesDisconnect, /* xDisconnect */ 5919 0, /* xDestroy */ 5920 seriesOpen, /* xOpen - open a cursor */ 5921 seriesClose, /* xClose - close a cursor */ 5922 seriesFilter, /* xFilter - configure scan constraints */ 5923 seriesNext, /* xNext - advance a cursor */ 5924 seriesEof, /* xEof - check for end of scan */ 5925 seriesColumn, /* xColumn - read data */ 5926 seriesRowid, /* xRowid - read data */ 5927 0, /* xUpdate */ 5928 0, /* xBegin */ 5929 0, /* xSync */ 5930 0, /* xCommit */ 5931 0, /* xRollback */ 5932 0, /* xFindMethod */ 5933 0, /* xRename */ 5934 0, /* xSavepoint */ 5935 0, /* xRelease */ 5936 0, /* xRollbackTo */ 5937 0 /* xShadowName */ 5938 }; 5939 5940 #endif /* SQLITE_OMIT_VIRTUALTABLE */ 5941 5942 #ifdef _WIN32 5943 5944 #endif 5945 int sqlite3_series_init( 5946 sqlite3 *db, 5947 char **pzErrMsg, 5948 const sqlite3_api_routines *pApi 5949 ){ 5950 int rc = SQLITE_OK; 5951 SQLITE_EXTENSION_INIT2(pApi); 5952 #ifndef SQLITE_OMIT_VIRTUALTABLE 5953 if( sqlite3_libversion_number()<3008012 && pzErrMsg!=0 ){ 5954 *pzErrMsg = sqlite3_mprintf( 5955 "generate_series() requires SQLite 3.8.12 or later"); 5956 return SQLITE_ERROR; 5957 } 5958 rc = sqlite3_create_module(db, "generate_series", &seriesModule, 0); 5959 #endif 5960 return rc; 5961 } 5962 5963 /************************* End ../ext/misc/series.c ********************/ 5964 /************************* Begin ../ext/misc/regexp.c ******************/ 5965 /* 5966 ** 2012-11-13 5967 ** 5968 ** The author disclaims copyright to this source code. In place of 5969 ** a legal notice, here is a blessing: 5970 ** 5971 ** May you do good and not evil. 5972 ** May you find forgiveness for yourself and forgive others. 5973 ** May you share freely, never taking more than you give. 5974 ** 5975 ****************************************************************************** 5976 ** 5977 ** The code in this file implements a compact but reasonably 5978 ** efficient regular-expression matcher for posix extended regular 5979 ** expressions against UTF8 text. 5980 ** 5981 ** This file is an SQLite extension. It registers a single function 5982 ** named "regexp(A,B)" where A is the regular expression and B is the 5983 ** string to be matched. By registering this function, SQLite will also 5984 ** then implement the "B regexp A" operator. Note that with the function 5985 ** the regular expression comes first, but with the operator it comes 5986 ** second. 5987 ** 5988 ** The following regular expression syntax is supported: 5989 ** 5990 ** X* zero or more occurrences of X 5991 ** X+ one or more occurrences of X 5992 ** X? zero or one occurrences of X 5993 ** X{p,q} between p and q occurrences of X 5994 ** (X) match X 5995 ** X|Y X or Y 5996 ** ^X X occurring at the beginning of the string 5997 ** X$ X occurring at the end of the string 5998 ** . Match any single character 5999 ** \c Character c where c is one of \{}()[]|*+?. 6000 ** \c C-language escapes for c in afnrtv. ex: \t or \n 6001 ** \uXXXX Where XXXX is exactly 4 hex digits, unicode value XXXX 6002 ** \xXX Where XX is exactly 2 hex digits, unicode value XX 6003 ** [abc] Any single character from the set abc 6004 ** [^abc] Any single character not in the set abc 6005 ** [a-z] Any single character in the range a-z 6006 ** [^a-z] Any single character not in the range a-z 6007 ** \b Word boundary 6008 ** \w Word character. [A-Za-z0-9_] 6009 ** \W Non-word character 6010 ** \d Digit 6011 ** \D Non-digit 6012 ** \s Whitespace character 6013 ** \S Non-whitespace character 6014 ** 6015 ** A nondeterministic finite automaton (NFA) is used for matching, so the 6016 ** performance is bounded by O(N*M) where N is the size of the regular 6017 ** expression and M is the size of the input string. The matcher never 6018 ** exhibits exponential behavior. Note that the X{p,q} operator expands 6019 ** to p copies of X following by q-p copies of X? and that the size of the 6020 ** regular expression in the O(N*M) performance bound is computed after 6021 ** this expansion. 6022 */ 6023 #include <string.h> 6024 #include <stdlib.h> 6025 /* #include "sqlite3ext.h" */ 6026 SQLITE_EXTENSION_INIT1 6027 6028 /* 6029 ** The following #defines change the names of some functions implemented in 6030 ** this file to prevent name collisions with C-library functions of the 6031 ** same name. 6032 */ 6033 #define re_match sqlite3re_match 6034 #define re_compile sqlite3re_compile 6035 #define re_free sqlite3re_free 6036 6037 /* The end-of-input character */ 6038 #define RE_EOF 0 /* End of input */ 6039 6040 /* The NFA is implemented as sequence of opcodes taken from the following 6041 ** set. Each opcode has a single integer argument. 6042 */ 6043 #define RE_OP_MATCH 1 /* Match the one character in the argument */ 6044 #define RE_OP_ANY 2 /* Match any one character. (Implements ".") */ 6045 #define RE_OP_ANYSTAR 3 /* Special optimized version of .* */ 6046 #define RE_OP_FORK 4 /* Continue to both next and opcode at iArg */ 6047 #define RE_OP_GOTO 5 /* Jump to opcode at iArg */ 6048 #define RE_OP_ACCEPT 6 /* Halt and indicate a successful match */ 6049 #define RE_OP_CC_INC 7 /* Beginning of a [...] character class */ 6050 #define RE_OP_CC_EXC 8 /* Beginning of a [^...] character class */ 6051 #define RE_OP_CC_VALUE 9 /* Single value in a character class */ 6052 #define RE_OP_CC_RANGE 10 /* Range of values in a character class */ 6053 #define RE_OP_WORD 11 /* Perl word character [A-Za-z0-9_] */ 6054 #define RE_OP_NOTWORD 12 /* Not a perl word character */ 6055 #define RE_OP_DIGIT 13 /* digit: [0-9] */ 6056 #define RE_OP_NOTDIGIT 14 /* Not a digit */ 6057 #define RE_OP_SPACE 15 /* space: [ \t\n\r\v\f] */ 6058 #define RE_OP_NOTSPACE 16 /* Not a digit */ 6059 #define RE_OP_BOUNDARY 17 /* Boundary between word and non-word */ 6060 6061 /* Each opcode is a "state" in the NFA */ 6062 typedef unsigned short ReStateNumber; 6063 6064 /* Because this is an NFA and not a DFA, multiple states can be active at 6065 ** once. An instance of the following object records all active states in 6066 ** the NFA. The implementation is optimized for the common case where the 6067 ** number of actives states is small. 6068 */ 6069 typedef struct ReStateSet { 6070 unsigned nState; /* Number of current states */ 6071 ReStateNumber *aState; /* Current states */ 6072 } ReStateSet; 6073 6074 /* An input string read one character at a time. 6075 */ 6076 typedef struct ReInput ReInput; 6077 struct ReInput { 6078 const unsigned char *z; /* All text */ 6079 int i; /* Next byte to read */ 6080 int mx; /* EOF when i>=mx */ 6081 }; 6082 6083 /* A compiled NFA (or an NFA that is in the process of being compiled) is 6084 ** an instance of the following object. 6085 */ 6086 typedef struct ReCompiled ReCompiled; 6087 struct ReCompiled { 6088 ReInput sIn; /* Regular expression text */ 6089 const char *zErr; /* Error message to return */ 6090 char *aOp; /* Operators for the virtual machine */ 6091 int *aArg; /* Arguments to each operator */ 6092 unsigned (*xNextChar)(ReInput*); /* Next character function */ 6093 unsigned char zInit[12]; /* Initial text to match */ 6094 int nInit; /* Number of characters in zInit */ 6095 unsigned nState; /* Number of entries in aOp[] and aArg[] */ 6096 unsigned nAlloc; /* Slots allocated for aOp[] and aArg[] */ 6097 }; 6098 6099 /* Add a state to the given state set if it is not already there */ 6100 static void re_add_state(ReStateSet *pSet, int newState){ 6101 unsigned i; 6102 for(i=0; i<pSet->nState; i++) if( pSet->aState[i]==newState ) return; 6103 pSet->aState[pSet->nState++] = (ReStateNumber)newState; 6104 } 6105 6106 /* Extract the next unicode character from *pzIn and return it. Advance 6107 ** *pzIn to the first byte past the end of the character returned. To 6108 ** be clear: this routine converts utf8 to unicode. This routine is 6109 ** optimized for the common case where the next character is a single byte. 6110 */ 6111 static unsigned re_next_char(ReInput *p){ 6112 unsigned c; 6113 if( p->i>=p->mx ) return 0; 6114 c = p->z[p->i++]; 6115 if( c>=0x80 ){ 6116 if( (c&0xe0)==0xc0 && p->i<p->mx && (p->z[p->i]&0xc0)==0x80 ){ 6117 c = (c&0x1f)<<6 | (p->z[p->i++]&0x3f); 6118 if( c<0x80 ) c = 0xfffd; 6119 }else if( (c&0xf0)==0xe0 && p->i+1<p->mx && (p->z[p->i]&0xc0)==0x80 6120 && (p->z[p->i+1]&0xc0)==0x80 ){ 6121 c = (c&0x0f)<<12 | ((p->z[p->i]&0x3f)<<6) | (p->z[p->i+1]&0x3f); 6122 p->i += 2; 6123 if( c<=0x7ff || (c>=0xd800 && c<=0xdfff) ) c = 0xfffd; 6124 }else if( (c&0xf8)==0xf0 && p->i+3<p->mx && (p->z[p->i]&0xc0)==0x80 6125 && (p->z[p->i+1]&0xc0)==0x80 && (p->z[p->i+2]&0xc0)==0x80 ){ 6126 c = (c&0x07)<<18 | ((p->z[p->i]&0x3f)<<12) | ((p->z[p->i+1]&0x3f)<<6) 6127 | (p->z[p->i+2]&0x3f); 6128 p->i += 3; 6129 if( c<=0xffff || c>0x10ffff ) c = 0xfffd; 6130 }else{ 6131 c = 0xfffd; 6132 } 6133 } 6134 return c; 6135 } 6136 static unsigned re_next_char_nocase(ReInput *p){ 6137 unsigned c = re_next_char(p); 6138 if( c>='A' && c<='Z' ) c += 'a' - 'A'; 6139 return c; 6140 } 6141 6142 /* Return true if c is a perl "word" character: [A-Za-z0-9_] */ 6143 static int re_word_char(int c){ 6144 return (c>='0' && c<='9') || (c>='a' && c<='z') 6145 || (c>='A' && c<='Z') || c=='_'; 6146 } 6147 6148 /* Return true if c is a "digit" character: [0-9] */ 6149 static int re_digit_char(int c){ 6150 return (c>='0' && c<='9'); 6151 } 6152 6153 /* Return true if c is a perl "space" character: [ \t\r\n\v\f] */ 6154 static int re_space_char(int c){ 6155 return c==' ' || c=='\t' || c=='\n' || c=='\r' || c=='\v' || c=='\f'; 6156 } 6157 6158 /* Run a compiled regular expression on the zero-terminated input 6159 ** string zIn[]. Return true on a match and false if there is no match. 6160 */ 6161 static int re_match(ReCompiled *pRe, const unsigned char *zIn, int nIn){ 6162 ReStateSet aStateSet[2], *pThis, *pNext; 6163 ReStateNumber aSpace[100]; 6164 ReStateNumber *pToFree; 6165 unsigned int i = 0; 6166 unsigned int iSwap = 0; 6167 int c = RE_EOF+1; 6168 int cPrev = 0; 6169 int rc = 0; 6170 ReInput in; 6171 6172 in.z = zIn; 6173 in.i = 0; 6174 in.mx = nIn>=0 ? nIn : (int)strlen((char const*)zIn); 6175 6176 /* Look for the initial prefix match, if there is one. */ 6177 if( pRe->nInit ){ 6178 unsigned char x = pRe->zInit[0]; 6179 while( in.i+pRe->nInit<=in.mx 6180 && (zIn[in.i]!=x || 6181 strncmp((const char*)zIn+in.i, (const char*)pRe->zInit, pRe->nInit)!=0) 6182 ){ 6183 in.i++; 6184 } 6185 if( in.i+pRe->nInit>in.mx ) return 0; 6186 } 6187 6188 if( pRe->nState<=(sizeof(aSpace)/(sizeof(aSpace[0])*2)) ){ 6189 pToFree = 0; 6190 aStateSet[0].aState = aSpace; 6191 }else{ 6192 pToFree = sqlite3_malloc64( sizeof(ReStateNumber)*2*pRe->nState ); 6193 if( pToFree==0 ) return -1; 6194 aStateSet[0].aState = pToFree; 6195 } 6196 aStateSet[1].aState = &aStateSet[0].aState[pRe->nState]; 6197 pNext = &aStateSet[1]; 6198 pNext->nState = 0; 6199 re_add_state(pNext, 0); 6200 while( c!=RE_EOF && pNext->nState>0 ){ 6201 cPrev = c; 6202 c = pRe->xNextChar(&in); 6203 pThis = pNext; 6204 pNext = &aStateSet[iSwap]; 6205 iSwap = 1 - iSwap; 6206 pNext->nState = 0; 6207 for(i=0; i<pThis->nState; i++){ 6208 int x = pThis->aState[i]; 6209 switch( pRe->aOp[x] ){ 6210 case RE_OP_MATCH: { 6211 if( pRe->aArg[x]==c ) re_add_state(pNext, x+1); 6212 break; 6213 } 6214 case RE_OP_ANY: { 6215 if( c!=0 ) re_add_state(pNext, x+1); 6216 break; 6217 } 6218 case RE_OP_WORD: { 6219 if( re_word_char(c) ) re_add_state(pNext, x+1); 6220 break; 6221 } 6222 case RE_OP_NOTWORD: { 6223 if( !re_word_char(c) && c!=0 ) re_add_state(pNext, x+1); 6224 break; 6225 } 6226 case RE_OP_DIGIT: { 6227 if( re_digit_char(c) ) re_add_state(pNext, x+1); 6228 break; 6229 } 6230 case RE_OP_NOTDIGIT: { 6231 if( !re_digit_char(c) && c!=0 ) re_add_state(pNext, x+1); 6232 break; 6233 } 6234 case RE_OP_SPACE: { 6235 if( re_space_char(c) ) re_add_state(pNext, x+1); 6236 break; 6237 } 6238 case RE_OP_NOTSPACE: { 6239 if( !re_space_char(c) && c!=0 ) re_add_state(pNext, x+1); 6240 break; 6241 } 6242 case RE_OP_BOUNDARY: { 6243 if( re_word_char(c)!=re_word_char(cPrev) ) re_add_state(pThis, x+1); 6244 break; 6245 } 6246 case RE_OP_ANYSTAR: { 6247 re_add_state(pNext, x); 6248 re_add_state(pThis, x+1); 6249 break; 6250 } 6251 case RE_OP_FORK: { 6252 re_add_state(pThis, x+pRe->aArg[x]); 6253 re_add_state(pThis, x+1); 6254 break; 6255 } 6256 case RE_OP_GOTO: { 6257 re_add_state(pThis, x+pRe->aArg[x]); 6258 break; 6259 } 6260 case RE_OP_ACCEPT: { 6261 rc = 1; 6262 goto re_match_end; 6263 } 6264 case RE_OP_CC_EXC: { 6265 if( c==0 ) break; 6266 /* fall-through */ goto re_op_cc_inc; 6267 } 6268 case RE_OP_CC_INC: re_op_cc_inc: { 6269 int j = 1; 6270 int n = pRe->aArg[x]; 6271 int hit = 0; 6272 for(j=1; j>0 && j<n; j++){ 6273 if( pRe->aOp[x+j]==RE_OP_CC_VALUE ){ 6274 if( pRe->aArg[x+j]==c ){ 6275 hit = 1; 6276 j = -1; 6277 } 6278 }else{ 6279 if( pRe->aArg[x+j]<=c && pRe->aArg[x+j+1]>=c ){ 6280 hit = 1; 6281 j = -1; 6282 }else{ 6283 j++; 6284 } 6285 } 6286 } 6287 if( pRe->aOp[x]==RE_OP_CC_EXC ) hit = !hit; 6288 if( hit ) re_add_state(pNext, x+n); 6289 break; 6290 } 6291 } 6292 } 6293 } 6294 for(i=0; i<pNext->nState; i++){ 6295 if( pRe->aOp[pNext->aState[i]]==RE_OP_ACCEPT ){ rc = 1; break; } 6296 } 6297 re_match_end: 6298 sqlite3_free(pToFree); 6299 return rc; 6300 } 6301 6302 /* Resize the opcode and argument arrays for an RE under construction. 6303 */ 6304 static int re_resize(ReCompiled *p, int N){ 6305 char *aOp; 6306 int *aArg; 6307 aOp = sqlite3_realloc64(p->aOp, N*sizeof(p->aOp[0])); 6308 if( aOp==0 ) return 1; 6309 p->aOp = aOp; 6310 aArg = sqlite3_realloc64(p->aArg, N*sizeof(p->aArg[0])); 6311 if( aArg==0 ) return 1; 6312 p->aArg = aArg; 6313 p->nAlloc = N; 6314 return 0; 6315 } 6316 6317 /* Insert a new opcode and argument into an RE under construction. The 6318 ** insertion point is just prior to existing opcode iBefore. 6319 */ 6320 static int re_insert(ReCompiled *p, int iBefore, int op, int arg){ 6321 int i; 6322 if( p->nAlloc<=p->nState && re_resize(p, p->nAlloc*2) ) return 0; 6323 for(i=p->nState; i>iBefore; i--){ 6324 p->aOp[i] = p->aOp[i-1]; 6325 p->aArg[i] = p->aArg[i-1]; 6326 } 6327 p->nState++; 6328 p->aOp[iBefore] = (char)op; 6329 p->aArg[iBefore] = arg; 6330 return iBefore; 6331 } 6332 6333 /* Append a new opcode and argument to the end of the RE under construction. 6334 */ 6335 static int re_append(ReCompiled *p, int op, int arg){ 6336 return re_insert(p, p->nState, op, arg); 6337 } 6338 6339 /* Make a copy of N opcodes starting at iStart onto the end of the RE 6340 ** under construction. 6341 */ 6342 static void re_copy(ReCompiled *p, int iStart, int N){ 6343 if( p->nState+N>=p->nAlloc && re_resize(p, p->nAlloc*2+N) ) return; 6344 memcpy(&p->aOp[p->nState], &p->aOp[iStart], N*sizeof(p->aOp[0])); 6345 memcpy(&p->aArg[p->nState], &p->aArg[iStart], N*sizeof(p->aArg[0])); 6346 p->nState += N; 6347 } 6348 6349 /* Return true if c is a hexadecimal digit character: [0-9a-fA-F] 6350 ** If c is a hex digit, also set *pV = (*pV)*16 + valueof(c). If 6351 ** c is not a hex digit *pV is unchanged. 6352 */ 6353 static int re_hex(int c, int *pV){ 6354 if( c>='0' && c<='9' ){ 6355 c -= '0'; 6356 }else if( c>='a' && c<='f' ){ 6357 c -= 'a' - 10; 6358 }else if( c>='A' && c<='F' ){ 6359 c -= 'A' - 10; 6360 }else{ 6361 return 0; 6362 } 6363 *pV = (*pV)*16 + (c & 0xff); 6364 return 1; 6365 } 6366 6367 /* A backslash character has been seen, read the next character and 6368 ** return its interpretation. 6369 */ 6370 static unsigned re_esc_char(ReCompiled *p){ 6371 static const char zEsc[] = "afnrtv\\()*.+?[$^{|}]"; 6372 static const char zTrans[] = "\a\f\n\r\t\v"; 6373 int i, v = 0; 6374 char c; 6375 if( p->sIn.i>=p->sIn.mx ) return 0; 6376 c = p->sIn.z[p->sIn.i]; 6377 if( c=='u' && p->sIn.i+4<p->sIn.mx ){ 6378 const unsigned char *zIn = p->sIn.z + p->sIn.i; 6379 if( re_hex(zIn[1],&v) 6380 && re_hex(zIn[2],&v) 6381 && re_hex(zIn[3],&v) 6382 && re_hex(zIn[4],&v) 6383 ){ 6384 p->sIn.i += 5; 6385 return v; 6386 } 6387 } 6388 if( c=='x' && p->sIn.i+2<p->sIn.mx ){ 6389 const unsigned char *zIn = p->sIn.z + p->sIn.i; 6390 if( re_hex(zIn[1],&v) 6391 && re_hex(zIn[2],&v) 6392 ){ 6393 p->sIn.i += 3; 6394 return v; 6395 } 6396 } 6397 for(i=0; zEsc[i] && zEsc[i]!=c; i++){} 6398 if( zEsc[i] ){ 6399 if( i<6 ) c = zTrans[i]; 6400 p->sIn.i++; 6401 }else{ 6402 p->zErr = "unknown \\ escape"; 6403 } 6404 return c; 6405 } 6406 6407 /* Forward declaration */ 6408 static const char *re_subcompile_string(ReCompiled*); 6409 6410 /* Peek at the next byte of input */ 6411 static unsigned char rePeek(ReCompiled *p){ 6412 return p->sIn.i<p->sIn.mx ? p->sIn.z[p->sIn.i] : 0; 6413 } 6414 6415 /* Compile RE text into a sequence of opcodes. Continue up to the 6416 ** first unmatched ")" character, then return. If an error is found, 6417 ** return a pointer to the error message string. 6418 */ 6419 static const char *re_subcompile_re(ReCompiled *p){ 6420 const char *zErr; 6421 int iStart, iEnd, iGoto; 6422 iStart = p->nState; 6423 zErr = re_subcompile_string(p); 6424 if( zErr ) return zErr; 6425 while( rePeek(p)=='|' ){ 6426 iEnd = p->nState; 6427 re_insert(p, iStart, RE_OP_FORK, iEnd + 2 - iStart); 6428 iGoto = re_append(p, RE_OP_GOTO, 0); 6429 p->sIn.i++; 6430 zErr = re_subcompile_string(p); 6431 if( zErr ) return zErr; 6432 p->aArg[iGoto] = p->nState - iGoto; 6433 } 6434 return 0; 6435 } 6436 6437 /* Compile an element of regular expression text (anything that can be 6438 ** an operand to the "|" operator). Return NULL on success or a pointer 6439 ** to the error message if there is a problem. 6440 */ 6441 static const char *re_subcompile_string(ReCompiled *p){ 6442 int iPrev = -1; 6443 int iStart; 6444 unsigned c; 6445 const char *zErr; 6446 while( (c = p->xNextChar(&p->sIn))!=0 ){ 6447 iStart = p->nState; 6448 switch( c ){ 6449 case '|': 6450 case '$': 6451 case ')': { 6452 p->sIn.i--; 6453 return 0; 6454 } 6455 case '(': { 6456 zErr = re_subcompile_re(p); 6457 if( zErr ) return zErr; 6458 if( rePeek(p)!=')' ) return "unmatched '('"; 6459 p->sIn.i++; 6460 break; 6461 } 6462 case '.': { 6463 if( rePeek(p)=='*' ){ 6464 re_append(p, RE_OP_ANYSTAR, 0); 6465 p->sIn.i++; 6466 }else{ 6467 re_append(p, RE_OP_ANY, 0); 6468 } 6469 break; 6470 } 6471 case '*': { 6472 if( iPrev<0 ) return "'*' without operand"; 6473 re_insert(p, iPrev, RE_OP_GOTO, p->nState - iPrev + 1); 6474 re_append(p, RE_OP_FORK, iPrev - p->nState + 1); 6475 break; 6476 } 6477 case '+': { 6478 if( iPrev<0 ) return "'+' without operand"; 6479 re_append(p, RE_OP_FORK, iPrev - p->nState); 6480 break; 6481 } 6482 case '?': { 6483 if( iPrev<0 ) return "'?' without operand"; 6484 re_insert(p, iPrev, RE_OP_FORK, p->nState - iPrev+1); 6485 break; 6486 } 6487 case '{': { 6488 int m = 0, n = 0; 6489 int sz, j; 6490 if( iPrev<0 ) return "'{m,n}' without operand"; 6491 while( (c=rePeek(p))>='0' && c<='9' ){ m = m*10 + c - '0'; p->sIn.i++; } 6492 n = m; 6493 if( c==',' ){ 6494 p->sIn.i++; 6495 n = 0; 6496 while( (c=rePeek(p))>='0' && c<='9' ){ n = n*10 + c-'0'; p->sIn.i++; } 6497 } 6498 if( c!='}' ) return "unmatched '{'"; 6499 if( n>0 && n<m ) return "n less than m in '{m,n}'"; 6500 p->sIn.i++; 6501 sz = p->nState - iPrev; 6502 if( m==0 ){ 6503 if( n==0 ) return "both m and n are zero in '{m,n}'"; 6504 re_insert(p, iPrev, RE_OP_FORK, sz+1); 6505 n--; 6506 }else{ 6507 for(j=1; j<m; j++) re_copy(p, iPrev, sz); 6508 } 6509 for(j=m; j<n; j++){ 6510 re_append(p, RE_OP_FORK, sz+1); 6511 re_copy(p, iPrev, sz); 6512 } 6513 if( n==0 && m>0 ){ 6514 re_append(p, RE_OP_FORK, -sz); 6515 } 6516 break; 6517 } 6518 case '[': { 6519 int iFirst = p->nState; 6520 if( rePeek(p)=='^' ){ 6521 re_append(p, RE_OP_CC_EXC, 0); 6522 p->sIn.i++; 6523 }else{ 6524 re_append(p, RE_OP_CC_INC, 0); 6525 } 6526 while( (c = p->xNextChar(&p->sIn))!=0 ){ 6527 if( c=='[' && rePeek(p)==':' ){ 6528 return "POSIX character classes not supported"; 6529 } 6530 if( c=='\\' ) c = re_esc_char(p); 6531 if( rePeek(p)=='-' ){ 6532 re_append(p, RE_OP_CC_RANGE, c); 6533 p->sIn.i++; 6534 c = p->xNextChar(&p->sIn); 6535 if( c=='\\' ) c = re_esc_char(p); 6536 re_append(p, RE_OP_CC_RANGE, c); 6537 }else{ 6538 re_append(p, RE_OP_CC_VALUE, c); 6539 } 6540 if( rePeek(p)==']' ){ p->sIn.i++; break; } 6541 } 6542 if( c==0 ) return "unclosed '['"; 6543 p->aArg[iFirst] = p->nState - iFirst; 6544 break; 6545 } 6546 case '\\': { 6547 int specialOp = 0; 6548 switch( rePeek(p) ){ 6549 case 'b': specialOp = RE_OP_BOUNDARY; break; 6550 case 'd': specialOp = RE_OP_DIGIT; break; 6551 case 'D': specialOp = RE_OP_NOTDIGIT; break; 6552 case 's': specialOp = RE_OP_SPACE; break; 6553 case 'S': specialOp = RE_OP_NOTSPACE; break; 6554 case 'w': specialOp = RE_OP_WORD; break; 6555 case 'W': specialOp = RE_OP_NOTWORD; break; 6556 } 6557 if( specialOp ){ 6558 p->sIn.i++; 6559 re_append(p, specialOp, 0); 6560 }else{ 6561 c = re_esc_char(p); 6562 re_append(p, RE_OP_MATCH, c); 6563 } 6564 break; 6565 } 6566 default: { 6567 re_append(p, RE_OP_MATCH, c); 6568 break; 6569 } 6570 } 6571 iPrev = iStart; 6572 } 6573 return 0; 6574 } 6575 6576 /* Free and reclaim all the memory used by a previously compiled 6577 ** regular expression. Applications should invoke this routine once 6578 ** for every call to re_compile() to avoid memory leaks. 6579 */ 6580 static void re_free(ReCompiled *pRe){ 6581 if( pRe ){ 6582 sqlite3_free(pRe->aOp); 6583 sqlite3_free(pRe->aArg); 6584 sqlite3_free(pRe); 6585 } 6586 } 6587 6588 /* 6589 ** Compile a textual regular expression in zIn[] into a compiled regular 6590 ** expression suitable for us by re_match() and return a pointer to the 6591 ** compiled regular expression in *ppRe. Return NULL on success or an 6592 ** error message if something goes wrong. 6593 */ 6594 static const char *re_compile(ReCompiled **ppRe, const char *zIn, int noCase){ 6595 ReCompiled *pRe; 6596 const char *zErr; 6597 int i, j; 6598 6599 *ppRe = 0; 6600 pRe = sqlite3_malloc( sizeof(*pRe) ); 6601 if( pRe==0 ){ 6602 return "out of memory"; 6603 } 6604 memset(pRe, 0, sizeof(*pRe)); 6605 pRe->xNextChar = noCase ? re_next_char_nocase : re_next_char; 6606 if( re_resize(pRe, 30) ){ 6607 re_free(pRe); 6608 return "out of memory"; 6609 } 6610 if( zIn[0]=='^' ){ 6611 zIn++; 6612 }else{ 6613 re_append(pRe, RE_OP_ANYSTAR, 0); 6614 } 6615 pRe->sIn.z = (unsigned char*)zIn; 6616 pRe->sIn.i = 0; 6617 pRe->sIn.mx = (int)strlen(zIn); 6618 zErr = re_subcompile_re(pRe); 6619 if( zErr ){ 6620 re_free(pRe); 6621 return zErr; 6622 } 6623 if( rePeek(pRe)=='$' && pRe->sIn.i+1>=pRe->sIn.mx ){ 6624 re_append(pRe, RE_OP_MATCH, RE_EOF); 6625 re_append(pRe, RE_OP_ACCEPT, 0); 6626 *ppRe = pRe; 6627 }else if( pRe->sIn.i>=pRe->sIn.mx ){ 6628 re_append(pRe, RE_OP_ACCEPT, 0); 6629 *ppRe = pRe; 6630 }else{ 6631 re_free(pRe); 6632 return "unrecognized character"; 6633 } 6634 6635 /* The following is a performance optimization. If the regex begins with 6636 ** ".*" (if the input regex lacks an initial "^") and afterwards there are 6637 ** one or more matching characters, enter those matching characters into 6638 ** zInit[]. The re_match() routine can then search ahead in the input 6639 ** string looking for the initial match without having to run the whole 6640 ** regex engine over the string. Do not worry able trying to match 6641 ** unicode characters beyond plane 0 - those are very rare and this is 6642 ** just an optimization. */ 6643 if( pRe->aOp[0]==RE_OP_ANYSTAR && !noCase ){ 6644 for(j=0, i=1; j<(int)sizeof(pRe->zInit)-2 && pRe->aOp[i]==RE_OP_MATCH; i++){ 6645 unsigned x = pRe->aArg[i]; 6646 if( x<=127 ){ 6647 pRe->zInit[j++] = (unsigned char)x; 6648 }else if( x<=0xfff ){ 6649 pRe->zInit[j++] = (unsigned char)(0xc0 | (x>>6)); 6650 pRe->zInit[j++] = 0x80 | (x&0x3f); 6651 }else if( x<=0xffff ){ 6652 pRe->zInit[j++] = (unsigned char)(0xd0 | (x>>12)); 6653 pRe->zInit[j++] = 0x80 | ((x>>6)&0x3f); 6654 pRe->zInit[j++] = 0x80 | (x&0x3f); 6655 }else{ 6656 break; 6657 } 6658 } 6659 if( j>0 && pRe->zInit[j-1]==0 ) j--; 6660 pRe->nInit = j; 6661 } 6662 return pRe->zErr; 6663 } 6664 6665 /* 6666 ** Implementation of the regexp() SQL function. This function implements 6667 ** the build-in REGEXP operator. The first argument to the function is the 6668 ** pattern and the second argument is the string. So, the SQL statements: 6669 ** 6670 ** A REGEXP B 6671 ** 6672 ** is implemented as regexp(B,A). 6673 */ 6674 static void re_sql_func( 6675 sqlite3_context *context, 6676 int argc, 6677 sqlite3_value **argv 6678 ){ 6679 ReCompiled *pRe; /* Compiled regular expression */ 6680 const char *zPattern; /* The regular expression */ 6681 const unsigned char *zStr;/* String being searched */ 6682 const char *zErr; /* Compile error message */ 6683 int setAux = 0; /* True to invoke sqlite3_set_auxdata() */ 6684 6685 (void)argc; /* Unused */ 6686 pRe = sqlite3_get_auxdata(context, 0); 6687 if( pRe==0 ){ 6688 zPattern = (const char*)sqlite3_value_text(argv[0]); 6689 if( zPattern==0 ) return; 6690 zErr = re_compile(&pRe, zPattern, sqlite3_user_data(context)!=0); 6691 if( zErr ){ 6692 re_free(pRe); 6693 sqlite3_result_error(context, zErr, -1); 6694 return; 6695 } 6696 if( pRe==0 ){ 6697 sqlite3_result_error_nomem(context); 6698 return; 6699 } 6700 setAux = 1; 6701 } 6702 zStr = (const unsigned char*)sqlite3_value_text(argv[1]); 6703 if( zStr!=0 ){ 6704 sqlite3_result_int(context, re_match(pRe, zStr, -1)); 6705 } 6706 if( setAux ){ 6707 sqlite3_set_auxdata(context, 0, pRe, (void(*)(void*))re_free); 6708 } 6709 } 6710 6711 /* 6712 ** Invoke this routine to register the regexp() function with the 6713 ** SQLite database connection. 6714 */ 6715 #ifdef _WIN32 6716 6717 #endif 6718 int sqlite3_regexp_init( 6719 sqlite3 *db, 6720 char **pzErrMsg, 6721 const sqlite3_api_routines *pApi 6722 ){ 6723 int rc = SQLITE_OK; 6724 SQLITE_EXTENSION_INIT2(pApi); 6725 (void)pzErrMsg; /* Unused */ 6726 rc = sqlite3_create_function(db, "regexp", 2, SQLITE_UTF8|SQLITE_INNOCUOUS, 6727 0, re_sql_func, 0, 0); 6728 if( rc==SQLITE_OK ){ 6729 /* The regexpi(PATTERN,STRING) function is a case-insensitive version 6730 ** of regexp(PATTERN,STRING). */ 6731 rc = sqlite3_create_function(db, "regexpi", 2, SQLITE_UTF8|SQLITE_INNOCUOUS, 6732 (void*)db, re_sql_func, 0, 0); 6733 } 6734 return rc; 6735 } 6736 6737 /************************* End ../ext/misc/regexp.c ********************/ 6738 #ifdef SQLITE_HAVE_ZLIB 6739 /************************* Begin ../ext/misc/zipfile.c ******************/ 6740 /* 6741 ** 2017-12-26 6742 ** 6743 ** The author disclaims copyright to this source code. In place of 6744 ** a legal notice, here is a blessing: 6745 ** 6746 ** May you do good and not evil. 6747 ** May you find forgiveness for yourself and forgive others. 6748 ** May you share freely, never taking more than you give. 6749 ** 6750 ****************************************************************************** 6751 ** 6752 ** This file implements a virtual table for reading and writing ZIP archive 6753 ** files. 6754 ** 6755 ** Usage example: 6756 ** 6757 ** SELECT name, sz, datetime(mtime,'unixepoch') FROM zipfile($filename); 6758 ** 6759 ** Current limitations: 6760 ** 6761 ** * No support for encryption 6762 ** * No support for ZIP archives spanning multiple files 6763 ** * No support for zip64 extensions 6764 ** * Only the "inflate/deflate" (zlib) compression method is supported 6765 */ 6766 /* #include "sqlite3ext.h" */ 6767 SQLITE_EXTENSION_INIT1 6768 #include <stdio.h> 6769 #include <string.h> 6770 #include <assert.h> 6771 6772 #include <zlib.h> 6773 6774 #ifndef SQLITE_OMIT_VIRTUALTABLE 6775 6776 #ifndef SQLITE_AMALGAMATION 6777 6778 #ifndef UINT32_TYPE 6779 # ifdef HAVE_UINT32_T 6780 # define UINT32_TYPE uint32_t 6781 # else 6782 # define UINT32_TYPE unsigned int 6783 # endif 6784 #endif 6785 #ifndef UINT16_TYPE 6786 # ifdef HAVE_UINT16_T 6787 # define UINT16_TYPE uint16_t 6788 # else 6789 # define UINT16_TYPE unsigned short int 6790 # endif 6791 #endif 6792 /* typedef sqlite3_int64 i64; */ 6793 /* typedef unsigned char u8; */ 6794 typedef UINT32_TYPE u32; /* 4-byte unsigned integer */ 6795 typedef UINT16_TYPE u16; /* 2-byte unsigned integer */ 6796 #define MIN(a,b) ((a)<(b) ? (a) : (b)) 6797 6798 #if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST) 6799 # define SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS 1 6800 #endif 6801 #if defined(SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS) 6802 # define ALWAYS(X) (1) 6803 # define NEVER(X) (0) 6804 #elif !defined(NDEBUG) 6805 # define ALWAYS(X) ((X)?1:(assert(0),0)) 6806 # define NEVER(X) ((X)?(assert(0),1):0) 6807 #else 6808 # define ALWAYS(X) (X) 6809 # define NEVER(X) (X) 6810 #endif 6811 6812 #endif /* SQLITE_AMALGAMATION */ 6813 6814 /* 6815 ** Definitions for mode bitmasks S_IFDIR, S_IFREG and S_IFLNK. 6816 ** 6817 ** In some ways it would be better to obtain these values from system 6818 ** header files. But, the dependency is undesirable and (a) these 6819 ** have been stable for decades, (b) the values are part of POSIX and 6820 ** are also made explicit in [man stat], and (c) are part of the 6821 ** file format for zip archives. 6822 */ 6823 #ifndef S_IFDIR 6824 # define S_IFDIR 0040000 6825 #endif 6826 #ifndef S_IFREG 6827 # define S_IFREG 0100000 6828 #endif 6829 #ifndef S_IFLNK 6830 # define S_IFLNK 0120000 6831 #endif 6832 6833 static const char ZIPFILE_SCHEMA[] = 6834 "CREATE TABLE y(" 6835 "name PRIMARY KEY," /* 0: Name of file in zip archive */ 6836 "mode," /* 1: POSIX mode for file */ 6837 "mtime," /* 2: Last modification time (secs since 1970)*/ 6838 "sz," /* 3: Size of object */ 6839 "rawdata," /* 4: Raw data */ 6840 "data," /* 5: Uncompressed data */ 6841 "method," /* 6: Compression method (integer) */ 6842 "z HIDDEN" /* 7: Name of zip file */ 6843 ") WITHOUT ROWID;"; 6844 6845 #define ZIPFILE_F_COLUMN_IDX 7 /* Index of column "file" in the above */ 6846 #define ZIPFILE_BUFFER_SIZE (64*1024) 6847 6848 6849 /* 6850 ** Magic numbers used to read and write zip files. 6851 ** 6852 ** ZIPFILE_NEWENTRY_MADEBY: 6853 ** Use this value for the "version-made-by" field in new zip file 6854 ** entries. The upper byte indicates "unix", and the lower byte 6855 ** indicates that the zip file matches pkzip specification 3.0. 6856 ** This is what info-zip seems to do. 6857 ** 6858 ** ZIPFILE_NEWENTRY_REQUIRED: 6859 ** Value for "version-required-to-extract" field of new entries. 6860 ** Version 2.0 is required to support folders and deflate compression. 6861 ** 6862 ** ZIPFILE_NEWENTRY_FLAGS: 6863 ** Value for "general-purpose-bit-flags" field of new entries. Bit 6864 ** 11 means "utf-8 filename and comment". 6865 ** 6866 ** ZIPFILE_SIGNATURE_CDS: 6867 ** First 4 bytes of a valid CDS record. 6868 ** 6869 ** ZIPFILE_SIGNATURE_LFH: 6870 ** First 4 bytes of a valid LFH record. 6871 ** 6872 ** ZIPFILE_SIGNATURE_EOCD 6873 ** First 4 bytes of a valid EOCD record. 6874 */ 6875 #define ZIPFILE_EXTRA_TIMESTAMP 0x5455 6876 #define ZIPFILE_NEWENTRY_MADEBY ((3<<8) + 30) 6877 #define ZIPFILE_NEWENTRY_REQUIRED 20 6878 #define ZIPFILE_NEWENTRY_FLAGS 0x800 6879 #define ZIPFILE_SIGNATURE_CDS 0x02014b50 6880 #define ZIPFILE_SIGNATURE_LFH 0x04034b50 6881 #define ZIPFILE_SIGNATURE_EOCD 0x06054b50 6882 6883 /* 6884 ** The sizes of the fixed-size part of each of the three main data 6885 ** structures in a zip archive. 6886 */ 6887 #define ZIPFILE_LFH_FIXED_SZ 30 6888 #define ZIPFILE_EOCD_FIXED_SZ 22 6889 #define ZIPFILE_CDS_FIXED_SZ 46 6890 6891 /* 6892 *** 4.3.16 End of central directory record: 6893 *** 6894 *** end of central dir signature 4 bytes (0x06054b50) 6895 *** number of this disk 2 bytes 6896 *** number of the disk with the 6897 *** start of the central directory 2 bytes 6898 *** total number of entries in the 6899 *** central directory on this disk 2 bytes 6900 *** total number of entries in 6901 *** the central directory 2 bytes 6902 *** size of the central directory 4 bytes 6903 *** offset of start of central 6904 *** directory with respect to 6905 *** the starting disk number 4 bytes 6906 *** .ZIP file comment length 2 bytes 6907 *** .ZIP file comment (variable size) 6908 */ 6909 typedef struct ZipfileEOCD ZipfileEOCD; 6910 struct ZipfileEOCD { 6911 u16 iDisk; 6912 u16 iFirstDisk; 6913 u16 nEntry; 6914 u16 nEntryTotal; 6915 u32 nSize; 6916 u32 iOffset; 6917 }; 6918 6919 /* 6920 *** 4.3.12 Central directory structure: 6921 *** 6922 *** ... 6923 *** 6924 *** central file header signature 4 bytes (0x02014b50) 6925 *** version made by 2 bytes 6926 *** version needed to extract 2 bytes 6927 *** general purpose bit flag 2 bytes 6928 *** compression method 2 bytes 6929 *** last mod file time 2 bytes 6930 *** last mod file date 2 bytes 6931 *** crc-32 4 bytes 6932 *** compressed size 4 bytes 6933 *** uncompressed size 4 bytes 6934 *** file name length 2 bytes 6935 *** extra field length 2 bytes 6936 *** file comment length 2 bytes 6937 *** disk number start 2 bytes 6938 *** internal file attributes 2 bytes 6939 *** external file attributes 4 bytes 6940 *** relative offset of local header 4 bytes 6941 */ 6942 typedef struct ZipfileCDS ZipfileCDS; 6943 struct ZipfileCDS { 6944 u16 iVersionMadeBy; 6945 u16 iVersionExtract; 6946 u16 flags; 6947 u16 iCompression; 6948 u16 mTime; 6949 u16 mDate; 6950 u32 crc32; 6951 u32 szCompressed; 6952 u32 szUncompressed; 6953 u16 nFile; 6954 u16 nExtra; 6955 u16 nComment; 6956 u16 iDiskStart; 6957 u16 iInternalAttr; 6958 u32 iExternalAttr; 6959 u32 iOffset; 6960 char *zFile; /* Filename (sqlite3_malloc()) */ 6961 }; 6962 6963 /* 6964 *** 4.3.7 Local file header: 6965 *** 6966 *** local file header signature 4 bytes (0x04034b50) 6967 *** version needed to extract 2 bytes 6968 *** general purpose bit flag 2 bytes 6969 *** compression method 2 bytes 6970 *** last mod file time 2 bytes 6971 *** last mod file date 2 bytes 6972 *** crc-32 4 bytes 6973 *** compressed size 4 bytes 6974 *** uncompressed size 4 bytes 6975 *** file name length 2 bytes 6976 *** extra field length 2 bytes 6977 *** 6978 */ 6979 typedef struct ZipfileLFH ZipfileLFH; 6980 struct ZipfileLFH { 6981 u16 iVersionExtract; 6982 u16 flags; 6983 u16 iCompression; 6984 u16 mTime; 6985 u16 mDate; 6986 u32 crc32; 6987 u32 szCompressed; 6988 u32 szUncompressed; 6989 u16 nFile; 6990 u16 nExtra; 6991 }; 6992 6993 typedef struct ZipfileEntry ZipfileEntry; 6994 struct ZipfileEntry { 6995 ZipfileCDS cds; /* Parsed CDS record */ 6996 u32 mUnixTime; /* Modification time, in UNIX format */ 6997 u8 *aExtra; /* cds.nExtra+cds.nComment bytes of extra data */ 6998 i64 iDataOff; /* Offset to data in file (if aData==0) */ 6999 u8 *aData; /* cds.szCompressed bytes of compressed data */ 7000 ZipfileEntry *pNext; /* Next element in in-memory CDS */ 7001 }; 7002 7003 /* 7004 ** Cursor type for zipfile tables. 7005 */ 7006 typedef struct ZipfileCsr ZipfileCsr; 7007 struct ZipfileCsr { 7008 sqlite3_vtab_cursor base; /* Base class - must be first */ 7009 i64 iId; /* Cursor ID */ 7010 u8 bEof; /* True when at EOF */ 7011 u8 bNoop; /* If next xNext() call is no-op */ 7012 7013 /* Used outside of write transactions */ 7014 FILE *pFile; /* Zip file */ 7015 i64 iNextOff; /* Offset of next record in central directory */ 7016 ZipfileEOCD eocd; /* Parse of central directory record */ 7017 7018 ZipfileEntry *pFreeEntry; /* Free this list when cursor is closed or reset */ 7019 ZipfileEntry *pCurrent; /* Current entry */ 7020 ZipfileCsr *pCsrNext; /* Next cursor on same virtual table */ 7021 }; 7022 7023 typedef struct ZipfileTab ZipfileTab; 7024 struct ZipfileTab { 7025 sqlite3_vtab base; /* Base class - must be first */ 7026 char *zFile; /* Zip file this table accesses (may be NULL) */ 7027 sqlite3 *db; /* Host database connection */ 7028 u8 *aBuffer; /* Temporary buffer used for various tasks */ 7029 7030 ZipfileCsr *pCsrList; /* List of cursors */ 7031 i64 iNextCsrid; 7032 7033 /* The following are used by write transactions only */ 7034 ZipfileEntry *pFirstEntry; /* Linked list of all files (if pWriteFd!=0) */ 7035 ZipfileEntry *pLastEntry; /* Last element in pFirstEntry list */ 7036 FILE *pWriteFd; /* File handle open on zip archive */ 7037 i64 szCurrent; /* Current size of zip archive */ 7038 i64 szOrig; /* Size of archive at start of transaction */ 7039 }; 7040 7041 /* 7042 ** Set the error message contained in context ctx to the results of 7043 ** vprintf(zFmt, ...). 7044 */ 7045 static void zipfileCtxErrorMsg(sqlite3_context *ctx, const char *zFmt, ...){ 7046 char *zMsg = 0; 7047 va_list ap; 7048 va_start(ap, zFmt); 7049 zMsg = sqlite3_vmprintf(zFmt, ap); 7050 sqlite3_result_error(ctx, zMsg, -1); 7051 sqlite3_free(zMsg); 7052 va_end(ap); 7053 } 7054 7055 /* 7056 ** If string zIn is quoted, dequote it in place. Otherwise, if the string 7057 ** is not quoted, do nothing. 7058 */ 7059 static void zipfileDequote(char *zIn){ 7060 char q = zIn[0]; 7061 if( q=='"' || q=='\'' || q=='`' || q=='[' ){ 7062 int iIn = 1; 7063 int iOut = 0; 7064 if( q=='[' ) q = ']'; 7065 while( ALWAYS(zIn[iIn]) ){ 7066 char c = zIn[iIn++]; 7067 if( c==q && zIn[iIn++]!=q ) break; 7068 zIn[iOut++] = c; 7069 } 7070 zIn[iOut] = '\0'; 7071 } 7072 } 7073 7074 /* 7075 ** Construct a new ZipfileTab virtual table object. 7076 ** 7077 ** argv[0] -> module name ("zipfile") 7078 ** argv[1] -> database name 7079 ** argv[2] -> table name 7080 ** argv[...] -> "column name" and other module argument fields. 7081 */ 7082 static int zipfileConnect( 7083 sqlite3 *db, 7084 void *pAux, 7085 int argc, const char *const*argv, 7086 sqlite3_vtab **ppVtab, 7087 char **pzErr 7088 ){ 7089 int nByte = sizeof(ZipfileTab) + ZIPFILE_BUFFER_SIZE; 7090 int nFile = 0; 7091 const char *zFile = 0; 7092 ZipfileTab *pNew = 0; 7093 int rc; 7094 7095 /* If the table name is not "zipfile", require that the argument be 7096 ** specified. This stops zipfile tables from being created as: 7097 ** 7098 ** CREATE VIRTUAL TABLE zzz USING zipfile(); 7099 ** 7100 ** It does not prevent: 7101 ** 7102 ** CREATE VIRTUAL TABLE zipfile USING zipfile(); 7103 */ 7104 assert( 0==sqlite3_stricmp(argv[0], "zipfile") ); 7105 if( (0!=sqlite3_stricmp(argv[2], "zipfile") && argc<4) || argc>4 ){ 7106 *pzErr = sqlite3_mprintf("zipfile constructor requires one argument"); 7107 return SQLITE_ERROR; 7108 } 7109 7110 if( argc>3 ){ 7111 zFile = argv[3]; 7112 nFile = (int)strlen(zFile)+1; 7113 } 7114 7115 rc = sqlite3_declare_vtab(db, ZIPFILE_SCHEMA); 7116 if( rc==SQLITE_OK ){ 7117 pNew = (ZipfileTab*)sqlite3_malloc64((sqlite3_int64)nByte+nFile); 7118 if( pNew==0 ) return SQLITE_NOMEM; 7119 memset(pNew, 0, nByte+nFile); 7120 pNew->db = db; 7121 pNew->aBuffer = (u8*)&pNew[1]; 7122 if( zFile ){ 7123 pNew->zFile = (char*)&pNew->aBuffer[ZIPFILE_BUFFER_SIZE]; 7124 memcpy(pNew->zFile, zFile, nFile); 7125 zipfileDequote(pNew->zFile); 7126 } 7127 } 7128 sqlite3_vtab_config(db, SQLITE_VTAB_DIRECTONLY); 7129 *ppVtab = (sqlite3_vtab*)pNew; 7130 return rc; 7131 } 7132 7133 /* 7134 ** Free the ZipfileEntry structure indicated by the only argument. 7135 */ 7136 static void zipfileEntryFree(ZipfileEntry *p){ 7137 if( p ){ 7138 sqlite3_free(p->cds.zFile); 7139 sqlite3_free(p); 7140 } 7141 } 7142 7143 /* 7144 ** Release resources that should be freed at the end of a write 7145 ** transaction. 7146 */ 7147 static void zipfileCleanupTransaction(ZipfileTab *pTab){ 7148 ZipfileEntry *pEntry; 7149 ZipfileEntry *pNext; 7150 7151 if( pTab->pWriteFd ){ 7152 fclose(pTab->pWriteFd); 7153 pTab->pWriteFd = 0; 7154 } 7155 for(pEntry=pTab->pFirstEntry; pEntry; pEntry=pNext){ 7156 pNext = pEntry->pNext; 7157 zipfileEntryFree(pEntry); 7158 } 7159 pTab->pFirstEntry = 0; 7160 pTab->pLastEntry = 0; 7161 pTab->szCurrent = 0; 7162 pTab->szOrig = 0; 7163 } 7164 7165 /* 7166 ** This method is the destructor for zipfile vtab objects. 7167 */ 7168 static int zipfileDisconnect(sqlite3_vtab *pVtab){ 7169 zipfileCleanupTransaction((ZipfileTab*)pVtab); 7170 sqlite3_free(pVtab); 7171 return SQLITE_OK; 7172 } 7173 7174 /* 7175 ** Constructor for a new ZipfileCsr object. 7176 */ 7177 static int zipfileOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCsr){ 7178 ZipfileTab *pTab = (ZipfileTab*)p; 7179 ZipfileCsr *pCsr; 7180 pCsr = sqlite3_malloc(sizeof(*pCsr)); 7181 *ppCsr = (sqlite3_vtab_cursor*)pCsr; 7182 if( pCsr==0 ){ 7183 return SQLITE_NOMEM; 7184 } 7185 memset(pCsr, 0, sizeof(*pCsr)); 7186 pCsr->iId = ++pTab->iNextCsrid; 7187 pCsr->pCsrNext = pTab->pCsrList; 7188 pTab->pCsrList = pCsr; 7189 return SQLITE_OK; 7190 } 7191 7192 /* 7193 ** Reset a cursor back to the state it was in when first returned 7194 ** by zipfileOpen(). 7195 */ 7196 static void zipfileResetCursor(ZipfileCsr *pCsr){ 7197 ZipfileEntry *p; 7198 ZipfileEntry *pNext; 7199 7200 pCsr->bEof = 0; 7201 if( pCsr->pFile ){ 7202 fclose(pCsr->pFile); 7203 pCsr->pFile = 0; 7204 zipfileEntryFree(pCsr->pCurrent); 7205 pCsr->pCurrent = 0; 7206 } 7207 7208 for(p=pCsr->pFreeEntry; p; p=pNext){ 7209 pNext = p->pNext; 7210 zipfileEntryFree(p); 7211 } 7212 } 7213 7214 /* 7215 ** Destructor for an ZipfileCsr. 7216 */ 7217 static int zipfileClose(sqlite3_vtab_cursor *cur){ 7218 ZipfileCsr *pCsr = (ZipfileCsr*)cur; 7219 ZipfileTab *pTab = (ZipfileTab*)(pCsr->base.pVtab); 7220 ZipfileCsr **pp; 7221 zipfileResetCursor(pCsr); 7222 7223 /* Remove this cursor from the ZipfileTab.pCsrList list. */ 7224 for(pp=&pTab->pCsrList; *pp!=pCsr; pp=&((*pp)->pCsrNext)); 7225 *pp = pCsr->pCsrNext; 7226 7227 sqlite3_free(pCsr); 7228 return SQLITE_OK; 7229 } 7230 7231 /* 7232 ** Set the error message for the virtual table associated with cursor 7233 ** pCsr to the results of vprintf(zFmt, ...). 7234 */ 7235 static void zipfileTableErr(ZipfileTab *pTab, const char *zFmt, ...){ 7236 va_list ap; 7237 va_start(ap, zFmt); 7238 sqlite3_free(pTab->base.zErrMsg); 7239 pTab->base.zErrMsg = sqlite3_vmprintf(zFmt, ap); 7240 va_end(ap); 7241 } 7242 static void zipfileCursorErr(ZipfileCsr *pCsr, const char *zFmt, ...){ 7243 va_list ap; 7244 va_start(ap, zFmt); 7245 sqlite3_free(pCsr->base.pVtab->zErrMsg); 7246 pCsr->base.pVtab->zErrMsg = sqlite3_vmprintf(zFmt, ap); 7247 va_end(ap); 7248 } 7249 7250 /* 7251 ** Read nRead bytes of data from offset iOff of file pFile into buffer 7252 ** aRead[]. Return SQLITE_OK if successful, or an SQLite error code 7253 ** otherwise. 7254 ** 7255 ** If an error does occur, output variable (*pzErrmsg) may be set to point 7256 ** to an English language error message. It is the responsibility of the 7257 ** caller to eventually free this buffer using 7258 ** sqlite3_free(). 7259 */ 7260 static int zipfileReadData( 7261 FILE *pFile, /* Read from this file */ 7262 u8 *aRead, /* Read into this buffer */ 7263 int nRead, /* Number of bytes to read */ 7264 i64 iOff, /* Offset to read from */ 7265 char **pzErrmsg /* OUT: Error message (from sqlite3_malloc) */ 7266 ){ 7267 size_t n; 7268 fseek(pFile, (long)iOff, SEEK_SET); 7269 n = fread(aRead, 1, nRead, pFile); 7270 if( (int)n!=nRead ){ 7271 *pzErrmsg = sqlite3_mprintf("error in fread()"); 7272 return SQLITE_ERROR; 7273 } 7274 return SQLITE_OK; 7275 } 7276 7277 static int zipfileAppendData( 7278 ZipfileTab *pTab, 7279 const u8 *aWrite, 7280 int nWrite 7281 ){ 7282 if( nWrite>0 ){ 7283 size_t n = nWrite; 7284 fseek(pTab->pWriteFd, (long)pTab->szCurrent, SEEK_SET); 7285 n = fwrite(aWrite, 1, nWrite, pTab->pWriteFd); 7286 if( (int)n!=nWrite ){ 7287 pTab->base.zErrMsg = sqlite3_mprintf("error in fwrite()"); 7288 return SQLITE_ERROR; 7289 } 7290 pTab->szCurrent += nWrite; 7291 } 7292 return SQLITE_OK; 7293 } 7294 7295 /* 7296 ** Read and return a 16-bit little-endian unsigned integer from buffer aBuf. 7297 */ 7298 static u16 zipfileGetU16(const u8 *aBuf){ 7299 return (aBuf[1] << 8) + aBuf[0]; 7300 } 7301 7302 /* 7303 ** Read and return a 32-bit little-endian unsigned integer from buffer aBuf. 7304 */ 7305 static u32 zipfileGetU32(const u8 *aBuf){ 7306 if( aBuf==0 ) return 0; 7307 return ((u32)(aBuf[3]) << 24) 7308 + ((u32)(aBuf[2]) << 16) 7309 + ((u32)(aBuf[1]) << 8) 7310 + ((u32)(aBuf[0]) << 0); 7311 } 7312 7313 /* 7314 ** Write a 16-bit little endiate integer into buffer aBuf. 7315 */ 7316 static void zipfilePutU16(u8 *aBuf, u16 val){ 7317 aBuf[0] = val & 0xFF; 7318 aBuf[1] = (val>>8) & 0xFF; 7319 } 7320 7321 /* 7322 ** Write a 32-bit little endiate integer into buffer aBuf. 7323 */ 7324 static void zipfilePutU32(u8 *aBuf, u32 val){ 7325 aBuf[0] = val & 0xFF; 7326 aBuf[1] = (val>>8) & 0xFF; 7327 aBuf[2] = (val>>16) & 0xFF; 7328 aBuf[3] = (val>>24) & 0xFF; 7329 } 7330 7331 #define zipfileRead32(aBuf) ( aBuf+=4, zipfileGetU32(aBuf-4) ) 7332 #define zipfileRead16(aBuf) ( aBuf+=2, zipfileGetU16(aBuf-2) ) 7333 7334 #define zipfileWrite32(aBuf,val) { zipfilePutU32(aBuf,val); aBuf+=4; } 7335 #define zipfileWrite16(aBuf,val) { zipfilePutU16(aBuf,val); aBuf+=2; } 7336 7337 /* 7338 ** Magic numbers used to read CDS records. 7339 */ 7340 #define ZIPFILE_CDS_NFILE_OFF 28 7341 #define ZIPFILE_CDS_SZCOMPRESSED_OFF 20 7342 7343 /* 7344 ** Decode the CDS record in buffer aBuf into (*pCDS). Return SQLITE_ERROR 7345 ** if the record is not well-formed, or SQLITE_OK otherwise. 7346 */ 7347 static int zipfileReadCDS(u8 *aBuf, ZipfileCDS *pCDS){ 7348 u8 *aRead = aBuf; 7349 u32 sig = zipfileRead32(aRead); 7350 int rc = SQLITE_OK; 7351 if( sig!=ZIPFILE_SIGNATURE_CDS ){ 7352 rc = SQLITE_ERROR; 7353 }else{ 7354 pCDS->iVersionMadeBy = zipfileRead16(aRead); 7355 pCDS->iVersionExtract = zipfileRead16(aRead); 7356 pCDS->flags = zipfileRead16(aRead); 7357 pCDS->iCompression = zipfileRead16(aRead); 7358 pCDS->mTime = zipfileRead16(aRead); 7359 pCDS->mDate = zipfileRead16(aRead); 7360 pCDS->crc32 = zipfileRead32(aRead); 7361 pCDS->szCompressed = zipfileRead32(aRead); 7362 pCDS->szUncompressed = zipfileRead32(aRead); 7363 assert( aRead==&aBuf[ZIPFILE_CDS_NFILE_OFF] ); 7364 pCDS->nFile = zipfileRead16(aRead); 7365 pCDS->nExtra = zipfileRead16(aRead); 7366 pCDS->nComment = zipfileRead16(aRead); 7367 pCDS->iDiskStart = zipfileRead16(aRead); 7368 pCDS->iInternalAttr = zipfileRead16(aRead); 7369 pCDS->iExternalAttr = zipfileRead32(aRead); 7370 pCDS->iOffset = zipfileRead32(aRead); 7371 assert( aRead==&aBuf[ZIPFILE_CDS_FIXED_SZ] ); 7372 } 7373 7374 return rc; 7375 } 7376 7377 /* 7378 ** Decode the LFH record in buffer aBuf into (*pLFH). Return SQLITE_ERROR 7379 ** if the record is not well-formed, or SQLITE_OK otherwise. 7380 */ 7381 static int zipfileReadLFH( 7382 u8 *aBuffer, 7383 ZipfileLFH *pLFH 7384 ){ 7385 u8 *aRead = aBuffer; 7386 int rc = SQLITE_OK; 7387 7388 u32 sig = zipfileRead32(aRead); 7389 if( sig!=ZIPFILE_SIGNATURE_LFH ){ 7390 rc = SQLITE_ERROR; 7391 }else{ 7392 pLFH->iVersionExtract = zipfileRead16(aRead); 7393 pLFH->flags = zipfileRead16(aRead); 7394 pLFH->iCompression = zipfileRead16(aRead); 7395 pLFH->mTime = zipfileRead16(aRead); 7396 pLFH->mDate = zipfileRead16(aRead); 7397 pLFH->crc32 = zipfileRead32(aRead); 7398 pLFH->szCompressed = zipfileRead32(aRead); 7399 pLFH->szUncompressed = zipfileRead32(aRead); 7400 pLFH->nFile = zipfileRead16(aRead); 7401 pLFH->nExtra = zipfileRead16(aRead); 7402 } 7403 return rc; 7404 } 7405 7406 7407 /* 7408 ** Buffer aExtra (size nExtra bytes) contains zip archive "extra" fields. 7409 ** Scan through this buffer to find an "extra-timestamp" field. If one 7410 ** exists, extract the 32-bit modification-timestamp from it and store 7411 ** the value in output parameter *pmTime. 7412 ** 7413 ** Zero is returned if no extra-timestamp record could be found (and so 7414 ** *pmTime is left unchanged), or non-zero otherwise. 7415 ** 7416 ** The general format of an extra field is: 7417 ** 7418 ** Header ID 2 bytes 7419 ** Data Size 2 bytes 7420 ** Data N bytes 7421 */ 7422 static int zipfileScanExtra(u8 *aExtra, int nExtra, u32 *pmTime){ 7423 int ret = 0; 7424 u8 *p = aExtra; 7425 u8 *pEnd = &aExtra[nExtra]; 7426 7427 while( p<pEnd ){ 7428 u16 id = zipfileRead16(p); 7429 u16 nByte = zipfileRead16(p); 7430 7431 switch( id ){ 7432 case ZIPFILE_EXTRA_TIMESTAMP: { 7433 u8 b = p[0]; 7434 if( b & 0x01 ){ /* 0x01 -> modtime is present */ 7435 *pmTime = zipfileGetU32(&p[1]); 7436 ret = 1; 7437 } 7438 break; 7439 } 7440 } 7441 7442 p += nByte; 7443 } 7444 return ret; 7445 } 7446 7447 /* 7448 ** Convert the standard MS-DOS timestamp stored in the mTime and mDate 7449 ** fields of the CDS structure passed as the only argument to a 32-bit 7450 ** UNIX seconds-since-the-epoch timestamp. Return the result. 7451 ** 7452 ** "Standard" MS-DOS time format: 7453 ** 7454 ** File modification time: 7455 ** Bits 00-04: seconds divided by 2 7456 ** Bits 05-10: minute 7457 ** Bits 11-15: hour 7458 ** File modification date: 7459 ** Bits 00-04: day 7460 ** Bits 05-08: month (1-12) 7461 ** Bits 09-15: years from 1980 7462 ** 7463 ** https://msdn.microsoft.com/en-us/library/9kkf9tah.aspx 7464 */ 7465 static u32 zipfileMtime(ZipfileCDS *pCDS){ 7466 int Y,M,D,X1,X2,A,B,sec,min,hr; 7467 i64 JDsec; 7468 Y = (1980 + ((pCDS->mDate >> 9) & 0x7F)); 7469 M = ((pCDS->mDate >> 5) & 0x0F); 7470 D = (pCDS->mDate & 0x1F); 7471 sec = (pCDS->mTime & 0x1F)*2; 7472 min = (pCDS->mTime >> 5) & 0x3F; 7473 hr = (pCDS->mTime >> 11) & 0x1F; 7474 if( M<=2 ){ 7475 Y--; 7476 M += 12; 7477 } 7478 X1 = 36525*(Y+4716)/100; 7479 X2 = 306001*(M+1)/10000; 7480 A = Y/100; 7481 B = 2 - A + (A/4); 7482 JDsec = (i64)((X1 + X2 + D + B - 1524.5)*86400) + hr*3600 + min*60 + sec; 7483 return (u32)(JDsec - (i64)24405875*(i64)8640); 7484 } 7485 7486 /* 7487 ** The opposite of zipfileMtime(). This function populates the mTime and 7488 ** mDate fields of the CDS structure passed as the first argument according 7489 ** to the UNIX timestamp value passed as the second. 7490 */ 7491 static void zipfileMtimeToDos(ZipfileCDS *pCds, u32 mUnixTime){ 7492 /* Convert unix timestamp to JD (2440588 is noon on 1/1/1970) */ 7493 i64 JD = (i64)2440588 + mUnixTime / (24*60*60); 7494 7495 int A, B, C, D, E; 7496 int yr, mon, day; 7497 int hr, min, sec; 7498 7499 A = (int)((JD - 1867216.25)/36524.25); 7500 A = (int)(JD + 1 + A - (A/4)); 7501 B = A + 1524; 7502 C = (int)((B - 122.1)/365.25); 7503 D = (36525*(C&32767))/100; 7504 E = (int)((B-D)/30.6001); 7505 7506 day = B - D - (int)(30.6001*E); 7507 mon = (E<14 ? E-1 : E-13); 7508 yr = mon>2 ? C-4716 : C-4715; 7509 7510 hr = (mUnixTime % (24*60*60)) / (60*60); 7511 min = (mUnixTime % (60*60)) / 60; 7512 sec = (mUnixTime % 60); 7513 7514 if( yr>=1980 ){ 7515 pCds->mDate = (u16)(day + (mon << 5) + ((yr-1980) << 9)); 7516 pCds->mTime = (u16)(sec/2 + (min<<5) + (hr<<11)); 7517 }else{ 7518 pCds->mDate = pCds->mTime = 0; 7519 } 7520 7521 assert( mUnixTime<315507600 7522 || mUnixTime==zipfileMtime(pCds) 7523 || ((mUnixTime % 2) && mUnixTime-1==zipfileMtime(pCds)) 7524 /* || (mUnixTime % 2) */ 7525 ); 7526 } 7527 7528 /* 7529 ** If aBlob is not NULL, then it is a pointer to a buffer (nBlob bytes in 7530 ** size) containing an entire zip archive image. Or, if aBlob is NULL, 7531 ** then pFile is a file-handle open on a zip file. In either case, this 7532 ** function creates a ZipfileEntry object based on the zip archive entry 7533 ** for which the CDS record is at offset iOff. 7534 ** 7535 ** If successful, SQLITE_OK is returned and (*ppEntry) set to point to 7536 ** the new object. Otherwise, an SQLite error code is returned and the 7537 ** final value of (*ppEntry) undefined. 7538 */ 7539 static int zipfileGetEntry( 7540 ZipfileTab *pTab, /* Store any error message here */ 7541 const u8 *aBlob, /* Pointer to in-memory file image */ 7542 int nBlob, /* Size of aBlob[] in bytes */ 7543 FILE *pFile, /* If aBlob==0, read from this file */ 7544 i64 iOff, /* Offset of CDS record */ 7545 ZipfileEntry **ppEntry /* OUT: Pointer to new object */ 7546 ){ 7547 u8 *aRead; 7548 char **pzErr = &pTab->base.zErrMsg; 7549 int rc = SQLITE_OK; 7550 7551 if( aBlob==0 ){ 7552 aRead = pTab->aBuffer; 7553 rc = zipfileReadData(pFile, aRead, ZIPFILE_CDS_FIXED_SZ, iOff, pzErr); 7554 }else{ 7555 aRead = (u8*)&aBlob[iOff]; 7556 } 7557 7558 if( rc==SQLITE_OK ){ 7559 sqlite3_int64 nAlloc; 7560 ZipfileEntry *pNew; 7561 7562 int nFile = zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF]); 7563 int nExtra = zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF+2]); 7564 nExtra += zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF+4]); 7565 7566 nAlloc = sizeof(ZipfileEntry) + nExtra; 7567 if( aBlob ){ 7568 nAlloc += zipfileGetU32(&aRead[ZIPFILE_CDS_SZCOMPRESSED_OFF]); 7569 } 7570 7571 pNew = (ZipfileEntry*)sqlite3_malloc64(nAlloc); 7572 if( pNew==0 ){ 7573 rc = SQLITE_NOMEM; 7574 }else{ 7575 memset(pNew, 0, sizeof(ZipfileEntry)); 7576 rc = zipfileReadCDS(aRead, &pNew->cds); 7577 if( rc!=SQLITE_OK ){ 7578 *pzErr = sqlite3_mprintf("failed to read CDS at offset %lld", iOff); 7579 }else if( aBlob==0 ){ 7580 rc = zipfileReadData( 7581 pFile, aRead, nExtra+nFile, iOff+ZIPFILE_CDS_FIXED_SZ, pzErr 7582 ); 7583 }else{ 7584 aRead = (u8*)&aBlob[iOff + ZIPFILE_CDS_FIXED_SZ]; 7585 } 7586 } 7587 7588 if( rc==SQLITE_OK ){ 7589 u32 *pt = &pNew->mUnixTime; 7590 pNew->cds.zFile = sqlite3_mprintf("%.*s", nFile, aRead); 7591 pNew->aExtra = (u8*)&pNew[1]; 7592 memcpy(pNew->aExtra, &aRead[nFile], nExtra); 7593 if( pNew->cds.zFile==0 ){ 7594 rc = SQLITE_NOMEM; 7595 }else if( 0==zipfileScanExtra(&aRead[nFile], pNew->cds.nExtra, pt) ){ 7596 pNew->mUnixTime = zipfileMtime(&pNew->cds); 7597 } 7598 } 7599 7600 if( rc==SQLITE_OK ){ 7601 static const int szFix = ZIPFILE_LFH_FIXED_SZ; 7602 ZipfileLFH lfh; 7603 if( pFile ){ 7604 rc = zipfileReadData(pFile, aRead, szFix, pNew->cds.iOffset, pzErr); 7605 }else{ 7606 aRead = (u8*)&aBlob[pNew->cds.iOffset]; 7607 } 7608 7609 if( rc==SQLITE_OK ) rc = zipfileReadLFH(aRead, &lfh); 7610 if( rc==SQLITE_OK ){ 7611 pNew->iDataOff = pNew->cds.iOffset + ZIPFILE_LFH_FIXED_SZ; 7612 pNew->iDataOff += lfh.nFile + lfh.nExtra; 7613 if( aBlob && pNew->cds.szCompressed ){ 7614 pNew->aData = &pNew->aExtra[nExtra]; 7615 memcpy(pNew->aData, &aBlob[pNew->iDataOff], pNew->cds.szCompressed); 7616 } 7617 }else{ 7618 *pzErr = sqlite3_mprintf("failed to read LFH at offset %d", 7619 (int)pNew->cds.iOffset 7620 ); 7621 } 7622 } 7623 7624 if( rc!=SQLITE_OK ){ 7625 zipfileEntryFree(pNew); 7626 }else{ 7627 *ppEntry = pNew; 7628 } 7629 } 7630 7631 return rc; 7632 } 7633 7634 /* 7635 ** Advance an ZipfileCsr to its next row of output. 7636 */ 7637 static int zipfileNext(sqlite3_vtab_cursor *cur){ 7638 ZipfileCsr *pCsr = (ZipfileCsr*)cur; 7639 int rc = SQLITE_OK; 7640 7641 if( pCsr->pFile ){ 7642 i64 iEof = pCsr->eocd.iOffset + pCsr->eocd.nSize; 7643 zipfileEntryFree(pCsr->pCurrent); 7644 pCsr->pCurrent = 0; 7645 if( pCsr->iNextOff>=iEof ){ 7646 pCsr->bEof = 1; 7647 }else{ 7648 ZipfileEntry *p = 0; 7649 ZipfileTab *pTab = (ZipfileTab*)(cur->pVtab); 7650 rc = zipfileGetEntry(pTab, 0, 0, pCsr->pFile, pCsr->iNextOff, &p); 7651 if( rc==SQLITE_OK ){ 7652 pCsr->iNextOff += ZIPFILE_CDS_FIXED_SZ; 7653 pCsr->iNextOff += (int)p->cds.nExtra + p->cds.nFile + p->cds.nComment; 7654 } 7655 pCsr->pCurrent = p; 7656 } 7657 }else{ 7658 if( !pCsr->bNoop ){ 7659 pCsr->pCurrent = pCsr->pCurrent->pNext; 7660 } 7661 if( pCsr->pCurrent==0 ){ 7662 pCsr->bEof = 1; 7663 } 7664 } 7665 7666 pCsr->bNoop = 0; 7667 return rc; 7668 } 7669 7670 static void zipfileFree(void *p) { 7671 sqlite3_free(p); 7672 } 7673 7674 /* 7675 ** Buffer aIn (size nIn bytes) contains compressed data. Uncompressed, the 7676 ** size is nOut bytes. This function uncompresses the data and sets the 7677 ** return value in context pCtx to the result (a blob). 7678 ** 7679 ** If an error occurs, an error code is left in pCtx instead. 7680 */ 7681 static void zipfileInflate( 7682 sqlite3_context *pCtx, /* Store result here */ 7683 const u8 *aIn, /* Compressed data */ 7684 int nIn, /* Size of buffer aIn[] in bytes */ 7685 int nOut /* Expected output size */ 7686 ){ 7687 u8 *aRes = sqlite3_malloc(nOut); 7688 if( aRes==0 ){ 7689 sqlite3_result_error_nomem(pCtx); 7690 }else{ 7691 int err; 7692 z_stream str; 7693 memset(&str, 0, sizeof(str)); 7694 7695 str.next_in = (Byte*)aIn; 7696 str.avail_in = nIn; 7697 str.next_out = (Byte*)aRes; 7698 str.avail_out = nOut; 7699 7700 err = inflateInit2(&str, -15); 7701 if( err!=Z_OK ){ 7702 zipfileCtxErrorMsg(pCtx, "inflateInit2() failed (%d)", err); 7703 }else{ 7704 err = inflate(&str, Z_NO_FLUSH); 7705 if( err!=Z_STREAM_END ){ 7706 zipfileCtxErrorMsg(pCtx, "inflate() failed (%d)", err); 7707 }else{ 7708 sqlite3_result_blob(pCtx, aRes, nOut, zipfileFree); 7709 aRes = 0; 7710 } 7711 } 7712 sqlite3_free(aRes); 7713 inflateEnd(&str); 7714 } 7715 } 7716 7717 /* 7718 ** Buffer aIn (size nIn bytes) contains uncompressed data. This function 7719 ** compresses it and sets (*ppOut) to point to a buffer containing the 7720 ** compressed data. The caller is responsible for eventually calling 7721 ** sqlite3_free() to release buffer (*ppOut). Before returning, (*pnOut) 7722 ** is set to the size of buffer (*ppOut) in bytes. 7723 ** 7724 ** If no error occurs, SQLITE_OK is returned. Otherwise, an SQLite error 7725 ** code is returned and an error message left in virtual-table handle 7726 ** pTab. The values of (*ppOut) and (*pnOut) are left unchanged in this 7727 ** case. 7728 */ 7729 static int zipfileDeflate( 7730 const u8 *aIn, int nIn, /* Input */ 7731 u8 **ppOut, int *pnOut, /* Output */ 7732 char **pzErr /* OUT: Error message */ 7733 ){ 7734 int rc = SQLITE_OK; 7735 sqlite3_int64 nAlloc; 7736 z_stream str; 7737 u8 *aOut; 7738 7739 memset(&str, 0, sizeof(str)); 7740 str.next_in = (Bytef*)aIn; 7741 str.avail_in = nIn; 7742 deflateInit2(&str, 9, Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY); 7743 7744 nAlloc = deflateBound(&str, nIn); 7745 aOut = (u8*)sqlite3_malloc64(nAlloc); 7746 if( aOut==0 ){ 7747 rc = SQLITE_NOMEM; 7748 }else{ 7749 int res; 7750 str.next_out = aOut; 7751 str.avail_out = nAlloc; 7752 res = deflate(&str, Z_FINISH); 7753 if( res==Z_STREAM_END ){ 7754 *ppOut = aOut; 7755 *pnOut = (int)str.total_out; 7756 }else{ 7757 sqlite3_free(aOut); 7758 *pzErr = sqlite3_mprintf("zipfile: deflate() error"); 7759 rc = SQLITE_ERROR; 7760 } 7761 deflateEnd(&str); 7762 } 7763 7764 return rc; 7765 } 7766 7767 7768 /* 7769 ** Return values of columns for the row at which the series_cursor 7770 ** is currently pointing. 7771 */ 7772 static int zipfileColumn( 7773 sqlite3_vtab_cursor *cur, /* The cursor */ 7774 sqlite3_context *ctx, /* First argument to sqlite3_result_...() */ 7775 int i /* Which column to return */ 7776 ){ 7777 ZipfileCsr *pCsr = (ZipfileCsr*)cur; 7778 ZipfileCDS *pCDS = &pCsr->pCurrent->cds; 7779 int rc = SQLITE_OK; 7780 switch( i ){ 7781 case 0: /* name */ 7782 sqlite3_result_text(ctx, pCDS->zFile, -1, SQLITE_TRANSIENT); 7783 break; 7784 case 1: /* mode */ 7785 /* TODO: Whether or not the following is correct surely depends on 7786 ** the platform on which the archive was created. */ 7787 sqlite3_result_int(ctx, pCDS->iExternalAttr >> 16); 7788 break; 7789 case 2: { /* mtime */ 7790 sqlite3_result_int64(ctx, pCsr->pCurrent->mUnixTime); 7791 break; 7792 } 7793 case 3: { /* sz */ 7794 if( sqlite3_vtab_nochange(ctx)==0 ){ 7795 sqlite3_result_int64(ctx, pCDS->szUncompressed); 7796 } 7797 break; 7798 } 7799 case 4: /* rawdata */ 7800 if( sqlite3_vtab_nochange(ctx) ) break; 7801 case 5: { /* data */ 7802 if( i==4 || pCDS->iCompression==0 || pCDS->iCompression==8 ){ 7803 int sz = pCDS->szCompressed; 7804 int szFinal = pCDS->szUncompressed; 7805 if( szFinal>0 ){ 7806 u8 *aBuf; 7807 u8 *aFree = 0; 7808 if( pCsr->pCurrent->aData ){ 7809 aBuf = pCsr->pCurrent->aData; 7810 }else{ 7811 aBuf = aFree = sqlite3_malloc64(sz); 7812 if( aBuf==0 ){ 7813 rc = SQLITE_NOMEM; 7814 }else{ 7815 FILE *pFile = pCsr->pFile; 7816 if( pFile==0 ){ 7817 pFile = ((ZipfileTab*)(pCsr->base.pVtab))->pWriteFd; 7818 } 7819 rc = zipfileReadData(pFile, aBuf, sz, pCsr->pCurrent->iDataOff, 7820 &pCsr->base.pVtab->zErrMsg 7821 ); 7822 } 7823 } 7824 if( rc==SQLITE_OK ){ 7825 if( i==5 && pCDS->iCompression ){ 7826 zipfileInflate(ctx, aBuf, sz, szFinal); 7827 }else{ 7828 sqlite3_result_blob(ctx, aBuf, sz, SQLITE_TRANSIENT); 7829 } 7830 } 7831 sqlite3_free(aFree); 7832 }else{ 7833 /* Figure out if this is a directory or a zero-sized file. Consider 7834 ** it to be a directory either if the mode suggests so, or if 7835 ** the final character in the name is '/'. */ 7836 u32 mode = pCDS->iExternalAttr >> 16; 7837 if( !(mode & S_IFDIR) && pCDS->zFile[pCDS->nFile-1]!='/' ){ 7838 sqlite3_result_blob(ctx, "", 0, SQLITE_STATIC); 7839 } 7840 } 7841 } 7842 break; 7843 } 7844 case 6: /* method */ 7845 sqlite3_result_int(ctx, pCDS->iCompression); 7846 break; 7847 default: /* z */ 7848 assert( i==7 ); 7849 sqlite3_result_int64(ctx, pCsr->iId); 7850 break; 7851 } 7852 7853 return rc; 7854 } 7855 7856 /* 7857 ** Return TRUE if the cursor is at EOF. 7858 */ 7859 static int zipfileEof(sqlite3_vtab_cursor *cur){ 7860 ZipfileCsr *pCsr = (ZipfileCsr*)cur; 7861 return pCsr->bEof; 7862 } 7863 7864 /* 7865 ** If aBlob is not NULL, then it points to a buffer nBlob bytes in size 7866 ** containing an entire zip archive image. Or, if aBlob is NULL, then pFile 7867 ** is guaranteed to be a file-handle open on a zip file. 7868 ** 7869 ** This function attempts to locate the EOCD record within the zip archive 7870 ** and populate *pEOCD with the results of decoding it. SQLITE_OK is 7871 ** returned if successful. Otherwise, an SQLite error code is returned and 7872 ** an English language error message may be left in virtual-table pTab. 7873 */ 7874 static int zipfileReadEOCD( 7875 ZipfileTab *pTab, /* Return errors here */ 7876 const u8 *aBlob, /* Pointer to in-memory file image */ 7877 int nBlob, /* Size of aBlob[] in bytes */ 7878 FILE *pFile, /* Read from this file if aBlob==0 */ 7879 ZipfileEOCD *pEOCD /* Object to populate */ 7880 ){ 7881 u8 *aRead = pTab->aBuffer; /* Temporary buffer */ 7882 int nRead; /* Bytes to read from file */ 7883 int rc = SQLITE_OK; 7884 7885 memset(pEOCD, 0, sizeof(ZipfileEOCD)); 7886 if( aBlob==0 ){ 7887 i64 iOff; /* Offset to read from */ 7888 i64 szFile; /* Total size of file in bytes */ 7889 fseek(pFile, 0, SEEK_END); 7890 szFile = (i64)ftell(pFile); 7891 if( szFile==0 ){ 7892 return SQLITE_OK; 7893 } 7894 nRead = (int)(MIN(szFile, ZIPFILE_BUFFER_SIZE)); 7895 iOff = szFile - nRead; 7896 rc = zipfileReadData(pFile, aRead, nRead, iOff, &pTab->base.zErrMsg); 7897 }else{ 7898 nRead = (int)(MIN(nBlob, ZIPFILE_BUFFER_SIZE)); 7899 aRead = (u8*)&aBlob[nBlob-nRead]; 7900 } 7901 7902 if( rc==SQLITE_OK ){ 7903 int i; 7904 7905 /* Scan backwards looking for the signature bytes */ 7906 for(i=nRead-20; i>=0; i--){ 7907 if( aRead[i]==0x50 && aRead[i+1]==0x4b 7908 && aRead[i+2]==0x05 && aRead[i+3]==0x06 7909 ){ 7910 break; 7911 } 7912 } 7913 if( i<0 ){ 7914 pTab->base.zErrMsg = sqlite3_mprintf( 7915 "cannot find end of central directory record" 7916 ); 7917 return SQLITE_ERROR; 7918 } 7919 7920 aRead += i+4; 7921 pEOCD->iDisk = zipfileRead16(aRead); 7922 pEOCD->iFirstDisk = zipfileRead16(aRead); 7923 pEOCD->nEntry = zipfileRead16(aRead); 7924 pEOCD->nEntryTotal = zipfileRead16(aRead); 7925 pEOCD->nSize = zipfileRead32(aRead); 7926 pEOCD->iOffset = zipfileRead32(aRead); 7927 } 7928 7929 return rc; 7930 } 7931 7932 /* 7933 ** Add object pNew to the linked list that begins at ZipfileTab.pFirstEntry 7934 ** and ends with pLastEntry. If argument pBefore is NULL, then pNew is added 7935 ** to the end of the list. Otherwise, it is added to the list immediately 7936 ** before pBefore (which is guaranteed to be a part of said list). 7937 */ 7938 static void zipfileAddEntry( 7939 ZipfileTab *pTab, 7940 ZipfileEntry *pBefore, 7941 ZipfileEntry *pNew 7942 ){ 7943 assert( (pTab->pFirstEntry==0)==(pTab->pLastEntry==0) ); 7944 assert( pNew->pNext==0 ); 7945 if( pBefore==0 ){ 7946 if( pTab->pFirstEntry==0 ){ 7947 pTab->pFirstEntry = pTab->pLastEntry = pNew; 7948 }else{ 7949 assert( pTab->pLastEntry->pNext==0 ); 7950 pTab->pLastEntry->pNext = pNew; 7951 pTab->pLastEntry = pNew; 7952 } 7953 }else{ 7954 ZipfileEntry **pp; 7955 for(pp=&pTab->pFirstEntry; *pp!=pBefore; pp=&((*pp)->pNext)); 7956 pNew->pNext = pBefore; 7957 *pp = pNew; 7958 } 7959 } 7960 7961 static int zipfileLoadDirectory(ZipfileTab *pTab, const u8 *aBlob, int nBlob){ 7962 ZipfileEOCD eocd; 7963 int rc; 7964 int i; 7965 i64 iOff; 7966 7967 rc = zipfileReadEOCD(pTab, aBlob, nBlob, pTab->pWriteFd, &eocd); 7968 iOff = eocd.iOffset; 7969 for(i=0; rc==SQLITE_OK && i<eocd.nEntry; i++){ 7970 ZipfileEntry *pNew = 0; 7971 rc = zipfileGetEntry(pTab, aBlob, nBlob, pTab->pWriteFd, iOff, &pNew); 7972 7973 if( rc==SQLITE_OK ){ 7974 zipfileAddEntry(pTab, 0, pNew); 7975 iOff += ZIPFILE_CDS_FIXED_SZ; 7976 iOff += (int)pNew->cds.nExtra + pNew->cds.nFile + pNew->cds.nComment; 7977 } 7978 } 7979 return rc; 7980 } 7981 7982 /* 7983 ** xFilter callback. 7984 */ 7985 static int zipfileFilter( 7986 sqlite3_vtab_cursor *cur, 7987 int idxNum, const char *idxStr, 7988 int argc, sqlite3_value **argv 7989 ){ 7990 ZipfileTab *pTab = (ZipfileTab*)cur->pVtab; 7991 ZipfileCsr *pCsr = (ZipfileCsr*)cur; 7992 const char *zFile = 0; /* Zip file to scan */ 7993 int rc = SQLITE_OK; /* Return Code */ 7994 int bInMemory = 0; /* True for an in-memory zipfile */ 7995 7996 zipfileResetCursor(pCsr); 7997 7998 if( pTab->zFile ){ 7999 zFile = pTab->zFile; 8000 }else if( idxNum==0 ){ 8001 zipfileCursorErr(pCsr, "zipfile() function requires an argument"); 8002 return SQLITE_ERROR; 8003 }else if( sqlite3_value_type(argv[0])==SQLITE_BLOB ){ 8004 const u8 *aBlob = (const u8*)sqlite3_value_blob(argv[0]); 8005 int nBlob = sqlite3_value_bytes(argv[0]); 8006 assert( pTab->pFirstEntry==0 ); 8007 rc = zipfileLoadDirectory(pTab, aBlob, nBlob); 8008 pCsr->pFreeEntry = pTab->pFirstEntry; 8009 pTab->pFirstEntry = pTab->pLastEntry = 0; 8010 if( rc!=SQLITE_OK ) return rc; 8011 bInMemory = 1; 8012 }else{ 8013 zFile = (const char*)sqlite3_value_text(argv[0]); 8014 } 8015 8016 if( 0==pTab->pWriteFd && 0==bInMemory ){ 8017 pCsr->pFile = fopen(zFile, "rb"); 8018 if( pCsr->pFile==0 ){ 8019 zipfileCursorErr(pCsr, "cannot open file: %s", zFile); 8020 rc = SQLITE_ERROR; 8021 }else{ 8022 rc = zipfileReadEOCD(pTab, 0, 0, pCsr->pFile, &pCsr->eocd); 8023 if( rc==SQLITE_OK ){ 8024 if( pCsr->eocd.nEntry==0 ){ 8025 pCsr->bEof = 1; 8026 }else{ 8027 pCsr->iNextOff = pCsr->eocd.iOffset; 8028 rc = zipfileNext(cur); 8029 } 8030 } 8031 } 8032 }else{ 8033 pCsr->bNoop = 1; 8034 pCsr->pCurrent = pCsr->pFreeEntry ? pCsr->pFreeEntry : pTab->pFirstEntry; 8035 rc = zipfileNext(cur); 8036 } 8037 8038 return rc; 8039 } 8040 8041 /* 8042 ** xBestIndex callback. 8043 */ 8044 static int zipfileBestIndex( 8045 sqlite3_vtab *tab, 8046 sqlite3_index_info *pIdxInfo 8047 ){ 8048 int i; 8049 int idx = -1; 8050 int unusable = 0; 8051 8052 for(i=0; i<pIdxInfo->nConstraint; i++){ 8053 const struct sqlite3_index_constraint *pCons = &pIdxInfo->aConstraint[i]; 8054 if( pCons->iColumn!=ZIPFILE_F_COLUMN_IDX ) continue; 8055 if( pCons->usable==0 ){ 8056 unusable = 1; 8057 }else if( pCons->op==SQLITE_INDEX_CONSTRAINT_EQ ){ 8058 idx = i; 8059 } 8060 } 8061 pIdxInfo->estimatedCost = 1000.0; 8062 if( idx>=0 ){ 8063 pIdxInfo->aConstraintUsage[idx].argvIndex = 1; 8064 pIdxInfo->aConstraintUsage[idx].omit = 1; 8065 pIdxInfo->idxNum = 1; 8066 }else if( unusable ){ 8067 return SQLITE_CONSTRAINT; 8068 } 8069 return SQLITE_OK; 8070 } 8071 8072 static ZipfileEntry *zipfileNewEntry(const char *zPath){ 8073 ZipfileEntry *pNew; 8074 pNew = sqlite3_malloc(sizeof(ZipfileEntry)); 8075 if( pNew ){ 8076 memset(pNew, 0, sizeof(ZipfileEntry)); 8077 pNew->cds.zFile = sqlite3_mprintf("%s", zPath); 8078 if( pNew->cds.zFile==0 ){ 8079 sqlite3_free(pNew); 8080 pNew = 0; 8081 } 8082 } 8083 return pNew; 8084 } 8085 8086 static int zipfileSerializeLFH(ZipfileEntry *pEntry, u8 *aBuf){ 8087 ZipfileCDS *pCds = &pEntry->cds; 8088 u8 *a = aBuf; 8089 8090 pCds->nExtra = 9; 8091 8092 /* Write the LFH itself */ 8093 zipfileWrite32(a, ZIPFILE_SIGNATURE_LFH); 8094 zipfileWrite16(a, pCds->iVersionExtract); 8095 zipfileWrite16(a, pCds->flags); 8096 zipfileWrite16(a, pCds->iCompression); 8097 zipfileWrite16(a, pCds->mTime); 8098 zipfileWrite16(a, pCds->mDate); 8099 zipfileWrite32(a, pCds->crc32); 8100 zipfileWrite32(a, pCds->szCompressed); 8101 zipfileWrite32(a, pCds->szUncompressed); 8102 zipfileWrite16(a, (u16)pCds->nFile); 8103 zipfileWrite16(a, pCds->nExtra); 8104 assert( a==&aBuf[ZIPFILE_LFH_FIXED_SZ] ); 8105 8106 /* Add the file name */ 8107 memcpy(a, pCds->zFile, (int)pCds->nFile); 8108 a += (int)pCds->nFile; 8109 8110 /* The "extra" data */ 8111 zipfileWrite16(a, ZIPFILE_EXTRA_TIMESTAMP); 8112 zipfileWrite16(a, 5); 8113 *a++ = 0x01; 8114 zipfileWrite32(a, pEntry->mUnixTime); 8115 8116 return a-aBuf; 8117 } 8118 8119 static int zipfileAppendEntry( 8120 ZipfileTab *pTab, 8121 ZipfileEntry *pEntry, 8122 const u8 *pData, 8123 int nData 8124 ){ 8125 u8 *aBuf = pTab->aBuffer; 8126 int nBuf; 8127 int rc; 8128 8129 nBuf = zipfileSerializeLFH(pEntry, aBuf); 8130 rc = zipfileAppendData(pTab, aBuf, nBuf); 8131 if( rc==SQLITE_OK ){ 8132 pEntry->iDataOff = pTab->szCurrent; 8133 rc = zipfileAppendData(pTab, pData, nData); 8134 } 8135 8136 return rc; 8137 } 8138 8139 static int zipfileGetMode( 8140 sqlite3_value *pVal, 8141 int bIsDir, /* If true, default to directory */ 8142 u32 *pMode, /* OUT: Mode value */ 8143 char **pzErr /* OUT: Error message */ 8144 ){ 8145 const char *z = (const char*)sqlite3_value_text(pVal); 8146 u32 mode = 0; 8147 if( z==0 ){ 8148 mode = (bIsDir ? (S_IFDIR + 0755) : (S_IFREG + 0644)); 8149 }else if( z[0]>='0' && z[0]<='9' ){ 8150 mode = (unsigned int)sqlite3_value_int(pVal); 8151 }else{ 8152 const char zTemplate[11] = "-rwxrwxrwx"; 8153 int i; 8154 if( strlen(z)!=10 ) goto parse_error; 8155 switch( z[0] ){ 8156 case '-': mode |= S_IFREG; break; 8157 case 'd': mode |= S_IFDIR; break; 8158 case 'l': mode |= S_IFLNK; break; 8159 default: goto parse_error; 8160 } 8161 for(i=1; i<10; i++){ 8162 if( z[i]==zTemplate[i] ) mode |= 1 << (9-i); 8163 else if( z[i]!='-' ) goto parse_error; 8164 } 8165 } 8166 if( ((mode & S_IFDIR)==0)==bIsDir ){ 8167 /* The "mode" attribute is a directory, but data has been specified. 8168 ** Or vice-versa - no data but "mode" is a file or symlink. */ 8169 *pzErr = sqlite3_mprintf("zipfile: mode does not match data"); 8170 return SQLITE_CONSTRAINT; 8171 } 8172 *pMode = mode; 8173 return SQLITE_OK; 8174 8175 parse_error: 8176 *pzErr = sqlite3_mprintf("zipfile: parse error in mode: %s", z); 8177 return SQLITE_ERROR; 8178 } 8179 8180 /* 8181 ** Both (const char*) arguments point to nul-terminated strings. Argument 8182 ** nB is the value of strlen(zB). This function returns 0 if the strings are 8183 ** identical, ignoring any trailing '/' character in either path. */ 8184 static int zipfileComparePath(const char *zA, const char *zB, int nB){ 8185 int nA = (int)strlen(zA); 8186 if( nA>0 && zA[nA-1]=='/' ) nA--; 8187 if( nB>0 && zB[nB-1]=='/' ) nB--; 8188 if( nA==nB && memcmp(zA, zB, nA)==0 ) return 0; 8189 return 1; 8190 } 8191 8192 static int zipfileBegin(sqlite3_vtab *pVtab){ 8193 ZipfileTab *pTab = (ZipfileTab*)pVtab; 8194 int rc = SQLITE_OK; 8195 8196 assert( pTab->pWriteFd==0 ); 8197 if( pTab->zFile==0 || pTab->zFile[0]==0 ){ 8198 pTab->base.zErrMsg = sqlite3_mprintf("zipfile: missing filename"); 8199 return SQLITE_ERROR; 8200 } 8201 8202 /* Open a write fd on the file. Also load the entire central directory 8203 ** structure into memory. During the transaction any new file data is 8204 ** appended to the archive file, but the central directory is accumulated 8205 ** in main-memory until the transaction is committed. */ 8206 pTab->pWriteFd = fopen(pTab->zFile, "ab+"); 8207 if( pTab->pWriteFd==0 ){ 8208 pTab->base.zErrMsg = sqlite3_mprintf( 8209 "zipfile: failed to open file %s for writing", pTab->zFile 8210 ); 8211 rc = SQLITE_ERROR; 8212 }else{ 8213 fseek(pTab->pWriteFd, 0, SEEK_END); 8214 pTab->szCurrent = pTab->szOrig = (i64)ftell(pTab->pWriteFd); 8215 rc = zipfileLoadDirectory(pTab, 0, 0); 8216 } 8217 8218 if( rc!=SQLITE_OK ){ 8219 zipfileCleanupTransaction(pTab); 8220 } 8221 8222 return rc; 8223 } 8224 8225 /* 8226 ** Return the current time as a 32-bit timestamp in UNIX epoch format (like 8227 ** time(2)). 8228 */ 8229 static u32 zipfileTime(void){ 8230 sqlite3_vfs *pVfs = sqlite3_vfs_find(0); 8231 u32 ret; 8232 if( pVfs==0 ) return 0; 8233 if( pVfs->iVersion>=2 && pVfs->xCurrentTimeInt64 ){ 8234 i64 ms; 8235 pVfs->xCurrentTimeInt64(pVfs, &ms); 8236 ret = (u32)((ms/1000) - ((i64)24405875 * 8640)); 8237 }else{ 8238 double day; 8239 pVfs->xCurrentTime(pVfs, &day); 8240 ret = (u32)((day - 2440587.5) * 86400); 8241 } 8242 return ret; 8243 } 8244 8245 /* 8246 ** Return a 32-bit timestamp in UNIX epoch format. 8247 ** 8248 ** If the value passed as the only argument is either NULL or an SQL NULL, 8249 ** return the current time. Otherwise, return the value stored in (*pVal) 8250 ** cast to a 32-bit unsigned integer. 8251 */ 8252 static u32 zipfileGetTime(sqlite3_value *pVal){ 8253 if( pVal==0 || sqlite3_value_type(pVal)==SQLITE_NULL ){ 8254 return zipfileTime(); 8255 } 8256 return (u32)sqlite3_value_int64(pVal); 8257 } 8258 8259 /* 8260 ** Unless it is NULL, entry pOld is currently part of the pTab->pFirstEntry 8261 ** linked list. Remove it from the list and free the object. 8262 */ 8263 static void zipfileRemoveEntryFromList(ZipfileTab *pTab, ZipfileEntry *pOld){ 8264 if( pOld ){ 8265 ZipfileEntry **pp; 8266 for(pp=&pTab->pFirstEntry; (*pp)!=pOld; pp=&((*pp)->pNext)); 8267 *pp = (*pp)->pNext; 8268 zipfileEntryFree(pOld); 8269 } 8270 } 8271 8272 /* 8273 ** xUpdate method. 8274 */ 8275 static int zipfileUpdate( 8276 sqlite3_vtab *pVtab, 8277 int nVal, 8278 sqlite3_value **apVal, 8279 sqlite_int64 *pRowid 8280 ){ 8281 ZipfileTab *pTab = (ZipfileTab*)pVtab; 8282 int rc = SQLITE_OK; /* Return Code */ 8283 ZipfileEntry *pNew = 0; /* New in-memory CDS entry */ 8284 8285 u32 mode = 0; /* Mode for new entry */ 8286 u32 mTime = 0; /* Modification time for new entry */ 8287 i64 sz = 0; /* Uncompressed size */ 8288 const char *zPath = 0; /* Path for new entry */ 8289 int nPath = 0; /* strlen(zPath) */ 8290 const u8 *pData = 0; /* Pointer to buffer containing content */ 8291 int nData = 0; /* Size of pData buffer in bytes */ 8292 int iMethod = 0; /* Compression method for new entry */ 8293 u8 *pFree = 0; /* Free this */ 8294 char *zFree = 0; /* Also free this */ 8295 ZipfileEntry *pOld = 0; 8296 ZipfileEntry *pOld2 = 0; 8297 int bUpdate = 0; /* True for an update that modifies "name" */ 8298 int bIsDir = 0; 8299 u32 iCrc32 = 0; 8300 8301 if( pTab->pWriteFd==0 ){ 8302 rc = zipfileBegin(pVtab); 8303 if( rc!=SQLITE_OK ) return rc; 8304 } 8305 8306 /* If this is a DELETE or UPDATE, find the archive entry to delete. */ 8307 if( sqlite3_value_type(apVal[0])!=SQLITE_NULL ){ 8308 const char *zDelete = (const char*)sqlite3_value_text(apVal[0]); 8309 int nDelete = (int)strlen(zDelete); 8310 if( nVal>1 ){ 8311 const char *zUpdate = (const char*)sqlite3_value_text(apVal[1]); 8312 if( zUpdate && zipfileComparePath(zUpdate, zDelete, nDelete)!=0 ){ 8313 bUpdate = 1; 8314 } 8315 } 8316 for(pOld=pTab->pFirstEntry; 1; pOld=pOld->pNext){ 8317 if( zipfileComparePath(pOld->cds.zFile, zDelete, nDelete)==0 ){ 8318 break; 8319 } 8320 assert( pOld->pNext ); 8321 } 8322 } 8323 8324 if( nVal>1 ){ 8325 /* Check that "sz" and "rawdata" are both NULL: */ 8326 if( sqlite3_value_type(apVal[5])!=SQLITE_NULL ){ 8327 zipfileTableErr(pTab, "sz must be NULL"); 8328 rc = SQLITE_CONSTRAINT; 8329 } 8330 if( sqlite3_value_type(apVal[6])!=SQLITE_NULL ){ 8331 zipfileTableErr(pTab, "rawdata must be NULL"); 8332 rc = SQLITE_CONSTRAINT; 8333 } 8334 8335 if( rc==SQLITE_OK ){ 8336 if( sqlite3_value_type(apVal[7])==SQLITE_NULL ){ 8337 /* data=NULL. A directory */ 8338 bIsDir = 1; 8339 }else{ 8340 /* Value specified for "data", and possibly "method". This must be 8341 ** a regular file or a symlink. */ 8342 const u8 *aIn = sqlite3_value_blob(apVal[7]); 8343 int nIn = sqlite3_value_bytes(apVal[7]); 8344 int bAuto = sqlite3_value_type(apVal[8])==SQLITE_NULL; 8345 8346 iMethod = sqlite3_value_int(apVal[8]); 8347 sz = nIn; 8348 pData = aIn; 8349 nData = nIn; 8350 if( iMethod!=0 && iMethod!=8 ){ 8351 zipfileTableErr(pTab, "unknown compression method: %d", iMethod); 8352 rc = SQLITE_CONSTRAINT; 8353 }else{ 8354 if( bAuto || iMethod ){ 8355 int nCmp; 8356 rc = zipfileDeflate(aIn, nIn, &pFree, &nCmp, &pTab->base.zErrMsg); 8357 if( rc==SQLITE_OK ){ 8358 if( iMethod || nCmp<nIn ){ 8359 iMethod = 8; 8360 pData = pFree; 8361 nData = nCmp; 8362 } 8363 } 8364 } 8365 iCrc32 = crc32(0, aIn, nIn); 8366 } 8367 } 8368 } 8369 8370 if( rc==SQLITE_OK ){ 8371 rc = zipfileGetMode(apVal[3], bIsDir, &mode, &pTab->base.zErrMsg); 8372 } 8373 8374 if( rc==SQLITE_OK ){ 8375 zPath = (const char*)sqlite3_value_text(apVal[2]); 8376 if( zPath==0 ) zPath = ""; 8377 nPath = (int)strlen(zPath); 8378 mTime = zipfileGetTime(apVal[4]); 8379 } 8380 8381 if( rc==SQLITE_OK && bIsDir ){ 8382 /* For a directory, check that the last character in the path is a 8383 ** '/'. This appears to be required for compatibility with info-zip 8384 ** (the unzip command on unix). It does not create directories 8385 ** otherwise. */ 8386 if( nPath<=0 || zPath[nPath-1]!='/' ){ 8387 zFree = sqlite3_mprintf("%s/", zPath); 8388 zPath = (const char*)zFree; 8389 if( zFree==0 ){ 8390 rc = SQLITE_NOMEM; 8391 nPath = 0; 8392 }else{ 8393 nPath = (int)strlen(zPath); 8394 } 8395 } 8396 } 8397 8398 /* Check that we're not inserting a duplicate entry -OR- updating an 8399 ** entry with a path, thereby making it into a duplicate. */ 8400 if( (pOld==0 || bUpdate) && rc==SQLITE_OK ){ 8401 ZipfileEntry *p; 8402 for(p=pTab->pFirstEntry; p; p=p->pNext){ 8403 if( zipfileComparePath(p->cds.zFile, zPath, nPath)==0 ){ 8404 switch( sqlite3_vtab_on_conflict(pTab->db) ){ 8405 case SQLITE_IGNORE: { 8406 goto zipfile_update_done; 8407 } 8408 case SQLITE_REPLACE: { 8409 pOld2 = p; 8410 break; 8411 } 8412 default: { 8413 zipfileTableErr(pTab, "duplicate name: \"%s\"", zPath); 8414 rc = SQLITE_CONSTRAINT; 8415 break; 8416 } 8417 } 8418 break; 8419 } 8420 } 8421 } 8422 8423 if( rc==SQLITE_OK ){ 8424 /* Create the new CDS record. */ 8425 pNew = zipfileNewEntry(zPath); 8426 if( pNew==0 ){ 8427 rc = SQLITE_NOMEM; 8428 }else{ 8429 pNew->cds.iVersionMadeBy = ZIPFILE_NEWENTRY_MADEBY; 8430 pNew->cds.iVersionExtract = ZIPFILE_NEWENTRY_REQUIRED; 8431 pNew->cds.flags = ZIPFILE_NEWENTRY_FLAGS; 8432 pNew->cds.iCompression = (u16)iMethod; 8433 zipfileMtimeToDos(&pNew->cds, mTime); 8434 pNew->cds.crc32 = iCrc32; 8435 pNew->cds.szCompressed = nData; 8436 pNew->cds.szUncompressed = (u32)sz; 8437 pNew->cds.iExternalAttr = (mode<<16); 8438 pNew->cds.iOffset = (u32)pTab->szCurrent; 8439 pNew->cds.nFile = (u16)nPath; 8440 pNew->mUnixTime = (u32)mTime; 8441 rc = zipfileAppendEntry(pTab, pNew, pData, nData); 8442 zipfileAddEntry(pTab, pOld, pNew); 8443 } 8444 } 8445 } 8446 8447 if( rc==SQLITE_OK && (pOld || pOld2) ){ 8448 ZipfileCsr *pCsr; 8449 for(pCsr=pTab->pCsrList; pCsr; pCsr=pCsr->pCsrNext){ 8450 if( pCsr->pCurrent && (pCsr->pCurrent==pOld || pCsr->pCurrent==pOld2) ){ 8451 pCsr->pCurrent = pCsr->pCurrent->pNext; 8452 pCsr->bNoop = 1; 8453 } 8454 } 8455 8456 zipfileRemoveEntryFromList(pTab, pOld); 8457 zipfileRemoveEntryFromList(pTab, pOld2); 8458 } 8459 8460 zipfile_update_done: 8461 sqlite3_free(pFree); 8462 sqlite3_free(zFree); 8463 return rc; 8464 } 8465 8466 static int zipfileSerializeEOCD(ZipfileEOCD *p, u8 *aBuf){ 8467 u8 *a = aBuf; 8468 zipfileWrite32(a, ZIPFILE_SIGNATURE_EOCD); 8469 zipfileWrite16(a, p->iDisk); 8470 zipfileWrite16(a, p->iFirstDisk); 8471 zipfileWrite16(a, p->nEntry); 8472 zipfileWrite16(a, p->nEntryTotal); 8473 zipfileWrite32(a, p->nSize); 8474 zipfileWrite32(a, p->iOffset); 8475 zipfileWrite16(a, 0); /* Size of trailing comment in bytes*/ 8476 8477 return a-aBuf; 8478 } 8479 8480 static int zipfileAppendEOCD(ZipfileTab *pTab, ZipfileEOCD *p){ 8481 int nBuf = zipfileSerializeEOCD(p, pTab->aBuffer); 8482 assert( nBuf==ZIPFILE_EOCD_FIXED_SZ ); 8483 return zipfileAppendData(pTab, pTab->aBuffer, nBuf); 8484 } 8485 8486 /* 8487 ** Serialize the CDS structure into buffer aBuf[]. Return the number 8488 ** of bytes written. 8489 */ 8490 static int zipfileSerializeCDS(ZipfileEntry *pEntry, u8 *aBuf){ 8491 u8 *a = aBuf; 8492 ZipfileCDS *pCDS = &pEntry->cds; 8493 8494 if( pEntry->aExtra==0 ){ 8495 pCDS->nExtra = 9; 8496 } 8497 8498 zipfileWrite32(a, ZIPFILE_SIGNATURE_CDS); 8499 zipfileWrite16(a, pCDS->iVersionMadeBy); 8500 zipfileWrite16(a, pCDS->iVersionExtract); 8501 zipfileWrite16(a, pCDS->flags); 8502 zipfileWrite16(a, pCDS->iCompression); 8503 zipfileWrite16(a, pCDS->mTime); 8504 zipfileWrite16(a, pCDS->mDate); 8505 zipfileWrite32(a, pCDS->crc32); 8506 zipfileWrite32(a, pCDS->szCompressed); 8507 zipfileWrite32(a, pCDS->szUncompressed); 8508 assert( a==&aBuf[ZIPFILE_CDS_NFILE_OFF] ); 8509 zipfileWrite16(a, pCDS->nFile); 8510 zipfileWrite16(a, pCDS->nExtra); 8511 zipfileWrite16(a, pCDS->nComment); 8512 zipfileWrite16(a, pCDS->iDiskStart); 8513 zipfileWrite16(a, pCDS->iInternalAttr); 8514 zipfileWrite32(a, pCDS->iExternalAttr); 8515 zipfileWrite32(a, pCDS->iOffset); 8516 8517 memcpy(a, pCDS->zFile, pCDS->nFile); 8518 a += pCDS->nFile; 8519 8520 if( pEntry->aExtra ){ 8521 int n = (int)pCDS->nExtra + (int)pCDS->nComment; 8522 memcpy(a, pEntry->aExtra, n); 8523 a += n; 8524 }else{ 8525 assert( pCDS->nExtra==9 ); 8526 zipfileWrite16(a, ZIPFILE_EXTRA_TIMESTAMP); 8527 zipfileWrite16(a, 5); 8528 *a++ = 0x01; 8529 zipfileWrite32(a, pEntry->mUnixTime); 8530 } 8531 8532 return a-aBuf; 8533 } 8534 8535 static int zipfileCommit(sqlite3_vtab *pVtab){ 8536 ZipfileTab *pTab = (ZipfileTab*)pVtab; 8537 int rc = SQLITE_OK; 8538 if( pTab->pWriteFd ){ 8539 i64 iOffset = pTab->szCurrent; 8540 ZipfileEntry *p; 8541 ZipfileEOCD eocd; 8542 int nEntry = 0; 8543 8544 /* Write out all entries */ 8545 for(p=pTab->pFirstEntry; rc==SQLITE_OK && p; p=p->pNext){ 8546 int n = zipfileSerializeCDS(p, pTab->aBuffer); 8547 rc = zipfileAppendData(pTab, pTab->aBuffer, n); 8548 nEntry++; 8549 } 8550 8551 /* Write out the EOCD record */ 8552 eocd.iDisk = 0; 8553 eocd.iFirstDisk = 0; 8554 eocd.nEntry = (u16)nEntry; 8555 eocd.nEntryTotal = (u16)nEntry; 8556 eocd.nSize = (u32)(pTab->szCurrent - iOffset); 8557 eocd.iOffset = (u32)iOffset; 8558 rc = zipfileAppendEOCD(pTab, &eocd); 8559 8560 zipfileCleanupTransaction(pTab); 8561 } 8562 return rc; 8563 } 8564 8565 static int zipfileRollback(sqlite3_vtab *pVtab){ 8566 return zipfileCommit(pVtab); 8567 } 8568 8569 static ZipfileCsr *zipfileFindCursor(ZipfileTab *pTab, i64 iId){ 8570 ZipfileCsr *pCsr; 8571 for(pCsr=pTab->pCsrList; pCsr; pCsr=pCsr->pCsrNext){ 8572 if( iId==pCsr->iId ) break; 8573 } 8574 return pCsr; 8575 } 8576 8577 static void zipfileFunctionCds( 8578 sqlite3_context *context, 8579 int argc, 8580 sqlite3_value **argv 8581 ){ 8582 ZipfileCsr *pCsr; 8583 ZipfileTab *pTab = (ZipfileTab*)sqlite3_user_data(context); 8584 assert( argc>0 ); 8585 8586 pCsr = zipfileFindCursor(pTab, sqlite3_value_int64(argv[0])); 8587 if( pCsr ){ 8588 ZipfileCDS *p = &pCsr->pCurrent->cds; 8589 char *zRes = sqlite3_mprintf("{" 8590 "\"version-made-by\" : %u, " 8591 "\"version-to-extract\" : %u, " 8592 "\"flags\" : %u, " 8593 "\"compression\" : %u, " 8594 "\"time\" : %u, " 8595 "\"date\" : %u, " 8596 "\"crc32\" : %u, " 8597 "\"compressed-size\" : %u, " 8598 "\"uncompressed-size\" : %u, " 8599 "\"file-name-length\" : %u, " 8600 "\"extra-field-length\" : %u, " 8601 "\"file-comment-length\" : %u, " 8602 "\"disk-number-start\" : %u, " 8603 "\"internal-attr\" : %u, " 8604 "\"external-attr\" : %u, " 8605 "\"offset\" : %u }", 8606 (u32)p->iVersionMadeBy, (u32)p->iVersionExtract, 8607 (u32)p->flags, (u32)p->iCompression, 8608 (u32)p->mTime, (u32)p->mDate, 8609 (u32)p->crc32, (u32)p->szCompressed, 8610 (u32)p->szUncompressed, (u32)p->nFile, 8611 (u32)p->nExtra, (u32)p->nComment, 8612 (u32)p->iDiskStart, (u32)p->iInternalAttr, 8613 (u32)p->iExternalAttr, (u32)p->iOffset 8614 ); 8615 8616 if( zRes==0 ){ 8617 sqlite3_result_error_nomem(context); 8618 }else{ 8619 sqlite3_result_text(context, zRes, -1, SQLITE_TRANSIENT); 8620 sqlite3_free(zRes); 8621 } 8622 } 8623 } 8624 8625 /* 8626 ** xFindFunction method. 8627 */ 8628 static int zipfileFindFunction( 8629 sqlite3_vtab *pVtab, /* Virtual table handle */ 8630 int nArg, /* Number of SQL function arguments */ 8631 const char *zName, /* Name of SQL function */ 8632 void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), /* OUT: Result */ 8633 void **ppArg /* OUT: User data for *pxFunc */ 8634 ){ 8635 if( sqlite3_stricmp("zipfile_cds", zName)==0 ){ 8636 *pxFunc = zipfileFunctionCds; 8637 *ppArg = (void*)pVtab; 8638 return 1; 8639 } 8640 return 0; 8641 } 8642 8643 typedef struct ZipfileBuffer ZipfileBuffer; 8644 struct ZipfileBuffer { 8645 u8 *a; /* Pointer to buffer */ 8646 int n; /* Size of buffer in bytes */ 8647 int nAlloc; /* Byte allocated at a[] */ 8648 }; 8649 8650 typedef struct ZipfileCtx ZipfileCtx; 8651 struct ZipfileCtx { 8652 int nEntry; 8653 ZipfileBuffer body; 8654 ZipfileBuffer cds; 8655 }; 8656 8657 static int zipfileBufferGrow(ZipfileBuffer *pBuf, int nByte){ 8658 if( pBuf->n+nByte>pBuf->nAlloc ){ 8659 u8 *aNew; 8660 sqlite3_int64 nNew = pBuf->n ? pBuf->n*2 : 512; 8661 int nReq = pBuf->n + nByte; 8662 8663 while( nNew<nReq ) nNew = nNew*2; 8664 aNew = sqlite3_realloc64(pBuf->a, nNew); 8665 if( aNew==0 ) return SQLITE_NOMEM; 8666 pBuf->a = aNew; 8667 pBuf->nAlloc = (int)nNew; 8668 } 8669 return SQLITE_OK; 8670 } 8671 8672 /* 8673 ** xStep() callback for the zipfile() aggregate. This can be called in 8674 ** any of the following ways: 8675 ** 8676 ** SELECT zipfile(name,data) ... 8677 ** SELECT zipfile(name,mode,mtime,data) ... 8678 ** SELECT zipfile(name,mode,mtime,data,method) ... 8679 */ 8680 void zipfileStep(sqlite3_context *pCtx, int nVal, sqlite3_value **apVal){ 8681 ZipfileCtx *p; /* Aggregate function context */ 8682 ZipfileEntry e; /* New entry to add to zip archive */ 8683 8684 sqlite3_value *pName = 0; 8685 sqlite3_value *pMode = 0; 8686 sqlite3_value *pMtime = 0; 8687 sqlite3_value *pData = 0; 8688 sqlite3_value *pMethod = 0; 8689 8690 int bIsDir = 0; 8691 u32 mode; 8692 int rc = SQLITE_OK; 8693 char *zErr = 0; 8694 8695 int iMethod = -1; /* Compression method to use (0 or 8) */ 8696 8697 const u8 *aData = 0; /* Possibly compressed data for new entry */ 8698 int nData = 0; /* Size of aData[] in bytes */ 8699 int szUncompressed = 0; /* Size of data before compression */ 8700 u8 *aFree = 0; /* Free this before returning */ 8701 u32 iCrc32 = 0; /* crc32 of uncompressed data */ 8702 8703 char *zName = 0; /* Path (name) of new entry */ 8704 int nName = 0; /* Size of zName in bytes */ 8705 char *zFree = 0; /* Free this before returning */ 8706 int nByte; 8707 8708 memset(&e, 0, sizeof(e)); 8709 p = (ZipfileCtx*)sqlite3_aggregate_context(pCtx, sizeof(ZipfileCtx)); 8710 if( p==0 ) return; 8711 8712 /* Martial the arguments into stack variables */ 8713 if( nVal!=2 && nVal!=4 && nVal!=5 ){ 8714 zErr = sqlite3_mprintf("wrong number of arguments to function zipfile()"); 8715 rc = SQLITE_ERROR; 8716 goto zipfile_step_out; 8717 } 8718 pName = apVal[0]; 8719 if( nVal==2 ){ 8720 pData = apVal[1]; 8721 }else{ 8722 pMode = apVal[1]; 8723 pMtime = apVal[2]; 8724 pData = apVal[3]; 8725 if( nVal==5 ){ 8726 pMethod = apVal[4]; 8727 } 8728 } 8729 8730 /* Check that the 'name' parameter looks ok. */ 8731 zName = (char*)sqlite3_value_text(pName); 8732 nName = sqlite3_value_bytes(pName); 8733 if( zName==0 ){ 8734 zErr = sqlite3_mprintf("first argument to zipfile() must be non-NULL"); 8735 rc = SQLITE_ERROR; 8736 goto zipfile_step_out; 8737 } 8738 8739 /* Inspect the 'method' parameter. This must be either 0 (store), 8 (use 8740 ** deflate compression) or NULL (choose automatically). */ 8741 if( pMethod && SQLITE_NULL!=sqlite3_value_type(pMethod) ){ 8742 iMethod = (int)sqlite3_value_int64(pMethod); 8743 if( iMethod!=0 && iMethod!=8 ){ 8744 zErr = sqlite3_mprintf("illegal method value: %d", iMethod); 8745 rc = SQLITE_ERROR; 8746 goto zipfile_step_out; 8747 } 8748 } 8749 8750 /* Now inspect the data. If this is NULL, then the new entry must be a 8751 ** directory. Otherwise, figure out whether or not the data should 8752 ** be deflated or simply stored in the zip archive. */ 8753 if( sqlite3_value_type(pData)==SQLITE_NULL ){ 8754 bIsDir = 1; 8755 iMethod = 0; 8756 }else{ 8757 aData = sqlite3_value_blob(pData); 8758 szUncompressed = nData = sqlite3_value_bytes(pData); 8759 iCrc32 = crc32(0, aData, nData); 8760 if( iMethod<0 || iMethod==8 ){ 8761 int nOut = 0; 8762 rc = zipfileDeflate(aData, nData, &aFree, &nOut, &zErr); 8763 if( rc!=SQLITE_OK ){ 8764 goto zipfile_step_out; 8765 } 8766 if( iMethod==8 || nOut<nData ){ 8767 aData = aFree; 8768 nData = nOut; 8769 iMethod = 8; 8770 }else{ 8771 iMethod = 0; 8772 } 8773 } 8774 } 8775 8776 /* Decode the "mode" argument. */ 8777 rc = zipfileGetMode(pMode, bIsDir, &mode, &zErr); 8778 if( rc ) goto zipfile_step_out; 8779 8780 /* Decode the "mtime" argument. */ 8781 e.mUnixTime = zipfileGetTime(pMtime); 8782 8783 /* If this is a directory entry, ensure that there is exactly one '/' 8784 ** at the end of the path. Or, if this is not a directory and the path 8785 ** ends in '/' it is an error. */ 8786 if( bIsDir==0 ){ 8787 if( nName>0 && zName[nName-1]=='/' ){ 8788 zErr = sqlite3_mprintf("non-directory name must not end with /"); 8789 rc = SQLITE_ERROR; 8790 goto zipfile_step_out; 8791 } 8792 }else{ 8793 if( nName==0 || zName[nName-1]!='/' ){ 8794 zName = zFree = sqlite3_mprintf("%s/", zName); 8795 if( zName==0 ){ 8796 rc = SQLITE_NOMEM; 8797 goto zipfile_step_out; 8798 } 8799 nName = (int)strlen(zName); 8800 }else{ 8801 while( nName>1 && zName[nName-2]=='/' ) nName--; 8802 } 8803 } 8804 8805 /* Assemble the ZipfileEntry object for the new zip archive entry */ 8806 e.cds.iVersionMadeBy = ZIPFILE_NEWENTRY_MADEBY; 8807 e.cds.iVersionExtract = ZIPFILE_NEWENTRY_REQUIRED; 8808 e.cds.flags = ZIPFILE_NEWENTRY_FLAGS; 8809 e.cds.iCompression = (u16)iMethod; 8810 zipfileMtimeToDos(&e.cds, (u32)e.mUnixTime); 8811 e.cds.crc32 = iCrc32; 8812 e.cds.szCompressed = nData; 8813 e.cds.szUncompressed = szUncompressed; 8814 e.cds.iExternalAttr = (mode<<16); 8815 e.cds.iOffset = p->body.n; 8816 e.cds.nFile = (u16)nName; 8817 e.cds.zFile = zName; 8818 8819 /* Append the LFH to the body of the new archive */ 8820 nByte = ZIPFILE_LFH_FIXED_SZ + e.cds.nFile + 9; 8821 if( (rc = zipfileBufferGrow(&p->body, nByte)) ) goto zipfile_step_out; 8822 p->body.n += zipfileSerializeLFH(&e, &p->body.a[p->body.n]); 8823 8824 /* Append the data to the body of the new archive */ 8825 if( nData>0 ){ 8826 if( (rc = zipfileBufferGrow(&p->body, nData)) ) goto zipfile_step_out; 8827 memcpy(&p->body.a[p->body.n], aData, nData); 8828 p->body.n += nData; 8829 } 8830 8831 /* Append the CDS record to the directory of the new archive */ 8832 nByte = ZIPFILE_CDS_FIXED_SZ + e.cds.nFile + 9; 8833 if( (rc = zipfileBufferGrow(&p->cds, nByte)) ) goto zipfile_step_out; 8834 p->cds.n += zipfileSerializeCDS(&e, &p->cds.a[p->cds.n]); 8835 8836 /* Increment the count of entries in the archive */ 8837 p->nEntry++; 8838 8839 zipfile_step_out: 8840 sqlite3_free(aFree); 8841 sqlite3_free(zFree); 8842 if( rc ){ 8843 if( zErr ){ 8844 sqlite3_result_error(pCtx, zErr, -1); 8845 }else{ 8846 sqlite3_result_error_code(pCtx, rc); 8847 } 8848 } 8849 sqlite3_free(zErr); 8850 } 8851 8852 /* 8853 ** xFinalize() callback for zipfile aggregate function. 8854 */ 8855 void zipfileFinal(sqlite3_context *pCtx){ 8856 ZipfileCtx *p; 8857 ZipfileEOCD eocd; 8858 sqlite3_int64 nZip; 8859 u8 *aZip; 8860 8861 p = (ZipfileCtx*)sqlite3_aggregate_context(pCtx, sizeof(ZipfileCtx)); 8862 if( p==0 ) return; 8863 if( p->nEntry>0 ){ 8864 memset(&eocd, 0, sizeof(eocd)); 8865 eocd.nEntry = (u16)p->nEntry; 8866 eocd.nEntryTotal = (u16)p->nEntry; 8867 eocd.nSize = p->cds.n; 8868 eocd.iOffset = p->body.n; 8869 8870 nZip = p->body.n + p->cds.n + ZIPFILE_EOCD_FIXED_SZ; 8871 aZip = (u8*)sqlite3_malloc64(nZip); 8872 if( aZip==0 ){ 8873 sqlite3_result_error_nomem(pCtx); 8874 }else{ 8875 memcpy(aZip, p->body.a, p->body.n); 8876 memcpy(&aZip[p->body.n], p->cds.a, p->cds.n); 8877 zipfileSerializeEOCD(&eocd, &aZip[p->body.n + p->cds.n]); 8878 sqlite3_result_blob(pCtx, aZip, (int)nZip, zipfileFree); 8879 } 8880 } 8881 8882 sqlite3_free(p->body.a); 8883 sqlite3_free(p->cds.a); 8884 } 8885 8886 8887 /* 8888 ** Register the "zipfile" virtual table. 8889 */ 8890 static int zipfileRegister(sqlite3 *db){ 8891 static sqlite3_module zipfileModule = { 8892 1, /* iVersion */ 8893 zipfileConnect, /* xCreate */ 8894 zipfileConnect, /* xConnect */ 8895 zipfileBestIndex, /* xBestIndex */ 8896 zipfileDisconnect, /* xDisconnect */ 8897 zipfileDisconnect, /* xDestroy */ 8898 zipfileOpen, /* xOpen - open a cursor */ 8899 zipfileClose, /* xClose - close a cursor */ 8900 zipfileFilter, /* xFilter - configure scan constraints */ 8901 zipfileNext, /* xNext - advance a cursor */ 8902 zipfileEof, /* xEof - check for end of scan */ 8903 zipfileColumn, /* xColumn - read data */ 8904 0, /* xRowid - read data */ 8905 zipfileUpdate, /* xUpdate */ 8906 zipfileBegin, /* xBegin */ 8907 0, /* xSync */ 8908 zipfileCommit, /* xCommit */ 8909 zipfileRollback, /* xRollback */ 8910 zipfileFindFunction, /* xFindMethod */ 8911 0, /* xRename */ 8912 }; 8913 8914 int rc = sqlite3_create_module(db, "zipfile" , &zipfileModule, 0); 8915 if( rc==SQLITE_OK ) rc = sqlite3_overload_function(db, "zipfile_cds", -1); 8916 if( rc==SQLITE_OK ){ 8917 rc = sqlite3_create_function(db, "zipfile", -1, SQLITE_UTF8, 0, 0, 8918 zipfileStep, zipfileFinal 8919 ); 8920 } 8921 assert( sizeof(i64)==8 ); 8922 assert( sizeof(u32)==4 ); 8923 assert( sizeof(u16)==2 ); 8924 assert( sizeof(u8)==1 ); 8925 return rc; 8926 } 8927 #else /* SQLITE_OMIT_VIRTUALTABLE */ 8928 # define zipfileRegister(x) SQLITE_OK 8929 #endif 8930 8931 #ifdef _WIN32 8932 8933 #endif 8934 int sqlite3_zipfile_init( 8935 sqlite3 *db, 8936 char **pzErrMsg, 8937 const sqlite3_api_routines *pApi 8938 ){ 8939 SQLITE_EXTENSION_INIT2(pApi); 8940 (void)pzErrMsg; /* Unused parameter */ 8941 return zipfileRegister(db); 8942 } 8943 8944 /************************* End ../ext/misc/zipfile.c ********************/ 8945 /************************* Begin ../ext/misc/sqlar.c ******************/ 8946 /* 8947 ** 2017-12-17 8948 ** 8949 ** The author disclaims copyright to this source code. In place of 8950 ** a legal notice, here is a blessing: 8951 ** 8952 ** May you do good and not evil. 8953 ** May you find forgiveness for yourself and forgive others. 8954 ** May you share freely, never taking more than you give. 8955 ** 8956 ****************************************************************************** 8957 ** 8958 ** Utility functions sqlar_compress() and sqlar_uncompress(). Useful 8959 ** for working with sqlar archives and used by the shell tool's built-in 8960 ** sqlar support. 8961 */ 8962 /* #include "sqlite3ext.h" */ 8963 SQLITE_EXTENSION_INIT1 8964 #include <zlib.h> 8965 #include <assert.h> 8966 8967 /* 8968 ** Implementation of the "sqlar_compress(X)" SQL function. 8969 ** 8970 ** If the type of X is SQLITE_BLOB, and compressing that blob using 8971 ** zlib utility function compress() yields a smaller blob, return the 8972 ** compressed blob. Otherwise, return a copy of X. 8973 ** 8974 ** SQLar uses the "zlib format" for compressed content. The zlib format 8975 ** contains a two-byte identification header and a four-byte checksum at 8976 ** the end. This is different from ZIP which uses the raw deflate format. 8977 ** 8978 ** Future enhancements to SQLar might add support for new compression formats. 8979 ** If so, those new formats will be identified by alternative headers in the 8980 ** compressed data. 8981 */ 8982 static void sqlarCompressFunc( 8983 sqlite3_context *context, 8984 int argc, 8985 sqlite3_value **argv 8986 ){ 8987 assert( argc==1 ); 8988 if( sqlite3_value_type(argv[0])==SQLITE_BLOB ){ 8989 const Bytef *pData = sqlite3_value_blob(argv[0]); 8990 uLong nData = sqlite3_value_bytes(argv[0]); 8991 uLongf nOut = compressBound(nData); 8992 Bytef *pOut; 8993 8994 pOut = (Bytef*)sqlite3_malloc(nOut); 8995 if( pOut==0 ){ 8996 sqlite3_result_error_nomem(context); 8997 return; 8998 }else{ 8999 if( Z_OK!=compress(pOut, &nOut, pData, nData) ){ 9000 sqlite3_result_error(context, "error in compress()", -1); 9001 }else if( nOut<nData ){ 9002 sqlite3_result_blob(context, pOut, nOut, SQLITE_TRANSIENT); 9003 }else{ 9004 sqlite3_result_value(context, argv[0]); 9005 } 9006 sqlite3_free(pOut); 9007 } 9008 }else{ 9009 sqlite3_result_value(context, argv[0]); 9010 } 9011 } 9012 9013 /* 9014 ** Implementation of the "sqlar_uncompress(X,SZ)" SQL function 9015 ** 9016 ** Parameter SZ is interpreted as an integer. If it is less than or 9017 ** equal to zero, then this function returns a copy of X. Or, if 9018 ** SZ is equal to the size of X when interpreted as a blob, also 9019 ** return a copy of X. Otherwise, decompress blob X using zlib 9020 ** utility function uncompress() and return the results (another 9021 ** blob). 9022 */ 9023 static void sqlarUncompressFunc( 9024 sqlite3_context *context, 9025 int argc, 9026 sqlite3_value **argv 9027 ){ 9028 uLong nData; 9029 uLongf sz; 9030 9031 assert( argc==2 ); 9032 sz = sqlite3_value_int(argv[1]); 9033 9034 if( sz<=0 || sz==(nData = sqlite3_value_bytes(argv[0])) ){ 9035 sqlite3_result_value(context, argv[0]); 9036 }else{ 9037 const Bytef *pData= sqlite3_value_blob(argv[0]); 9038 Bytef *pOut = sqlite3_malloc(sz); 9039 if( Z_OK!=uncompress(pOut, &sz, pData, nData) ){ 9040 sqlite3_result_error(context, "error in uncompress()", -1); 9041 }else{ 9042 sqlite3_result_blob(context, pOut, sz, SQLITE_TRANSIENT); 9043 } 9044 sqlite3_free(pOut); 9045 } 9046 } 9047 9048 9049 #ifdef _WIN32 9050 9051 #endif 9052 int sqlite3_sqlar_init( 9053 sqlite3 *db, 9054 char **pzErrMsg, 9055 const sqlite3_api_routines *pApi 9056 ){ 9057 int rc = SQLITE_OK; 9058 SQLITE_EXTENSION_INIT2(pApi); 9059 (void)pzErrMsg; /* Unused parameter */ 9060 rc = sqlite3_create_function(db, "sqlar_compress", 1, 9061 SQLITE_UTF8|SQLITE_INNOCUOUS, 0, 9062 sqlarCompressFunc, 0, 0); 9063 if( rc==SQLITE_OK ){ 9064 rc = sqlite3_create_function(db, "sqlar_uncompress", 2, 9065 SQLITE_UTF8|SQLITE_INNOCUOUS, 0, 9066 sqlarUncompressFunc, 0, 0); 9067 } 9068 return rc; 9069 } 9070 9071 /************************* End ../ext/misc/sqlar.c ********************/ 9072 #endif 9073 /************************* Begin ../ext/expert/sqlite3expert.h ******************/ 9074 /* 9075 ** 2017 April 07 9076 ** 9077 ** The author disclaims copyright to this source code. In place of 9078 ** a legal notice, here is a blessing: 9079 ** 9080 ** May you do good and not evil. 9081 ** May you find forgiveness for yourself and forgive others. 9082 ** May you share freely, never taking more than you give. 9083 ** 9084 ************************************************************************* 9085 */ 9086 #if !defined(SQLITEEXPERT_H) 9087 #define SQLITEEXPERT_H 1 9088 /* #include "sqlite3.h" */ 9089 9090 typedef struct sqlite3expert sqlite3expert; 9091 9092 /* 9093 ** Create a new sqlite3expert object. 9094 ** 9095 ** If successful, a pointer to the new object is returned and (*pzErr) set 9096 ** to NULL. Or, if an error occurs, NULL is returned and (*pzErr) set to 9097 ** an English-language error message. In this case it is the responsibility 9098 ** of the caller to eventually free the error message buffer using 9099 ** sqlite3_free(). 9100 */ 9101 sqlite3expert *sqlite3_expert_new(sqlite3 *db, char **pzErr); 9102 9103 /* 9104 ** Configure an sqlite3expert object. 9105 ** 9106 ** EXPERT_CONFIG_SAMPLE: 9107 ** By default, sqlite3_expert_analyze() generates sqlite_stat1 data for 9108 ** each candidate index. This involves scanning and sorting the entire 9109 ** contents of each user database table once for each candidate index 9110 ** associated with the table. For large databases, this can be 9111 ** prohibitively slow. This option allows the sqlite3expert object to 9112 ** be configured so that sqlite_stat1 data is instead generated based on a 9113 ** subset of each table, or so that no sqlite_stat1 data is used at all. 9114 ** 9115 ** A single integer argument is passed to this option. If the value is less 9116 ** than or equal to zero, then no sqlite_stat1 data is generated or used by 9117 ** the analysis - indexes are recommended based on the database schema only. 9118 ** Or, if the value is 100 or greater, complete sqlite_stat1 data is 9119 ** generated for each candidate index (this is the default). Finally, if the 9120 ** value falls between 0 and 100, then it represents the percentage of user 9121 ** table rows that should be considered when generating sqlite_stat1 data. 9122 ** 9123 ** Examples: 9124 ** 9125 ** // Do not generate any sqlite_stat1 data 9126 ** sqlite3_expert_config(pExpert, EXPERT_CONFIG_SAMPLE, 0); 9127 ** 9128 ** // Generate sqlite_stat1 data based on 10% of the rows in each table. 9129 ** sqlite3_expert_config(pExpert, EXPERT_CONFIG_SAMPLE, 10); 9130 */ 9131 int sqlite3_expert_config(sqlite3expert *p, int op, ...); 9132 9133 #define EXPERT_CONFIG_SAMPLE 1 /* int */ 9134 9135 /* 9136 ** Specify zero or more SQL statements to be included in the analysis. 9137 ** 9138 ** Buffer zSql must contain zero or more complete SQL statements. This 9139 ** function parses all statements contained in the buffer and adds them 9140 ** to the internal list of statements to analyze. If successful, SQLITE_OK 9141 ** is returned and (*pzErr) set to NULL. Or, if an error occurs - for example 9142 ** due to a error in the SQL - an SQLite error code is returned and (*pzErr) 9143 ** may be set to point to an English language error message. In this case 9144 ** the caller is responsible for eventually freeing the error message buffer 9145 ** using sqlite3_free(). 9146 ** 9147 ** If an error does occur while processing one of the statements in the 9148 ** buffer passed as the second argument, none of the statements in the 9149 ** buffer are added to the analysis. 9150 ** 9151 ** This function must be called before sqlite3_expert_analyze(). If a call 9152 ** to this function is made on an sqlite3expert object that has already 9153 ** been passed to sqlite3_expert_analyze() SQLITE_MISUSE is returned 9154 ** immediately and no statements are added to the analysis. 9155 */ 9156 int sqlite3_expert_sql( 9157 sqlite3expert *p, /* From a successful sqlite3_expert_new() */ 9158 const char *zSql, /* SQL statement(s) to add */ 9159 char **pzErr /* OUT: Error message (if any) */ 9160 ); 9161 9162 9163 /* 9164 ** This function is called after the sqlite3expert object has been configured 9165 ** with all SQL statements using sqlite3_expert_sql() to actually perform 9166 ** the analysis. Once this function has been called, it is not possible to 9167 ** add further SQL statements to the analysis. 9168 ** 9169 ** If successful, SQLITE_OK is returned and (*pzErr) is set to NULL. Or, if 9170 ** an error occurs, an SQLite error code is returned and (*pzErr) set to 9171 ** point to a buffer containing an English language error message. In this 9172 ** case it is the responsibility of the caller to eventually free the buffer 9173 ** using sqlite3_free(). 9174 ** 9175 ** If an error does occur within this function, the sqlite3expert object 9176 ** is no longer useful for any purpose. At that point it is no longer 9177 ** possible to add further SQL statements to the object or to re-attempt 9178 ** the analysis. The sqlite3expert object must still be freed using a call 9179 ** sqlite3_expert_destroy(). 9180 */ 9181 int sqlite3_expert_analyze(sqlite3expert *p, char **pzErr); 9182 9183 /* 9184 ** Return the total number of statements loaded using sqlite3_expert_sql(). 9185 ** The total number of SQL statements may be different from the total number 9186 ** to calls to sqlite3_expert_sql(). 9187 */ 9188 int sqlite3_expert_count(sqlite3expert*); 9189 9190 /* 9191 ** Return a component of the report. 9192 ** 9193 ** This function is called after sqlite3_expert_analyze() to extract the 9194 ** results of the analysis. Each call to this function returns either a 9195 ** NULL pointer or a pointer to a buffer containing a nul-terminated string. 9196 ** The value passed as the third argument must be one of the EXPERT_REPORT_* 9197 ** #define constants defined below. 9198 ** 9199 ** For some EXPERT_REPORT_* parameters, the buffer returned contains 9200 ** information relating to a specific SQL statement. In these cases that 9201 ** SQL statement is identified by the value passed as the second argument. 9202 ** SQL statements are numbered from 0 in the order in which they are parsed. 9203 ** If an out-of-range value (less than zero or equal to or greater than the 9204 ** value returned by sqlite3_expert_count()) is passed as the second argument 9205 ** along with such an EXPERT_REPORT_* parameter, NULL is always returned. 9206 ** 9207 ** EXPERT_REPORT_SQL: 9208 ** Return the text of SQL statement iStmt. 9209 ** 9210 ** EXPERT_REPORT_INDEXES: 9211 ** Return a buffer containing the CREATE INDEX statements for all recommended 9212 ** indexes for statement iStmt. If there are no new recommeded indexes, NULL 9213 ** is returned. 9214 ** 9215 ** EXPERT_REPORT_PLAN: 9216 ** Return a buffer containing the EXPLAIN QUERY PLAN output for SQL query 9217 ** iStmt after the proposed indexes have been added to the database schema. 9218 ** 9219 ** EXPERT_REPORT_CANDIDATES: 9220 ** Return a pointer to a buffer containing the CREATE INDEX statements 9221 ** for all indexes that were tested (for all SQL statements). The iStmt 9222 ** parameter is ignored for EXPERT_REPORT_CANDIDATES calls. 9223 */ 9224 const char *sqlite3_expert_report(sqlite3expert*, int iStmt, int eReport); 9225 9226 /* 9227 ** Values for the third argument passed to sqlite3_expert_report(). 9228 */ 9229 #define EXPERT_REPORT_SQL 1 9230 #define EXPERT_REPORT_INDEXES 2 9231 #define EXPERT_REPORT_PLAN 3 9232 #define EXPERT_REPORT_CANDIDATES 4 9233 9234 /* 9235 ** Free an (sqlite3expert*) handle and all associated resources. There 9236 ** should be one call to this function for each successful call to 9237 ** sqlite3-expert_new(). 9238 */ 9239 void sqlite3_expert_destroy(sqlite3expert*); 9240 9241 #endif /* !defined(SQLITEEXPERT_H) */ 9242 9243 /************************* End ../ext/expert/sqlite3expert.h ********************/ 9244 /************************* Begin ../ext/expert/sqlite3expert.c ******************/ 9245 /* 9246 ** 2017 April 09 9247 ** 9248 ** The author disclaims copyright to this source code. In place of 9249 ** a legal notice, here is a blessing: 9250 ** 9251 ** May you do good and not evil. 9252 ** May you find forgiveness for yourself and forgive others. 9253 ** May you share freely, never taking more than you give. 9254 ** 9255 ************************************************************************* 9256 */ 9257 /* #include "sqlite3expert.h" */ 9258 #include <assert.h> 9259 #include <string.h> 9260 #include <stdio.h> 9261 9262 #if !defined(SQLITE_AMALGAMATION) 9263 #if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST) 9264 # define SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS 1 9265 #endif 9266 #if defined(SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS) 9267 # define ALWAYS(X) (1) 9268 # define NEVER(X) (0) 9269 #elif !defined(NDEBUG) 9270 # define ALWAYS(X) ((X)?1:(assert(0),0)) 9271 # define NEVER(X) ((X)?(assert(0),1):0) 9272 #else 9273 # define ALWAYS(X) (X) 9274 # define NEVER(X) (X) 9275 #endif 9276 #endif /* !defined(SQLITE_AMALGAMATION) */ 9277 9278 9279 #ifndef SQLITE_OMIT_VIRTUALTABLE 9280 9281 /* typedef sqlite3_int64 i64; */ 9282 /* typedef sqlite3_uint64 u64; */ 9283 9284 typedef struct IdxColumn IdxColumn; 9285 typedef struct IdxConstraint IdxConstraint; 9286 typedef struct IdxScan IdxScan; 9287 typedef struct IdxStatement IdxStatement; 9288 typedef struct IdxTable IdxTable; 9289 typedef struct IdxWrite IdxWrite; 9290 9291 #define STRLEN (int)strlen 9292 9293 /* 9294 ** A temp table name that we assume no user database will actually use. 9295 ** If this assumption proves incorrect triggers on the table with the 9296 ** conflicting name will be ignored. 9297 */ 9298 #define UNIQUE_TABLE_NAME "t592690916721053953805701627921227776" 9299 9300 /* 9301 ** A single constraint. Equivalent to either "col = ?" or "col < ?" (or 9302 ** any other type of single-ended range constraint on a column). 9303 ** 9304 ** pLink: 9305 ** Used to temporarily link IdxConstraint objects into lists while 9306 ** creating candidate indexes. 9307 */ 9308 struct IdxConstraint { 9309 char *zColl; /* Collation sequence */ 9310 int bRange; /* True for range, false for eq */ 9311 int iCol; /* Constrained table column */ 9312 int bFlag; /* Used by idxFindCompatible() */ 9313 int bDesc; /* True if ORDER BY <expr> DESC */ 9314 IdxConstraint *pNext; /* Next constraint in pEq or pRange list */ 9315 IdxConstraint *pLink; /* See above */ 9316 }; 9317 9318 /* 9319 ** A single scan of a single table. 9320 */ 9321 struct IdxScan { 9322 IdxTable *pTab; /* Associated table object */ 9323 int iDb; /* Database containing table zTable */ 9324 i64 covering; /* Mask of columns required for cov. index */ 9325 IdxConstraint *pOrder; /* ORDER BY columns */ 9326 IdxConstraint *pEq; /* List of == constraints */ 9327 IdxConstraint *pRange; /* List of < constraints */ 9328 IdxScan *pNextScan; /* Next IdxScan object for same analysis */ 9329 }; 9330 9331 /* 9332 ** Information regarding a single database table. Extracted from 9333 ** "PRAGMA table_info" by function idxGetTableInfo(). 9334 */ 9335 struct IdxColumn { 9336 char *zName; 9337 char *zColl; 9338 int iPk; 9339 }; 9340 struct IdxTable { 9341 int nCol; 9342 char *zName; /* Table name */ 9343 IdxColumn *aCol; 9344 IdxTable *pNext; /* Next table in linked list of all tables */ 9345 }; 9346 9347 /* 9348 ** An object of the following type is created for each unique table/write-op 9349 ** seen. The objects are stored in a singly-linked list beginning at 9350 ** sqlite3expert.pWrite. 9351 */ 9352 struct IdxWrite { 9353 IdxTable *pTab; 9354 int eOp; /* SQLITE_UPDATE, DELETE or INSERT */ 9355 IdxWrite *pNext; 9356 }; 9357 9358 /* 9359 ** Each statement being analyzed is represented by an instance of this 9360 ** structure. 9361 */ 9362 struct IdxStatement { 9363 int iId; /* Statement number */ 9364 char *zSql; /* SQL statement */ 9365 char *zIdx; /* Indexes */ 9366 char *zEQP; /* Plan */ 9367 IdxStatement *pNext; 9368 }; 9369 9370 9371 /* 9372 ** A hash table for storing strings. With space for a payload string 9373 ** with each entry. Methods are: 9374 ** 9375 ** idxHashInit() 9376 ** idxHashClear() 9377 ** idxHashAdd() 9378 ** idxHashSearch() 9379 */ 9380 #define IDX_HASH_SIZE 1023 9381 typedef struct IdxHashEntry IdxHashEntry; 9382 typedef struct IdxHash IdxHash; 9383 struct IdxHashEntry { 9384 char *zKey; /* nul-terminated key */ 9385 char *zVal; /* nul-terminated value string */ 9386 char *zVal2; /* nul-terminated value string 2 */ 9387 IdxHashEntry *pHashNext; /* Next entry in same hash bucket */ 9388 IdxHashEntry *pNext; /* Next entry in hash */ 9389 }; 9390 struct IdxHash { 9391 IdxHashEntry *pFirst; 9392 IdxHashEntry *aHash[IDX_HASH_SIZE]; 9393 }; 9394 9395 /* 9396 ** sqlite3expert object. 9397 */ 9398 struct sqlite3expert { 9399 int iSample; /* Percentage of tables to sample for stat1 */ 9400 sqlite3 *db; /* User database */ 9401 sqlite3 *dbm; /* In-memory db for this analysis */ 9402 sqlite3 *dbv; /* Vtab schema for this analysis */ 9403 IdxTable *pTable; /* List of all IdxTable objects */ 9404 IdxScan *pScan; /* List of scan objects */ 9405 IdxWrite *pWrite; /* List of write objects */ 9406 IdxStatement *pStatement; /* List of IdxStatement objects */ 9407 int bRun; /* True once analysis has run */ 9408 char **pzErrmsg; 9409 int rc; /* Error code from whereinfo hook */ 9410 IdxHash hIdx; /* Hash containing all candidate indexes */ 9411 char *zCandidates; /* For EXPERT_REPORT_CANDIDATES */ 9412 }; 9413 9414 9415 /* 9416 ** Allocate and return nByte bytes of zeroed memory using sqlite3_malloc(). 9417 ** If the allocation fails, set *pRc to SQLITE_NOMEM and return NULL. 9418 */ 9419 static void *idxMalloc(int *pRc, int nByte){ 9420 void *pRet; 9421 assert( *pRc==SQLITE_OK ); 9422 assert( nByte>0 ); 9423 pRet = sqlite3_malloc(nByte); 9424 if( pRet ){ 9425 memset(pRet, 0, nByte); 9426 }else{ 9427 *pRc = SQLITE_NOMEM; 9428 } 9429 return pRet; 9430 } 9431 9432 /* 9433 ** Initialize an IdxHash hash table. 9434 */ 9435 static void idxHashInit(IdxHash *pHash){ 9436 memset(pHash, 0, sizeof(IdxHash)); 9437 } 9438 9439 /* 9440 ** Reset an IdxHash hash table. 9441 */ 9442 static void idxHashClear(IdxHash *pHash){ 9443 int i; 9444 for(i=0; i<IDX_HASH_SIZE; i++){ 9445 IdxHashEntry *pEntry; 9446 IdxHashEntry *pNext; 9447 for(pEntry=pHash->aHash[i]; pEntry; pEntry=pNext){ 9448 pNext = pEntry->pHashNext; 9449 sqlite3_free(pEntry->zVal2); 9450 sqlite3_free(pEntry); 9451 } 9452 } 9453 memset(pHash, 0, sizeof(IdxHash)); 9454 } 9455 9456 /* 9457 ** Return the index of the hash bucket that the string specified by the 9458 ** arguments to this function belongs. 9459 */ 9460 static int idxHashString(const char *z, int n){ 9461 unsigned int ret = 0; 9462 int i; 9463 for(i=0; i<n; i++){ 9464 ret += (ret<<3) + (unsigned char)(z[i]); 9465 } 9466 return (int)(ret % IDX_HASH_SIZE); 9467 } 9468 9469 /* 9470 ** If zKey is already present in the hash table, return non-zero and do 9471 ** nothing. Otherwise, add an entry with key zKey and payload string zVal to 9472 ** the hash table passed as the second argument. 9473 */ 9474 static int idxHashAdd( 9475 int *pRc, 9476 IdxHash *pHash, 9477 const char *zKey, 9478 const char *zVal 9479 ){ 9480 int nKey = STRLEN(zKey); 9481 int iHash = idxHashString(zKey, nKey); 9482 int nVal = (zVal ? STRLEN(zVal) : 0); 9483 IdxHashEntry *pEntry; 9484 assert( iHash>=0 ); 9485 for(pEntry=pHash->aHash[iHash]; pEntry; pEntry=pEntry->pHashNext){ 9486 if( STRLEN(pEntry->zKey)==nKey && 0==memcmp(pEntry->zKey, zKey, nKey) ){ 9487 return 1; 9488 } 9489 } 9490 pEntry = idxMalloc(pRc, sizeof(IdxHashEntry) + nKey+1 + nVal+1); 9491 if( pEntry ){ 9492 pEntry->zKey = (char*)&pEntry[1]; 9493 memcpy(pEntry->zKey, zKey, nKey); 9494 if( zVal ){ 9495 pEntry->zVal = &pEntry->zKey[nKey+1]; 9496 memcpy(pEntry->zVal, zVal, nVal); 9497 } 9498 pEntry->pHashNext = pHash->aHash[iHash]; 9499 pHash->aHash[iHash] = pEntry; 9500 9501 pEntry->pNext = pHash->pFirst; 9502 pHash->pFirst = pEntry; 9503 } 9504 return 0; 9505 } 9506 9507 /* 9508 ** If zKey/nKey is present in the hash table, return a pointer to the 9509 ** hash-entry object. 9510 */ 9511 static IdxHashEntry *idxHashFind(IdxHash *pHash, const char *zKey, int nKey){ 9512 int iHash; 9513 IdxHashEntry *pEntry; 9514 if( nKey<0 ) nKey = STRLEN(zKey); 9515 iHash = idxHashString(zKey, nKey); 9516 assert( iHash>=0 ); 9517 for(pEntry=pHash->aHash[iHash]; pEntry; pEntry=pEntry->pHashNext){ 9518 if( STRLEN(pEntry->zKey)==nKey && 0==memcmp(pEntry->zKey, zKey, nKey) ){ 9519 return pEntry; 9520 } 9521 } 9522 return 0; 9523 } 9524 9525 /* 9526 ** If the hash table contains an entry with a key equal to the string 9527 ** passed as the final two arguments to this function, return a pointer 9528 ** to the payload string. Otherwise, if zKey/nKey is not present in the 9529 ** hash table, return NULL. 9530 */ 9531 static const char *idxHashSearch(IdxHash *pHash, const char *zKey, int nKey){ 9532 IdxHashEntry *pEntry = idxHashFind(pHash, zKey, nKey); 9533 if( pEntry ) return pEntry->zVal; 9534 return 0; 9535 } 9536 9537 /* 9538 ** Allocate and return a new IdxConstraint object. Set the IdxConstraint.zColl 9539 ** variable to point to a copy of nul-terminated string zColl. 9540 */ 9541 static IdxConstraint *idxNewConstraint(int *pRc, const char *zColl){ 9542 IdxConstraint *pNew; 9543 int nColl = STRLEN(zColl); 9544 9545 assert( *pRc==SQLITE_OK ); 9546 pNew = (IdxConstraint*)idxMalloc(pRc, sizeof(IdxConstraint) * nColl + 1); 9547 if( pNew ){ 9548 pNew->zColl = (char*)&pNew[1]; 9549 memcpy(pNew->zColl, zColl, nColl+1); 9550 } 9551 return pNew; 9552 } 9553 9554 /* 9555 ** An error associated with database handle db has just occurred. Pass 9556 ** the error message to callback function xOut. 9557 */ 9558 static void idxDatabaseError( 9559 sqlite3 *db, /* Database handle */ 9560 char **pzErrmsg /* Write error here */ 9561 ){ 9562 *pzErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(db)); 9563 } 9564 9565 /* 9566 ** Prepare an SQL statement. 9567 */ 9568 static int idxPrepareStmt( 9569 sqlite3 *db, /* Database handle to compile against */ 9570 sqlite3_stmt **ppStmt, /* OUT: Compiled SQL statement */ 9571 char **pzErrmsg, /* OUT: sqlite3_malloc()ed error message */ 9572 const char *zSql /* SQL statement to compile */ 9573 ){ 9574 int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0); 9575 if( rc!=SQLITE_OK ){ 9576 *ppStmt = 0; 9577 idxDatabaseError(db, pzErrmsg); 9578 } 9579 return rc; 9580 } 9581 9582 /* 9583 ** Prepare an SQL statement using the results of a printf() formatting. 9584 */ 9585 static int idxPrintfPrepareStmt( 9586 sqlite3 *db, /* Database handle to compile against */ 9587 sqlite3_stmt **ppStmt, /* OUT: Compiled SQL statement */ 9588 char **pzErrmsg, /* OUT: sqlite3_malloc()ed error message */ 9589 const char *zFmt, /* printf() format of SQL statement */ 9590 ... /* Trailing printf() arguments */ 9591 ){ 9592 va_list ap; 9593 int rc; 9594 char *zSql; 9595 va_start(ap, zFmt); 9596 zSql = sqlite3_vmprintf(zFmt, ap); 9597 if( zSql==0 ){ 9598 rc = SQLITE_NOMEM; 9599 }else{ 9600 rc = idxPrepareStmt(db, ppStmt, pzErrmsg, zSql); 9601 sqlite3_free(zSql); 9602 } 9603 va_end(ap); 9604 return rc; 9605 } 9606 9607 9608 /************************************************************************* 9609 ** Beginning of virtual table implementation. 9610 */ 9611 typedef struct ExpertVtab ExpertVtab; 9612 struct ExpertVtab { 9613 sqlite3_vtab base; 9614 IdxTable *pTab; 9615 sqlite3expert *pExpert; 9616 }; 9617 9618 typedef struct ExpertCsr ExpertCsr; 9619 struct ExpertCsr { 9620 sqlite3_vtab_cursor base; 9621 sqlite3_stmt *pData; 9622 }; 9623 9624 static char *expertDequote(const char *zIn){ 9625 int n = STRLEN(zIn); 9626 char *zRet = sqlite3_malloc(n); 9627 9628 assert( zIn[0]=='\'' ); 9629 assert( zIn[n-1]=='\'' ); 9630 9631 if( zRet ){ 9632 int iOut = 0; 9633 int iIn = 0; 9634 for(iIn=1; iIn<(n-1); iIn++){ 9635 if( zIn[iIn]=='\'' ){ 9636 assert( zIn[iIn+1]=='\'' ); 9637 iIn++; 9638 } 9639 zRet[iOut++] = zIn[iIn]; 9640 } 9641 zRet[iOut] = '\0'; 9642 } 9643 9644 return zRet; 9645 } 9646 9647 /* 9648 ** This function is the implementation of both the xConnect and xCreate 9649 ** methods of the r-tree virtual table. 9650 ** 9651 ** argv[0] -> module name 9652 ** argv[1] -> database name 9653 ** argv[2] -> table name 9654 ** argv[...] -> column names... 9655 */ 9656 static int expertConnect( 9657 sqlite3 *db, 9658 void *pAux, 9659 int argc, const char *const*argv, 9660 sqlite3_vtab **ppVtab, 9661 char **pzErr 9662 ){ 9663 sqlite3expert *pExpert = (sqlite3expert*)pAux; 9664 ExpertVtab *p = 0; 9665 int rc; 9666 9667 if( argc!=4 ){ 9668 *pzErr = sqlite3_mprintf("internal error!"); 9669 rc = SQLITE_ERROR; 9670 }else{ 9671 char *zCreateTable = expertDequote(argv[3]); 9672 if( zCreateTable ){ 9673 rc = sqlite3_declare_vtab(db, zCreateTable); 9674 if( rc==SQLITE_OK ){ 9675 p = idxMalloc(&rc, sizeof(ExpertVtab)); 9676 } 9677 if( rc==SQLITE_OK ){ 9678 p->pExpert = pExpert; 9679 p->pTab = pExpert->pTable; 9680 assert( sqlite3_stricmp(p->pTab->zName, argv[2])==0 ); 9681 } 9682 sqlite3_free(zCreateTable); 9683 }else{ 9684 rc = SQLITE_NOMEM; 9685 } 9686 } 9687 9688 *ppVtab = (sqlite3_vtab*)p; 9689 return rc; 9690 } 9691 9692 static int expertDisconnect(sqlite3_vtab *pVtab){ 9693 ExpertVtab *p = (ExpertVtab*)pVtab; 9694 sqlite3_free(p); 9695 return SQLITE_OK; 9696 } 9697 9698 static int expertBestIndex(sqlite3_vtab *pVtab, sqlite3_index_info *pIdxInfo){ 9699 ExpertVtab *p = (ExpertVtab*)pVtab; 9700 int rc = SQLITE_OK; 9701 int n = 0; 9702 IdxScan *pScan; 9703 const int opmask = 9704 SQLITE_INDEX_CONSTRAINT_EQ | SQLITE_INDEX_CONSTRAINT_GT | 9705 SQLITE_INDEX_CONSTRAINT_LT | SQLITE_INDEX_CONSTRAINT_GE | 9706 SQLITE_INDEX_CONSTRAINT_LE; 9707 9708 pScan = idxMalloc(&rc, sizeof(IdxScan)); 9709 if( pScan ){ 9710 int i; 9711 9712 /* Link the new scan object into the list */ 9713 pScan->pTab = p->pTab; 9714 pScan->pNextScan = p->pExpert->pScan; 9715 p->pExpert->pScan = pScan; 9716 9717 /* Add the constraints to the IdxScan object */ 9718 for(i=0; i<pIdxInfo->nConstraint; i++){ 9719 struct sqlite3_index_constraint *pCons = &pIdxInfo->aConstraint[i]; 9720 if( pCons->usable 9721 && pCons->iColumn>=0 9722 && p->pTab->aCol[pCons->iColumn].iPk==0 9723 && (pCons->op & opmask) 9724 ){ 9725 IdxConstraint *pNew; 9726 const char *zColl = sqlite3_vtab_collation(pIdxInfo, i); 9727 pNew = idxNewConstraint(&rc, zColl); 9728 if( pNew ){ 9729 pNew->iCol = pCons->iColumn; 9730 if( pCons->op==SQLITE_INDEX_CONSTRAINT_EQ ){ 9731 pNew->pNext = pScan->pEq; 9732 pScan->pEq = pNew; 9733 }else{ 9734 pNew->bRange = 1; 9735 pNew->pNext = pScan->pRange; 9736 pScan->pRange = pNew; 9737 } 9738 } 9739 n++; 9740 pIdxInfo->aConstraintUsage[i].argvIndex = n; 9741 } 9742 } 9743 9744 /* Add the ORDER BY to the IdxScan object */ 9745 for(i=pIdxInfo->nOrderBy-1; i>=0; i--){ 9746 int iCol = pIdxInfo->aOrderBy[i].iColumn; 9747 if( iCol>=0 ){ 9748 IdxConstraint *pNew = idxNewConstraint(&rc, p->pTab->aCol[iCol].zColl); 9749 if( pNew ){ 9750 pNew->iCol = iCol; 9751 pNew->bDesc = pIdxInfo->aOrderBy[i].desc; 9752 pNew->pNext = pScan->pOrder; 9753 pNew->pLink = pScan->pOrder; 9754 pScan->pOrder = pNew; 9755 n++; 9756 } 9757 } 9758 } 9759 } 9760 9761 pIdxInfo->estimatedCost = 1000000.0 / (n+1); 9762 return rc; 9763 } 9764 9765 static int expertUpdate( 9766 sqlite3_vtab *pVtab, 9767 int nData, 9768 sqlite3_value **azData, 9769 sqlite_int64 *pRowid 9770 ){ 9771 (void)pVtab; 9772 (void)nData; 9773 (void)azData; 9774 (void)pRowid; 9775 return SQLITE_OK; 9776 } 9777 9778 /* 9779 ** Virtual table module xOpen method. 9780 */ 9781 static int expertOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){ 9782 int rc = SQLITE_OK; 9783 ExpertCsr *pCsr; 9784 (void)pVTab; 9785 pCsr = idxMalloc(&rc, sizeof(ExpertCsr)); 9786 *ppCursor = (sqlite3_vtab_cursor*)pCsr; 9787 return rc; 9788 } 9789 9790 /* 9791 ** Virtual table module xClose method. 9792 */ 9793 static int expertClose(sqlite3_vtab_cursor *cur){ 9794 ExpertCsr *pCsr = (ExpertCsr*)cur; 9795 sqlite3_finalize(pCsr->pData); 9796 sqlite3_free(pCsr); 9797 return SQLITE_OK; 9798 } 9799 9800 /* 9801 ** Virtual table module xEof method. 9802 ** 9803 ** Return non-zero if the cursor does not currently point to a valid 9804 ** record (i.e if the scan has finished), or zero otherwise. 9805 */ 9806 static int expertEof(sqlite3_vtab_cursor *cur){ 9807 ExpertCsr *pCsr = (ExpertCsr*)cur; 9808 return pCsr->pData==0; 9809 } 9810 9811 /* 9812 ** Virtual table module xNext method. 9813 */ 9814 static int expertNext(sqlite3_vtab_cursor *cur){ 9815 ExpertCsr *pCsr = (ExpertCsr*)cur; 9816 int rc = SQLITE_OK; 9817 9818 assert( pCsr->pData ); 9819 rc = sqlite3_step(pCsr->pData); 9820 if( rc!=SQLITE_ROW ){ 9821 rc = sqlite3_finalize(pCsr->pData); 9822 pCsr->pData = 0; 9823 }else{ 9824 rc = SQLITE_OK; 9825 } 9826 9827 return rc; 9828 } 9829 9830 /* 9831 ** Virtual table module xRowid method. 9832 */ 9833 static int expertRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ 9834 (void)cur; 9835 *pRowid = 0; 9836 return SQLITE_OK; 9837 } 9838 9839 /* 9840 ** Virtual table module xColumn method. 9841 */ 9842 static int expertColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){ 9843 ExpertCsr *pCsr = (ExpertCsr*)cur; 9844 sqlite3_value *pVal; 9845 pVal = sqlite3_column_value(pCsr->pData, i); 9846 if( pVal ){ 9847 sqlite3_result_value(ctx, pVal); 9848 } 9849 return SQLITE_OK; 9850 } 9851 9852 /* 9853 ** Virtual table module xFilter method. 9854 */ 9855 static int expertFilter( 9856 sqlite3_vtab_cursor *cur, 9857 int idxNum, const char *idxStr, 9858 int argc, sqlite3_value **argv 9859 ){ 9860 ExpertCsr *pCsr = (ExpertCsr*)cur; 9861 ExpertVtab *pVtab = (ExpertVtab*)(cur->pVtab); 9862 sqlite3expert *pExpert = pVtab->pExpert; 9863 int rc; 9864 9865 (void)idxNum; 9866 (void)idxStr; 9867 (void)argc; 9868 (void)argv; 9869 rc = sqlite3_finalize(pCsr->pData); 9870 pCsr->pData = 0; 9871 if( rc==SQLITE_OK ){ 9872 rc = idxPrintfPrepareStmt(pExpert->db, &pCsr->pData, &pVtab->base.zErrMsg, 9873 "SELECT * FROM main.%Q WHERE sample()", pVtab->pTab->zName 9874 ); 9875 } 9876 9877 if( rc==SQLITE_OK ){ 9878 rc = expertNext(cur); 9879 } 9880 return rc; 9881 } 9882 9883 static int idxRegisterVtab(sqlite3expert *p){ 9884 static sqlite3_module expertModule = { 9885 2, /* iVersion */ 9886 expertConnect, /* xCreate - create a table */ 9887 expertConnect, /* xConnect - connect to an existing table */ 9888 expertBestIndex, /* xBestIndex - Determine search strategy */ 9889 expertDisconnect, /* xDisconnect - Disconnect from a table */ 9890 expertDisconnect, /* xDestroy - Drop a table */ 9891 expertOpen, /* xOpen - open a cursor */ 9892 expertClose, /* xClose - close a cursor */ 9893 expertFilter, /* xFilter - configure scan constraints */ 9894 expertNext, /* xNext - advance a cursor */ 9895 expertEof, /* xEof */ 9896 expertColumn, /* xColumn - read data */ 9897 expertRowid, /* xRowid - read data */ 9898 expertUpdate, /* xUpdate - write data */ 9899 0, /* xBegin - begin transaction */ 9900 0, /* xSync - sync transaction */ 9901 0, /* xCommit - commit transaction */ 9902 0, /* xRollback - rollback transaction */ 9903 0, /* xFindFunction - function overloading */ 9904 0, /* xRename - rename the table */ 9905 0, /* xSavepoint */ 9906 0, /* xRelease */ 9907 0, /* xRollbackTo */ 9908 0, /* xShadowName */ 9909 }; 9910 9911 return sqlite3_create_module(p->dbv, "expert", &expertModule, (void*)p); 9912 } 9913 /* 9914 ** End of virtual table implementation. 9915 *************************************************************************/ 9916 /* 9917 ** Finalize SQL statement pStmt. If (*pRc) is SQLITE_OK when this function 9918 ** is called, set it to the return value of sqlite3_finalize() before 9919 ** returning. Otherwise, discard the sqlite3_finalize() return value. 9920 */ 9921 static void idxFinalize(int *pRc, sqlite3_stmt *pStmt){ 9922 int rc = sqlite3_finalize(pStmt); 9923 if( *pRc==SQLITE_OK ) *pRc = rc; 9924 } 9925 9926 /* 9927 ** Attempt to allocate an IdxTable structure corresponding to table zTab 9928 ** in the main database of connection db. If successful, set (*ppOut) to 9929 ** point to the new object and return SQLITE_OK. Otherwise, return an 9930 ** SQLite error code and set (*ppOut) to NULL. In this case *pzErrmsg may be 9931 ** set to point to an error string. 9932 ** 9933 ** It is the responsibility of the caller to eventually free either the 9934 ** IdxTable object or error message using sqlite3_free(). 9935 */ 9936 static int idxGetTableInfo( 9937 sqlite3 *db, /* Database connection to read details from */ 9938 const char *zTab, /* Table name */ 9939 IdxTable **ppOut, /* OUT: New object (if successful) */ 9940 char **pzErrmsg /* OUT: Error message (if not) */ 9941 ){ 9942 sqlite3_stmt *p1 = 0; 9943 int nCol = 0; 9944 int nTab = STRLEN(zTab); 9945 int nByte = sizeof(IdxTable) + nTab + 1; 9946 IdxTable *pNew = 0; 9947 int rc, rc2; 9948 char *pCsr = 0; 9949 int nPk = 0; 9950 9951 rc = idxPrintfPrepareStmt(db, &p1, pzErrmsg, "PRAGMA table_xinfo=%Q", zTab); 9952 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){ 9953 const char *zCol = (const char*)sqlite3_column_text(p1, 1); 9954 const char *zColSeq = 0; 9955 nByte += 1 + STRLEN(zCol); 9956 rc = sqlite3_table_column_metadata( 9957 db, "main", zTab, zCol, 0, &zColSeq, 0, 0, 0 9958 ); 9959 if( zColSeq==0 ) zColSeq = "binary"; 9960 nByte += 1 + STRLEN(zColSeq); 9961 nCol++; 9962 nPk += (sqlite3_column_int(p1, 5)>0); 9963 } 9964 rc2 = sqlite3_reset(p1); 9965 if( rc==SQLITE_OK ) rc = rc2; 9966 9967 nByte += sizeof(IdxColumn) * nCol; 9968 if( rc==SQLITE_OK ){ 9969 pNew = idxMalloc(&rc, nByte); 9970 } 9971 if( rc==SQLITE_OK ){ 9972 pNew->aCol = (IdxColumn*)&pNew[1]; 9973 pNew->nCol = nCol; 9974 pCsr = (char*)&pNew->aCol[nCol]; 9975 } 9976 9977 nCol = 0; 9978 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){ 9979 const char *zCol = (const char*)sqlite3_column_text(p1, 1); 9980 const char *zColSeq = 0; 9981 int nCopy = STRLEN(zCol) + 1; 9982 pNew->aCol[nCol].zName = pCsr; 9983 pNew->aCol[nCol].iPk = (sqlite3_column_int(p1, 5)==1 && nPk==1); 9984 memcpy(pCsr, zCol, nCopy); 9985 pCsr += nCopy; 9986 9987 rc = sqlite3_table_column_metadata( 9988 db, "main", zTab, zCol, 0, &zColSeq, 0, 0, 0 9989 ); 9990 if( rc==SQLITE_OK ){ 9991 if( zColSeq==0 ) zColSeq = "binary"; 9992 nCopy = STRLEN(zColSeq) + 1; 9993 pNew->aCol[nCol].zColl = pCsr; 9994 memcpy(pCsr, zColSeq, nCopy); 9995 pCsr += nCopy; 9996 } 9997 9998 nCol++; 9999 } 10000 idxFinalize(&rc, p1); 10001 10002 if( rc!=SQLITE_OK ){ 10003 sqlite3_free(pNew); 10004 pNew = 0; 10005 }else if( ALWAYS(pNew!=0) ){ 10006 pNew->zName = pCsr; 10007 if( ALWAYS(pNew->zName!=0) ) memcpy(pNew->zName, zTab, nTab+1); 10008 } 10009 10010 *ppOut = pNew; 10011 return rc; 10012 } 10013 10014 /* 10015 ** This function is a no-op if *pRc is set to anything other than 10016 ** SQLITE_OK when it is called. 10017 ** 10018 ** If *pRc is initially set to SQLITE_OK, then the text specified by 10019 ** the printf() style arguments is appended to zIn and the result returned 10020 ** in a buffer allocated by sqlite3_malloc(). sqlite3_free() is called on 10021 ** zIn before returning. 10022 */ 10023 static char *idxAppendText(int *pRc, char *zIn, const char *zFmt, ...){ 10024 va_list ap; 10025 char *zAppend = 0; 10026 char *zRet = 0; 10027 int nIn = zIn ? STRLEN(zIn) : 0; 10028 int nAppend = 0; 10029 va_start(ap, zFmt); 10030 if( *pRc==SQLITE_OK ){ 10031 zAppend = sqlite3_vmprintf(zFmt, ap); 10032 if( zAppend ){ 10033 nAppend = STRLEN(zAppend); 10034 zRet = (char*)sqlite3_malloc(nIn + nAppend + 1); 10035 } 10036 if( zAppend && zRet ){ 10037 if( nIn ) memcpy(zRet, zIn, nIn); 10038 memcpy(&zRet[nIn], zAppend, nAppend+1); 10039 }else{ 10040 sqlite3_free(zRet); 10041 zRet = 0; 10042 *pRc = SQLITE_NOMEM; 10043 } 10044 sqlite3_free(zAppend); 10045 sqlite3_free(zIn); 10046 } 10047 va_end(ap); 10048 return zRet; 10049 } 10050 10051 /* 10052 ** Return true if zId must be quoted in order to use it as an SQL 10053 ** identifier, or false otherwise. 10054 */ 10055 static int idxIdentifierRequiresQuotes(const char *zId){ 10056 int i; 10057 for(i=0; zId[i]; i++){ 10058 if( !(zId[i]=='_') 10059 && !(zId[i]>='0' && zId[i]<='9') 10060 && !(zId[i]>='a' && zId[i]<='z') 10061 && !(zId[i]>='A' && zId[i]<='Z') 10062 ){ 10063 return 1; 10064 } 10065 } 10066 return 0; 10067 } 10068 10069 /* 10070 ** This function appends an index column definition suitable for constraint 10071 ** pCons to the string passed as zIn and returns the result. 10072 */ 10073 static char *idxAppendColDefn( 10074 int *pRc, /* IN/OUT: Error code */ 10075 char *zIn, /* Column defn accumulated so far */ 10076 IdxTable *pTab, /* Table index will be created on */ 10077 IdxConstraint *pCons 10078 ){ 10079 char *zRet = zIn; 10080 IdxColumn *p = &pTab->aCol[pCons->iCol]; 10081 if( zRet ) zRet = idxAppendText(pRc, zRet, ", "); 10082 10083 if( idxIdentifierRequiresQuotes(p->zName) ){ 10084 zRet = idxAppendText(pRc, zRet, "%Q", p->zName); 10085 }else{ 10086 zRet = idxAppendText(pRc, zRet, "%s", p->zName); 10087 } 10088 10089 if( sqlite3_stricmp(p->zColl, pCons->zColl) ){ 10090 if( idxIdentifierRequiresQuotes(pCons->zColl) ){ 10091 zRet = idxAppendText(pRc, zRet, " COLLATE %Q", pCons->zColl); 10092 }else{ 10093 zRet = idxAppendText(pRc, zRet, " COLLATE %s", pCons->zColl); 10094 } 10095 } 10096 10097 if( pCons->bDesc ){ 10098 zRet = idxAppendText(pRc, zRet, " DESC"); 10099 } 10100 return zRet; 10101 } 10102 10103 /* 10104 ** Search database dbm for an index compatible with the one idxCreateFromCons() 10105 ** would create from arguments pScan, pEq and pTail. If no error occurs and 10106 ** such an index is found, return non-zero. Or, if no such index is found, 10107 ** return zero. 10108 ** 10109 ** If an error occurs, set *pRc to an SQLite error code and return zero. 10110 */ 10111 static int idxFindCompatible( 10112 int *pRc, /* OUT: Error code */ 10113 sqlite3* dbm, /* Database to search */ 10114 IdxScan *pScan, /* Scan for table to search for index on */ 10115 IdxConstraint *pEq, /* List of == constraints */ 10116 IdxConstraint *pTail /* List of range constraints */ 10117 ){ 10118 const char *zTbl = pScan->pTab->zName; 10119 sqlite3_stmt *pIdxList = 0; 10120 IdxConstraint *pIter; 10121 int nEq = 0; /* Number of elements in pEq */ 10122 int rc; 10123 10124 /* Count the elements in list pEq */ 10125 for(pIter=pEq; pIter; pIter=pIter->pLink) nEq++; 10126 10127 rc = idxPrintfPrepareStmt(dbm, &pIdxList, 0, "PRAGMA index_list=%Q", zTbl); 10128 while( rc==SQLITE_OK && sqlite3_step(pIdxList)==SQLITE_ROW ){ 10129 int bMatch = 1; 10130 IdxConstraint *pT = pTail; 10131 sqlite3_stmt *pInfo = 0; 10132 const char *zIdx = (const char*)sqlite3_column_text(pIdxList, 1); 10133 10134 /* Zero the IdxConstraint.bFlag values in the pEq list */ 10135 for(pIter=pEq; pIter; pIter=pIter->pLink) pIter->bFlag = 0; 10136 10137 rc = idxPrintfPrepareStmt(dbm, &pInfo, 0, "PRAGMA index_xInfo=%Q", zIdx); 10138 while( rc==SQLITE_OK && sqlite3_step(pInfo)==SQLITE_ROW ){ 10139 int iIdx = sqlite3_column_int(pInfo, 0); 10140 int iCol = sqlite3_column_int(pInfo, 1); 10141 const char *zColl = (const char*)sqlite3_column_text(pInfo, 4); 10142 10143 if( iIdx<nEq ){ 10144 for(pIter=pEq; pIter; pIter=pIter->pLink){ 10145 if( pIter->bFlag ) continue; 10146 if( pIter->iCol!=iCol ) continue; 10147 if( sqlite3_stricmp(pIter->zColl, zColl) ) continue; 10148 pIter->bFlag = 1; 10149 break; 10150 } 10151 if( pIter==0 ){ 10152 bMatch = 0; 10153 break; 10154 } 10155 }else{ 10156 if( pT ){ 10157 if( pT->iCol!=iCol || sqlite3_stricmp(pT->zColl, zColl) ){ 10158 bMatch = 0; 10159 break; 10160 } 10161 pT = pT->pLink; 10162 } 10163 } 10164 } 10165 idxFinalize(&rc, pInfo); 10166 10167 if( rc==SQLITE_OK && bMatch ){ 10168 sqlite3_finalize(pIdxList); 10169 return 1; 10170 } 10171 } 10172 idxFinalize(&rc, pIdxList); 10173 10174 *pRc = rc; 10175 return 0; 10176 } 10177 10178 /* Callback for sqlite3_exec() with query with leading count(*) column. 10179 * The first argument is expected to be an int*, referent to be incremented 10180 * if that leading column is not exactly '0'. 10181 */ 10182 static int countNonzeros(void* pCount, int nc, 10183 char* azResults[], char* azColumns[]){ 10184 (void)azColumns; /* Suppress unused parameter warning */ 10185 if( nc>0 && (azResults[0][0]!='0' || azResults[0][1]!=0) ){ 10186 *((int *)pCount) += 1; 10187 } 10188 return 0; 10189 } 10190 10191 static int idxCreateFromCons( 10192 sqlite3expert *p, 10193 IdxScan *pScan, 10194 IdxConstraint *pEq, 10195 IdxConstraint *pTail 10196 ){ 10197 sqlite3 *dbm = p->dbm; 10198 int rc = SQLITE_OK; 10199 if( (pEq || pTail) && 0==idxFindCompatible(&rc, dbm, pScan, pEq, pTail) ){ 10200 IdxTable *pTab = pScan->pTab; 10201 char *zCols = 0; 10202 char *zIdx = 0; 10203 IdxConstraint *pCons; 10204 unsigned int h = 0; 10205 const char *zFmt; 10206 10207 for(pCons=pEq; pCons; pCons=pCons->pLink){ 10208 zCols = idxAppendColDefn(&rc, zCols, pTab, pCons); 10209 } 10210 for(pCons=pTail; pCons; pCons=pCons->pLink){ 10211 zCols = idxAppendColDefn(&rc, zCols, pTab, pCons); 10212 } 10213 10214 if( rc==SQLITE_OK ){ 10215 /* Hash the list of columns to come up with a name for the index */ 10216 const char *zTable = pScan->pTab->zName; 10217 int quoteTable = idxIdentifierRequiresQuotes(zTable); 10218 char *zName = 0; /* Index name */ 10219 int collisions = 0; 10220 do{ 10221 int i; 10222 char *zFind; 10223 for(i=0; zCols[i]; i++){ 10224 h += ((h<<3) + zCols[i]); 10225 } 10226 sqlite3_free(zName); 10227 zName = sqlite3_mprintf("%s_idx_%08x", zTable, h); 10228 if( zName==0 ) break; 10229 /* Is is unique among table, view and index names? */ 10230 zFmt = "SELECT count(*) FROM sqlite_schema WHERE name=%Q" 10231 " AND type in ('index','table','view')"; 10232 zFind = sqlite3_mprintf(zFmt, zName); 10233 i = 0; 10234 rc = sqlite3_exec(dbm, zFind, countNonzeros, &i, 0); 10235 assert(rc==SQLITE_OK); 10236 sqlite3_free(zFind); 10237 if( i==0 ){ 10238 collisions = 0; 10239 break; 10240 } 10241 ++collisions; 10242 }while( collisions<50 && zName!=0 ); 10243 if( collisions ){ 10244 /* This return means "Gave up trying to find a unique index name." */ 10245 rc = SQLITE_BUSY_TIMEOUT; 10246 }else if( zName==0 ){ 10247 rc = SQLITE_NOMEM; 10248 }else{ 10249 if( quoteTable ){ 10250 zFmt = "CREATE INDEX \"%w\" ON \"%w\"(%s)"; 10251 }else{ 10252 zFmt = "CREATE INDEX %s ON %s(%s)"; 10253 } 10254 zIdx = sqlite3_mprintf(zFmt, zName, zTable, zCols); 10255 if( !zIdx ){ 10256 rc = SQLITE_NOMEM; 10257 }else{ 10258 rc = sqlite3_exec(dbm, zIdx, 0, 0, p->pzErrmsg); 10259 if( rc!=SQLITE_OK ){ 10260 rc = SQLITE_BUSY_TIMEOUT; 10261 }else{ 10262 idxHashAdd(&rc, &p->hIdx, zName, zIdx); 10263 } 10264 } 10265 sqlite3_free(zName); 10266 sqlite3_free(zIdx); 10267 } 10268 } 10269 10270 sqlite3_free(zCols); 10271 } 10272 return rc; 10273 } 10274 10275 /* 10276 ** Return true if list pList (linked by IdxConstraint.pLink) contains 10277 ** a constraint compatible with *p. Otherwise return false. 10278 */ 10279 static int idxFindConstraint(IdxConstraint *pList, IdxConstraint *p){ 10280 IdxConstraint *pCmp; 10281 for(pCmp=pList; pCmp; pCmp=pCmp->pLink){ 10282 if( p->iCol==pCmp->iCol ) return 1; 10283 } 10284 return 0; 10285 } 10286 10287 static int idxCreateFromWhere( 10288 sqlite3expert *p, 10289 IdxScan *pScan, /* Create indexes for this scan */ 10290 IdxConstraint *pTail /* range/ORDER BY constraints for inclusion */ 10291 ){ 10292 IdxConstraint *p1 = 0; 10293 IdxConstraint *pCon; 10294 int rc; 10295 10296 /* Gather up all the == constraints. */ 10297 for(pCon=pScan->pEq; pCon; pCon=pCon->pNext){ 10298 if( !idxFindConstraint(p1, pCon) && !idxFindConstraint(pTail, pCon) ){ 10299 pCon->pLink = p1; 10300 p1 = pCon; 10301 } 10302 } 10303 10304 /* Create an index using the == constraints collected above. And the 10305 ** range constraint/ORDER BY terms passed in by the caller, if any. */ 10306 rc = idxCreateFromCons(p, pScan, p1, pTail); 10307 10308 /* If no range/ORDER BY passed by the caller, create a version of the 10309 ** index for each range constraint. */ 10310 if( pTail==0 ){ 10311 for(pCon=pScan->pRange; rc==SQLITE_OK && pCon; pCon=pCon->pNext){ 10312 assert( pCon->pLink==0 ); 10313 if( !idxFindConstraint(p1, pCon) && !idxFindConstraint(pTail, pCon) ){ 10314 rc = idxCreateFromCons(p, pScan, p1, pCon); 10315 } 10316 } 10317 } 10318 10319 return rc; 10320 } 10321 10322 /* 10323 ** Create candidate indexes in database [dbm] based on the data in 10324 ** linked-list pScan. 10325 */ 10326 static int idxCreateCandidates(sqlite3expert *p){ 10327 int rc = SQLITE_OK; 10328 IdxScan *pIter; 10329 10330 for(pIter=p->pScan; pIter && rc==SQLITE_OK; pIter=pIter->pNextScan){ 10331 rc = idxCreateFromWhere(p, pIter, 0); 10332 if( rc==SQLITE_OK && pIter->pOrder ){ 10333 rc = idxCreateFromWhere(p, pIter, pIter->pOrder); 10334 } 10335 } 10336 10337 return rc; 10338 } 10339 10340 /* 10341 ** Free all elements of the linked list starting at pConstraint. 10342 */ 10343 static void idxConstraintFree(IdxConstraint *pConstraint){ 10344 IdxConstraint *pNext; 10345 IdxConstraint *p; 10346 10347 for(p=pConstraint; p; p=pNext){ 10348 pNext = p->pNext; 10349 sqlite3_free(p); 10350 } 10351 } 10352 10353 /* 10354 ** Free all elements of the linked list starting from pScan up until pLast 10355 ** (pLast is not freed). 10356 */ 10357 static void idxScanFree(IdxScan *pScan, IdxScan *pLast){ 10358 IdxScan *p; 10359 IdxScan *pNext; 10360 for(p=pScan; p!=pLast; p=pNext){ 10361 pNext = p->pNextScan; 10362 idxConstraintFree(p->pOrder); 10363 idxConstraintFree(p->pEq); 10364 idxConstraintFree(p->pRange); 10365 sqlite3_free(p); 10366 } 10367 } 10368 10369 /* 10370 ** Free all elements of the linked list starting from pStatement up 10371 ** until pLast (pLast is not freed). 10372 */ 10373 static void idxStatementFree(IdxStatement *pStatement, IdxStatement *pLast){ 10374 IdxStatement *p; 10375 IdxStatement *pNext; 10376 for(p=pStatement; p!=pLast; p=pNext){ 10377 pNext = p->pNext; 10378 sqlite3_free(p->zEQP); 10379 sqlite3_free(p->zIdx); 10380 sqlite3_free(p); 10381 } 10382 } 10383 10384 /* 10385 ** Free the linked list of IdxTable objects starting at pTab. 10386 */ 10387 static void idxTableFree(IdxTable *pTab){ 10388 IdxTable *pIter; 10389 IdxTable *pNext; 10390 for(pIter=pTab; pIter; pIter=pNext){ 10391 pNext = pIter->pNext; 10392 sqlite3_free(pIter); 10393 } 10394 } 10395 10396 /* 10397 ** Free the linked list of IdxWrite objects starting at pTab. 10398 */ 10399 static void idxWriteFree(IdxWrite *pTab){ 10400 IdxWrite *pIter; 10401 IdxWrite *pNext; 10402 for(pIter=pTab; pIter; pIter=pNext){ 10403 pNext = pIter->pNext; 10404 sqlite3_free(pIter); 10405 } 10406 } 10407 10408 10409 10410 /* 10411 ** This function is called after candidate indexes have been created. It 10412 ** runs all the queries to see which indexes they prefer, and populates 10413 ** IdxStatement.zIdx and IdxStatement.zEQP with the results. 10414 */ 10415 int idxFindIndexes( 10416 sqlite3expert *p, 10417 char **pzErr /* OUT: Error message (sqlite3_malloc) */ 10418 ){ 10419 IdxStatement *pStmt; 10420 sqlite3 *dbm = p->dbm; 10421 int rc = SQLITE_OK; 10422 10423 IdxHash hIdx; 10424 idxHashInit(&hIdx); 10425 10426 for(pStmt=p->pStatement; rc==SQLITE_OK && pStmt; pStmt=pStmt->pNext){ 10427 IdxHashEntry *pEntry; 10428 sqlite3_stmt *pExplain = 0; 10429 idxHashClear(&hIdx); 10430 rc = idxPrintfPrepareStmt(dbm, &pExplain, pzErr, 10431 "EXPLAIN QUERY PLAN %s", pStmt->zSql 10432 ); 10433 while( rc==SQLITE_OK && sqlite3_step(pExplain)==SQLITE_ROW ){ 10434 /* int iId = sqlite3_column_int(pExplain, 0); */ 10435 /* int iParent = sqlite3_column_int(pExplain, 1); */ 10436 /* int iNotUsed = sqlite3_column_int(pExplain, 2); */ 10437 const char *zDetail = (const char*)sqlite3_column_text(pExplain, 3); 10438 int nDetail; 10439 int i; 10440 10441 if( !zDetail ) continue; 10442 nDetail = STRLEN(zDetail); 10443 10444 for(i=0; i<nDetail; i++){ 10445 const char *zIdx = 0; 10446 if( i+13<nDetail && memcmp(&zDetail[i], " USING INDEX ", 13)==0 ){ 10447 zIdx = &zDetail[i+13]; 10448 }else if( i+22<nDetail 10449 && memcmp(&zDetail[i], " USING COVERING INDEX ", 22)==0 10450 ){ 10451 zIdx = &zDetail[i+22]; 10452 } 10453 if( zIdx ){ 10454 const char *zSql; 10455 int nIdx = 0; 10456 while( zIdx[nIdx]!='\0' && (zIdx[nIdx]!=' ' || zIdx[nIdx+1]!='(') ){ 10457 nIdx++; 10458 } 10459 zSql = idxHashSearch(&p->hIdx, zIdx, nIdx); 10460 if( zSql ){ 10461 idxHashAdd(&rc, &hIdx, zSql, 0); 10462 if( rc ) goto find_indexes_out; 10463 } 10464 break; 10465 } 10466 } 10467 10468 if( zDetail[0]!='-' ){ 10469 pStmt->zEQP = idxAppendText(&rc, pStmt->zEQP, "%s\n", zDetail); 10470 } 10471 } 10472 10473 for(pEntry=hIdx.pFirst; pEntry; pEntry=pEntry->pNext){ 10474 pStmt->zIdx = idxAppendText(&rc, pStmt->zIdx, "%s;\n", pEntry->zKey); 10475 } 10476 10477 idxFinalize(&rc, pExplain); 10478 } 10479 10480 find_indexes_out: 10481 idxHashClear(&hIdx); 10482 return rc; 10483 } 10484 10485 static int idxAuthCallback( 10486 void *pCtx, 10487 int eOp, 10488 const char *z3, 10489 const char *z4, 10490 const char *zDb, 10491 const char *zTrigger 10492 ){ 10493 int rc = SQLITE_OK; 10494 (void)z4; 10495 (void)zTrigger; 10496 if( eOp==SQLITE_INSERT || eOp==SQLITE_UPDATE || eOp==SQLITE_DELETE ){ 10497 if( sqlite3_stricmp(zDb, "main")==0 ){ 10498 sqlite3expert *p = (sqlite3expert*)pCtx; 10499 IdxTable *pTab; 10500 for(pTab=p->pTable; pTab; pTab=pTab->pNext){ 10501 if( 0==sqlite3_stricmp(z3, pTab->zName) ) break; 10502 } 10503 if( pTab ){ 10504 IdxWrite *pWrite; 10505 for(pWrite=p->pWrite; pWrite; pWrite=pWrite->pNext){ 10506 if( pWrite->pTab==pTab && pWrite->eOp==eOp ) break; 10507 } 10508 if( pWrite==0 ){ 10509 pWrite = idxMalloc(&rc, sizeof(IdxWrite)); 10510 if( rc==SQLITE_OK ){ 10511 pWrite->pTab = pTab; 10512 pWrite->eOp = eOp; 10513 pWrite->pNext = p->pWrite; 10514 p->pWrite = pWrite; 10515 } 10516 } 10517 } 10518 } 10519 } 10520 return rc; 10521 } 10522 10523 static int idxProcessOneTrigger( 10524 sqlite3expert *p, 10525 IdxWrite *pWrite, 10526 char **pzErr 10527 ){ 10528 static const char *zInt = UNIQUE_TABLE_NAME; 10529 static const char *zDrop = "DROP TABLE " UNIQUE_TABLE_NAME; 10530 IdxTable *pTab = pWrite->pTab; 10531 const char *zTab = pTab->zName; 10532 const char *zSql = 10533 "SELECT 'CREATE TEMP' || substr(sql, 7) FROM sqlite_schema " 10534 "WHERE tbl_name = %Q AND type IN ('table', 'trigger') " 10535 "ORDER BY type;"; 10536 sqlite3_stmt *pSelect = 0; 10537 int rc = SQLITE_OK; 10538 char *zWrite = 0; 10539 10540 /* Create the table and its triggers in the temp schema */ 10541 rc = idxPrintfPrepareStmt(p->db, &pSelect, pzErr, zSql, zTab, zTab); 10542 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSelect) ){ 10543 const char *zCreate = (const char*)sqlite3_column_text(pSelect, 0); 10544 rc = sqlite3_exec(p->dbv, zCreate, 0, 0, pzErr); 10545 } 10546 idxFinalize(&rc, pSelect); 10547 10548 /* Rename the table in the temp schema to zInt */ 10549 if( rc==SQLITE_OK ){ 10550 char *z = sqlite3_mprintf("ALTER TABLE temp.%Q RENAME TO %Q", zTab, zInt); 10551 if( z==0 ){ 10552 rc = SQLITE_NOMEM; 10553 }else{ 10554 rc = sqlite3_exec(p->dbv, z, 0, 0, pzErr); 10555 sqlite3_free(z); 10556 } 10557 } 10558 10559 switch( pWrite->eOp ){ 10560 case SQLITE_INSERT: { 10561 int i; 10562 zWrite = idxAppendText(&rc, zWrite, "INSERT INTO %Q VALUES(", zInt); 10563 for(i=0; i<pTab->nCol; i++){ 10564 zWrite = idxAppendText(&rc, zWrite, "%s?", i==0 ? "" : ", "); 10565 } 10566 zWrite = idxAppendText(&rc, zWrite, ")"); 10567 break; 10568 } 10569 case SQLITE_UPDATE: { 10570 int i; 10571 zWrite = idxAppendText(&rc, zWrite, "UPDATE %Q SET ", zInt); 10572 for(i=0; i<pTab->nCol; i++){ 10573 zWrite = idxAppendText(&rc, zWrite, "%s%Q=?", i==0 ? "" : ", ", 10574 pTab->aCol[i].zName 10575 ); 10576 } 10577 break; 10578 } 10579 default: { 10580 assert( pWrite->eOp==SQLITE_DELETE ); 10581 if( rc==SQLITE_OK ){ 10582 zWrite = sqlite3_mprintf("DELETE FROM %Q", zInt); 10583 if( zWrite==0 ) rc = SQLITE_NOMEM; 10584 } 10585 } 10586 } 10587 10588 if( rc==SQLITE_OK ){ 10589 sqlite3_stmt *pX = 0; 10590 rc = sqlite3_prepare_v2(p->dbv, zWrite, -1, &pX, 0); 10591 idxFinalize(&rc, pX); 10592 if( rc!=SQLITE_OK ){ 10593 idxDatabaseError(p->dbv, pzErr); 10594 } 10595 } 10596 sqlite3_free(zWrite); 10597 10598 if( rc==SQLITE_OK ){ 10599 rc = sqlite3_exec(p->dbv, zDrop, 0, 0, pzErr); 10600 } 10601 10602 return rc; 10603 } 10604 10605 static int idxProcessTriggers(sqlite3expert *p, char **pzErr){ 10606 int rc = SQLITE_OK; 10607 IdxWrite *pEnd = 0; 10608 IdxWrite *pFirst = p->pWrite; 10609 10610 while( rc==SQLITE_OK && pFirst!=pEnd ){ 10611 IdxWrite *pIter; 10612 for(pIter=pFirst; rc==SQLITE_OK && pIter!=pEnd; pIter=pIter->pNext){ 10613 rc = idxProcessOneTrigger(p, pIter, pzErr); 10614 } 10615 pEnd = pFirst; 10616 pFirst = p->pWrite; 10617 } 10618 10619 return rc; 10620 } 10621 10622 10623 static int idxCreateVtabSchema(sqlite3expert *p, char **pzErrmsg){ 10624 int rc = idxRegisterVtab(p); 10625 sqlite3_stmt *pSchema = 0; 10626 10627 /* For each table in the main db schema: 10628 ** 10629 ** 1) Add an entry to the p->pTable list, and 10630 ** 2) Create the equivalent virtual table in dbv. 10631 */ 10632 rc = idxPrepareStmt(p->db, &pSchema, pzErrmsg, 10633 "SELECT type, name, sql, 1 FROM sqlite_schema " 10634 "WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%%' " 10635 " UNION ALL " 10636 "SELECT type, name, sql, 2 FROM sqlite_schema " 10637 "WHERE type = 'trigger'" 10638 " AND tbl_name IN(SELECT name FROM sqlite_schema WHERE type = 'view') " 10639 "ORDER BY 4, 1" 10640 ); 10641 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSchema) ){ 10642 const char *zType = (const char*)sqlite3_column_text(pSchema, 0); 10643 const char *zName = (const char*)sqlite3_column_text(pSchema, 1); 10644 const char *zSql = (const char*)sqlite3_column_text(pSchema, 2); 10645 10646 if( zType[0]=='v' || zType[1]=='r' ){ 10647 rc = sqlite3_exec(p->dbv, zSql, 0, 0, pzErrmsg); 10648 }else{ 10649 IdxTable *pTab; 10650 rc = idxGetTableInfo(p->db, zName, &pTab, pzErrmsg); 10651 if( rc==SQLITE_OK ){ 10652 int i; 10653 char *zInner = 0; 10654 char *zOuter = 0; 10655 pTab->pNext = p->pTable; 10656 p->pTable = pTab; 10657 10658 /* The statement the vtab will pass to sqlite3_declare_vtab() */ 10659 zInner = idxAppendText(&rc, 0, "CREATE TABLE x("); 10660 for(i=0; i<pTab->nCol; i++){ 10661 zInner = idxAppendText(&rc, zInner, "%s%Q COLLATE %s", 10662 (i==0 ? "" : ", "), pTab->aCol[i].zName, pTab->aCol[i].zColl 10663 ); 10664 } 10665 zInner = idxAppendText(&rc, zInner, ")"); 10666 10667 /* The CVT statement to create the vtab */ 10668 zOuter = idxAppendText(&rc, 0, 10669 "CREATE VIRTUAL TABLE %Q USING expert(%Q)", zName, zInner 10670 ); 10671 if( rc==SQLITE_OK ){ 10672 rc = sqlite3_exec(p->dbv, zOuter, 0, 0, pzErrmsg); 10673 } 10674 sqlite3_free(zInner); 10675 sqlite3_free(zOuter); 10676 } 10677 } 10678 } 10679 idxFinalize(&rc, pSchema); 10680 return rc; 10681 } 10682 10683 struct IdxSampleCtx { 10684 int iTarget; 10685 double target; /* Target nRet/nRow value */ 10686 double nRow; /* Number of rows seen */ 10687 double nRet; /* Number of rows returned */ 10688 }; 10689 10690 static void idxSampleFunc( 10691 sqlite3_context *pCtx, 10692 int argc, 10693 sqlite3_value **argv 10694 ){ 10695 struct IdxSampleCtx *p = (struct IdxSampleCtx*)sqlite3_user_data(pCtx); 10696 int bRet; 10697 10698 (void)argv; 10699 assert( argc==0 ); 10700 if( p->nRow==0.0 ){ 10701 bRet = 1; 10702 }else{ 10703 bRet = (p->nRet / p->nRow) <= p->target; 10704 if( bRet==0 ){ 10705 unsigned short rnd; 10706 sqlite3_randomness(2, (void*)&rnd); 10707 bRet = ((int)rnd % 100) <= p->iTarget; 10708 } 10709 } 10710 10711 sqlite3_result_int(pCtx, bRet); 10712 p->nRow += 1.0; 10713 p->nRet += (double)bRet; 10714 } 10715 10716 struct IdxRemCtx { 10717 int nSlot; 10718 struct IdxRemSlot { 10719 int eType; /* SQLITE_NULL, INTEGER, REAL, TEXT, BLOB */ 10720 i64 iVal; /* SQLITE_INTEGER value */ 10721 double rVal; /* SQLITE_FLOAT value */ 10722 int nByte; /* Bytes of space allocated at z */ 10723 int n; /* Size of buffer z */ 10724 char *z; /* SQLITE_TEXT/BLOB value */ 10725 } aSlot[1]; 10726 }; 10727 10728 /* 10729 ** Implementation of scalar function rem(). 10730 */ 10731 static void idxRemFunc( 10732 sqlite3_context *pCtx, 10733 int argc, 10734 sqlite3_value **argv 10735 ){ 10736 struct IdxRemCtx *p = (struct IdxRemCtx*)sqlite3_user_data(pCtx); 10737 struct IdxRemSlot *pSlot; 10738 int iSlot; 10739 assert( argc==2 ); 10740 10741 iSlot = sqlite3_value_int(argv[0]); 10742 assert( iSlot<=p->nSlot ); 10743 pSlot = &p->aSlot[iSlot]; 10744 10745 switch( pSlot->eType ){ 10746 case SQLITE_NULL: 10747 /* no-op */ 10748 break; 10749 10750 case SQLITE_INTEGER: 10751 sqlite3_result_int64(pCtx, pSlot->iVal); 10752 break; 10753 10754 case SQLITE_FLOAT: 10755 sqlite3_result_double(pCtx, pSlot->rVal); 10756 break; 10757 10758 case SQLITE_BLOB: 10759 sqlite3_result_blob(pCtx, pSlot->z, pSlot->n, SQLITE_TRANSIENT); 10760 break; 10761 10762 case SQLITE_TEXT: 10763 sqlite3_result_text(pCtx, pSlot->z, pSlot->n, SQLITE_TRANSIENT); 10764 break; 10765 } 10766 10767 pSlot->eType = sqlite3_value_type(argv[1]); 10768 switch( pSlot->eType ){ 10769 case SQLITE_NULL: 10770 /* no-op */ 10771 break; 10772 10773 case SQLITE_INTEGER: 10774 pSlot->iVal = sqlite3_value_int64(argv[1]); 10775 break; 10776 10777 case SQLITE_FLOAT: 10778 pSlot->rVal = sqlite3_value_double(argv[1]); 10779 break; 10780 10781 case SQLITE_BLOB: 10782 case SQLITE_TEXT: { 10783 int nByte = sqlite3_value_bytes(argv[1]); 10784 if( nByte>pSlot->nByte ){ 10785 char *zNew = (char*)sqlite3_realloc(pSlot->z, nByte*2); 10786 if( zNew==0 ){ 10787 sqlite3_result_error_nomem(pCtx); 10788 return; 10789 } 10790 pSlot->nByte = nByte*2; 10791 pSlot->z = zNew; 10792 } 10793 pSlot->n = nByte; 10794 if( pSlot->eType==SQLITE_BLOB ){ 10795 memcpy(pSlot->z, sqlite3_value_blob(argv[1]), nByte); 10796 }else{ 10797 memcpy(pSlot->z, sqlite3_value_text(argv[1]), nByte); 10798 } 10799 break; 10800 } 10801 } 10802 } 10803 10804 static int idxLargestIndex(sqlite3 *db, int *pnMax, char **pzErr){ 10805 int rc = SQLITE_OK; 10806 const char *zMax = 10807 "SELECT max(i.seqno) FROM " 10808 " sqlite_schema AS s, " 10809 " pragma_index_list(s.name) AS l, " 10810 " pragma_index_info(l.name) AS i " 10811 "WHERE s.type = 'table'"; 10812 sqlite3_stmt *pMax = 0; 10813 10814 *pnMax = 0; 10815 rc = idxPrepareStmt(db, &pMax, pzErr, zMax); 10816 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pMax) ){ 10817 *pnMax = sqlite3_column_int(pMax, 0) + 1; 10818 } 10819 idxFinalize(&rc, pMax); 10820 10821 return rc; 10822 } 10823 10824 static int idxPopulateOneStat1( 10825 sqlite3expert *p, 10826 sqlite3_stmt *pIndexXInfo, 10827 sqlite3_stmt *pWriteStat, 10828 const char *zTab, 10829 const char *zIdx, 10830 char **pzErr 10831 ){ 10832 char *zCols = 0; 10833 char *zOrder = 0; 10834 char *zQuery = 0; 10835 int nCol = 0; 10836 int i; 10837 sqlite3_stmt *pQuery = 0; 10838 int *aStat = 0; 10839 int rc = SQLITE_OK; 10840 10841 assert( p->iSample>0 ); 10842 10843 /* Formulate the query text */ 10844 sqlite3_bind_text(pIndexXInfo, 1, zIdx, -1, SQLITE_STATIC); 10845 while( SQLITE_OK==rc && SQLITE_ROW==sqlite3_step(pIndexXInfo) ){ 10846 const char *zComma = zCols==0 ? "" : ", "; 10847 const char *zName = (const char*)sqlite3_column_text(pIndexXInfo, 0); 10848 const char *zColl = (const char*)sqlite3_column_text(pIndexXInfo, 1); 10849 zCols = idxAppendText(&rc, zCols, 10850 "%sx.%Q IS rem(%d, x.%Q) COLLATE %s", zComma, zName, nCol, zName, zColl 10851 ); 10852 zOrder = idxAppendText(&rc, zOrder, "%s%d", zComma, ++nCol); 10853 } 10854 sqlite3_reset(pIndexXInfo); 10855 if( rc==SQLITE_OK ){ 10856 if( p->iSample==100 ){ 10857 zQuery = sqlite3_mprintf( 10858 "SELECT %s FROM %Q x ORDER BY %s", zCols, zTab, zOrder 10859 ); 10860 }else{ 10861 zQuery = sqlite3_mprintf( 10862 "SELECT %s FROM temp."UNIQUE_TABLE_NAME" x ORDER BY %s", zCols, zOrder 10863 ); 10864 } 10865 } 10866 sqlite3_free(zCols); 10867 sqlite3_free(zOrder); 10868 10869 /* Formulate the query text */ 10870 if( rc==SQLITE_OK ){ 10871 sqlite3 *dbrem = (p->iSample==100 ? p->db : p->dbv); 10872 rc = idxPrepareStmt(dbrem, &pQuery, pzErr, zQuery); 10873 } 10874 sqlite3_free(zQuery); 10875 10876 if( rc==SQLITE_OK ){ 10877 aStat = (int*)idxMalloc(&rc, sizeof(int)*(nCol+1)); 10878 } 10879 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pQuery) ){ 10880 IdxHashEntry *pEntry; 10881 char *zStat = 0; 10882 for(i=0; i<=nCol; i++) aStat[i] = 1; 10883 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pQuery) ){ 10884 aStat[0]++; 10885 for(i=0; i<nCol; i++){ 10886 if( sqlite3_column_int(pQuery, i)==0 ) break; 10887 } 10888 for(/*no-op*/; i<nCol; i++){ 10889 aStat[i+1]++; 10890 } 10891 } 10892 10893 if( rc==SQLITE_OK ){ 10894 int s0 = aStat[0]; 10895 zStat = sqlite3_mprintf("%d", s0); 10896 if( zStat==0 ) rc = SQLITE_NOMEM; 10897 for(i=1; rc==SQLITE_OK && i<=nCol; i++){ 10898 zStat = idxAppendText(&rc, zStat, " %d", (s0+aStat[i]/2) / aStat[i]); 10899 } 10900 } 10901 10902 if( rc==SQLITE_OK ){ 10903 sqlite3_bind_text(pWriteStat, 1, zTab, -1, SQLITE_STATIC); 10904 sqlite3_bind_text(pWriteStat, 2, zIdx, -1, SQLITE_STATIC); 10905 sqlite3_bind_text(pWriteStat, 3, zStat, -1, SQLITE_STATIC); 10906 sqlite3_step(pWriteStat); 10907 rc = sqlite3_reset(pWriteStat); 10908 } 10909 10910 pEntry = idxHashFind(&p->hIdx, zIdx, STRLEN(zIdx)); 10911 if( pEntry ){ 10912 assert( pEntry->zVal2==0 ); 10913 pEntry->zVal2 = zStat; 10914 }else{ 10915 sqlite3_free(zStat); 10916 } 10917 } 10918 sqlite3_free(aStat); 10919 idxFinalize(&rc, pQuery); 10920 10921 return rc; 10922 } 10923 10924 static int idxBuildSampleTable(sqlite3expert *p, const char *zTab){ 10925 int rc; 10926 char *zSql; 10927 10928 rc = sqlite3_exec(p->dbv,"DROP TABLE IF EXISTS temp."UNIQUE_TABLE_NAME,0,0,0); 10929 if( rc!=SQLITE_OK ) return rc; 10930 10931 zSql = sqlite3_mprintf( 10932 "CREATE TABLE temp." UNIQUE_TABLE_NAME " AS SELECT * FROM %Q", zTab 10933 ); 10934 if( zSql==0 ) return SQLITE_NOMEM; 10935 rc = sqlite3_exec(p->dbv, zSql, 0, 0, 0); 10936 sqlite3_free(zSql); 10937 10938 return rc; 10939 } 10940 10941 /* 10942 ** This function is called as part of sqlite3_expert_analyze(). Candidate 10943 ** indexes have already been created in database sqlite3expert.dbm, this 10944 ** function populates sqlite_stat1 table in the same database. 10945 ** 10946 ** The stat1 data is generated by querying the 10947 */ 10948 static int idxPopulateStat1(sqlite3expert *p, char **pzErr){ 10949 int rc = SQLITE_OK; 10950 int nMax =0; 10951 struct IdxRemCtx *pCtx = 0; 10952 struct IdxSampleCtx samplectx; 10953 int i; 10954 i64 iPrev = -100000; 10955 sqlite3_stmt *pAllIndex = 0; 10956 sqlite3_stmt *pIndexXInfo = 0; 10957 sqlite3_stmt *pWrite = 0; 10958 10959 const char *zAllIndex = 10960 "SELECT s.rowid, s.name, l.name FROM " 10961 " sqlite_schema AS s, " 10962 " pragma_index_list(s.name) AS l " 10963 "WHERE s.type = 'table'"; 10964 const char *zIndexXInfo = 10965 "SELECT name, coll FROM pragma_index_xinfo(?) WHERE key"; 10966 const char *zWrite = "INSERT INTO sqlite_stat1 VALUES(?, ?, ?)"; 10967 10968 /* If iSample==0, no sqlite_stat1 data is required. */ 10969 if( p->iSample==0 ) return SQLITE_OK; 10970 10971 rc = idxLargestIndex(p->dbm, &nMax, pzErr); 10972 if( nMax<=0 || rc!=SQLITE_OK ) return rc; 10973 10974 rc = sqlite3_exec(p->dbm, "ANALYZE; PRAGMA writable_schema=1", 0, 0, 0); 10975 10976 if( rc==SQLITE_OK ){ 10977 int nByte = sizeof(struct IdxRemCtx) + (sizeof(struct IdxRemSlot) * nMax); 10978 pCtx = (struct IdxRemCtx*)idxMalloc(&rc, nByte); 10979 } 10980 10981 if( rc==SQLITE_OK ){ 10982 sqlite3 *dbrem = (p->iSample==100 ? p->db : p->dbv); 10983 rc = sqlite3_create_function( 10984 dbrem, "rem", 2, SQLITE_UTF8, (void*)pCtx, idxRemFunc, 0, 0 10985 ); 10986 } 10987 if( rc==SQLITE_OK ){ 10988 rc = sqlite3_create_function( 10989 p->db, "sample", 0, SQLITE_UTF8, (void*)&samplectx, idxSampleFunc, 0, 0 10990 ); 10991 } 10992 10993 if( rc==SQLITE_OK ){ 10994 pCtx->nSlot = nMax+1; 10995 rc = idxPrepareStmt(p->dbm, &pAllIndex, pzErr, zAllIndex); 10996 } 10997 if( rc==SQLITE_OK ){ 10998 rc = idxPrepareStmt(p->dbm, &pIndexXInfo, pzErr, zIndexXInfo); 10999 } 11000 if( rc==SQLITE_OK ){ 11001 rc = idxPrepareStmt(p->dbm, &pWrite, pzErr, zWrite); 11002 } 11003 11004 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pAllIndex) ){ 11005 i64 iRowid = sqlite3_column_int64(pAllIndex, 0); 11006 const char *zTab = (const char*)sqlite3_column_text(pAllIndex, 1); 11007 const char *zIdx = (const char*)sqlite3_column_text(pAllIndex, 2); 11008 if( p->iSample<100 && iPrev!=iRowid ){ 11009 samplectx.target = (double)p->iSample / 100.0; 11010 samplectx.iTarget = p->iSample; 11011 samplectx.nRow = 0.0; 11012 samplectx.nRet = 0.0; 11013 rc = idxBuildSampleTable(p, zTab); 11014 if( rc!=SQLITE_OK ) break; 11015 } 11016 rc = idxPopulateOneStat1(p, pIndexXInfo, pWrite, zTab, zIdx, pzErr); 11017 iPrev = iRowid; 11018 } 11019 if( rc==SQLITE_OK && p->iSample<100 ){ 11020 rc = sqlite3_exec(p->dbv, 11021 "DROP TABLE IF EXISTS temp." UNIQUE_TABLE_NAME, 0,0,0 11022 ); 11023 } 11024 11025 idxFinalize(&rc, pAllIndex); 11026 idxFinalize(&rc, pIndexXInfo); 11027 idxFinalize(&rc, pWrite); 11028 11029 if( pCtx ){ 11030 for(i=0; i<pCtx->nSlot; i++){ 11031 sqlite3_free(pCtx->aSlot[i].z); 11032 } 11033 sqlite3_free(pCtx); 11034 } 11035 11036 if( rc==SQLITE_OK ){ 11037 rc = sqlite3_exec(p->dbm, "ANALYZE sqlite_schema", 0, 0, 0); 11038 } 11039 11040 sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp."UNIQUE_TABLE_NAME,0,0,0); 11041 return rc; 11042 } 11043 11044 /* 11045 ** Allocate a new sqlite3expert object. 11046 */ 11047 sqlite3expert *sqlite3_expert_new(sqlite3 *db, char **pzErrmsg){ 11048 int rc = SQLITE_OK; 11049 sqlite3expert *pNew; 11050 11051 pNew = (sqlite3expert*)idxMalloc(&rc, sizeof(sqlite3expert)); 11052 11053 /* Open two in-memory databases to work with. The "vtab database" (dbv) 11054 ** will contain a virtual table corresponding to each real table in 11055 ** the user database schema, and a copy of each view. It is used to 11056 ** collect information regarding the WHERE, ORDER BY and other clauses 11057 ** of the user's query. 11058 */ 11059 if( rc==SQLITE_OK ){ 11060 pNew->db = db; 11061 pNew->iSample = 100; 11062 rc = sqlite3_open(":memory:", &pNew->dbv); 11063 } 11064 if( rc==SQLITE_OK ){ 11065 rc = sqlite3_open(":memory:", &pNew->dbm); 11066 if( rc==SQLITE_OK ){ 11067 sqlite3_db_config(pNew->dbm, SQLITE_DBCONFIG_TRIGGER_EQP, 1, (int*)0); 11068 } 11069 } 11070 11071 11072 /* Copy the entire schema of database [db] into [dbm]. */ 11073 if( rc==SQLITE_OK ){ 11074 sqlite3_stmt *pSql; 11075 rc = idxPrintfPrepareStmt(pNew->db, &pSql, pzErrmsg, 11076 "SELECT sql FROM sqlite_schema WHERE name NOT LIKE 'sqlite_%%'" 11077 " AND sql NOT LIKE 'CREATE VIRTUAL %%'" 11078 ); 11079 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){ 11080 const char *zSql = (const char*)sqlite3_column_text(pSql, 0); 11081 rc = sqlite3_exec(pNew->dbm, zSql, 0, 0, pzErrmsg); 11082 } 11083 idxFinalize(&rc, pSql); 11084 } 11085 11086 /* Create the vtab schema */ 11087 if( rc==SQLITE_OK ){ 11088 rc = idxCreateVtabSchema(pNew, pzErrmsg); 11089 } 11090 11091 /* Register the auth callback with dbv */ 11092 if( rc==SQLITE_OK ){ 11093 sqlite3_set_authorizer(pNew->dbv, idxAuthCallback, (void*)pNew); 11094 } 11095 11096 /* If an error has occurred, free the new object and reutrn NULL. Otherwise, 11097 ** return the new sqlite3expert handle. */ 11098 if( rc!=SQLITE_OK ){ 11099 sqlite3_expert_destroy(pNew); 11100 pNew = 0; 11101 } 11102 return pNew; 11103 } 11104 11105 /* 11106 ** Configure an sqlite3expert object. 11107 */ 11108 int sqlite3_expert_config(sqlite3expert *p, int op, ...){ 11109 int rc = SQLITE_OK; 11110 va_list ap; 11111 va_start(ap, op); 11112 switch( op ){ 11113 case EXPERT_CONFIG_SAMPLE: { 11114 int iVal = va_arg(ap, int); 11115 if( iVal<0 ) iVal = 0; 11116 if( iVal>100 ) iVal = 100; 11117 p->iSample = iVal; 11118 break; 11119 } 11120 default: 11121 rc = SQLITE_NOTFOUND; 11122 break; 11123 } 11124 11125 va_end(ap); 11126 return rc; 11127 } 11128 11129 /* 11130 ** Add an SQL statement to the analysis. 11131 */ 11132 int sqlite3_expert_sql( 11133 sqlite3expert *p, /* From sqlite3_expert_new() */ 11134 const char *zSql, /* SQL statement to add */ 11135 char **pzErr /* OUT: Error message (if any) */ 11136 ){ 11137 IdxScan *pScanOrig = p->pScan; 11138 IdxStatement *pStmtOrig = p->pStatement; 11139 int rc = SQLITE_OK; 11140 const char *zStmt = zSql; 11141 11142 if( p->bRun ) return SQLITE_MISUSE; 11143 11144 while( rc==SQLITE_OK && zStmt && zStmt[0] ){ 11145 sqlite3_stmt *pStmt = 0; 11146 rc = sqlite3_prepare_v2(p->dbv, zStmt, -1, &pStmt, &zStmt); 11147 if( rc==SQLITE_OK ){ 11148 if( pStmt ){ 11149 IdxStatement *pNew; 11150 const char *z = sqlite3_sql(pStmt); 11151 int n = STRLEN(z); 11152 pNew = (IdxStatement*)idxMalloc(&rc, sizeof(IdxStatement) + n+1); 11153 if( rc==SQLITE_OK ){ 11154 pNew->zSql = (char*)&pNew[1]; 11155 memcpy(pNew->zSql, z, n+1); 11156 pNew->pNext = p->pStatement; 11157 if( p->pStatement ) pNew->iId = p->pStatement->iId+1; 11158 p->pStatement = pNew; 11159 } 11160 sqlite3_finalize(pStmt); 11161 } 11162 }else{ 11163 idxDatabaseError(p->dbv, pzErr); 11164 } 11165 } 11166 11167 if( rc!=SQLITE_OK ){ 11168 idxScanFree(p->pScan, pScanOrig); 11169 idxStatementFree(p->pStatement, pStmtOrig); 11170 p->pScan = pScanOrig; 11171 p->pStatement = pStmtOrig; 11172 } 11173 11174 return rc; 11175 } 11176 11177 int sqlite3_expert_analyze(sqlite3expert *p, char **pzErr){ 11178 int rc; 11179 IdxHashEntry *pEntry; 11180 11181 /* Do trigger processing to collect any extra IdxScan structures */ 11182 rc = idxProcessTriggers(p, pzErr); 11183 11184 /* Create candidate indexes within the in-memory database file */ 11185 if( rc==SQLITE_OK ){ 11186 rc = idxCreateCandidates(p); 11187 }else if ( rc==SQLITE_BUSY_TIMEOUT ){ 11188 if( pzErr ) 11189 *pzErr = sqlite3_mprintf("Cannot find a unique index name to propose."); 11190 return rc; 11191 } 11192 11193 /* Generate the stat1 data */ 11194 if( rc==SQLITE_OK ){ 11195 rc = idxPopulateStat1(p, pzErr); 11196 } 11197 11198 /* Formulate the EXPERT_REPORT_CANDIDATES text */ 11199 for(pEntry=p->hIdx.pFirst; pEntry; pEntry=pEntry->pNext){ 11200 p->zCandidates = idxAppendText(&rc, p->zCandidates, 11201 "%s;%s%s\n", pEntry->zVal, 11202 pEntry->zVal2 ? " -- stat1: " : "", pEntry->zVal2 11203 ); 11204 } 11205 11206 /* Figure out which of the candidate indexes are preferred by the query 11207 ** planner and report the results to the user. */ 11208 if( rc==SQLITE_OK ){ 11209 rc = idxFindIndexes(p, pzErr); 11210 } 11211 11212 if( rc==SQLITE_OK ){ 11213 p->bRun = 1; 11214 } 11215 return rc; 11216 } 11217 11218 /* 11219 ** Return the total number of statements that have been added to this 11220 ** sqlite3expert using sqlite3_expert_sql(). 11221 */ 11222 int sqlite3_expert_count(sqlite3expert *p){ 11223 int nRet = 0; 11224 if( p->pStatement ) nRet = p->pStatement->iId+1; 11225 return nRet; 11226 } 11227 11228 /* 11229 ** Return a component of the report. 11230 */ 11231 const char *sqlite3_expert_report(sqlite3expert *p, int iStmt, int eReport){ 11232 const char *zRet = 0; 11233 IdxStatement *pStmt; 11234 11235 if( p->bRun==0 ) return 0; 11236 for(pStmt=p->pStatement; pStmt && pStmt->iId!=iStmt; pStmt=pStmt->pNext); 11237 switch( eReport ){ 11238 case EXPERT_REPORT_SQL: 11239 if( pStmt ) zRet = pStmt->zSql; 11240 break; 11241 case EXPERT_REPORT_INDEXES: 11242 if( pStmt ) zRet = pStmt->zIdx; 11243 break; 11244 case EXPERT_REPORT_PLAN: 11245 if( pStmt ) zRet = pStmt->zEQP; 11246 break; 11247 case EXPERT_REPORT_CANDIDATES: 11248 zRet = p->zCandidates; 11249 break; 11250 } 11251 return zRet; 11252 } 11253 11254 /* 11255 ** Free an sqlite3expert object. 11256 */ 11257 void sqlite3_expert_destroy(sqlite3expert *p){ 11258 if( p ){ 11259 sqlite3_close(p->dbm); 11260 sqlite3_close(p->dbv); 11261 idxScanFree(p->pScan, 0); 11262 idxStatementFree(p->pStatement, 0); 11263 idxTableFree(p->pTable); 11264 idxWriteFree(p->pWrite); 11265 idxHashClear(&p->hIdx); 11266 sqlite3_free(p->zCandidates); 11267 sqlite3_free(p); 11268 } 11269 } 11270 11271 #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */ 11272 11273 /************************* End ../ext/expert/sqlite3expert.c ********************/ 11274 11275 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) 11276 /************************* Begin ../ext/misc/dbdata.c ******************/ 11277 /* 11278 ** 2019-04-17 11279 ** 11280 ** The author disclaims copyright to this source code. In place of 11281 ** a legal notice, here is a blessing: 11282 ** 11283 ** May you do good and not evil. 11284 ** May you find forgiveness for yourself and forgive others. 11285 ** May you share freely, never taking more than you give. 11286 ** 11287 ****************************************************************************** 11288 ** 11289 ** This file contains an implementation of two eponymous virtual tables, 11290 ** "sqlite_dbdata" and "sqlite_dbptr". Both modules require that the 11291 ** "sqlite_dbpage" eponymous virtual table be available. 11292 ** 11293 ** SQLITE_DBDATA: 11294 ** sqlite_dbdata is used to extract data directly from a database b-tree 11295 ** page and its associated overflow pages, bypassing the b-tree layer. 11296 ** The table schema is equivalent to: 11297 ** 11298 ** CREATE TABLE sqlite_dbdata( 11299 ** pgno INTEGER, 11300 ** cell INTEGER, 11301 ** field INTEGER, 11302 ** value ANY, 11303 ** schema TEXT HIDDEN 11304 ** ); 11305 ** 11306 ** IMPORTANT: THE VIRTUAL TABLE SCHEMA ABOVE IS SUBJECT TO CHANGE. IN THE 11307 ** FUTURE NEW NON-HIDDEN COLUMNS MAY BE ADDED BETWEEN "value" AND 11308 ** "schema". 11309 ** 11310 ** Each page of the database is inspected. If it cannot be interpreted as 11311 ** a b-tree page, or if it is a b-tree page containing 0 entries, the 11312 ** sqlite_dbdata table contains no rows for that page. Otherwise, the 11313 ** table contains one row for each field in the record associated with 11314 ** each cell on the page. For intkey b-trees, the key value is stored in 11315 ** field -1. 11316 ** 11317 ** For example, for the database: 11318 ** 11319 ** CREATE TABLE t1(a, b); -- root page is page 2 11320 ** INSERT INTO t1(rowid, a, b) VALUES(5, 'v', 'five'); 11321 ** INSERT INTO t1(rowid, a, b) VALUES(10, 'x', 'ten'); 11322 ** 11323 ** the sqlite_dbdata table contains, as well as from entries related to 11324 ** page 1, content equivalent to: 11325 ** 11326 ** INSERT INTO sqlite_dbdata(pgno, cell, field, value) VALUES 11327 ** (2, 0, -1, 5 ), 11328 ** (2, 0, 0, 'v' ), 11329 ** (2, 0, 1, 'five'), 11330 ** (2, 1, -1, 10 ), 11331 ** (2, 1, 0, 'x' ), 11332 ** (2, 1, 1, 'ten' ); 11333 ** 11334 ** If database corruption is encountered, this module does not report an 11335 ** error. Instead, it attempts to extract as much data as possible and 11336 ** ignores the corruption. 11337 ** 11338 ** SQLITE_DBPTR: 11339 ** The sqlite_dbptr table has the following schema: 11340 ** 11341 ** CREATE TABLE sqlite_dbptr( 11342 ** pgno INTEGER, 11343 ** child INTEGER, 11344 ** schema TEXT HIDDEN 11345 ** ); 11346 ** 11347 ** It contains one entry for each b-tree pointer between a parent and 11348 ** child page in the database. 11349 */ 11350 #if !defined(SQLITEINT_H) 11351 /* #include "sqlite3ext.h" */ 11352 11353 /* typedef unsigned char u8; */ 11354 11355 #endif 11356 SQLITE_EXTENSION_INIT1 11357 #include <string.h> 11358 #include <assert.h> 11359 11360 #define DBDATA_PADDING_BYTES 100 11361 11362 typedef struct DbdataTable DbdataTable; 11363 typedef struct DbdataCursor DbdataCursor; 11364 11365 /* Cursor object */ 11366 struct DbdataCursor { 11367 sqlite3_vtab_cursor base; /* Base class. Must be first */ 11368 sqlite3_stmt *pStmt; /* For fetching database pages */ 11369 11370 int iPgno; /* Current page number */ 11371 u8 *aPage; /* Buffer containing page */ 11372 int nPage; /* Size of aPage[] in bytes */ 11373 int nCell; /* Number of cells on aPage[] */ 11374 int iCell; /* Current cell number */ 11375 int bOnePage; /* True to stop after one page */ 11376 int szDb; 11377 sqlite3_int64 iRowid; 11378 11379 /* Only for the sqlite_dbdata table */ 11380 u8 *pRec; /* Buffer containing current record */ 11381 int nRec; /* Size of pRec[] in bytes */ 11382 int nHdr; /* Size of header in bytes */ 11383 int iField; /* Current field number */ 11384 u8 *pHdrPtr; 11385 u8 *pPtr; 11386 11387 sqlite3_int64 iIntkey; /* Integer key value */ 11388 }; 11389 11390 /* Table object */ 11391 struct DbdataTable { 11392 sqlite3_vtab base; /* Base class. Must be first */ 11393 sqlite3 *db; /* The database connection */ 11394 sqlite3_stmt *pStmt; /* For fetching database pages */ 11395 int bPtr; /* True for sqlite3_dbptr table */ 11396 }; 11397 11398 /* Column and schema definitions for sqlite_dbdata */ 11399 #define DBDATA_COLUMN_PGNO 0 11400 #define DBDATA_COLUMN_CELL 1 11401 #define DBDATA_COLUMN_FIELD 2 11402 #define DBDATA_COLUMN_VALUE 3 11403 #define DBDATA_COLUMN_SCHEMA 4 11404 #define DBDATA_SCHEMA \ 11405 "CREATE TABLE x(" \ 11406 " pgno INTEGER," \ 11407 " cell INTEGER," \ 11408 " field INTEGER," \ 11409 " value ANY," \ 11410 " schema TEXT HIDDEN" \ 11411 ")" 11412 11413 /* Column and schema definitions for sqlite_dbptr */ 11414 #define DBPTR_COLUMN_PGNO 0 11415 #define DBPTR_COLUMN_CHILD 1 11416 #define DBPTR_COLUMN_SCHEMA 2 11417 #define DBPTR_SCHEMA \ 11418 "CREATE TABLE x(" \ 11419 " pgno INTEGER," \ 11420 " child INTEGER," \ 11421 " schema TEXT HIDDEN" \ 11422 ")" 11423 11424 /* 11425 ** Connect to an sqlite_dbdata (pAux==0) or sqlite_dbptr (pAux!=0) virtual 11426 ** table. 11427 */ 11428 static int dbdataConnect( 11429 sqlite3 *db, 11430 void *pAux, 11431 int argc, const char *const*argv, 11432 sqlite3_vtab **ppVtab, 11433 char **pzErr 11434 ){ 11435 DbdataTable *pTab = 0; 11436 int rc = sqlite3_declare_vtab(db, pAux ? DBPTR_SCHEMA : DBDATA_SCHEMA); 11437 11438 if( rc==SQLITE_OK ){ 11439 pTab = (DbdataTable*)sqlite3_malloc64(sizeof(DbdataTable)); 11440 if( pTab==0 ){ 11441 rc = SQLITE_NOMEM; 11442 }else{ 11443 memset(pTab, 0, sizeof(DbdataTable)); 11444 pTab->db = db; 11445 pTab->bPtr = (pAux!=0); 11446 } 11447 } 11448 11449 *ppVtab = (sqlite3_vtab*)pTab; 11450 return rc; 11451 } 11452 11453 /* 11454 ** Disconnect from or destroy a sqlite_dbdata or sqlite_dbptr virtual table. 11455 */ 11456 static int dbdataDisconnect(sqlite3_vtab *pVtab){ 11457 DbdataTable *pTab = (DbdataTable*)pVtab; 11458 if( pTab ){ 11459 sqlite3_finalize(pTab->pStmt); 11460 sqlite3_free(pVtab); 11461 } 11462 return SQLITE_OK; 11463 } 11464 11465 /* 11466 ** This function interprets two types of constraints: 11467 ** 11468 ** schema=? 11469 ** pgno=? 11470 ** 11471 ** If neither are present, idxNum is set to 0. If schema=? is present, 11472 ** the 0x01 bit in idxNum is set. If pgno=? is present, the 0x02 bit 11473 ** in idxNum is set. 11474 ** 11475 ** If both parameters are present, schema is in position 0 and pgno in 11476 ** position 1. 11477 */ 11478 static int dbdataBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdx){ 11479 DbdataTable *pTab = (DbdataTable*)tab; 11480 int i; 11481 int iSchema = -1; 11482 int iPgno = -1; 11483 int colSchema = (pTab->bPtr ? DBPTR_COLUMN_SCHEMA : DBDATA_COLUMN_SCHEMA); 11484 11485 for(i=0; i<pIdx->nConstraint; i++){ 11486 struct sqlite3_index_constraint *p = &pIdx->aConstraint[i]; 11487 if( p->op==SQLITE_INDEX_CONSTRAINT_EQ ){ 11488 if( p->iColumn==colSchema ){ 11489 if( p->usable==0 ) return SQLITE_CONSTRAINT; 11490 iSchema = i; 11491 } 11492 if( p->iColumn==DBDATA_COLUMN_PGNO && p->usable ){ 11493 iPgno = i; 11494 } 11495 } 11496 } 11497 11498 if( iSchema>=0 ){ 11499 pIdx->aConstraintUsage[iSchema].argvIndex = 1; 11500 pIdx->aConstraintUsage[iSchema].omit = 1; 11501 } 11502 if( iPgno>=0 ){ 11503 pIdx->aConstraintUsage[iPgno].argvIndex = 1 + (iSchema>=0); 11504 pIdx->aConstraintUsage[iPgno].omit = 1; 11505 pIdx->estimatedCost = 100; 11506 pIdx->estimatedRows = 50; 11507 11508 if( pTab->bPtr==0 && pIdx->nOrderBy && pIdx->aOrderBy[0].desc==0 ){ 11509 int iCol = pIdx->aOrderBy[0].iColumn; 11510 if( pIdx->nOrderBy==1 ){ 11511 pIdx->orderByConsumed = (iCol==0 || iCol==1); 11512 }else if( pIdx->nOrderBy==2 && pIdx->aOrderBy[1].desc==0 && iCol==0 ){ 11513 pIdx->orderByConsumed = (pIdx->aOrderBy[1].iColumn==1); 11514 } 11515 } 11516 11517 }else{ 11518 pIdx->estimatedCost = 100000000; 11519 pIdx->estimatedRows = 1000000000; 11520 } 11521 pIdx->idxNum = (iSchema>=0 ? 0x01 : 0x00) | (iPgno>=0 ? 0x02 : 0x00); 11522 return SQLITE_OK; 11523 } 11524 11525 /* 11526 ** Open a new sqlite_dbdata or sqlite_dbptr cursor. 11527 */ 11528 static int dbdataOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){ 11529 DbdataCursor *pCsr; 11530 11531 pCsr = (DbdataCursor*)sqlite3_malloc64(sizeof(DbdataCursor)); 11532 if( pCsr==0 ){ 11533 return SQLITE_NOMEM; 11534 }else{ 11535 memset(pCsr, 0, sizeof(DbdataCursor)); 11536 pCsr->base.pVtab = pVTab; 11537 } 11538 11539 *ppCursor = (sqlite3_vtab_cursor *)pCsr; 11540 return SQLITE_OK; 11541 } 11542 11543 /* 11544 ** Restore a cursor object to the state it was in when first allocated 11545 ** by dbdataOpen(). 11546 */ 11547 static void dbdataResetCursor(DbdataCursor *pCsr){ 11548 DbdataTable *pTab = (DbdataTable*)(pCsr->base.pVtab); 11549 if( pTab->pStmt==0 ){ 11550 pTab->pStmt = pCsr->pStmt; 11551 }else{ 11552 sqlite3_finalize(pCsr->pStmt); 11553 } 11554 pCsr->pStmt = 0; 11555 pCsr->iPgno = 1; 11556 pCsr->iCell = 0; 11557 pCsr->iField = 0; 11558 pCsr->bOnePage = 0; 11559 sqlite3_free(pCsr->aPage); 11560 sqlite3_free(pCsr->pRec); 11561 pCsr->pRec = 0; 11562 pCsr->aPage = 0; 11563 } 11564 11565 /* 11566 ** Close an sqlite_dbdata or sqlite_dbptr cursor. 11567 */ 11568 static int dbdataClose(sqlite3_vtab_cursor *pCursor){ 11569 DbdataCursor *pCsr = (DbdataCursor*)pCursor; 11570 dbdataResetCursor(pCsr); 11571 sqlite3_free(pCsr); 11572 return SQLITE_OK; 11573 } 11574 11575 /* 11576 ** Utility methods to decode 16 and 32-bit big-endian unsigned integers. 11577 */ 11578 static unsigned int get_uint16(unsigned char *a){ 11579 return (a[0]<<8)|a[1]; 11580 } 11581 static unsigned int get_uint32(unsigned char *a){ 11582 return ((unsigned int)a[0]<<24) 11583 | ((unsigned int)a[1]<<16) 11584 | ((unsigned int)a[2]<<8) 11585 | ((unsigned int)a[3]); 11586 } 11587 11588 /* 11589 ** Load page pgno from the database via the sqlite_dbpage virtual table. 11590 ** If successful, set (*ppPage) to point to a buffer containing the page 11591 ** data, (*pnPage) to the size of that buffer in bytes and return 11592 ** SQLITE_OK. In this case it is the responsibility of the caller to 11593 ** eventually free the buffer using sqlite3_free(). 11594 ** 11595 ** Or, if an error occurs, set both (*ppPage) and (*pnPage) to 0 and 11596 ** return an SQLite error code. 11597 */ 11598 static int dbdataLoadPage( 11599 DbdataCursor *pCsr, /* Cursor object */ 11600 unsigned int pgno, /* Page number of page to load */ 11601 u8 **ppPage, /* OUT: pointer to page buffer */ 11602 int *pnPage /* OUT: Size of (*ppPage) in bytes */ 11603 ){ 11604 int rc2; 11605 int rc = SQLITE_OK; 11606 sqlite3_stmt *pStmt = pCsr->pStmt; 11607 11608 *ppPage = 0; 11609 *pnPage = 0; 11610 sqlite3_bind_int64(pStmt, 2, pgno); 11611 if( SQLITE_ROW==sqlite3_step(pStmt) ){ 11612 int nCopy = sqlite3_column_bytes(pStmt, 0); 11613 if( nCopy>0 ){ 11614 u8 *pPage; 11615 pPage = (u8*)sqlite3_malloc64(nCopy + DBDATA_PADDING_BYTES); 11616 if( pPage==0 ){ 11617 rc = SQLITE_NOMEM; 11618 }else{ 11619 const u8 *pCopy = sqlite3_column_blob(pStmt, 0); 11620 memcpy(pPage, pCopy, nCopy); 11621 memset(&pPage[nCopy], 0, DBDATA_PADDING_BYTES); 11622 } 11623 *ppPage = pPage; 11624 *pnPage = nCopy; 11625 } 11626 } 11627 rc2 = sqlite3_reset(pStmt); 11628 if( rc==SQLITE_OK ) rc = rc2; 11629 11630 return rc; 11631 } 11632 11633 /* 11634 ** Read a varint. Put the value in *pVal and return the number of bytes. 11635 */ 11636 static int dbdataGetVarint(const u8 *z, sqlite3_int64 *pVal){ 11637 sqlite3_int64 v = 0; 11638 int i; 11639 for(i=0; i<8; i++){ 11640 v = (v<<7) + (z[i]&0x7f); 11641 if( (z[i]&0x80)==0 ){ *pVal = v; return i+1; } 11642 } 11643 v = (v<<8) + (z[i]&0xff); 11644 *pVal = v; 11645 return 9; 11646 } 11647 11648 /* 11649 ** Return the number of bytes of space used by an SQLite value of type 11650 ** eType. 11651 */ 11652 static int dbdataValueBytes(int eType){ 11653 switch( eType ){ 11654 case 0: case 8: case 9: 11655 case 10: case 11: 11656 return 0; 11657 case 1: 11658 return 1; 11659 case 2: 11660 return 2; 11661 case 3: 11662 return 3; 11663 case 4: 11664 return 4; 11665 case 5: 11666 return 6; 11667 case 6: 11668 case 7: 11669 return 8; 11670 default: 11671 if( eType>0 ){ 11672 return ((eType-12) / 2); 11673 } 11674 return 0; 11675 } 11676 } 11677 11678 /* 11679 ** Load a value of type eType from buffer pData and use it to set the 11680 ** result of context object pCtx. 11681 */ 11682 static void dbdataValue( 11683 sqlite3_context *pCtx, 11684 int eType, 11685 u8 *pData, 11686 int nData 11687 ){ 11688 if( eType>=0 && dbdataValueBytes(eType)<=nData ){ 11689 switch( eType ){ 11690 case 0: 11691 case 10: 11692 case 11: 11693 sqlite3_result_null(pCtx); 11694 break; 11695 11696 case 8: 11697 sqlite3_result_int(pCtx, 0); 11698 break; 11699 case 9: 11700 sqlite3_result_int(pCtx, 1); 11701 break; 11702 11703 case 1: case 2: case 3: case 4: case 5: case 6: case 7: { 11704 sqlite3_uint64 v = (signed char)pData[0]; 11705 pData++; 11706 switch( eType ){ 11707 case 7: 11708 case 6: v = (v<<16) + (pData[0]<<8) + pData[1]; pData += 2; 11709 case 5: v = (v<<16) + (pData[0]<<8) + pData[1]; pData += 2; 11710 case 4: v = (v<<8) + pData[0]; pData++; 11711 case 3: v = (v<<8) + pData[0]; pData++; 11712 case 2: v = (v<<8) + pData[0]; pData++; 11713 } 11714 11715 if( eType==7 ){ 11716 double r; 11717 memcpy(&r, &v, sizeof(r)); 11718 sqlite3_result_double(pCtx, r); 11719 }else{ 11720 sqlite3_result_int64(pCtx, (sqlite3_int64)v); 11721 } 11722 break; 11723 } 11724 11725 default: { 11726 int n = ((eType-12) / 2); 11727 if( eType % 2 ){ 11728 sqlite3_result_text(pCtx, (const char*)pData, n, SQLITE_TRANSIENT); 11729 }else{ 11730 sqlite3_result_blob(pCtx, pData, n, SQLITE_TRANSIENT); 11731 } 11732 } 11733 } 11734 } 11735 } 11736 11737 /* 11738 ** Move an sqlite_dbdata or sqlite_dbptr cursor to the next entry. 11739 */ 11740 static int dbdataNext(sqlite3_vtab_cursor *pCursor){ 11741 DbdataCursor *pCsr = (DbdataCursor*)pCursor; 11742 DbdataTable *pTab = (DbdataTable*)pCursor->pVtab; 11743 11744 pCsr->iRowid++; 11745 while( 1 ){ 11746 int rc; 11747 int iOff = (pCsr->iPgno==1 ? 100 : 0); 11748 int bNextPage = 0; 11749 11750 if( pCsr->aPage==0 ){ 11751 while( 1 ){ 11752 if( pCsr->bOnePage==0 && pCsr->iPgno>pCsr->szDb ) return SQLITE_OK; 11753 rc = dbdataLoadPage(pCsr, pCsr->iPgno, &pCsr->aPage, &pCsr->nPage); 11754 if( rc!=SQLITE_OK ) return rc; 11755 if( pCsr->aPage ) break; 11756 pCsr->iPgno++; 11757 } 11758 pCsr->iCell = pTab->bPtr ? -2 : 0; 11759 pCsr->nCell = get_uint16(&pCsr->aPage[iOff+3]); 11760 } 11761 11762 if( pTab->bPtr ){ 11763 if( pCsr->aPage[iOff]!=0x02 && pCsr->aPage[iOff]!=0x05 ){ 11764 pCsr->iCell = pCsr->nCell; 11765 } 11766 pCsr->iCell++; 11767 if( pCsr->iCell>=pCsr->nCell ){ 11768 sqlite3_free(pCsr->aPage); 11769 pCsr->aPage = 0; 11770 if( pCsr->bOnePage ) return SQLITE_OK; 11771 pCsr->iPgno++; 11772 }else{ 11773 return SQLITE_OK; 11774 } 11775 }else{ 11776 /* If there is no record loaded, load it now. */ 11777 if( pCsr->pRec==0 ){ 11778 int bHasRowid = 0; 11779 int nPointer = 0; 11780 sqlite3_int64 nPayload = 0; 11781 sqlite3_int64 nHdr = 0; 11782 int iHdr; 11783 int U, X; 11784 int nLocal; 11785 11786 switch( pCsr->aPage[iOff] ){ 11787 case 0x02: 11788 nPointer = 4; 11789 break; 11790 case 0x0a: 11791 break; 11792 case 0x0d: 11793 bHasRowid = 1; 11794 break; 11795 default: 11796 /* This is not a b-tree page with records on it. Continue. */ 11797 pCsr->iCell = pCsr->nCell; 11798 break; 11799 } 11800 11801 if( pCsr->iCell>=pCsr->nCell ){ 11802 bNextPage = 1; 11803 }else{ 11804 11805 iOff += 8 + nPointer + pCsr->iCell*2; 11806 if( iOff>pCsr->nPage ){ 11807 bNextPage = 1; 11808 }else{ 11809 iOff = get_uint16(&pCsr->aPage[iOff]); 11810 } 11811 11812 /* For an interior node cell, skip past the child-page number */ 11813 iOff += nPointer; 11814 11815 /* Load the "byte of payload including overflow" field */ 11816 if( bNextPage || iOff>pCsr->nPage ){ 11817 bNextPage = 1; 11818 }else{ 11819 iOff += dbdataGetVarint(&pCsr->aPage[iOff], &nPayload); 11820 } 11821 11822 /* If this is a leaf intkey cell, load the rowid */ 11823 if( bHasRowid && !bNextPage && iOff<pCsr->nPage ){ 11824 iOff += dbdataGetVarint(&pCsr->aPage[iOff], &pCsr->iIntkey); 11825 } 11826 11827 /* Figure out how much data to read from the local page */ 11828 U = pCsr->nPage; 11829 if( bHasRowid ){ 11830 X = U-35; 11831 }else{ 11832 X = ((U-12)*64/255)-23; 11833 } 11834 if( nPayload<=X ){ 11835 nLocal = nPayload; 11836 }else{ 11837 int M, K; 11838 M = ((U-12)*32/255)-23; 11839 K = M+((nPayload-M)%(U-4)); 11840 if( K<=X ){ 11841 nLocal = K; 11842 }else{ 11843 nLocal = M; 11844 } 11845 } 11846 11847 if( bNextPage || nLocal+iOff>pCsr->nPage ){ 11848 bNextPage = 1; 11849 }else{ 11850 11851 /* Allocate space for payload. And a bit more to catch small buffer 11852 ** overruns caused by attempting to read a varint or similar from 11853 ** near the end of a corrupt record. */ 11854 pCsr->pRec = (u8*)sqlite3_malloc64(nPayload+DBDATA_PADDING_BYTES); 11855 if( pCsr->pRec==0 ) return SQLITE_NOMEM; 11856 memset(pCsr->pRec, 0, nPayload+DBDATA_PADDING_BYTES); 11857 pCsr->nRec = nPayload; 11858 11859 /* Load the nLocal bytes of payload */ 11860 memcpy(pCsr->pRec, &pCsr->aPage[iOff], nLocal); 11861 iOff += nLocal; 11862 11863 /* Load content from overflow pages */ 11864 if( nPayload>nLocal ){ 11865 sqlite3_int64 nRem = nPayload - nLocal; 11866 unsigned int pgnoOvfl = get_uint32(&pCsr->aPage[iOff]); 11867 while( nRem>0 ){ 11868 u8 *aOvfl = 0; 11869 int nOvfl = 0; 11870 int nCopy; 11871 rc = dbdataLoadPage(pCsr, pgnoOvfl, &aOvfl, &nOvfl); 11872 assert( rc!=SQLITE_OK || aOvfl==0 || nOvfl==pCsr->nPage ); 11873 if( rc!=SQLITE_OK ) return rc; 11874 if( aOvfl==0 ) break; 11875 11876 nCopy = U-4; 11877 if( nCopy>nRem ) nCopy = nRem; 11878 memcpy(&pCsr->pRec[nPayload-nRem], &aOvfl[4], nCopy); 11879 nRem -= nCopy; 11880 11881 pgnoOvfl = get_uint32(aOvfl); 11882 sqlite3_free(aOvfl); 11883 } 11884 } 11885 11886 iHdr = dbdataGetVarint(pCsr->pRec, &nHdr); 11887 pCsr->nHdr = nHdr; 11888 pCsr->pHdrPtr = &pCsr->pRec[iHdr]; 11889 pCsr->pPtr = &pCsr->pRec[pCsr->nHdr]; 11890 pCsr->iField = (bHasRowid ? -1 : 0); 11891 } 11892 } 11893 }else{ 11894 pCsr->iField++; 11895 if( pCsr->iField>0 ){ 11896 sqlite3_int64 iType; 11897 if( pCsr->pHdrPtr>&pCsr->pRec[pCsr->nRec] ){ 11898 bNextPage = 1; 11899 }else{ 11900 pCsr->pHdrPtr += dbdataGetVarint(pCsr->pHdrPtr, &iType); 11901 pCsr->pPtr += dbdataValueBytes(iType); 11902 } 11903 } 11904 } 11905 11906 if( bNextPage ){ 11907 sqlite3_free(pCsr->aPage); 11908 sqlite3_free(pCsr->pRec); 11909 pCsr->aPage = 0; 11910 pCsr->pRec = 0; 11911 if( pCsr->bOnePage ) return SQLITE_OK; 11912 pCsr->iPgno++; 11913 }else{ 11914 if( pCsr->iField<0 || pCsr->pHdrPtr<&pCsr->pRec[pCsr->nHdr] ){ 11915 return SQLITE_OK; 11916 } 11917 11918 /* Advance to the next cell. The next iteration of the loop will load 11919 ** the record and so on. */ 11920 sqlite3_free(pCsr->pRec); 11921 pCsr->pRec = 0; 11922 pCsr->iCell++; 11923 } 11924 } 11925 } 11926 11927 assert( !"can't get here" ); 11928 return SQLITE_OK; 11929 } 11930 11931 /* 11932 ** Return true if the cursor is at EOF. 11933 */ 11934 static int dbdataEof(sqlite3_vtab_cursor *pCursor){ 11935 DbdataCursor *pCsr = (DbdataCursor*)pCursor; 11936 return pCsr->aPage==0; 11937 } 11938 11939 /* 11940 ** Determine the size in pages of database zSchema (where zSchema is 11941 ** "main", "temp" or the name of an attached database) and set 11942 ** pCsr->szDb accordingly. If successful, return SQLITE_OK. Otherwise, 11943 ** an SQLite error code. 11944 */ 11945 static int dbdataDbsize(DbdataCursor *pCsr, const char *zSchema){ 11946 DbdataTable *pTab = (DbdataTable*)pCsr->base.pVtab; 11947 char *zSql = 0; 11948 int rc, rc2; 11949 sqlite3_stmt *pStmt = 0; 11950 11951 zSql = sqlite3_mprintf("PRAGMA %Q.page_count", zSchema); 11952 if( zSql==0 ) return SQLITE_NOMEM; 11953 rc = sqlite3_prepare_v2(pTab->db, zSql, -1, &pStmt, 0); 11954 sqlite3_free(zSql); 11955 if( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){ 11956 pCsr->szDb = sqlite3_column_int(pStmt, 0); 11957 } 11958 rc2 = sqlite3_finalize(pStmt); 11959 if( rc==SQLITE_OK ) rc = rc2; 11960 return rc; 11961 } 11962 11963 /* 11964 ** xFilter method for sqlite_dbdata and sqlite_dbptr. 11965 */ 11966 static int dbdataFilter( 11967 sqlite3_vtab_cursor *pCursor, 11968 int idxNum, const char *idxStr, 11969 int argc, sqlite3_value **argv 11970 ){ 11971 DbdataCursor *pCsr = (DbdataCursor*)pCursor; 11972 DbdataTable *pTab = (DbdataTable*)pCursor->pVtab; 11973 int rc = SQLITE_OK; 11974 const char *zSchema = "main"; 11975 11976 dbdataResetCursor(pCsr); 11977 assert( pCsr->iPgno==1 ); 11978 if( idxNum & 0x01 ){ 11979 zSchema = (const char*)sqlite3_value_text(argv[0]); 11980 } 11981 if( idxNum & 0x02 ){ 11982 pCsr->iPgno = sqlite3_value_int(argv[(idxNum & 0x01)]); 11983 pCsr->bOnePage = 1; 11984 }else{ 11985 pCsr->nPage = dbdataDbsize(pCsr, zSchema); 11986 rc = dbdataDbsize(pCsr, zSchema); 11987 } 11988 11989 if( rc==SQLITE_OK ){ 11990 if( pTab->pStmt ){ 11991 pCsr->pStmt = pTab->pStmt; 11992 pTab->pStmt = 0; 11993 }else{ 11994 rc = sqlite3_prepare_v2(pTab->db, 11995 "SELECT data FROM sqlite_dbpage(?) WHERE pgno=?", -1, 11996 &pCsr->pStmt, 0 11997 ); 11998 } 11999 } 12000 if( rc==SQLITE_OK ){ 12001 rc = sqlite3_bind_text(pCsr->pStmt, 1, zSchema, -1, SQLITE_TRANSIENT); 12002 }else{ 12003 pTab->base.zErrMsg = sqlite3_mprintf("%s", sqlite3_errmsg(pTab->db)); 12004 } 12005 if( rc==SQLITE_OK ){ 12006 rc = dbdataNext(pCursor); 12007 } 12008 return rc; 12009 } 12010 12011 /* 12012 ** Return a column for the sqlite_dbdata or sqlite_dbptr table. 12013 */ 12014 static int dbdataColumn( 12015 sqlite3_vtab_cursor *pCursor, 12016 sqlite3_context *ctx, 12017 int i 12018 ){ 12019 DbdataCursor *pCsr = (DbdataCursor*)pCursor; 12020 DbdataTable *pTab = (DbdataTable*)pCursor->pVtab; 12021 if( pTab->bPtr ){ 12022 switch( i ){ 12023 case DBPTR_COLUMN_PGNO: 12024 sqlite3_result_int64(ctx, pCsr->iPgno); 12025 break; 12026 case DBPTR_COLUMN_CHILD: { 12027 int iOff = pCsr->iPgno==1 ? 100 : 0; 12028 if( pCsr->iCell<0 ){ 12029 iOff += 8; 12030 }else{ 12031 iOff += 12 + pCsr->iCell*2; 12032 if( iOff>pCsr->nPage ) return SQLITE_OK; 12033 iOff = get_uint16(&pCsr->aPage[iOff]); 12034 } 12035 if( iOff<=pCsr->nPage ){ 12036 sqlite3_result_int64(ctx, get_uint32(&pCsr->aPage[iOff])); 12037 } 12038 break; 12039 } 12040 } 12041 }else{ 12042 switch( i ){ 12043 case DBDATA_COLUMN_PGNO: 12044 sqlite3_result_int64(ctx, pCsr->iPgno); 12045 break; 12046 case DBDATA_COLUMN_CELL: 12047 sqlite3_result_int(ctx, pCsr->iCell); 12048 break; 12049 case DBDATA_COLUMN_FIELD: 12050 sqlite3_result_int(ctx, pCsr->iField); 12051 break; 12052 case DBDATA_COLUMN_VALUE: { 12053 if( pCsr->iField<0 ){ 12054 sqlite3_result_int64(ctx, pCsr->iIntkey); 12055 }else{ 12056 sqlite3_int64 iType; 12057 dbdataGetVarint(pCsr->pHdrPtr, &iType); 12058 dbdataValue( 12059 ctx, iType, pCsr->pPtr, &pCsr->pRec[pCsr->nRec] - pCsr->pPtr 12060 ); 12061 } 12062 break; 12063 } 12064 } 12065 } 12066 return SQLITE_OK; 12067 } 12068 12069 /* 12070 ** Return the rowid for an sqlite_dbdata or sqlite_dptr table. 12071 */ 12072 static int dbdataRowid(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){ 12073 DbdataCursor *pCsr = (DbdataCursor*)pCursor; 12074 *pRowid = pCsr->iRowid; 12075 return SQLITE_OK; 12076 } 12077 12078 12079 /* 12080 ** Invoke this routine to register the "sqlite_dbdata" virtual table module 12081 */ 12082 static int sqlite3DbdataRegister(sqlite3 *db){ 12083 static sqlite3_module dbdata_module = { 12084 0, /* iVersion */ 12085 0, /* xCreate */ 12086 dbdataConnect, /* xConnect */ 12087 dbdataBestIndex, /* xBestIndex */ 12088 dbdataDisconnect, /* xDisconnect */ 12089 0, /* xDestroy */ 12090 dbdataOpen, /* xOpen - open a cursor */ 12091 dbdataClose, /* xClose - close a cursor */ 12092 dbdataFilter, /* xFilter - configure scan constraints */ 12093 dbdataNext, /* xNext - advance a cursor */ 12094 dbdataEof, /* xEof - check for end of scan */ 12095 dbdataColumn, /* xColumn - read data */ 12096 dbdataRowid, /* xRowid - read data */ 12097 0, /* xUpdate */ 12098 0, /* xBegin */ 12099 0, /* xSync */ 12100 0, /* xCommit */ 12101 0, /* xRollback */ 12102 0, /* xFindMethod */ 12103 0, /* xRename */ 12104 0, /* xSavepoint */ 12105 0, /* xRelease */ 12106 0, /* xRollbackTo */ 12107 0 /* xShadowName */ 12108 }; 12109 12110 int rc = sqlite3_create_module(db, "sqlite_dbdata", &dbdata_module, 0); 12111 if( rc==SQLITE_OK ){ 12112 rc = sqlite3_create_module(db, "sqlite_dbptr", &dbdata_module, (void*)1); 12113 } 12114 return rc; 12115 } 12116 12117 #ifdef _WIN32 12118 12119 #endif 12120 int sqlite3_dbdata_init( 12121 sqlite3 *db, 12122 char **pzErrMsg, 12123 const sqlite3_api_routines *pApi 12124 ){ 12125 SQLITE_EXTENSION_INIT2(pApi); 12126 return sqlite3DbdataRegister(db); 12127 } 12128 12129 /************************* End ../ext/misc/dbdata.c ********************/ 12130 #endif 12131 12132 #if defined(SQLITE_ENABLE_SESSION) 12133 /* 12134 ** State information for a single open session 12135 */ 12136 typedef struct OpenSession OpenSession; 12137 struct OpenSession { 12138 char *zName; /* Symbolic name for this session */ 12139 int nFilter; /* Number of xFilter rejection GLOB patterns */ 12140 char **azFilter; /* Array of xFilter rejection GLOB patterns */ 12141 sqlite3_session *p; /* The open session */ 12142 }; 12143 #endif 12144 12145 typedef struct ExpertInfo ExpertInfo; 12146 struct ExpertInfo { 12147 sqlite3expert *pExpert; 12148 int bVerbose; 12149 }; 12150 12151 /* A single line in the EQP output */ 12152 typedef struct EQPGraphRow EQPGraphRow; 12153 struct EQPGraphRow { 12154 int iEqpId; /* ID for this row */ 12155 int iParentId; /* ID of the parent row */ 12156 EQPGraphRow *pNext; /* Next row in sequence */ 12157 char zText[1]; /* Text to display for this row */ 12158 }; 12159 12160 /* All EQP output is collected into an instance of the following */ 12161 typedef struct EQPGraph EQPGraph; 12162 struct EQPGraph { 12163 EQPGraphRow *pRow; /* Linked list of all rows of the EQP output */ 12164 EQPGraphRow *pLast; /* Last element of the pRow list */ 12165 char zPrefix[100]; /* Graph prefix */ 12166 }; 12167 12168 /* 12169 ** State information about the database connection is contained in an 12170 ** instance of the following structure. 12171 */ 12172 typedef struct ShellState ShellState; 12173 struct ShellState { 12174 sqlite3 *db; /* The database */ 12175 u8 autoExplain; /* Automatically turn on .explain mode */ 12176 u8 autoEQP; /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */ 12177 u8 autoEQPtest; /* autoEQP is in test mode */ 12178 u8 autoEQPtrace; /* autoEQP is in trace mode */ 12179 u8 scanstatsOn; /* True to display scan stats before each finalize */ 12180 u8 openMode; /* SHELL_OPEN_NORMAL, _APPENDVFS, or _ZIPFILE */ 12181 u8 doXdgOpen; /* Invoke start/open/xdg-open in output_reset() */ 12182 u8 nEqpLevel; /* Depth of the EQP output graph */ 12183 u8 eTraceType; /* SHELL_TRACE_* value for type of trace */ 12184 u8 bSafeMode; /* True to prohibit unsafe operations */ 12185 u8 bSafeModePersist; /* The long-term value of bSafeMode */ 12186 unsigned statsOn; /* True to display memory stats before each finalize */ 12187 unsigned mEqpLines; /* Mask of veritical lines in the EQP output graph */ 12188 int outCount; /* Revert to stdout when reaching zero */ 12189 int cnt; /* Number of records displayed so far */ 12190 int lineno; /* Line number of last line read from in */ 12191 int openFlags; /* Additional flags to open. (SQLITE_OPEN_NOFOLLOW) */ 12192 FILE *in; /* Read commands from this stream */ 12193 FILE *out; /* Write results here */ 12194 FILE *traceOut; /* Output for sqlite3_trace() */ 12195 int nErr; /* Number of errors seen */ 12196 int mode; /* An output mode setting */ 12197 int modePrior; /* Saved mode */ 12198 int cMode; /* temporary output mode for the current query */ 12199 int normalMode; /* Output mode before ".explain on" */ 12200 int writableSchema; /* True if PRAGMA writable_schema=ON */ 12201 int showHeader; /* True to show column names in List or Column mode */ 12202 int nCheck; /* Number of ".check" commands run */ 12203 unsigned nProgress; /* Number of progress callbacks encountered */ 12204 unsigned mxProgress; /* Maximum progress callbacks before failing */ 12205 unsigned flgProgress; /* Flags for the progress callback */ 12206 unsigned shellFlgs; /* Various flags */ 12207 unsigned priorShFlgs; /* Saved copy of flags */ 12208 sqlite3_int64 szMax; /* --maxsize argument to .open */ 12209 char *zDestTable; /* Name of destination table when MODE_Insert */ 12210 char *zTempFile; /* Temporary file that might need deleting */ 12211 char zTestcase[30]; /* Name of current test case */ 12212 char colSeparator[20]; /* Column separator character for several modes */ 12213 char rowSeparator[20]; /* Row separator character for MODE_Ascii */ 12214 char colSepPrior[20]; /* Saved column separator */ 12215 char rowSepPrior[20]; /* Saved row separator */ 12216 int *colWidth; /* Requested width of each column in columnar modes */ 12217 int *actualWidth; /* Actual width of each column */ 12218 int nWidth; /* Number of slots in colWidth[] and actualWidth[] */ 12219 char nullValue[20]; /* The text to print when a NULL comes back from 12220 ** the database */ 12221 char outfile[FILENAME_MAX]; /* Filename for *out */ 12222 sqlite3_stmt *pStmt; /* Current statement if any. */ 12223 FILE *pLog; /* Write log output here */ 12224 struct AuxDb { /* Storage space for auxiliary database connections */ 12225 sqlite3 *db; /* Connection pointer */ 12226 const char *zDbFilename; /* Filename used to open the connection */ 12227 char *zFreeOnClose; /* Free this memory allocation on close */ 12228 #if defined(SQLITE_ENABLE_SESSION) 12229 int nSession; /* Number of active sessions */ 12230 OpenSession aSession[4]; /* Array of sessions. [0] is in focus. */ 12231 #endif 12232 } aAuxDb[5], /* Array of all database connections */ 12233 *pAuxDb; /* Currently active database connection */ 12234 int *aiIndent; /* Array of indents used in MODE_Explain */ 12235 int nIndent; /* Size of array aiIndent[] */ 12236 int iIndent; /* Index of current op in aiIndent[] */ 12237 char *zNonce; /* Nonce for temporary safe-mode excapes */ 12238 EQPGraph sGraph; /* Information for the graphical EXPLAIN QUERY PLAN */ 12239 ExpertInfo expert; /* Valid if previous command was ".expert OPT..." */ 12240 }; 12241 12242 12243 /* Allowed values for ShellState.autoEQP 12244 */ 12245 #define AUTOEQP_off 0 /* Automatic EXPLAIN QUERY PLAN is off */ 12246 #define AUTOEQP_on 1 /* Automatic EQP is on */ 12247 #define AUTOEQP_trigger 2 /* On and also show plans for triggers */ 12248 #define AUTOEQP_full 3 /* Show full EXPLAIN */ 12249 12250 /* Allowed values for ShellState.openMode 12251 */ 12252 #define SHELL_OPEN_UNSPEC 0 /* No open-mode specified */ 12253 #define SHELL_OPEN_NORMAL 1 /* Normal database file */ 12254 #define SHELL_OPEN_APPENDVFS 2 /* Use appendvfs */ 12255 #define SHELL_OPEN_ZIPFILE 3 /* Use the zipfile virtual table */ 12256 #define SHELL_OPEN_READONLY 4 /* Open a normal database read-only */ 12257 #define SHELL_OPEN_DESERIALIZE 5 /* Open using sqlite3_deserialize() */ 12258 #define SHELL_OPEN_HEXDB 6 /* Use "dbtotxt" output as data source */ 12259 12260 /* Allowed values for ShellState.eTraceType 12261 */ 12262 #define SHELL_TRACE_PLAIN 0 /* Show input SQL text */ 12263 #define SHELL_TRACE_EXPANDED 1 /* Show expanded SQL text */ 12264 #define SHELL_TRACE_NORMALIZED 2 /* Show normalized SQL text */ 12265 12266 /* Bits in the ShellState.flgProgress variable */ 12267 #define SHELL_PROGRESS_QUIET 0x01 /* Omit announcing every progress callback */ 12268 #define SHELL_PROGRESS_RESET 0x02 /* Reset the count when the progres 12269 ** callback limit is reached, and for each 12270 ** top-level SQL statement */ 12271 #define SHELL_PROGRESS_ONCE 0x04 /* Cancel the --limit after firing once */ 12272 12273 /* 12274 ** These are the allowed shellFlgs values 12275 */ 12276 #define SHFLG_Pagecache 0x00000001 /* The --pagecache option is used */ 12277 #define SHFLG_Lookaside 0x00000002 /* Lookaside memory is used */ 12278 #define SHFLG_Backslash 0x00000004 /* The --backslash option is used */ 12279 #define SHFLG_PreserveRowid 0x00000008 /* .dump preserves rowid values */ 12280 #define SHFLG_Newlines 0x00000010 /* .dump --newline flag */ 12281 #define SHFLG_CountChanges 0x00000020 /* .changes setting */ 12282 #define SHFLG_Echo 0x00000040 /* .echo or --echo setting */ 12283 #define SHFLG_HeaderSet 0x00000080 /* showHeader has been specified */ 12284 #define SHFLG_DumpDataOnly 0x00000100 /* .dump show data only */ 12285 #define SHFLG_DumpNoSys 0x00000200 /* .dump omits system tables */ 12286 12287 /* 12288 ** Macros for testing and setting shellFlgs 12289 */ 12290 #define ShellHasFlag(P,X) (((P)->shellFlgs & (X))!=0) 12291 #define ShellSetFlag(P,X) ((P)->shellFlgs|=(X)) 12292 #define ShellClearFlag(P,X) ((P)->shellFlgs&=(~(X))) 12293 12294 /* 12295 ** These are the allowed modes. 12296 */ 12297 #define MODE_Line 0 /* One column per line. Blank line between records */ 12298 #define MODE_Column 1 /* One record per line in neat columns */ 12299 #define MODE_List 2 /* One record per line with a separator */ 12300 #define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */ 12301 #define MODE_Html 4 /* Generate an XHTML table */ 12302 #define MODE_Insert 5 /* Generate SQL "insert" statements */ 12303 #define MODE_Quote 6 /* Quote values as for SQL */ 12304 #define MODE_Tcl 7 /* Generate ANSI-C or TCL quoted elements */ 12305 #define MODE_Csv 8 /* Quote strings, numbers are plain */ 12306 #define MODE_Explain 9 /* Like MODE_Column, but do not truncate data */ 12307 #define MODE_Ascii 10 /* Use ASCII unit and record separators (0x1F/0x1E) */ 12308 #define MODE_Pretty 11 /* Pretty-print schemas */ 12309 #define MODE_EQP 12 /* Converts EXPLAIN QUERY PLAN output into a graph */ 12310 #define MODE_Json 13 /* Output JSON */ 12311 #define MODE_Markdown 14 /* Markdown formatting */ 12312 #define MODE_Table 15 /* MySQL-style table formatting */ 12313 #define MODE_Box 16 /* Unicode box-drawing characters */ 12314 12315 static const char *modeDescr[] = { 12316 "line", 12317 "column", 12318 "list", 12319 "semi", 12320 "html", 12321 "insert", 12322 "quote", 12323 "tcl", 12324 "csv", 12325 "explain", 12326 "ascii", 12327 "prettyprint", 12328 "eqp", 12329 "json", 12330 "markdown", 12331 "table", 12332 "box" 12333 }; 12334 12335 /* 12336 ** These are the column/row/line separators used by the various 12337 ** import/export modes. 12338 */ 12339 #define SEP_Column "|" 12340 #define SEP_Row "\n" 12341 #define SEP_Tab "\t" 12342 #define SEP_Space " " 12343 #define SEP_Comma "," 12344 #define SEP_CrLf "\r\n" 12345 #define SEP_Unit "\x1F" 12346 #define SEP_Record "\x1E" 12347 12348 /* 12349 ** A callback for the sqlite3_log() interface. 12350 */ 12351 static void shellLog(void *pArg, int iErrCode, const char *zMsg){ 12352 ShellState *p = (ShellState*)pArg; 12353 if( p->pLog==0 ) return; 12354 utf8_printf(p->pLog, "(%d) %s\n", iErrCode, zMsg); 12355 fflush(p->pLog); 12356 } 12357 12358 /* 12359 ** SQL function: shell_putsnl(X) 12360 ** 12361 ** Write the text X to the screen (or whatever output is being directed) 12362 ** adding a newline at the end, and then return X. 12363 */ 12364 static void shellPutsFunc( 12365 sqlite3_context *pCtx, 12366 int nVal, 12367 sqlite3_value **apVal 12368 ){ 12369 ShellState *p = (ShellState*)sqlite3_user_data(pCtx); 12370 (void)nVal; 12371 utf8_printf(p->out, "%s\n", sqlite3_value_text(apVal[0])); 12372 sqlite3_result_value(pCtx, apVal[0]); 12373 } 12374 12375 /* 12376 ** If in safe mode, print an error message described by the arguments 12377 ** and exit immediately. 12378 */ 12379 static void failIfSafeMode( 12380 ShellState *p, 12381 const char *zErrMsg, 12382 ... 12383 ){ 12384 if( p->bSafeMode ){ 12385 va_list ap; 12386 char *zMsg; 12387 va_start(ap, zErrMsg); 12388 zMsg = sqlite3_vmprintf(zErrMsg, ap); 12389 va_end(ap); 12390 raw_printf(stderr, "line %d: ", p->lineno); 12391 utf8_printf(stderr, "%s\n", zMsg); 12392 exit(1); 12393 } 12394 } 12395 12396 /* 12397 ** SQL function: edit(VALUE) 12398 ** edit(VALUE,EDITOR) 12399 ** 12400 ** These steps: 12401 ** 12402 ** (1) Write VALUE into a temporary file. 12403 ** (2) Run program EDITOR on that temporary file. 12404 ** (3) Read the temporary file back and return its content as the result. 12405 ** (4) Delete the temporary file 12406 ** 12407 ** If the EDITOR argument is omitted, use the value in the VISUAL 12408 ** environment variable. If still there is no EDITOR, through an error. 12409 ** 12410 ** Also throw an error if the EDITOR program returns a non-zero exit code. 12411 */ 12412 #ifndef SQLITE_NOHAVE_SYSTEM 12413 static void editFunc( 12414 sqlite3_context *context, 12415 int argc, 12416 sqlite3_value **argv 12417 ){ 12418 const char *zEditor; 12419 char *zTempFile = 0; 12420 sqlite3 *db; 12421 char *zCmd = 0; 12422 int bBin; 12423 int rc; 12424 int hasCRNL = 0; 12425 FILE *f = 0; 12426 sqlite3_int64 sz; 12427 sqlite3_int64 x; 12428 unsigned char *p = 0; 12429 12430 if( argc==2 ){ 12431 zEditor = (const char*)sqlite3_value_text(argv[1]); 12432 }else{ 12433 zEditor = getenv("VISUAL"); 12434 } 12435 if( zEditor==0 ){ 12436 sqlite3_result_error(context, "no editor for edit()", -1); 12437 return; 12438 } 12439 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){ 12440 sqlite3_result_error(context, "NULL input to edit()", -1); 12441 return; 12442 } 12443 db = sqlite3_context_db_handle(context); 12444 zTempFile = 0; 12445 sqlite3_file_control(db, 0, SQLITE_FCNTL_TEMPFILENAME, &zTempFile); 12446 if( zTempFile==0 ){ 12447 sqlite3_uint64 r = 0; 12448 sqlite3_randomness(sizeof(r), &r); 12449 zTempFile = sqlite3_mprintf("temp%llx", r); 12450 if( zTempFile==0 ){ 12451 sqlite3_result_error_nomem(context); 12452 return; 12453 } 12454 } 12455 bBin = sqlite3_value_type(argv[0])==SQLITE_BLOB; 12456 /* When writing the file to be edited, do \n to \r\n conversions on systems 12457 ** that want \r\n line endings */ 12458 f = fopen(zTempFile, bBin ? "wb" : "w"); 12459 if( f==0 ){ 12460 sqlite3_result_error(context, "edit() cannot open temp file", -1); 12461 goto edit_func_end; 12462 } 12463 sz = sqlite3_value_bytes(argv[0]); 12464 if( bBin ){ 12465 x = fwrite(sqlite3_value_blob(argv[0]), 1, (size_t)sz, f); 12466 }else{ 12467 const char *z = (const char*)sqlite3_value_text(argv[0]); 12468 /* Remember whether or not the value originally contained \r\n */ 12469 if( z && strstr(z,"\r\n")!=0 ) hasCRNL = 1; 12470 x = fwrite(sqlite3_value_text(argv[0]), 1, (size_t)sz, f); 12471 } 12472 fclose(f); 12473 f = 0; 12474 if( x!=sz ){ 12475 sqlite3_result_error(context, "edit() could not write the whole file", -1); 12476 goto edit_func_end; 12477 } 12478 zCmd = sqlite3_mprintf("%s \"%s\"", zEditor, zTempFile); 12479 if( zCmd==0 ){ 12480 sqlite3_result_error_nomem(context); 12481 goto edit_func_end; 12482 } 12483 rc = system(zCmd); 12484 sqlite3_free(zCmd); 12485 if( rc ){ 12486 sqlite3_result_error(context, "EDITOR returned non-zero", -1); 12487 goto edit_func_end; 12488 } 12489 f = fopen(zTempFile, "rb"); 12490 if( f==0 ){ 12491 sqlite3_result_error(context, 12492 "edit() cannot reopen temp file after edit", -1); 12493 goto edit_func_end; 12494 } 12495 fseek(f, 0, SEEK_END); 12496 sz = ftell(f); 12497 rewind(f); 12498 p = sqlite3_malloc64( sz+1 ); 12499 if( p==0 ){ 12500 sqlite3_result_error_nomem(context); 12501 goto edit_func_end; 12502 } 12503 x = fread(p, 1, (size_t)sz, f); 12504 fclose(f); 12505 f = 0; 12506 if( x!=sz ){ 12507 sqlite3_result_error(context, "could not read back the whole file", -1); 12508 goto edit_func_end; 12509 } 12510 if( bBin ){ 12511 sqlite3_result_blob64(context, p, sz, sqlite3_free); 12512 }else{ 12513 sqlite3_int64 i, j; 12514 if( hasCRNL ){ 12515 /* If the original contains \r\n then do no conversions back to \n */ 12516 }else{ 12517 /* If the file did not originally contain \r\n then convert any new 12518 ** \r\n back into \n */ 12519 for(i=j=0; i<sz; i++){ 12520 if( p[i]=='\r' && p[i+1]=='\n' ) i++; 12521 p[j++] = p[i]; 12522 } 12523 sz = j; 12524 p[sz] = 0; 12525 } 12526 sqlite3_result_text64(context, (const char*)p, sz, 12527 sqlite3_free, SQLITE_UTF8); 12528 } 12529 p = 0; 12530 12531 edit_func_end: 12532 if( f ) fclose(f); 12533 unlink(zTempFile); 12534 sqlite3_free(zTempFile); 12535 sqlite3_free(p); 12536 } 12537 #endif /* SQLITE_NOHAVE_SYSTEM */ 12538 12539 /* 12540 ** Save or restore the current output mode 12541 */ 12542 static void outputModePush(ShellState *p){ 12543 p->modePrior = p->mode; 12544 p->priorShFlgs = p->shellFlgs; 12545 memcpy(p->colSepPrior, p->colSeparator, sizeof(p->colSeparator)); 12546 memcpy(p->rowSepPrior, p->rowSeparator, sizeof(p->rowSeparator)); 12547 } 12548 static void outputModePop(ShellState *p){ 12549 p->mode = p->modePrior; 12550 p->shellFlgs = p->priorShFlgs; 12551 memcpy(p->colSeparator, p->colSepPrior, sizeof(p->colSeparator)); 12552 memcpy(p->rowSeparator, p->rowSepPrior, sizeof(p->rowSeparator)); 12553 } 12554 12555 /* 12556 ** Output the given string as a hex-encoded blob (eg. X'1234' ) 12557 */ 12558 static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){ 12559 int i; 12560 char *zBlob = (char *)pBlob; 12561 raw_printf(out,"X'"); 12562 for(i=0; i<nBlob; i++){ raw_printf(out,"%02x",zBlob[i]&0xff); } 12563 raw_printf(out,"'"); 12564 } 12565 12566 /* 12567 ** Find a string that is not found anywhere in z[]. Return a pointer 12568 ** to that string. 12569 ** 12570 ** Try to use zA and zB first. If both of those are already found in z[] 12571 ** then make up some string and store it in the buffer zBuf. 12572 */ 12573 static const char *unused_string( 12574 const char *z, /* Result must not appear anywhere in z */ 12575 const char *zA, const char *zB, /* Try these first */ 12576 char *zBuf /* Space to store a generated string */ 12577 ){ 12578 unsigned i = 0; 12579 if( strstr(z, zA)==0 ) return zA; 12580 if( strstr(z, zB)==0 ) return zB; 12581 do{ 12582 sqlite3_snprintf(20,zBuf,"(%s%u)", zA, i++); 12583 }while( strstr(z,zBuf)!=0 ); 12584 return zBuf; 12585 } 12586 12587 /* 12588 ** Output the given string as a quoted string using SQL quoting conventions. 12589 ** 12590 ** See also: output_quoted_escaped_string() 12591 */ 12592 static void output_quoted_string(FILE *out, const char *z){ 12593 int i; 12594 char c; 12595 setBinaryMode(out, 1); 12596 for(i=0; (c = z[i])!=0 && c!='\''; i++){} 12597 if( c==0 ){ 12598 utf8_printf(out,"'%s'",z); 12599 }else{ 12600 raw_printf(out, "'"); 12601 while( *z ){ 12602 for(i=0; (c = z[i])!=0 && c!='\''; i++){} 12603 if( c=='\'' ) i++; 12604 if( i ){ 12605 utf8_printf(out, "%.*s", i, z); 12606 z += i; 12607 } 12608 if( c=='\'' ){ 12609 raw_printf(out, "'"); 12610 continue; 12611 } 12612 if( c==0 ){ 12613 break; 12614 } 12615 z++; 12616 } 12617 raw_printf(out, "'"); 12618 } 12619 setTextMode(out, 1); 12620 } 12621 12622 /* 12623 ** Output the given string as a quoted string using SQL quoting conventions. 12624 ** Additionallly , escape the "\n" and "\r" characters so that they do not 12625 ** get corrupted by end-of-line translation facilities in some operating 12626 ** systems. 12627 ** 12628 ** This is like output_quoted_string() but with the addition of the \r\n 12629 ** escape mechanism. 12630 */ 12631 static void output_quoted_escaped_string(FILE *out, const char *z){ 12632 int i; 12633 char c; 12634 setBinaryMode(out, 1); 12635 for(i=0; (c = z[i])!=0 && c!='\'' && c!='\n' && c!='\r'; i++){} 12636 if( c==0 ){ 12637 utf8_printf(out,"'%s'",z); 12638 }else{ 12639 const char *zNL = 0; 12640 const char *zCR = 0; 12641 int nNL = 0; 12642 int nCR = 0; 12643 char zBuf1[20], zBuf2[20]; 12644 for(i=0; z[i]; i++){ 12645 if( z[i]=='\n' ) nNL++; 12646 if( z[i]=='\r' ) nCR++; 12647 } 12648 if( nNL ){ 12649 raw_printf(out, "replace("); 12650 zNL = unused_string(z, "\\n", "\\012", zBuf1); 12651 } 12652 if( nCR ){ 12653 raw_printf(out, "replace("); 12654 zCR = unused_string(z, "\\r", "\\015", zBuf2); 12655 } 12656 raw_printf(out, "'"); 12657 while( *z ){ 12658 for(i=0; (c = z[i])!=0 && c!='\n' && c!='\r' && c!='\''; i++){} 12659 if( c=='\'' ) i++; 12660 if( i ){ 12661 utf8_printf(out, "%.*s", i, z); 12662 z += i; 12663 } 12664 if( c=='\'' ){ 12665 raw_printf(out, "'"); 12666 continue; 12667 } 12668 if( c==0 ){ 12669 break; 12670 } 12671 z++; 12672 if( c=='\n' ){ 12673 raw_printf(out, "%s", zNL); 12674 continue; 12675 } 12676 raw_printf(out, "%s", zCR); 12677 } 12678 raw_printf(out, "'"); 12679 if( nCR ){ 12680 raw_printf(out, ",'%s',char(13))", zCR); 12681 } 12682 if( nNL ){ 12683 raw_printf(out, ",'%s',char(10))", zNL); 12684 } 12685 } 12686 setTextMode(out, 1); 12687 } 12688 12689 /* 12690 ** Output the given string as a quoted according to C or TCL quoting rules. 12691 */ 12692 static void output_c_string(FILE *out, const char *z){ 12693 unsigned int c; 12694 fputc('"', out); 12695 while( (c = *(z++))!=0 ){ 12696 if( c=='\\' ){ 12697 fputc(c, out); 12698 fputc(c, out); 12699 }else if( c=='"' ){ 12700 fputc('\\', out); 12701 fputc('"', out); 12702 }else if( c=='\t' ){ 12703 fputc('\\', out); 12704 fputc('t', out); 12705 }else if( c=='\n' ){ 12706 fputc('\\', out); 12707 fputc('n', out); 12708 }else if( c=='\r' ){ 12709 fputc('\\', out); 12710 fputc('r', out); 12711 }else if( !isprint(c&0xff) ){ 12712 raw_printf(out, "\\%03o", c&0xff); 12713 }else{ 12714 fputc(c, out); 12715 } 12716 } 12717 fputc('"', out); 12718 } 12719 12720 /* 12721 ** Output the given string as a quoted according to JSON quoting rules. 12722 */ 12723 static void output_json_string(FILE *out, const char *z, int n){ 12724 unsigned int c; 12725 if( n<0 ) n = (int)strlen(z); 12726 fputc('"', out); 12727 while( n-- ){ 12728 c = *(z++); 12729 if( c=='\\' || c=='"' ){ 12730 fputc('\\', out); 12731 fputc(c, out); 12732 }else if( c<=0x1f ){ 12733 fputc('\\', out); 12734 if( c=='\b' ){ 12735 fputc('b', out); 12736 }else if( c=='\f' ){ 12737 fputc('f', out); 12738 }else if( c=='\n' ){ 12739 fputc('n', out); 12740 }else if( c=='\r' ){ 12741 fputc('r', out); 12742 }else if( c=='\t' ){ 12743 fputc('t', out); 12744 }else{ 12745 raw_printf(out, "u%04x",c); 12746 } 12747 }else{ 12748 fputc(c, out); 12749 } 12750 } 12751 fputc('"', out); 12752 } 12753 12754 /* 12755 ** Output the given string with characters that are special to 12756 ** HTML escaped. 12757 */ 12758 static void output_html_string(FILE *out, const char *z){ 12759 int i; 12760 if( z==0 ) z = ""; 12761 while( *z ){ 12762 for(i=0; z[i] 12763 && z[i]!='<' 12764 && z[i]!='&' 12765 && z[i]!='>' 12766 && z[i]!='\"' 12767 && z[i]!='\''; 12768 i++){} 12769 if( i>0 ){ 12770 utf8_printf(out,"%.*s",i,z); 12771 } 12772 if( z[i]=='<' ){ 12773 raw_printf(out,"<"); 12774 }else if( z[i]=='&' ){ 12775 raw_printf(out,"&"); 12776 }else if( z[i]=='>' ){ 12777 raw_printf(out,">"); 12778 }else if( z[i]=='\"' ){ 12779 raw_printf(out,"""); 12780 }else if( z[i]=='\'' ){ 12781 raw_printf(out,"'"); 12782 }else{ 12783 break; 12784 } 12785 z += i + 1; 12786 } 12787 } 12788 12789 /* 12790 ** If a field contains any character identified by a 1 in the following 12791 ** array, then the string must be quoted for CSV. 12792 */ 12793 static const char needCsvQuote[] = { 12794 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12795 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12796 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 12797 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12798 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12799 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12800 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12801 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 12802 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12803 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12804 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12805 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12806 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12807 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12808 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12809 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12810 }; 12811 12812 /* 12813 ** Output a single term of CSV. Actually, p->colSeparator is used for 12814 ** the separator, which may or may not be a comma. p->nullValue is 12815 ** the null value. Strings are quoted if necessary. The separator 12816 ** is only issued if bSep is true. 12817 */ 12818 static void output_csv(ShellState *p, const char *z, int bSep){ 12819 FILE *out = p->out; 12820 if( z==0 ){ 12821 utf8_printf(out,"%s",p->nullValue); 12822 }else{ 12823 unsigned i; 12824 for(i=0; z[i]; i++){ 12825 if( needCsvQuote[((unsigned char*)z)[i]] ){ 12826 i = 0; 12827 break; 12828 } 12829 } 12830 if( i==0 || strstr(z, p->colSeparator)!=0 ){ 12831 char *zQuoted = sqlite3_mprintf("\"%w\"", z); 12832 utf8_printf(out, "%s", zQuoted); 12833 sqlite3_free(zQuoted); 12834 }else{ 12835 utf8_printf(out, "%s", z); 12836 } 12837 } 12838 if( bSep ){ 12839 utf8_printf(p->out, "%s", p->colSeparator); 12840 } 12841 } 12842 12843 /* 12844 ** This routine runs when the user presses Ctrl-C 12845 */ 12846 static void interrupt_handler(int NotUsed){ 12847 UNUSED_PARAMETER(NotUsed); 12848 seenInterrupt++; 12849 if( seenInterrupt>2 ) exit(1); 12850 if( globalDb ) sqlite3_interrupt(globalDb); 12851 } 12852 12853 #if (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE) 12854 /* 12855 ** This routine runs for console events (e.g. Ctrl-C) on Win32 12856 */ 12857 static BOOL WINAPI ConsoleCtrlHandler( 12858 DWORD dwCtrlType /* One of the CTRL_*_EVENT constants */ 12859 ){ 12860 if( dwCtrlType==CTRL_C_EVENT ){ 12861 interrupt_handler(0); 12862 return TRUE; 12863 } 12864 return FALSE; 12865 } 12866 #endif 12867 12868 #ifndef SQLITE_OMIT_AUTHORIZATION 12869 /* 12870 ** This authorizer runs in safe mode. 12871 */ 12872 static int safeModeAuth( 12873 void *pClientData, 12874 int op, 12875 const char *zA1, 12876 const char *zA2, 12877 const char *zA3, 12878 const char *zA4 12879 ){ 12880 ShellState *p = (ShellState*)pClientData; 12881 static const char *azProhibitedFunctions[] = { 12882 "edit", 12883 "fts3_tokenizer", 12884 "load_extension", 12885 "readfile", 12886 "writefile", 12887 "zipfile", 12888 "zipfile_cds", 12889 }; 12890 UNUSED_PARAMETER(zA2); 12891 UNUSED_PARAMETER(zA3); 12892 UNUSED_PARAMETER(zA4); 12893 switch( op ){ 12894 case SQLITE_ATTACH: { 12895 failIfSafeMode(p, "cannot run ATTACH in safe mode"); 12896 break; 12897 } 12898 case SQLITE_FUNCTION: { 12899 int i; 12900 for(i=0; i<ArraySize(azProhibitedFunctions); i++){ 12901 if( sqlite3_stricmp(zA1, azProhibitedFunctions[i])==0 ){ 12902 failIfSafeMode(p, "cannot use the %s() function in safe mode", 12903 azProhibitedFunctions[i]); 12904 } 12905 } 12906 break; 12907 } 12908 } 12909 return SQLITE_OK; 12910 } 12911 12912 /* 12913 ** When the ".auth ON" is set, the following authorizer callback is 12914 ** invoked. It always returns SQLITE_OK. 12915 */ 12916 static int shellAuth( 12917 void *pClientData, 12918 int op, 12919 const char *zA1, 12920 const char *zA2, 12921 const char *zA3, 12922 const char *zA4 12923 ){ 12924 ShellState *p = (ShellState*)pClientData; 12925 static const char *azAction[] = { 0, 12926 "CREATE_INDEX", "CREATE_TABLE", "CREATE_TEMP_INDEX", 12927 "CREATE_TEMP_TABLE", "CREATE_TEMP_TRIGGER", "CREATE_TEMP_VIEW", 12928 "CREATE_TRIGGER", "CREATE_VIEW", "DELETE", 12929 "DROP_INDEX", "DROP_TABLE", "DROP_TEMP_INDEX", 12930 "DROP_TEMP_TABLE", "DROP_TEMP_TRIGGER", "DROP_TEMP_VIEW", 12931 "DROP_TRIGGER", "DROP_VIEW", "INSERT", 12932 "PRAGMA", "READ", "SELECT", 12933 "TRANSACTION", "UPDATE", "ATTACH", 12934 "DETACH", "ALTER_TABLE", "REINDEX", 12935 "ANALYZE", "CREATE_VTABLE", "DROP_VTABLE", 12936 "FUNCTION", "SAVEPOINT", "RECURSIVE" 12937 }; 12938 int i; 12939 const char *az[4]; 12940 az[0] = zA1; 12941 az[1] = zA2; 12942 az[2] = zA3; 12943 az[3] = zA4; 12944 utf8_printf(p->out, "authorizer: %s", azAction[op]); 12945 for(i=0; i<4; i++){ 12946 raw_printf(p->out, " "); 12947 if( az[i] ){ 12948 output_c_string(p->out, az[i]); 12949 }else{ 12950 raw_printf(p->out, "NULL"); 12951 } 12952 } 12953 raw_printf(p->out, "\n"); 12954 if( p->bSafeMode ) (void)safeModeAuth(pClientData, op, zA1, zA2, zA3, zA4); 12955 return SQLITE_OK; 12956 } 12957 #endif 12958 12959 /* 12960 ** Print a schema statement. Part of MODE_Semi and MODE_Pretty output. 12961 ** 12962 ** This routine converts some CREATE TABLE statements for shadow tables 12963 ** in FTS3/4/5 into CREATE TABLE IF NOT EXISTS statements. 12964 */ 12965 static void printSchemaLine(FILE *out, const char *z, const char *zTail){ 12966 if( z==0 ) return; 12967 if( zTail==0 ) return; 12968 if( sqlite3_strglob("CREATE TABLE ['\"]*", z)==0 ){ 12969 utf8_printf(out, "CREATE TABLE IF NOT EXISTS %s%s", z+13, zTail); 12970 }else{ 12971 utf8_printf(out, "%s%s", z, zTail); 12972 } 12973 } 12974 static void printSchemaLineN(FILE *out, char *z, int n, const char *zTail){ 12975 char c = z[n]; 12976 z[n] = 0; 12977 printSchemaLine(out, z, zTail); 12978 z[n] = c; 12979 } 12980 12981 /* 12982 ** Return true if string z[] has nothing but whitespace and comments to the 12983 ** end of the first line. 12984 */ 12985 static int wsToEol(const char *z){ 12986 int i; 12987 for(i=0; z[i]; i++){ 12988 if( z[i]=='\n' ) return 1; 12989 if( IsSpace(z[i]) ) continue; 12990 if( z[i]=='-' && z[i+1]=='-' ) return 1; 12991 return 0; 12992 } 12993 return 1; 12994 } 12995 12996 /* 12997 ** Add a new entry to the EXPLAIN QUERY PLAN data 12998 */ 12999 static void eqp_append(ShellState *p, int iEqpId, int p2, const char *zText){ 13000 EQPGraphRow *pNew; 13001 int nText = strlen30(zText); 13002 if( p->autoEQPtest ){ 13003 utf8_printf(p->out, "%d,%d,%s\n", iEqpId, p2, zText); 13004 } 13005 pNew = sqlite3_malloc64( sizeof(*pNew) + nText ); 13006 if( pNew==0 ) shell_out_of_memory(); 13007 pNew->iEqpId = iEqpId; 13008 pNew->iParentId = p2; 13009 memcpy(pNew->zText, zText, nText+1); 13010 pNew->pNext = 0; 13011 if( p->sGraph.pLast ){ 13012 p->sGraph.pLast->pNext = pNew; 13013 }else{ 13014 p->sGraph.pRow = pNew; 13015 } 13016 p->sGraph.pLast = pNew; 13017 } 13018 13019 /* 13020 ** Free and reset the EXPLAIN QUERY PLAN data that has been collected 13021 ** in p->sGraph. 13022 */ 13023 static void eqp_reset(ShellState *p){ 13024 EQPGraphRow *pRow, *pNext; 13025 for(pRow = p->sGraph.pRow; pRow; pRow = pNext){ 13026 pNext = pRow->pNext; 13027 sqlite3_free(pRow); 13028 } 13029 memset(&p->sGraph, 0, sizeof(p->sGraph)); 13030 } 13031 13032 /* Return the next EXPLAIN QUERY PLAN line with iEqpId that occurs after 13033 ** pOld, or return the first such line if pOld is NULL 13034 */ 13035 static EQPGraphRow *eqp_next_row(ShellState *p, int iEqpId, EQPGraphRow *pOld){ 13036 EQPGraphRow *pRow = pOld ? pOld->pNext : p->sGraph.pRow; 13037 while( pRow && pRow->iParentId!=iEqpId ) pRow = pRow->pNext; 13038 return pRow; 13039 } 13040 13041 /* Render a single level of the graph that has iEqpId as its parent. Called 13042 ** recursively to render sublevels. 13043 */ 13044 static void eqp_render_level(ShellState *p, int iEqpId){ 13045 EQPGraphRow *pRow, *pNext; 13046 int n = strlen30(p->sGraph.zPrefix); 13047 char *z; 13048 for(pRow = eqp_next_row(p, iEqpId, 0); pRow; pRow = pNext){ 13049 pNext = eqp_next_row(p, iEqpId, pRow); 13050 z = pRow->zText; 13051 utf8_printf(p->out, "%s%s%s\n", p->sGraph.zPrefix, 13052 pNext ? "|--" : "`--", z); 13053 if( n<(int)sizeof(p->sGraph.zPrefix)-7 ){ 13054 memcpy(&p->sGraph.zPrefix[n], pNext ? "| " : " ", 4); 13055 eqp_render_level(p, pRow->iEqpId); 13056 p->sGraph.zPrefix[n] = 0; 13057 } 13058 } 13059 } 13060 13061 /* 13062 ** Display and reset the EXPLAIN QUERY PLAN data 13063 */ 13064 static void eqp_render(ShellState *p){ 13065 EQPGraphRow *pRow = p->sGraph.pRow; 13066 if( pRow ){ 13067 if( pRow->zText[0]=='-' ){ 13068 if( pRow->pNext==0 ){ 13069 eqp_reset(p); 13070 return; 13071 } 13072 utf8_printf(p->out, "%s\n", pRow->zText+3); 13073 p->sGraph.pRow = pRow->pNext; 13074 sqlite3_free(pRow); 13075 }else{ 13076 utf8_printf(p->out, "QUERY PLAN\n"); 13077 } 13078 p->sGraph.zPrefix[0] = 0; 13079 eqp_render_level(p, 0); 13080 eqp_reset(p); 13081 } 13082 } 13083 13084 #ifndef SQLITE_OMIT_PROGRESS_CALLBACK 13085 /* 13086 ** Progress handler callback. 13087 */ 13088 static int progress_handler(void *pClientData) { 13089 ShellState *p = (ShellState*)pClientData; 13090 p->nProgress++; 13091 if( p->nProgress>=p->mxProgress && p->mxProgress>0 ){ 13092 raw_printf(p->out, "Progress limit reached (%u)\n", p->nProgress); 13093 if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0; 13094 if( p->flgProgress & SHELL_PROGRESS_ONCE ) p->mxProgress = 0; 13095 return 1; 13096 } 13097 if( (p->flgProgress & SHELL_PROGRESS_QUIET)==0 ){ 13098 raw_printf(p->out, "Progress %u\n", p->nProgress); 13099 } 13100 return 0; 13101 } 13102 #endif /* SQLITE_OMIT_PROGRESS_CALLBACK */ 13103 13104 /* 13105 ** Print N dashes 13106 */ 13107 static void print_dashes(FILE *out, int N){ 13108 const char zDash[] = "--------------------------------------------------"; 13109 const int nDash = sizeof(zDash) - 1; 13110 while( N>nDash ){ 13111 fputs(zDash, out); 13112 N -= nDash; 13113 } 13114 raw_printf(out, "%.*s", N, zDash); 13115 } 13116 13117 /* 13118 ** Print a markdown or table-style row separator using ascii-art 13119 */ 13120 static void print_row_separator( 13121 ShellState *p, 13122 int nArg, 13123 const char *zSep 13124 ){ 13125 int i; 13126 if( nArg>0 ){ 13127 fputs(zSep, p->out); 13128 print_dashes(p->out, p->actualWidth[0]+2); 13129 for(i=1; i<nArg; i++){ 13130 fputs(zSep, p->out); 13131 print_dashes(p->out, p->actualWidth[i]+2); 13132 } 13133 fputs(zSep, p->out); 13134 } 13135 fputs("\n", p->out); 13136 } 13137 13138 /* 13139 ** This is the callback routine that the shell 13140 ** invokes for each row of a query result. 13141 */ 13142 static int shell_callback( 13143 void *pArg, 13144 int nArg, /* Number of result columns */ 13145 char **azArg, /* Text of each result column */ 13146 char **azCol, /* Column names */ 13147 int *aiType /* Column types. Might be NULL */ 13148 ){ 13149 int i; 13150 ShellState *p = (ShellState*)pArg; 13151 13152 if( azArg==0 ) return 0; 13153 switch( p->cMode ){ 13154 case MODE_Line: { 13155 int w = 5; 13156 if( azArg==0 ) break; 13157 for(i=0; i<nArg; i++){ 13158 int len = strlen30(azCol[i] ? azCol[i] : ""); 13159 if( len>w ) w = len; 13160 } 13161 if( p->cnt++>0 ) utf8_printf(p->out, "%s", p->rowSeparator); 13162 for(i=0; i<nArg; i++){ 13163 utf8_printf(p->out,"%*s = %s%s", w, azCol[i], 13164 azArg[i] ? azArg[i] : p->nullValue, p->rowSeparator); 13165 } 13166 break; 13167 } 13168 case MODE_Explain: { 13169 static const int aExplainWidth[] = {4, 13, 4, 4, 4, 13, 2, 13}; 13170 if( nArg>ArraySize(aExplainWidth) ){ 13171 nArg = ArraySize(aExplainWidth); 13172 } 13173 if( p->cnt++==0 ){ 13174 for(i=0; i<nArg; i++){ 13175 int w = aExplainWidth[i]; 13176 utf8_width_print(p->out, w, azCol[i]); 13177 fputs(i==nArg-1 ? "\n" : " ", p->out); 13178 } 13179 for(i=0; i<nArg; i++){ 13180 int w = aExplainWidth[i]; 13181 print_dashes(p->out, w); 13182 fputs(i==nArg-1 ? "\n" : " ", p->out); 13183 } 13184 } 13185 if( azArg==0 ) break; 13186 for(i=0; i<nArg; i++){ 13187 int w = aExplainWidth[i]; 13188 if( i==nArg-1 ) w = 0; 13189 if( azArg[i] && strlenChar(azArg[i])>w ){ 13190 w = strlenChar(azArg[i]); 13191 } 13192 if( i==1 && p->aiIndent && p->pStmt ){ 13193 if( p->iIndent<p->nIndent ){ 13194 utf8_printf(p->out, "%*.s", p->aiIndent[p->iIndent], ""); 13195 } 13196 p->iIndent++; 13197 } 13198 utf8_width_print(p->out, w, azArg[i] ? azArg[i] : p->nullValue); 13199 fputs(i==nArg-1 ? "\n" : " ", p->out); 13200 } 13201 break; 13202 } 13203 case MODE_Semi: { /* .schema and .fullschema output */ 13204 printSchemaLine(p->out, azArg[0], ";\n"); 13205 break; 13206 } 13207 case MODE_Pretty: { /* .schema and .fullschema with --indent */ 13208 char *z; 13209 int j; 13210 int nParen = 0; 13211 char cEnd = 0; 13212 char c; 13213 int nLine = 0; 13214 assert( nArg==1 ); 13215 if( azArg[0]==0 ) break; 13216 if( sqlite3_strlike("CREATE VIEW%", azArg[0], 0)==0 13217 || sqlite3_strlike("CREATE TRIG%", azArg[0], 0)==0 13218 ){ 13219 utf8_printf(p->out, "%s;\n", azArg[0]); 13220 break; 13221 } 13222 z = sqlite3_mprintf("%s", azArg[0]); 13223 j = 0; 13224 for(i=0; IsSpace(z[i]); i++){} 13225 for(; (c = z[i])!=0; i++){ 13226 if( IsSpace(c) ){ 13227 if( z[j-1]=='\r' ) z[j-1] = '\n'; 13228 if( IsSpace(z[j-1]) || z[j-1]=='(' ) continue; 13229 }else if( (c=='(' || c==')') && j>0 && IsSpace(z[j-1]) ){ 13230 j--; 13231 } 13232 z[j++] = c; 13233 } 13234 while( j>0 && IsSpace(z[j-1]) ){ j--; } 13235 z[j] = 0; 13236 if( strlen30(z)>=79 ){ 13237 for(i=j=0; (c = z[i])!=0; i++){ /* Copy from z[i] back to z[j] */ 13238 if( c==cEnd ){ 13239 cEnd = 0; 13240 }else if( c=='"' || c=='\'' || c=='`' ){ 13241 cEnd = c; 13242 }else if( c=='[' ){ 13243 cEnd = ']'; 13244 }else if( c=='-' && z[i+1]=='-' ){ 13245 cEnd = '\n'; 13246 }else if( c=='(' ){ 13247 nParen++; 13248 }else if( c==')' ){ 13249 nParen--; 13250 if( nLine>0 && nParen==0 && j>0 ){ 13251 printSchemaLineN(p->out, z, j, "\n"); 13252 j = 0; 13253 } 13254 } 13255 z[j++] = c; 13256 if( nParen==1 && cEnd==0 13257 && (c=='(' || c=='\n' || (c==',' && !wsToEol(z+i+1))) 13258 ){ 13259 if( c=='\n' ) j--; 13260 printSchemaLineN(p->out, z, j, "\n "); 13261 j = 0; 13262 nLine++; 13263 while( IsSpace(z[i+1]) ){ i++; } 13264 } 13265 } 13266 z[j] = 0; 13267 } 13268 printSchemaLine(p->out, z, ";\n"); 13269 sqlite3_free(z); 13270 break; 13271 } 13272 case MODE_List: { 13273 if( p->cnt++==0 && p->showHeader ){ 13274 for(i=0; i<nArg; i++){ 13275 utf8_printf(p->out,"%s%s",azCol[i], 13276 i==nArg-1 ? p->rowSeparator : p->colSeparator); 13277 } 13278 } 13279 if( azArg==0 ) break; 13280 for(i=0; i<nArg; i++){ 13281 char *z = azArg[i]; 13282 if( z==0 ) z = p->nullValue; 13283 utf8_printf(p->out, "%s", z); 13284 if( i<nArg-1 ){ 13285 utf8_printf(p->out, "%s", p->colSeparator); 13286 }else{ 13287 utf8_printf(p->out, "%s", p->rowSeparator); 13288 } 13289 } 13290 break; 13291 } 13292 case MODE_Html: { 13293 if( p->cnt++==0 && p->showHeader ){ 13294 raw_printf(p->out,"<TR>"); 13295 for(i=0; i<nArg; i++){ 13296 raw_printf(p->out,"<TH>"); 13297 output_html_string(p->out, azCol[i]); 13298 raw_printf(p->out,"</TH>\n"); 13299 } 13300 raw_printf(p->out,"</TR>\n"); 13301 } 13302 if( azArg==0 ) break; 13303 raw_printf(p->out,"<TR>"); 13304 for(i=0; i<nArg; i++){ 13305 raw_printf(p->out,"<TD>"); 13306 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullValue); 13307 raw_printf(p->out,"</TD>\n"); 13308 } 13309 raw_printf(p->out,"</TR>\n"); 13310 break; 13311 } 13312 case MODE_Tcl: { 13313 if( p->cnt++==0 && p->showHeader ){ 13314 for(i=0; i<nArg; i++){ 13315 output_c_string(p->out,azCol[i] ? azCol[i] : ""); 13316 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator); 13317 } 13318 utf8_printf(p->out, "%s", p->rowSeparator); 13319 } 13320 if( azArg==0 ) break; 13321 for(i=0; i<nArg; i++){ 13322 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullValue); 13323 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator); 13324 } 13325 utf8_printf(p->out, "%s", p->rowSeparator); 13326 break; 13327 } 13328 case MODE_Csv: { 13329 setBinaryMode(p->out, 1); 13330 if( p->cnt++==0 && p->showHeader ){ 13331 for(i=0; i<nArg; i++){ 13332 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1); 13333 } 13334 utf8_printf(p->out, "%s", p->rowSeparator); 13335 } 13336 if( nArg>0 ){ 13337 for(i=0; i<nArg; i++){ 13338 output_csv(p, azArg[i], i<nArg-1); 13339 } 13340 utf8_printf(p->out, "%s", p->rowSeparator); 13341 } 13342 setTextMode(p->out, 1); 13343 break; 13344 } 13345 case MODE_Insert: { 13346 if( azArg==0 ) break; 13347 utf8_printf(p->out,"INSERT INTO %s",p->zDestTable); 13348 if( p->showHeader ){ 13349 raw_printf(p->out,"("); 13350 for(i=0; i<nArg; i++){ 13351 if( i>0 ) raw_printf(p->out, ","); 13352 if( quoteChar(azCol[i]) ){ 13353 char *z = sqlite3_mprintf("\"%w\"", azCol[i]); 13354 utf8_printf(p->out, "%s", z); 13355 sqlite3_free(z); 13356 }else{ 13357 raw_printf(p->out, "%s", azCol[i]); 13358 } 13359 } 13360 raw_printf(p->out,")"); 13361 } 13362 p->cnt++; 13363 for(i=0; i<nArg; i++){ 13364 raw_printf(p->out, i>0 ? "," : " VALUES("); 13365 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){ 13366 utf8_printf(p->out,"NULL"); 13367 }else if( aiType && aiType[i]==SQLITE_TEXT ){ 13368 if( ShellHasFlag(p, SHFLG_Newlines) ){ 13369 output_quoted_string(p->out, azArg[i]); 13370 }else{ 13371 output_quoted_escaped_string(p->out, azArg[i]); 13372 } 13373 }else if( aiType && aiType[i]==SQLITE_INTEGER ){ 13374 utf8_printf(p->out,"%s", azArg[i]); 13375 }else if( aiType && aiType[i]==SQLITE_FLOAT ){ 13376 char z[50]; 13377 double r = sqlite3_column_double(p->pStmt, i); 13378 sqlite3_uint64 ur; 13379 memcpy(&ur,&r,sizeof(r)); 13380 if( ur==0x7ff0000000000000LL ){ 13381 raw_printf(p->out, "1e999"); 13382 }else if( ur==0xfff0000000000000LL ){ 13383 raw_printf(p->out, "-1e999"); 13384 }else{ 13385 sqlite3_snprintf(50,z,"%!.20g", r); 13386 raw_printf(p->out, "%s", z); 13387 } 13388 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){ 13389 const void *pBlob = sqlite3_column_blob(p->pStmt, i); 13390 int nBlob = sqlite3_column_bytes(p->pStmt, i); 13391 output_hex_blob(p->out, pBlob, nBlob); 13392 }else if( isNumber(azArg[i], 0) ){ 13393 utf8_printf(p->out,"%s", azArg[i]); 13394 }else if( ShellHasFlag(p, SHFLG_Newlines) ){ 13395 output_quoted_string(p->out, azArg[i]); 13396 }else{ 13397 output_quoted_escaped_string(p->out, azArg[i]); 13398 } 13399 } 13400 raw_printf(p->out,");\n"); 13401 break; 13402 } 13403 case MODE_Json: { 13404 if( azArg==0 ) break; 13405 if( p->cnt==0 ){ 13406 fputs("[{", p->out); 13407 }else{ 13408 fputs(",\n{", p->out); 13409 } 13410 p->cnt++; 13411 for(i=0; i<nArg; i++){ 13412 output_json_string(p->out, azCol[i], -1); 13413 putc(':', p->out); 13414 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){ 13415 fputs("null",p->out); 13416 }else if( aiType && aiType[i]==SQLITE_FLOAT ){ 13417 char z[50]; 13418 double r = sqlite3_column_double(p->pStmt, i); 13419 sqlite3_uint64 ur; 13420 memcpy(&ur,&r,sizeof(r)); 13421 if( ur==0x7ff0000000000000LL ){ 13422 raw_printf(p->out, "1e999"); 13423 }else if( ur==0xfff0000000000000LL ){ 13424 raw_printf(p->out, "-1e999"); 13425 }else{ 13426 sqlite3_snprintf(50,z,"%!.20g", r); 13427 raw_printf(p->out, "%s", z); 13428 } 13429 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){ 13430 const void *pBlob = sqlite3_column_blob(p->pStmt, i); 13431 int nBlob = sqlite3_column_bytes(p->pStmt, i); 13432 output_json_string(p->out, pBlob, nBlob); 13433 }else if( aiType && aiType[i]==SQLITE_TEXT ){ 13434 output_json_string(p->out, azArg[i], -1); 13435 }else{ 13436 utf8_printf(p->out,"%s", azArg[i]); 13437 } 13438 if( i<nArg-1 ){ 13439 putc(',', p->out); 13440 } 13441 } 13442 putc('}', p->out); 13443 break; 13444 } 13445 case MODE_Quote: { 13446 if( azArg==0 ) break; 13447 if( p->cnt==0 && p->showHeader ){ 13448 for(i=0; i<nArg; i++){ 13449 if( i>0 ) fputs(p->colSeparator, p->out); 13450 output_quoted_string(p->out, azCol[i]); 13451 } 13452 fputs(p->rowSeparator, p->out); 13453 } 13454 p->cnt++; 13455 for(i=0; i<nArg; i++){ 13456 if( i>0 ) fputs(p->colSeparator, p->out); 13457 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){ 13458 utf8_printf(p->out,"NULL"); 13459 }else if( aiType && aiType[i]==SQLITE_TEXT ){ 13460 output_quoted_string(p->out, azArg[i]); 13461 }else if( aiType && aiType[i]==SQLITE_INTEGER ){ 13462 utf8_printf(p->out,"%s", azArg[i]); 13463 }else if( aiType && aiType[i]==SQLITE_FLOAT ){ 13464 char z[50]; 13465 double r = sqlite3_column_double(p->pStmt, i); 13466 sqlite3_snprintf(50,z,"%!.20g", r); 13467 raw_printf(p->out, "%s", z); 13468 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){ 13469 const void *pBlob = sqlite3_column_blob(p->pStmt, i); 13470 int nBlob = sqlite3_column_bytes(p->pStmt, i); 13471 output_hex_blob(p->out, pBlob, nBlob); 13472 }else if( isNumber(azArg[i], 0) ){ 13473 utf8_printf(p->out,"%s", azArg[i]); 13474 }else{ 13475 output_quoted_string(p->out, azArg[i]); 13476 } 13477 } 13478 fputs(p->rowSeparator, p->out); 13479 break; 13480 } 13481 case MODE_Ascii: { 13482 if( p->cnt++==0 && p->showHeader ){ 13483 for(i=0; i<nArg; i++){ 13484 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator); 13485 utf8_printf(p->out,"%s",azCol[i] ? azCol[i] : ""); 13486 } 13487 utf8_printf(p->out, "%s", p->rowSeparator); 13488 } 13489 if( azArg==0 ) break; 13490 for(i=0; i<nArg; i++){ 13491 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator); 13492 utf8_printf(p->out,"%s",azArg[i] ? azArg[i] : p->nullValue); 13493 } 13494 utf8_printf(p->out, "%s", p->rowSeparator); 13495 break; 13496 } 13497 case MODE_EQP: { 13498 eqp_append(p, atoi(azArg[0]), atoi(azArg[1]), azArg[3]); 13499 break; 13500 } 13501 } 13502 return 0; 13503 } 13504 13505 /* 13506 ** This is the callback routine that the SQLite library 13507 ** invokes for each row of a query result. 13508 */ 13509 static int callback(void *pArg, int nArg, char **azArg, char **azCol){ 13510 /* since we don't have type info, call the shell_callback with a NULL value */ 13511 return shell_callback(pArg, nArg, azArg, azCol, NULL); 13512 } 13513 13514 /* 13515 ** This is the callback routine from sqlite3_exec() that appends all 13516 ** output onto the end of a ShellText object. 13517 */ 13518 static int captureOutputCallback(void *pArg, int nArg, char **azArg, char **az){ 13519 ShellText *p = (ShellText*)pArg; 13520 int i; 13521 UNUSED_PARAMETER(az); 13522 if( azArg==0 ) return 0; 13523 if( p->n ) appendText(p, "|", 0); 13524 for(i=0; i<nArg; i++){ 13525 if( i ) appendText(p, ",", 0); 13526 if( azArg[i] ) appendText(p, azArg[i], 0); 13527 } 13528 return 0; 13529 } 13530 13531 /* 13532 ** Generate an appropriate SELFTEST table in the main database. 13533 */ 13534 static void createSelftestTable(ShellState *p){ 13535 char *zErrMsg = 0; 13536 sqlite3_exec(p->db, 13537 "SAVEPOINT selftest_init;\n" 13538 "CREATE TABLE IF NOT EXISTS selftest(\n" 13539 " tno INTEGER PRIMARY KEY,\n" /* Test number */ 13540 " op TEXT,\n" /* Operator: memo run */ 13541 " cmd TEXT,\n" /* Command text */ 13542 " ans TEXT\n" /* Desired answer */ 13543 ");" 13544 "CREATE TEMP TABLE [_shell$self](op,cmd,ans);\n" 13545 "INSERT INTO [_shell$self](rowid,op,cmd)\n" 13546 " VALUES(coalesce((SELECT (max(tno)+100)/10 FROM selftest),10),\n" 13547 " 'memo','Tests generated by --init');\n" 13548 "INSERT INTO [_shell$self]\n" 13549 " SELECT 'run',\n" 13550 " 'SELECT hex(sha3_query(''SELECT type,name,tbl_name,sql " 13551 "FROM sqlite_schema ORDER BY 2'',224))',\n" 13552 " hex(sha3_query('SELECT type,name,tbl_name,sql " 13553 "FROM sqlite_schema ORDER BY 2',224));\n" 13554 "INSERT INTO [_shell$self]\n" 13555 " SELECT 'run'," 13556 " 'SELECT hex(sha3_query(''SELECT * FROM \"' ||" 13557 " printf('%w',name) || '\" NOT INDEXED'',224))',\n" 13558 " hex(sha3_query(printf('SELECT * FROM \"%w\" NOT INDEXED',name),224))\n" 13559 " FROM (\n" 13560 " SELECT name FROM sqlite_schema\n" 13561 " WHERE type='table'\n" 13562 " AND name<>'selftest'\n" 13563 " AND coalesce(rootpage,0)>0\n" 13564 " )\n" 13565 " ORDER BY name;\n" 13566 "INSERT INTO [_shell$self]\n" 13567 " VALUES('run','PRAGMA integrity_check','ok');\n" 13568 "INSERT INTO selftest(tno,op,cmd,ans)" 13569 " SELECT rowid*10,op,cmd,ans FROM [_shell$self];\n" 13570 "DROP TABLE [_shell$self];" 13571 ,0,0,&zErrMsg); 13572 if( zErrMsg ){ 13573 utf8_printf(stderr, "SELFTEST initialization failure: %s\n", zErrMsg); 13574 sqlite3_free(zErrMsg); 13575 } 13576 sqlite3_exec(p->db, "RELEASE selftest_init",0,0,0); 13577 } 13578 13579 13580 /* 13581 ** Set the destination table field of the ShellState structure to 13582 ** the name of the table given. Escape any quote characters in the 13583 ** table name. 13584 */ 13585 static void set_table_name(ShellState *p, const char *zName){ 13586 int i, n; 13587 char cQuote; 13588 char *z; 13589 13590 if( p->zDestTable ){ 13591 free(p->zDestTable); 13592 p->zDestTable = 0; 13593 } 13594 if( zName==0 ) return; 13595 cQuote = quoteChar(zName); 13596 n = strlen30(zName); 13597 if( cQuote ) n += n+2; 13598 z = p->zDestTable = malloc( n+1 ); 13599 if( z==0 ) shell_out_of_memory(); 13600 n = 0; 13601 if( cQuote ) z[n++] = cQuote; 13602 for(i=0; zName[i]; i++){ 13603 z[n++] = zName[i]; 13604 if( zName[i]==cQuote ) z[n++] = cQuote; 13605 } 13606 if( cQuote ) z[n++] = cQuote; 13607 z[n] = 0; 13608 } 13609 13610 13611 /* 13612 ** Execute a query statement that will generate SQL output. Print 13613 ** the result columns, comma-separated, on a line and then add a 13614 ** semicolon terminator to the end of that line. 13615 ** 13616 ** If the number of columns is 1 and that column contains text "--" 13617 ** then write the semicolon on a separate line. That way, if a 13618 ** "--" comment occurs at the end of the statement, the comment 13619 ** won't consume the semicolon terminator. 13620 */ 13621 static int run_table_dump_query( 13622 ShellState *p, /* Query context */ 13623 const char *zSelect /* SELECT statement to extract content */ 13624 ){ 13625 sqlite3_stmt *pSelect; 13626 int rc; 13627 int nResult; 13628 int i; 13629 const char *z; 13630 rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0); 13631 if( rc!=SQLITE_OK || !pSelect ){ 13632 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, 13633 sqlite3_errmsg(p->db)); 13634 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++; 13635 return rc; 13636 } 13637 rc = sqlite3_step(pSelect); 13638 nResult = sqlite3_column_count(pSelect); 13639 while( rc==SQLITE_ROW ){ 13640 z = (const char*)sqlite3_column_text(pSelect, 0); 13641 utf8_printf(p->out, "%s", z); 13642 for(i=1; i<nResult; i++){ 13643 utf8_printf(p->out, ",%s", sqlite3_column_text(pSelect, i)); 13644 } 13645 if( z==0 ) z = ""; 13646 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++; 13647 if( z[0] ){ 13648 raw_printf(p->out, "\n;\n"); 13649 }else{ 13650 raw_printf(p->out, ";\n"); 13651 } 13652 rc = sqlite3_step(pSelect); 13653 } 13654 rc = sqlite3_finalize(pSelect); 13655 if( rc!=SQLITE_OK ){ 13656 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, 13657 sqlite3_errmsg(p->db)); 13658 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++; 13659 } 13660 return rc; 13661 } 13662 13663 /* 13664 ** Allocate space and save off string indicating current error. 13665 */ 13666 static char *save_err_msg( 13667 sqlite3 *db, /* Database to query */ 13668 const char *zWhen, /* Qualifier (format) wrapper */ 13669 int rc /* Error code returned from API */ 13670 ){ 13671 if( zWhen==0 ) 13672 zWhen = "%s (%d)"; 13673 return sqlite3_mprintf(zWhen, sqlite3_errmsg(db), rc); 13674 } 13675 13676 #ifdef __linux__ 13677 /* 13678 ** Attempt to display I/O stats on Linux using /proc/PID/io 13679 */ 13680 static void displayLinuxIoStats(FILE *out){ 13681 FILE *in; 13682 char z[200]; 13683 sqlite3_snprintf(sizeof(z), z, "/proc/%d/io", getpid()); 13684 in = fopen(z, "rb"); 13685 if( in==0 ) return; 13686 while( fgets(z, sizeof(z), in)!=0 ){ 13687 static const struct { 13688 const char *zPattern; 13689 const char *zDesc; 13690 } aTrans[] = { 13691 { "rchar: ", "Bytes received by read():" }, 13692 { "wchar: ", "Bytes sent to write():" }, 13693 { "syscr: ", "Read() system calls:" }, 13694 { "syscw: ", "Write() system calls:" }, 13695 { "read_bytes: ", "Bytes read from storage:" }, 13696 { "write_bytes: ", "Bytes written to storage:" }, 13697 { "cancelled_write_bytes: ", "Cancelled write bytes:" }, 13698 }; 13699 int i; 13700 for(i=0; i<ArraySize(aTrans); i++){ 13701 int n = strlen30(aTrans[i].zPattern); 13702 if( strncmp(aTrans[i].zPattern, z, n)==0 ){ 13703 utf8_printf(out, "%-36s %s", aTrans[i].zDesc, &z[n]); 13704 break; 13705 } 13706 } 13707 } 13708 fclose(in); 13709 } 13710 #endif 13711 13712 /* 13713 ** Display a single line of status using 64-bit values. 13714 */ 13715 static void displayStatLine( 13716 ShellState *p, /* The shell context */ 13717 char *zLabel, /* Label for this one line */ 13718 char *zFormat, /* Format for the result */ 13719 int iStatusCtrl, /* Which status to display */ 13720 int bReset /* True to reset the stats */ 13721 ){ 13722 sqlite3_int64 iCur = -1; 13723 sqlite3_int64 iHiwtr = -1; 13724 int i, nPercent; 13725 char zLine[200]; 13726 sqlite3_status64(iStatusCtrl, &iCur, &iHiwtr, bReset); 13727 for(i=0, nPercent=0; zFormat[i]; i++){ 13728 if( zFormat[i]=='%' ) nPercent++; 13729 } 13730 if( nPercent>1 ){ 13731 sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iCur, iHiwtr); 13732 }else{ 13733 sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iHiwtr); 13734 } 13735 raw_printf(p->out, "%-36s %s\n", zLabel, zLine); 13736 } 13737 13738 /* 13739 ** Display memory stats. 13740 */ 13741 static int display_stats( 13742 sqlite3 *db, /* Database to query */ 13743 ShellState *pArg, /* Pointer to ShellState */ 13744 int bReset /* True to reset the stats */ 13745 ){ 13746 int iCur; 13747 int iHiwtr; 13748 FILE *out; 13749 if( pArg==0 || pArg->out==0 ) return 0; 13750 out = pArg->out; 13751 13752 if( pArg->pStmt && pArg->statsOn==2 ){ 13753 int nCol, i, x; 13754 sqlite3_stmt *pStmt = pArg->pStmt; 13755 char z[100]; 13756 nCol = sqlite3_column_count(pStmt); 13757 raw_printf(out, "%-36s %d\n", "Number of output columns:", nCol); 13758 for(i=0; i<nCol; i++){ 13759 sqlite3_snprintf(sizeof(z),z,"Column %d %nname:", i, &x); 13760 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_name(pStmt,i)); 13761 #ifndef SQLITE_OMIT_DECLTYPE 13762 sqlite3_snprintf(30, z+x, "declared type:"); 13763 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_decltype(pStmt, i)); 13764 #endif 13765 #ifdef SQLITE_ENABLE_COLUMN_METADATA 13766 sqlite3_snprintf(30, z+x, "database name:"); 13767 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_database_name(pStmt,i)); 13768 sqlite3_snprintf(30, z+x, "table name:"); 13769 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_table_name(pStmt,i)); 13770 sqlite3_snprintf(30, z+x, "origin name:"); 13771 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_origin_name(pStmt,i)); 13772 #endif 13773 } 13774 } 13775 13776 if( pArg->statsOn==3 ){ 13777 if( pArg->pStmt ){ 13778 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset); 13779 raw_printf(pArg->out, "VM-steps: %d\n", iCur); 13780 } 13781 return 0; 13782 } 13783 13784 displayStatLine(pArg, "Memory Used:", 13785 "%lld (max %lld) bytes", SQLITE_STATUS_MEMORY_USED, bReset); 13786 displayStatLine(pArg, "Number of Outstanding Allocations:", 13787 "%lld (max %lld)", SQLITE_STATUS_MALLOC_COUNT, bReset); 13788 if( pArg->shellFlgs & SHFLG_Pagecache ){ 13789 displayStatLine(pArg, "Number of Pcache Pages Used:", 13790 "%lld (max %lld) pages", SQLITE_STATUS_PAGECACHE_USED, bReset); 13791 } 13792 displayStatLine(pArg, "Number of Pcache Overflow Bytes:", 13793 "%lld (max %lld) bytes", SQLITE_STATUS_PAGECACHE_OVERFLOW, bReset); 13794 displayStatLine(pArg, "Largest Allocation:", 13795 "%lld bytes", SQLITE_STATUS_MALLOC_SIZE, bReset); 13796 displayStatLine(pArg, "Largest Pcache Allocation:", 13797 "%lld bytes", SQLITE_STATUS_PAGECACHE_SIZE, bReset); 13798 #ifdef YYTRACKMAXSTACKDEPTH 13799 displayStatLine(pArg, "Deepest Parser Stack:", 13800 "%lld (max %lld)", SQLITE_STATUS_PARSER_STACK, bReset); 13801 #endif 13802 13803 if( db ){ 13804 if( pArg->shellFlgs & SHFLG_Lookaside ){ 13805 iHiwtr = iCur = -1; 13806 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED, 13807 &iCur, &iHiwtr, bReset); 13808 raw_printf(pArg->out, 13809 "Lookaside Slots Used: %d (max %d)\n", 13810 iCur, iHiwtr); 13811 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT, 13812 &iCur, &iHiwtr, bReset); 13813 raw_printf(pArg->out, "Successful lookaside attempts: %d\n", 13814 iHiwtr); 13815 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE, 13816 &iCur, &iHiwtr, bReset); 13817 raw_printf(pArg->out, "Lookaside failures due to size: %d\n", 13818 iHiwtr); 13819 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL, 13820 &iCur, &iHiwtr, bReset); 13821 raw_printf(pArg->out, "Lookaside failures due to OOM: %d\n", 13822 iHiwtr); 13823 } 13824 iHiwtr = iCur = -1; 13825 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset); 13826 raw_printf(pArg->out, "Pager Heap Usage: %d bytes\n", 13827 iCur); 13828 iHiwtr = iCur = -1; 13829 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1); 13830 raw_printf(pArg->out, "Page cache hits: %d\n", iCur); 13831 iHiwtr = iCur = -1; 13832 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1); 13833 raw_printf(pArg->out, "Page cache misses: %d\n", iCur); 13834 iHiwtr = iCur = -1; 13835 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1); 13836 raw_printf(pArg->out, "Page cache writes: %d\n", iCur); 13837 iHiwtr = iCur = -1; 13838 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_SPILL, &iCur, &iHiwtr, 1); 13839 raw_printf(pArg->out, "Page cache spills: %d\n", iCur); 13840 iHiwtr = iCur = -1; 13841 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset); 13842 raw_printf(pArg->out, "Schema Heap Usage: %d bytes\n", 13843 iCur); 13844 iHiwtr = iCur = -1; 13845 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset); 13846 raw_printf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n", 13847 iCur); 13848 } 13849 13850 if( pArg->pStmt ){ 13851 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP, 13852 bReset); 13853 raw_printf(pArg->out, "Fullscan Steps: %d\n", iCur); 13854 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset); 13855 raw_printf(pArg->out, "Sort Operations: %d\n", iCur); 13856 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset); 13857 raw_printf(pArg->out, "Autoindex Inserts: %d\n", iCur); 13858 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset); 13859 raw_printf(pArg->out, "Virtual Machine Steps: %d\n", iCur); 13860 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_REPREPARE,bReset); 13861 raw_printf(pArg->out, "Reprepare operations: %d\n", iCur); 13862 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_RUN, bReset); 13863 raw_printf(pArg->out, "Number of times run: %d\n", iCur); 13864 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_MEMUSED, bReset); 13865 raw_printf(pArg->out, "Memory used by prepared stmt: %d\n", iCur); 13866 } 13867 13868 #ifdef __linux__ 13869 displayLinuxIoStats(pArg->out); 13870 #endif 13871 13872 /* Do not remove this machine readable comment: extra-stats-output-here */ 13873 13874 return 0; 13875 } 13876 13877 /* 13878 ** Display scan stats. 13879 */ 13880 static void display_scanstats( 13881 sqlite3 *db, /* Database to query */ 13882 ShellState *pArg /* Pointer to ShellState */ 13883 ){ 13884 #ifndef SQLITE_ENABLE_STMT_SCANSTATUS 13885 UNUSED_PARAMETER(db); 13886 UNUSED_PARAMETER(pArg); 13887 #else 13888 int i, k, n, mx; 13889 raw_printf(pArg->out, "-------- scanstats --------\n"); 13890 mx = 0; 13891 for(k=0; k<=mx; k++){ 13892 double rEstLoop = 1.0; 13893 for(i=n=0; 1; i++){ 13894 sqlite3_stmt *p = pArg->pStmt; 13895 sqlite3_int64 nLoop, nVisit; 13896 double rEst; 13897 int iSid; 13898 const char *zExplain; 13899 if( sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NLOOP, (void*)&nLoop) ){ 13900 break; 13901 } 13902 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_SELECTID, (void*)&iSid); 13903 if( iSid>mx ) mx = iSid; 13904 if( iSid!=k ) continue; 13905 if( n==0 ){ 13906 rEstLoop = (double)nLoop; 13907 if( k>0 ) raw_printf(pArg->out, "-------- subquery %d -------\n", k); 13908 } 13909 n++; 13910 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NVISIT, (void*)&nVisit); 13911 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EST, (void*)&rEst); 13912 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EXPLAIN, (void*)&zExplain); 13913 utf8_printf(pArg->out, "Loop %2d: %s\n", n, zExplain); 13914 rEstLoop *= rEst; 13915 raw_printf(pArg->out, 13916 " nLoop=%-8lld nRow=%-8lld estRow=%-8lld estRow/Loop=%-8g\n", 13917 nLoop, nVisit, (sqlite3_int64)(rEstLoop+0.5), rEst 13918 ); 13919 } 13920 } 13921 raw_printf(pArg->out, "---------------------------\n"); 13922 #endif 13923 } 13924 13925 /* 13926 ** Parameter azArray points to a zero-terminated array of strings. zStr 13927 ** points to a single nul-terminated string. Return non-zero if zStr 13928 ** is equal, according to strcmp(), to any of the strings in the array. 13929 ** Otherwise, return zero. 13930 */ 13931 static int str_in_array(const char *zStr, const char **azArray){ 13932 int i; 13933 for(i=0; azArray[i]; i++){ 13934 if( 0==strcmp(zStr, azArray[i]) ) return 1; 13935 } 13936 return 0; 13937 } 13938 13939 /* 13940 ** If compiled statement pSql appears to be an EXPLAIN statement, allocate 13941 ** and populate the ShellState.aiIndent[] array with the number of 13942 ** spaces each opcode should be indented before it is output. 13943 ** 13944 ** The indenting rules are: 13945 ** 13946 ** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent 13947 ** all opcodes that occur between the p2 jump destination and the opcode 13948 ** itself by 2 spaces. 13949 ** 13950 ** * For each "Goto", if the jump destination is earlier in the program 13951 ** and ends on one of: 13952 ** Yield SeekGt SeekLt RowSetRead Rewind 13953 ** or if the P1 parameter is one instead of zero, 13954 ** then indent all opcodes between the earlier instruction 13955 ** and "Goto" by 2 spaces. 13956 */ 13957 static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){ 13958 const char *zSql; /* The text of the SQL statement */ 13959 const char *z; /* Used to check if this is an EXPLAIN */ 13960 int *abYield = 0; /* True if op is an OP_Yield */ 13961 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */ 13962 int iOp; /* Index of operation in p->aiIndent[] */ 13963 13964 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext", 0 }; 13965 const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead", 13966 "Rewind", 0 }; 13967 const char *azGoto[] = { "Goto", 0 }; 13968 13969 /* Try to figure out if this is really an EXPLAIN statement. If this 13970 ** cannot be verified, return early. */ 13971 if( sqlite3_column_count(pSql)!=8 ){ 13972 p->cMode = p->mode; 13973 return; 13974 } 13975 zSql = sqlite3_sql(pSql); 13976 if( zSql==0 ) return; 13977 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++); 13978 if( sqlite3_strnicmp(z, "explain", 7) ){ 13979 p->cMode = p->mode; 13980 return; 13981 } 13982 13983 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){ 13984 int i; 13985 int iAddr = sqlite3_column_int(pSql, 0); 13986 const char *zOp = (const char*)sqlite3_column_text(pSql, 1); 13987 13988 /* Set p2 to the P2 field of the current opcode. Then, assuming that 13989 ** p2 is an instruction address, set variable p2op to the index of that 13990 ** instruction in the aiIndent[] array. p2 and p2op may be different if 13991 ** the current instruction is part of a sub-program generated by an 13992 ** SQL trigger or foreign key. */ 13993 int p2 = sqlite3_column_int(pSql, 3); 13994 int p2op = (p2 + (iOp-iAddr)); 13995 13996 /* Grow the p->aiIndent array as required */ 13997 if( iOp>=nAlloc ){ 13998 if( iOp==0 ){ 13999 /* Do further verfication that this is explain output. Abort if 14000 ** it is not */ 14001 static const char *explainCols[] = { 14002 "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment" }; 14003 int jj; 14004 for(jj=0; jj<ArraySize(explainCols); jj++){ 14005 if( strcmp(sqlite3_column_name(pSql,jj),explainCols[jj])!=0 ){ 14006 p->cMode = p->mode; 14007 sqlite3_reset(pSql); 14008 return; 14009 } 14010 } 14011 } 14012 nAlloc += 100; 14013 p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int)); 14014 if( p->aiIndent==0 ) shell_out_of_memory(); 14015 abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int)); 14016 if( abYield==0 ) shell_out_of_memory(); 14017 } 14018 abYield[iOp] = str_in_array(zOp, azYield); 14019 p->aiIndent[iOp] = 0; 14020 p->nIndent = iOp+1; 14021 14022 if( str_in_array(zOp, azNext) ){ 14023 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2; 14024 } 14025 if( str_in_array(zOp, azGoto) && p2op<p->nIndent 14026 && (abYield[p2op] || sqlite3_column_int(pSql, 2)) 14027 ){ 14028 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2; 14029 } 14030 } 14031 14032 p->iIndent = 0; 14033 sqlite3_free(abYield); 14034 sqlite3_reset(pSql); 14035 } 14036 14037 /* 14038 ** Free the array allocated by explain_data_prepare(). 14039 */ 14040 static void explain_data_delete(ShellState *p){ 14041 sqlite3_free(p->aiIndent); 14042 p->aiIndent = 0; 14043 p->nIndent = 0; 14044 p->iIndent = 0; 14045 } 14046 14047 /* 14048 ** Disable and restore .wheretrace and .selecttrace settings. 14049 */ 14050 static unsigned int savedSelectTrace; 14051 static unsigned int savedWhereTrace; 14052 static void disable_debug_trace_modes(void){ 14053 unsigned int zero = 0; 14054 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 0, &savedSelectTrace); 14055 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &zero); 14056 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 2, &savedWhereTrace); 14057 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &zero); 14058 } 14059 static void restore_debug_trace_modes(void){ 14060 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &savedSelectTrace); 14061 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &savedWhereTrace); 14062 } 14063 14064 /* Create the TEMP table used to store parameter bindings */ 14065 static void bind_table_init(ShellState *p){ 14066 int wrSchema = 0; 14067 int defensiveMode = 0; 14068 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, -1, &defensiveMode); 14069 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, 0, 0); 14070 sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, -1, &wrSchema); 14071 sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, 1, 0); 14072 sqlite3_exec(p->db, 14073 "CREATE TABLE IF NOT EXISTS temp.sqlite_parameters(\n" 14074 " key TEXT PRIMARY KEY,\n" 14075 " value\n" 14076 ") WITHOUT ROWID;", 14077 0, 0, 0); 14078 sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, wrSchema, 0); 14079 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, defensiveMode, 0); 14080 } 14081 14082 /* 14083 ** Bind parameters on a prepared statement. 14084 ** 14085 ** Parameter bindings are taken from a TEMP table of the form: 14086 ** 14087 ** CREATE TEMP TABLE sqlite_parameters(key TEXT PRIMARY KEY, value) 14088 ** WITHOUT ROWID; 14089 ** 14090 ** No bindings occur if this table does not exist. The name of the table 14091 ** begins with "sqlite_" so that it will not collide with ordinary application 14092 ** tables. The table must be in the TEMP schema. 14093 */ 14094 static void bind_prepared_stmt(ShellState *pArg, sqlite3_stmt *pStmt){ 14095 int nVar; 14096 int i; 14097 int rc; 14098 sqlite3_stmt *pQ = 0; 14099 14100 nVar = sqlite3_bind_parameter_count(pStmt); 14101 if( nVar==0 ) return; /* Nothing to do */ 14102 if( sqlite3_table_column_metadata(pArg->db, "TEMP", "sqlite_parameters", 14103 "key", 0, 0, 0, 0, 0)!=SQLITE_OK ){ 14104 return; /* Parameter table does not exist */ 14105 } 14106 rc = sqlite3_prepare_v2(pArg->db, 14107 "SELECT value FROM temp.sqlite_parameters" 14108 " WHERE key=?1", -1, &pQ, 0); 14109 if( rc || pQ==0 ) return; 14110 for(i=1; i<=nVar; i++){ 14111 char zNum[30]; 14112 const char *zVar = sqlite3_bind_parameter_name(pStmt, i); 14113 if( zVar==0 ){ 14114 sqlite3_snprintf(sizeof(zNum),zNum,"?%d",i); 14115 zVar = zNum; 14116 } 14117 sqlite3_bind_text(pQ, 1, zVar, -1, SQLITE_STATIC); 14118 if( sqlite3_step(pQ)==SQLITE_ROW ){ 14119 sqlite3_bind_value(pStmt, i, sqlite3_column_value(pQ, 0)); 14120 }else{ 14121 sqlite3_bind_null(pStmt, i); 14122 } 14123 sqlite3_reset(pQ); 14124 } 14125 sqlite3_finalize(pQ); 14126 } 14127 14128 /* 14129 ** UTF8 box-drawing characters. Imagine box lines like this: 14130 ** 14131 ** 1 14132 ** | 14133 ** 4 --+-- 2 14134 ** | 14135 ** 3 14136 ** 14137 ** Each box characters has between 2 and 4 of the lines leading from 14138 ** the center. The characters are here identified by the numbers of 14139 ** their corresponding lines. 14140 */ 14141 #define BOX_24 "\342\224\200" /* U+2500 --- */ 14142 #define BOX_13 "\342\224\202" /* U+2502 | */ 14143 #define BOX_23 "\342\224\214" /* U+250c ,- */ 14144 #define BOX_34 "\342\224\220" /* U+2510 -, */ 14145 #define BOX_12 "\342\224\224" /* U+2514 '- */ 14146 #define BOX_14 "\342\224\230" /* U+2518 -' */ 14147 #define BOX_123 "\342\224\234" /* U+251c |- */ 14148 #define BOX_134 "\342\224\244" /* U+2524 -| */ 14149 #define BOX_234 "\342\224\254" /* U+252c -,- */ 14150 #define BOX_124 "\342\224\264" /* U+2534 -'- */ 14151 #define BOX_1234 "\342\224\274" /* U+253c -|- */ 14152 14153 /* Draw horizontal line N characters long using unicode box 14154 ** characters 14155 */ 14156 static void print_box_line(FILE *out, int N){ 14157 const char zDash[] = 14158 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 14159 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24; 14160 const int nDash = sizeof(zDash) - 1; 14161 N *= 3; 14162 while( N>nDash ){ 14163 utf8_printf(out, zDash); 14164 N -= nDash; 14165 } 14166 utf8_printf(out, "%.*s", N, zDash); 14167 } 14168 14169 /* 14170 ** Draw a horizontal separator for a MODE_Box table. 14171 */ 14172 static void print_box_row_separator( 14173 ShellState *p, 14174 int nArg, 14175 const char *zSep1, 14176 const char *zSep2, 14177 const char *zSep3 14178 ){ 14179 int i; 14180 if( nArg>0 ){ 14181 utf8_printf(p->out, "%s", zSep1); 14182 print_box_line(p->out, p->actualWidth[0]+2); 14183 for(i=1; i<nArg; i++){ 14184 utf8_printf(p->out, "%s", zSep2); 14185 print_box_line(p->out, p->actualWidth[i]+2); 14186 } 14187 utf8_printf(p->out, "%s", zSep3); 14188 } 14189 fputs("\n", p->out); 14190 } 14191 14192 14193 14194 /* 14195 ** Run a prepared statement and output the result in one of the 14196 ** table-oriented formats: MODE_Column, MODE_Markdown, MODE_Table, 14197 ** or MODE_Box. 14198 ** 14199 ** This is different from ordinary exec_prepared_stmt() in that 14200 ** it has to run the entire query and gather the results into memory 14201 ** first, in order to determine column widths, before providing 14202 ** any output. 14203 */ 14204 static void exec_prepared_stmt_columnar( 14205 ShellState *p, /* Pointer to ShellState */ 14206 sqlite3_stmt *pStmt /* Statment to run */ 14207 ){ 14208 sqlite3_int64 nRow = 0; 14209 int nColumn = 0; 14210 char **azData = 0; 14211 sqlite3_int64 nAlloc = 0; 14212 const char *z; 14213 int rc; 14214 sqlite3_int64 i, nData; 14215 int j, nTotal, w, n; 14216 const char *colSep = 0; 14217 const char *rowSep = 0; 14218 14219 rc = sqlite3_step(pStmt); 14220 if( rc!=SQLITE_ROW ) return; 14221 nColumn = sqlite3_column_count(pStmt); 14222 nAlloc = nColumn*4; 14223 if( nAlloc<=0 ) nAlloc = 1; 14224 azData = sqlite3_malloc64( nAlloc*sizeof(char*) ); 14225 if( azData==0 ) shell_out_of_memory(); 14226 for(i=0; i<nColumn; i++){ 14227 azData[i] = strdup(sqlite3_column_name(pStmt,i)); 14228 } 14229 do{ 14230 if( (nRow+2)*nColumn >= nAlloc ){ 14231 nAlloc *= 2; 14232 azData = sqlite3_realloc64(azData, nAlloc*sizeof(char*)); 14233 if( azData==0 ) shell_out_of_memory(); 14234 } 14235 nRow++; 14236 for(i=0; i<nColumn; i++){ 14237 z = (const char*)sqlite3_column_text(pStmt,i); 14238 azData[nRow*nColumn + i] = z ? strdup(z) : 0; 14239 } 14240 }while( sqlite3_step(pStmt)==SQLITE_ROW ); 14241 if( nColumn>p->nWidth ){ 14242 p->colWidth = realloc(p->colWidth, (nColumn+1)*2*sizeof(int)); 14243 if( p->colWidth==0 ) shell_out_of_memory(); 14244 for(i=p->nWidth; i<nColumn; i++) p->colWidth[i] = 0; 14245 p->nWidth = nColumn; 14246 p->actualWidth = &p->colWidth[nColumn]; 14247 } 14248 memset(p->actualWidth, 0, nColumn*sizeof(int)); 14249 for(i=0; i<nColumn; i++){ 14250 w = p->colWidth[i]; 14251 if( w<0 ) w = -w; 14252 p->actualWidth[i] = w; 14253 } 14254 nTotal = nColumn*(nRow+1); 14255 for(i=0; i<nTotal; i++){ 14256 z = azData[i]; 14257 if( z==0 ) z = p->nullValue; 14258 n = strlenChar(z); 14259 j = i%nColumn; 14260 if( n>p->actualWidth[j] ) p->actualWidth[j] = n; 14261 } 14262 if( seenInterrupt ) goto columnar_end; 14263 if( nColumn==0 ) goto columnar_end; 14264 switch( p->cMode ){ 14265 case MODE_Column: { 14266 colSep = " "; 14267 rowSep = "\n"; 14268 if( p->showHeader ){ 14269 for(i=0; i<nColumn; i++){ 14270 w = p->actualWidth[i]; 14271 if( p->colWidth[i]<0 ) w = -w; 14272 utf8_width_print(p->out, w, azData[i]); 14273 fputs(i==nColumn-1?"\n":" ", p->out); 14274 } 14275 for(i=0; i<nColumn; i++){ 14276 print_dashes(p->out, p->actualWidth[i]); 14277 fputs(i==nColumn-1?"\n":" ", p->out); 14278 } 14279 } 14280 break; 14281 } 14282 case MODE_Table: { 14283 colSep = " | "; 14284 rowSep = " |\n"; 14285 print_row_separator(p, nColumn, "+"); 14286 fputs("| ", p->out); 14287 for(i=0; i<nColumn; i++){ 14288 w = p->actualWidth[i]; 14289 n = strlenChar(azData[i]); 14290 utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, ""); 14291 fputs(i==nColumn-1?" |\n":" | ", p->out); 14292 } 14293 print_row_separator(p, nColumn, "+"); 14294 break; 14295 } 14296 case MODE_Markdown: { 14297 colSep = " | "; 14298 rowSep = " |\n"; 14299 fputs("| ", p->out); 14300 for(i=0; i<nColumn; i++){ 14301 w = p->actualWidth[i]; 14302 n = strlenChar(azData[i]); 14303 utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, ""); 14304 fputs(i==nColumn-1?" |\n":" | ", p->out); 14305 } 14306 print_row_separator(p, nColumn, "|"); 14307 break; 14308 } 14309 case MODE_Box: { 14310 colSep = " " BOX_13 " "; 14311 rowSep = " " BOX_13 "\n"; 14312 print_box_row_separator(p, nColumn, BOX_23, BOX_234, BOX_34); 14313 utf8_printf(p->out, BOX_13 " "); 14314 for(i=0; i<nColumn; i++){ 14315 w = p->actualWidth[i]; 14316 n = strlenChar(azData[i]); 14317 utf8_printf(p->out, "%*s%s%*s%s", 14318 (w-n)/2, "", azData[i], (w-n+1)/2, "", 14319 i==nColumn-1?" "BOX_13"\n":" "BOX_13" "); 14320 } 14321 print_box_row_separator(p, nColumn, BOX_123, BOX_1234, BOX_134); 14322 break; 14323 } 14324 } 14325 for(i=nColumn, j=0; i<nTotal; i++, j++){ 14326 if( j==0 && p->cMode!=MODE_Column ){ 14327 utf8_printf(p->out, "%s", p->cMode==MODE_Box?BOX_13" ":"| "); 14328 } 14329 z = azData[i]; 14330 if( z==0 ) z = p->nullValue; 14331 w = p->actualWidth[j]; 14332 if( p->colWidth[j]<0 ) w = -w; 14333 utf8_width_print(p->out, w, z); 14334 if( j==nColumn-1 ){ 14335 utf8_printf(p->out, "%s", rowSep); 14336 j = -1; 14337 if( seenInterrupt ) goto columnar_end; 14338 }else{ 14339 utf8_printf(p->out, "%s", colSep); 14340 } 14341 } 14342 if( p->cMode==MODE_Table ){ 14343 print_row_separator(p, nColumn, "+"); 14344 }else if( p->cMode==MODE_Box ){ 14345 print_box_row_separator(p, nColumn, BOX_12, BOX_124, BOX_14); 14346 } 14347 columnar_end: 14348 if( seenInterrupt ){ 14349 utf8_printf(p->out, "Interrupt\n"); 14350 } 14351 nData = (nRow+1)*nColumn; 14352 for(i=0; i<nData; i++) free(azData[i]); 14353 sqlite3_free(azData); 14354 } 14355 14356 /* 14357 ** Run a prepared statement 14358 */ 14359 static void exec_prepared_stmt( 14360 ShellState *pArg, /* Pointer to ShellState */ 14361 sqlite3_stmt *pStmt /* Statment to run */ 14362 ){ 14363 int rc; 14364 14365 if( pArg->cMode==MODE_Column 14366 || pArg->cMode==MODE_Table 14367 || pArg->cMode==MODE_Box 14368 || pArg->cMode==MODE_Markdown 14369 ){ 14370 exec_prepared_stmt_columnar(pArg, pStmt); 14371 return; 14372 } 14373 14374 /* perform the first step. this will tell us if we 14375 ** have a result set or not and how wide it is. 14376 */ 14377 rc = sqlite3_step(pStmt); 14378 /* if we have a result set... */ 14379 if( SQLITE_ROW == rc ){ 14380 /* allocate space for col name ptr, value ptr, and type */ 14381 int nCol = sqlite3_column_count(pStmt); 14382 void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1); 14383 if( !pData ){ 14384 shell_out_of_memory(); 14385 }else{ 14386 char **azCols = (char **)pData; /* Names of result columns */ 14387 char **azVals = &azCols[nCol]; /* Results */ 14388 int *aiTypes = (int *)&azVals[nCol]; /* Result types */ 14389 int i, x; 14390 assert(sizeof(int) <= sizeof(char *)); 14391 /* save off ptrs to column names */ 14392 for(i=0; i<nCol; i++){ 14393 azCols[i] = (char *)sqlite3_column_name(pStmt, i); 14394 } 14395 do{ 14396 /* extract the data and data types */ 14397 for(i=0; i<nCol; i++){ 14398 aiTypes[i] = x = sqlite3_column_type(pStmt, i); 14399 if( x==SQLITE_BLOB && pArg && pArg->cMode==MODE_Insert ){ 14400 azVals[i] = ""; 14401 }else{ 14402 azVals[i] = (char*)sqlite3_column_text(pStmt, i); 14403 } 14404 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){ 14405 rc = SQLITE_NOMEM; 14406 break; /* from for */ 14407 } 14408 } /* end for */ 14409 14410 /* if data and types extracted successfully... */ 14411 if( SQLITE_ROW == rc ){ 14412 /* call the supplied callback with the result row data */ 14413 if( shell_callback(pArg, nCol, azVals, azCols, aiTypes) ){ 14414 rc = SQLITE_ABORT; 14415 }else{ 14416 rc = sqlite3_step(pStmt); 14417 } 14418 } 14419 } while( SQLITE_ROW == rc ); 14420 sqlite3_free(pData); 14421 if( pArg->cMode==MODE_Json ){ 14422 fputs("]\n", pArg->out); 14423 } 14424 } 14425 } 14426 } 14427 14428 #ifndef SQLITE_OMIT_VIRTUALTABLE 14429 /* 14430 ** This function is called to process SQL if the previous shell command 14431 ** was ".expert". It passes the SQL in the second argument directly to 14432 ** the sqlite3expert object. 14433 ** 14434 ** If successful, SQLITE_OK is returned. Otherwise, an SQLite error 14435 ** code. In this case, (*pzErr) may be set to point to a buffer containing 14436 ** an English language error message. It is the responsibility of the 14437 ** caller to eventually free this buffer using sqlite3_free(). 14438 */ 14439 static int expertHandleSQL( 14440 ShellState *pState, 14441 const char *zSql, 14442 char **pzErr 14443 ){ 14444 assert( pState->expert.pExpert ); 14445 assert( pzErr==0 || *pzErr==0 ); 14446 return sqlite3_expert_sql(pState->expert.pExpert, zSql, pzErr); 14447 } 14448 14449 /* 14450 ** This function is called either to silently clean up the object 14451 ** created by the ".expert" command (if bCancel==1), or to generate a 14452 ** report from it and then clean it up (if bCancel==0). 14453 ** 14454 ** If successful, SQLITE_OK is returned. Otherwise, an SQLite error 14455 ** code. In this case, (*pzErr) may be set to point to a buffer containing 14456 ** an English language error message. It is the responsibility of the 14457 ** caller to eventually free this buffer using sqlite3_free(). 14458 */ 14459 static int expertFinish( 14460 ShellState *pState, 14461 int bCancel, 14462 char **pzErr 14463 ){ 14464 int rc = SQLITE_OK; 14465 sqlite3expert *p = pState->expert.pExpert; 14466 assert( p ); 14467 assert( bCancel || pzErr==0 || *pzErr==0 ); 14468 if( bCancel==0 ){ 14469 FILE *out = pState->out; 14470 int bVerbose = pState->expert.bVerbose; 14471 14472 rc = sqlite3_expert_analyze(p, pzErr); 14473 if( rc==SQLITE_OK ){ 14474 int nQuery = sqlite3_expert_count(p); 14475 int i; 14476 14477 if( bVerbose ){ 14478 const char *zCand = sqlite3_expert_report(p,0,EXPERT_REPORT_CANDIDATES); 14479 raw_printf(out, "-- Candidates -----------------------------\n"); 14480 raw_printf(out, "%s\n", zCand); 14481 } 14482 for(i=0; i<nQuery; i++){ 14483 const char *zSql = sqlite3_expert_report(p, i, EXPERT_REPORT_SQL); 14484 const char *zIdx = sqlite3_expert_report(p, i, EXPERT_REPORT_INDEXES); 14485 const char *zEQP = sqlite3_expert_report(p, i, EXPERT_REPORT_PLAN); 14486 if( zIdx==0 ) zIdx = "(no new indexes)\n"; 14487 if( bVerbose ){ 14488 raw_printf(out, "-- Query %d --------------------------------\n",i+1); 14489 raw_printf(out, "%s\n\n", zSql); 14490 } 14491 raw_printf(out, "%s\n", zIdx); 14492 raw_printf(out, "%s\n", zEQP); 14493 } 14494 } 14495 } 14496 sqlite3_expert_destroy(p); 14497 pState->expert.pExpert = 0; 14498 return rc; 14499 } 14500 14501 /* 14502 ** Implementation of ".expert" dot command. 14503 */ 14504 static int expertDotCommand( 14505 ShellState *pState, /* Current shell tool state */ 14506 char **azArg, /* Array of arguments passed to dot command */ 14507 int nArg /* Number of entries in azArg[] */ 14508 ){ 14509 int rc = SQLITE_OK; 14510 char *zErr = 0; 14511 int i; 14512 int iSample = 0; 14513 14514 assert( pState->expert.pExpert==0 ); 14515 memset(&pState->expert, 0, sizeof(ExpertInfo)); 14516 14517 for(i=1; rc==SQLITE_OK && i<nArg; i++){ 14518 char *z = azArg[i]; 14519 int n; 14520 if( z[0]=='-' && z[1]=='-' ) z++; 14521 n = strlen30(z); 14522 if( n>=2 && 0==strncmp(z, "-verbose", n) ){ 14523 pState->expert.bVerbose = 1; 14524 } 14525 else if( n>=2 && 0==strncmp(z, "-sample", n) ){ 14526 if( i==(nArg-1) ){ 14527 raw_printf(stderr, "option requires an argument: %s\n", z); 14528 rc = SQLITE_ERROR; 14529 }else{ 14530 iSample = (int)integerValue(azArg[++i]); 14531 if( iSample<0 || iSample>100 ){ 14532 raw_printf(stderr, "value out of range: %s\n", azArg[i]); 14533 rc = SQLITE_ERROR; 14534 } 14535 } 14536 } 14537 else{ 14538 raw_printf(stderr, "unknown option: %s\n", z); 14539 rc = SQLITE_ERROR; 14540 } 14541 } 14542 14543 if( rc==SQLITE_OK ){ 14544 pState->expert.pExpert = sqlite3_expert_new(pState->db, &zErr); 14545 if( pState->expert.pExpert==0 ){ 14546 raw_printf(stderr, "sqlite3_expert_new: %s\n", zErr); 14547 rc = SQLITE_ERROR; 14548 }else{ 14549 sqlite3_expert_config( 14550 pState->expert.pExpert, EXPERT_CONFIG_SAMPLE, iSample 14551 ); 14552 } 14553 } 14554 14555 return rc; 14556 } 14557 #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */ 14558 14559 /* 14560 ** Execute a statement or set of statements. Print 14561 ** any result rows/columns depending on the current mode 14562 ** set via the supplied callback. 14563 ** 14564 ** This is very similar to SQLite's built-in sqlite3_exec() 14565 ** function except it takes a slightly different callback 14566 ** and callback data argument. 14567 */ 14568 static int shell_exec( 14569 ShellState *pArg, /* Pointer to ShellState */ 14570 const char *zSql, /* SQL to be evaluated */ 14571 char **pzErrMsg /* Error msg written here */ 14572 ){ 14573 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */ 14574 int rc = SQLITE_OK; /* Return Code */ 14575 int rc2; 14576 const char *zLeftover; /* Tail of unprocessed SQL */ 14577 sqlite3 *db = pArg->db; 14578 14579 if( pzErrMsg ){ 14580 *pzErrMsg = NULL; 14581 } 14582 14583 #ifndef SQLITE_OMIT_VIRTUALTABLE 14584 if( pArg->expert.pExpert ){ 14585 rc = expertHandleSQL(pArg, zSql, pzErrMsg); 14586 return expertFinish(pArg, (rc!=SQLITE_OK), pzErrMsg); 14587 } 14588 #endif 14589 14590 while( zSql[0] && (SQLITE_OK == rc) ){ 14591 static const char *zStmtSql; 14592 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover); 14593 if( SQLITE_OK != rc ){ 14594 if( pzErrMsg ){ 14595 *pzErrMsg = save_err_msg(db, "in prepare, %s (%d)", rc); 14596 } 14597 }else{ 14598 if( !pStmt ){ 14599 /* this happens for a comment or white-space */ 14600 zSql = zLeftover; 14601 while( IsSpace(zSql[0]) ) zSql++; 14602 continue; 14603 } 14604 zStmtSql = sqlite3_sql(pStmt); 14605 if( zStmtSql==0 ) zStmtSql = ""; 14606 while( IsSpace(zStmtSql[0]) ) zStmtSql++; 14607 14608 /* save off the prepared statment handle and reset row count */ 14609 if( pArg ){ 14610 pArg->pStmt = pStmt; 14611 pArg->cnt = 0; 14612 } 14613 14614 /* echo the sql statement if echo on */ 14615 if( pArg && ShellHasFlag(pArg, SHFLG_Echo) ){ 14616 utf8_printf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql); 14617 } 14618 14619 /* Show the EXPLAIN QUERY PLAN if .eqp is on */ 14620 if( pArg && pArg->autoEQP && sqlite3_stmt_isexplain(pStmt)==0 ){ 14621 sqlite3_stmt *pExplain; 14622 char *zEQP; 14623 int triggerEQP = 0; 14624 disable_debug_trace_modes(); 14625 sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, -1, &triggerEQP); 14626 if( pArg->autoEQP>=AUTOEQP_trigger ){ 14627 sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 1, 0); 14628 } 14629 zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", zStmtSql); 14630 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0); 14631 if( rc==SQLITE_OK ){ 14632 while( sqlite3_step(pExplain)==SQLITE_ROW ){ 14633 const char *zEQPLine = (const char*)sqlite3_column_text(pExplain,3); 14634 int iEqpId = sqlite3_column_int(pExplain, 0); 14635 int iParentId = sqlite3_column_int(pExplain, 1); 14636 if( zEQPLine==0 ) zEQPLine = ""; 14637 if( zEQPLine[0]=='-' ) eqp_render(pArg); 14638 eqp_append(pArg, iEqpId, iParentId, zEQPLine); 14639 } 14640 eqp_render(pArg); 14641 } 14642 sqlite3_finalize(pExplain); 14643 sqlite3_free(zEQP); 14644 if( pArg->autoEQP>=AUTOEQP_full ){ 14645 /* Also do an EXPLAIN for ".eqp full" mode */ 14646 zEQP = sqlite3_mprintf("EXPLAIN %s", zStmtSql); 14647 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0); 14648 if( rc==SQLITE_OK ){ 14649 pArg->cMode = MODE_Explain; 14650 explain_data_prepare(pArg, pExplain); 14651 exec_prepared_stmt(pArg, pExplain); 14652 explain_data_delete(pArg); 14653 } 14654 sqlite3_finalize(pExplain); 14655 sqlite3_free(zEQP); 14656 } 14657 if( pArg->autoEQP>=AUTOEQP_trigger && triggerEQP==0 ){ 14658 sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 0, 0); 14659 /* Reprepare pStmt before reactiving trace modes */ 14660 sqlite3_finalize(pStmt); 14661 sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); 14662 if( pArg ) pArg->pStmt = pStmt; 14663 } 14664 restore_debug_trace_modes(); 14665 } 14666 14667 if( pArg ){ 14668 pArg->cMode = pArg->mode; 14669 if( pArg->autoExplain ){ 14670 if( sqlite3_stmt_isexplain(pStmt)==1 ){ 14671 pArg->cMode = MODE_Explain; 14672 } 14673 if( sqlite3_stmt_isexplain(pStmt)==2 ){ 14674 pArg->cMode = MODE_EQP; 14675 } 14676 } 14677 14678 /* If the shell is currently in ".explain" mode, gather the extra 14679 ** data required to add indents to the output.*/ 14680 if( pArg->cMode==MODE_Explain ){ 14681 explain_data_prepare(pArg, pStmt); 14682 } 14683 } 14684 14685 bind_prepared_stmt(pArg, pStmt); 14686 exec_prepared_stmt(pArg, pStmt); 14687 explain_data_delete(pArg); 14688 eqp_render(pArg); 14689 14690 /* print usage stats if stats on */ 14691 if( pArg && pArg->statsOn ){ 14692 display_stats(db, pArg, 0); 14693 } 14694 14695 /* print loop-counters if required */ 14696 if( pArg && pArg->scanstatsOn ){ 14697 display_scanstats(db, pArg); 14698 } 14699 14700 /* Finalize the statement just executed. If this fails, save a 14701 ** copy of the error message. Otherwise, set zSql to point to the 14702 ** next statement to execute. */ 14703 rc2 = sqlite3_finalize(pStmt); 14704 if( rc!=SQLITE_NOMEM ) rc = rc2; 14705 if( rc==SQLITE_OK ){ 14706 zSql = zLeftover; 14707 while( IsSpace(zSql[0]) ) zSql++; 14708 }else if( pzErrMsg ){ 14709 *pzErrMsg = save_err_msg(db, "stepping, %s (%d)", rc); 14710 } 14711 14712 /* clear saved stmt handle */ 14713 if( pArg ){ 14714 pArg->pStmt = NULL; 14715 } 14716 } 14717 } /* end while */ 14718 14719 return rc; 14720 } 14721 14722 /* 14723 ** Release memory previously allocated by tableColumnList(). 14724 */ 14725 static void freeColumnList(char **azCol){ 14726 int i; 14727 for(i=1; azCol[i]; i++){ 14728 sqlite3_free(azCol[i]); 14729 } 14730 /* azCol[0] is a static string */ 14731 sqlite3_free(azCol); 14732 } 14733 14734 /* 14735 ** Return a list of pointers to strings which are the names of all 14736 ** columns in table zTab. The memory to hold the names is dynamically 14737 ** allocated and must be released by the caller using a subsequent call 14738 ** to freeColumnList(). 14739 ** 14740 ** The azCol[0] entry is usually NULL. However, if zTab contains a rowid 14741 ** value that needs to be preserved, then azCol[0] is filled in with the 14742 ** name of the rowid column. 14743 ** 14744 ** The first regular column in the table is azCol[1]. The list is terminated 14745 ** by an entry with azCol[i]==0. 14746 */ 14747 static char **tableColumnList(ShellState *p, const char *zTab){ 14748 char **azCol = 0; 14749 sqlite3_stmt *pStmt; 14750 char *zSql; 14751 int nCol = 0; 14752 int nAlloc = 0; 14753 int nPK = 0; /* Number of PRIMARY KEY columns seen */ 14754 int isIPK = 0; /* True if one PRIMARY KEY column of type INTEGER */ 14755 int preserveRowid = ShellHasFlag(p, SHFLG_PreserveRowid); 14756 int rc; 14757 14758 zSql = sqlite3_mprintf("PRAGMA table_info=%Q", zTab); 14759 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 14760 sqlite3_free(zSql); 14761 if( rc ) return 0; 14762 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 14763 if( nCol>=nAlloc-2 ){ 14764 nAlloc = nAlloc*2 + nCol + 10; 14765 azCol = sqlite3_realloc(azCol, nAlloc*sizeof(azCol[0])); 14766 if( azCol==0 ) shell_out_of_memory(); 14767 } 14768 azCol[++nCol] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 1)); 14769 if( sqlite3_column_int(pStmt, 5) ){ 14770 nPK++; 14771 if( nPK==1 14772 && sqlite3_stricmp((const char*)sqlite3_column_text(pStmt,2), 14773 "INTEGER")==0 14774 ){ 14775 isIPK = 1; 14776 }else{ 14777 isIPK = 0; 14778 } 14779 } 14780 } 14781 sqlite3_finalize(pStmt); 14782 if( azCol==0 ) return 0; 14783 azCol[0] = 0; 14784 azCol[nCol+1] = 0; 14785 14786 /* The decision of whether or not a rowid really needs to be preserved 14787 ** is tricky. We never need to preserve a rowid for a WITHOUT ROWID table 14788 ** or a table with an INTEGER PRIMARY KEY. We are unable to preserve 14789 ** rowids on tables where the rowid is inaccessible because there are other 14790 ** columns in the table named "rowid", "_rowid_", and "oid". 14791 */ 14792 if( preserveRowid && isIPK ){ 14793 /* If a single PRIMARY KEY column with type INTEGER was seen, then it 14794 ** might be an alise for the ROWID. But it might also be a WITHOUT ROWID 14795 ** table or a INTEGER PRIMARY KEY DESC column, neither of which are 14796 ** ROWID aliases. To distinguish these cases, check to see if 14797 ** there is a "pk" entry in "PRAGMA index_list". There will be 14798 ** no "pk" index if the PRIMARY KEY really is an alias for the ROWID. 14799 */ 14800 zSql = sqlite3_mprintf("SELECT 1 FROM pragma_index_list(%Q)" 14801 " WHERE origin='pk'", zTab); 14802 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 14803 sqlite3_free(zSql); 14804 if( rc ){ 14805 freeColumnList(azCol); 14806 return 0; 14807 } 14808 rc = sqlite3_step(pStmt); 14809 sqlite3_finalize(pStmt); 14810 preserveRowid = rc==SQLITE_ROW; 14811 } 14812 if( preserveRowid ){ 14813 /* Only preserve the rowid if we can find a name to use for the 14814 ** rowid */ 14815 static char *azRowid[] = { "rowid", "_rowid_", "oid" }; 14816 int i, j; 14817 for(j=0; j<3; j++){ 14818 for(i=1; i<=nCol; i++){ 14819 if( sqlite3_stricmp(azRowid[j],azCol[i])==0 ) break; 14820 } 14821 if( i>nCol ){ 14822 /* At this point, we know that azRowid[j] is not the name of any 14823 ** ordinary column in the table. Verify that azRowid[j] is a valid 14824 ** name for the rowid before adding it to azCol[0]. WITHOUT ROWID 14825 ** tables will fail this last check */ 14826 rc = sqlite3_table_column_metadata(p->db,0,zTab,azRowid[j],0,0,0,0,0); 14827 if( rc==SQLITE_OK ) azCol[0] = azRowid[j]; 14828 break; 14829 } 14830 } 14831 } 14832 return azCol; 14833 } 14834 14835 /* 14836 ** Toggle the reverse_unordered_selects setting. 14837 */ 14838 static void toggleSelectOrder(sqlite3 *db){ 14839 sqlite3_stmt *pStmt = 0; 14840 int iSetting = 0; 14841 char zStmt[100]; 14842 sqlite3_prepare_v2(db, "PRAGMA reverse_unordered_selects", -1, &pStmt, 0); 14843 if( sqlite3_step(pStmt)==SQLITE_ROW ){ 14844 iSetting = sqlite3_column_int(pStmt, 0); 14845 } 14846 sqlite3_finalize(pStmt); 14847 sqlite3_snprintf(sizeof(zStmt), zStmt, 14848 "PRAGMA reverse_unordered_selects(%d)", !iSetting); 14849 sqlite3_exec(db, zStmt, 0, 0, 0); 14850 } 14851 14852 /* 14853 ** This is a different callback routine used for dumping the database. 14854 ** Each row received by this callback consists of a table name, 14855 ** the table type ("index" or "table") and SQL to create the table. 14856 ** This routine should print text sufficient to recreate the table. 14857 */ 14858 static int dump_callback(void *pArg, int nArg, char **azArg, char **azNotUsed){ 14859 int rc; 14860 const char *zTable; 14861 const char *zType; 14862 const char *zSql; 14863 ShellState *p = (ShellState *)pArg; 14864 int dataOnly; 14865 int noSys; 14866 14867 UNUSED_PARAMETER(azNotUsed); 14868 if( nArg!=3 || azArg==0 ) return 0; 14869 zTable = azArg[0]; 14870 zType = azArg[1]; 14871 zSql = azArg[2]; 14872 dataOnly = (p->shellFlgs & SHFLG_DumpDataOnly)!=0; 14873 noSys = (p->shellFlgs & SHFLG_DumpNoSys)!=0; 14874 14875 if( strcmp(zTable, "sqlite_sequence")==0 && !noSys ){ 14876 if( !dataOnly ) raw_printf(p->out, "DELETE FROM sqlite_sequence;\n"); 14877 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 && !noSys ){ 14878 if( !dataOnly ) raw_printf(p->out, "ANALYZE sqlite_schema;\n"); 14879 }else if( strncmp(zTable, "sqlite_", 7)==0 ){ 14880 return 0; 14881 }else if( dataOnly ){ 14882 /* no-op */ 14883 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){ 14884 char *zIns; 14885 if( !p->writableSchema ){ 14886 raw_printf(p->out, "PRAGMA writable_schema=ON;\n"); 14887 p->writableSchema = 1; 14888 } 14889 zIns = sqlite3_mprintf( 14890 "INSERT INTO sqlite_schema(type,name,tbl_name,rootpage,sql)" 14891 "VALUES('table','%q','%q',0,'%q');", 14892 zTable, zTable, zSql); 14893 utf8_printf(p->out, "%s\n", zIns); 14894 sqlite3_free(zIns); 14895 return 0; 14896 }else{ 14897 printSchemaLine(p->out, zSql, ";\n"); 14898 } 14899 14900 if( strcmp(zType, "table")==0 ){ 14901 ShellText sSelect; 14902 ShellText sTable; 14903 char **azCol; 14904 int i; 14905 char *savedDestTable; 14906 int savedMode; 14907 14908 azCol = tableColumnList(p, zTable); 14909 if( azCol==0 ){ 14910 p->nErr++; 14911 return 0; 14912 } 14913 14914 /* Always quote the table name, even if it appears to be pure ascii, 14915 ** in case it is a keyword. Ex: INSERT INTO "table" ... */ 14916 initText(&sTable); 14917 appendText(&sTable, zTable, quoteChar(zTable)); 14918 /* If preserving the rowid, add a column list after the table name. 14919 ** In other words: "INSERT INTO tab(rowid,a,b,c,...) VALUES(...)" 14920 ** instead of the usual "INSERT INTO tab VALUES(...)". 14921 */ 14922 if( azCol[0] ){ 14923 appendText(&sTable, "(", 0); 14924 appendText(&sTable, azCol[0], 0); 14925 for(i=1; azCol[i]; i++){ 14926 appendText(&sTable, ",", 0); 14927 appendText(&sTable, azCol[i], quoteChar(azCol[i])); 14928 } 14929 appendText(&sTable, ")", 0); 14930 } 14931 14932 /* Build an appropriate SELECT statement */ 14933 initText(&sSelect); 14934 appendText(&sSelect, "SELECT ", 0); 14935 if( azCol[0] ){ 14936 appendText(&sSelect, azCol[0], 0); 14937 appendText(&sSelect, ",", 0); 14938 } 14939 for(i=1; azCol[i]; i++){ 14940 appendText(&sSelect, azCol[i], quoteChar(azCol[i])); 14941 if( azCol[i+1] ){ 14942 appendText(&sSelect, ",", 0); 14943 } 14944 } 14945 freeColumnList(azCol); 14946 appendText(&sSelect, " FROM ", 0); 14947 appendText(&sSelect, zTable, quoteChar(zTable)); 14948 14949 savedDestTable = p->zDestTable; 14950 savedMode = p->mode; 14951 p->zDestTable = sTable.z; 14952 p->mode = p->cMode = MODE_Insert; 14953 rc = shell_exec(p, sSelect.z, 0); 14954 if( (rc&0xff)==SQLITE_CORRUPT ){ 14955 raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n"); 14956 toggleSelectOrder(p->db); 14957 shell_exec(p, sSelect.z, 0); 14958 toggleSelectOrder(p->db); 14959 } 14960 p->zDestTable = savedDestTable; 14961 p->mode = savedMode; 14962 freeText(&sTable); 14963 freeText(&sSelect); 14964 if( rc ) p->nErr++; 14965 } 14966 return 0; 14967 } 14968 14969 /* 14970 ** Run zQuery. Use dump_callback() as the callback routine so that 14971 ** the contents of the query are output as SQL statements. 14972 ** 14973 ** If we get a SQLITE_CORRUPT error, rerun the query after appending 14974 ** "ORDER BY rowid DESC" to the end. 14975 */ 14976 static int run_schema_dump_query( 14977 ShellState *p, 14978 const char *zQuery 14979 ){ 14980 int rc; 14981 char *zErr = 0; 14982 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr); 14983 if( rc==SQLITE_CORRUPT ){ 14984 char *zQ2; 14985 int len = strlen30(zQuery); 14986 raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n"); 14987 if( zErr ){ 14988 utf8_printf(p->out, "/****** %s ******/\n", zErr); 14989 sqlite3_free(zErr); 14990 zErr = 0; 14991 } 14992 zQ2 = malloc( len+100 ); 14993 if( zQ2==0 ) return rc; 14994 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery); 14995 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr); 14996 if( rc ){ 14997 utf8_printf(p->out, "/****** ERROR: %s ******/\n", zErr); 14998 }else{ 14999 rc = SQLITE_CORRUPT; 15000 } 15001 sqlite3_free(zErr); 15002 free(zQ2); 15003 } 15004 return rc; 15005 } 15006 15007 /* 15008 ** Text of help messages. 15009 ** 15010 ** The help text for each individual command begins with a line that starts 15011 ** with ".". Subsequent lines are supplimental information. 15012 ** 15013 ** There must be two or more spaces between the end of the command and the 15014 ** start of the description of what that command does. 15015 */ 15016 static const char *(azHelp[]) = { 15017 #if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE) 15018 ".archive ... Manage SQL archives", 15019 " Each command must have exactly one of the following options:", 15020 " -c, --create Create a new archive", 15021 " -u, --update Add or update files with changed mtime", 15022 " -i, --insert Like -u but always add even if unchanged", 15023 " -r, --remove Remove files from archive", 15024 " -t, --list List contents of archive", 15025 " -x, --extract Extract files from archive", 15026 " Optional arguments:", 15027 " -v, --verbose Print each filename as it is processed", 15028 " -f FILE, --file FILE Use archive FILE (default is current db)", 15029 " -a FILE, --append FILE Open FILE using the apndvfs VFS", 15030 " -C DIR, --directory DIR Read/extract files from directory DIR", 15031 " -g, --glob Use glob matching for names in archive", 15032 " -n, --dryrun Show the SQL that would have occurred", 15033 " Examples:", 15034 " .ar -cf ARCHIVE foo bar # Create ARCHIVE from files foo and bar", 15035 " .ar -tf ARCHIVE # List members of ARCHIVE", 15036 " .ar -xvf ARCHIVE # Verbosely extract files from ARCHIVE", 15037 " See also:", 15038 " http://sqlite.org/cli.html#sqlite_archive_support", 15039 #endif 15040 #ifndef SQLITE_OMIT_AUTHORIZATION 15041 ".auth ON|OFF Show authorizer callbacks", 15042 #endif 15043 ".backup ?DB? FILE Backup DB (default \"main\") to FILE", 15044 " --append Use the appendvfs", 15045 " --async Write to FILE without journal and fsync()", 15046 ".bail on|off Stop after hitting an error. Default OFF", 15047 ".binary on|off Turn binary output on or off. Default OFF", 15048 ".cd DIRECTORY Change the working directory to DIRECTORY", 15049 ".changes on|off Show number of rows changed by SQL", 15050 ".check GLOB Fail if output since .testcase does not match", 15051 ".clone NEWDB Clone data into NEWDB from the existing database", 15052 ".connection [close] [#] Open or close an auxiliary database connection", 15053 ".databases List names and files of attached databases", 15054 ".dbconfig ?op? ?val? List or change sqlite3_db_config() options", 15055 ".dbinfo ?DB? Show status information about the database", 15056 ".dump ?OBJECTS? Render database content as SQL", 15057 " Options:", 15058 " --data-only Output only INSERT statements", 15059 " --newlines Allow unescaped newline characters in output", 15060 " --nosys Omit system tables (ex: \"sqlite_stat1\")", 15061 " --preserve-rowids Include ROWID values in the output", 15062 " OBJECTS is a LIKE pattern for tables, indexes, triggers or views to dump", 15063 " Additional LIKE patterns can be given in subsequent arguments", 15064 ".echo on|off Turn command echo on or off", 15065 ".eqp on|off|full|... Enable or disable automatic EXPLAIN QUERY PLAN", 15066 " Other Modes:", 15067 #ifdef SQLITE_DEBUG 15068 " test Show raw EXPLAIN QUERY PLAN output", 15069 " trace Like \"full\" but enable \"PRAGMA vdbe_trace\"", 15070 #endif 15071 " trigger Like \"full\" but also show trigger bytecode", 15072 ".excel Display the output of next command in spreadsheet", 15073 " --bom Put a UTF8 byte-order mark on intermediate file", 15074 ".exit ?CODE? Exit this program with return-code CODE", 15075 ".expert EXPERIMENTAL. Suggest indexes for queries", 15076 ".explain ?on|off|auto? Change the EXPLAIN formatting mode. Default: auto", 15077 ".filectrl CMD ... Run various sqlite3_file_control() operations", 15078 " --schema SCHEMA Use SCHEMA instead of \"main\"", 15079 " --help Show CMD details", 15080 ".fullschema ?--indent? Show schema and the content of sqlite_stat tables", 15081 ".headers on|off Turn display of headers on or off", 15082 ".help ?-all? ?PATTERN? Show help text for PATTERN", 15083 ".import FILE TABLE Import data from FILE into TABLE", 15084 " Options:", 15085 " --ascii Use \\037 and \\036 as column and row separators", 15086 " --csv Use , and \\n as column and row separators", 15087 " --skip N Skip the first N rows of input", 15088 " -v \"Verbose\" - increase auxiliary output", 15089 " Notes:", 15090 " * If TABLE does not exist, it is created. The first row of input", 15091 " determines the column names.", 15092 " * If neither --csv or --ascii are used, the input mode is derived", 15093 " from the \".mode\" output mode", 15094 " * If FILE begins with \"|\" then it is a command that generates the", 15095 " input text.", 15096 #ifndef SQLITE_OMIT_TEST_CONTROL 15097 ".imposter INDEX TABLE Create imposter table TABLE on index INDEX", 15098 #endif 15099 ".indexes ?TABLE? Show names of indexes", 15100 " If TABLE is specified, only show indexes for", 15101 " tables matching TABLE using the LIKE operator.", 15102 #ifdef SQLITE_ENABLE_IOTRACE 15103 ".iotrace FILE Enable I/O diagnostic logging to FILE", 15104 #endif 15105 ".limit ?LIMIT? ?VAL? Display or change the value of an SQLITE_LIMIT", 15106 ".lint OPTIONS Report potential schema issues.", 15107 " Options:", 15108 " fkey-indexes Find missing foreign key indexes", 15109 #ifndef SQLITE_OMIT_LOAD_EXTENSION 15110 ".load FILE ?ENTRY? Load an extension library", 15111 #endif 15112 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout", 15113 ".mode MODE ?TABLE? Set output mode", 15114 " MODE is one of:", 15115 " ascii Columns/rows delimited by 0x1F and 0x1E", 15116 " box Tables using unicode box-drawing characters", 15117 " csv Comma-separated values", 15118 " column Output in columns. (See .width)", 15119 " html HTML <table> code", 15120 " insert SQL insert statements for TABLE", 15121 " json Results in a JSON array", 15122 " line One value per line", 15123 " list Values delimited by \"|\"", 15124 " markdown Markdown table format", 15125 " quote Escape answers as for SQL", 15126 " table ASCII-art table", 15127 " tabs Tab-separated values", 15128 " tcl TCL list elements", 15129 ".nonce STRING Disable safe mode for one command if the nonce matches", 15130 ".nullvalue STRING Use STRING in place of NULL values", 15131 ".once ?OPTIONS? ?FILE? Output for the next SQL command only to FILE", 15132 " If FILE begins with '|' then open as a pipe", 15133 " --bom Put a UTF8 byte-order mark at the beginning", 15134 " -e Send output to the system text editor", 15135 " -x Send output as CSV to a spreadsheet (same as \".excel\")", 15136 #ifdef SQLITE_DEBUG 15137 ".oom ?--repeat M? ?N? Simulate an OOM error on the N-th allocation", 15138 #endif 15139 ".open ?OPTIONS? ?FILE? Close existing database and reopen FILE", 15140 " Options:", 15141 " --append Use appendvfs to append database to the end of FILE", 15142 #ifndef SQLITE_OMIT_DESERIALIZE 15143 " --deserialize Load into memory using sqlite3_deserialize()", 15144 " --hexdb Load the output of \"dbtotxt\" as an in-memory db", 15145 " --maxsize N Maximum size for --hexdb or --deserialized database", 15146 #endif 15147 " --new Initialize FILE to an empty database", 15148 " --nofollow Do not follow symbolic links", 15149 " --readonly Open FILE readonly", 15150 " --zip FILE is a ZIP archive", 15151 ".output ?FILE? Send output to FILE or stdout if FILE is omitted", 15152 " If FILE begins with '|' then open it as a pipe.", 15153 " Options:", 15154 " --bom Prefix output with a UTF8 byte-order mark", 15155 " -e Send output to the system text editor", 15156 " -x Send output as CSV to a spreadsheet", 15157 ".parameter CMD ... Manage SQL parameter bindings", 15158 " clear Erase all bindings", 15159 " init Initialize the TEMP table that holds bindings", 15160 " list List the current parameter bindings", 15161 " set PARAMETER VALUE Given SQL parameter PARAMETER a value of VALUE", 15162 " PARAMETER should start with one of: $ : @ ?", 15163 " unset PARAMETER Remove PARAMETER from the binding table", 15164 ".print STRING... Print literal STRING", 15165 #ifndef SQLITE_OMIT_PROGRESS_CALLBACK 15166 ".progress N Invoke progress handler after every N opcodes", 15167 " --limit N Interrupt after N progress callbacks", 15168 " --once Do no more than one progress interrupt", 15169 " --quiet|-q No output except at interrupts", 15170 " --reset Reset the count for each input and interrupt", 15171 #endif 15172 ".prompt MAIN CONTINUE Replace the standard prompts", 15173 ".quit Exit this program", 15174 ".read FILE Read input from FILE", 15175 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) 15176 ".recover Recover as much data as possible from corrupt db.", 15177 " --freelist-corrupt Assume the freelist is corrupt", 15178 " --recovery-db NAME Store recovery metadata in database file NAME", 15179 " --lost-and-found TABLE Alternative name for the lost-and-found table", 15180 " --no-rowids Do not attempt to recover rowid values", 15181 " that are not also INTEGER PRIMARY KEYs", 15182 #endif 15183 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE", 15184 ".save FILE Write in-memory database into FILE", 15185 ".scanstats on|off Turn sqlite3_stmt_scanstatus() metrics on or off", 15186 ".schema ?PATTERN? Show the CREATE statements matching PATTERN", 15187 " Options:", 15188 " --indent Try to pretty-print the schema", 15189 " --nosys Omit objects whose names start with \"sqlite_\"", 15190 ".selftest ?OPTIONS? Run tests defined in the SELFTEST table", 15191 " Options:", 15192 " --init Create a new SELFTEST table", 15193 " -v Verbose output", 15194 ".separator COL ?ROW? Change the column and row separators", 15195 #if defined(SQLITE_ENABLE_SESSION) 15196 ".session ?NAME? CMD ... Create or control sessions", 15197 " Subcommands:", 15198 " attach TABLE Attach TABLE", 15199 " changeset FILE Write a changeset into FILE", 15200 " close Close one session", 15201 " enable ?BOOLEAN? Set or query the enable bit", 15202 " filter GLOB... Reject tables matching GLOBs", 15203 " indirect ?BOOLEAN? Mark or query the indirect status", 15204 " isempty Query whether the session is empty", 15205 " list List currently open session names", 15206 " open DB NAME Open a new session on DB", 15207 " patchset FILE Write a patchset into FILE", 15208 " If ?NAME? is omitted, the first defined session is used.", 15209 #endif 15210 ".sha3sum ... Compute a SHA3 hash of database content", 15211 " Options:", 15212 " --schema Also hash the sqlite_schema table", 15213 " --sha3-224 Use the sha3-224 algorithm", 15214 " --sha3-256 Use the sha3-256 algorithm (default)", 15215 " --sha3-384 Use the sha3-384 algorithm", 15216 " --sha3-512 Use the sha3-512 algorithm", 15217 " Any other argument is a LIKE pattern for tables to hash", 15218 #ifndef SQLITE_NOHAVE_SYSTEM 15219 ".shell CMD ARGS... Run CMD ARGS... in a system shell", 15220 #endif 15221 ".show Show the current values for various settings", 15222 ".stats ?ARG? Show stats or turn stats on or off", 15223 " off Turn off automatic stat display", 15224 " on Turn on automatic stat display", 15225 " stmt Show statement stats", 15226 " vmstep Show the virtual machine step count only", 15227 #ifndef SQLITE_NOHAVE_SYSTEM 15228 ".system CMD ARGS... Run CMD ARGS... in a system shell", 15229 #endif 15230 ".tables ?TABLE? List names of tables matching LIKE pattern TABLE", 15231 ".testcase NAME Begin redirecting output to 'testcase-out.txt'", 15232 ".testctrl CMD ... Run various sqlite3_test_control() operations", 15233 " Run \".testctrl\" with no arguments for details", 15234 ".timeout MS Try opening locked tables for MS milliseconds", 15235 ".timer on|off Turn SQL timer on or off", 15236 #ifndef SQLITE_OMIT_TRACE 15237 ".trace ?OPTIONS? Output each SQL statement as it is run", 15238 " FILE Send output to FILE", 15239 " stdout Send output to stdout", 15240 " stderr Send output to stderr", 15241 " off Disable tracing", 15242 " --expanded Expand query parameters", 15243 #ifdef SQLITE_ENABLE_NORMALIZE 15244 " --normalized Normal the SQL statements", 15245 #endif 15246 " --plain Show SQL as it is input", 15247 " --stmt Trace statement execution (SQLITE_TRACE_STMT)", 15248 " --profile Profile statements (SQLITE_TRACE_PROFILE)", 15249 " --row Trace each row (SQLITE_TRACE_ROW)", 15250 " --close Trace connection close (SQLITE_TRACE_CLOSE)", 15251 #endif /* SQLITE_OMIT_TRACE */ 15252 #ifdef SQLITE_DEBUG 15253 ".unmodule NAME ... Unregister virtual table modules", 15254 " --allexcept Unregister everything except those named", 15255 #endif 15256 ".vfsinfo ?AUX? Information about the top-level VFS", 15257 ".vfslist List all available VFSes", 15258 ".vfsname ?AUX? Print the name of the VFS stack", 15259 ".width NUM1 NUM2 ... Set minimum column widths for columnar output", 15260 " Negative values right-justify", 15261 }; 15262 15263 /* 15264 ** Output help text. 15265 ** 15266 ** zPattern describes the set of commands for which help text is provided. 15267 ** If zPattern is NULL, then show all commands, but only give a one-line 15268 ** description of each. 15269 ** 15270 ** Return the number of matches. 15271 */ 15272 static int showHelp(FILE *out, const char *zPattern){ 15273 int i = 0; 15274 int j = 0; 15275 int n = 0; 15276 char *zPat; 15277 if( zPattern==0 15278 || zPattern[0]=='0' 15279 || strcmp(zPattern,"-a")==0 15280 || strcmp(zPattern,"-all")==0 15281 || strcmp(zPattern,"--all")==0 15282 ){ 15283 /* Show all commands, but only one line per command */ 15284 if( zPattern==0 ) zPattern = ""; 15285 for(i=0; i<ArraySize(azHelp); i++){ 15286 if( azHelp[i][0]=='.' || zPattern[0] ){ 15287 utf8_printf(out, "%s\n", azHelp[i]); 15288 n++; 15289 } 15290 } 15291 }else{ 15292 /* Look for commands that for which zPattern is an exact prefix */ 15293 zPat = sqlite3_mprintf(".%s*", zPattern); 15294 for(i=0; i<ArraySize(azHelp); i++){ 15295 if( sqlite3_strglob(zPat, azHelp[i])==0 ){ 15296 utf8_printf(out, "%s\n", azHelp[i]); 15297 j = i+1; 15298 n++; 15299 } 15300 } 15301 sqlite3_free(zPat); 15302 if( n ){ 15303 if( n==1 ){ 15304 /* when zPattern is a prefix of exactly one command, then include the 15305 ** details of that command, which should begin at offset j */ 15306 while( j<ArraySize(azHelp)-1 && azHelp[j][0]!='.' ){ 15307 utf8_printf(out, "%s\n", azHelp[j]); 15308 j++; 15309 } 15310 } 15311 return n; 15312 } 15313 /* Look for commands that contain zPattern anywhere. Show the complete 15314 ** text of all commands that match. */ 15315 zPat = sqlite3_mprintf("%%%s%%", zPattern); 15316 for(i=0; i<ArraySize(azHelp); i++){ 15317 if( azHelp[i][0]=='.' ) j = i; 15318 if( sqlite3_strlike(zPat, azHelp[i], 0)==0 ){ 15319 utf8_printf(out, "%s\n", azHelp[j]); 15320 while( j<ArraySize(azHelp)-1 && azHelp[j+1][0]!='.' ){ 15321 j++; 15322 utf8_printf(out, "%s\n", azHelp[j]); 15323 } 15324 i = j; 15325 n++; 15326 } 15327 } 15328 sqlite3_free(zPat); 15329 } 15330 return n; 15331 } 15332 15333 /* Forward reference */ 15334 static int process_input(ShellState *p); 15335 15336 /* 15337 ** Read the content of file zName into memory obtained from sqlite3_malloc64() 15338 ** and return a pointer to the buffer. The caller is responsible for freeing 15339 ** the memory. 15340 ** 15341 ** If parameter pnByte is not NULL, (*pnByte) is set to the number of bytes 15342 ** read. 15343 ** 15344 ** For convenience, a nul-terminator byte is always appended to the data read 15345 ** from the file before the buffer is returned. This byte is not included in 15346 ** the final value of (*pnByte), if applicable. 15347 ** 15348 ** NULL is returned if any error is encountered. The final value of *pnByte 15349 ** is undefined in this case. 15350 */ 15351 static char *readFile(const char *zName, int *pnByte){ 15352 FILE *in = fopen(zName, "rb"); 15353 long nIn; 15354 size_t nRead; 15355 char *pBuf; 15356 if( in==0 ) return 0; 15357 fseek(in, 0, SEEK_END); 15358 nIn = ftell(in); 15359 rewind(in); 15360 pBuf = sqlite3_malloc64( nIn+1 ); 15361 if( pBuf==0 ){ fclose(in); return 0; } 15362 nRead = fread(pBuf, nIn, 1, in); 15363 fclose(in); 15364 if( nRead!=1 ){ 15365 sqlite3_free(pBuf); 15366 return 0; 15367 } 15368 pBuf[nIn] = 0; 15369 if( pnByte ) *pnByte = nIn; 15370 return pBuf; 15371 } 15372 15373 #if defined(SQLITE_ENABLE_SESSION) 15374 /* 15375 ** Close a single OpenSession object and release all of its associated 15376 ** resources. 15377 */ 15378 static void session_close(OpenSession *pSession){ 15379 int i; 15380 sqlite3session_delete(pSession->p); 15381 sqlite3_free(pSession->zName); 15382 for(i=0; i<pSession->nFilter; i++){ 15383 sqlite3_free(pSession->azFilter[i]); 15384 } 15385 sqlite3_free(pSession->azFilter); 15386 memset(pSession, 0, sizeof(OpenSession)); 15387 } 15388 #endif 15389 15390 /* 15391 ** Close all OpenSession objects and release all associated resources. 15392 */ 15393 #if defined(SQLITE_ENABLE_SESSION) 15394 static void session_close_all(ShellState *p, int i){ 15395 int j; 15396 struct AuxDb *pAuxDb = i<0 ? p->pAuxDb : &p->aAuxDb[i]; 15397 for(j=0; j<pAuxDb->nSession; j++){ 15398 session_close(&pAuxDb->aSession[j]); 15399 } 15400 pAuxDb->nSession = 0; 15401 } 15402 #else 15403 # define session_close_all(X,Y) 15404 #endif 15405 15406 /* 15407 ** Implementation of the xFilter function for an open session. Omit 15408 ** any tables named by ".session filter" but let all other table through. 15409 */ 15410 #if defined(SQLITE_ENABLE_SESSION) 15411 static int session_filter(void *pCtx, const char *zTab){ 15412 OpenSession *pSession = (OpenSession*)pCtx; 15413 int i; 15414 for(i=0; i<pSession->nFilter; i++){ 15415 if( sqlite3_strglob(pSession->azFilter[i], zTab)==0 ) return 0; 15416 } 15417 return 1; 15418 } 15419 #endif 15420 15421 /* 15422 ** Try to deduce the type of file for zName based on its content. Return 15423 ** one of the SHELL_OPEN_* constants. 15424 ** 15425 ** If the file does not exist or is empty but its name looks like a ZIP 15426 ** archive and the dfltZip flag is true, then assume it is a ZIP archive. 15427 ** Otherwise, assume an ordinary database regardless of the filename if 15428 ** the type cannot be determined from content. 15429 */ 15430 int deduceDatabaseType(const char *zName, int dfltZip){ 15431 FILE *f = fopen(zName, "rb"); 15432 size_t n; 15433 int rc = SHELL_OPEN_UNSPEC; 15434 char zBuf[100]; 15435 if( f==0 ){ 15436 if( dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){ 15437 return SHELL_OPEN_ZIPFILE; 15438 }else{ 15439 return SHELL_OPEN_NORMAL; 15440 } 15441 } 15442 n = fread(zBuf, 16, 1, f); 15443 if( n==1 && memcmp(zBuf, "SQLite format 3", 16)==0 ){ 15444 fclose(f); 15445 return SHELL_OPEN_NORMAL; 15446 } 15447 fseek(f, -25, SEEK_END); 15448 n = fread(zBuf, 25, 1, f); 15449 if( n==1 && memcmp(zBuf, "Start-Of-SQLite3-", 17)==0 ){ 15450 rc = SHELL_OPEN_APPENDVFS; 15451 }else{ 15452 fseek(f, -22, SEEK_END); 15453 n = fread(zBuf, 22, 1, f); 15454 if( n==1 && zBuf[0]==0x50 && zBuf[1]==0x4b && zBuf[2]==0x05 15455 && zBuf[3]==0x06 ){ 15456 rc = SHELL_OPEN_ZIPFILE; 15457 }else if( n==0 && dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){ 15458 rc = SHELL_OPEN_ZIPFILE; 15459 } 15460 } 15461 fclose(f); 15462 return rc; 15463 } 15464 15465 #ifndef SQLITE_OMIT_DESERIALIZE 15466 /* 15467 ** Reconstruct an in-memory database using the output from the "dbtotxt" 15468 ** program. Read content from the file in p->aAuxDb[].zDbFilename. 15469 ** If p->aAuxDb[].zDbFilename is 0, then read from standard input. 15470 */ 15471 static unsigned char *readHexDb(ShellState *p, int *pnData){ 15472 unsigned char *a = 0; 15473 int nLine; 15474 int n = 0; 15475 int pgsz = 0; 15476 int iOffset = 0; 15477 int j, k; 15478 int rc; 15479 FILE *in; 15480 const char *zDbFilename = p->pAuxDb->zDbFilename; 15481 unsigned int x[16]; 15482 char zLine[1000]; 15483 if( zDbFilename ){ 15484 in = fopen(zDbFilename, "r"); 15485 if( in==0 ){ 15486 utf8_printf(stderr, "cannot open \"%s\" for reading\n", zDbFilename); 15487 return 0; 15488 } 15489 nLine = 0; 15490 }else{ 15491 in = p->in; 15492 nLine = p->lineno; 15493 if( in==0 ) in = stdin; 15494 } 15495 *pnData = 0; 15496 nLine++; 15497 if( fgets(zLine, sizeof(zLine), in)==0 ) goto readHexDb_error; 15498 rc = sscanf(zLine, "| size %d pagesize %d", &n, &pgsz); 15499 if( rc!=2 ) goto readHexDb_error; 15500 if( n<0 ) goto readHexDb_error; 15501 if( pgsz<512 || pgsz>65536 || (pgsz&(pgsz-1))!=0 ) goto readHexDb_error; 15502 n = (n+pgsz-1)&~(pgsz-1); /* Round n up to the next multiple of pgsz */ 15503 a = sqlite3_malloc( n ? n : 1 ); 15504 if( a==0 ){ 15505 utf8_printf(stderr, "Out of memory!\n"); 15506 goto readHexDb_error; 15507 } 15508 memset(a, 0, n); 15509 if( pgsz<512 || pgsz>65536 || (pgsz & (pgsz-1))!=0 ){ 15510 utf8_printf(stderr, "invalid pagesize\n"); 15511 goto readHexDb_error; 15512 } 15513 for(nLine++; fgets(zLine, sizeof(zLine), in)!=0; nLine++){ 15514 rc = sscanf(zLine, "| page %d offset %d", &j, &k); 15515 if( rc==2 ){ 15516 iOffset = k; 15517 continue; 15518 } 15519 if( strncmp(zLine, "| end ", 6)==0 ){ 15520 break; 15521 } 15522 rc = sscanf(zLine,"| %d: %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x", 15523 &j, &x[0], &x[1], &x[2], &x[3], &x[4], &x[5], &x[6], &x[7], 15524 &x[8], &x[9], &x[10], &x[11], &x[12], &x[13], &x[14], &x[15]); 15525 if( rc==17 ){ 15526 k = iOffset+j; 15527 if( k+16<=n && k>=0 ){ 15528 int ii; 15529 for(ii=0; ii<16; ii++) a[k+ii] = x[ii]&0xff; 15530 } 15531 } 15532 } 15533 *pnData = n; 15534 if( in!=p->in ){ 15535 fclose(in); 15536 }else{ 15537 p->lineno = nLine; 15538 } 15539 return a; 15540 15541 readHexDb_error: 15542 if( in!=p->in ){ 15543 fclose(in); 15544 }else{ 15545 while( fgets(zLine, sizeof(zLine), p->in)!=0 ){ 15546 nLine++; 15547 if(strncmp(zLine, "| end ", 6)==0 ) break; 15548 } 15549 p->lineno = nLine; 15550 } 15551 sqlite3_free(a); 15552 utf8_printf(stderr,"Error on line %d of --hexdb input\n", nLine); 15553 return 0; 15554 } 15555 #endif /* SQLITE_OMIT_DESERIALIZE */ 15556 15557 /* 15558 ** Scalar function "shell_int32". The first argument to this function 15559 ** must be a blob. The second a non-negative integer. This function 15560 ** reads and returns a 32-bit big-endian integer from byte 15561 ** offset (4*<arg2>) of the blob. 15562 */ 15563 static void shellInt32( 15564 sqlite3_context *context, 15565 int argc, 15566 sqlite3_value **argv 15567 ){ 15568 const unsigned char *pBlob; 15569 int nBlob; 15570 int iInt; 15571 15572 UNUSED_PARAMETER(argc); 15573 nBlob = sqlite3_value_bytes(argv[0]); 15574 pBlob = (const unsigned char*)sqlite3_value_blob(argv[0]); 15575 iInt = sqlite3_value_int(argv[1]); 15576 15577 if( iInt>=0 && (iInt+1)*4<=nBlob ){ 15578 const unsigned char *a = &pBlob[iInt*4]; 15579 sqlite3_int64 iVal = ((sqlite3_int64)a[0]<<24) 15580 + ((sqlite3_int64)a[1]<<16) 15581 + ((sqlite3_int64)a[2]<< 8) 15582 + ((sqlite3_int64)a[3]<< 0); 15583 sqlite3_result_int64(context, iVal); 15584 } 15585 } 15586 15587 /* 15588 ** Scalar function "shell_idquote(X)" returns string X quoted as an identifier, 15589 ** using "..." with internal double-quote characters doubled. 15590 */ 15591 static void shellIdQuote( 15592 sqlite3_context *context, 15593 int argc, 15594 sqlite3_value **argv 15595 ){ 15596 const char *zName = (const char*)sqlite3_value_text(argv[0]); 15597 UNUSED_PARAMETER(argc); 15598 if( zName ){ 15599 char *z = sqlite3_mprintf("\"%w\"", zName); 15600 sqlite3_result_text(context, z, -1, sqlite3_free); 15601 } 15602 } 15603 15604 /* 15605 ** Scalar function "usleep(X)" invokes sqlite3_sleep(X) and returns X. 15606 */ 15607 static void shellUSleepFunc( 15608 sqlite3_context *context, 15609 int argcUnused, 15610 sqlite3_value **argv 15611 ){ 15612 int sleep = sqlite3_value_int(argv[0]); 15613 (void)argcUnused; 15614 sqlite3_sleep(sleep/1000); 15615 sqlite3_result_int(context, sleep); 15616 } 15617 15618 /* 15619 ** Scalar function "shell_escape_crnl" used by the .recover command. 15620 ** The argument passed to this function is the output of built-in 15621 ** function quote(). If the first character of the input is "'", 15622 ** indicating that the value passed to quote() was a text value, 15623 ** then this function searches the input for "\n" and "\r" characters 15624 ** and adds a wrapper similar to the following: 15625 ** 15626 ** replace(replace(<input>, '\n', char(10), '\r', char(13)); 15627 ** 15628 ** Or, if the first character of the input is not "'", then a copy 15629 ** of the input is returned. 15630 */ 15631 static void shellEscapeCrnl( 15632 sqlite3_context *context, 15633 int argc, 15634 sqlite3_value **argv 15635 ){ 15636 const char *zText = (const char*)sqlite3_value_text(argv[0]); 15637 UNUSED_PARAMETER(argc); 15638 if( zText[0]=='\'' ){ 15639 int nText = sqlite3_value_bytes(argv[0]); 15640 int i; 15641 char zBuf1[20]; 15642 char zBuf2[20]; 15643 const char *zNL = 0; 15644 const char *zCR = 0; 15645 int nCR = 0; 15646 int nNL = 0; 15647 15648 for(i=0; zText[i]; i++){ 15649 if( zNL==0 && zText[i]=='\n' ){ 15650 zNL = unused_string(zText, "\\n", "\\012", zBuf1); 15651 nNL = (int)strlen(zNL); 15652 } 15653 if( zCR==0 && zText[i]=='\r' ){ 15654 zCR = unused_string(zText, "\\r", "\\015", zBuf2); 15655 nCR = (int)strlen(zCR); 15656 } 15657 } 15658 15659 if( zNL || zCR ){ 15660 int iOut = 0; 15661 i64 nMax = (nNL > nCR) ? nNL : nCR; 15662 i64 nAlloc = nMax * nText + (nMax+64)*2; 15663 char *zOut = (char*)sqlite3_malloc64(nAlloc); 15664 if( zOut==0 ){ 15665 sqlite3_result_error_nomem(context); 15666 return; 15667 } 15668 15669 if( zNL && zCR ){ 15670 memcpy(&zOut[iOut], "replace(replace(", 16); 15671 iOut += 16; 15672 }else{ 15673 memcpy(&zOut[iOut], "replace(", 8); 15674 iOut += 8; 15675 } 15676 for(i=0; zText[i]; i++){ 15677 if( zText[i]=='\n' ){ 15678 memcpy(&zOut[iOut], zNL, nNL); 15679 iOut += nNL; 15680 }else if( zText[i]=='\r' ){ 15681 memcpy(&zOut[iOut], zCR, nCR); 15682 iOut += nCR; 15683 }else{ 15684 zOut[iOut] = zText[i]; 15685 iOut++; 15686 } 15687 } 15688 15689 if( zNL ){ 15690 memcpy(&zOut[iOut], ",'", 2); iOut += 2; 15691 memcpy(&zOut[iOut], zNL, nNL); iOut += nNL; 15692 memcpy(&zOut[iOut], "', char(10))", 12); iOut += 12; 15693 } 15694 if( zCR ){ 15695 memcpy(&zOut[iOut], ",'", 2); iOut += 2; 15696 memcpy(&zOut[iOut], zCR, nCR); iOut += nCR; 15697 memcpy(&zOut[iOut], "', char(13))", 12); iOut += 12; 15698 } 15699 15700 sqlite3_result_text(context, zOut, iOut, SQLITE_TRANSIENT); 15701 sqlite3_free(zOut); 15702 return; 15703 } 15704 } 15705 15706 sqlite3_result_value(context, argv[0]); 15707 } 15708 15709 /* Flags for open_db(). 15710 ** 15711 ** The default behavior of open_db() is to exit(1) if the database fails to 15712 ** open. The OPEN_DB_KEEPALIVE flag changes that so that it prints an error 15713 ** but still returns without calling exit. 15714 ** 15715 ** The OPEN_DB_ZIPFILE flag causes open_db() to prefer to open files as a 15716 ** ZIP archive if the file does not exist or is empty and its name matches 15717 ** the *.zip pattern. 15718 */ 15719 #define OPEN_DB_KEEPALIVE 0x001 /* Return after error if true */ 15720 #define OPEN_DB_ZIPFILE 0x002 /* Open as ZIP if name matches *.zip */ 15721 15722 /* 15723 ** Make sure the database is open. If it is not, then open it. If 15724 ** the database fails to open, print an error message and exit. 15725 */ 15726 static void open_db(ShellState *p, int openFlags){ 15727 if( p->db==0 ){ 15728 const char *zDbFilename = p->pAuxDb->zDbFilename; 15729 if( p->openMode==SHELL_OPEN_UNSPEC ){ 15730 if( zDbFilename==0 || zDbFilename[0]==0 ){ 15731 p->openMode = SHELL_OPEN_NORMAL; 15732 }else{ 15733 p->openMode = (u8)deduceDatabaseType(zDbFilename, 15734 (openFlags & OPEN_DB_ZIPFILE)!=0); 15735 } 15736 } 15737 switch( p->openMode ){ 15738 case SHELL_OPEN_APPENDVFS: { 15739 sqlite3_open_v2(zDbFilename, &p->db, 15740 SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, "apndvfs"); 15741 break; 15742 } 15743 case SHELL_OPEN_HEXDB: 15744 case SHELL_OPEN_DESERIALIZE: { 15745 sqlite3_open(0, &p->db); 15746 break; 15747 } 15748 case SHELL_OPEN_ZIPFILE: { 15749 sqlite3_open(":memory:", &p->db); 15750 break; 15751 } 15752 case SHELL_OPEN_READONLY: { 15753 sqlite3_open_v2(zDbFilename, &p->db, 15754 SQLITE_OPEN_READONLY|p->openFlags, 0); 15755 break; 15756 } 15757 case SHELL_OPEN_UNSPEC: 15758 case SHELL_OPEN_NORMAL: { 15759 sqlite3_open_v2(zDbFilename, &p->db, 15760 SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, 0); 15761 break; 15762 } 15763 } 15764 globalDb = p->db; 15765 if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){ 15766 utf8_printf(stderr,"Error: unable to open database \"%s\": %s\n", 15767 zDbFilename, sqlite3_errmsg(p->db)); 15768 if( openFlags & OPEN_DB_KEEPALIVE ){ 15769 sqlite3_open(":memory:", &p->db); 15770 return; 15771 } 15772 exit(1); 15773 } 15774 #ifndef SQLITE_OMIT_LOAD_EXTENSION 15775 sqlite3_enable_load_extension(p->db, 1); 15776 #endif 15777 sqlite3_fileio_init(p->db, 0, 0); 15778 sqlite3_shathree_init(p->db, 0, 0); 15779 sqlite3_completion_init(p->db, 0, 0); 15780 sqlite3_uint_init(p->db, 0, 0); 15781 sqlite3_decimal_init(p->db, 0, 0); 15782 sqlite3_regexp_init(p->db, 0, 0); 15783 sqlite3_ieee_init(p->db, 0, 0); 15784 sqlite3_series_init(p->db, 0, 0); 15785 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) 15786 sqlite3_dbdata_init(p->db, 0, 0); 15787 #endif 15788 #ifdef SQLITE_HAVE_ZLIB 15789 sqlite3_zipfile_init(p->db, 0, 0); 15790 sqlite3_sqlar_init(p->db, 0, 0); 15791 #endif 15792 sqlite3_create_function(p->db, "shell_add_schema", 3, SQLITE_UTF8, 0, 15793 shellAddSchemaName, 0, 0); 15794 sqlite3_create_function(p->db, "shell_module_schema", 1, SQLITE_UTF8, 0, 15795 shellModuleSchema, 0, 0); 15796 sqlite3_create_function(p->db, "shell_putsnl", 1, SQLITE_UTF8, p, 15797 shellPutsFunc, 0, 0); 15798 sqlite3_create_function(p->db, "shell_escape_crnl", 1, SQLITE_UTF8, 0, 15799 shellEscapeCrnl, 0, 0); 15800 sqlite3_create_function(p->db, "shell_int32", 2, SQLITE_UTF8, 0, 15801 shellInt32, 0, 0); 15802 sqlite3_create_function(p->db, "shell_idquote", 1, SQLITE_UTF8, 0, 15803 shellIdQuote, 0, 0); 15804 sqlite3_create_function(p->db, "usleep",1,SQLITE_UTF8,0, 15805 shellUSleepFunc, 0, 0); 15806 #ifndef SQLITE_NOHAVE_SYSTEM 15807 sqlite3_create_function(p->db, "edit", 1, SQLITE_UTF8, 0, 15808 editFunc, 0, 0); 15809 sqlite3_create_function(p->db, "edit", 2, SQLITE_UTF8, 0, 15810 editFunc, 0, 0); 15811 #endif 15812 if( p->openMode==SHELL_OPEN_ZIPFILE ){ 15813 char *zSql = sqlite3_mprintf( 15814 "CREATE VIRTUAL TABLE zip USING zipfile(%Q);", zDbFilename); 15815 sqlite3_exec(p->db, zSql, 0, 0, 0); 15816 sqlite3_free(zSql); 15817 } 15818 #ifndef SQLITE_OMIT_DESERIALIZE 15819 else 15820 if( p->openMode==SHELL_OPEN_DESERIALIZE || p->openMode==SHELL_OPEN_HEXDB ){ 15821 int rc; 15822 int nData = 0; 15823 unsigned char *aData; 15824 if( p->openMode==SHELL_OPEN_DESERIALIZE ){ 15825 aData = (unsigned char*)readFile(zDbFilename, &nData); 15826 }else{ 15827 aData = readHexDb(p, &nData); 15828 if( aData==0 ){ 15829 return; 15830 } 15831 } 15832 rc = sqlite3_deserialize(p->db, "main", aData, nData, nData, 15833 SQLITE_DESERIALIZE_RESIZEABLE | 15834 SQLITE_DESERIALIZE_FREEONCLOSE); 15835 if( rc ){ 15836 utf8_printf(stderr, "Error: sqlite3_deserialize() returns %d\n", rc); 15837 } 15838 if( p->szMax>0 ){ 15839 sqlite3_file_control(p->db, "main", SQLITE_FCNTL_SIZE_LIMIT, &p->szMax); 15840 } 15841 } 15842 #endif 15843 } 15844 if( p->bSafeModePersist && p->db!=0 ){ 15845 sqlite3_set_authorizer(p->db, safeModeAuth, p); 15846 } 15847 } 15848 15849 /* 15850 ** Attempt to close the databaes connection. Report errors. 15851 */ 15852 void close_db(sqlite3 *db){ 15853 int rc = sqlite3_close(db); 15854 if( rc ){ 15855 utf8_printf(stderr, "Error: sqlite3_close() returns %d: %s\n", 15856 rc, sqlite3_errmsg(db)); 15857 } 15858 } 15859 15860 #if HAVE_READLINE || HAVE_EDITLINE 15861 /* 15862 ** Readline completion callbacks 15863 */ 15864 static char *readline_completion_generator(const char *text, int state){ 15865 static sqlite3_stmt *pStmt = 0; 15866 char *zRet; 15867 if( state==0 ){ 15868 char *zSql; 15869 sqlite3_finalize(pStmt); 15870 zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase" 15871 " FROM completion(%Q) ORDER BY 1", text); 15872 sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0); 15873 sqlite3_free(zSql); 15874 } 15875 if( sqlite3_step(pStmt)==SQLITE_ROW ){ 15876 zRet = strdup((const char*)sqlite3_column_text(pStmt, 0)); 15877 }else{ 15878 sqlite3_finalize(pStmt); 15879 pStmt = 0; 15880 zRet = 0; 15881 } 15882 return zRet; 15883 } 15884 static char **readline_completion(const char *zText, int iStart, int iEnd){ 15885 rl_attempted_completion_over = 1; 15886 return rl_completion_matches(zText, readline_completion_generator); 15887 } 15888 15889 #elif HAVE_LINENOISE 15890 /* 15891 ** Linenoise completion callback 15892 */ 15893 static void linenoise_completion(const char *zLine, linenoiseCompletions *lc){ 15894 int nLine = strlen30(zLine); 15895 int i, iStart; 15896 sqlite3_stmt *pStmt = 0; 15897 char *zSql; 15898 char zBuf[1000]; 15899 15900 if( nLine>sizeof(zBuf)-30 ) return; 15901 if( zLine[0]=='.' || zLine[0]=='#') return; 15902 for(i=nLine-1; i>=0 && (isalnum(zLine[i]) || zLine[i]=='_'); i--){} 15903 if( i==nLine-1 ) return; 15904 iStart = i+1; 15905 memcpy(zBuf, zLine, iStart); 15906 zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase" 15907 " FROM completion(%Q,%Q) ORDER BY 1", 15908 &zLine[iStart], zLine); 15909 sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0); 15910 sqlite3_free(zSql); 15911 sqlite3_exec(globalDb, "PRAGMA page_count", 0, 0, 0); /* Load the schema */ 15912 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 15913 const char *zCompletion = (const char*)sqlite3_column_text(pStmt, 0); 15914 int nCompletion = sqlite3_column_bytes(pStmt, 0); 15915 if( iStart+nCompletion < sizeof(zBuf)-1 ){ 15916 memcpy(zBuf+iStart, zCompletion, nCompletion+1); 15917 linenoiseAddCompletion(lc, zBuf); 15918 } 15919 } 15920 sqlite3_finalize(pStmt); 15921 } 15922 #endif 15923 15924 /* 15925 ** Do C-language style dequoting. 15926 ** 15927 ** \a -> alarm 15928 ** \b -> backspace 15929 ** \t -> tab 15930 ** \n -> newline 15931 ** \v -> vertical tab 15932 ** \f -> form feed 15933 ** \r -> carriage return 15934 ** \s -> space 15935 ** \" -> " 15936 ** \' -> ' 15937 ** \\ -> backslash 15938 ** \NNN -> ascii character NNN in octal 15939 */ 15940 static void resolve_backslashes(char *z){ 15941 int i, j; 15942 char c; 15943 while( *z && *z!='\\' ) z++; 15944 for(i=j=0; (c = z[i])!=0; i++, j++){ 15945 if( c=='\\' && z[i+1]!=0 ){ 15946 c = z[++i]; 15947 if( c=='a' ){ 15948 c = '\a'; 15949 }else if( c=='b' ){ 15950 c = '\b'; 15951 }else if( c=='t' ){ 15952 c = '\t'; 15953 }else if( c=='n' ){ 15954 c = '\n'; 15955 }else if( c=='v' ){ 15956 c = '\v'; 15957 }else if( c=='f' ){ 15958 c = '\f'; 15959 }else if( c=='r' ){ 15960 c = '\r'; 15961 }else if( c=='"' ){ 15962 c = '"'; 15963 }else if( c=='\'' ){ 15964 c = '\''; 15965 }else if( c=='\\' ){ 15966 c = '\\'; 15967 }else if( c>='0' && c<='7' ){ 15968 c -= '0'; 15969 if( z[i+1]>='0' && z[i+1]<='7' ){ 15970 i++; 15971 c = (c<<3) + z[i] - '0'; 15972 if( z[i+1]>='0' && z[i+1]<='7' ){ 15973 i++; 15974 c = (c<<3) + z[i] - '0'; 15975 } 15976 } 15977 } 15978 } 15979 z[j] = c; 15980 } 15981 if( j<i ) z[j] = 0; 15982 } 15983 15984 /* 15985 ** Interpret zArg as either an integer or a boolean value. Return 1 or 0 15986 ** for TRUE and FALSE. Return the integer value if appropriate. 15987 */ 15988 static int booleanValue(const char *zArg){ 15989 int i; 15990 if( zArg[0]=='0' && zArg[1]=='x' ){ 15991 for(i=2; hexDigitValue(zArg[i])>=0; i++){} 15992 }else{ 15993 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){} 15994 } 15995 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff); 15996 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){ 15997 return 1; 15998 } 15999 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){ 16000 return 0; 16001 } 16002 utf8_printf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n", 16003 zArg); 16004 return 0; 16005 } 16006 16007 /* 16008 ** Set or clear a shell flag according to a boolean value. 16009 */ 16010 static void setOrClearFlag(ShellState *p, unsigned mFlag, const char *zArg){ 16011 if( booleanValue(zArg) ){ 16012 ShellSetFlag(p, mFlag); 16013 }else{ 16014 ShellClearFlag(p, mFlag); 16015 } 16016 } 16017 16018 /* 16019 ** Close an output file, assuming it is not stderr or stdout 16020 */ 16021 static void output_file_close(FILE *f){ 16022 if( f && f!=stdout && f!=stderr ) fclose(f); 16023 } 16024 16025 /* 16026 ** Try to open an output file. The names "stdout" and "stderr" are 16027 ** recognized and do the right thing. NULL is returned if the output 16028 ** filename is "off". 16029 */ 16030 static FILE *output_file_open(const char *zFile, int bTextMode){ 16031 FILE *f; 16032 if( strcmp(zFile,"stdout")==0 ){ 16033 f = stdout; 16034 }else if( strcmp(zFile, "stderr")==0 ){ 16035 f = stderr; 16036 }else if( strcmp(zFile, "off")==0 ){ 16037 f = 0; 16038 }else{ 16039 f = fopen(zFile, bTextMode ? "w" : "wb"); 16040 if( f==0 ){ 16041 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile); 16042 } 16043 } 16044 return f; 16045 } 16046 16047 #ifndef SQLITE_OMIT_TRACE 16048 /* 16049 ** A routine for handling output from sqlite3_trace(). 16050 */ 16051 static int sql_trace_callback( 16052 unsigned mType, /* The trace type */ 16053 void *pArg, /* The ShellState pointer */ 16054 void *pP, /* Usually a pointer to sqlite_stmt */ 16055 void *pX /* Auxiliary output */ 16056 ){ 16057 ShellState *p = (ShellState*)pArg; 16058 sqlite3_stmt *pStmt; 16059 const char *zSql; 16060 int nSql; 16061 if( p->traceOut==0 ) return 0; 16062 if( mType==SQLITE_TRACE_CLOSE ){ 16063 utf8_printf(p->traceOut, "-- closing database connection\n"); 16064 return 0; 16065 } 16066 if( mType!=SQLITE_TRACE_ROW && ((const char*)pX)[0]=='-' ){ 16067 zSql = (const char*)pX; 16068 }else{ 16069 pStmt = (sqlite3_stmt*)pP; 16070 switch( p->eTraceType ){ 16071 case SHELL_TRACE_EXPANDED: { 16072 zSql = sqlite3_expanded_sql(pStmt); 16073 break; 16074 } 16075 #ifdef SQLITE_ENABLE_NORMALIZE 16076 case SHELL_TRACE_NORMALIZED: { 16077 zSql = sqlite3_normalized_sql(pStmt); 16078 break; 16079 } 16080 #endif 16081 default: { 16082 zSql = sqlite3_sql(pStmt); 16083 break; 16084 } 16085 } 16086 } 16087 if( zSql==0 ) return 0; 16088 nSql = strlen30(zSql); 16089 while( nSql>0 && zSql[nSql-1]==';' ){ nSql--; } 16090 switch( mType ){ 16091 case SQLITE_TRACE_ROW: 16092 case SQLITE_TRACE_STMT: { 16093 utf8_printf(p->traceOut, "%.*s;\n", nSql, zSql); 16094 break; 16095 } 16096 case SQLITE_TRACE_PROFILE: { 16097 sqlite3_int64 nNanosec = *(sqlite3_int64*)pX; 16098 utf8_printf(p->traceOut, "%.*s; -- %lld ns\n", nSql, zSql, nNanosec); 16099 break; 16100 } 16101 } 16102 return 0; 16103 } 16104 #endif 16105 16106 /* 16107 ** A no-op routine that runs with the ".breakpoint" doc-command. This is 16108 ** a useful spot to set a debugger breakpoint. 16109 */ 16110 static void test_breakpoint(void){ 16111 static int nCall = 0; 16112 nCall++; 16113 } 16114 16115 /* 16116 ** An object used to read a CSV and other files for import. 16117 */ 16118 typedef struct ImportCtx ImportCtx; 16119 struct ImportCtx { 16120 const char *zFile; /* Name of the input file */ 16121 FILE *in; /* Read the CSV text from this input stream */ 16122 int (SQLITE_CDECL *xCloser)(FILE*); /* Func to close in */ 16123 char *z; /* Accumulated text for a field */ 16124 int n; /* Number of bytes in z */ 16125 int nAlloc; /* Space allocated for z[] */ 16126 int nLine; /* Current line number */ 16127 int nRow; /* Number of rows imported */ 16128 int nErr; /* Number of errors encountered */ 16129 int bNotFirst; /* True if one or more bytes already read */ 16130 int cTerm; /* Character that terminated the most recent field */ 16131 int cColSep; /* The column separator character. (Usually ",") */ 16132 int cRowSep; /* The row separator character. (Usually "\n") */ 16133 }; 16134 16135 /* Clean up resourced used by an ImportCtx */ 16136 static void import_cleanup(ImportCtx *p){ 16137 if( p->in!=0 && p->xCloser!=0 ){ 16138 p->xCloser(p->in); 16139 p->in = 0; 16140 } 16141 sqlite3_free(p->z); 16142 p->z = 0; 16143 } 16144 16145 /* Append a single byte to z[] */ 16146 static void import_append_char(ImportCtx *p, int c){ 16147 if( p->n+1>=p->nAlloc ){ 16148 p->nAlloc += p->nAlloc + 100; 16149 p->z = sqlite3_realloc64(p->z, p->nAlloc); 16150 if( p->z==0 ) shell_out_of_memory(); 16151 } 16152 p->z[p->n++] = (char)c; 16153 } 16154 16155 /* Read a single field of CSV text. Compatible with rfc4180 and extended 16156 ** with the option of having a separator other than ",". 16157 ** 16158 ** + Input comes from p->in. 16159 ** + Store results in p->z of length p->n. Space to hold p->z comes 16160 ** from sqlite3_malloc64(). 16161 ** + Use p->cSep as the column separator. The default is ",". 16162 ** + Use p->rSep as the row separator. The default is "\n". 16163 ** + Keep track of the line number in p->nLine. 16164 ** + Store the character that terminates the field in p->cTerm. Store 16165 ** EOF on end-of-file. 16166 ** + Report syntax errors on stderr 16167 */ 16168 static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){ 16169 int c; 16170 int cSep = p->cColSep; 16171 int rSep = p->cRowSep; 16172 p->n = 0; 16173 c = fgetc(p->in); 16174 if( c==EOF || seenInterrupt ){ 16175 p->cTerm = EOF; 16176 return 0; 16177 } 16178 if( c=='"' ){ 16179 int pc, ppc; 16180 int startLine = p->nLine; 16181 int cQuote = c; 16182 pc = ppc = 0; 16183 while( 1 ){ 16184 c = fgetc(p->in); 16185 if( c==rSep ) p->nLine++; 16186 if( c==cQuote ){ 16187 if( pc==cQuote ){ 16188 pc = 0; 16189 continue; 16190 } 16191 } 16192 if( (c==cSep && pc==cQuote) 16193 || (c==rSep && pc==cQuote) 16194 || (c==rSep && pc=='\r' && ppc==cQuote) 16195 || (c==EOF && pc==cQuote) 16196 ){ 16197 do{ p->n--; }while( p->z[p->n]!=cQuote ); 16198 p->cTerm = c; 16199 break; 16200 } 16201 if( pc==cQuote && c!='\r' ){ 16202 utf8_printf(stderr, "%s:%d: unescaped %c character\n", 16203 p->zFile, p->nLine, cQuote); 16204 } 16205 if( c==EOF ){ 16206 utf8_printf(stderr, "%s:%d: unterminated %c-quoted field\n", 16207 p->zFile, startLine, cQuote); 16208 p->cTerm = c; 16209 break; 16210 } 16211 import_append_char(p, c); 16212 ppc = pc; 16213 pc = c; 16214 } 16215 }else{ 16216 /* If this is the first field being parsed and it begins with the 16217 ** UTF-8 BOM (0xEF BB BF) then skip the BOM */ 16218 if( (c&0xff)==0xef && p->bNotFirst==0 ){ 16219 import_append_char(p, c); 16220 c = fgetc(p->in); 16221 if( (c&0xff)==0xbb ){ 16222 import_append_char(p, c); 16223 c = fgetc(p->in); 16224 if( (c&0xff)==0xbf ){ 16225 p->bNotFirst = 1; 16226 p->n = 0; 16227 return csv_read_one_field(p); 16228 } 16229 } 16230 } 16231 while( c!=EOF && c!=cSep && c!=rSep ){ 16232 import_append_char(p, c); 16233 c = fgetc(p->in); 16234 } 16235 if( c==rSep ){ 16236 p->nLine++; 16237 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--; 16238 } 16239 p->cTerm = c; 16240 } 16241 if( p->z ) p->z[p->n] = 0; 16242 p->bNotFirst = 1; 16243 return p->z; 16244 } 16245 16246 /* Read a single field of ASCII delimited text. 16247 ** 16248 ** + Input comes from p->in. 16249 ** + Store results in p->z of length p->n. Space to hold p->z comes 16250 ** from sqlite3_malloc64(). 16251 ** + Use p->cSep as the column separator. The default is "\x1F". 16252 ** + Use p->rSep as the row separator. The default is "\x1E". 16253 ** + Keep track of the row number in p->nLine. 16254 ** + Store the character that terminates the field in p->cTerm. Store 16255 ** EOF on end-of-file. 16256 ** + Report syntax errors on stderr 16257 */ 16258 static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){ 16259 int c; 16260 int cSep = p->cColSep; 16261 int rSep = p->cRowSep; 16262 p->n = 0; 16263 c = fgetc(p->in); 16264 if( c==EOF || seenInterrupt ){ 16265 p->cTerm = EOF; 16266 return 0; 16267 } 16268 while( c!=EOF && c!=cSep && c!=rSep ){ 16269 import_append_char(p, c); 16270 c = fgetc(p->in); 16271 } 16272 if( c==rSep ){ 16273 p->nLine++; 16274 } 16275 p->cTerm = c; 16276 if( p->z ) p->z[p->n] = 0; 16277 return p->z; 16278 } 16279 16280 /* 16281 ** Try to transfer data for table zTable. If an error is seen while 16282 ** moving forward, try to go backwards. The backwards movement won't 16283 ** work for WITHOUT ROWID tables. 16284 */ 16285 static void tryToCloneData( 16286 ShellState *p, 16287 sqlite3 *newDb, 16288 const char *zTable 16289 ){ 16290 sqlite3_stmt *pQuery = 0; 16291 sqlite3_stmt *pInsert = 0; 16292 char *zQuery = 0; 16293 char *zInsert = 0; 16294 int rc; 16295 int i, j, n; 16296 int nTable = strlen30(zTable); 16297 int k = 0; 16298 int cnt = 0; 16299 const int spinRate = 10000; 16300 16301 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable); 16302 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0); 16303 if( rc ){ 16304 utf8_printf(stderr, "Error %d: %s on [%s]\n", 16305 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db), 16306 zQuery); 16307 goto end_data_xfer; 16308 } 16309 n = sqlite3_column_count(pQuery); 16310 zInsert = sqlite3_malloc64(200 + nTable + n*3); 16311 if( zInsert==0 ) shell_out_of_memory(); 16312 sqlite3_snprintf(200+nTable,zInsert, 16313 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable); 16314 i = strlen30(zInsert); 16315 for(j=1; j<n; j++){ 16316 memcpy(zInsert+i, ",?", 2); 16317 i += 2; 16318 } 16319 memcpy(zInsert+i, ");", 3); 16320 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0); 16321 if( rc ){ 16322 utf8_printf(stderr, "Error %d: %s on [%s]\n", 16323 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb), 16324 zQuery); 16325 goto end_data_xfer; 16326 } 16327 for(k=0; k<2; k++){ 16328 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){ 16329 for(i=0; i<n; i++){ 16330 switch( sqlite3_column_type(pQuery, i) ){ 16331 case SQLITE_NULL: { 16332 sqlite3_bind_null(pInsert, i+1); 16333 break; 16334 } 16335 case SQLITE_INTEGER: { 16336 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i)); 16337 break; 16338 } 16339 case SQLITE_FLOAT: { 16340 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i)); 16341 break; 16342 } 16343 case SQLITE_TEXT: { 16344 sqlite3_bind_text(pInsert, i+1, 16345 (const char*)sqlite3_column_text(pQuery,i), 16346 -1, SQLITE_STATIC); 16347 break; 16348 } 16349 case SQLITE_BLOB: { 16350 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i), 16351 sqlite3_column_bytes(pQuery,i), 16352 SQLITE_STATIC); 16353 break; 16354 } 16355 } 16356 } /* End for */ 16357 rc = sqlite3_step(pInsert); 16358 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){ 16359 utf8_printf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb), 16360 sqlite3_errmsg(newDb)); 16361 } 16362 sqlite3_reset(pInsert); 16363 cnt++; 16364 if( (cnt%spinRate)==0 ){ 16365 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]); 16366 fflush(stdout); 16367 } 16368 } /* End while */ 16369 if( rc==SQLITE_DONE ) break; 16370 sqlite3_finalize(pQuery); 16371 sqlite3_free(zQuery); 16372 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;", 16373 zTable); 16374 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0); 16375 if( rc ){ 16376 utf8_printf(stderr, "Warning: cannot step \"%s\" backwards", zTable); 16377 break; 16378 } 16379 } /* End for(k=0...) */ 16380 16381 end_data_xfer: 16382 sqlite3_finalize(pQuery); 16383 sqlite3_finalize(pInsert); 16384 sqlite3_free(zQuery); 16385 sqlite3_free(zInsert); 16386 } 16387 16388 16389 /* 16390 ** Try to transfer all rows of the schema that match zWhere. For 16391 ** each row, invoke xForEach() on the object defined by that row. 16392 ** If an error is encountered while moving forward through the 16393 ** sqlite_schema table, try again moving backwards. 16394 */ 16395 static void tryToCloneSchema( 16396 ShellState *p, 16397 sqlite3 *newDb, 16398 const char *zWhere, 16399 void (*xForEach)(ShellState*,sqlite3*,const char*) 16400 ){ 16401 sqlite3_stmt *pQuery = 0; 16402 char *zQuery = 0; 16403 int rc; 16404 const unsigned char *zName; 16405 const unsigned char *zSql; 16406 char *zErrMsg = 0; 16407 16408 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema" 16409 " WHERE %s", zWhere); 16410 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0); 16411 if( rc ){ 16412 utf8_printf(stderr, "Error: (%d) %s on [%s]\n", 16413 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db), 16414 zQuery); 16415 goto end_schema_xfer; 16416 } 16417 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){ 16418 zName = sqlite3_column_text(pQuery, 0); 16419 zSql = sqlite3_column_text(pQuery, 1); 16420 printf("%s... ", zName); fflush(stdout); 16421 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg); 16422 if( zErrMsg ){ 16423 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql); 16424 sqlite3_free(zErrMsg); 16425 zErrMsg = 0; 16426 } 16427 if( xForEach ){ 16428 xForEach(p, newDb, (const char*)zName); 16429 } 16430 printf("done\n"); 16431 } 16432 if( rc!=SQLITE_DONE ){ 16433 sqlite3_finalize(pQuery); 16434 sqlite3_free(zQuery); 16435 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema" 16436 " WHERE %s ORDER BY rowid DESC", zWhere); 16437 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0); 16438 if( rc ){ 16439 utf8_printf(stderr, "Error: (%d) %s on [%s]\n", 16440 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db), 16441 zQuery); 16442 goto end_schema_xfer; 16443 } 16444 while( sqlite3_step(pQuery)==SQLITE_ROW ){ 16445 zName = sqlite3_column_text(pQuery, 0); 16446 zSql = sqlite3_column_text(pQuery, 1); 16447 printf("%s... ", zName); fflush(stdout); 16448 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg); 16449 if( zErrMsg ){ 16450 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql); 16451 sqlite3_free(zErrMsg); 16452 zErrMsg = 0; 16453 } 16454 if( xForEach ){ 16455 xForEach(p, newDb, (const char*)zName); 16456 } 16457 printf("done\n"); 16458 } 16459 } 16460 end_schema_xfer: 16461 sqlite3_finalize(pQuery); 16462 sqlite3_free(zQuery); 16463 } 16464 16465 /* 16466 ** Open a new database file named "zNewDb". Try to recover as much information 16467 ** as possible out of the main database (which might be corrupt) and write it 16468 ** into zNewDb. 16469 */ 16470 static void tryToClone(ShellState *p, const char *zNewDb){ 16471 int rc; 16472 sqlite3 *newDb = 0; 16473 if( access(zNewDb,0)==0 ){ 16474 utf8_printf(stderr, "File \"%s\" already exists.\n", zNewDb); 16475 return; 16476 } 16477 rc = sqlite3_open(zNewDb, &newDb); 16478 if( rc ){ 16479 utf8_printf(stderr, "Cannot create output database: %s\n", 16480 sqlite3_errmsg(newDb)); 16481 }else{ 16482 sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0); 16483 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0); 16484 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData); 16485 tryToCloneSchema(p, newDb, "type!='table'", 0); 16486 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0); 16487 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0); 16488 } 16489 close_db(newDb); 16490 } 16491 16492 /* 16493 ** Change the output file back to stdout. 16494 ** 16495 ** If the p->doXdgOpen flag is set, that means the output was being 16496 ** redirected to a temporary file named by p->zTempFile. In that case, 16497 ** launch start/open/xdg-open on that temporary file. 16498 */ 16499 static void output_reset(ShellState *p){ 16500 if( p->outfile[0]=='|' ){ 16501 #ifndef SQLITE_OMIT_POPEN 16502 pclose(p->out); 16503 #endif 16504 }else{ 16505 output_file_close(p->out); 16506 #ifndef SQLITE_NOHAVE_SYSTEM 16507 if( p->doXdgOpen ){ 16508 const char *zXdgOpenCmd = 16509 #if defined(_WIN32) 16510 "start"; 16511 #elif defined(__APPLE__) 16512 "open"; 16513 #else 16514 "xdg-open"; 16515 #endif 16516 char *zCmd; 16517 zCmd = sqlite3_mprintf("%s %s", zXdgOpenCmd, p->zTempFile); 16518 if( system(zCmd) ){ 16519 utf8_printf(stderr, "Failed: [%s]\n", zCmd); 16520 }else{ 16521 /* Give the start/open/xdg-open command some time to get 16522 ** going before we continue, and potential delete the 16523 ** p->zTempFile data file out from under it */ 16524 sqlite3_sleep(2000); 16525 } 16526 sqlite3_free(zCmd); 16527 outputModePop(p); 16528 p->doXdgOpen = 0; 16529 } 16530 #endif /* !defined(SQLITE_NOHAVE_SYSTEM) */ 16531 } 16532 p->outfile[0] = 0; 16533 p->out = stdout; 16534 } 16535 16536 /* 16537 ** Run an SQL command and return the single integer result. 16538 */ 16539 static int db_int(ShellState *p, const char *zSql){ 16540 sqlite3_stmt *pStmt; 16541 int res = 0; 16542 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 16543 if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){ 16544 res = sqlite3_column_int(pStmt,0); 16545 } 16546 sqlite3_finalize(pStmt); 16547 return res; 16548 } 16549 16550 /* 16551 ** Convert a 2-byte or 4-byte big-endian integer into a native integer 16552 */ 16553 static unsigned int get2byteInt(unsigned char *a){ 16554 return (a[0]<<8) + a[1]; 16555 } 16556 static unsigned int get4byteInt(unsigned char *a){ 16557 return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3]; 16558 } 16559 16560 /* 16561 ** Implementation of the ".dbinfo" command. 16562 ** 16563 ** Return 1 on error, 2 to exit, and 0 otherwise. 16564 */ 16565 static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){ 16566 static const struct { const char *zName; int ofst; } aField[] = { 16567 { "file change counter:", 24 }, 16568 { "database page count:", 28 }, 16569 { "freelist page count:", 36 }, 16570 { "schema cookie:", 40 }, 16571 { "schema format:", 44 }, 16572 { "default cache size:", 48 }, 16573 { "autovacuum top root:", 52 }, 16574 { "incremental vacuum:", 64 }, 16575 { "text encoding:", 56 }, 16576 { "user version:", 60 }, 16577 { "application id:", 68 }, 16578 { "software version:", 96 }, 16579 }; 16580 static const struct { const char *zName; const char *zSql; } aQuery[] = { 16581 { "number of tables:", 16582 "SELECT count(*) FROM %s WHERE type='table'" }, 16583 { "number of indexes:", 16584 "SELECT count(*) FROM %s WHERE type='index'" }, 16585 { "number of triggers:", 16586 "SELECT count(*) FROM %s WHERE type='trigger'" }, 16587 { "number of views:", 16588 "SELECT count(*) FROM %s WHERE type='view'" }, 16589 { "schema size:", 16590 "SELECT total(length(sql)) FROM %s" }, 16591 }; 16592 int i, rc; 16593 unsigned iDataVersion; 16594 char *zSchemaTab; 16595 char *zDb = nArg>=2 ? azArg[1] : "main"; 16596 sqlite3_stmt *pStmt = 0; 16597 unsigned char aHdr[100]; 16598 open_db(p, 0); 16599 if( p->db==0 ) return 1; 16600 rc = sqlite3_prepare_v2(p->db, 16601 "SELECT data FROM sqlite_dbpage(?1) WHERE pgno=1", 16602 -1, &pStmt, 0); 16603 if( rc ){ 16604 utf8_printf(stderr, "error: %s\n", sqlite3_errmsg(p->db)); 16605 sqlite3_finalize(pStmt); 16606 return 1; 16607 } 16608 sqlite3_bind_text(pStmt, 1, zDb, -1, SQLITE_STATIC); 16609 if( sqlite3_step(pStmt)==SQLITE_ROW 16610 && sqlite3_column_bytes(pStmt,0)>100 16611 ){ 16612 memcpy(aHdr, sqlite3_column_blob(pStmt,0), 100); 16613 sqlite3_finalize(pStmt); 16614 }else{ 16615 raw_printf(stderr, "unable to read database header\n"); 16616 sqlite3_finalize(pStmt); 16617 return 1; 16618 } 16619 i = get2byteInt(aHdr+16); 16620 if( i==1 ) i = 65536; 16621 utf8_printf(p->out, "%-20s %d\n", "database page size:", i); 16622 utf8_printf(p->out, "%-20s %d\n", "write format:", aHdr[18]); 16623 utf8_printf(p->out, "%-20s %d\n", "read format:", aHdr[19]); 16624 utf8_printf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]); 16625 for(i=0; i<ArraySize(aField); i++){ 16626 int ofst = aField[i].ofst; 16627 unsigned int val = get4byteInt(aHdr + ofst); 16628 utf8_printf(p->out, "%-20s %u", aField[i].zName, val); 16629 switch( ofst ){ 16630 case 56: { 16631 if( val==1 ) raw_printf(p->out, " (utf8)"); 16632 if( val==2 ) raw_printf(p->out, " (utf16le)"); 16633 if( val==3 ) raw_printf(p->out, " (utf16be)"); 16634 } 16635 } 16636 raw_printf(p->out, "\n"); 16637 } 16638 if( zDb==0 ){ 16639 zSchemaTab = sqlite3_mprintf("main.sqlite_schema"); 16640 }else if( strcmp(zDb,"temp")==0 ){ 16641 zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_schema"); 16642 }else{ 16643 zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_schema", zDb); 16644 } 16645 for(i=0; i<ArraySize(aQuery); i++){ 16646 char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab); 16647 int val = db_int(p, zSql); 16648 sqlite3_free(zSql); 16649 utf8_printf(p->out, "%-20s %d\n", aQuery[i].zName, val); 16650 } 16651 sqlite3_free(zSchemaTab); 16652 sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_DATA_VERSION, &iDataVersion); 16653 utf8_printf(p->out, "%-20s %u\n", "data version", iDataVersion); 16654 return 0; 16655 } 16656 16657 /* 16658 ** Print the current sqlite3_errmsg() value to stderr and return 1. 16659 */ 16660 static int shellDatabaseError(sqlite3 *db){ 16661 const char *zErr = sqlite3_errmsg(db); 16662 utf8_printf(stderr, "Error: %s\n", zErr); 16663 return 1; 16664 } 16665 16666 /* 16667 ** Compare the pattern in zGlob[] against the text in z[]. Return TRUE 16668 ** if they match and FALSE (0) if they do not match. 16669 ** 16670 ** Globbing rules: 16671 ** 16672 ** '*' Matches any sequence of zero or more characters. 16673 ** 16674 ** '?' Matches exactly one character. 16675 ** 16676 ** [...] Matches one character from the enclosed list of 16677 ** characters. 16678 ** 16679 ** [^...] Matches one character not in the enclosed list. 16680 ** 16681 ** '#' Matches any sequence of one or more digits with an 16682 ** optional + or - sign in front 16683 ** 16684 ** ' ' Any span of whitespace matches any other span of 16685 ** whitespace. 16686 ** 16687 ** Extra whitespace at the end of z[] is ignored. 16688 */ 16689 static int testcase_glob(const char *zGlob, const char *z){ 16690 int c, c2; 16691 int invert; 16692 int seen; 16693 16694 while( (c = (*(zGlob++)))!=0 ){ 16695 if( IsSpace(c) ){ 16696 if( !IsSpace(*z) ) return 0; 16697 while( IsSpace(*zGlob) ) zGlob++; 16698 while( IsSpace(*z) ) z++; 16699 }else if( c=='*' ){ 16700 while( (c=(*(zGlob++))) == '*' || c=='?' ){ 16701 if( c=='?' && (*(z++))==0 ) return 0; 16702 } 16703 if( c==0 ){ 16704 return 1; 16705 }else if( c=='[' ){ 16706 while( *z && testcase_glob(zGlob-1,z)==0 ){ 16707 z++; 16708 } 16709 return (*z)!=0; 16710 } 16711 while( (c2 = (*(z++)))!=0 ){ 16712 while( c2!=c ){ 16713 c2 = *(z++); 16714 if( c2==0 ) return 0; 16715 } 16716 if( testcase_glob(zGlob,z) ) return 1; 16717 } 16718 return 0; 16719 }else if( c=='?' ){ 16720 if( (*(z++))==0 ) return 0; 16721 }else if( c=='[' ){ 16722 int prior_c = 0; 16723 seen = 0; 16724 invert = 0; 16725 c = *(z++); 16726 if( c==0 ) return 0; 16727 c2 = *(zGlob++); 16728 if( c2=='^' ){ 16729 invert = 1; 16730 c2 = *(zGlob++); 16731 } 16732 if( c2==']' ){ 16733 if( c==']' ) seen = 1; 16734 c2 = *(zGlob++); 16735 } 16736 while( c2 && c2!=']' ){ 16737 if( c2=='-' && zGlob[0]!=']' && zGlob[0]!=0 && prior_c>0 ){ 16738 c2 = *(zGlob++); 16739 if( c>=prior_c && c<=c2 ) seen = 1; 16740 prior_c = 0; 16741 }else{ 16742 if( c==c2 ){ 16743 seen = 1; 16744 } 16745 prior_c = c2; 16746 } 16747 c2 = *(zGlob++); 16748 } 16749 if( c2==0 || (seen ^ invert)==0 ) return 0; 16750 }else if( c=='#' ){ 16751 if( (z[0]=='-' || z[0]=='+') && IsDigit(z[1]) ) z++; 16752 if( !IsDigit(z[0]) ) return 0; 16753 z++; 16754 while( IsDigit(z[0]) ){ z++; } 16755 }else{ 16756 if( c!=(*(z++)) ) return 0; 16757 } 16758 } 16759 while( IsSpace(*z) ){ z++; } 16760 return *z==0; 16761 } 16762 16763 16764 /* 16765 ** Compare the string as a command-line option with either one or two 16766 ** initial "-" characters. 16767 */ 16768 static int optionMatch(const char *zStr, const char *zOpt){ 16769 if( zStr[0]!='-' ) return 0; 16770 zStr++; 16771 if( zStr[0]=='-' ) zStr++; 16772 return strcmp(zStr, zOpt)==0; 16773 } 16774 16775 /* 16776 ** Delete a file. 16777 */ 16778 int shellDeleteFile(const char *zFilename){ 16779 int rc; 16780 #ifdef _WIN32 16781 wchar_t *z = sqlite3_win32_utf8_to_unicode(zFilename); 16782 rc = _wunlink(z); 16783 sqlite3_free(z); 16784 #else 16785 rc = unlink(zFilename); 16786 #endif 16787 return rc; 16788 } 16789 16790 /* 16791 ** Try to delete the temporary file (if there is one) and free the 16792 ** memory used to hold the name of the temp file. 16793 */ 16794 static void clearTempFile(ShellState *p){ 16795 if( p->zTempFile==0 ) return; 16796 if( p->doXdgOpen ) return; 16797 if( shellDeleteFile(p->zTempFile) ) return; 16798 sqlite3_free(p->zTempFile); 16799 p->zTempFile = 0; 16800 } 16801 16802 /* 16803 ** Create a new temp file name with the given suffix. 16804 */ 16805 static void newTempFile(ShellState *p, const char *zSuffix){ 16806 clearTempFile(p); 16807 sqlite3_free(p->zTempFile); 16808 p->zTempFile = 0; 16809 if( p->db ){ 16810 sqlite3_file_control(p->db, 0, SQLITE_FCNTL_TEMPFILENAME, &p->zTempFile); 16811 } 16812 if( p->zTempFile==0 ){ 16813 /* If p->db is an in-memory database then the TEMPFILENAME file-control 16814 ** will not work and we will need to fallback to guessing */ 16815 char *zTemp; 16816 sqlite3_uint64 r; 16817 sqlite3_randomness(sizeof(r), &r); 16818 zTemp = getenv("TEMP"); 16819 if( zTemp==0 ) zTemp = getenv("TMP"); 16820 if( zTemp==0 ){ 16821 #ifdef _WIN32 16822 zTemp = "\\tmp"; 16823 #else 16824 zTemp = "/tmp"; 16825 #endif 16826 } 16827 p->zTempFile = sqlite3_mprintf("%s/temp%llx.%s", zTemp, r, zSuffix); 16828 }else{ 16829 p->zTempFile = sqlite3_mprintf("%z.%s", p->zTempFile, zSuffix); 16830 } 16831 if( p->zTempFile==0 ){ 16832 shell_out_of_memory(); 16833 } 16834 } 16835 16836 16837 /* 16838 ** The implementation of SQL scalar function fkey_collate_clause(), used 16839 ** by the ".lint fkey-indexes" command. This scalar function is always 16840 ** called with four arguments - the parent table name, the parent column name, 16841 ** the child table name and the child column name. 16842 ** 16843 ** fkey_collate_clause('parent-tab', 'parent-col', 'child-tab', 'child-col') 16844 ** 16845 ** If either of the named tables or columns do not exist, this function 16846 ** returns an empty string. An empty string is also returned if both tables 16847 ** and columns exist but have the same default collation sequence. Or, 16848 ** if both exist but the default collation sequences are different, this 16849 ** function returns the string " COLLATE <parent-collation>", where 16850 ** <parent-collation> is the default collation sequence of the parent column. 16851 */ 16852 static void shellFkeyCollateClause( 16853 sqlite3_context *pCtx, 16854 int nVal, 16855 sqlite3_value **apVal 16856 ){ 16857 sqlite3 *db = sqlite3_context_db_handle(pCtx); 16858 const char *zParent; 16859 const char *zParentCol; 16860 const char *zParentSeq; 16861 const char *zChild; 16862 const char *zChildCol; 16863 const char *zChildSeq = 0; /* Initialize to avoid false-positive warning */ 16864 int rc; 16865 16866 assert( nVal==4 ); 16867 zParent = (const char*)sqlite3_value_text(apVal[0]); 16868 zParentCol = (const char*)sqlite3_value_text(apVal[1]); 16869 zChild = (const char*)sqlite3_value_text(apVal[2]); 16870 zChildCol = (const char*)sqlite3_value_text(apVal[3]); 16871 16872 sqlite3_result_text(pCtx, "", -1, SQLITE_STATIC); 16873 rc = sqlite3_table_column_metadata( 16874 db, "main", zParent, zParentCol, 0, &zParentSeq, 0, 0, 0 16875 ); 16876 if( rc==SQLITE_OK ){ 16877 rc = sqlite3_table_column_metadata( 16878 db, "main", zChild, zChildCol, 0, &zChildSeq, 0, 0, 0 16879 ); 16880 } 16881 16882 if( rc==SQLITE_OK && sqlite3_stricmp(zParentSeq, zChildSeq) ){ 16883 char *z = sqlite3_mprintf(" COLLATE %s", zParentSeq); 16884 sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT); 16885 sqlite3_free(z); 16886 } 16887 } 16888 16889 16890 /* 16891 ** The implementation of dot-command ".lint fkey-indexes". 16892 */ 16893 static int lintFkeyIndexes( 16894 ShellState *pState, /* Current shell tool state */ 16895 char **azArg, /* Array of arguments passed to dot command */ 16896 int nArg /* Number of entries in azArg[] */ 16897 ){ 16898 sqlite3 *db = pState->db; /* Database handle to query "main" db of */ 16899 FILE *out = pState->out; /* Stream to write non-error output to */ 16900 int bVerbose = 0; /* If -verbose is present */ 16901 int bGroupByParent = 0; /* If -groupbyparent is present */ 16902 int i; /* To iterate through azArg[] */ 16903 const char *zIndent = ""; /* How much to indent CREATE INDEX by */ 16904 int rc; /* Return code */ 16905 sqlite3_stmt *pSql = 0; /* Compiled version of SQL statement below */ 16906 16907 /* 16908 ** This SELECT statement returns one row for each foreign key constraint 16909 ** in the schema of the main database. The column values are: 16910 ** 16911 ** 0. The text of an SQL statement similar to: 16912 ** 16913 ** "EXPLAIN QUERY PLAN SELECT 1 FROM child_table WHERE child_key=?" 16914 ** 16915 ** This SELECT is similar to the one that the foreign keys implementation 16916 ** needs to run internally on child tables. If there is an index that can 16917 ** be used to optimize this query, then it can also be used by the FK 16918 ** implementation to optimize DELETE or UPDATE statements on the parent 16919 ** table. 16920 ** 16921 ** 1. A GLOB pattern suitable for sqlite3_strglob(). If the plan output by 16922 ** the EXPLAIN QUERY PLAN command matches this pattern, then the schema 16923 ** contains an index that can be used to optimize the query. 16924 ** 16925 ** 2. Human readable text that describes the child table and columns. e.g. 16926 ** 16927 ** "child_table(child_key1, child_key2)" 16928 ** 16929 ** 3. Human readable text that describes the parent table and columns. e.g. 16930 ** 16931 ** "parent_table(parent_key1, parent_key2)" 16932 ** 16933 ** 4. A full CREATE INDEX statement for an index that could be used to 16934 ** optimize DELETE or UPDATE statements on the parent table. e.g. 16935 ** 16936 ** "CREATE INDEX child_table_child_key ON child_table(child_key)" 16937 ** 16938 ** 5. The name of the parent table. 16939 ** 16940 ** These six values are used by the C logic below to generate the report. 16941 */ 16942 const char *zSql = 16943 "SELECT " 16944 " 'EXPLAIN QUERY PLAN SELECT 1 FROM ' || quote(s.name) || ' WHERE '" 16945 " || group_concat(quote(s.name) || '.' || quote(f.[from]) || '=?' " 16946 " || fkey_collate_clause(" 16947 " f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]),' AND ')" 16948 ", " 16949 " 'SEARCH ' || s.name || ' USING COVERING INDEX*('" 16950 " || group_concat('*=?', ' AND ') || ')'" 16951 ", " 16952 " s.name || '(' || group_concat(f.[from], ', ') || ')'" 16953 ", " 16954 " f.[table] || '(' || group_concat(COALESCE(f.[to], p.[name])) || ')'" 16955 ", " 16956 " 'CREATE INDEX ' || quote(s.name ||'_'|| group_concat(f.[from], '_'))" 16957 " || ' ON ' || quote(s.name) || '('" 16958 " || group_concat(quote(f.[from]) ||" 16959 " fkey_collate_clause(" 16960 " f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]), ', ')" 16961 " || ');'" 16962 ", " 16963 " f.[table] " 16964 "FROM sqlite_schema AS s, pragma_foreign_key_list(s.name) AS f " 16965 "LEFT JOIN pragma_table_info AS p ON (pk-1=seq AND p.arg=f.[table]) " 16966 "GROUP BY s.name, f.id " 16967 "ORDER BY (CASE WHEN ? THEN f.[table] ELSE s.name END)" 16968 ; 16969 const char *zGlobIPK = "SEARCH * USING INTEGER PRIMARY KEY (rowid=?)"; 16970 16971 for(i=2; i<nArg; i++){ 16972 int n = strlen30(azArg[i]); 16973 if( n>1 && sqlite3_strnicmp("-verbose", azArg[i], n)==0 ){ 16974 bVerbose = 1; 16975 } 16976 else if( n>1 && sqlite3_strnicmp("-groupbyparent", azArg[i], n)==0 ){ 16977 bGroupByParent = 1; 16978 zIndent = " "; 16979 } 16980 else{ 16981 raw_printf(stderr, "Usage: %s %s ?-verbose? ?-groupbyparent?\n", 16982 azArg[0], azArg[1] 16983 ); 16984 return SQLITE_ERROR; 16985 } 16986 } 16987 16988 /* Register the fkey_collate_clause() SQL function */ 16989 rc = sqlite3_create_function(db, "fkey_collate_clause", 4, SQLITE_UTF8, 16990 0, shellFkeyCollateClause, 0, 0 16991 ); 16992 16993 16994 if( rc==SQLITE_OK ){ 16995 rc = sqlite3_prepare_v2(db, zSql, -1, &pSql, 0); 16996 } 16997 if( rc==SQLITE_OK ){ 16998 sqlite3_bind_int(pSql, 1, bGroupByParent); 16999 } 17000 17001 if( rc==SQLITE_OK ){ 17002 int rc2; 17003 char *zPrev = 0; 17004 while( SQLITE_ROW==sqlite3_step(pSql) ){ 17005 int res = -1; 17006 sqlite3_stmt *pExplain = 0; 17007 const char *zEQP = (const char*)sqlite3_column_text(pSql, 0); 17008 const char *zGlob = (const char*)sqlite3_column_text(pSql, 1); 17009 const char *zFrom = (const char*)sqlite3_column_text(pSql, 2); 17010 const char *zTarget = (const char*)sqlite3_column_text(pSql, 3); 17011 const char *zCI = (const char*)sqlite3_column_text(pSql, 4); 17012 const char *zParent = (const char*)sqlite3_column_text(pSql, 5); 17013 17014 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0); 17015 if( rc!=SQLITE_OK ) break; 17016 if( SQLITE_ROW==sqlite3_step(pExplain) ){ 17017 const char *zPlan = (const char*)sqlite3_column_text(pExplain, 3); 17018 res = ( 17019 0==sqlite3_strglob(zGlob, zPlan) 17020 || 0==sqlite3_strglob(zGlobIPK, zPlan) 17021 ); 17022 } 17023 rc = sqlite3_finalize(pExplain); 17024 if( rc!=SQLITE_OK ) break; 17025 17026 if( res<0 ){ 17027 raw_printf(stderr, "Error: internal error"); 17028 break; 17029 }else{ 17030 if( bGroupByParent 17031 && (bVerbose || res==0) 17032 && (zPrev==0 || sqlite3_stricmp(zParent, zPrev)) 17033 ){ 17034 raw_printf(out, "-- Parent table %s\n", zParent); 17035 sqlite3_free(zPrev); 17036 zPrev = sqlite3_mprintf("%s", zParent); 17037 } 17038 17039 if( res==0 ){ 17040 raw_printf(out, "%s%s --> %s\n", zIndent, zCI, zTarget); 17041 }else if( bVerbose ){ 17042 raw_printf(out, "%s/* no extra indexes required for %s -> %s */\n", 17043 zIndent, zFrom, zTarget 17044 ); 17045 } 17046 } 17047 } 17048 sqlite3_free(zPrev); 17049 17050 if( rc!=SQLITE_OK ){ 17051 raw_printf(stderr, "%s\n", sqlite3_errmsg(db)); 17052 } 17053 17054 rc2 = sqlite3_finalize(pSql); 17055 if( rc==SQLITE_OK && rc2!=SQLITE_OK ){ 17056 rc = rc2; 17057 raw_printf(stderr, "%s\n", sqlite3_errmsg(db)); 17058 } 17059 }else{ 17060 raw_printf(stderr, "%s\n", sqlite3_errmsg(db)); 17061 } 17062 17063 return rc; 17064 } 17065 17066 /* 17067 ** Implementation of ".lint" dot command. 17068 */ 17069 static int lintDotCommand( 17070 ShellState *pState, /* Current shell tool state */ 17071 char **azArg, /* Array of arguments passed to dot command */ 17072 int nArg /* Number of entries in azArg[] */ 17073 ){ 17074 int n; 17075 n = (nArg>=2 ? strlen30(azArg[1]) : 0); 17076 if( n<1 || sqlite3_strnicmp(azArg[1], "fkey-indexes", n) ) goto usage; 17077 return lintFkeyIndexes(pState, azArg, nArg); 17078 17079 usage: 17080 raw_printf(stderr, "Usage %s sub-command ?switches...?\n", azArg[0]); 17081 raw_printf(stderr, "Where sub-commands are:\n"); 17082 raw_printf(stderr, " fkey-indexes\n"); 17083 return SQLITE_ERROR; 17084 } 17085 17086 #if !defined SQLITE_OMIT_VIRTUALTABLE 17087 static void shellPrepare( 17088 sqlite3 *db, 17089 int *pRc, 17090 const char *zSql, 17091 sqlite3_stmt **ppStmt 17092 ){ 17093 *ppStmt = 0; 17094 if( *pRc==SQLITE_OK ){ 17095 int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0); 17096 if( rc!=SQLITE_OK ){ 17097 raw_printf(stderr, "sql error: %s (%d)\n", 17098 sqlite3_errmsg(db), sqlite3_errcode(db) 17099 ); 17100 *pRc = rc; 17101 } 17102 } 17103 } 17104 17105 /* 17106 ** Create a prepared statement using printf-style arguments for the SQL. 17107 ** 17108 ** This routine is could be marked "static". But it is not always used, 17109 ** depending on compile-time options. By omitting the "static", we avoid 17110 ** nuisance compiler warnings about "defined but not used". 17111 */ 17112 void shellPreparePrintf( 17113 sqlite3 *db, 17114 int *pRc, 17115 sqlite3_stmt **ppStmt, 17116 const char *zFmt, 17117 ... 17118 ){ 17119 *ppStmt = 0; 17120 if( *pRc==SQLITE_OK ){ 17121 va_list ap; 17122 char *z; 17123 va_start(ap, zFmt); 17124 z = sqlite3_vmprintf(zFmt, ap); 17125 va_end(ap); 17126 if( z==0 ){ 17127 *pRc = SQLITE_NOMEM; 17128 }else{ 17129 shellPrepare(db, pRc, z, ppStmt); 17130 sqlite3_free(z); 17131 } 17132 } 17133 } 17134 17135 /* Finalize the prepared statement created using shellPreparePrintf(). 17136 ** 17137 ** This routine is could be marked "static". But it is not always used, 17138 ** depending on compile-time options. By omitting the "static", we avoid 17139 ** nuisance compiler warnings about "defined but not used". 17140 */ 17141 void shellFinalize( 17142 int *pRc, 17143 sqlite3_stmt *pStmt 17144 ){ 17145 if( pStmt ){ 17146 sqlite3 *db = sqlite3_db_handle(pStmt); 17147 int rc = sqlite3_finalize(pStmt); 17148 if( *pRc==SQLITE_OK ){ 17149 if( rc!=SQLITE_OK ){ 17150 raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db)); 17151 } 17152 *pRc = rc; 17153 } 17154 } 17155 } 17156 17157 /* Reset the prepared statement created using shellPreparePrintf(). 17158 ** 17159 ** This routine is could be marked "static". But it is not always used, 17160 ** depending on compile-time options. By omitting the "static", we avoid 17161 ** nuisance compiler warnings about "defined but not used". 17162 */ 17163 void shellReset( 17164 int *pRc, 17165 sqlite3_stmt *pStmt 17166 ){ 17167 int rc = sqlite3_reset(pStmt); 17168 if( *pRc==SQLITE_OK ){ 17169 if( rc!=SQLITE_OK ){ 17170 sqlite3 *db = sqlite3_db_handle(pStmt); 17171 raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db)); 17172 } 17173 *pRc = rc; 17174 } 17175 } 17176 #endif /* !defined SQLITE_OMIT_VIRTUALTABLE */ 17177 17178 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) 17179 /****************************************************************************** 17180 ** The ".archive" or ".ar" command. 17181 */ 17182 /* 17183 ** Structure representing a single ".ar" command. 17184 */ 17185 typedef struct ArCommand ArCommand; 17186 struct ArCommand { 17187 u8 eCmd; /* An AR_CMD_* value */ 17188 u8 bVerbose; /* True if --verbose */ 17189 u8 bZip; /* True if the archive is a ZIP */ 17190 u8 bDryRun; /* True if --dry-run */ 17191 u8 bAppend; /* True if --append */ 17192 u8 bGlob; /* True if --glob */ 17193 u8 fromCmdLine; /* Run from -A instead of .archive */ 17194 int nArg; /* Number of command arguments */ 17195 char *zSrcTable; /* "sqlar", "zipfile($file)" or "zip" */ 17196 const char *zFile; /* --file argument, or NULL */ 17197 const char *zDir; /* --directory argument, or NULL */ 17198 char **azArg; /* Array of command arguments */ 17199 ShellState *p; /* Shell state */ 17200 sqlite3 *db; /* Database containing the archive */ 17201 }; 17202 17203 /* 17204 ** Print a usage message for the .ar command to stderr and return SQLITE_ERROR. 17205 */ 17206 static int arUsage(FILE *f){ 17207 showHelp(f,"archive"); 17208 return SQLITE_ERROR; 17209 } 17210 17211 /* 17212 ** Print an error message for the .ar command to stderr and return 17213 ** SQLITE_ERROR. 17214 */ 17215 static int arErrorMsg(ArCommand *pAr, const char *zFmt, ...){ 17216 va_list ap; 17217 char *z; 17218 va_start(ap, zFmt); 17219 z = sqlite3_vmprintf(zFmt, ap); 17220 va_end(ap); 17221 utf8_printf(stderr, "Error: %s\n", z); 17222 if( pAr->fromCmdLine ){ 17223 utf8_printf(stderr, "Use \"-A\" for more help\n"); 17224 }else{ 17225 utf8_printf(stderr, "Use \".archive --help\" for more help\n"); 17226 } 17227 sqlite3_free(z); 17228 return SQLITE_ERROR; 17229 } 17230 17231 /* 17232 ** Values for ArCommand.eCmd. 17233 */ 17234 #define AR_CMD_CREATE 1 17235 #define AR_CMD_UPDATE 2 17236 #define AR_CMD_INSERT 3 17237 #define AR_CMD_EXTRACT 4 17238 #define AR_CMD_LIST 5 17239 #define AR_CMD_HELP 6 17240 #define AR_CMD_REMOVE 7 17241 17242 /* 17243 ** Other (non-command) switches. 17244 */ 17245 #define AR_SWITCH_VERBOSE 8 17246 #define AR_SWITCH_FILE 9 17247 #define AR_SWITCH_DIRECTORY 10 17248 #define AR_SWITCH_APPEND 11 17249 #define AR_SWITCH_DRYRUN 12 17250 #define AR_SWITCH_GLOB 13 17251 17252 static int arProcessSwitch(ArCommand *pAr, int eSwitch, const char *zArg){ 17253 switch( eSwitch ){ 17254 case AR_CMD_CREATE: 17255 case AR_CMD_EXTRACT: 17256 case AR_CMD_LIST: 17257 case AR_CMD_REMOVE: 17258 case AR_CMD_UPDATE: 17259 case AR_CMD_INSERT: 17260 case AR_CMD_HELP: 17261 if( pAr->eCmd ){ 17262 return arErrorMsg(pAr, "multiple command options"); 17263 } 17264 pAr->eCmd = eSwitch; 17265 break; 17266 17267 case AR_SWITCH_DRYRUN: 17268 pAr->bDryRun = 1; 17269 break; 17270 case AR_SWITCH_GLOB: 17271 pAr->bGlob = 1; 17272 break; 17273 case AR_SWITCH_VERBOSE: 17274 pAr->bVerbose = 1; 17275 break; 17276 case AR_SWITCH_APPEND: 17277 pAr->bAppend = 1; 17278 /* Fall thru into --file */ 17279 case AR_SWITCH_FILE: 17280 pAr->zFile = zArg; 17281 break; 17282 case AR_SWITCH_DIRECTORY: 17283 pAr->zDir = zArg; 17284 break; 17285 } 17286 17287 return SQLITE_OK; 17288 } 17289 17290 /* 17291 ** Parse the command line for an ".ar" command. The results are written into 17292 ** structure (*pAr). SQLITE_OK is returned if the command line is parsed 17293 ** successfully, otherwise an error message is written to stderr and 17294 ** SQLITE_ERROR returned. 17295 */ 17296 static int arParseCommand( 17297 char **azArg, /* Array of arguments passed to dot command */ 17298 int nArg, /* Number of entries in azArg[] */ 17299 ArCommand *pAr /* Populate this object */ 17300 ){ 17301 struct ArSwitch { 17302 const char *zLong; 17303 char cShort; 17304 u8 eSwitch; 17305 u8 bArg; 17306 } aSwitch[] = { 17307 { "create", 'c', AR_CMD_CREATE, 0 }, 17308 { "extract", 'x', AR_CMD_EXTRACT, 0 }, 17309 { "insert", 'i', AR_CMD_INSERT, 0 }, 17310 { "list", 't', AR_CMD_LIST, 0 }, 17311 { "remove", 'r', AR_CMD_REMOVE, 0 }, 17312 { "update", 'u', AR_CMD_UPDATE, 0 }, 17313 { "help", 'h', AR_CMD_HELP, 0 }, 17314 { "verbose", 'v', AR_SWITCH_VERBOSE, 0 }, 17315 { "file", 'f', AR_SWITCH_FILE, 1 }, 17316 { "append", 'a', AR_SWITCH_APPEND, 1 }, 17317 { "directory", 'C', AR_SWITCH_DIRECTORY, 1 }, 17318 { "dryrun", 'n', AR_SWITCH_DRYRUN, 0 }, 17319 { "glob", 'g', AR_SWITCH_GLOB, 0 }, 17320 }; 17321 int nSwitch = sizeof(aSwitch) / sizeof(struct ArSwitch); 17322 struct ArSwitch *pEnd = &aSwitch[nSwitch]; 17323 17324 if( nArg<=1 ){ 17325 utf8_printf(stderr, "Wrong number of arguments. Usage:\n"); 17326 return arUsage(stderr); 17327 }else{ 17328 char *z = azArg[1]; 17329 if( z[0]!='-' ){ 17330 /* Traditional style [tar] invocation */ 17331 int i; 17332 int iArg = 2; 17333 for(i=0; z[i]; i++){ 17334 const char *zArg = 0; 17335 struct ArSwitch *pOpt; 17336 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){ 17337 if( z[i]==pOpt->cShort ) break; 17338 } 17339 if( pOpt==pEnd ){ 17340 return arErrorMsg(pAr, "unrecognized option: %c", z[i]); 17341 } 17342 if( pOpt->bArg ){ 17343 if( iArg>=nArg ){ 17344 return arErrorMsg(pAr, "option requires an argument: %c",z[i]); 17345 } 17346 zArg = azArg[iArg++]; 17347 } 17348 if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR; 17349 } 17350 pAr->nArg = nArg-iArg; 17351 if( pAr->nArg>0 ){ 17352 pAr->azArg = &azArg[iArg]; 17353 } 17354 }else{ 17355 /* Non-traditional invocation */ 17356 int iArg; 17357 for(iArg=1; iArg<nArg; iArg++){ 17358 int n; 17359 z = azArg[iArg]; 17360 if( z[0]!='-' ){ 17361 /* All remaining command line words are command arguments. */ 17362 pAr->azArg = &azArg[iArg]; 17363 pAr->nArg = nArg-iArg; 17364 break; 17365 } 17366 n = strlen30(z); 17367 17368 if( z[1]!='-' ){ 17369 int i; 17370 /* One or more short options */ 17371 for(i=1; i<n; i++){ 17372 const char *zArg = 0; 17373 struct ArSwitch *pOpt; 17374 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){ 17375 if( z[i]==pOpt->cShort ) break; 17376 } 17377 if( pOpt==pEnd ){ 17378 return arErrorMsg(pAr, "unrecognized option: %c", z[i]); 17379 } 17380 if( pOpt->bArg ){ 17381 if( i<(n-1) ){ 17382 zArg = &z[i+1]; 17383 i = n; 17384 }else{ 17385 if( iArg>=(nArg-1) ){ 17386 return arErrorMsg(pAr, "option requires an argument: %c", 17387 z[i]); 17388 } 17389 zArg = azArg[++iArg]; 17390 } 17391 } 17392 if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR; 17393 } 17394 }else if( z[2]=='\0' ){ 17395 /* A -- option, indicating that all remaining command line words 17396 ** are command arguments. */ 17397 pAr->azArg = &azArg[iArg+1]; 17398 pAr->nArg = nArg-iArg-1; 17399 break; 17400 }else{ 17401 /* A long option */ 17402 const char *zArg = 0; /* Argument for option, if any */ 17403 struct ArSwitch *pMatch = 0; /* Matching option */ 17404 struct ArSwitch *pOpt; /* Iterator */ 17405 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){ 17406 const char *zLong = pOpt->zLong; 17407 if( (n-2)<=strlen30(zLong) && 0==memcmp(&z[2], zLong, n-2) ){ 17408 if( pMatch ){ 17409 return arErrorMsg(pAr, "ambiguous option: %s",z); 17410 }else{ 17411 pMatch = pOpt; 17412 } 17413 } 17414 } 17415 17416 if( pMatch==0 ){ 17417 return arErrorMsg(pAr, "unrecognized option: %s", z); 17418 } 17419 if( pMatch->bArg ){ 17420 if( iArg>=(nArg-1) ){ 17421 return arErrorMsg(pAr, "option requires an argument: %s", z); 17422 } 17423 zArg = azArg[++iArg]; 17424 } 17425 if( arProcessSwitch(pAr, pMatch->eSwitch, zArg) ) return SQLITE_ERROR; 17426 } 17427 } 17428 } 17429 } 17430 17431 return SQLITE_OK; 17432 } 17433 17434 /* 17435 ** This function assumes that all arguments within the ArCommand.azArg[] 17436 ** array refer to archive members, as for the --extract, --list or --remove 17437 ** commands. It checks that each of them are "present". If any specified 17438 ** file is not present in the archive, an error is printed to stderr and an 17439 ** error code returned. Otherwise, if all specified arguments are present 17440 ** in the archive, SQLITE_OK is returned. Here, "present" means either an 17441 ** exact equality when pAr->bGlob is false or a "name GLOB pattern" match 17442 ** when pAr->bGlob is true. 17443 ** 17444 ** This function strips any trailing '/' characters from each argument. 17445 ** This is consistent with the way the [tar] command seems to work on 17446 ** Linux. 17447 */ 17448 static int arCheckEntries(ArCommand *pAr){ 17449 int rc = SQLITE_OK; 17450 if( pAr->nArg ){ 17451 int i, j; 17452 sqlite3_stmt *pTest = 0; 17453 const char *zSel = (pAr->bGlob) 17454 ? "SELECT name FROM %s WHERE glob($name,name)" 17455 : "SELECT name FROM %s WHERE name=$name"; 17456 17457 shellPreparePrintf(pAr->db, &rc, &pTest, zSel, pAr->zSrcTable); 17458 j = sqlite3_bind_parameter_index(pTest, "$name"); 17459 for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){ 17460 char *z = pAr->azArg[i]; 17461 int n = strlen30(z); 17462 int bOk = 0; 17463 while( n>0 && z[n-1]=='/' ) n--; 17464 z[n] = '\0'; 17465 sqlite3_bind_text(pTest, j, z, -1, SQLITE_STATIC); 17466 if( SQLITE_ROW==sqlite3_step(pTest) ){ 17467 bOk = 1; 17468 } 17469 shellReset(&rc, pTest); 17470 if( rc==SQLITE_OK && bOk==0 ){ 17471 utf8_printf(stderr, "not found in archive: %s\n", z); 17472 rc = SQLITE_ERROR; 17473 } 17474 } 17475 shellFinalize(&rc, pTest); 17476 } 17477 return rc; 17478 } 17479 17480 /* 17481 ** Format a WHERE clause that can be used against the "sqlar" table to 17482 ** identify all archive members that match the command arguments held 17483 ** in (*pAr). Leave this WHERE clause in (*pzWhere) before returning. 17484 ** The caller is responsible for eventually calling sqlite3_free() on 17485 ** any non-NULL (*pzWhere) value. Here, "match" means strict equality 17486 ** when pAr->bGlob is false and GLOB match when pAr->bGlob is true. 17487 */ 17488 static void arWhereClause( 17489 int *pRc, 17490 ArCommand *pAr, 17491 char **pzWhere /* OUT: New WHERE clause */ 17492 ){ 17493 char *zWhere = 0; 17494 const char *zSameOp = (pAr->bGlob)? "GLOB" : "="; 17495 if( *pRc==SQLITE_OK ){ 17496 if( pAr->nArg==0 ){ 17497 zWhere = sqlite3_mprintf("1"); 17498 }else{ 17499 int i; 17500 const char *zSep = ""; 17501 for(i=0; i<pAr->nArg; i++){ 17502 const char *z = pAr->azArg[i]; 17503 zWhere = sqlite3_mprintf( 17504 "%z%s name %s '%q' OR substr(name,1,%d) %s '%q/'", 17505 zWhere, zSep, zSameOp, z, strlen30(z)+1, zSameOp, z 17506 ); 17507 if( zWhere==0 ){ 17508 *pRc = SQLITE_NOMEM; 17509 break; 17510 } 17511 zSep = " OR "; 17512 } 17513 } 17514 } 17515 *pzWhere = zWhere; 17516 } 17517 17518 /* 17519 ** Implementation of .ar "lisT" command. 17520 */ 17521 static int arListCommand(ArCommand *pAr){ 17522 const char *zSql = "SELECT %s FROM %s WHERE %s"; 17523 const char *azCols[] = { 17524 "name", 17525 "lsmode(mode), sz, datetime(mtime, 'unixepoch'), name" 17526 }; 17527 17528 char *zWhere = 0; 17529 sqlite3_stmt *pSql = 0; 17530 int rc; 17531 17532 rc = arCheckEntries(pAr); 17533 arWhereClause(&rc, pAr, &zWhere); 17534 17535 shellPreparePrintf(pAr->db, &rc, &pSql, zSql, azCols[pAr->bVerbose], 17536 pAr->zSrcTable, zWhere); 17537 if( pAr->bDryRun ){ 17538 utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql)); 17539 }else{ 17540 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){ 17541 if( pAr->bVerbose ){ 17542 utf8_printf(pAr->p->out, "%s % 10d %s %s\n", 17543 sqlite3_column_text(pSql, 0), 17544 sqlite3_column_int(pSql, 1), 17545 sqlite3_column_text(pSql, 2), 17546 sqlite3_column_text(pSql, 3) 17547 ); 17548 }else{ 17549 utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0)); 17550 } 17551 } 17552 } 17553 shellFinalize(&rc, pSql); 17554 sqlite3_free(zWhere); 17555 return rc; 17556 } 17557 17558 17559 /* 17560 ** Implementation of .ar "Remove" command. 17561 */ 17562 static int arRemoveCommand(ArCommand *pAr){ 17563 int rc = 0; 17564 char *zSql = 0; 17565 char *zWhere = 0; 17566 17567 if( pAr->nArg ){ 17568 /* Verify that args actually exist within the archive before proceeding. 17569 ** And formulate a WHERE clause to match them. */ 17570 rc = arCheckEntries(pAr); 17571 arWhereClause(&rc, pAr, &zWhere); 17572 } 17573 if( rc==SQLITE_OK ){ 17574 zSql = sqlite3_mprintf("DELETE FROM %s WHERE %s;", 17575 pAr->zSrcTable, zWhere); 17576 if( pAr->bDryRun ){ 17577 utf8_printf(pAr->p->out, "%s\n", zSql); 17578 }else{ 17579 char *zErr = 0; 17580 rc = sqlite3_exec(pAr->db, "SAVEPOINT ar;", 0, 0, 0); 17581 if( rc==SQLITE_OK ){ 17582 rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr); 17583 if( rc!=SQLITE_OK ){ 17584 sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0); 17585 }else{ 17586 rc = sqlite3_exec(pAr->db, "RELEASE ar;", 0, 0, 0); 17587 } 17588 } 17589 if( zErr ){ 17590 utf8_printf(stdout, "ERROR: %s\n", zErr); 17591 sqlite3_free(zErr); 17592 } 17593 } 17594 } 17595 sqlite3_free(zWhere); 17596 sqlite3_free(zSql); 17597 return rc; 17598 } 17599 17600 /* 17601 ** Implementation of .ar "eXtract" command. 17602 */ 17603 static int arExtractCommand(ArCommand *pAr){ 17604 const char *zSql1 = 17605 "SELECT " 17606 " ($dir || name)," 17607 " writefile(($dir || name), %s, mode, mtime) " 17608 "FROM %s WHERE (%s) AND (data IS NULL OR $dirOnly = 0)" 17609 " AND name NOT GLOB '*..[/\\]*'"; 17610 17611 const char *azExtraArg[] = { 17612 "sqlar_uncompress(data, sz)", 17613 "data" 17614 }; 17615 17616 sqlite3_stmt *pSql = 0; 17617 int rc = SQLITE_OK; 17618 char *zDir = 0; 17619 char *zWhere = 0; 17620 int i, j; 17621 17622 /* If arguments are specified, check that they actually exist within 17623 ** the archive before proceeding. And formulate a WHERE clause to 17624 ** match them. */ 17625 rc = arCheckEntries(pAr); 17626 arWhereClause(&rc, pAr, &zWhere); 17627 17628 if( rc==SQLITE_OK ){ 17629 if( pAr->zDir ){ 17630 zDir = sqlite3_mprintf("%s/", pAr->zDir); 17631 }else{ 17632 zDir = sqlite3_mprintf(""); 17633 } 17634 if( zDir==0 ) rc = SQLITE_NOMEM; 17635 } 17636 17637 shellPreparePrintf(pAr->db, &rc, &pSql, zSql1, 17638 azExtraArg[pAr->bZip], pAr->zSrcTable, zWhere 17639 ); 17640 17641 if( rc==SQLITE_OK ){ 17642 j = sqlite3_bind_parameter_index(pSql, "$dir"); 17643 sqlite3_bind_text(pSql, j, zDir, -1, SQLITE_STATIC); 17644 17645 /* Run the SELECT statement twice. The first time, writefile() is called 17646 ** for all archive members that should be extracted. The second time, 17647 ** only for the directories. This is because the timestamps for 17648 ** extracted directories must be reset after they are populated (as 17649 ** populating them changes the timestamp). */ 17650 for(i=0; i<2; i++){ 17651 j = sqlite3_bind_parameter_index(pSql, "$dirOnly"); 17652 sqlite3_bind_int(pSql, j, i); 17653 if( pAr->bDryRun ){ 17654 utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql)); 17655 }else{ 17656 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){ 17657 if( i==0 && pAr->bVerbose ){ 17658 utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0)); 17659 } 17660 } 17661 } 17662 shellReset(&rc, pSql); 17663 } 17664 shellFinalize(&rc, pSql); 17665 } 17666 17667 sqlite3_free(zDir); 17668 sqlite3_free(zWhere); 17669 return rc; 17670 } 17671 17672 /* 17673 ** Run the SQL statement in zSql. Or if doing a --dryrun, merely print it out. 17674 */ 17675 static int arExecSql(ArCommand *pAr, const char *zSql){ 17676 int rc; 17677 if( pAr->bDryRun ){ 17678 utf8_printf(pAr->p->out, "%s\n", zSql); 17679 rc = SQLITE_OK; 17680 }else{ 17681 char *zErr = 0; 17682 rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr); 17683 if( zErr ){ 17684 utf8_printf(stdout, "ERROR: %s\n", zErr); 17685 sqlite3_free(zErr); 17686 } 17687 } 17688 return rc; 17689 } 17690 17691 17692 /* 17693 ** Implementation of .ar "create", "insert", and "update" commands. 17694 ** 17695 ** create -> Create a new SQL archive 17696 ** insert -> Insert or reinsert all files listed 17697 ** update -> Insert files that have changed or that were not 17698 ** previously in the archive 17699 ** 17700 ** Create the "sqlar" table in the database if it does not already exist. 17701 ** Then add each file in the azFile[] array to the archive. Directories 17702 ** are added recursively. If argument bVerbose is non-zero, a message is 17703 ** printed on stdout for each file archived. 17704 ** 17705 ** The create command is the same as update, except that it drops 17706 ** any existing "sqlar" table before beginning. The "insert" command 17707 ** always overwrites every file named on the command-line, where as 17708 ** "update" only overwrites if the size or mtime or mode has changed. 17709 */ 17710 static int arCreateOrUpdateCommand( 17711 ArCommand *pAr, /* Command arguments and options */ 17712 int bUpdate, /* true for a --create. */ 17713 int bOnlyIfChanged /* Only update if file has changed */ 17714 ){ 17715 const char *zCreate = 17716 "CREATE TABLE IF NOT EXISTS sqlar(\n" 17717 " name TEXT PRIMARY KEY, -- name of the file\n" 17718 " mode INT, -- access permissions\n" 17719 " mtime INT, -- last modification time\n" 17720 " sz INT, -- original file size\n" 17721 " data BLOB -- compressed content\n" 17722 ")"; 17723 const char *zDrop = "DROP TABLE IF EXISTS sqlar"; 17724 const char *zInsertFmt[2] = { 17725 "REPLACE INTO %s(name,mode,mtime,sz,data)\n" 17726 " SELECT\n" 17727 " %s,\n" 17728 " mode,\n" 17729 " mtime,\n" 17730 " CASE substr(lsmode(mode),1,1)\n" 17731 " WHEN '-' THEN length(data)\n" 17732 " WHEN 'd' THEN 0\n" 17733 " ELSE -1 END,\n" 17734 " sqlar_compress(data)\n" 17735 " FROM fsdir(%Q,%Q) AS disk\n" 17736 " WHERE lsmode(mode) NOT LIKE '?%%'%s;" 17737 , 17738 "REPLACE INTO %s(name,mode,mtime,data)\n" 17739 " SELECT\n" 17740 " %s,\n" 17741 " mode,\n" 17742 " mtime,\n" 17743 " data\n" 17744 " FROM fsdir(%Q,%Q) AS disk\n" 17745 " WHERE lsmode(mode) NOT LIKE '?%%'%s;" 17746 }; 17747 int i; /* For iterating through azFile[] */ 17748 int rc; /* Return code */ 17749 const char *zTab = 0; /* SQL table into which to insert */ 17750 char *zSql; 17751 char zTemp[50]; 17752 char *zExists = 0; 17753 17754 arExecSql(pAr, "PRAGMA page_size=512"); 17755 rc = arExecSql(pAr, "SAVEPOINT ar;"); 17756 if( rc!=SQLITE_OK ) return rc; 17757 zTemp[0] = 0; 17758 if( pAr->bZip ){ 17759 /* Initialize the zipfile virtual table, if necessary */ 17760 if( pAr->zFile ){ 17761 sqlite3_uint64 r; 17762 sqlite3_randomness(sizeof(r),&r); 17763 sqlite3_snprintf(sizeof(zTemp),zTemp,"zip%016llx",r); 17764 zTab = zTemp; 17765 zSql = sqlite3_mprintf( 17766 "CREATE VIRTUAL TABLE temp.%s USING zipfile(%Q)", 17767 zTab, pAr->zFile 17768 ); 17769 rc = arExecSql(pAr, zSql); 17770 sqlite3_free(zSql); 17771 }else{ 17772 zTab = "zip"; 17773 } 17774 }else{ 17775 /* Initialize the table for an SQLAR */ 17776 zTab = "sqlar"; 17777 if( bUpdate==0 ){ 17778 rc = arExecSql(pAr, zDrop); 17779 if( rc!=SQLITE_OK ) goto end_ar_transaction; 17780 } 17781 rc = arExecSql(pAr, zCreate); 17782 } 17783 if( bOnlyIfChanged ){ 17784 zExists = sqlite3_mprintf( 17785 " AND NOT EXISTS(" 17786 "SELECT 1 FROM %s AS mem" 17787 " WHERE mem.name=disk.name" 17788 " AND mem.mtime=disk.mtime" 17789 " AND mem.mode=disk.mode)", zTab); 17790 }else{ 17791 zExists = sqlite3_mprintf(""); 17792 } 17793 if( zExists==0 ) rc = SQLITE_NOMEM; 17794 for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){ 17795 char *zSql2 = sqlite3_mprintf(zInsertFmt[pAr->bZip], zTab, 17796 pAr->bVerbose ? "shell_putsnl(name)" : "name", 17797 pAr->azArg[i], pAr->zDir, zExists); 17798 rc = arExecSql(pAr, zSql2); 17799 sqlite3_free(zSql2); 17800 } 17801 end_ar_transaction: 17802 if( rc!=SQLITE_OK ){ 17803 sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0); 17804 }else{ 17805 rc = arExecSql(pAr, "RELEASE ar;"); 17806 if( pAr->bZip && pAr->zFile ){ 17807 zSql = sqlite3_mprintf("DROP TABLE %s", zTemp); 17808 arExecSql(pAr, zSql); 17809 sqlite3_free(zSql); 17810 } 17811 } 17812 sqlite3_free(zExists); 17813 return rc; 17814 } 17815 17816 /* 17817 ** Implementation of ".ar" dot command. 17818 */ 17819 static int arDotCommand( 17820 ShellState *pState, /* Current shell tool state */ 17821 int fromCmdLine, /* True if -A command-line option, not .ar cmd */ 17822 char **azArg, /* Array of arguments passed to dot command */ 17823 int nArg /* Number of entries in azArg[] */ 17824 ){ 17825 ArCommand cmd; 17826 int rc; 17827 memset(&cmd, 0, sizeof(cmd)); 17828 cmd.fromCmdLine = fromCmdLine; 17829 rc = arParseCommand(azArg, nArg, &cmd); 17830 if( rc==SQLITE_OK ){ 17831 int eDbType = SHELL_OPEN_UNSPEC; 17832 cmd.p = pState; 17833 cmd.db = pState->db; 17834 if( cmd.zFile ){ 17835 eDbType = deduceDatabaseType(cmd.zFile, 1); 17836 }else{ 17837 eDbType = pState->openMode; 17838 } 17839 if( eDbType==SHELL_OPEN_ZIPFILE ){ 17840 if( cmd.eCmd==AR_CMD_EXTRACT || cmd.eCmd==AR_CMD_LIST ){ 17841 if( cmd.zFile==0 ){ 17842 cmd.zSrcTable = sqlite3_mprintf("zip"); 17843 }else{ 17844 cmd.zSrcTable = sqlite3_mprintf("zipfile(%Q)", cmd.zFile); 17845 } 17846 } 17847 cmd.bZip = 1; 17848 }else if( cmd.zFile ){ 17849 int flags; 17850 if( cmd.bAppend ) eDbType = SHELL_OPEN_APPENDVFS; 17851 if( cmd.eCmd==AR_CMD_CREATE || cmd.eCmd==AR_CMD_INSERT 17852 || cmd.eCmd==AR_CMD_REMOVE || cmd.eCmd==AR_CMD_UPDATE ){ 17853 flags = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE; 17854 }else{ 17855 flags = SQLITE_OPEN_READONLY; 17856 } 17857 cmd.db = 0; 17858 if( cmd.bDryRun ){ 17859 utf8_printf(pState->out, "-- open database '%s'%s\n", cmd.zFile, 17860 eDbType==SHELL_OPEN_APPENDVFS ? " using 'apndvfs'" : ""); 17861 } 17862 rc = sqlite3_open_v2(cmd.zFile, &cmd.db, flags, 17863 eDbType==SHELL_OPEN_APPENDVFS ? "apndvfs" : 0); 17864 if( rc!=SQLITE_OK ){ 17865 utf8_printf(stderr, "cannot open file: %s (%s)\n", 17866 cmd.zFile, sqlite3_errmsg(cmd.db) 17867 ); 17868 goto end_ar_command; 17869 } 17870 sqlite3_fileio_init(cmd.db, 0, 0); 17871 sqlite3_sqlar_init(cmd.db, 0, 0); 17872 sqlite3_create_function(cmd.db, "shell_putsnl", 1, SQLITE_UTF8, cmd.p, 17873 shellPutsFunc, 0, 0); 17874 17875 } 17876 if( cmd.zSrcTable==0 && cmd.bZip==0 && cmd.eCmd!=AR_CMD_HELP ){ 17877 if( cmd.eCmd!=AR_CMD_CREATE 17878 && sqlite3_table_column_metadata(cmd.db,0,"sqlar","name",0,0,0,0,0) 17879 ){ 17880 utf8_printf(stderr, "database does not contain an 'sqlar' table\n"); 17881 rc = SQLITE_ERROR; 17882 goto end_ar_command; 17883 } 17884 cmd.zSrcTable = sqlite3_mprintf("sqlar"); 17885 } 17886 17887 switch( cmd.eCmd ){ 17888 case AR_CMD_CREATE: 17889 rc = arCreateOrUpdateCommand(&cmd, 0, 0); 17890 break; 17891 17892 case AR_CMD_EXTRACT: 17893 rc = arExtractCommand(&cmd); 17894 break; 17895 17896 case AR_CMD_LIST: 17897 rc = arListCommand(&cmd); 17898 break; 17899 17900 case AR_CMD_HELP: 17901 arUsage(pState->out); 17902 break; 17903 17904 case AR_CMD_INSERT: 17905 rc = arCreateOrUpdateCommand(&cmd, 1, 0); 17906 break; 17907 17908 case AR_CMD_REMOVE: 17909 rc = arRemoveCommand(&cmd); 17910 break; 17911 17912 default: 17913 assert( cmd.eCmd==AR_CMD_UPDATE ); 17914 rc = arCreateOrUpdateCommand(&cmd, 1, 1); 17915 break; 17916 } 17917 } 17918 end_ar_command: 17919 if( cmd.db!=pState->db ){ 17920 close_db(cmd.db); 17921 } 17922 sqlite3_free(cmd.zSrcTable); 17923 17924 return rc; 17925 } 17926 /* End of the ".archive" or ".ar" command logic 17927 *******************************************************************************/ 17928 #endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) */ 17929 17930 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) 17931 /* 17932 ** If (*pRc) is not SQLITE_OK when this function is called, it is a no-op. 17933 ** Otherwise, the SQL statement or statements in zSql are executed using 17934 ** database connection db and the error code written to *pRc before 17935 ** this function returns. 17936 */ 17937 static void shellExec(sqlite3 *db, int *pRc, const char *zSql){ 17938 int rc = *pRc; 17939 if( rc==SQLITE_OK ){ 17940 char *zErr = 0; 17941 rc = sqlite3_exec(db, zSql, 0, 0, &zErr); 17942 if( rc!=SQLITE_OK ){ 17943 raw_printf(stderr, "SQL error: %s\n", zErr); 17944 } 17945 sqlite3_free(zErr); 17946 *pRc = rc; 17947 } 17948 } 17949 17950 /* 17951 ** Like shellExec(), except that zFmt is a printf() style format string. 17952 */ 17953 static void shellExecPrintf(sqlite3 *db, int *pRc, const char *zFmt, ...){ 17954 char *z = 0; 17955 if( *pRc==SQLITE_OK ){ 17956 va_list ap; 17957 va_start(ap, zFmt); 17958 z = sqlite3_vmprintf(zFmt, ap); 17959 va_end(ap); 17960 if( z==0 ){ 17961 *pRc = SQLITE_NOMEM; 17962 }else{ 17963 shellExec(db, pRc, z); 17964 } 17965 sqlite3_free(z); 17966 } 17967 } 17968 17969 /* 17970 ** If *pRc is not SQLITE_OK when this function is called, it is a no-op. 17971 ** Otherwise, an attempt is made to allocate, zero and return a pointer 17972 ** to a buffer nByte bytes in size. If an OOM error occurs, *pRc is set 17973 ** to SQLITE_NOMEM and NULL returned. 17974 */ 17975 static void *shellMalloc(int *pRc, sqlite3_int64 nByte){ 17976 void *pRet = 0; 17977 if( *pRc==SQLITE_OK ){ 17978 pRet = sqlite3_malloc64(nByte); 17979 if( pRet==0 ){ 17980 *pRc = SQLITE_NOMEM; 17981 }else{ 17982 memset(pRet, 0, nByte); 17983 } 17984 } 17985 return pRet; 17986 } 17987 17988 /* 17989 ** If *pRc is not SQLITE_OK when this function is called, it is a no-op. 17990 ** Otherwise, zFmt is treated as a printf() style string. The result of 17991 ** formatting it along with any trailing arguments is written into a 17992 ** buffer obtained from sqlite3_malloc(), and pointer to which is returned. 17993 ** It is the responsibility of the caller to eventually free this buffer 17994 ** using a call to sqlite3_free(). 17995 ** 17996 ** If an OOM error occurs, (*pRc) is set to SQLITE_NOMEM and a NULL 17997 ** pointer returned. 17998 */ 17999 static char *shellMPrintf(int *pRc, const char *zFmt, ...){ 18000 char *z = 0; 18001 if( *pRc==SQLITE_OK ){ 18002 va_list ap; 18003 va_start(ap, zFmt); 18004 z = sqlite3_vmprintf(zFmt, ap); 18005 va_end(ap); 18006 if( z==0 ){ 18007 *pRc = SQLITE_NOMEM; 18008 } 18009 } 18010 return z; 18011 } 18012 18013 /* 18014 ** When running the ".recover" command, each output table, and the special 18015 ** orphaned row table if it is required, is represented by an instance 18016 ** of the following struct. 18017 */ 18018 typedef struct RecoverTable RecoverTable; 18019 struct RecoverTable { 18020 char *zQuoted; /* Quoted version of table name */ 18021 int nCol; /* Number of columns in table */ 18022 char **azlCol; /* Array of column lists */ 18023 int iPk; /* Index of IPK column */ 18024 }; 18025 18026 /* 18027 ** Free a RecoverTable object allocated by recoverFindTable() or 18028 ** recoverOrphanTable(). 18029 */ 18030 static void recoverFreeTable(RecoverTable *pTab){ 18031 if( pTab ){ 18032 sqlite3_free(pTab->zQuoted); 18033 if( pTab->azlCol ){ 18034 int i; 18035 for(i=0; i<=pTab->nCol; i++){ 18036 sqlite3_free(pTab->azlCol[i]); 18037 } 18038 sqlite3_free(pTab->azlCol); 18039 } 18040 sqlite3_free(pTab); 18041 } 18042 } 18043 18044 /* 18045 ** This function is a no-op if (*pRc) is not SQLITE_OK when it is called. 18046 ** Otherwise, it allocates and returns a RecoverTable object based on the 18047 ** final four arguments passed to this function. It is the responsibility 18048 ** of the caller to eventually free the returned object using 18049 ** recoverFreeTable(). 18050 */ 18051 static RecoverTable *recoverNewTable( 18052 int *pRc, /* IN/OUT: Error code */ 18053 const char *zName, /* Name of table */ 18054 const char *zSql, /* CREATE TABLE statement */ 18055 int bIntkey, 18056 int nCol 18057 ){ 18058 sqlite3 *dbtmp = 0; /* sqlite3 handle for testing CREATE TABLE */ 18059 int rc = *pRc; 18060 RecoverTable *pTab = 0; 18061 18062 pTab = (RecoverTable*)shellMalloc(&rc, sizeof(RecoverTable)); 18063 if( rc==SQLITE_OK ){ 18064 int nSqlCol = 0; 18065 int bSqlIntkey = 0; 18066 sqlite3_stmt *pStmt = 0; 18067 18068 rc = sqlite3_open("", &dbtmp); 18069 if( rc==SQLITE_OK ){ 18070 sqlite3_create_function(dbtmp, "shell_idquote", 1, SQLITE_UTF8, 0, 18071 shellIdQuote, 0, 0); 18072 } 18073 if( rc==SQLITE_OK ){ 18074 rc = sqlite3_exec(dbtmp, "PRAGMA writable_schema = on", 0, 0, 0); 18075 } 18076 if( rc==SQLITE_OK ){ 18077 rc = sqlite3_exec(dbtmp, zSql, 0, 0, 0); 18078 if( rc==SQLITE_ERROR ){ 18079 rc = SQLITE_OK; 18080 goto finished; 18081 } 18082 } 18083 shellPreparePrintf(dbtmp, &rc, &pStmt, 18084 "SELECT count(*) FROM pragma_table_info(%Q)", zName 18085 ); 18086 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ 18087 nSqlCol = sqlite3_column_int(pStmt, 0); 18088 } 18089 shellFinalize(&rc, pStmt); 18090 18091 if( rc!=SQLITE_OK || nSqlCol<nCol ){ 18092 goto finished; 18093 } 18094 18095 shellPreparePrintf(dbtmp, &rc, &pStmt, 18096 "SELECT (" 18097 " SELECT substr(data,1,1)==X'0D' FROM sqlite_dbpage WHERE pgno=rootpage" 18098 ") FROM sqlite_schema WHERE name = %Q", zName 18099 ); 18100 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ 18101 bSqlIntkey = sqlite3_column_int(pStmt, 0); 18102 } 18103 shellFinalize(&rc, pStmt); 18104 18105 if( bIntkey==bSqlIntkey ){ 18106 int i; 18107 const char *zPk = "_rowid_"; 18108 sqlite3_stmt *pPkFinder = 0; 18109 18110 /* If this is an intkey table and there is an INTEGER PRIMARY KEY, 18111 ** set zPk to the name of the PK column, and pTab->iPk to the index 18112 ** of the column, where columns are 0-numbered from left to right. 18113 ** Or, if this is a WITHOUT ROWID table or if there is no IPK column, 18114 ** leave zPk as "_rowid_" and pTab->iPk at -2. */ 18115 pTab->iPk = -2; 18116 if( bIntkey ){ 18117 shellPreparePrintf(dbtmp, &rc, &pPkFinder, 18118 "SELECT cid, name FROM pragma_table_info(%Q) " 18119 " WHERE pk=1 AND type='integer' COLLATE nocase" 18120 " AND NOT EXISTS (SELECT cid FROM pragma_table_info(%Q) WHERE pk=2)" 18121 , zName, zName 18122 ); 18123 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPkFinder) ){ 18124 pTab->iPk = sqlite3_column_int(pPkFinder, 0); 18125 zPk = (const char*)sqlite3_column_text(pPkFinder, 1); 18126 } 18127 } 18128 18129 pTab->zQuoted = shellMPrintf(&rc, "\"%w\"", zName); 18130 pTab->azlCol = (char**)shellMalloc(&rc, sizeof(char*) * (nSqlCol+1)); 18131 pTab->nCol = nSqlCol; 18132 18133 if( bIntkey ){ 18134 pTab->azlCol[0] = shellMPrintf(&rc, "\"%w\"", zPk); 18135 }else{ 18136 pTab->azlCol[0] = shellMPrintf(&rc, ""); 18137 } 18138 i = 1; 18139 shellPreparePrintf(dbtmp, &rc, &pStmt, 18140 "SELECT %Q || group_concat(shell_idquote(name), ', ') " 18141 " FILTER (WHERE cid!=%d) OVER (ORDER BY %s cid) " 18142 "FROM pragma_table_info(%Q)", 18143 bIntkey ? ", " : "", pTab->iPk, 18144 bIntkey ? "" : "(CASE WHEN pk=0 THEN 1000000 ELSE pk END), ", 18145 zName 18146 ); 18147 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ 18148 const char *zText = (const char*)sqlite3_column_text(pStmt, 0); 18149 pTab->azlCol[i] = shellMPrintf(&rc, "%s%s", pTab->azlCol[0], zText); 18150 i++; 18151 } 18152 shellFinalize(&rc, pStmt); 18153 18154 shellFinalize(&rc, pPkFinder); 18155 } 18156 } 18157 18158 finished: 18159 sqlite3_close(dbtmp); 18160 *pRc = rc; 18161 if( rc!=SQLITE_OK || (pTab && pTab->zQuoted==0) ){ 18162 recoverFreeTable(pTab); 18163 pTab = 0; 18164 } 18165 return pTab; 18166 } 18167 18168 /* 18169 ** This function is called to search the schema recovered from the 18170 ** sqlite_schema table of the (possibly) corrupt database as part 18171 ** of a ".recover" command. Specifically, for a table with root page 18172 ** iRoot and at least nCol columns. Additionally, if bIntkey is 0, the 18173 ** table must be a WITHOUT ROWID table, or if non-zero, not one of 18174 ** those. 18175 ** 18176 ** If a table is found, a (RecoverTable*) object is returned. Or, if 18177 ** no such table is found, but bIntkey is false and iRoot is the 18178 ** root page of an index in the recovered schema, then (*pbNoop) is 18179 ** set to true and NULL returned. Or, if there is no such table or 18180 ** index, NULL is returned and (*pbNoop) set to 0, indicating that 18181 ** the caller should write data to the orphans table. 18182 */ 18183 static RecoverTable *recoverFindTable( 18184 ShellState *pState, /* Shell state object */ 18185 int *pRc, /* IN/OUT: Error code */ 18186 int iRoot, /* Root page of table */ 18187 int bIntkey, /* True for an intkey table */ 18188 int nCol, /* Number of columns in table */ 18189 int *pbNoop /* OUT: True if iRoot is root of index */ 18190 ){ 18191 sqlite3_stmt *pStmt = 0; 18192 RecoverTable *pRet = 0; 18193 int bNoop = 0; 18194 const char *zSql = 0; 18195 const char *zName = 0; 18196 18197 /* Search the recovered schema for an object with root page iRoot. */ 18198 shellPreparePrintf(pState->db, pRc, &pStmt, 18199 "SELECT type, name, sql FROM recovery.schema WHERE rootpage=%d", iRoot 18200 ); 18201 while( *pRc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ 18202 const char *zType = (const char*)sqlite3_column_text(pStmt, 0); 18203 if( bIntkey==0 && sqlite3_stricmp(zType, "index")==0 ){ 18204 bNoop = 1; 18205 break; 18206 } 18207 if( sqlite3_stricmp(zType, "table")==0 ){ 18208 zName = (const char*)sqlite3_column_text(pStmt, 1); 18209 zSql = (const char*)sqlite3_column_text(pStmt, 2); 18210 pRet = recoverNewTable(pRc, zName, zSql, bIntkey, nCol); 18211 break; 18212 } 18213 } 18214 18215 shellFinalize(pRc, pStmt); 18216 *pbNoop = bNoop; 18217 return pRet; 18218 } 18219 18220 /* 18221 ** Return a RecoverTable object representing the orphans table. 18222 */ 18223 static RecoverTable *recoverOrphanTable( 18224 ShellState *pState, /* Shell state object */ 18225 int *pRc, /* IN/OUT: Error code */ 18226 const char *zLostAndFound, /* Base name for orphans table */ 18227 int nCol /* Number of user data columns */ 18228 ){ 18229 RecoverTable *pTab = 0; 18230 if( nCol>=0 && *pRc==SQLITE_OK ){ 18231 int i; 18232 18233 /* This block determines the name of the orphan table. The prefered 18234 ** name is zLostAndFound. But if that clashes with another name 18235 ** in the recovered schema, try zLostAndFound_0, zLostAndFound_1 18236 ** and so on until a non-clashing name is found. */ 18237 int iTab = 0; 18238 char *zTab = shellMPrintf(pRc, "%s", zLostAndFound); 18239 sqlite3_stmt *pTest = 0; 18240 shellPrepare(pState->db, pRc, 18241 "SELECT 1 FROM recovery.schema WHERE name=?", &pTest 18242 ); 18243 if( pTest ) sqlite3_bind_text(pTest, 1, zTab, -1, SQLITE_TRANSIENT); 18244 while( *pRc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pTest) ){ 18245 shellReset(pRc, pTest); 18246 sqlite3_free(zTab); 18247 zTab = shellMPrintf(pRc, "%s_%d", zLostAndFound, iTab++); 18248 sqlite3_bind_text(pTest, 1, zTab, -1, SQLITE_TRANSIENT); 18249 } 18250 shellFinalize(pRc, pTest); 18251 18252 pTab = (RecoverTable*)shellMalloc(pRc, sizeof(RecoverTable)); 18253 if( pTab ){ 18254 pTab->zQuoted = shellMPrintf(pRc, "\"%w\"", zTab); 18255 pTab->nCol = nCol; 18256 pTab->iPk = -2; 18257 if( nCol>0 ){ 18258 pTab->azlCol = (char**)shellMalloc(pRc, sizeof(char*) * (nCol+1)); 18259 if( pTab->azlCol ){ 18260 pTab->azlCol[nCol] = shellMPrintf(pRc, ""); 18261 for(i=nCol-1; i>=0; i--){ 18262 pTab->azlCol[i] = shellMPrintf(pRc, "%s, NULL", pTab->azlCol[i+1]); 18263 } 18264 } 18265 } 18266 18267 if( *pRc!=SQLITE_OK ){ 18268 recoverFreeTable(pTab); 18269 pTab = 0; 18270 }else{ 18271 raw_printf(pState->out, 18272 "CREATE TABLE %s(rootpgno INTEGER, " 18273 "pgno INTEGER, nfield INTEGER, id INTEGER", pTab->zQuoted 18274 ); 18275 for(i=0; i<nCol; i++){ 18276 raw_printf(pState->out, ", c%d", i); 18277 } 18278 raw_printf(pState->out, ");\n"); 18279 } 18280 } 18281 sqlite3_free(zTab); 18282 } 18283 return pTab; 18284 } 18285 18286 /* 18287 ** This function is called to recover data from the database. A script 18288 ** to construct a new database containing all recovered data is output 18289 ** on stream pState->out. 18290 */ 18291 static int recoverDatabaseCmd(ShellState *pState, int nArg, char **azArg){ 18292 int rc = SQLITE_OK; 18293 sqlite3_stmt *pLoop = 0; /* Loop through all root pages */ 18294 sqlite3_stmt *pPages = 0; /* Loop through all pages in a group */ 18295 sqlite3_stmt *pCells = 0; /* Loop through all cells in a page */ 18296 const char *zRecoveryDb = ""; /* Name of "recovery" database */ 18297 const char *zLostAndFound = "lost_and_found"; 18298 int i; 18299 int nOrphan = -1; 18300 RecoverTable *pOrphan = 0; 18301 18302 int bFreelist = 1; /* 0 if --freelist-corrupt is specified */ 18303 int bRowids = 1; /* 0 if --no-rowids */ 18304 for(i=1; i<nArg; i++){ 18305 char *z = azArg[i]; 18306 int n; 18307 if( z[0]=='-' && z[1]=='-' ) z++; 18308 n = strlen30(z); 18309 if( n<=17 && memcmp("-freelist-corrupt", z, n)==0 ){ 18310 bFreelist = 0; 18311 }else 18312 if( n<=12 && memcmp("-recovery-db", z, n)==0 && i<(nArg-1) ){ 18313 i++; 18314 zRecoveryDb = azArg[i]; 18315 }else 18316 if( n<=15 && memcmp("-lost-and-found", z, n)==0 && i<(nArg-1) ){ 18317 i++; 18318 zLostAndFound = azArg[i]; 18319 }else 18320 if( n<=10 && memcmp("-no-rowids", z, n)==0 ){ 18321 bRowids = 0; 18322 } 18323 else{ 18324 utf8_printf(stderr, "unexpected option: %s\n", azArg[i]); 18325 showHelp(pState->out, azArg[0]); 18326 return 1; 18327 } 18328 } 18329 18330 shellExecPrintf(pState->db, &rc, 18331 /* Attach an in-memory database named 'recovery'. Create an indexed 18332 ** cache of the sqlite_dbptr virtual table. */ 18333 "PRAGMA writable_schema = on;" 18334 "ATTACH %Q AS recovery;" 18335 "DROP TABLE IF EXISTS recovery.dbptr;" 18336 "DROP TABLE IF EXISTS recovery.freelist;" 18337 "DROP TABLE IF EXISTS recovery.map;" 18338 "DROP TABLE IF EXISTS recovery.schema;" 18339 "CREATE TABLE recovery.freelist(pgno INTEGER PRIMARY KEY);", zRecoveryDb 18340 ); 18341 18342 if( bFreelist ){ 18343 shellExec(pState->db, &rc, 18344 "WITH trunk(pgno) AS (" 18345 " SELECT shell_int32(" 18346 " (SELECT data FROM sqlite_dbpage WHERE pgno=1), 8) AS x " 18347 " WHERE x>0" 18348 " UNION" 18349 " SELECT shell_int32(" 18350 " (SELECT data FROM sqlite_dbpage WHERE pgno=trunk.pgno), 0) AS x " 18351 " FROM trunk WHERE x>0" 18352 ")," 18353 "freelist(data, n, freepgno) AS (" 18354 " SELECT data, min(16384, shell_int32(data, 1)-1), t.pgno " 18355 " FROM trunk t, sqlite_dbpage s WHERE s.pgno=t.pgno" 18356 " UNION ALL" 18357 " SELECT data, n-1, shell_int32(data, 2+n) " 18358 " FROM freelist WHERE n>=0" 18359 ")" 18360 "REPLACE INTO recovery.freelist SELECT freepgno FROM freelist;" 18361 ); 18362 } 18363 18364 /* If this is an auto-vacuum database, add all pointer-map pages to 18365 ** the freelist table. Do this regardless of whether or not 18366 ** --freelist-corrupt was specified. */ 18367 shellExec(pState->db, &rc, 18368 "WITH ptrmap(pgno) AS (" 18369 " SELECT 2 WHERE shell_int32(" 18370 " (SELECT data FROM sqlite_dbpage WHERE pgno=1), 13" 18371 " )" 18372 " UNION ALL " 18373 " SELECT pgno+1+(SELECT page_size FROM pragma_page_size)/5 AS pp " 18374 " FROM ptrmap WHERE pp<=(SELECT page_count FROM pragma_page_count)" 18375 ")" 18376 "REPLACE INTO recovery.freelist SELECT pgno FROM ptrmap" 18377 ); 18378 18379 shellExec(pState->db, &rc, 18380 "CREATE TABLE recovery.dbptr(" 18381 " pgno, child, PRIMARY KEY(child, pgno)" 18382 ") WITHOUT ROWID;" 18383 "INSERT OR IGNORE INTO recovery.dbptr(pgno, child) " 18384 " SELECT * FROM sqlite_dbptr" 18385 " WHERE pgno NOT IN freelist AND child NOT IN freelist;" 18386 18387 /* Delete any pointer to page 1. This ensures that page 1 is considered 18388 ** a root page, regardless of how corrupt the db is. */ 18389 "DELETE FROM recovery.dbptr WHERE child = 1;" 18390 18391 /* Delete all pointers to any pages that have more than one pointer 18392 ** to them. Such pages will be treated as root pages when recovering 18393 ** data. */ 18394 "DELETE FROM recovery.dbptr WHERE child IN (" 18395 " SELECT child FROM recovery.dbptr GROUP BY child HAVING count(*)>1" 18396 ");" 18397 18398 /* Create the "map" table that will (eventually) contain instructions 18399 ** for dealing with each page in the db that contains one or more 18400 ** records. */ 18401 "CREATE TABLE recovery.map(" 18402 "pgno INTEGER PRIMARY KEY, maxlen INT, intkey, root INT" 18403 ");" 18404 18405 /* Populate table [map]. If there are circular loops of pages in the 18406 ** database, the following adds all pages in such a loop to the map 18407 ** as individual root pages. This could be handled better. */ 18408 "WITH pages(i, maxlen) AS (" 18409 " SELECT page_count, (" 18410 " SELECT max(field+1) FROM sqlite_dbdata WHERE pgno=page_count" 18411 " ) FROM pragma_page_count WHERE page_count>0" 18412 " UNION ALL" 18413 " SELECT i-1, (" 18414 " SELECT max(field+1) FROM sqlite_dbdata WHERE pgno=i-1" 18415 " ) FROM pages WHERE i>=2" 18416 ")" 18417 "INSERT INTO recovery.map(pgno, maxlen, intkey, root) " 18418 " SELECT i, maxlen, NULL, (" 18419 " WITH p(orig, pgno, parent) AS (" 18420 " SELECT 0, i, (SELECT pgno FROM recovery.dbptr WHERE child=i)" 18421 " UNION " 18422 " SELECT i, p.parent, " 18423 " (SELECT pgno FROM recovery.dbptr WHERE child=p.parent) FROM p" 18424 " )" 18425 " SELECT pgno FROM p WHERE (parent IS NULL OR pgno = orig)" 18426 ") " 18427 "FROM pages WHERE maxlen IS NOT NULL AND i NOT IN freelist;" 18428 "UPDATE recovery.map AS o SET intkey = (" 18429 " SELECT substr(data, 1, 1)==X'0D' FROM sqlite_dbpage WHERE pgno=o.pgno" 18430 ");" 18431 18432 /* Extract data from page 1 and any linked pages into table 18433 ** recovery.schema. With the same schema as an sqlite_schema table. */ 18434 "CREATE TABLE recovery.schema(type, name, tbl_name, rootpage, sql);" 18435 "INSERT INTO recovery.schema SELECT " 18436 " max(CASE WHEN field=0 THEN value ELSE NULL END)," 18437 " max(CASE WHEN field=1 THEN value ELSE NULL END)," 18438 " max(CASE WHEN field=2 THEN value ELSE NULL END)," 18439 " max(CASE WHEN field=3 THEN value ELSE NULL END)," 18440 " max(CASE WHEN field=4 THEN value ELSE NULL END)" 18441 "FROM sqlite_dbdata WHERE pgno IN (" 18442 " SELECT pgno FROM recovery.map WHERE root=1" 18443 ")" 18444 "GROUP BY pgno, cell;" 18445 "CREATE INDEX recovery.schema_rootpage ON schema(rootpage);" 18446 ); 18447 18448 /* Open a transaction, then print out all non-virtual, non-"sqlite_%" 18449 ** CREATE TABLE statements that extracted from the existing schema. */ 18450 if( rc==SQLITE_OK ){ 18451 sqlite3_stmt *pStmt = 0; 18452 /* ".recover" might output content in an order which causes immediate 18453 ** foreign key constraints to be violated. So disable foreign-key 18454 ** constraint enforcement to prevent problems when running the output 18455 ** script. */ 18456 raw_printf(pState->out, "PRAGMA foreign_keys=OFF;\n"); 18457 raw_printf(pState->out, "BEGIN;\n"); 18458 raw_printf(pState->out, "PRAGMA writable_schema = on;\n"); 18459 shellPrepare(pState->db, &rc, 18460 "SELECT sql FROM recovery.schema " 18461 "WHERE type='table' AND sql LIKE 'create table%'", &pStmt 18462 ); 18463 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ 18464 const char *zCreateTable = (const char*)sqlite3_column_text(pStmt, 0); 18465 raw_printf(pState->out, "CREATE TABLE IF NOT EXISTS %s;\n", 18466 &zCreateTable[12] 18467 ); 18468 } 18469 shellFinalize(&rc, pStmt); 18470 } 18471 18472 /* Figure out if an orphan table will be required. And if so, how many 18473 ** user columns it should contain */ 18474 shellPrepare(pState->db, &rc, 18475 "SELECT coalesce(max(maxlen), -2) FROM recovery.map WHERE root>1" 18476 , &pLoop 18477 ); 18478 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pLoop) ){ 18479 nOrphan = sqlite3_column_int(pLoop, 0); 18480 } 18481 shellFinalize(&rc, pLoop); 18482 pLoop = 0; 18483 18484 shellPrepare(pState->db, &rc, 18485 "SELECT pgno FROM recovery.map WHERE root=?", &pPages 18486 ); 18487 18488 shellPrepare(pState->db, &rc, 18489 "SELECT max(field), group_concat(shell_escape_crnl(quote" 18490 "(case when (? AND field<0) then NULL else value end)" 18491 "), ', ')" 18492 ", min(field) " 18493 "FROM sqlite_dbdata WHERE pgno = ? AND field != ?" 18494 "GROUP BY cell", &pCells 18495 ); 18496 18497 /* Loop through each root page. */ 18498 shellPrepare(pState->db, &rc, 18499 "SELECT root, intkey, max(maxlen) FROM recovery.map" 18500 " WHERE root>1 GROUP BY root, intkey ORDER BY root=(" 18501 " SELECT rootpage FROM recovery.schema WHERE name='sqlite_sequence'" 18502 ")", &pLoop 18503 ); 18504 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pLoop) ){ 18505 int iRoot = sqlite3_column_int(pLoop, 0); 18506 int bIntkey = sqlite3_column_int(pLoop, 1); 18507 int nCol = sqlite3_column_int(pLoop, 2); 18508 int bNoop = 0; 18509 RecoverTable *pTab; 18510 18511 assert( bIntkey==0 || bIntkey==1 ); 18512 pTab = recoverFindTable(pState, &rc, iRoot, bIntkey, nCol, &bNoop); 18513 if( bNoop || rc ) continue; 18514 if( pTab==0 ){ 18515 if( pOrphan==0 ){ 18516 pOrphan = recoverOrphanTable(pState, &rc, zLostAndFound, nOrphan); 18517 } 18518 pTab = pOrphan; 18519 if( pTab==0 ) break; 18520 } 18521 18522 if( 0==sqlite3_stricmp(pTab->zQuoted, "\"sqlite_sequence\"") ){ 18523 raw_printf(pState->out, "DELETE FROM sqlite_sequence;\n"); 18524 } 18525 sqlite3_bind_int(pPages, 1, iRoot); 18526 if( bRowids==0 && pTab->iPk<0 ){ 18527 sqlite3_bind_int(pCells, 1, 1); 18528 }else{ 18529 sqlite3_bind_int(pCells, 1, 0); 18530 } 18531 sqlite3_bind_int(pCells, 3, pTab->iPk); 18532 18533 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPages) ){ 18534 int iPgno = sqlite3_column_int(pPages, 0); 18535 sqlite3_bind_int(pCells, 2, iPgno); 18536 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pCells) ){ 18537 int nField = sqlite3_column_int(pCells, 0); 18538 int iMin = sqlite3_column_int(pCells, 2); 18539 const char *zVal = (const char*)sqlite3_column_text(pCells, 1); 18540 18541 RecoverTable *pTab2 = pTab; 18542 if( pTab!=pOrphan && (iMin<0)!=bIntkey ){ 18543 if( pOrphan==0 ){ 18544 pOrphan = recoverOrphanTable(pState, &rc, zLostAndFound, nOrphan); 18545 } 18546 pTab2 = pOrphan; 18547 if( pTab2==0 ) break; 18548 } 18549 18550 nField = nField+1; 18551 if( pTab2==pOrphan ){ 18552 raw_printf(pState->out, 18553 "INSERT INTO %s VALUES(%d, %d, %d, %s%s%s);\n", 18554 pTab2->zQuoted, iRoot, iPgno, nField, 18555 iMin<0 ? "" : "NULL, ", zVal, pTab2->azlCol[nField] 18556 ); 18557 }else{ 18558 raw_printf(pState->out, "INSERT INTO %s(%s) VALUES( %s );\n", 18559 pTab2->zQuoted, pTab2->azlCol[nField], zVal 18560 ); 18561 } 18562 } 18563 shellReset(&rc, pCells); 18564 } 18565 shellReset(&rc, pPages); 18566 if( pTab!=pOrphan ) recoverFreeTable(pTab); 18567 } 18568 shellFinalize(&rc, pLoop); 18569 shellFinalize(&rc, pPages); 18570 shellFinalize(&rc, pCells); 18571 recoverFreeTable(pOrphan); 18572 18573 /* The rest of the schema */ 18574 if( rc==SQLITE_OK ){ 18575 sqlite3_stmt *pStmt = 0; 18576 shellPrepare(pState->db, &rc, 18577 "SELECT sql, name FROM recovery.schema " 18578 "WHERE sql NOT LIKE 'create table%'", &pStmt 18579 ); 18580 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ 18581 const char *zSql = (const char*)sqlite3_column_text(pStmt, 0); 18582 if( sqlite3_strnicmp(zSql, "create virt", 11)==0 ){ 18583 const char *zName = (const char*)sqlite3_column_text(pStmt, 1); 18584 char *zPrint = shellMPrintf(&rc, 18585 "INSERT INTO sqlite_schema VALUES('table', %Q, %Q, 0, %Q)", 18586 zName, zName, zSql 18587 ); 18588 raw_printf(pState->out, "%s;\n", zPrint); 18589 sqlite3_free(zPrint); 18590 }else{ 18591 raw_printf(pState->out, "%s;\n", zSql); 18592 } 18593 } 18594 shellFinalize(&rc, pStmt); 18595 } 18596 18597 if( rc==SQLITE_OK ){ 18598 raw_printf(pState->out, "PRAGMA writable_schema = off;\n"); 18599 raw_printf(pState->out, "COMMIT;\n"); 18600 } 18601 sqlite3_exec(pState->db, "DETACH recovery", 0, 0, 0); 18602 return rc; 18603 } 18604 #endif /* !(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) */ 18605 18606 /* 18607 ** If an input line begins with "." then invoke this routine to 18608 ** process that line. 18609 ** 18610 ** Return 1 on error, 2 to exit, and 0 otherwise. 18611 */ 18612 static int do_meta_command(char *zLine, ShellState *p){ 18613 int h = 1; 18614 int nArg = 0; 18615 int n, c; 18616 int rc = 0; 18617 char *azArg[52]; 18618 18619 #ifndef SQLITE_OMIT_VIRTUALTABLE 18620 if( p->expert.pExpert ){ 18621 expertFinish(p, 1, 0); 18622 } 18623 #endif 18624 18625 /* Parse the input line into tokens. 18626 */ 18627 while( zLine[h] && nArg<ArraySize(azArg)-1 ){ 18628 while( IsSpace(zLine[h]) ){ h++; } 18629 if( zLine[h]==0 ) break; 18630 if( zLine[h]=='\'' || zLine[h]=='"' ){ 18631 int delim = zLine[h++]; 18632 azArg[nArg++] = &zLine[h]; 18633 while( zLine[h] && zLine[h]!=delim ){ 18634 if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++; 18635 h++; 18636 } 18637 if( zLine[h]==delim ){ 18638 zLine[h++] = 0; 18639 } 18640 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]); 18641 }else{ 18642 azArg[nArg++] = &zLine[h]; 18643 while( zLine[h] && !IsSpace(zLine[h]) ){ h++; } 18644 if( zLine[h] ) zLine[h++] = 0; 18645 resolve_backslashes(azArg[nArg-1]); 18646 } 18647 } 18648 azArg[nArg] = 0; 18649 18650 /* Process the input line. 18651 */ 18652 if( nArg==0 ) return 0; /* no tokens, no error */ 18653 n = strlen30(azArg[0]); 18654 c = azArg[0][0]; 18655 clearTempFile(p); 18656 18657 #ifndef SQLITE_OMIT_AUTHORIZATION 18658 if( c=='a' && strncmp(azArg[0], "auth", n)==0 ){ 18659 if( nArg!=2 ){ 18660 raw_printf(stderr, "Usage: .auth ON|OFF\n"); 18661 rc = 1; 18662 goto meta_command_exit; 18663 } 18664 open_db(p, 0); 18665 if( booleanValue(azArg[1]) ){ 18666 sqlite3_set_authorizer(p->db, shellAuth, p); 18667 }else if( p->bSafeModePersist ){ 18668 sqlite3_set_authorizer(p->db, safeModeAuth, p); 18669 }else{ 18670 sqlite3_set_authorizer(p->db, 0, 0); 18671 } 18672 }else 18673 #endif 18674 18675 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) 18676 if( c=='a' && strncmp(azArg[0], "archive", n)==0 ){ 18677 open_db(p, 0); 18678 failIfSafeMode(p, "cannot run .archive in safe mode"); 18679 rc = arDotCommand(p, 0, azArg, nArg); 18680 }else 18681 #endif 18682 18683 if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0) 18684 || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0) 18685 ){ 18686 const char *zDestFile = 0; 18687 const char *zDb = 0; 18688 sqlite3 *pDest; 18689 sqlite3_backup *pBackup; 18690 int j; 18691 int bAsync = 0; 18692 const char *zVfs = 0; 18693 failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]); 18694 for(j=1; j<nArg; j++){ 18695 const char *z = azArg[j]; 18696 if( z[0]=='-' ){ 18697 if( z[1]=='-' ) z++; 18698 if( strcmp(z, "-append")==0 ){ 18699 zVfs = "apndvfs"; 18700 }else 18701 if( strcmp(z, "-async")==0 ){ 18702 bAsync = 1; 18703 }else 18704 { 18705 utf8_printf(stderr, "unknown option: %s\n", azArg[j]); 18706 return 1; 18707 } 18708 }else if( zDestFile==0 ){ 18709 zDestFile = azArg[j]; 18710 }else if( zDb==0 ){ 18711 zDb = zDestFile; 18712 zDestFile = azArg[j]; 18713 }else{ 18714 raw_printf(stderr, "Usage: .backup ?DB? ?OPTIONS? FILENAME\n"); 18715 return 1; 18716 } 18717 } 18718 if( zDestFile==0 ){ 18719 raw_printf(stderr, "missing FILENAME argument on .backup\n"); 18720 return 1; 18721 } 18722 if( zDb==0 ) zDb = "main"; 18723 rc = sqlite3_open_v2(zDestFile, &pDest, 18724 SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, zVfs); 18725 if( rc!=SQLITE_OK ){ 18726 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zDestFile); 18727 close_db(pDest); 18728 return 1; 18729 } 18730 if( bAsync ){ 18731 sqlite3_exec(pDest, "PRAGMA synchronous=OFF; PRAGMA journal_mode=OFF;", 18732 0, 0, 0); 18733 } 18734 open_db(p, 0); 18735 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb); 18736 if( pBackup==0 ){ 18737 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest)); 18738 close_db(pDest); 18739 return 1; 18740 } 18741 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){} 18742 sqlite3_backup_finish(pBackup); 18743 if( rc==SQLITE_DONE ){ 18744 rc = 0; 18745 }else{ 18746 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest)); 18747 rc = 1; 18748 } 18749 close_db(pDest); 18750 }else 18751 18752 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){ 18753 if( nArg==2 ){ 18754 bail_on_error = booleanValue(azArg[1]); 18755 }else{ 18756 raw_printf(stderr, "Usage: .bail on|off\n"); 18757 rc = 1; 18758 } 18759 }else 18760 18761 if( c=='b' && n>=3 && strncmp(azArg[0], "binary", n)==0 ){ 18762 if( nArg==2 ){ 18763 if( booleanValue(azArg[1]) ){ 18764 setBinaryMode(p->out, 1); 18765 }else{ 18766 setTextMode(p->out, 1); 18767 } 18768 }else{ 18769 raw_printf(stderr, "Usage: .binary on|off\n"); 18770 rc = 1; 18771 } 18772 }else 18773 18774 /* The undocumented ".breakpoint" command causes a call to the no-op 18775 ** routine named test_breakpoint(). 18776 */ 18777 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){ 18778 test_breakpoint(); 18779 }else 18780 18781 if( c=='c' && strcmp(azArg[0],"cd")==0 ){ 18782 failIfSafeMode(p, "cannot run .cd in safe mode"); 18783 if( nArg==2 ){ 18784 #if defined(_WIN32) || defined(WIN32) 18785 wchar_t *z = sqlite3_win32_utf8_to_unicode(azArg[1]); 18786 rc = !SetCurrentDirectoryW(z); 18787 sqlite3_free(z); 18788 #else 18789 rc = chdir(azArg[1]); 18790 #endif 18791 if( rc ){ 18792 utf8_printf(stderr, "Cannot change to directory \"%s\"\n", azArg[1]); 18793 rc = 1; 18794 } 18795 }else{ 18796 raw_printf(stderr, "Usage: .cd DIRECTORY\n"); 18797 rc = 1; 18798 } 18799 }else 18800 18801 if( c=='c' && n>=3 && strncmp(azArg[0], "changes", n)==0 ){ 18802 if( nArg==2 ){ 18803 setOrClearFlag(p, SHFLG_CountChanges, azArg[1]); 18804 }else{ 18805 raw_printf(stderr, "Usage: .changes on|off\n"); 18806 rc = 1; 18807 } 18808 }else 18809 18810 /* Cancel output redirection, if it is currently set (by .testcase) 18811 ** Then read the content of the testcase-out.txt file and compare against 18812 ** azArg[1]. If there are differences, report an error and exit. 18813 */ 18814 if( c=='c' && n>=3 && strncmp(azArg[0], "check", n)==0 ){ 18815 char *zRes = 0; 18816 output_reset(p); 18817 if( nArg!=2 ){ 18818 raw_printf(stderr, "Usage: .check GLOB-PATTERN\n"); 18819 rc = 2; 18820 }else if( (zRes = readFile("testcase-out.txt", 0))==0 ){ 18821 raw_printf(stderr, "Error: cannot read 'testcase-out.txt'\n"); 18822 rc = 2; 18823 }else if( testcase_glob(azArg[1],zRes)==0 ){ 18824 utf8_printf(stderr, 18825 "testcase-%s FAILED\n Expected: [%s]\n Got: [%s]\n", 18826 p->zTestcase, azArg[1], zRes); 18827 rc = 1; 18828 }else{ 18829 utf8_printf(stdout, "testcase-%s ok\n", p->zTestcase); 18830 p->nCheck++; 18831 } 18832 sqlite3_free(zRes); 18833 }else 18834 18835 if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){ 18836 failIfSafeMode(p, "cannot run .clone in safe mode"); 18837 if( nArg==2 ){ 18838 tryToClone(p, azArg[1]); 18839 }else{ 18840 raw_printf(stderr, "Usage: .clone FILENAME\n"); 18841 rc = 1; 18842 } 18843 }else 18844 18845 if( c=='c' && strncmp(azArg[0], "connection", n)==0 ){ 18846 if( nArg==1 ){ 18847 /* List available connections */ 18848 int i; 18849 for(i=0; i<ArraySize(p->aAuxDb); i++){ 18850 const char *zFile = p->aAuxDb[i].zDbFilename; 18851 if( p->aAuxDb[i].db==0 && p->pAuxDb!=&p->aAuxDb[i] ){ 18852 zFile = "(not open)"; 18853 }else if( zFile==0 ){ 18854 zFile = "(memory)"; 18855 }else if( zFile[0]==0 ){ 18856 zFile = "(temporary-file)"; 18857 } 18858 if( p->pAuxDb == &p->aAuxDb[i] ){ 18859 utf8_printf(stdout, "ACTIVE %d: %s\n", i, zFile); 18860 }else if( p->aAuxDb[i].db!=0 ){ 18861 utf8_printf(stdout, " %d: %s\n", i, zFile); 18862 } 18863 } 18864 }else if( nArg==2 && IsDigit(azArg[1][0]) && azArg[1][1]==0 ){ 18865 int i = azArg[1][0] - '0'; 18866 if( p->pAuxDb != &p->aAuxDb[i] && i>=0 && i<ArraySize(p->aAuxDb) ){ 18867 p->pAuxDb->db = p->db; 18868 p->pAuxDb = &p->aAuxDb[i]; 18869 globalDb = p->db = p->pAuxDb->db; 18870 p->pAuxDb->db = 0; 18871 } 18872 }else if( nArg==3 && strcmp(azArg[1], "close")==0 18873 && IsDigit(azArg[2][0]) && azArg[2][1]==0 ){ 18874 int i = azArg[2][0] - '0'; 18875 if( i<0 || i>=ArraySize(p->aAuxDb) ){ 18876 /* No-op */ 18877 }else if( p->pAuxDb == &p->aAuxDb[i] ){ 18878 raw_printf(stderr, "cannot close the active database connection\n"); 18879 rc = 1; 18880 }else if( p->aAuxDb[i].db ){ 18881 session_close_all(p, i); 18882 close_db(p->aAuxDb[i].db); 18883 p->aAuxDb[i].db = 0; 18884 } 18885 }else{ 18886 raw_printf(stderr, "Usage: .connection [close] [CONNECTION-NUMBER]\n"); 18887 rc = 1; 18888 } 18889 }else 18890 18891 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){ 18892 char **azName = 0; 18893 int nName = 0; 18894 sqlite3_stmt *pStmt; 18895 int i; 18896 open_db(p, 0); 18897 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0); 18898 if( rc ){ 18899 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); 18900 rc = 1; 18901 }else{ 18902 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 18903 const char *zSchema = (const char *)sqlite3_column_text(pStmt,1); 18904 const char *zFile = (const char*)sqlite3_column_text(pStmt,2); 18905 azName = sqlite3_realloc(azName, (nName+1)*2*sizeof(char*)); 18906 if( azName==0 ){ shell_out_of_memory(); /* Does not return */ } 18907 azName[nName*2] = strdup(zSchema); 18908 azName[nName*2+1] = strdup(zFile); 18909 nName++; 18910 } 18911 } 18912 sqlite3_finalize(pStmt); 18913 for(i=0; i<nName; i++){ 18914 int eTxn = sqlite3_txn_state(p->db, azName[i*2]); 18915 int bRdonly = sqlite3_db_readonly(p->db, azName[i*2]); 18916 const char *z = azName[i*2+1]; 18917 utf8_printf(p->out, "%s: %s %s%s\n", 18918 azName[i*2], 18919 z && z[0] ? z : "\"\"", 18920 bRdonly ? "r/o" : "r/w", 18921 eTxn==SQLITE_TXN_NONE ? "" : 18922 eTxn==SQLITE_TXN_READ ? " read-txn" : " write-txn"); 18923 free(azName[i*2]); 18924 free(azName[i*2+1]); 18925 } 18926 sqlite3_free(azName); 18927 }else 18928 18929 if( c=='d' && n>=3 && strncmp(azArg[0], "dbconfig", n)==0 ){ 18930 static const struct DbConfigChoices { 18931 const char *zName; 18932 int op; 18933 } aDbConfig[] = { 18934 { "defensive", SQLITE_DBCONFIG_DEFENSIVE }, 18935 { "dqs_ddl", SQLITE_DBCONFIG_DQS_DDL }, 18936 { "dqs_dml", SQLITE_DBCONFIG_DQS_DML }, 18937 { "enable_fkey", SQLITE_DBCONFIG_ENABLE_FKEY }, 18938 { "enable_qpsg", SQLITE_DBCONFIG_ENABLE_QPSG }, 18939 { "enable_trigger", SQLITE_DBCONFIG_ENABLE_TRIGGER }, 18940 { "enable_view", SQLITE_DBCONFIG_ENABLE_VIEW }, 18941 { "fts3_tokenizer", SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER }, 18942 { "legacy_alter_table", SQLITE_DBCONFIG_LEGACY_ALTER_TABLE }, 18943 { "legacy_file_format", SQLITE_DBCONFIG_LEGACY_FILE_FORMAT }, 18944 { "load_extension", SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION }, 18945 { "no_ckpt_on_close", SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE }, 18946 { "reset_database", SQLITE_DBCONFIG_RESET_DATABASE }, 18947 { "trigger_eqp", SQLITE_DBCONFIG_TRIGGER_EQP }, 18948 { "trusted_schema", SQLITE_DBCONFIG_TRUSTED_SCHEMA }, 18949 { "writable_schema", SQLITE_DBCONFIG_WRITABLE_SCHEMA }, 18950 }; 18951 int ii, v; 18952 open_db(p, 0); 18953 for(ii=0; ii<ArraySize(aDbConfig); ii++){ 18954 if( nArg>1 && strcmp(azArg[1], aDbConfig[ii].zName)!=0 ) continue; 18955 if( nArg>=3 ){ 18956 sqlite3_db_config(p->db, aDbConfig[ii].op, booleanValue(azArg[2]), 0); 18957 } 18958 sqlite3_db_config(p->db, aDbConfig[ii].op, -1, &v); 18959 utf8_printf(p->out, "%19s %s\n", aDbConfig[ii].zName, v ? "on" : "off"); 18960 if( nArg>1 ) break; 18961 } 18962 if( nArg>1 && ii==ArraySize(aDbConfig) ){ 18963 utf8_printf(stderr, "Error: unknown dbconfig \"%s\"\n", azArg[1]); 18964 utf8_printf(stderr, "Enter \".dbconfig\" with no arguments for a list\n"); 18965 } 18966 }else 18967 18968 if( c=='d' && n>=3 && strncmp(azArg[0], "dbinfo", n)==0 ){ 18969 rc = shell_dbinfo_command(p, nArg, azArg); 18970 }else 18971 18972 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) 18973 if( c=='r' && strncmp(azArg[0], "recover", n)==0 ){ 18974 open_db(p, 0); 18975 rc = recoverDatabaseCmd(p, nArg, azArg); 18976 }else 18977 #endif /* !(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) */ 18978 18979 if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){ 18980 char *zLike = 0; 18981 char *zSql; 18982 int i; 18983 int savedShowHeader = p->showHeader; 18984 int savedShellFlags = p->shellFlgs; 18985 ShellClearFlag(p, 18986 SHFLG_PreserveRowid|SHFLG_Newlines|SHFLG_Echo 18987 |SHFLG_DumpDataOnly|SHFLG_DumpNoSys); 18988 for(i=1; i<nArg; i++){ 18989 if( azArg[i][0]=='-' ){ 18990 const char *z = azArg[i]+1; 18991 if( z[0]=='-' ) z++; 18992 if( strcmp(z,"preserve-rowids")==0 ){ 18993 #ifdef SQLITE_OMIT_VIRTUALTABLE 18994 raw_printf(stderr, "The --preserve-rowids option is not compatible" 18995 " with SQLITE_OMIT_VIRTUALTABLE\n"); 18996 rc = 1; 18997 sqlite3_free(zLike); 18998 goto meta_command_exit; 18999 #else 19000 ShellSetFlag(p, SHFLG_PreserveRowid); 19001 #endif 19002 }else 19003 if( strcmp(z,"newlines")==0 ){ 19004 ShellSetFlag(p, SHFLG_Newlines); 19005 }else 19006 if( strcmp(z,"data-only")==0 ){ 19007 ShellSetFlag(p, SHFLG_DumpDataOnly); 19008 }else 19009 if( strcmp(z,"nosys")==0 ){ 19010 ShellSetFlag(p, SHFLG_DumpNoSys); 19011 }else 19012 { 19013 raw_printf(stderr, "Unknown option \"%s\" on \".dump\"\n", azArg[i]); 19014 rc = 1; 19015 sqlite3_free(zLike); 19016 goto meta_command_exit; 19017 } 19018 }else{ 19019 /* azArg[i] contains a LIKE pattern. This ".dump" request should 19020 ** only dump data for tables for which either the table name matches 19021 ** the LIKE pattern, or the table appears to be a shadow table of 19022 ** a virtual table for which the name matches the LIKE pattern. 19023 */ 19024 char *zExpr = sqlite3_mprintf( 19025 "name LIKE %Q ESCAPE '\\' OR EXISTS (" 19026 " SELECT 1 FROM sqlite_schema WHERE " 19027 " name LIKE %Q ESCAPE '\\' AND" 19028 " sql LIKE 'CREATE VIRTUAL TABLE%%' AND" 19029 " substr(o.name, 1, length(name)+1) == (name||'_')" 19030 ")", azArg[i], azArg[i] 19031 ); 19032 19033 if( zLike ){ 19034 zLike = sqlite3_mprintf("%z OR %z", zLike, zExpr); 19035 }else{ 19036 zLike = zExpr; 19037 } 19038 } 19039 } 19040 19041 open_db(p, 0); 19042 19043 if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){ 19044 /* When playing back a "dump", the content might appear in an order 19045 ** which causes immediate foreign key constraints to be violated. 19046 ** So disable foreign-key constraint enforcement to prevent problems. */ 19047 raw_printf(p->out, "PRAGMA foreign_keys=OFF;\n"); 19048 raw_printf(p->out, "BEGIN TRANSACTION;\n"); 19049 } 19050 p->writableSchema = 0; 19051 p->showHeader = 0; 19052 /* Set writable_schema=ON since doing so forces SQLite to initialize 19053 ** as much of the schema as it can even if the sqlite_schema table is 19054 ** corrupt. */ 19055 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0); 19056 p->nErr = 0; 19057 if( zLike==0 ) zLike = sqlite3_mprintf("true"); 19058 zSql = sqlite3_mprintf( 19059 "SELECT name, type, sql FROM sqlite_schema AS o " 19060 "WHERE (%s) AND type=='table'" 19061 " AND sql NOT NULL" 19062 " ORDER BY tbl_name='sqlite_sequence', rowid", 19063 zLike 19064 ); 19065 run_schema_dump_query(p,zSql); 19066 sqlite3_free(zSql); 19067 if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){ 19068 zSql = sqlite3_mprintf( 19069 "SELECT sql FROM sqlite_schema AS o " 19070 "WHERE (%s) AND sql NOT NULL" 19071 " AND type IN ('index','trigger','view')", 19072 zLike 19073 ); 19074 run_table_dump_query(p, zSql); 19075 sqlite3_free(zSql); 19076 } 19077 sqlite3_free(zLike); 19078 if( p->writableSchema ){ 19079 raw_printf(p->out, "PRAGMA writable_schema=OFF;\n"); 19080 p->writableSchema = 0; 19081 } 19082 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0); 19083 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0); 19084 if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){ 19085 raw_printf(p->out, p->nErr?"ROLLBACK; -- due to errors\n":"COMMIT;\n"); 19086 } 19087 p->showHeader = savedShowHeader; 19088 p->shellFlgs = savedShellFlags; 19089 }else 19090 19091 if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){ 19092 if( nArg==2 ){ 19093 setOrClearFlag(p, SHFLG_Echo, azArg[1]); 19094 }else{ 19095 raw_printf(stderr, "Usage: .echo on|off\n"); 19096 rc = 1; 19097 } 19098 }else 19099 19100 if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){ 19101 if( nArg==2 ){ 19102 p->autoEQPtest = 0; 19103 if( p->autoEQPtrace ){ 19104 if( p->db ) sqlite3_exec(p->db, "PRAGMA vdbe_trace=OFF;", 0, 0, 0); 19105 p->autoEQPtrace = 0; 19106 } 19107 if( strcmp(azArg[1],"full")==0 ){ 19108 p->autoEQP = AUTOEQP_full; 19109 }else if( strcmp(azArg[1],"trigger")==0 ){ 19110 p->autoEQP = AUTOEQP_trigger; 19111 #ifdef SQLITE_DEBUG 19112 }else if( strcmp(azArg[1],"test")==0 ){ 19113 p->autoEQP = AUTOEQP_on; 19114 p->autoEQPtest = 1; 19115 }else if( strcmp(azArg[1],"trace")==0 ){ 19116 p->autoEQP = AUTOEQP_full; 19117 p->autoEQPtrace = 1; 19118 open_db(p, 0); 19119 sqlite3_exec(p->db, "SELECT name FROM sqlite_schema LIMIT 1", 0, 0, 0); 19120 sqlite3_exec(p->db, "PRAGMA vdbe_trace=ON;", 0, 0, 0); 19121 #endif 19122 }else{ 19123 p->autoEQP = (u8)booleanValue(azArg[1]); 19124 } 19125 }else{ 19126 raw_printf(stderr, "Usage: .eqp off|on|trace|trigger|full\n"); 19127 rc = 1; 19128 } 19129 }else 19130 19131 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){ 19132 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc); 19133 rc = 2; 19134 }else 19135 19136 /* The ".explain" command is automatic now. It is largely pointless. It 19137 ** retained purely for backwards compatibility */ 19138 if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){ 19139 int val = 1; 19140 if( nArg>=2 ){ 19141 if( strcmp(azArg[1],"auto")==0 ){ 19142 val = 99; 19143 }else{ 19144 val = booleanValue(azArg[1]); 19145 } 19146 } 19147 if( val==1 && p->mode!=MODE_Explain ){ 19148 p->normalMode = p->mode; 19149 p->mode = MODE_Explain; 19150 p->autoExplain = 0; 19151 }else if( val==0 ){ 19152 if( p->mode==MODE_Explain ) p->mode = p->normalMode; 19153 p->autoExplain = 0; 19154 }else if( val==99 ){ 19155 if( p->mode==MODE_Explain ) p->mode = p->normalMode; 19156 p->autoExplain = 1; 19157 } 19158 }else 19159 19160 #ifndef SQLITE_OMIT_VIRTUALTABLE 19161 if( c=='e' && strncmp(azArg[0], "expert", n)==0 ){ 19162 open_db(p, 0); 19163 expertDotCommand(p, azArg, nArg); 19164 }else 19165 #endif 19166 19167 if( c=='f' && strncmp(azArg[0], "filectrl", n)==0 ){ 19168 static const struct { 19169 const char *zCtrlName; /* Name of a test-control option */ 19170 int ctrlCode; /* Integer code for that option */ 19171 const char *zUsage; /* Usage notes */ 19172 } aCtrl[] = { 19173 { "chunk_size", SQLITE_FCNTL_CHUNK_SIZE, "SIZE" }, 19174 { "data_version", SQLITE_FCNTL_DATA_VERSION, "" }, 19175 { "has_moved", SQLITE_FCNTL_HAS_MOVED, "" }, 19176 { "lock_timeout", SQLITE_FCNTL_LOCK_TIMEOUT, "MILLISEC" }, 19177 { "persist_wal", SQLITE_FCNTL_PERSIST_WAL, "[BOOLEAN]" }, 19178 /* { "pragma", SQLITE_FCNTL_PRAGMA, "NAME ARG" },*/ 19179 { "psow", SQLITE_FCNTL_POWERSAFE_OVERWRITE, "[BOOLEAN]" }, 19180 { "reserve_bytes", SQLITE_FCNTL_RESERVE_BYTES, "[N]" }, 19181 { "size_limit", SQLITE_FCNTL_SIZE_LIMIT, "[LIMIT]" }, 19182 { "tempfilename", SQLITE_FCNTL_TEMPFILENAME, "" }, 19183 /* { "win32_av_retry", SQLITE_FCNTL_WIN32_AV_RETRY, "COUNT DELAY" },*/ 19184 }; 19185 int filectrl = -1; 19186 int iCtrl = -1; 19187 sqlite3_int64 iRes = 0; /* Integer result to display if rc2==1 */ 19188 int isOk = 0; /* 0: usage 1: %lld 2: no-result */ 19189 int n2, i; 19190 const char *zCmd = 0; 19191 const char *zSchema = 0; 19192 19193 open_db(p, 0); 19194 zCmd = nArg>=2 ? azArg[1] : "help"; 19195 19196 if( zCmd[0]=='-' 19197 && (strcmp(zCmd,"--schema")==0 || strcmp(zCmd,"-schema")==0) 19198 && nArg>=4 19199 ){ 19200 zSchema = azArg[2]; 19201 for(i=3; i<nArg; i++) azArg[i-2] = azArg[i]; 19202 nArg -= 2; 19203 zCmd = azArg[1]; 19204 } 19205 19206 /* The argument can optionally begin with "-" or "--" */ 19207 if( zCmd[0]=='-' && zCmd[1] ){ 19208 zCmd++; 19209 if( zCmd[0]=='-' && zCmd[1] ) zCmd++; 19210 } 19211 19212 /* --help lists all file-controls */ 19213 if( strcmp(zCmd,"help")==0 ){ 19214 utf8_printf(p->out, "Available file-controls:\n"); 19215 for(i=0; i<ArraySize(aCtrl); i++){ 19216 utf8_printf(p->out, " .filectrl %s %s\n", 19217 aCtrl[i].zCtrlName, aCtrl[i].zUsage); 19218 } 19219 rc = 1; 19220 goto meta_command_exit; 19221 } 19222 19223 /* convert filectrl text option to value. allow any unique prefix 19224 ** of the option name, or a numerical value. */ 19225 n2 = strlen30(zCmd); 19226 for(i=0; i<ArraySize(aCtrl); i++){ 19227 if( strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){ 19228 if( filectrl<0 ){ 19229 filectrl = aCtrl[i].ctrlCode; 19230 iCtrl = i; 19231 }else{ 19232 utf8_printf(stderr, "Error: ambiguous file-control: \"%s\"\n" 19233 "Use \".filectrl --help\" for help\n", zCmd); 19234 rc = 1; 19235 goto meta_command_exit; 19236 } 19237 } 19238 } 19239 if( filectrl<0 ){ 19240 utf8_printf(stderr,"Error: unknown file-control: %s\n" 19241 "Use \".filectrl --help\" for help\n", zCmd); 19242 }else{ 19243 switch(filectrl){ 19244 case SQLITE_FCNTL_SIZE_LIMIT: { 19245 if( nArg!=2 && nArg!=3 ) break; 19246 iRes = nArg==3 ? integerValue(azArg[2]) : -1; 19247 sqlite3_file_control(p->db, zSchema, SQLITE_FCNTL_SIZE_LIMIT, &iRes); 19248 isOk = 1; 19249 break; 19250 } 19251 case SQLITE_FCNTL_LOCK_TIMEOUT: 19252 case SQLITE_FCNTL_CHUNK_SIZE: { 19253 int x; 19254 if( nArg!=3 ) break; 19255 x = (int)integerValue(azArg[2]); 19256 sqlite3_file_control(p->db, zSchema, filectrl, &x); 19257 isOk = 2; 19258 break; 19259 } 19260 case SQLITE_FCNTL_PERSIST_WAL: 19261 case SQLITE_FCNTL_POWERSAFE_OVERWRITE: { 19262 int x; 19263 if( nArg!=2 && nArg!=3 ) break; 19264 x = nArg==3 ? booleanValue(azArg[2]) : -1; 19265 sqlite3_file_control(p->db, zSchema, filectrl, &x); 19266 iRes = x; 19267 isOk = 1; 19268 break; 19269 } 19270 case SQLITE_FCNTL_DATA_VERSION: 19271 case SQLITE_FCNTL_HAS_MOVED: { 19272 int x; 19273 if( nArg!=2 ) break; 19274 sqlite3_file_control(p->db, zSchema, filectrl, &x); 19275 iRes = x; 19276 isOk = 1; 19277 break; 19278 } 19279 case SQLITE_FCNTL_TEMPFILENAME: { 19280 char *z = 0; 19281 if( nArg!=2 ) break; 19282 sqlite3_file_control(p->db, zSchema, filectrl, &z); 19283 if( z ){ 19284 utf8_printf(p->out, "%s\n", z); 19285 sqlite3_free(z); 19286 } 19287 isOk = 2; 19288 break; 19289 } 19290 case SQLITE_FCNTL_RESERVE_BYTES: { 19291 int x; 19292 if( nArg>=3 ){ 19293 x = atoi(azArg[2]); 19294 sqlite3_file_control(p->db, zSchema, filectrl, &x); 19295 } 19296 x = -1; 19297 sqlite3_file_control(p->db, zSchema, filectrl, &x); 19298 utf8_printf(p->out,"%d\n", x); 19299 isOk = 2; 19300 break; 19301 } 19302 } 19303 } 19304 if( isOk==0 && iCtrl>=0 ){ 19305 utf8_printf(p->out, "Usage: .filectrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage); 19306 rc = 1; 19307 }else if( isOk==1 ){ 19308 char zBuf[100]; 19309 sqlite3_snprintf(sizeof(zBuf), zBuf, "%lld", iRes); 19310 raw_printf(p->out, "%s\n", zBuf); 19311 } 19312 }else 19313 19314 if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){ 19315 ShellState data; 19316 int doStats = 0; 19317 memcpy(&data, p, sizeof(data)); 19318 data.showHeader = 0; 19319 data.cMode = data.mode = MODE_Semi; 19320 if( nArg==2 && optionMatch(azArg[1], "indent") ){ 19321 data.cMode = data.mode = MODE_Pretty; 19322 nArg = 1; 19323 } 19324 if( nArg!=1 ){ 19325 raw_printf(stderr, "Usage: .fullschema ?--indent?\n"); 19326 rc = 1; 19327 goto meta_command_exit; 19328 } 19329 open_db(p, 0); 19330 rc = sqlite3_exec(p->db, 19331 "SELECT sql FROM" 19332 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x" 19333 " FROM sqlite_schema UNION ALL" 19334 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_schema) " 19335 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' " 19336 "ORDER BY x", 19337 callback, &data, 0 19338 ); 19339 if( rc==SQLITE_OK ){ 19340 sqlite3_stmt *pStmt; 19341 rc = sqlite3_prepare_v2(p->db, 19342 "SELECT rowid FROM sqlite_schema" 19343 " WHERE name GLOB 'sqlite_stat[134]'", 19344 -1, &pStmt, 0); 19345 doStats = sqlite3_step(pStmt)==SQLITE_ROW; 19346 sqlite3_finalize(pStmt); 19347 } 19348 if( doStats==0 ){ 19349 raw_printf(p->out, "/* No STAT tables available */\n"); 19350 }else{ 19351 raw_printf(p->out, "ANALYZE sqlite_schema;\n"); 19352 data.cMode = data.mode = MODE_Insert; 19353 data.zDestTable = "sqlite_stat1"; 19354 shell_exec(&data, "SELECT * FROM sqlite_stat1", 0); 19355 data.zDestTable = "sqlite_stat4"; 19356 shell_exec(&data, "SELECT * FROM sqlite_stat4", 0); 19357 raw_printf(p->out, "ANALYZE sqlite_schema;\n"); 19358 } 19359 }else 19360 19361 if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){ 19362 if( nArg==2 ){ 19363 p->showHeader = booleanValue(azArg[1]); 19364 p->shellFlgs |= SHFLG_HeaderSet; 19365 }else{ 19366 raw_printf(stderr, "Usage: .headers on|off\n"); 19367 rc = 1; 19368 } 19369 }else 19370 19371 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){ 19372 if( nArg>=2 ){ 19373 n = showHelp(p->out, azArg[1]); 19374 if( n==0 ){ 19375 utf8_printf(p->out, "Nothing matches '%s'\n", azArg[1]); 19376 } 19377 }else{ 19378 showHelp(p->out, 0); 19379 } 19380 }else 19381 19382 if( c=='i' && strncmp(azArg[0], "import", n)==0 ){ 19383 char *zTable = 0; /* Insert data into this table */ 19384 char *zFile = 0; /* Name of file to extra content from */ 19385 sqlite3_stmt *pStmt = NULL; /* A statement */ 19386 int nCol; /* Number of columns in the table */ 19387 int nByte; /* Number of bytes in an SQL string */ 19388 int i, j; /* Loop counters */ 19389 int needCommit; /* True to COMMIT or ROLLBACK at end */ 19390 int nSep; /* Number of bytes in p->colSeparator[] */ 19391 char *zSql; /* An SQL statement */ 19392 ImportCtx sCtx; /* Reader context */ 19393 char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */ 19394 int eVerbose = 0; /* Larger for more console output */ 19395 int nSkip = 0; /* Initial lines to skip */ 19396 int useOutputMode = 1; /* Use output mode to determine separators */ 19397 19398 failIfSafeMode(p, "cannot run .import in safe mode"); 19399 memset(&sCtx, 0, sizeof(sCtx)); 19400 sCtx.z = sqlite3_malloc64(120); 19401 if( sCtx.z==0 ){ 19402 import_cleanup(&sCtx); 19403 shell_out_of_memory(); 19404 } 19405 if( p->mode==MODE_Ascii ){ 19406 xRead = ascii_read_one_field; 19407 }else{ 19408 xRead = csv_read_one_field; 19409 } 19410 for(i=1; i<nArg; i++){ 19411 char *z = azArg[i]; 19412 if( z[0]=='-' && z[1]=='-' ) z++; 19413 if( z[0]!='-' ){ 19414 if( zFile==0 ){ 19415 zFile = z; 19416 }else if( zTable==0 ){ 19417 zTable = z; 19418 }else{ 19419 utf8_printf(p->out, "ERROR: extra argument: \"%s\". Usage:\n", z); 19420 showHelp(p->out, "import"); 19421 rc = 1; 19422 goto meta_command_exit; 19423 } 19424 }else if( strcmp(z,"-v")==0 ){ 19425 eVerbose++; 19426 }else if( strcmp(z,"-skip")==0 && i<nArg-1 ){ 19427 nSkip = integerValue(azArg[++i]); 19428 }else if( strcmp(z,"-ascii")==0 ){ 19429 sCtx.cColSep = SEP_Unit[0]; 19430 sCtx.cRowSep = SEP_Record[0]; 19431 xRead = ascii_read_one_field; 19432 useOutputMode = 0; 19433 }else if( strcmp(z,"-csv")==0 ){ 19434 sCtx.cColSep = ','; 19435 sCtx.cRowSep = '\n'; 19436 xRead = csv_read_one_field; 19437 useOutputMode = 0; 19438 }else{ 19439 utf8_printf(p->out, "ERROR: unknown option: \"%s\". Usage:\n", z); 19440 showHelp(p->out, "import"); 19441 rc = 1; 19442 goto meta_command_exit; 19443 } 19444 } 19445 if( zTable==0 ){ 19446 utf8_printf(p->out, "ERROR: missing %s argument. Usage:\n", 19447 zFile==0 ? "FILE" : "TABLE"); 19448 showHelp(p->out, "import"); 19449 rc = 1; 19450 goto meta_command_exit; 19451 } 19452 seenInterrupt = 0; 19453 open_db(p, 0); 19454 if( useOutputMode ){ 19455 /* If neither the --csv or --ascii options are specified, then set 19456 ** the column and row separator characters from the output mode. */ 19457 nSep = strlen30(p->colSeparator); 19458 if( nSep==0 ){ 19459 raw_printf(stderr, 19460 "Error: non-null column separator required for import\n"); 19461 rc = 1; 19462 goto meta_command_exit; 19463 } 19464 if( nSep>1 ){ 19465 raw_printf(stderr, 19466 "Error: multi-character column separators not allowed" 19467 " for import\n"); 19468 rc = 1; 19469 goto meta_command_exit; 19470 } 19471 nSep = strlen30(p->rowSeparator); 19472 if( nSep==0 ){ 19473 raw_printf(stderr, 19474 "Error: non-null row separator required for import\n"); 19475 rc = 1; 19476 goto meta_command_exit; 19477 } 19478 if( nSep==2 && p->mode==MODE_Csv && strcmp(p->rowSeparator,SEP_CrLf)==0 ){ 19479 /* When importing CSV (only), if the row separator is set to the 19480 ** default output row separator, change it to the default input 19481 ** row separator. This avoids having to maintain different input 19482 ** and output row separators. */ 19483 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 19484 nSep = strlen30(p->rowSeparator); 19485 } 19486 if( nSep>1 ){ 19487 raw_printf(stderr, "Error: multi-character row separators not allowed" 19488 " for import\n"); 19489 rc = 1; 19490 goto meta_command_exit; 19491 } 19492 sCtx.cColSep = p->colSeparator[0]; 19493 sCtx.cRowSep = p->rowSeparator[0]; 19494 } 19495 sCtx.zFile = zFile; 19496 sCtx.nLine = 1; 19497 if( sCtx.zFile[0]=='|' ){ 19498 #ifdef SQLITE_OMIT_POPEN 19499 raw_printf(stderr, "Error: pipes are not supported in this OS\n"); 19500 rc = 1; 19501 goto meta_command_exit; 19502 #else 19503 sCtx.in = popen(sCtx.zFile+1, "r"); 19504 sCtx.zFile = "<pipe>"; 19505 sCtx.xCloser = pclose; 19506 #endif 19507 }else{ 19508 sCtx.in = fopen(sCtx.zFile, "rb"); 19509 sCtx.xCloser = fclose; 19510 } 19511 if( sCtx.in==0 ){ 19512 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile); 19513 rc = 1; 19514 import_cleanup(&sCtx); 19515 goto meta_command_exit; 19516 } 19517 if( eVerbose>=2 || (eVerbose>=1 && useOutputMode) ){ 19518 char zSep[2]; 19519 zSep[1] = 0; 19520 zSep[0] = sCtx.cColSep; 19521 utf8_printf(p->out, "Column separator "); 19522 output_c_string(p->out, zSep); 19523 utf8_printf(p->out, ", row separator "); 19524 zSep[0] = sCtx.cRowSep; 19525 output_c_string(p->out, zSep); 19526 utf8_printf(p->out, "\n"); 19527 } 19528 while( (nSkip--)>0 ){ 19529 while( xRead(&sCtx) && sCtx.cTerm==sCtx.cColSep ){} 19530 } 19531 zSql = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable); 19532 if( zSql==0 ){ 19533 import_cleanup(&sCtx); 19534 shell_out_of_memory(); 19535 } 19536 nByte = strlen30(zSql); 19537 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 19538 import_append_char(&sCtx, 0); /* To ensure sCtx.z is allocated */ 19539 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){ 19540 char *zCreate = sqlite3_mprintf("CREATE TABLE \"%w\"", zTable); 19541 char cSep = '('; 19542 while( xRead(&sCtx) ){ 19543 zCreate = sqlite3_mprintf("%z%c\n \"%w\" TEXT", zCreate, cSep, sCtx.z); 19544 cSep = ','; 19545 if( sCtx.cTerm!=sCtx.cColSep ) break; 19546 } 19547 if( cSep=='(' ){ 19548 sqlite3_free(zCreate); 19549 import_cleanup(&sCtx); 19550 utf8_printf(stderr,"%s: empty file\n", sCtx.zFile); 19551 rc = 1; 19552 goto meta_command_exit; 19553 } 19554 zCreate = sqlite3_mprintf("%z\n)", zCreate); 19555 if( eVerbose>=1 ){ 19556 utf8_printf(p->out, "%s\n", zCreate); 19557 } 19558 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0); 19559 sqlite3_free(zCreate); 19560 if( rc ){ 19561 utf8_printf(stderr, "CREATE TABLE \"%s\"(...) failed: %s\n", zTable, 19562 sqlite3_errmsg(p->db)); 19563 import_cleanup(&sCtx); 19564 rc = 1; 19565 goto meta_command_exit; 19566 } 19567 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 19568 } 19569 sqlite3_free(zSql); 19570 if( rc ){ 19571 if (pStmt) sqlite3_finalize(pStmt); 19572 utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db)); 19573 import_cleanup(&sCtx); 19574 rc = 1; 19575 goto meta_command_exit; 19576 } 19577 nCol = sqlite3_column_count(pStmt); 19578 sqlite3_finalize(pStmt); 19579 pStmt = 0; 19580 if( nCol==0 ) return 0; /* no columns, no error */ 19581 zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 ); 19582 if( zSql==0 ){ 19583 import_cleanup(&sCtx); 19584 shell_out_of_memory(); 19585 } 19586 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable); 19587 j = strlen30(zSql); 19588 for(i=1; i<nCol; i++){ 19589 zSql[j++] = ','; 19590 zSql[j++] = '?'; 19591 } 19592 zSql[j++] = ')'; 19593 zSql[j] = 0; 19594 if( eVerbose>=2 ){ 19595 utf8_printf(p->out, "Insert using: %s\n", zSql); 19596 } 19597 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 19598 sqlite3_free(zSql); 19599 if( rc ){ 19600 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); 19601 if (pStmt) sqlite3_finalize(pStmt); 19602 import_cleanup(&sCtx); 19603 rc = 1; 19604 goto meta_command_exit; 19605 } 19606 needCommit = sqlite3_get_autocommit(p->db); 19607 if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0); 19608 do{ 19609 int startLine = sCtx.nLine; 19610 for(i=0; i<nCol; i++){ 19611 char *z = xRead(&sCtx); 19612 /* 19613 ** Did we reach end-of-file before finding any columns? 19614 ** If so, stop instead of NULL filling the remaining columns. 19615 */ 19616 if( z==0 && i==0 ) break; 19617 /* 19618 ** Did we reach end-of-file OR end-of-line before finding any 19619 ** columns in ASCII mode? If so, stop instead of NULL filling 19620 ** the remaining columns. 19621 */ 19622 if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break; 19623 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT); 19624 if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){ 19625 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - " 19626 "filling the rest with NULL\n", 19627 sCtx.zFile, startLine, nCol, i+1); 19628 i += 2; 19629 while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; } 19630 } 19631 } 19632 if( sCtx.cTerm==sCtx.cColSep ){ 19633 do{ 19634 xRead(&sCtx); 19635 i++; 19636 }while( sCtx.cTerm==sCtx.cColSep ); 19637 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - " 19638 "extras ignored\n", 19639 sCtx.zFile, startLine, nCol, i); 19640 } 19641 if( i>=nCol ){ 19642 sqlite3_step(pStmt); 19643 rc = sqlite3_reset(pStmt); 19644 if( rc!=SQLITE_OK ){ 19645 utf8_printf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile, 19646 startLine, sqlite3_errmsg(p->db)); 19647 sCtx.nErr++; 19648 }else{ 19649 sCtx.nRow++; 19650 } 19651 } 19652 }while( sCtx.cTerm!=EOF ); 19653 19654 import_cleanup(&sCtx); 19655 sqlite3_finalize(pStmt); 19656 if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0); 19657 if( eVerbose>0 ){ 19658 utf8_printf(p->out, 19659 "Added %d rows with %d errors using %d lines of input\n", 19660 sCtx.nRow, sCtx.nErr, sCtx.nLine-1); 19661 } 19662 }else 19663 19664 #ifndef SQLITE_UNTESTABLE 19665 if( c=='i' && strncmp(azArg[0], "imposter", n)==0 ){ 19666 char *zSql; 19667 char *zCollist = 0; 19668 sqlite3_stmt *pStmt; 19669 int tnum = 0; 19670 int isWO = 0; /* True if making an imposter of a WITHOUT ROWID table */ 19671 int lenPK = 0; /* Length of the PRIMARY KEY string for isWO tables */ 19672 int i; 19673 if( !(nArg==3 || (nArg==2 && sqlite3_stricmp(azArg[1],"off")==0)) ){ 19674 utf8_printf(stderr, "Usage: .imposter INDEX IMPOSTER\n" 19675 " .imposter off\n"); 19676 /* Also allowed, but not documented: 19677 ** 19678 ** .imposter TABLE IMPOSTER 19679 ** 19680 ** where TABLE is a WITHOUT ROWID table. In that case, the 19681 ** imposter is another WITHOUT ROWID table with the columns in 19682 ** storage order. */ 19683 rc = 1; 19684 goto meta_command_exit; 19685 } 19686 open_db(p, 0); 19687 if( nArg==2 ){ 19688 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 1); 19689 goto meta_command_exit; 19690 } 19691 zSql = sqlite3_mprintf( 19692 "SELECT rootpage, 0 FROM sqlite_schema" 19693 " WHERE name='%q' AND type='index'" 19694 "UNION ALL " 19695 "SELECT rootpage, 1 FROM sqlite_schema" 19696 " WHERE name='%q' AND type='table'" 19697 " AND sql LIKE '%%without%%rowid%%'", 19698 azArg[1], azArg[1] 19699 ); 19700 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 19701 sqlite3_free(zSql); 19702 if( sqlite3_step(pStmt)==SQLITE_ROW ){ 19703 tnum = sqlite3_column_int(pStmt, 0); 19704 isWO = sqlite3_column_int(pStmt, 1); 19705 } 19706 sqlite3_finalize(pStmt); 19707 zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]); 19708 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 19709 sqlite3_free(zSql); 19710 i = 0; 19711 while( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){ 19712 char zLabel[20]; 19713 const char *zCol = (const char*)sqlite3_column_text(pStmt,2); 19714 i++; 19715 if( zCol==0 ){ 19716 if( sqlite3_column_int(pStmt,1)==-1 ){ 19717 zCol = "_ROWID_"; 19718 }else{ 19719 sqlite3_snprintf(sizeof(zLabel),zLabel,"expr%d",i); 19720 zCol = zLabel; 19721 } 19722 } 19723 if( isWO && lenPK==0 && sqlite3_column_int(pStmt,5)==0 && zCollist ){ 19724 lenPK = (int)strlen(zCollist); 19725 } 19726 if( zCollist==0 ){ 19727 zCollist = sqlite3_mprintf("\"%w\"", zCol); 19728 }else{ 19729 zCollist = sqlite3_mprintf("%z,\"%w\"", zCollist, zCol); 19730 } 19731 } 19732 sqlite3_finalize(pStmt); 19733 if( i==0 || tnum==0 ){ 19734 utf8_printf(stderr, "no such index: \"%s\"\n", azArg[1]); 19735 rc = 1; 19736 sqlite3_free(zCollist); 19737 goto meta_command_exit; 19738 } 19739 if( lenPK==0 ) lenPK = 100000; 19740 zSql = sqlite3_mprintf( 19741 "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%.*s))WITHOUT ROWID", 19742 azArg[2], zCollist, lenPK, zCollist); 19743 sqlite3_free(zCollist); 19744 rc = sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 1, tnum); 19745 if( rc==SQLITE_OK ){ 19746 rc = sqlite3_exec(p->db, zSql, 0, 0, 0); 19747 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 0); 19748 if( rc ){ 19749 utf8_printf(stderr, "Error in [%s]: %s\n", zSql, sqlite3_errmsg(p->db)); 19750 }else{ 19751 utf8_printf(stdout, "%s;\n", zSql); 19752 raw_printf(stdout, 19753 "WARNING: writing to an imposter table will corrupt the \"%s\" %s!\n", 19754 azArg[1], isWO ? "table" : "index" 19755 ); 19756 } 19757 }else{ 19758 raw_printf(stderr, "SQLITE_TESTCTRL_IMPOSTER returns %d\n", rc); 19759 rc = 1; 19760 } 19761 sqlite3_free(zSql); 19762 }else 19763 #endif /* !defined(SQLITE_OMIT_TEST_CONTROL) */ 19764 19765 #ifdef SQLITE_ENABLE_IOTRACE 19766 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){ 19767 SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...); 19768 if( iotrace && iotrace!=stdout ) fclose(iotrace); 19769 iotrace = 0; 19770 if( nArg<2 ){ 19771 sqlite3IoTrace = 0; 19772 }else if( strcmp(azArg[1], "-")==0 ){ 19773 sqlite3IoTrace = iotracePrintf; 19774 iotrace = stdout; 19775 }else{ 19776 iotrace = fopen(azArg[1], "w"); 19777 if( iotrace==0 ){ 19778 utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]); 19779 sqlite3IoTrace = 0; 19780 rc = 1; 19781 }else{ 19782 sqlite3IoTrace = iotracePrintf; 19783 } 19784 } 19785 }else 19786 #endif 19787 19788 if( c=='l' && n>=5 && strncmp(azArg[0], "limits", n)==0 ){ 19789 static const struct { 19790 const char *zLimitName; /* Name of a limit */ 19791 int limitCode; /* Integer code for that limit */ 19792 } aLimit[] = { 19793 { "length", SQLITE_LIMIT_LENGTH }, 19794 { "sql_length", SQLITE_LIMIT_SQL_LENGTH }, 19795 { "column", SQLITE_LIMIT_COLUMN }, 19796 { "expr_depth", SQLITE_LIMIT_EXPR_DEPTH }, 19797 { "compound_select", SQLITE_LIMIT_COMPOUND_SELECT }, 19798 { "vdbe_op", SQLITE_LIMIT_VDBE_OP }, 19799 { "function_arg", SQLITE_LIMIT_FUNCTION_ARG }, 19800 { "attached", SQLITE_LIMIT_ATTACHED }, 19801 { "like_pattern_length", SQLITE_LIMIT_LIKE_PATTERN_LENGTH }, 19802 { "variable_number", SQLITE_LIMIT_VARIABLE_NUMBER }, 19803 { "trigger_depth", SQLITE_LIMIT_TRIGGER_DEPTH }, 19804 { "worker_threads", SQLITE_LIMIT_WORKER_THREADS }, 19805 }; 19806 int i, n2; 19807 open_db(p, 0); 19808 if( nArg==1 ){ 19809 for(i=0; i<ArraySize(aLimit); i++){ 19810 printf("%20s %d\n", aLimit[i].zLimitName, 19811 sqlite3_limit(p->db, aLimit[i].limitCode, -1)); 19812 } 19813 }else if( nArg>3 ){ 19814 raw_printf(stderr, "Usage: .limit NAME ?NEW-VALUE?\n"); 19815 rc = 1; 19816 goto meta_command_exit; 19817 }else{ 19818 int iLimit = -1; 19819 n2 = strlen30(azArg[1]); 19820 for(i=0; i<ArraySize(aLimit); i++){ 19821 if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){ 19822 if( iLimit<0 ){ 19823 iLimit = i; 19824 }else{ 19825 utf8_printf(stderr, "ambiguous limit: \"%s\"\n", azArg[1]); 19826 rc = 1; 19827 goto meta_command_exit; 19828 } 19829 } 19830 } 19831 if( iLimit<0 ){ 19832 utf8_printf(stderr, "unknown limit: \"%s\"\n" 19833 "enter \".limits\" with no arguments for a list.\n", 19834 azArg[1]); 19835 rc = 1; 19836 goto meta_command_exit; 19837 } 19838 if( nArg==3 ){ 19839 sqlite3_limit(p->db, aLimit[iLimit].limitCode, 19840 (int)integerValue(azArg[2])); 19841 } 19842 printf("%20s %d\n", aLimit[iLimit].zLimitName, 19843 sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1)); 19844 } 19845 }else 19846 19847 if( c=='l' && n>2 && strncmp(azArg[0], "lint", n)==0 ){ 19848 open_db(p, 0); 19849 lintDotCommand(p, azArg, nArg); 19850 }else 19851 19852 #ifndef SQLITE_OMIT_LOAD_EXTENSION 19853 if( c=='l' && strncmp(azArg[0], "load", n)==0 ){ 19854 const char *zFile, *zProc; 19855 char *zErrMsg = 0; 19856 failIfSafeMode(p, "cannot run .load in safe mode"); 19857 if( nArg<2 ){ 19858 raw_printf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n"); 19859 rc = 1; 19860 goto meta_command_exit; 19861 } 19862 zFile = azArg[1]; 19863 zProc = nArg>=3 ? azArg[2] : 0; 19864 open_db(p, 0); 19865 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg); 19866 if( rc!=SQLITE_OK ){ 19867 utf8_printf(stderr, "Error: %s\n", zErrMsg); 19868 sqlite3_free(zErrMsg); 19869 rc = 1; 19870 } 19871 }else 19872 #endif 19873 19874 if( c=='l' && strncmp(azArg[0], "log", n)==0 ){ 19875 failIfSafeMode(p, "cannot run .log in safe mode"); 19876 if( nArg!=2 ){ 19877 raw_printf(stderr, "Usage: .log FILENAME\n"); 19878 rc = 1; 19879 }else{ 19880 const char *zFile = azArg[1]; 19881 output_file_close(p->pLog); 19882 p->pLog = output_file_open(zFile, 0); 19883 } 19884 }else 19885 19886 if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){ 19887 const char *zMode = nArg>=2 ? azArg[1] : ""; 19888 int n2 = strlen30(zMode); 19889 int c2 = zMode[0]; 19890 if( c2=='l' && n2>2 && strncmp(azArg[1],"lines",n2)==0 ){ 19891 p->mode = MODE_Line; 19892 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 19893 }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){ 19894 p->mode = MODE_Column; 19895 if( (p->shellFlgs & SHFLG_HeaderSet)==0 ){ 19896 p->showHeader = 1; 19897 } 19898 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 19899 }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){ 19900 p->mode = MODE_List; 19901 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Column); 19902 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 19903 }else if( c2=='h' && strncmp(azArg[1],"html",n2)==0 ){ 19904 p->mode = MODE_Html; 19905 }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){ 19906 p->mode = MODE_Tcl; 19907 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space); 19908 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 19909 }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){ 19910 p->mode = MODE_Csv; 19911 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma); 19912 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf); 19913 }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){ 19914 p->mode = MODE_List; 19915 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab); 19916 }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){ 19917 p->mode = MODE_Insert; 19918 set_table_name(p, nArg>=3 ? azArg[2] : "table"); 19919 }else if( c2=='q' && strncmp(azArg[1],"quote",n2)==0 ){ 19920 p->mode = MODE_Quote; 19921 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma); 19922 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 19923 }else if( c2=='a' && strncmp(azArg[1],"ascii",n2)==0 ){ 19924 p->mode = MODE_Ascii; 19925 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit); 19926 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record); 19927 }else if( c2=='m' && strncmp(azArg[1],"markdown",n2)==0 ){ 19928 p->mode = MODE_Markdown; 19929 }else if( c2=='t' && strncmp(azArg[1],"table",n2)==0 ){ 19930 p->mode = MODE_Table; 19931 }else if( c2=='b' && strncmp(azArg[1],"box",n2)==0 ){ 19932 p->mode = MODE_Box; 19933 }else if( c2=='j' && strncmp(azArg[1],"json",n2)==0 ){ 19934 p->mode = MODE_Json; 19935 }else if( nArg==1 ){ 19936 raw_printf(p->out, "current output mode: %s\n", modeDescr[p->mode]); 19937 }else{ 19938 raw_printf(stderr, "Error: mode should be one of: " 19939 "ascii box column csv html insert json line list markdown " 19940 "quote table tabs tcl\n"); 19941 rc = 1; 19942 } 19943 p->cMode = p->mode; 19944 }else 19945 19946 if( c=='n' && strcmp(azArg[0], "nonce")==0 ){ 19947 if( nArg!=2 ){ 19948 raw_printf(stderr, "Usage: .nonce NONCE\n"); 19949 rc = 1; 19950 }else if( p->zNonce==0 || strcmp(azArg[1],p->zNonce)!=0 ){ 19951 raw_printf(stderr, "line %d: incorrect nonce: \"%s\"\n", p->lineno, azArg[1]); 19952 exit(1); 19953 }else{ 19954 p->bSafeMode = 0; 19955 return 0; /* Return immediately to bypass the safe mode reset 19956 ** at the end of this procedure */ 19957 } 19958 }else 19959 19960 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){ 19961 if( nArg==2 ){ 19962 sqlite3_snprintf(sizeof(p->nullValue), p->nullValue, 19963 "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]); 19964 }else{ 19965 raw_printf(stderr, "Usage: .nullvalue STRING\n"); 19966 rc = 1; 19967 } 19968 }else 19969 19970 #ifdef SQLITE_DEBUG 19971 if( c=='o' && strcmp(azArg[0],"oom")==0 ){ 19972 int i; 19973 for(i=1; i<nArg; i++){ 19974 const char *z = azArg[i]; 19975 if( z[0]=='-' && z[1]=='-' ) z++; 19976 if( strcmp(z,"-repeat")==0 ){ 19977 if( i==nArg-1 ){ 19978 raw_printf(p->out, "missing argument on \"%s\"\n", azArg[i]); 19979 rc = 1; 19980 }else{ 19981 oomRepeat = (int)integerValue(azArg[++i]); 19982 } 19983 }else if( IsDigit(z[0]) ){ 19984 oomCounter = (int)integerValue(azArg[i]); 19985 }else{ 19986 raw_printf(p->out, "unknown argument: \"%s\"\n", azArg[i]); 19987 raw_printf(p->out, "Usage: .oom [--repeat N] [M]\n"); 19988 rc = 1; 19989 } 19990 } 19991 if( rc==0 ){ 19992 raw_printf(p->out, "oomCounter = %d\n", oomCounter); 19993 raw_printf(p->out, "oomRepeat = %d\n", oomRepeat); 19994 } 19995 }else 19996 #endif /* SQLITE_DEBUG */ 19997 19998 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){ 19999 char *zNewFilename = 0; /* Name of the database file to open */ 20000 int iName = 1; /* Index in azArg[] of the filename */ 20001 int newFlag = 0; /* True to delete file before opening */ 20002 int openMode = SHELL_OPEN_UNSPEC; 20003 20004 /* Check for command-line arguments */ 20005 for(iName=1; iName<nArg; iName++){ 20006 const char *z = azArg[iName]; 20007 if( optionMatch(z,"new") ){ 20008 newFlag = 1; 20009 #ifdef SQLITE_HAVE_ZLIB 20010 }else if( optionMatch(z, "zip") ){ 20011 openMode = SHELL_OPEN_ZIPFILE; 20012 #endif 20013 }else if( optionMatch(z, "append") ){ 20014 openMode = SHELL_OPEN_APPENDVFS; 20015 }else if( optionMatch(z, "readonly") ){ 20016 openMode = SHELL_OPEN_READONLY; 20017 }else if( optionMatch(z, "nofollow") ){ 20018 p->openFlags |= SQLITE_OPEN_NOFOLLOW; 20019 #ifndef SQLITE_OMIT_DESERIALIZE 20020 }else if( optionMatch(z, "deserialize") ){ 20021 openMode = SHELL_OPEN_DESERIALIZE; 20022 }else if( optionMatch(z, "hexdb") ){ 20023 openMode = SHELL_OPEN_HEXDB; 20024 }else if( optionMatch(z, "maxsize") && iName+1<nArg ){ 20025 p->szMax = integerValue(azArg[++iName]); 20026 #endif /* SQLITE_OMIT_DESERIALIZE */ 20027 }else if( z[0]=='-' ){ 20028 utf8_printf(stderr, "unknown option: %s\n", z); 20029 rc = 1; 20030 goto meta_command_exit; 20031 }else if( zNewFilename ){ 20032 utf8_printf(stderr, "extra argument: \"%s\"\n", z); 20033 rc = 1; 20034 goto meta_command_exit; 20035 }else{ 20036 zNewFilename = sqlite3_mprintf("%s", z); 20037 } 20038 } 20039 20040 /* Close the existing database */ 20041 session_close_all(p, -1); 20042 close_db(p->db); 20043 p->db = 0; 20044 p->pAuxDb->zDbFilename = 0; 20045 sqlite3_free(p->pAuxDb->zFreeOnClose); 20046 p->pAuxDb->zFreeOnClose = 0; 20047 p->openMode = openMode; 20048 p->openFlags = 0; 20049 p->szMax = 0; 20050 20051 /* If a filename is specified, try to open it first */ 20052 if( zNewFilename || p->openMode==SHELL_OPEN_HEXDB ){ 20053 if( newFlag && !p->bSafeMode ) shellDeleteFile(zNewFilename); 20054 if( p->bSafeMode 20055 && p->openMode!=SHELL_OPEN_HEXDB 20056 && zNewFilename 20057 && strcmp(zNewFilename,":memory:")!=0 20058 ){ 20059 failIfSafeMode(p, "cannot open disk-based database files in safe mode"); 20060 } 20061 p->pAuxDb->zDbFilename = zNewFilename; 20062 open_db(p, OPEN_DB_KEEPALIVE); 20063 if( p->db==0 ){ 20064 utf8_printf(stderr, "Error: cannot open '%s'\n", zNewFilename); 20065 sqlite3_free(zNewFilename); 20066 }else{ 20067 p->pAuxDb->zFreeOnClose = zNewFilename; 20068 } 20069 } 20070 if( p->db==0 ){ 20071 /* As a fall-back open a TEMP database */ 20072 p->pAuxDb->zDbFilename = 0; 20073 open_db(p, 0); 20074 } 20075 }else 20076 20077 if( (c=='o' 20078 && (strncmp(azArg[0], "output", n)==0||strncmp(azArg[0], "once", n)==0)) 20079 || (c=='e' && n==5 && strcmp(azArg[0],"excel")==0) 20080 ){ 20081 char *zFile = 0; 20082 int bTxtMode = 0; 20083 int i; 20084 int eMode = 0; 20085 int bBOM = 0; 20086 int bOnce = 0; /* 0: .output, 1: .once, 2: .excel */ 20087 20088 failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]); 20089 if( c=='e' ){ 20090 eMode = 'x'; 20091 bOnce = 2; 20092 }else if( strncmp(azArg[0],"once",n)==0 ){ 20093 bOnce = 1; 20094 } 20095 for(i=1; i<nArg; i++){ 20096 char *z = azArg[i]; 20097 if( z[0]=='-' ){ 20098 if( z[1]=='-' ) z++; 20099 if( strcmp(z,"-bom")==0 ){ 20100 bBOM = 1; 20101 }else if( c!='e' && strcmp(z,"-x")==0 ){ 20102 eMode = 'x'; /* spreadsheet */ 20103 }else if( c!='e' && strcmp(z,"-e")==0 ){ 20104 eMode = 'e'; /* text editor */ 20105 }else{ 20106 utf8_printf(p->out, "ERROR: unknown option: \"%s\". Usage:\n", 20107 azArg[i]); 20108 showHelp(p->out, azArg[0]); 20109 rc = 1; 20110 goto meta_command_exit; 20111 } 20112 }else if( zFile==0 && eMode!='e' && eMode!='x' ){ 20113 zFile = sqlite3_mprintf("%s", z); 20114 if( zFile[0]=='|' ){ 20115 while( i+1<nArg ) zFile = sqlite3_mprintf("%z %s", zFile, azArg[++i]); 20116 break; 20117 } 20118 }else{ 20119 utf8_printf(p->out,"ERROR: extra parameter: \"%s\". Usage:\n", 20120 azArg[i]); 20121 showHelp(p->out, azArg[0]); 20122 rc = 1; 20123 sqlite3_free(zFile); 20124 goto meta_command_exit; 20125 } 20126 } 20127 if( zFile==0 ) zFile = sqlite3_mprintf("stdout"); 20128 if( bOnce ){ 20129 p->outCount = 2; 20130 }else{ 20131 p->outCount = 0; 20132 } 20133 output_reset(p); 20134 #ifndef SQLITE_NOHAVE_SYSTEM 20135 if( eMode=='e' || eMode=='x' ){ 20136 p->doXdgOpen = 1; 20137 outputModePush(p); 20138 if( eMode=='x' ){ 20139 /* spreadsheet mode. Output as CSV. */ 20140 newTempFile(p, "csv"); 20141 ShellClearFlag(p, SHFLG_Echo); 20142 p->mode = MODE_Csv; 20143 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma); 20144 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf); 20145 }else{ 20146 /* text editor mode */ 20147 newTempFile(p, "txt"); 20148 bTxtMode = 1; 20149 } 20150 sqlite3_free(zFile); 20151 zFile = sqlite3_mprintf("%s", p->zTempFile); 20152 } 20153 #endif /* SQLITE_NOHAVE_SYSTEM */ 20154 if( zFile[0]=='|' ){ 20155 #ifdef SQLITE_OMIT_POPEN 20156 raw_printf(stderr, "Error: pipes are not supported in this OS\n"); 20157 rc = 1; 20158 p->out = stdout; 20159 #else 20160 p->out = popen(zFile + 1, "w"); 20161 if( p->out==0 ){ 20162 utf8_printf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1); 20163 p->out = stdout; 20164 rc = 1; 20165 }else{ 20166 if( bBOM ) fprintf(p->out,"\357\273\277"); 20167 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile); 20168 } 20169 #endif 20170 }else{ 20171 p->out = output_file_open(zFile, bTxtMode); 20172 if( p->out==0 ){ 20173 if( strcmp(zFile,"off")!=0 ){ 20174 utf8_printf(stderr,"Error: cannot write to \"%s\"\n", zFile); 20175 } 20176 p->out = stdout; 20177 rc = 1; 20178 } else { 20179 if( bBOM ) fprintf(p->out,"\357\273\277"); 20180 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile); 20181 } 20182 } 20183 sqlite3_free(zFile); 20184 }else 20185 20186 if( c=='p' && n>=3 && strncmp(azArg[0], "parameter", n)==0 ){ 20187 open_db(p,0); 20188 if( nArg<=1 ) goto parameter_syntax_error; 20189 20190 /* .parameter clear 20191 ** Clear all bind parameters by dropping the TEMP table that holds them. 20192 */ 20193 if( nArg==2 && strcmp(azArg[1],"clear")==0 ){ 20194 sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp.sqlite_parameters;", 20195 0, 0, 0); 20196 }else 20197 20198 /* .parameter list 20199 ** List all bind parameters. 20200 */ 20201 if( nArg==2 && strcmp(azArg[1],"list")==0 ){ 20202 sqlite3_stmt *pStmt = 0; 20203 int rx; 20204 int len = 0; 20205 rx = sqlite3_prepare_v2(p->db, 20206 "SELECT max(length(key)) " 20207 "FROM temp.sqlite_parameters;", -1, &pStmt, 0); 20208 if( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){ 20209 len = sqlite3_column_int(pStmt, 0); 20210 if( len>40 ) len = 40; 20211 } 20212 sqlite3_finalize(pStmt); 20213 pStmt = 0; 20214 if( len ){ 20215 rx = sqlite3_prepare_v2(p->db, 20216 "SELECT key, quote(value) " 20217 "FROM temp.sqlite_parameters;", -1, &pStmt, 0); 20218 while( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){ 20219 utf8_printf(p->out, "%-*s %s\n", len, sqlite3_column_text(pStmt,0), 20220 sqlite3_column_text(pStmt,1)); 20221 } 20222 sqlite3_finalize(pStmt); 20223 } 20224 }else 20225 20226 /* .parameter init 20227 ** Make sure the TEMP table used to hold bind parameters exists. 20228 ** Create it if necessary. 20229 */ 20230 if( nArg==2 && strcmp(azArg[1],"init")==0 ){ 20231 bind_table_init(p); 20232 }else 20233 20234 /* .parameter set NAME VALUE 20235 ** Set or reset a bind parameter. NAME should be the full parameter 20236 ** name exactly as it appears in the query. (ex: $abc, @def). The 20237 ** VALUE can be in either SQL literal notation, or if not it will be 20238 ** understood to be a text string. 20239 */ 20240 if( nArg==4 && strcmp(azArg[1],"set")==0 ){ 20241 int rx; 20242 char *zSql; 20243 sqlite3_stmt *pStmt; 20244 const char *zKey = azArg[2]; 20245 const char *zValue = azArg[3]; 20246 bind_table_init(p); 20247 zSql = sqlite3_mprintf( 20248 "REPLACE INTO temp.sqlite_parameters(key,value)" 20249 "VALUES(%Q,%s);", zKey, zValue); 20250 if( zSql==0 ) shell_out_of_memory(); 20251 pStmt = 0; 20252 rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 20253 sqlite3_free(zSql); 20254 if( rx!=SQLITE_OK ){ 20255 sqlite3_finalize(pStmt); 20256 pStmt = 0; 20257 zSql = sqlite3_mprintf( 20258 "REPLACE INTO temp.sqlite_parameters(key,value)" 20259 "VALUES(%Q,%Q);", zKey, zValue); 20260 if( zSql==0 ) shell_out_of_memory(); 20261 rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 20262 sqlite3_free(zSql); 20263 if( rx!=SQLITE_OK ){ 20264 utf8_printf(p->out, "Error: %s\n", sqlite3_errmsg(p->db)); 20265 sqlite3_finalize(pStmt); 20266 pStmt = 0; 20267 rc = 1; 20268 } 20269 } 20270 sqlite3_step(pStmt); 20271 sqlite3_finalize(pStmt); 20272 }else 20273 20274 /* .parameter unset NAME 20275 ** Remove the NAME binding from the parameter binding table, if it 20276 ** exists. 20277 */ 20278 if( nArg==3 && strcmp(azArg[1],"unset")==0 ){ 20279 char *zSql = sqlite3_mprintf( 20280 "DELETE FROM temp.sqlite_parameters WHERE key=%Q", azArg[2]); 20281 if( zSql==0 ) shell_out_of_memory(); 20282 sqlite3_exec(p->db, zSql, 0, 0, 0); 20283 sqlite3_free(zSql); 20284 }else 20285 /* If no command name matches, show a syntax error */ 20286 parameter_syntax_error: 20287 showHelp(p->out, "parameter"); 20288 }else 20289 20290 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){ 20291 int i; 20292 for(i=1; i<nArg; i++){ 20293 if( i>1 ) raw_printf(p->out, " "); 20294 utf8_printf(p->out, "%s", azArg[i]); 20295 } 20296 raw_printf(p->out, "\n"); 20297 }else 20298 20299 #ifndef SQLITE_OMIT_PROGRESS_CALLBACK 20300 if( c=='p' && n>=3 && strncmp(azArg[0], "progress", n)==0 ){ 20301 int i; 20302 int nn = 0; 20303 p->flgProgress = 0; 20304 p->mxProgress = 0; 20305 p->nProgress = 0; 20306 for(i=1; i<nArg; i++){ 20307 const char *z = azArg[i]; 20308 if( z[0]=='-' ){ 20309 z++; 20310 if( z[0]=='-' ) z++; 20311 if( strcmp(z,"quiet")==0 || strcmp(z,"q")==0 ){ 20312 p->flgProgress |= SHELL_PROGRESS_QUIET; 20313 continue; 20314 } 20315 if( strcmp(z,"reset")==0 ){ 20316 p->flgProgress |= SHELL_PROGRESS_RESET; 20317 continue; 20318 } 20319 if( strcmp(z,"once")==0 ){ 20320 p->flgProgress |= SHELL_PROGRESS_ONCE; 20321 continue; 20322 } 20323 if( strcmp(z,"limit")==0 ){ 20324 if( i+1>=nArg ){ 20325 utf8_printf(stderr, "Error: missing argument on --limit\n"); 20326 rc = 1; 20327 goto meta_command_exit; 20328 }else{ 20329 p->mxProgress = (int)integerValue(azArg[++i]); 20330 } 20331 continue; 20332 } 20333 utf8_printf(stderr, "Error: unknown option: \"%s\"\n", azArg[i]); 20334 rc = 1; 20335 goto meta_command_exit; 20336 }else{ 20337 nn = (int)integerValue(z); 20338 } 20339 } 20340 open_db(p, 0); 20341 sqlite3_progress_handler(p->db, nn, progress_handler, p); 20342 }else 20343 #endif /* SQLITE_OMIT_PROGRESS_CALLBACK */ 20344 20345 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){ 20346 if( nArg >= 2) { 20347 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1); 20348 } 20349 if( nArg >= 3) { 20350 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1); 20351 } 20352 }else 20353 20354 if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){ 20355 rc = 2; 20356 }else 20357 20358 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){ 20359 FILE *inSaved = p->in; 20360 int savedLineno = p->lineno; 20361 failIfSafeMode(p, "cannot run .read in safe mode"); 20362 if( nArg!=2 ){ 20363 raw_printf(stderr, "Usage: .read FILE\n"); 20364 rc = 1; 20365 goto meta_command_exit; 20366 } 20367 if( azArg[1][0]=='|' ){ 20368 #ifdef SQLITE_OMIT_POPEN 20369 raw_printf(stderr, "Error: pipes are not supported in this OS\n"); 20370 rc = 1; 20371 p->out = stdout; 20372 #else 20373 p->in = popen(azArg[1]+1, "r"); 20374 if( p->in==0 ){ 20375 utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]); 20376 rc = 1; 20377 }else{ 20378 rc = process_input(p); 20379 pclose(p->in); 20380 } 20381 #endif 20382 }else if( (p->in = openChrSource(azArg[1]))==0 ){ 20383 utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]); 20384 rc = 1; 20385 }else{ 20386 rc = process_input(p); 20387 fclose(p->in); 20388 } 20389 p->in = inSaved; 20390 p->lineno = savedLineno; 20391 }else 20392 20393 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){ 20394 const char *zSrcFile; 20395 const char *zDb; 20396 sqlite3 *pSrc; 20397 sqlite3_backup *pBackup; 20398 int nTimeout = 0; 20399 20400 failIfSafeMode(p, "cannot run .restore in safe mode"); 20401 if( nArg==2 ){ 20402 zSrcFile = azArg[1]; 20403 zDb = "main"; 20404 }else if( nArg==3 ){ 20405 zSrcFile = azArg[2]; 20406 zDb = azArg[1]; 20407 }else{ 20408 raw_printf(stderr, "Usage: .restore ?DB? FILE\n"); 20409 rc = 1; 20410 goto meta_command_exit; 20411 } 20412 rc = sqlite3_open(zSrcFile, &pSrc); 20413 if( rc!=SQLITE_OK ){ 20414 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zSrcFile); 20415 close_db(pSrc); 20416 return 1; 20417 } 20418 open_db(p, 0); 20419 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main"); 20420 if( pBackup==0 ){ 20421 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); 20422 close_db(pSrc); 20423 return 1; 20424 } 20425 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK 20426 || rc==SQLITE_BUSY ){ 20427 if( rc==SQLITE_BUSY ){ 20428 if( nTimeout++ >= 3 ) break; 20429 sqlite3_sleep(100); 20430 } 20431 } 20432 sqlite3_backup_finish(pBackup); 20433 if( rc==SQLITE_DONE ){ 20434 rc = 0; 20435 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){ 20436 raw_printf(stderr, "Error: source database is busy\n"); 20437 rc = 1; 20438 }else{ 20439 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); 20440 rc = 1; 20441 } 20442 close_db(pSrc); 20443 }else 20444 20445 if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){ 20446 if( nArg==2 ){ 20447 p->scanstatsOn = (u8)booleanValue(azArg[1]); 20448 #ifndef SQLITE_ENABLE_STMT_SCANSTATUS 20449 raw_printf(stderr, "Warning: .scanstats not available in this build.\n"); 20450 #endif 20451 }else{ 20452 raw_printf(stderr, "Usage: .scanstats on|off\n"); 20453 rc = 1; 20454 } 20455 }else 20456 20457 if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){ 20458 ShellText sSelect; 20459 ShellState data; 20460 char *zErrMsg = 0; 20461 const char *zDiv = "("; 20462 const char *zName = 0; 20463 int iSchema = 0; 20464 int bDebug = 0; 20465 int bNoSystemTabs = 0; 20466 int ii; 20467 20468 open_db(p, 0); 20469 memcpy(&data, p, sizeof(data)); 20470 data.showHeader = 0; 20471 data.cMode = data.mode = MODE_Semi; 20472 initText(&sSelect); 20473 for(ii=1; ii<nArg; ii++){ 20474 if( optionMatch(azArg[ii],"indent") ){ 20475 data.cMode = data.mode = MODE_Pretty; 20476 }else if( optionMatch(azArg[ii],"debug") ){ 20477 bDebug = 1; 20478 }else if( optionMatch(azArg[ii],"nosys") ){ 20479 bNoSystemTabs = 1; 20480 }else if( azArg[ii][0]=='-' ){ 20481 utf8_printf(stderr, "Unknown option: \"%s\"\n", azArg[ii]); 20482 rc = 1; 20483 goto meta_command_exit; 20484 }else if( zName==0 ){ 20485 zName = azArg[ii]; 20486 }else{ 20487 raw_printf(stderr, "Usage: .schema ?--indent? ?--nosys? ?LIKE-PATTERN?\n"); 20488 rc = 1; 20489 goto meta_command_exit; 20490 } 20491 } 20492 if( zName!=0 ){ 20493 int isSchema = sqlite3_strlike(zName, "sqlite_master", '\\')==0 20494 || sqlite3_strlike(zName, "sqlite_schema", '\\')==0 20495 || sqlite3_strlike(zName,"sqlite_temp_master", '\\')==0 20496 || sqlite3_strlike(zName,"sqlite_temp_schema", '\\')==0; 20497 if( isSchema ){ 20498 char *new_argv[2], *new_colv[2]; 20499 new_argv[0] = sqlite3_mprintf( 20500 "CREATE TABLE %s (\n" 20501 " type text,\n" 20502 " name text,\n" 20503 " tbl_name text,\n" 20504 " rootpage integer,\n" 20505 " sql text\n" 20506 ")", zName); 20507 new_argv[1] = 0; 20508 new_colv[0] = "sql"; 20509 new_colv[1] = 0; 20510 callback(&data, 1, new_argv, new_colv); 20511 sqlite3_free(new_argv[0]); 20512 } 20513 } 20514 if( zDiv ){ 20515 sqlite3_stmt *pStmt = 0; 20516 rc = sqlite3_prepare_v2(p->db, "SELECT name FROM pragma_database_list", 20517 -1, &pStmt, 0); 20518 if( rc ){ 20519 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); 20520 sqlite3_finalize(pStmt); 20521 rc = 1; 20522 goto meta_command_exit; 20523 } 20524 appendText(&sSelect, "SELECT sql FROM", 0); 20525 iSchema = 0; 20526 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 20527 const char *zDb = (const char*)sqlite3_column_text(pStmt, 0); 20528 char zScNum[30]; 20529 sqlite3_snprintf(sizeof(zScNum), zScNum, "%d", ++iSchema); 20530 appendText(&sSelect, zDiv, 0); 20531 zDiv = " UNION ALL "; 20532 appendText(&sSelect, "SELECT shell_add_schema(sql,", 0); 20533 if( sqlite3_stricmp(zDb, "main")!=0 ){ 20534 appendText(&sSelect, zDb, '\''); 20535 }else{ 20536 appendText(&sSelect, "NULL", 0); 20537 } 20538 appendText(&sSelect, ",name) AS sql, type, tbl_name, name, rowid,", 0); 20539 appendText(&sSelect, zScNum, 0); 20540 appendText(&sSelect, " AS snum, ", 0); 20541 appendText(&sSelect, zDb, '\''); 20542 appendText(&sSelect, " AS sname FROM ", 0); 20543 appendText(&sSelect, zDb, quoteChar(zDb)); 20544 appendText(&sSelect, ".sqlite_schema", 0); 20545 } 20546 sqlite3_finalize(pStmt); 20547 #ifndef SQLITE_OMIT_INTROSPECTION_PRAGMAS 20548 if( zName ){ 20549 appendText(&sSelect, 20550 " UNION ALL SELECT shell_module_schema(name)," 20551 " 'table', name, name, name, 9e+99, 'main' FROM pragma_module_list", 20552 0); 20553 } 20554 #endif 20555 appendText(&sSelect, ") WHERE ", 0); 20556 if( zName ){ 20557 char *zQarg = sqlite3_mprintf("%Q", zName); 20558 int bGlob = strchr(zName, '*') != 0 || strchr(zName, '?') != 0 || 20559 strchr(zName, '[') != 0; 20560 if( strchr(zName, '.') ){ 20561 appendText(&sSelect, "lower(printf('%s.%s',sname,tbl_name))", 0); 20562 }else{ 20563 appendText(&sSelect, "lower(tbl_name)", 0); 20564 } 20565 appendText(&sSelect, bGlob ? " GLOB " : " LIKE ", 0); 20566 appendText(&sSelect, zQarg, 0); 20567 if( !bGlob ){ 20568 appendText(&sSelect, " ESCAPE '\\' ", 0); 20569 } 20570 appendText(&sSelect, " AND ", 0); 20571 sqlite3_free(zQarg); 20572 } 20573 if( bNoSystemTabs ){ 20574 appendText(&sSelect, "name NOT LIKE 'sqlite_%%' AND ", 0); 20575 } 20576 appendText(&sSelect, "sql IS NOT NULL" 20577 " ORDER BY snum, rowid", 0); 20578 if( bDebug ){ 20579 utf8_printf(p->out, "SQL: %s;\n", sSelect.z); 20580 }else{ 20581 rc = sqlite3_exec(p->db, sSelect.z, callback, &data, &zErrMsg); 20582 } 20583 freeText(&sSelect); 20584 } 20585 if( zErrMsg ){ 20586 utf8_printf(stderr,"Error: %s\n", zErrMsg); 20587 sqlite3_free(zErrMsg); 20588 rc = 1; 20589 }else if( rc != SQLITE_OK ){ 20590 raw_printf(stderr,"Error: querying schema information\n"); 20591 rc = 1; 20592 }else{ 20593 rc = 0; 20594 } 20595 }else 20596 20597 if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){ 20598 unsigned int x = nArg>=2 ? (unsigned int)integerValue(azArg[1]) : 0xffffffff; 20599 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &x); 20600 }else 20601 20602 #if defined(SQLITE_ENABLE_SESSION) 20603 if( c=='s' && strncmp(azArg[0],"session",n)==0 && n>=3 ){ 20604 struct AuxDb *pAuxDb = p->pAuxDb; 20605 OpenSession *pSession = &pAuxDb->aSession[0]; 20606 char **azCmd = &azArg[1]; 20607 int iSes = 0; 20608 int nCmd = nArg - 1; 20609 int i; 20610 if( nArg<=1 ) goto session_syntax_error; 20611 open_db(p, 0); 20612 if( nArg>=3 ){ 20613 for(iSes=0; iSes<pAuxDb->nSession; iSes++){ 20614 if( strcmp(pAuxDb->aSession[iSes].zName, azArg[1])==0 ) break; 20615 } 20616 if( iSes<pAuxDb->nSession ){ 20617 pSession = &pAuxDb->aSession[iSes]; 20618 azCmd++; 20619 nCmd--; 20620 }else{ 20621 pSession = &pAuxDb->aSession[0]; 20622 iSes = 0; 20623 } 20624 } 20625 20626 /* .session attach TABLE 20627 ** Invoke the sqlite3session_attach() interface to attach a particular 20628 ** table so that it is never filtered. 20629 */ 20630 if( strcmp(azCmd[0],"attach")==0 ){ 20631 if( nCmd!=2 ) goto session_syntax_error; 20632 if( pSession->p==0 ){ 20633 session_not_open: 20634 raw_printf(stderr, "ERROR: No sessions are open\n"); 20635 }else{ 20636 rc = sqlite3session_attach(pSession->p, azCmd[1]); 20637 if( rc ){ 20638 raw_printf(stderr, "ERROR: sqlite3session_attach() returns %d\n", rc); 20639 rc = 0; 20640 } 20641 } 20642 }else 20643 20644 /* .session changeset FILE 20645 ** .session patchset FILE 20646 ** Write a changeset or patchset into a file. The file is overwritten. 20647 */ 20648 if( strcmp(azCmd[0],"changeset")==0 || strcmp(azCmd[0],"patchset")==0 ){ 20649 FILE *out = 0; 20650 failIfSafeMode(p, "cannot run \".session %s\" in safe mode", azCmd[0]); 20651 if( nCmd!=2 ) goto session_syntax_error; 20652 if( pSession->p==0 ) goto session_not_open; 20653 out = fopen(azCmd[1], "wb"); 20654 if( out==0 ){ 20655 utf8_printf(stderr, "ERROR: cannot open \"%s\" for writing\n", 20656 azCmd[1]); 20657 }else{ 20658 int szChng; 20659 void *pChng; 20660 if( azCmd[0][0]=='c' ){ 20661 rc = sqlite3session_changeset(pSession->p, &szChng, &pChng); 20662 }else{ 20663 rc = sqlite3session_patchset(pSession->p, &szChng, &pChng); 20664 } 20665 if( rc ){ 20666 printf("Error: error code %d\n", rc); 20667 rc = 0; 20668 } 20669 if( pChng 20670 && fwrite(pChng, szChng, 1, out)!=1 ){ 20671 raw_printf(stderr, "ERROR: Failed to write entire %d-byte output\n", 20672 szChng); 20673 } 20674 sqlite3_free(pChng); 20675 fclose(out); 20676 } 20677 }else 20678 20679 /* .session close 20680 ** Close the identified session 20681 */ 20682 if( strcmp(azCmd[0], "close")==0 ){ 20683 if( nCmd!=1 ) goto session_syntax_error; 20684 if( pAuxDb->nSession ){ 20685 session_close(pSession); 20686 pAuxDb->aSession[iSes] = pAuxDb->aSession[--pAuxDb->nSession]; 20687 } 20688 }else 20689 20690 /* .session enable ?BOOLEAN? 20691 ** Query or set the enable flag 20692 */ 20693 if( strcmp(azCmd[0], "enable")==0 ){ 20694 int ii; 20695 if( nCmd>2 ) goto session_syntax_error; 20696 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]); 20697 if( pAuxDb->nSession ){ 20698 ii = sqlite3session_enable(pSession->p, ii); 20699 utf8_printf(p->out, "session %s enable flag = %d\n", 20700 pSession->zName, ii); 20701 } 20702 }else 20703 20704 /* .session filter GLOB .... 20705 ** Set a list of GLOB patterns of table names to be excluded. 20706 */ 20707 if( strcmp(azCmd[0], "filter")==0 ){ 20708 int ii, nByte; 20709 if( nCmd<2 ) goto session_syntax_error; 20710 if( pAuxDb->nSession ){ 20711 for(ii=0; ii<pSession->nFilter; ii++){ 20712 sqlite3_free(pSession->azFilter[ii]); 20713 } 20714 sqlite3_free(pSession->azFilter); 20715 nByte = sizeof(pSession->azFilter[0])*(nCmd-1); 20716 pSession->azFilter = sqlite3_malloc( nByte ); 20717 if( pSession->azFilter==0 ){ 20718 raw_printf(stderr, "Error: out or memory\n"); 20719 exit(1); 20720 } 20721 for(ii=1; ii<nCmd; ii++){ 20722 pSession->azFilter[ii-1] = sqlite3_mprintf("%s", azCmd[ii]); 20723 } 20724 pSession->nFilter = ii-1; 20725 } 20726 }else 20727 20728 /* .session indirect ?BOOLEAN? 20729 ** Query or set the indirect flag 20730 */ 20731 if( strcmp(azCmd[0], "indirect")==0 ){ 20732 int ii; 20733 if( nCmd>2 ) goto session_syntax_error; 20734 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]); 20735 if( pAuxDb->nSession ){ 20736 ii = sqlite3session_indirect(pSession->p, ii); 20737 utf8_printf(p->out, "session %s indirect flag = %d\n", 20738 pSession->zName, ii); 20739 } 20740 }else 20741 20742 /* .session isempty 20743 ** Determine if the session is empty 20744 */ 20745 if( strcmp(azCmd[0], "isempty")==0 ){ 20746 int ii; 20747 if( nCmd!=1 ) goto session_syntax_error; 20748 if( pAuxDb->nSession ){ 20749 ii = sqlite3session_isempty(pSession->p); 20750 utf8_printf(p->out, "session %s isempty flag = %d\n", 20751 pSession->zName, ii); 20752 } 20753 }else 20754 20755 /* .session list 20756 ** List all currently open sessions 20757 */ 20758 if( strcmp(azCmd[0],"list")==0 ){ 20759 for(i=0; i<pAuxDb->nSession; i++){ 20760 utf8_printf(p->out, "%d %s\n", i, pAuxDb->aSession[i].zName); 20761 } 20762 }else 20763 20764 /* .session open DB NAME 20765 ** Open a new session called NAME on the attached database DB. 20766 ** DB is normally "main". 20767 */ 20768 if( strcmp(azCmd[0],"open")==0 ){ 20769 char *zName; 20770 if( nCmd!=3 ) goto session_syntax_error; 20771 zName = azCmd[2]; 20772 if( zName[0]==0 ) goto session_syntax_error; 20773 for(i=0; i<pAuxDb->nSession; i++){ 20774 if( strcmp(pAuxDb->aSession[i].zName,zName)==0 ){ 20775 utf8_printf(stderr, "Session \"%s\" already exists\n", zName); 20776 goto meta_command_exit; 20777 } 20778 } 20779 if( pAuxDb->nSession>=ArraySize(pAuxDb->aSession) ){ 20780 raw_printf(stderr, "Maximum of %d sessions\n", ArraySize(pAuxDb->aSession)); 20781 goto meta_command_exit; 20782 } 20783 pSession = &pAuxDb->aSession[pAuxDb->nSession]; 20784 rc = sqlite3session_create(p->db, azCmd[1], &pSession->p); 20785 if( rc ){ 20786 raw_printf(stderr, "Cannot open session: error code=%d\n", rc); 20787 rc = 0; 20788 goto meta_command_exit; 20789 } 20790 pSession->nFilter = 0; 20791 sqlite3session_table_filter(pSession->p, session_filter, pSession); 20792 pAuxDb->nSession++; 20793 pSession->zName = sqlite3_mprintf("%s", zName); 20794 }else 20795 /* If no command name matches, show a syntax error */ 20796 session_syntax_error: 20797 showHelp(p->out, "session"); 20798 }else 20799 #endif 20800 20801 #ifdef SQLITE_DEBUG 20802 /* Undocumented commands for internal testing. Subject to change 20803 ** without notice. */ 20804 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){ 20805 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){ 20806 int i, v; 20807 for(i=1; i<nArg; i++){ 20808 v = booleanValue(azArg[i]); 20809 utf8_printf(p->out, "%s: %d 0x%x\n", azArg[i], v, v); 20810 } 20811 } 20812 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){ 20813 int i; sqlite3_int64 v; 20814 for(i=1; i<nArg; i++){ 20815 char zBuf[200]; 20816 v = integerValue(azArg[i]); 20817 sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v); 20818 utf8_printf(p->out, "%s", zBuf); 20819 } 20820 } 20821 }else 20822 #endif 20823 20824 if( c=='s' && n>=4 && strncmp(azArg[0],"selftest",n)==0 ){ 20825 int bIsInit = 0; /* True to initialize the SELFTEST table */ 20826 int bVerbose = 0; /* Verbose output */ 20827 int bSelftestExists; /* True if SELFTEST already exists */ 20828 int i, k; /* Loop counters */ 20829 int nTest = 0; /* Number of tests runs */ 20830 int nErr = 0; /* Number of errors seen */ 20831 ShellText str; /* Answer for a query */ 20832 sqlite3_stmt *pStmt = 0; /* Query against the SELFTEST table */ 20833 20834 open_db(p,0); 20835 for(i=1; i<nArg; i++){ 20836 const char *z = azArg[i]; 20837 if( z[0]=='-' && z[1]=='-' ) z++; 20838 if( strcmp(z,"-init")==0 ){ 20839 bIsInit = 1; 20840 }else 20841 if( strcmp(z,"-v")==0 ){ 20842 bVerbose++; 20843 }else 20844 { 20845 utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n", 20846 azArg[i], azArg[0]); 20847 raw_printf(stderr, "Should be one of: --init -v\n"); 20848 rc = 1; 20849 goto meta_command_exit; 20850 } 20851 } 20852 if( sqlite3_table_column_metadata(p->db,"main","selftest",0,0,0,0,0,0) 20853 != SQLITE_OK ){ 20854 bSelftestExists = 0; 20855 }else{ 20856 bSelftestExists = 1; 20857 } 20858 if( bIsInit ){ 20859 createSelftestTable(p); 20860 bSelftestExists = 1; 20861 } 20862 initText(&str); 20863 appendText(&str, "x", 0); 20864 for(k=bSelftestExists; k>=0; k--){ 20865 if( k==1 ){ 20866 rc = sqlite3_prepare_v2(p->db, 20867 "SELECT tno,op,cmd,ans FROM selftest ORDER BY tno", 20868 -1, &pStmt, 0); 20869 }else{ 20870 rc = sqlite3_prepare_v2(p->db, 20871 "VALUES(0,'memo','Missing SELFTEST table - default checks only','')," 20872 " (1,'run','PRAGMA integrity_check','ok')", 20873 -1, &pStmt, 0); 20874 } 20875 if( rc ){ 20876 raw_printf(stderr, "Error querying the selftest table\n"); 20877 rc = 1; 20878 sqlite3_finalize(pStmt); 20879 goto meta_command_exit; 20880 } 20881 for(i=1; sqlite3_step(pStmt)==SQLITE_ROW; i++){ 20882 int tno = sqlite3_column_int(pStmt, 0); 20883 const char *zOp = (const char*)sqlite3_column_text(pStmt, 1); 20884 const char *zSql = (const char*)sqlite3_column_text(pStmt, 2); 20885 const char *zAns = (const char*)sqlite3_column_text(pStmt, 3); 20886 20887 k = 0; 20888 if( bVerbose>0 ){ 20889 char *zQuote = sqlite3_mprintf("%q", zSql); 20890 printf("%d: %s %s\n", tno, zOp, zSql); 20891 sqlite3_free(zQuote); 20892 } 20893 if( strcmp(zOp,"memo")==0 ){ 20894 utf8_printf(p->out, "%s\n", zSql); 20895 }else 20896 if( strcmp(zOp,"run")==0 ){ 20897 char *zErrMsg = 0; 20898 str.n = 0; 20899 str.z[0] = 0; 20900 rc = sqlite3_exec(p->db, zSql, captureOutputCallback, &str, &zErrMsg); 20901 nTest++; 20902 if( bVerbose ){ 20903 utf8_printf(p->out, "Result: %s\n", str.z); 20904 } 20905 if( rc || zErrMsg ){ 20906 nErr++; 20907 rc = 1; 20908 utf8_printf(p->out, "%d: error-code-%d: %s\n", tno, rc, zErrMsg); 20909 sqlite3_free(zErrMsg); 20910 }else if( strcmp(zAns,str.z)!=0 ){ 20911 nErr++; 20912 rc = 1; 20913 utf8_printf(p->out, "%d: Expected: [%s]\n", tno, zAns); 20914 utf8_printf(p->out, "%d: Got: [%s]\n", tno, str.z); 20915 } 20916 }else 20917 { 20918 utf8_printf(stderr, 20919 "Unknown operation \"%s\" on selftest line %d\n", zOp, tno); 20920 rc = 1; 20921 break; 20922 } 20923 } /* End loop over rows of content from SELFTEST */ 20924 sqlite3_finalize(pStmt); 20925 } /* End loop over k */ 20926 freeText(&str); 20927 utf8_printf(p->out, "%d errors out of %d tests\n", nErr, nTest); 20928 }else 20929 20930 if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){ 20931 if( nArg<2 || nArg>3 ){ 20932 raw_printf(stderr, "Usage: .separator COL ?ROW?\n"); 20933 rc = 1; 20934 } 20935 if( nArg>=2 ){ 20936 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, 20937 "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]); 20938 } 20939 if( nArg>=3 ){ 20940 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, 20941 "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]); 20942 } 20943 }else 20944 20945 if( c=='s' && n>=4 && strncmp(azArg[0],"sha3sum",n)==0 ){ 20946 const char *zLike = 0; /* Which table to checksum. 0 means everything */ 20947 int i; /* Loop counter */ 20948 int bSchema = 0; /* Also hash the schema */ 20949 int bSeparate = 0; /* Hash each table separately */ 20950 int iSize = 224; /* Hash algorithm to use */ 20951 int bDebug = 0; /* Only show the query that would have run */ 20952 sqlite3_stmt *pStmt; /* For querying tables names */ 20953 char *zSql; /* SQL to be run */ 20954 char *zSep; /* Separator */ 20955 ShellText sSql; /* Complete SQL for the query to run the hash */ 20956 ShellText sQuery; /* Set of queries used to read all content */ 20957 open_db(p, 0); 20958 for(i=1; i<nArg; i++){ 20959 const char *z = azArg[i]; 20960 if( z[0]=='-' ){ 20961 z++; 20962 if( z[0]=='-' ) z++; 20963 if( strcmp(z,"schema")==0 ){ 20964 bSchema = 1; 20965 }else 20966 if( strcmp(z,"sha3-224")==0 || strcmp(z,"sha3-256")==0 20967 || strcmp(z,"sha3-384")==0 || strcmp(z,"sha3-512")==0 20968 ){ 20969 iSize = atoi(&z[5]); 20970 }else 20971 if( strcmp(z,"debug")==0 ){ 20972 bDebug = 1; 20973 }else 20974 { 20975 utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n", 20976 azArg[i], azArg[0]); 20977 showHelp(p->out, azArg[0]); 20978 rc = 1; 20979 goto meta_command_exit; 20980 } 20981 }else if( zLike ){ 20982 raw_printf(stderr, "Usage: .sha3sum ?OPTIONS? ?LIKE-PATTERN?\n"); 20983 rc = 1; 20984 goto meta_command_exit; 20985 }else{ 20986 zLike = z; 20987 bSeparate = 1; 20988 if( sqlite3_strlike("sqlite\\_%", zLike, '\\')==0 ) bSchema = 1; 20989 } 20990 } 20991 if( bSchema ){ 20992 zSql = "SELECT lower(name) FROM sqlite_schema" 20993 " WHERE type='table' AND coalesce(rootpage,0)>1" 20994 " UNION ALL SELECT 'sqlite_schema'" 20995 " ORDER BY 1 collate nocase"; 20996 }else{ 20997 zSql = "SELECT lower(name) FROM sqlite_schema" 20998 " WHERE type='table' AND coalesce(rootpage,0)>1" 20999 " AND name NOT LIKE 'sqlite_%'" 21000 " ORDER BY 1 collate nocase"; 21001 } 21002 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 21003 initText(&sQuery); 21004 initText(&sSql); 21005 appendText(&sSql, "WITH [sha3sum$query](a,b) AS(",0); 21006 zSep = "VALUES("; 21007 while( SQLITE_ROW==sqlite3_step(pStmt) ){ 21008 const char *zTab = (const char*)sqlite3_column_text(pStmt,0); 21009 if( zLike && sqlite3_strlike(zLike, zTab, 0)!=0 ) continue; 21010 if( strncmp(zTab, "sqlite_",7)!=0 ){ 21011 appendText(&sQuery,"SELECT * FROM ", 0); 21012 appendText(&sQuery,zTab,'"'); 21013 appendText(&sQuery," NOT INDEXED;", 0); 21014 }else if( strcmp(zTab, "sqlite_schema")==0 ){ 21015 appendText(&sQuery,"SELECT type,name,tbl_name,sql FROM sqlite_schema" 21016 " ORDER BY name;", 0); 21017 }else if( strcmp(zTab, "sqlite_sequence")==0 ){ 21018 appendText(&sQuery,"SELECT name,seq FROM sqlite_sequence" 21019 " ORDER BY name;", 0); 21020 }else if( strcmp(zTab, "sqlite_stat1")==0 ){ 21021 appendText(&sQuery,"SELECT tbl,idx,stat FROM sqlite_stat1" 21022 " ORDER BY tbl,idx;", 0); 21023 }else if( strcmp(zTab, "sqlite_stat4")==0 ){ 21024 appendText(&sQuery, "SELECT * FROM ", 0); 21025 appendText(&sQuery, zTab, 0); 21026 appendText(&sQuery, " ORDER BY tbl, idx, rowid;\n", 0); 21027 } 21028 appendText(&sSql, zSep, 0); 21029 appendText(&sSql, sQuery.z, '\''); 21030 sQuery.n = 0; 21031 appendText(&sSql, ",", 0); 21032 appendText(&sSql, zTab, '\''); 21033 zSep = "),("; 21034 } 21035 sqlite3_finalize(pStmt); 21036 if( bSeparate ){ 21037 zSql = sqlite3_mprintf( 21038 "%s))" 21039 " SELECT lower(hex(sha3_query(a,%d))) AS hash, b AS label" 21040 " FROM [sha3sum$query]", 21041 sSql.z, iSize); 21042 }else{ 21043 zSql = sqlite3_mprintf( 21044 "%s))" 21045 " SELECT lower(hex(sha3_query(group_concat(a,''),%d))) AS hash" 21046 " FROM [sha3sum$query]", 21047 sSql.z, iSize); 21048 } 21049 freeText(&sQuery); 21050 freeText(&sSql); 21051 if( bDebug ){ 21052 utf8_printf(p->out, "%s\n", zSql); 21053 }else{ 21054 shell_exec(p, zSql, 0); 21055 } 21056 sqlite3_free(zSql); 21057 }else 21058 21059 #ifndef SQLITE_NOHAVE_SYSTEM 21060 if( c=='s' 21061 && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0) 21062 ){ 21063 char *zCmd; 21064 int i, x; 21065 failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]); 21066 if( nArg<2 ){ 21067 raw_printf(stderr, "Usage: .system COMMAND\n"); 21068 rc = 1; 21069 goto meta_command_exit; 21070 } 21071 zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]); 21072 for(i=2; i<nArg; i++){ 21073 zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"", 21074 zCmd, azArg[i]); 21075 } 21076 x = system(zCmd); 21077 sqlite3_free(zCmd); 21078 if( x ) raw_printf(stderr, "System command returns %d\n", x); 21079 }else 21080 #endif /* !defined(SQLITE_NOHAVE_SYSTEM) */ 21081 21082 if( c=='s' && strncmp(azArg[0], "show", n)==0 ){ 21083 static const char *azBool[] = { "off", "on", "trigger", "full"}; 21084 const char *zOut; 21085 int i; 21086 if( nArg!=1 ){ 21087 raw_printf(stderr, "Usage: .show\n"); 21088 rc = 1; 21089 goto meta_command_exit; 21090 } 21091 utf8_printf(p->out, "%12.12s: %s\n","echo", 21092 azBool[ShellHasFlag(p, SHFLG_Echo)]); 21093 utf8_printf(p->out, "%12.12s: %s\n","eqp", azBool[p->autoEQP&3]); 21094 utf8_printf(p->out, "%12.12s: %s\n","explain", 21095 p->mode==MODE_Explain ? "on" : p->autoExplain ? "auto" : "off"); 21096 utf8_printf(p->out,"%12.12s: %s\n","headers", azBool[p->showHeader!=0]); 21097 utf8_printf(p->out, "%12.12s: %s\n","mode", modeDescr[p->mode]); 21098 utf8_printf(p->out, "%12.12s: ", "nullvalue"); 21099 output_c_string(p->out, p->nullValue); 21100 raw_printf(p->out, "\n"); 21101 utf8_printf(p->out,"%12.12s: %s\n","output", 21102 strlen30(p->outfile) ? p->outfile : "stdout"); 21103 utf8_printf(p->out,"%12.12s: ", "colseparator"); 21104 output_c_string(p->out, p->colSeparator); 21105 raw_printf(p->out, "\n"); 21106 utf8_printf(p->out,"%12.12s: ", "rowseparator"); 21107 output_c_string(p->out, p->rowSeparator); 21108 raw_printf(p->out, "\n"); 21109 switch( p->statsOn ){ 21110 case 0: zOut = "off"; break; 21111 default: zOut = "on"; break; 21112 case 2: zOut = "stmt"; break; 21113 case 3: zOut = "vmstep"; break; 21114 } 21115 utf8_printf(p->out, "%12.12s: %s\n","stats", zOut); 21116 utf8_printf(p->out, "%12.12s: ", "width"); 21117 for (i=0;i<p->nWidth;i++) { 21118 raw_printf(p->out, "%d ", p->colWidth[i]); 21119 } 21120 raw_printf(p->out, "\n"); 21121 utf8_printf(p->out, "%12.12s: %s\n", "filename", 21122 p->pAuxDb->zDbFilename ? p->pAuxDb->zDbFilename : ""); 21123 }else 21124 21125 if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){ 21126 if( nArg==2 ){ 21127 if( strcmp(azArg[1],"stmt")==0 ){ 21128 p->statsOn = 2; 21129 }else if( strcmp(azArg[1],"vmstep")==0 ){ 21130 p->statsOn = 3; 21131 }else{ 21132 p->statsOn = (u8)booleanValue(azArg[1]); 21133 } 21134 }else if( nArg==1 ){ 21135 display_stats(p->db, p, 0); 21136 }else{ 21137 raw_printf(stderr, "Usage: .stats ?on|off|stmt|vmstep?\n"); 21138 rc = 1; 21139 } 21140 }else 21141 21142 if( (c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0) 21143 || (c=='i' && (strncmp(azArg[0], "indices", n)==0 21144 || strncmp(azArg[0], "indexes", n)==0) ) 21145 ){ 21146 sqlite3_stmt *pStmt; 21147 char **azResult; 21148 int nRow, nAlloc; 21149 int ii; 21150 ShellText s; 21151 initText(&s); 21152 open_db(p, 0); 21153 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0); 21154 if( rc ){ 21155 sqlite3_finalize(pStmt); 21156 return shellDatabaseError(p->db); 21157 } 21158 21159 if( nArg>2 && c=='i' ){ 21160 /* It is an historical accident that the .indexes command shows an error 21161 ** when called with the wrong number of arguments whereas the .tables 21162 ** command does not. */ 21163 raw_printf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n"); 21164 rc = 1; 21165 sqlite3_finalize(pStmt); 21166 goto meta_command_exit; 21167 } 21168 for(ii=0; sqlite3_step(pStmt)==SQLITE_ROW; ii++){ 21169 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1); 21170 if( zDbName==0 ) continue; 21171 if( s.z && s.z[0] ) appendText(&s, " UNION ALL ", 0); 21172 if( sqlite3_stricmp(zDbName, "main")==0 ){ 21173 appendText(&s, "SELECT name FROM ", 0); 21174 }else{ 21175 appendText(&s, "SELECT ", 0); 21176 appendText(&s, zDbName, '\''); 21177 appendText(&s, "||'.'||name FROM ", 0); 21178 } 21179 appendText(&s, zDbName, '"'); 21180 appendText(&s, ".sqlite_schema ", 0); 21181 if( c=='t' ){ 21182 appendText(&s," WHERE type IN ('table','view')" 21183 " AND name NOT LIKE 'sqlite_%'" 21184 " AND name LIKE ?1", 0); 21185 }else{ 21186 appendText(&s," WHERE type='index'" 21187 " AND tbl_name LIKE ?1", 0); 21188 } 21189 } 21190 rc = sqlite3_finalize(pStmt); 21191 if( rc==SQLITE_OK ){ 21192 appendText(&s, " ORDER BY 1", 0); 21193 rc = sqlite3_prepare_v2(p->db, s.z, -1, &pStmt, 0); 21194 } 21195 freeText(&s); 21196 if( rc ) return shellDatabaseError(p->db); 21197 21198 /* Run the SQL statement prepared by the above block. Store the results 21199 ** as an array of nul-terminated strings in azResult[]. */ 21200 nRow = nAlloc = 0; 21201 azResult = 0; 21202 if( nArg>1 ){ 21203 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT); 21204 }else{ 21205 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC); 21206 } 21207 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 21208 if( nRow>=nAlloc ){ 21209 char **azNew; 21210 int n2 = nAlloc*2 + 10; 21211 azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2); 21212 if( azNew==0 ) shell_out_of_memory(); 21213 nAlloc = n2; 21214 azResult = azNew; 21215 } 21216 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0)); 21217 if( 0==azResult[nRow] ) shell_out_of_memory(); 21218 nRow++; 21219 } 21220 if( sqlite3_finalize(pStmt)!=SQLITE_OK ){ 21221 rc = shellDatabaseError(p->db); 21222 } 21223 21224 /* Pretty-print the contents of array azResult[] to the output */ 21225 if( rc==0 && nRow>0 ){ 21226 int len, maxlen = 0; 21227 int i, j; 21228 int nPrintCol, nPrintRow; 21229 for(i=0; i<nRow; i++){ 21230 len = strlen30(azResult[i]); 21231 if( len>maxlen ) maxlen = len; 21232 } 21233 nPrintCol = 80/(maxlen+2); 21234 if( nPrintCol<1 ) nPrintCol = 1; 21235 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol; 21236 for(i=0; i<nPrintRow; i++){ 21237 for(j=i; j<nRow; j+=nPrintRow){ 21238 char *zSp = j<nPrintRow ? "" : " "; 21239 utf8_printf(p->out, "%s%-*s", zSp, maxlen, 21240 azResult[j] ? azResult[j]:""); 21241 } 21242 raw_printf(p->out, "\n"); 21243 } 21244 } 21245 21246 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]); 21247 sqlite3_free(azResult); 21248 }else 21249 21250 /* Begin redirecting output to the file "testcase-out.txt" */ 21251 if( c=='t' && strcmp(azArg[0],"testcase")==0 ){ 21252 output_reset(p); 21253 p->out = output_file_open("testcase-out.txt", 0); 21254 if( p->out==0 ){ 21255 raw_printf(stderr, "Error: cannot open 'testcase-out.txt'\n"); 21256 } 21257 if( nArg>=2 ){ 21258 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "%s", azArg[1]); 21259 }else{ 21260 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "?"); 21261 } 21262 }else 21263 21264 #ifndef SQLITE_UNTESTABLE 21265 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 ){ 21266 static const struct { 21267 const char *zCtrlName; /* Name of a test-control option */ 21268 int ctrlCode; /* Integer code for that option */ 21269 int unSafe; /* Not valid for --safe mode */ 21270 const char *zUsage; /* Usage notes */ 21271 } aCtrl[] = { 21272 { "always", SQLITE_TESTCTRL_ALWAYS, 1, "BOOLEAN" }, 21273 { "assert", SQLITE_TESTCTRL_ASSERT, 1, "BOOLEAN" }, 21274 /*{ "benign_malloc_hooks",SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS,1, "" },*/ 21275 /*{ "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST, 1, "" },*/ 21276 { "byteorder", SQLITE_TESTCTRL_BYTEORDER, 0, "" }, 21277 { "extra_schema_checks",SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS,0,"BOOLEAN" }, 21278 /*{ "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL, 1,"" },*/ 21279 { "imposter", SQLITE_TESTCTRL_IMPOSTER,1,"SCHEMA ON/OFF ROOTPAGE"}, 21280 { "internal_functions", SQLITE_TESTCTRL_INTERNAL_FUNCTIONS,0,"" }, 21281 { "localtime_fault", SQLITE_TESTCTRL_LOCALTIME_FAULT,0,"BOOLEAN" }, 21282 { "never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT,1, "BOOLEAN" }, 21283 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS,0,"DISABLE-MASK" }, 21284 #ifdef YYCOVERAGE 21285 { "parser_coverage", SQLITE_TESTCTRL_PARSER_COVERAGE,0,"" }, 21286 #endif 21287 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE,0, "OFFSET " }, 21288 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE,0, "" }, 21289 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE, 0, "" }, 21290 { "prng_seed", SQLITE_TESTCTRL_PRNG_SEED, 0, "SEED ?db?" }, 21291 { "seek_count", SQLITE_TESTCTRL_SEEK_COUNT, 0, "" }, 21292 { "sorter_mmap", SQLITE_TESTCTRL_SORTER_MMAP, 0, "NMAX" }, 21293 { "tune", SQLITE_TESTCTRL_TUNE, 1, "ID VALUE" }, 21294 }; 21295 int testctrl = -1; 21296 int iCtrl = -1; 21297 int rc2 = 0; /* 0: usage. 1: %d 2: %x 3: no-output */ 21298 int isOk = 0; 21299 int i, n2; 21300 const char *zCmd = 0; 21301 21302 open_db(p, 0); 21303 zCmd = nArg>=2 ? azArg[1] : "help"; 21304 21305 /* The argument can optionally begin with "-" or "--" */ 21306 if( zCmd[0]=='-' && zCmd[1] ){ 21307 zCmd++; 21308 if( zCmd[0]=='-' && zCmd[1] ) zCmd++; 21309 } 21310 21311 /* --help lists all test-controls */ 21312 if( strcmp(zCmd,"help")==0 ){ 21313 utf8_printf(p->out, "Available test-controls:\n"); 21314 for(i=0; i<ArraySize(aCtrl); i++){ 21315 utf8_printf(p->out, " .testctrl %s %s\n", 21316 aCtrl[i].zCtrlName, aCtrl[i].zUsage); 21317 } 21318 rc = 1; 21319 goto meta_command_exit; 21320 } 21321 21322 /* convert testctrl text option to value. allow any unique prefix 21323 ** of the option name, or a numerical value. */ 21324 n2 = strlen30(zCmd); 21325 for(i=0; i<ArraySize(aCtrl); i++){ 21326 if( strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){ 21327 if( testctrl<0 ){ 21328 testctrl = aCtrl[i].ctrlCode; 21329 iCtrl = i; 21330 }else{ 21331 utf8_printf(stderr, "Error: ambiguous test-control: \"%s\"\n" 21332 "Use \".testctrl --help\" for help\n", zCmd); 21333 rc = 1; 21334 goto meta_command_exit; 21335 } 21336 } 21337 } 21338 if( testctrl<0 ){ 21339 utf8_printf(stderr,"Error: unknown test-control: %s\n" 21340 "Use \".testctrl --help\" for help\n", zCmd); 21341 }else if( aCtrl[iCtrl].unSafe && p->bSafeMode ){ 21342 utf8_printf(stderr, 21343 "line %d: \".testctrl %s\" may not be used in safe mode\n", 21344 p->lineno, aCtrl[iCtrl].zCtrlName); 21345 exit(1); 21346 }else{ 21347 switch(testctrl){ 21348 21349 /* sqlite3_test_control(int, db, int) */ 21350 case SQLITE_TESTCTRL_OPTIMIZATIONS: 21351 if( nArg==3 ){ 21352 unsigned int opt = (unsigned int)strtol(azArg[2], 0, 0); 21353 rc2 = sqlite3_test_control(testctrl, p->db, opt); 21354 isOk = 3; 21355 } 21356 break; 21357 21358 /* sqlite3_test_control(int) */ 21359 case SQLITE_TESTCTRL_PRNG_SAVE: 21360 case SQLITE_TESTCTRL_PRNG_RESTORE: 21361 case SQLITE_TESTCTRL_BYTEORDER: 21362 if( nArg==2 ){ 21363 rc2 = sqlite3_test_control(testctrl); 21364 isOk = testctrl==SQLITE_TESTCTRL_BYTEORDER ? 1 : 3; 21365 } 21366 break; 21367 21368 /* sqlite3_test_control(int, uint) */ 21369 case SQLITE_TESTCTRL_PENDING_BYTE: 21370 if( nArg==3 ){ 21371 unsigned int opt = (unsigned int)integerValue(azArg[2]); 21372 rc2 = sqlite3_test_control(testctrl, opt); 21373 isOk = 3; 21374 } 21375 break; 21376 21377 /* sqlite3_test_control(int, int, sqlite3*) */ 21378 case SQLITE_TESTCTRL_PRNG_SEED: 21379 if( nArg==3 || nArg==4 ){ 21380 int ii = (int)integerValue(azArg[2]); 21381 sqlite3 *db; 21382 if( ii==0 && strcmp(azArg[2],"random")==0 ){ 21383 sqlite3_randomness(sizeof(ii),&ii); 21384 printf("-- random seed: %d\n", ii); 21385 } 21386 if( nArg==3 ){ 21387 db = 0; 21388 }else{ 21389 db = p->db; 21390 /* Make sure the schema has been loaded */ 21391 sqlite3_table_column_metadata(db, 0, "x", 0, 0, 0, 0, 0, 0); 21392 } 21393 rc2 = sqlite3_test_control(testctrl, ii, db); 21394 isOk = 3; 21395 } 21396 break; 21397 21398 /* sqlite3_test_control(int, int) */ 21399 case SQLITE_TESTCTRL_ASSERT: 21400 case SQLITE_TESTCTRL_ALWAYS: 21401 if( nArg==3 ){ 21402 int opt = booleanValue(azArg[2]); 21403 rc2 = sqlite3_test_control(testctrl, opt); 21404 isOk = 1; 21405 } 21406 break; 21407 21408 /* sqlite3_test_control(int, int) */ 21409 case SQLITE_TESTCTRL_LOCALTIME_FAULT: 21410 case SQLITE_TESTCTRL_NEVER_CORRUPT: 21411 if( nArg==3 ){ 21412 int opt = booleanValue(azArg[2]); 21413 rc2 = sqlite3_test_control(testctrl, opt); 21414 isOk = 3; 21415 } 21416 break; 21417 21418 /* sqlite3_test_control(sqlite3*) */ 21419 case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS: 21420 rc2 = sqlite3_test_control(testctrl, p->db); 21421 isOk = 3; 21422 break; 21423 21424 case SQLITE_TESTCTRL_IMPOSTER: 21425 if( nArg==5 ){ 21426 rc2 = sqlite3_test_control(testctrl, p->db, 21427 azArg[2], 21428 integerValue(azArg[3]), 21429 integerValue(azArg[4])); 21430 isOk = 3; 21431 } 21432 break; 21433 21434 case SQLITE_TESTCTRL_SEEK_COUNT: { 21435 u64 x = 0; 21436 rc2 = sqlite3_test_control(testctrl, p->db, &x); 21437 utf8_printf(p->out, "%llu\n", x); 21438 isOk = 3; 21439 break; 21440 } 21441 21442 #ifdef YYCOVERAGE 21443 case SQLITE_TESTCTRL_PARSER_COVERAGE: { 21444 if( nArg==2 ){ 21445 sqlite3_test_control(testctrl, p->out); 21446 isOk = 3; 21447 } 21448 break; 21449 } 21450 #endif 21451 #ifdef SQLITE_DEBUG 21452 case SQLITE_TESTCTRL_TUNE: { 21453 if( nArg==4 ){ 21454 int id = (int)integerValue(azArg[2]); 21455 int val = (int)integerValue(azArg[3]); 21456 sqlite3_test_control(testctrl, id, &val); 21457 isOk = 3; 21458 }else if( nArg==3 ){ 21459 int id = (int)integerValue(azArg[2]); 21460 sqlite3_test_control(testctrl, -id, &rc2); 21461 isOk = 1; 21462 }else if( nArg==2 ){ 21463 int id = 1; 21464 while(1){ 21465 int val = 0; 21466 rc2 = sqlite3_test_control(testctrl, -id, &val); 21467 if( rc2!=SQLITE_OK ) break; 21468 if( id>1 ) utf8_printf(p->out, " "); 21469 utf8_printf(p->out, "%d: %d", id, val); 21470 id++; 21471 } 21472 if( id>1 ) utf8_printf(p->out, "\n"); 21473 isOk = 3; 21474 } 21475 break; 21476 } 21477 #endif 21478 case SQLITE_TESTCTRL_SORTER_MMAP: 21479 if( nArg==3 ){ 21480 int opt = (unsigned int)integerValue(azArg[2]); 21481 rc2 = sqlite3_test_control(testctrl, p->db, opt); 21482 isOk = 3; 21483 } 21484 break; 21485 } 21486 } 21487 if( isOk==0 && iCtrl>=0 ){ 21488 utf8_printf(p->out, "Usage: .testctrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage); 21489 rc = 1; 21490 }else if( isOk==1 ){ 21491 raw_printf(p->out, "%d\n", rc2); 21492 }else if( isOk==2 ){ 21493 raw_printf(p->out, "0x%08x\n", rc2); 21494 } 21495 }else 21496 #endif /* !defined(SQLITE_UNTESTABLE) */ 21497 21498 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){ 21499 open_db(p, 0); 21500 sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0); 21501 }else 21502 21503 if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){ 21504 if( nArg==2 ){ 21505 enableTimer = booleanValue(azArg[1]); 21506 if( enableTimer && !HAS_TIMER ){ 21507 raw_printf(stderr, "Error: timer not available on this system.\n"); 21508 enableTimer = 0; 21509 } 21510 }else{ 21511 raw_printf(stderr, "Usage: .timer on|off\n"); 21512 rc = 1; 21513 } 21514 }else 21515 21516 #ifndef SQLITE_OMIT_TRACE 21517 if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){ 21518 int mType = 0; 21519 int jj; 21520 open_db(p, 0); 21521 for(jj=1; jj<nArg; jj++){ 21522 const char *z = azArg[jj]; 21523 if( z[0]=='-' ){ 21524 if( optionMatch(z, "expanded") ){ 21525 p->eTraceType = SHELL_TRACE_EXPANDED; 21526 } 21527 #ifdef SQLITE_ENABLE_NORMALIZE 21528 else if( optionMatch(z, "normalized") ){ 21529 p->eTraceType = SHELL_TRACE_NORMALIZED; 21530 } 21531 #endif 21532 else if( optionMatch(z, "plain") ){ 21533 p->eTraceType = SHELL_TRACE_PLAIN; 21534 } 21535 else if( optionMatch(z, "profile") ){ 21536 mType |= SQLITE_TRACE_PROFILE; 21537 } 21538 else if( optionMatch(z, "row") ){ 21539 mType |= SQLITE_TRACE_ROW; 21540 } 21541 else if( optionMatch(z, "stmt") ){ 21542 mType |= SQLITE_TRACE_STMT; 21543 } 21544 else if( optionMatch(z, "close") ){ 21545 mType |= SQLITE_TRACE_CLOSE; 21546 } 21547 else { 21548 raw_printf(stderr, "Unknown option \"%s\" on \".trace\"\n", z); 21549 rc = 1; 21550 goto meta_command_exit; 21551 } 21552 }else{ 21553 output_file_close(p->traceOut); 21554 p->traceOut = output_file_open(azArg[1], 0); 21555 } 21556 } 21557 if( p->traceOut==0 ){ 21558 sqlite3_trace_v2(p->db, 0, 0, 0); 21559 }else{ 21560 if( mType==0 ) mType = SQLITE_TRACE_STMT; 21561 sqlite3_trace_v2(p->db, mType, sql_trace_callback, p); 21562 } 21563 }else 21564 #endif /* !defined(SQLITE_OMIT_TRACE) */ 21565 21566 #if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_VIRTUALTABLE) 21567 if( c=='u' && strncmp(azArg[0], "unmodule", n)==0 ){ 21568 int ii; 21569 int lenOpt; 21570 char *zOpt; 21571 if( nArg<2 ){ 21572 raw_printf(stderr, "Usage: .unmodule [--allexcept] NAME ...\n"); 21573 rc = 1; 21574 goto meta_command_exit; 21575 } 21576 open_db(p, 0); 21577 zOpt = azArg[1]; 21578 if( zOpt[0]=='-' && zOpt[1]=='-' && zOpt[2]!=0 ) zOpt++; 21579 lenOpt = (int)strlen(zOpt); 21580 if( lenOpt>=3 && strncmp(zOpt, "-allexcept",lenOpt)==0 ){ 21581 assert( azArg[nArg]==0 ); 21582 sqlite3_drop_modules(p->db, nArg>2 ? (const char**)(azArg+2) : 0); 21583 }else{ 21584 for(ii=1; ii<nArg; ii++){ 21585 sqlite3_create_module(p->db, azArg[ii], 0, 0); 21586 } 21587 } 21588 }else 21589 #endif 21590 21591 #if SQLITE_USER_AUTHENTICATION 21592 if( c=='u' && strncmp(azArg[0], "user", n)==0 ){ 21593 if( nArg<2 ){ 21594 raw_printf(stderr, "Usage: .user SUBCOMMAND ...\n"); 21595 rc = 1; 21596 goto meta_command_exit; 21597 } 21598 open_db(p, 0); 21599 if( strcmp(azArg[1],"login")==0 ){ 21600 if( nArg!=4 ){ 21601 raw_printf(stderr, "Usage: .user login USER PASSWORD\n"); 21602 rc = 1; 21603 goto meta_command_exit; 21604 } 21605 rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3], 21606 strlen30(azArg[3])); 21607 if( rc ){ 21608 utf8_printf(stderr, "Authentication failed for user %s\n", azArg[2]); 21609 rc = 1; 21610 } 21611 }else if( strcmp(azArg[1],"add")==0 ){ 21612 if( nArg!=5 ){ 21613 raw_printf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n"); 21614 rc = 1; 21615 goto meta_command_exit; 21616 } 21617 rc = sqlite3_user_add(p->db, azArg[2], azArg[3], strlen30(azArg[3]), 21618 booleanValue(azArg[4])); 21619 if( rc ){ 21620 raw_printf(stderr, "User-Add failed: %d\n", rc); 21621 rc = 1; 21622 } 21623 }else if( strcmp(azArg[1],"edit")==0 ){ 21624 if( nArg!=5 ){ 21625 raw_printf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n"); 21626 rc = 1; 21627 goto meta_command_exit; 21628 } 21629 rc = sqlite3_user_change(p->db, azArg[2], azArg[3], strlen30(azArg[3]), 21630 booleanValue(azArg[4])); 21631 if( rc ){ 21632 raw_printf(stderr, "User-Edit failed: %d\n", rc); 21633 rc = 1; 21634 } 21635 }else if( strcmp(azArg[1],"delete")==0 ){ 21636 if( nArg!=3 ){ 21637 raw_printf(stderr, "Usage: .user delete USER\n"); 21638 rc = 1; 21639 goto meta_command_exit; 21640 } 21641 rc = sqlite3_user_delete(p->db, azArg[2]); 21642 if( rc ){ 21643 raw_printf(stderr, "User-Delete failed: %d\n", rc); 21644 rc = 1; 21645 } 21646 }else{ 21647 raw_printf(stderr, "Usage: .user login|add|edit|delete ...\n"); 21648 rc = 1; 21649 goto meta_command_exit; 21650 } 21651 }else 21652 #endif /* SQLITE_USER_AUTHENTICATION */ 21653 21654 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){ 21655 utf8_printf(p->out, "SQLite %s %s\n" /*extra-version-info*/, 21656 sqlite3_libversion(), sqlite3_sourceid()); 21657 #if SQLITE_HAVE_ZLIB 21658 utf8_printf(p->out, "zlib version %s\n", zlibVersion()); 21659 #endif 21660 #define CTIMEOPT_VAL_(opt) #opt 21661 #define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt) 21662 #if defined(__clang__) && defined(__clang_major__) 21663 utf8_printf(p->out, "clang-" CTIMEOPT_VAL(__clang_major__) "." 21664 CTIMEOPT_VAL(__clang_minor__) "." 21665 CTIMEOPT_VAL(__clang_patchlevel__) "\n"); 21666 #elif defined(_MSC_VER) 21667 utf8_printf(p->out, "msvc-" CTIMEOPT_VAL(_MSC_VER) "\n"); 21668 #elif defined(__GNUC__) && defined(__VERSION__) 21669 utf8_printf(p->out, "gcc-" __VERSION__ "\n"); 21670 #endif 21671 }else 21672 21673 if( c=='v' && strncmp(azArg[0], "vfsinfo", n)==0 ){ 21674 const char *zDbName = nArg==2 ? azArg[1] : "main"; 21675 sqlite3_vfs *pVfs = 0; 21676 if( p->db ){ 21677 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFS_POINTER, &pVfs); 21678 if( pVfs ){ 21679 utf8_printf(p->out, "vfs.zName = \"%s\"\n", pVfs->zName); 21680 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion); 21681 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile); 21682 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname); 21683 } 21684 } 21685 }else 21686 21687 if( c=='v' && strncmp(azArg[0], "vfslist", n)==0 ){ 21688 sqlite3_vfs *pVfs; 21689 sqlite3_vfs *pCurrent = 0; 21690 if( p->db ){ 21691 sqlite3_file_control(p->db, "main", SQLITE_FCNTL_VFS_POINTER, &pCurrent); 21692 } 21693 for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){ 21694 utf8_printf(p->out, "vfs.zName = \"%s\"%s\n", pVfs->zName, 21695 pVfs==pCurrent ? " <--- CURRENT" : ""); 21696 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion); 21697 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile); 21698 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname); 21699 if( pVfs->pNext ){ 21700 raw_printf(p->out, "-----------------------------------\n"); 21701 } 21702 } 21703 }else 21704 21705 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){ 21706 const char *zDbName = nArg==2 ? azArg[1] : "main"; 21707 char *zVfsName = 0; 21708 if( p->db ){ 21709 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName); 21710 if( zVfsName ){ 21711 utf8_printf(p->out, "%s\n", zVfsName); 21712 sqlite3_free(zVfsName); 21713 } 21714 } 21715 }else 21716 21717 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){ 21718 unsigned int x = nArg>=2 ? (unsigned int)integerValue(azArg[1]) : 0xffffffff; 21719 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &x); 21720 }else 21721 21722 if( c=='w' && strncmp(azArg[0], "width", n)==0 ){ 21723 int j; 21724 assert( nArg<=ArraySize(azArg) ); 21725 p->nWidth = nArg-1; 21726 p->colWidth = realloc(p->colWidth, (p->nWidth+1)*sizeof(int)*2); 21727 if( p->colWidth==0 && p->nWidth>0 ) shell_out_of_memory(); 21728 if( p->nWidth ) p->actualWidth = &p->colWidth[p->nWidth]; 21729 for(j=1; j<nArg; j++){ 21730 p->colWidth[j-1] = (int)integerValue(azArg[j]); 21731 } 21732 }else 21733 21734 { 21735 utf8_printf(stderr, "Error: unknown command or invalid arguments: " 21736 " \"%s\". Enter \".help\" for help\n", azArg[0]); 21737 rc = 1; 21738 } 21739 21740 meta_command_exit: 21741 if( p->outCount ){ 21742 p->outCount--; 21743 if( p->outCount==0 ) output_reset(p); 21744 } 21745 p->bSafeMode = p->bSafeModePersist; 21746 return rc; 21747 } 21748 21749 /* Line scan result and intermediate states (supporting scan resumption) 21750 */ 21751 #ifndef CHAR_BIT 21752 # define CHAR_BIT 8 21753 #endif 21754 typedef enum { 21755 QSS_HasDark = 1<<CHAR_BIT, QSS_EndingSemi = 2<<CHAR_BIT, 21756 QSS_CharMask = (1<<CHAR_BIT)-1, QSS_ScanMask = 3<<CHAR_BIT, 21757 QSS_Start = 0 21758 } QuickScanState; 21759 #define QSS_SETV(qss, newst) ((newst) | ((qss) & QSS_ScanMask)) 21760 #define QSS_INPLAIN(qss) (((qss)&QSS_CharMask)==QSS_Start) 21761 #define QSS_PLAINWHITE(qss) (((qss)&~QSS_EndingSemi)==QSS_Start) 21762 #define QSS_PLAINDARK(qss) (((qss)&~QSS_EndingSemi)==QSS_HasDark) 21763 #define QSS_SEMITERM(qss) (((qss)&~QSS_HasDark)==QSS_EndingSemi) 21764 21765 /* 21766 ** Scan line for classification to guide shell's handling. 21767 ** The scan is resumable for subsequent lines when prior 21768 ** return values are passed as the 2nd argument. 21769 */ 21770 static QuickScanState quickscan(char *zLine, QuickScanState qss){ 21771 char cin; 21772 char cWait = (char)qss; /* intentional narrowing loss */ 21773 if( cWait==0 ){ 21774 PlainScan: 21775 assert( cWait==0 ); 21776 while( (cin = *zLine++)!=0 ){ 21777 if( IsSpace(cin) ) 21778 continue; 21779 switch (cin){ 21780 case '-': 21781 if( *zLine!='-' ) 21782 break; 21783 while((cin = *++zLine)!=0 ) 21784 if( cin=='\n') 21785 goto PlainScan; 21786 return qss; 21787 case ';': 21788 qss |= QSS_EndingSemi; 21789 continue; 21790 case '/': 21791 if( *zLine=='*' ){ 21792 ++zLine; 21793 cWait = '*'; 21794 qss = QSS_SETV(qss, cWait); 21795 goto TermScan; 21796 } 21797 break; 21798 case '[': 21799 cin = ']'; 21800 /* fall thru */ 21801 case '`': case '\'': case '"': 21802 cWait = cin; 21803 qss = QSS_HasDark | cWait; 21804 goto TermScan; 21805 default: 21806 break; 21807 } 21808 qss = (qss & ~QSS_EndingSemi) | QSS_HasDark; 21809 } 21810 }else{ 21811 TermScan: 21812 while( (cin = *zLine++)!=0 ){ 21813 if( cin==cWait ){ 21814 switch( cWait ){ 21815 case '*': 21816 if( *zLine != '/' ) 21817 continue; 21818 ++zLine; 21819 cWait = 0; 21820 qss = QSS_SETV(qss, 0); 21821 goto PlainScan; 21822 case '`': case '\'': case '"': 21823 if(*zLine==cWait){ 21824 ++zLine; 21825 continue; 21826 } 21827 /* fall thru */ 21828 case ']': 21829 cWait = 0; 21830 qss = QSS_SETV(qss, 0); 21831 goto PlainScan; 21832 default: assert(0); 21833 } 21834 } 21835 } 21836 } 21837 return qss; 21838 } 21839 21840 /* 21841 ** Return TRUE if the line typed in is an SQL command terminator other 21842 ** than a semi-colon. The SQL Server style "go" command is understood 21843 ** as is the Oracle "/". 21844 */ 21845 static int line_is_command_terminator(char *zLine){ 21846 while( IsSpace(zLine[0]) ){ zLine++; }; 21847 if( zLine[0]=='/' ) 21848 zLine += 1; /* Oracle */ 21849 else if ( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o' ) 21850 zLine += 2; /* SQL Server */ 21851 else 21852 return 0; 21853 return quickscan(zLine,QSS_Start)==QSS_Start; 21854 } 21855 21856 /* 21857 ** We need a default sqlite3_complete() implementation to use in case 21858 ** the shell is compiled with SQLITE_OMIT_COMPLETE. The default assumes 21859 ** any arbitrary text is a complete SQL statement. This is not very 21860 ** user-friendly, but it does seem to work. 21861 */ 21862 #ifdef SQLITE_OMIT_COMPLETE 21863 #define sqlite3_complete(x) 1 21864 #endif 21865 21866 /* 21867 ** Return true if zSql is a complete SQL statement. Return false if it 21868 ** ends in the middle of a string literal or C-style comment. 21869 */ 21870 static int line_is_complete(char *zSql, int nSql){ 21871 int rc; 21872 if( zSql==0 ) return 1; 21873 zSql[nSql] = ';'; 21874 zSql[nSql+1] = 0; 21875 rc = sqlite3_complete(zSql); 21876 zSql[nSql] = 0; 21877 return rc; 21878 } 21879 21880 /* 21881 ** Run a single line of SQL. Return the number of errors. 21882 */ 21883 static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){ 21884 int rc; 21885 char *zErrMsg = 0; 21886 21887 open_db(p, 0); 21888 if( ShellHasFlag(p,SHFLG_Backslash) ) resolve_backslashes(zSql); 21889 if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0; 21890 BEGIN_TIMER; 21891 rc = shell_exec(p, zSql, &zErrMsg); 21892 END_TIMER; 21893 if( rc || zErrMsg ){ 21894 char zPrefix[100]; 21895 if( in!=0 || !stdin_is_interactive ){ 21896 sqlite3_snprintf(sizeof(zPrefix), zPrefix, 21897 "Error: near line %d:", startline); 21898 }else{ 21899 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:"); 21900 } 21901 if( zErrMsg!=0 ){ 21902 utf8_printf(stderr, "%s %s\n", zPrefix, zErrMsg); 21903 sqlite3_free(zErrMsg); 21904 zErrMsg = 0; 21905 }else{ 21906 utf8_printf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db)); 21907 } 21908 return 1; 21909 }else if( ShellHasFlag(p, SHFLG_CountChanges) ){ 21910 char zLineBuf[2000]; 21911 sqlite3_snprintf(sizeof(zLineBuf), zLineBuf, 21912 "changes: %lld total_changes: %lld", 21913 sqlite3_changes64(p->db), sqlite3_total_changes64(p->db)); 21914 raw_printf(p->out, "%s\n", zLineBuf); 21915 } 21916 return 0; 21917 } 21918 21919 21920 /* 21921 ** Read input from *in and process it. If *in==0 then input 21922 ** is interactive - the user is typing it it. Otherwise, input 21923 ** is coming from a file or device. A prompt is issued and history 21924 ** is saved only if input is interactive. An interrupt signal will 21925 ** cause this routine to exit immediately, unless input is interactive. 21926 ** 21927 ** Return the number of errors. 21928 */ 21929 static int process_input(ShellState *p){ 21930 char *zLine = 0; /* A single input line */ 21931 char *zSql = 0; /* Accumulated SQL text */ 21932 int nLine; /* Length of current line */ 21933 int nSql = 0; /* Bytes of zSql[] used */ 21934 int nAlloc = 0; /* Allocated zSql[] space */ 21935 int rc; /* Error code */ 21936 int errCnt = 0; /* Number of errors seen */ 21937 int startline = 0; /* Line number for start of current input */ 21938 QuickScanState qss = QSS_Start; /* Accumulated line status (so far) */ 21939 21940 p->lineno = 0; 21941 while( errCnt==0 || !bail_on_error || (p->in==0 && stdin_is_interactive) ){ 21942 fflush(p->out); 21943 zLine = one_input_line(p->in, zLine, nSql>0); 21944 if( zLine==0 ){ 21945 /* End of input */ 21946 if( p->in==0 && stdin_is_interactive ) printf("\n"); 21947 break; 21948 } 21949 if( seenInterrupt ){ 21950 if( p->in!=0 ) break; 21951 seenInterrupt = 0; 21952 } 21953 p->lineno++; 21954 if( QSS_INPLAIN(qss) 21955 && line_is_command_terminator(zLine) 21956 && line_is_complete(zSql, nSql) ){ 21957 memcpy(zLine,";",2); 21958 } 21959 qss = quickscan(zLine, qss); 21960 if( QSS_PLAINWHITE(qss) && nSql==0 ){ 21961 if( ShellHasFlag(p, SHFLG_Echo) ) 21962 printf("%s\n", zLine); 21963 /* Just swallow single-line whitespace */ 21964 qss = QSS_Start; 21965 continue; 21966 } 21967 if( zLine && (zLine[0]=='.' || zLine[0]=='#') && nSql==0 ){ 21968 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine); 21969 if( zLine[0]=='.' ){ 21970 rc = do_meta_command(zLine, p); 21971 if( rc==2 ){ /* exit requested */ 21972 break; 21973 }else if( rc ){ 21974 errCnt++; 21975 } 21976 } 21977 qss = QSS_Start; 21978 continue; 21979 } 21980 /* No single-line dispositions remain; accumulate line(s). */ 21981 nLine = strlen30(zLine); 21982 if( nSql+nLine+2>=nAlloc ){ 21983 /* Grow buffer by half-again increments when big. */ 21984 nAlloc = nSql+(nSql>>1)+nLine+100; 21985 zSql = realloc(zSql, nAlloc); 21986 if( zSql==0 ) shell_out_of_memory(); 21987 } 21988 if( nSql==0 ){ 21989 int i; 21990 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){} 21991 assert( nAlloc>0 && zSql!=0 ); 21992 memcpy(zSql, zLine+i, nLine+1-i); 21993 startline = p->lineno; 21994 nSql = nLine-i; 21995 }else{ 21996 zSql[nSql++] = '\n'; 21997 memcpy(zSql+nSql, zLine, nLine+1); 21998 nSql += nLine; 21999 } 22000 if( nSql && QSS_SEMITERM(qss) && sqlite3_complete(zSql) ){ 22001 errCnt += runOneSqlLine(p, zSql, p->in, startline); 22002 nSql = 0; 22003 if( p->outCount ){ 22004 output_reset(p); 22005 p->outCount = 0; 22006 }else{ 22007 clearTempFile(p); 22008 } 22009 p->bSafeMode = p->bSafeModePersist; 22010 qss = QSS_Start; 22011 }else if( nSql && QSS_PLAINWHITE(qss) ){ 22012 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zSql); 22013 nSql = 0; 22014 qss = QSS_Start; 22015 } 22016 } 22017 if( nSql && QSS_PLAINDARK(qss) ){ 22018 errCnt += runOneSqlLine(p, zSql, p->in, startline); 22019 } 22020 free(zSql); 22021 free(zLine); 22022 return errCnt>0; 22023 } 22024 22025 /* 22026 ** Return a pathname which is the user's home directory. A 22027 ** 0 return indicates an error of some kind. 22028 */ 22029 static char *find_home_dir(int clearFlag){ 22030 static char *home_dir = NULL; 22031 if( clearFlag ){ 22032 free(home_dir); 22033 home_dir = 0; 22034 return 0; 22035 } 22036 if( home_dir ) return home_dir; 22037 22038 #if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \ 22039 && !defined(__RTP__) && !defined(_WRS_KERNEL) 22040 { 22041 struct passwd *pwent; 22042 uid_t uid = getuid(); 22043 if( (pwent=getpwuid(uid)) != NULL) { 22044 home_dir = pwent->pw_dir; 22045 } 22046 } 22047 #endif 22048 22049 #if defined(_WIN32_WCE) 22050 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv() 22051 */ 22052 home_dir = "/"; 22053 #else 22054 22055 #if defined(_WIN32) || defined(WIN32) 22056 if (!home_dir) { 22057 home_dir = getenv("USERPROFILE"); 22058 } 22059 #endif 22060 22061 if (!home_dir) { 22062 home_dir = getenv("HOME"); 22063 } 22064 22065 #if defined(_WIN32) || defined(WIN32) 22066 if (!home_dir) { 22067 char *zDrive, *zPath; 22068 int n; 22069 zDrive = getenv("HOMEDRIVE"); 22070 zPath = getenv("HOMEPATH"); 22071 if( zDrive && zPath ){ 22072 n = strlen30(zDrive) + strlen30(zPath) + 1; 22073 home_dir = malloc( n ); 22074 if( home_dir==0 ) return 0; 22075 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath); 22076 return home_dir; 22077 } 22078 home_dir = "c:\\"; 22079 } 22080 #endif 22081 22082 #endif /* !_WIN32_WCE */ 22083 22084 if( home_dir ){ 22085 int n = strlen30(home_dir) + 1; 22086 char *z = malloc( n ); 22087 if( z ) memcpy(z, home_dir, n); 22088 home_dir = z; 22089 } 22090 22091 return home_dir; 22092 } 22093 22094 /* 22095 ** Read input from the file given by sqliterc_override. Or if that 22096 ** parameter is NULL, take input from ~/.sqliterc 22097 ** 22098 ** Returns the number of errors. 22099 */ 22100 static void process_sqliterc( 22101 ShellState *p, /* Configuration data */ 22102 const char *sqliterc_override /* Name of config file. NULL to use default */ 22103 ){ 22104 char *home_dir = NULL; 22105 const char *sqliterc = sqliterc_override; 22106 char *zBuf = 0; 22107 FILE *inSaved = p->in; 22108 int savedLineno = p->lineno; 22109 22110 if (sqliterc == NULL) { 22111 home_dir = find_home_dir(0); 22112 if( home_dir==0 ){ 22113 raw_printf(stderr, "-- warning: cannot find home directory;" 22114 " cannot read ~/.sqliterc\n"); 22115 return; 22116 } 22117 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir); 22118 sqliterc = zBuf; 22119 } 22120 p->in = fopen(sqliterc,"rb"); 22121 if( p->in ){ 22122 if( stdin_is_interactive ){ 22123 utf8_printf(stderr,"-- Loading resources from %s\n",sqliterc); 22124 } 22125 if( process_input(p) && bail_on_error ) exit(1); 22126 fclose(p->in); 22127 }else if( sqliterc_override!=0 ){ 22128 utf8_printf(stderr,"cannot open: \"%s\"\n", sqliterc); 22129 if( bail_on_error ) exit(1); 22130 } 22131 p->in = inSaved; 22132 p->lineno = savedLineno; 22133 sqlite3_free(zBuf); 22134 } 22135 22136 /* 22137 ** Show available command line options 22138 */ 22139 static const char zOptions[] = 22140 #if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE) 22141 " -A ARGS... run \".archive ARGS\" and exit\n" 22142 #endif 22143 " -append append the database to the end of the file\n" 22144 " -ascii set output mode to 'ascii'\n" 22145 " -bail stop after hitting an error\n" 22146 " -batch force batch I/O\n" 22147 " -box set output mode to 'box'\n" 22148 " -column set output mode to 'column'\n" 22149 " -cmd COMMAND run \"COMMAND\" before reading stdin\n" 22150 " -csv set output mode to 'csv'\n" 22151 #if !defined(SQLITE_OMIT_DESERIALIZE) 22152 " -deserialize open the database using sqlite3_deserialize()\n" 22153 #endif 22154 " -echo print commands before execution\n" 22155 " -init FILENAME read/process named file\n" 22156 " -[no]header turn headers on or off\n" 22157 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5) 22158 " -heap SIZE Size of heap for memsys3 or memsys5\n" 22159 #endif 22160 " -help show this message\n" 22161 " -html set output mode to HTML\n" 22162 " -interactive force interactive I/O\n" 22163 " -json set output mode to 'json'\n" 22164 " -line set output mode to 'line'\n" 22165 " -list set output mode to 'list'\n" 22166 " -lookaside SIZE N use N entries of SZ bytes for lookaside memory\n" 22167 " -markdown set output mode to 'markdown'\n" 22168 #if !defined(SQLITE_OMIT_DESERIALIZE) 22169 " -maxsize N maximum size for a --deserialize database\n" 22170 #endif 22171 " -memtrace trace all memory allocations and deallocations\n" 22172 " -mmap N default mmap size set to N\n" 22173 #ifdef SQLITE_ENABLE_MULTIPLEX 22174 " -multiplex enable the multiplexor VFS\n" 22175 #endif 22176 " -newline SEP set output row separator. Default: '\\n'\n" 22177 " -nofollow refuse to open symbolic links to database files\n" 22178 " -nonce STRING set the safe-mode escape nonce\n" 22179 " -nullvalue TEXT set text string for NULL values. Default ''\n" 22180 " -pagecache SIZE N use N slots of SZ bytes each for page cache memory\n" 22181 " -quote set output mode to 'quote'\n" 22182 " -readonly open the database read-only\n" 22183 " -safe enable safe-mode\n" 22184 " -separator SEP set output column separator. Default: '|'\n" 22185 #ifdef SQLITE_ENABLE_SORTER_REFERENCES 22186 " -sorterref SIZE sorter references threshold size\n" 22187 #endif 22188 " -stats print memory stats before each finalize\n" 22189 " -table set output mode to 'table'\n" 22190 " -tabs set output mode to 'tabs'\n" 22191 " -version show SQLite version\n" 22192 " -vfs NAME use NAME as the default VFS\n" 22193 #ifdef SQLITE_ENABLE_VFSTRACE 22194 " -vfstrace enable tracing of all VFS calls\n" 22195 #endif 22196 #ifdef SQLITE_HAVE_ZLIB 22197 " -zip open the file as a ZIP Archive\n" 22198 #endif 22199 ; 22200 static void usage(int showDetail){ 22201 utf8_printf(stderr, 22202 "Usage: %s [OPTIONS] FILENAME [SQL]\n" 22203 "FILENAME is the name of an SQLite database. A new database is created\n" 22204 "if the file does not previously exist.\n", Argv0); 22205 if( showDetail ){ 22206 utf8_printf(stderr, "OPTIONS include:\n%s", zOptions); 22207 }else{ 22208 raw_printf(stderr, "Use the -help option for additional information\n"); 22209 } 22210 exit(1); 22211 } 22212 22213 /* 22214 ** Internal check: Verify that the SQLite is uninitialized. Print a 22215 ** error message if it is initialized. 22216 */ 22217 static void verify_uninitialized(void){ 22218 if( sqlite3_config(-1)==SQLITE_MISUSE ){ 22219 utf8_printf(stdout, "WARNING: attempt to configure SQLite after" 22220 " initialization.\n"); 22221 } 22222 } 22223 22224 /* 22225 ** Initialize the state information in data 22226 */ 22227 static void main_init(ShellState *data) { 22228 memset(data, 0, sizeof(*data)); 22229 data->normalMode = data->cMode = data->mode = MODE_List; 22230 data->autoExplain = 1; 22231 data->pAuxDb = &data->aAuxDb[0]; 22232 memcpy(data->colSeparator,SEP_Column, 2); 22233 memcpy(data->rowSeparator,SEP_Row, 2); 22234 data->showHeader = 0; 22235 data->shellFlgs = SHFLG_Lookaside; 22236 verify_uninitialized(); 22237 sqlite3_config(SQLITE_CONFIG_URI, 1); 22238 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data); 22239 sqlite3_config(SQLITE_CONFIG_MULTITHREAD); 22240 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> "); 22241 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> "); 22242 } 22243 22244 /* 22245 ** Output text to the console in a font that attracts extra attention. 22246 */ 22247 #ifdef _WIN32 22248 static void printBold(const char *zText){ 22249 #if !SQLITE_OS_WINRT 22250 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE); 22251 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo; 22252 GetConsoleScreenBufferInfo(out, &defaultScreenInfo); 22253 SetConsoleTextAttribute(out, 22254 FOREGROUND_RED|FOREGROUND_INTENSITY 22255 ); 22256 #endif 22257 printf("%s", zText); 22258 #if !SQLITE_OS_WINRT 22259 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes); 22260 #endif 22261 } 22262 #else 22263 static void printBold(const char *zText){ 22264 printf("\033[1m%s\033[0m", zText); 22265 } 22266 #endif 22267 22268 /* 22269 ** Get the argument to an --option. Throw an error and die if no argument 22270 ** is available. 22271 */ 22272 static char *cmdline_option_value(int argc, char **argv, int i){ 22273 if( i==argc ){ 22274 utf8_printf(stderr, "%s: Error: missing argument to %s\n", 22275 argv[0], argv[argc-1]); 22276 exit(1); 22277 } 22278 return argv[i]; 22279 } 22280 22281 #ifndef SQLITE_SHELL_IS_UTF8 22282 # if (defined(_WIN32) || defined(WIN32)) \ 22283 && (defined(_MSC_VER) || (defined(UNICODE) && defined(__GNUC__))) 22284 # define SQLITE_SHELL_IS_UTF8 (0) 22285 # else 22286 # define SQLITE_SHELL_IS_UTF8 (1) 22287 # endif 22288 #endif 22289 22290 #if SQLITE_SHELL_IS_UTF8 22291 int SQLITE_CDECL main(int argc, char **argv){ 22292 #else 22293 int SQLITE_CDECL wmain(int argc, wchar_t **wargv){ 22294 char **argv; 22295 #endif 22296 char *zErrMsg = 0; 22297 ShellState data; 22298 const char *zInitFile = 0; 22299 int i; 22300 int rc = 0; 22301 int warnInmemoryDb = 0; 22302 int readStdin = 1; 22303 int nCmd = 0; 22304 char **azCmd = 0; 22305 const char *zVfs = 0; /* Value of -vfs command-line option */ 22306 #if !SQLITE_SHELL_IS_UTF8 22307 char **argvToFree = 0; 22308 int argcToFree = 0; 22309 #endif 22310 22311 setBinaryMode(stdin, 0); 22312 setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */ 22313 stdin_is_interactive = isatty(0); 22314 stdout_is_console = isatty(1); 22315 22316 #ifdef SQLITE_DEBUG 22317 registerOomSimulator(); 22318 #endif 22319 22320 #if !defined(_WIN32_WCE) 22321 if( getenv("SQLITE_DEBUG_BREAK") ){ 22322 if( isatty(0) && isatty(2) ){ 22323 fprintf(stderr, 22324 "attach debugger to process %d and press any key to continue.\n", 22325 GETPID()); 22326 fgetc(stdin); 22327 }else{ 22328 #if defined(_WIN32) || defined(WIN32) 22329 #if SQLITE_OS_WINRT 22330 __debugbreak(); 22331 #else 22332 DebugBreak(); 22333 #endif 22334 #elif defined(SIGTRAP) 22335 raise(SIGTRAP); 22336 #endif 22337 } 22338 } 22339 #endif 22340 22341 #if USE_SYSTEM_SQLITE+0!=1 22342 if( strncmp(sqlite3_sourceid(),SQLITE_SOURCE_ID,60)!=0 ){ 22343 utf8_printf(stderr, "SQLite header and source version mismatch\n%s\n%s\n", 22344 sqlite3_sourceid(), SQLITE_SOURCE_ID); 22345 exit(1); 22346 } 22347 #endif 22348 main_init(&data); 22349 22350 /* On Windows, we must translate command-line arguments into UTF-8. 22351 ** The SQLite memory allocator subsystem has to be enabled in order to 22352 ** do this. But we want to run an sqlite3_shutdown() afterwards so that 22353 ** subsequent sqlite3_config() calls will work. So copy all results into 22354 ** memory that does not come from the SQLite memory allocator. 22355 */ 22356 #if !SQLITE_SHELL_IS_UTF8 22357 sqlite3_initialize(); 22358 argvToFree = malloc(sizeof(argv[0])*argc*2); 22359 argcToFree = argc; 22360 argv = argvToFree + argc; 22361 if( argv==0 ) shell_out_of_memory(); 22362 for(i=0; i<argc; i++){ 22363 char *z = sqlite3_win32_unicode_to_utf8(wargv[i]); 22364 int n; 22365 if( z==0 ) shell_out_of_memory(); 22366 n = (int)strlen(z); 22367 argv[i] = malloc( n+1 ); 22368 if( argv[i]==0 ) shell_out_of_memory(); 22369 memcpy(argv[i], z, n+1); 22370 argvToFree[i] = argv[i]; 22371 sqlite3_free(z); 22372 } 22373 sqlite3_shutdown(); 22374 #endif 22375 22376 assert( argc>=1 && argv && argv[0] ); 22377 Argv0 = argv[0]; 22378 22379 /* Make sure we have a valid signal handler early, before anything 22380 ** else is done. 22381 */ 22382 #ifdef SIGINT 22383 signal(SIGINT, interrupt_handler); 22384 #elif (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE) 22385 SetConsoleCtrlHandler(ConsoleCtrlHandler, TRUE); 22386 #endif 22387 22388 #ifdef SQLITE_SHELL_DBNAME_PROC 22389 { 22390 /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name 22391 ** of a C-function that will provide the name of the database file. Use 22392 ** this compile-time option to embed this shell program in larger 22393 ** applications. */ 22394 extern void SQLITE_SHELL_DBNAME_PROC(const char**); 22395 SQLITE_SHELL_DBNAME_PROC(&data.pAuxDb->zDbFilename); 22396 warnInmemoryDb = 0; 22397 } 22398 #endif 22399 22400 /* Do an initial pass through the command-line argument to locate 22401 ** the name of the database file, the name of the initialization file, 22402 ** the size of the alternative malloc heap, 22403 ** and the first command to execute. 22404 */ 22405 verify_uninitialized(); 22406 for(i=1; i<argc; i++){ 22407 char *z; 22408 z = argv[i]; 22409 if( z[0]!='-' ){ 22410 if( data.aAuxDb->zDbFilename==0 ){ 22411 data.aAuxDb->zDbFilename = z; 22412 }else{ 22413 /* Excesss arguments are interpreted as SQL (or dot-commands) and 22414 ** mean that nothing is read from stdin */ 22415 readStdin = 0; 22416 nCmd++; 22417 azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd); 22418 if( azCmd==0 ) shell_out_of_memory(); 22419 azCmd[nCmd-1] = z; 22420 } 22421 } 22422 if( z[1]=='-' ) z++; 22423 if( strcmp(z,"-separator")==0 22424 || strcmp(z,"-nullvalue")==0 22425 || strcmp(z,"-newline")==0 22426 || strcmp(z,"-cmd")==0 22427 ){ 22428 (void)cmdline_option_value(argc, argv, ++i); 22429 }else if( strcmp(z,"-init")==0 ){ 22430 zInitFile = cmdline_option_value(argc, argv, ++i); 22431 }else if( strcmp(z,"-batch")==0 ){ 22432 /* Need to check for batch mode here to so we can avoid printing 22433 ** informational messages (like from process_sqliterc) before 22434 ** we do the actual processing of arguments later in a second pass. 22435 */ 22436 stdin_is_interactive = 0; 22437 }else if( strcmp(z,"-heap")==0 ){ 22438 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5) 22439 const char *zSize; 22440 sqlite3_int64 szHeap; 22441 22442 zSize = cmdline_option_value(argc, argv, ++i); 22443 szHeap = integerValue(zSize); 22444 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000; 22445 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64); 22446 #else 22447 (void)cmdline_option_value(argc, argv, ++i); 22448 #endif 22449 }else if( strcmp(z,"-pagecache")==0 ){ 22450 sqlite3_int64 n, sz; 22451 sz = integerValue(cmdline_option_value(argc,argv,++i)); 22452 if( sz>70000 ) sz = 70000; 22453 if( sz<0 ) sz = 0; 22454 n = integerValue(cmdline_option_value(argc,argv,++i)); 22455 if( sz>0 && n>0 && 0xffffffffffffLL/sz<n ){ 22456 n = 0xffffffffffffLL/sz; 22457 } 22458 sqlite3_config(SQLITE_CONFIG_PAGECACHE, 22459 (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n); 22460 data.shellFlgs |= SHFLG_Pagecache; 22461 }else if( strcmp(z,"-lookaside")==0 ){ 22462 int n, sz; 22463 sz = (int)integerValue(cmdline_option_value(argc,argv,++i)); 22464 if( sz<0 ) sz = 0; 22465 n = (int)integerValue(cmdline_option_value(argc,argv,++i)); 22466 if( n<0 ) n = 0; 22467 sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n); 22468 if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside; 22469 }else if( strcmp(z,"-threadsafe")==0 ){ 22470 int n; 22471 n = (int)integerValue(cmdline_option_value(argc,argv,++i)); 22472 switch( n ){ 22473 case 0: sqlite3_config(SQLITE_CONFIG_SINGLETHREAD); break; 22474 case 2: sqlite3_config(SQLITE_CONFIG_MULTITHREAD); break; 22475 default: sqlite3_config(SQLITE_CONFIG_SERIALIZED); break; 22476 } 22477 #ifdef SQLITE_ENABLE_VFSTRACE 22478 }else if( strcmp(z,"-vfstrace")==0 ){ 22479 extern int vfstrace_register( 22480 const char *zTraceName, 22481 const char *zOldVfsName, 22482 int (*xOut)(const char*,void*), 22483 void *pOutArg, 22484 int makeDefault 22485 ); 22486 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1); 22487 #endif 22488 #ifdef SQLITE_ENABLE_MULTIPLEX 22489 }else if( strcmp(z,"-multiplex")==0 ){ 22490 extern int sqlite3_multiple_initialize(const char*,int); 22491 sqlite3_multiplex_initialize(0, 1); 22492 #endif 22493 }else if( strcmp(z,"-mmap")==0 ){ 22494 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i)); 22495 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz); 22496 #ifdef SQLITE_ENABLE_SORTER_REFERENCES 22497 }else if( strcmp(z,"-sorterref")==0 ){ 22498 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i)); 22499 sqlite3_config(SQLITE_CONFIG_SORTERREF_SIZE, (int)sz); 22500 #endif 22501 }else if( strcmp(z,"-vfs")==0 ){ 22502 zVfs = cmdline_option_value(argc, argv, ++i); 22503 #ifdef SQLITE_HAVE_ZLIB 22504 }else if( strcmp(z,"-zip")==0 ){ 22505 data.openMode = SHELL_OPEN_ZIPFILE; 22506 #endif 22507 }else if( strcmp(z,"-append")==0 ){ 22508 data.openMode = SHELL_OPEN_APPENDVFS; 22509 #ifndef SQLITE_OMIT_DESERIALIZE 22510 }else if( strcmp(z,"-deserialize")==0 ){ 22511 data.openMode = SHELL_OPEN_DESERIALIZE; 22512 }else if( strcmp(z,"-maxsize")==0 && i+1<argc ){ 22513 data.szMax = integerValue(argv[++i]); 22514 #endif 22515 }else if( strcmp(z,"-readonly")==0 ){ 22516 data.openMode = SHELL_OPEN_READONLY; 22517 }else if( strcmp(z,"-nofollow")==0 ){ 22518 data.openFlags = SQLITE_OPEN_NOFOLLOW; 22519 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) 22520 }else if( strncmp(z, "-A",2)==0 ){ 22521 /* All remaining command-line arguments are passed to the ".archive" 22522 ** command, so ignore them */ 22523 break; 22524 #endif 22525 }else if( strcmp(z, "-memtrace")==0 ){ 22526 sqlite3MemTraceActivate(stderr); 22527 }else if( strcmp(z,"-bail")==0 ){ 22528 bail_on_error = 1; 22529 }else if( strcmp(z,"-nonce")==0 ){ 22530 free(data.zNonce); 22531 data.zNonce = strdup(argv[++i]); 22532 }else if( strcmp(z,"-safe")==0 ){ 22533 /* no-op - catch this on the second pass */ 22534 } 22535 } 22536 verify_uninitialized(); 22537 22538 22539 #ifdef SQLITE_SHELL_INIT_PROC 22540 { 22541 /* If the SQLITE_SHELL_INIT_PROC macro is defined, then it is the name 22542 ** of a C-function that will perform initialization actions on SQLite that 22543 ** occur just before or after sqlite3_initialize(). Use this compile-time 22544 ** option to embed this shell program in larger applications. */ 22545 extern void SQLITE_SHELL_INIT_PROC(void); 22546 SQLITE_SHELL_INIT_PROC(); 22547 } 22548 #else 22549 /* All the sqlite3_config() calls have now been made. So it is safe 22550 ** to call sqlite3_initialize() and process any command line -vfs option. */ 22551 sqlite3_initialize(); 22552 #endif 22553 22554 if( zVfs ){ 22555 sqlite3_vfs *pVfs = sqlite3_vfs_find(zVfs); 22556 if( pVfs ){ 22557 sqlite3_vfs_register(pVfs, 1); 22558 }else{ 22559 utf8_printf(stderr, "no such VFS: \"%s\"\n", argv[i]); 22560 exit(1); 22561 } 22562 } 22563 22564 if( data.pAuxDb->zDbFilename==0 ){ 22565 #ifndef SQLITE_OMIT_MEMORYDB 22566 data.pAuxDb->zDbFilename = ":memory:"; 22567 warnInmemoryDb = argc==1; 22568 #else 22569 utf8_printf(stderr,"%s: Error: no database filename specified\n", Argv0); 22570 return 1; 22571 #endif 22572 } 22573 data.out = stdout; 22574 sqlite3_appendvfs_init(0,0,0); 22575 22576 /* Go ahead and open the database file if it already exists. If the 22577 ** file does not exist, delay opening it. This prevents empty database 22578 ** files from being created if a user mistypes the database name argument 22579 ** to the sqlite command-line tool. 22580 */ 22581 if( access(data.pAuxDb->zDbFilename, 0)==0 ){ 22582 open_db(&data, 0); 22583 } 22584 22585 /* Process the initialization file if there is one. If no -init option 22586 ** is given on the command line, look for a file named ~/.sqliterc and 22587 ** try to process it. 22588 */ 22589 process_sqliterc(&data,zInitFile); 22590 22591 /* Make a second pass through the command-line argument and set 22592 ** options. This second pass is delayed until after the initialization 22593 ** file is processed so that the command-line arguments will override 22594 ** settings in the initialization file. 22595 */ 22596 for(i=1; i<argc; i++){ 22597 char *z = argv[i]; 22598 if( z[0]!='-' ) continue; 22599 if( z[1]=='-' ){ z++; } 22600 if( strcmp(z,"-init")==0 ){ 22601 i++; 22602 }else if( strcmp(z,"-html")==0 ){ 22603 data.mode = MODE_Html; 22604 }else if( strcmp(z,"-list")==0 ){ 22605 data.mode = MODE_List; 22606 }else if( strcmp(z,"-quote")==0 ){ 22607 data.mode = MODE_Quote; 22608 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Comma); 22609 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Row); 22610 }else if( strcmp(z,"-line")==0 ){ 22611 data.mode = MODE_Line; 22612 }else if( strcmp(z,"-column")==0 ){ 22613 data.mode = MODE_Column; 22614 }else if( strcmp(z,"-json")==0 ){ 22615 data.mode = MODE_Json; 22616 }else if( strcmp(z,"-markdown")==0 ){ 22617 data.mode = MODE_Markdown; 22618 }else if( strcmp(z,"-table")==0 ){ 22619 data.mode = MODE_Table; 22620 }else if( strcmp(z,"-box")==0 ){ 22621 data.mode = MODE_Box; 22622 }else if( strcmp(z,"-csv")==0 ){ 22623 data.mode = MODE_Csv; 22624 memcpy(data.colSeparator,",",2); 22625 #ifdef SQLITE_HAVE_ZLIB 22626 }else if( strcmp(z,"-zip")==0 ){ 22627 data.openMode = SHELL_OPEN_ZIPFILE; 22628 #endif 22629 }else if( strcmp(z,"-append")==0 ){ 22630 data.openMode = SHELL_OPEN_APPENDVFS; 22631 #ifndef SQLITE_OMIT_DESERIALIZE 22632 }else if( strcmp(z,"-deserialize")==0 ){ 22633 data.openMode = SHELL_OPEN_DESERIALIZE; 22634 }else if( strcmp(z,"-maxsize")==0 && i+1<argc ){ 22635 data.szMax = integerValue(argv[++i]); 22636 #endif 22637 }else if( strcmp(z,"-readonly")==0 ){ 22638 data.openMode = SHELL_OPEN_READONLY; 22639 }else if( strcmp(z,"-nofollow")==0 ){ 22640 data.openFlags |= SQLITE_OPEN_NOFOLLOW; 22641 }else if( strcmp(z,"-ascii")==0 ){ 22642 data.mode = MODE_Ascii; 22643 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Unit); 22644 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Record); 22645 }else if( strcmp(z,"-tabs")==0 ){ 22646 data.mode = MODE_List; 22647 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Tab); 22648 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Row); 22649 }else if( strcmp(z,"-separator")==0 ){ 22650 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, 22651 "%s",cmdline_option_value(argc,argv,++i)); 22652 }else if( strcmp(z,"-newline")==0 ){ 22653 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, 22654 "%s",cmdline_option_value(argc,argv,++i)); 22655 }else if( strcmp(z,"-nullvalue")==0 ){ 22656 sqlite3_snprintf(sizeof(data.nullValue), data.nullValue, 22657 "%s",cmdline_option_value(argc,argv,++i)); 22658 }else if( strcmp(z,"-header")==0 ){ 22659 data.showHeader = 1; 22660 ShellSetFlag(&data, SHFLG_HeaderSet); 22661 }else if( strcmp(z,"-noheader")==0 ){ 22662 data.showHeader = 0; 22663 ShellSetFlag(&data, SHFLG_HeaderSet); 22664 }else if( strcmp(z,"-echo")==0 ){ 22665 ShellSetFlag(&data, SHFLG_Echo); 22666 }else if( strcmp(z,"-eqp")==0 ){ 22667 data.autoEQP = AUTOEQP_on; 22668 }else if( strcmp(z,"-eqpfull")==0 ){ 22669 data.autoEQP = AUTOEQP_full; 22670 }else if( strcmp(z,"-stats")==0 ){ 22671 data.statsOn = 1; 22672 }else if( strcmp(z,"-scanstats")==0 ){ 22673 data.scanstatsOn = 1; 22674 }else if( strcmp(z,"-backslash")==0 ){ 22675 /* Undocumented command-line option: -backslash 22676 ** Causes C-style backslash escapes to be evaluated in SQL statements 22677 ** prior to sending the SQL into SQLite. Useful for injecting 22678 ** crazy bytes in the middle of SQL statements for testing and debugging. 22679 */ 22680 ShellSetFlag(&data, SHFLG_Backslash); 22681 }else if( strcmp(z,"-bail")==0 ){ 22682 /* No-op. The bail_on_error flag should already be set. */ 22683 }else if( strcmp(z,"-version")==0 ){ 22684 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid()); 22685 return 0; 22686 }else if( strcmp(z,"-interactive")==0 ){ 22687 stdin_is_interactive = 1; 22688 }else if( strcmp(z,"-batch")==0 ){ 22689 stdin_is_interactive = 0; 22690 }else if( strcmp(z,"-heap")==0 ){ 22691 i++; 22692 }else if( strcmp(z,"-pagecache")==0 ){ 22693 i+=2; 22694 }else if( strcmp(z,"-lookaside")==0 ){ 22695 i+=2; 22696 }else if( strcmp(z,"-threadsafe")==0 ){ 22697 i+=2; 22698 }else if( strcmp(z,"-nonce")==0 ){ 22699 i += 2; 22700 }else if( strcmp(z,"-mmap")==0 ){ 22701 i++; 22702 }else if( strcmp(z,"-memtrace")==0 ){ 22703 i++; 22704 #ifdef SQLITE_ENABLE_SORTER_REFERENCES 22705 }else if( strcmp(z,"-sorterref")==0 ){ 22706 i++; 22707 #endif 22708 }else if( strcmp(z,"-vfs")==0 ){ 22709 i++; 22710 #ifdef SQLITE_ENABLE_VFSTRACE 22711 }else if( strcmp(z,"-vfstrace")==0 ){ 22712 i++; 22713 #endif 22714 #ifdef SQLITE_ENABLE_MULTIPLEX 22715 }else if( strcmp(z,"-multiplex")==0 ){ 22716 i++; 22717 #endif 22718 }else if( strcmp(z,"-help")==0 ){ 22719 usage(1); 22720 }else if( strcmp(z,"-cmd")==0 ){ 22721 /* Run commands that follow -cmd first and separately from commands 22722 ** that simply appear on the command-line. This seems goofy. It would 22723 ** be better if all commands ran in the order that they appear. But 22724 ** we retain the goofy behavior for historical compatibility. */ 22725 if( i==argc-1 ) break; 22726 z = cmdline_option_value(argc,argv,++i); 22727 if( z[0]=='.' ){ 22728 rc = do_meta_command(z, &data); 22729 if( rc && bail_on_error ) return rc==2 ? 0 : rc; 22730 }else{ 22731 open_db(&data, 0); 22732 rc = shell_exec(&data, z, &zErrMsg); 22733 if( zErrMsg!=0 ){ 22734 utf8_printf(stderr,"Error: %s\n", zErrMsg); 22735 if( bail_on_error ) return rc!=0 ? rc : 1; 22736 }else if( rc!=0 ){ 22737 utf8_printf(stderr,"Error: unable to process SQL \"%s\"\n", z); 22738 if( bail_on_error ) return rc; 22739 } 22740 } 22741 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) 22742 }else if( strncmp(z, "-A", 2)==0 ){ 22743 if( nCmd>0 ){ 22744 utf8_printf(stderr, "Error: cannot mix regular SQL or dot-commands" 22745 " with \"%s\"\n", z); 22746 return 1; 22747 } 22748 open_db(&data, OPEN_DB_ZIPFILE); 22749 if( z[2] ){ 22750 argv[i] = &z[2]; 22751 arDotCommand(&data, 1, argv+(i-1), argc-(i-1)); 22752 }else{ 22753 arDotCommand(&data, 1, argv+i, argc-i); 22754 } 22755 readStdin = 0; 22756 break; 22757 #endif 22758 }else if( strcmp(z,"-safe")==0 ){ 22759 data.bSafeMode = data.bSafeModePersist = 1; 22760 }else{ 22761 utf8_printf(stderr,"%s: Error: unknown option: %s\n", Argv0, z); 22762 raw_printf(stderr,"Use -help for a list of options.\n"); 22763 return 1; 22764 } 22765 data.cMode = data.mode; 22766 } 22767 22768 if( !readStdin ){ 22769 /* Run all arguments that do not begin with '-' as if they were separate 22770 ** command-line inputs, except for the argToSkip argument which contains 22771 ** the database filename. 22772 */ 22773 for(i=0; i<nCmd; i++){ 22774 if( azCmd[i][0]=='.' ){ 22775 rc = do_meta_command(azCmd[i], &data); 22776 if( rc ){ 22777 free(azCmd); 22778 return rc==2 ? 0 : rc; 22779 } 22780 }else{ 22781 open_db(&data, 0); 22782 rc = shell_exec(&data, azCmd[i], &zErrMsg); 22783 if( zErrMsg || rc ){ 22784 if( zErrMsg!=0 ){ 22785 utf8_printf(stderr,"Error: %s\n", zErrMsg); 22786 }else{ 22787 utf8_printf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]); 22788 } 22789 sqlite3_free(zErrMsg); 22790 free(azCmd); 22791 return rc!=0 ? rc : 1; 22792 } 22793 } 22794 } 22795 }else{ 22796 /* Run commands received from standard input 22797 */ 22798 if( stdin_is_interactive ){ 22799 char *zHome; 22800 char *zHistory; 22801 int nHistory; 22802 printf( 22803 "SQLite version %s %.19s\n" /*extra-version-info*/ 22804 "Enter \".help\" for usage hints.\n", 22805 sqlite3_libversion(), sqlite3_sourceid() 22806 ); 22807 if( warnInmemoryDb ){ 22808 printf("Connected to a "); 22809 printBold("transient in-memory database"); 22810 printf(".\nUse \".open FILENAME\" to reopen on a " 22811 "persistent database.\n"); 22812 } 22813 zHistory = getenv("SQLITE_HISTORY"); 22814 if( zHistory ){ 22815 zHistory = strdup(zHistory); 22816 }else if( (zHome = find_home_dir(0))!=0 ){ 22817 nHistory = strlen30(zHome) + 20; 22818 if( (zHistory = malloc(nHistory))!=0 ){ 22819 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome); 22820 } 22821 } 22822 if( zHistory ){ shell_read_history(zHistory); } 22823 #if HAVE_READLINE || HAVE_EDITLINE 22824 rl_attempted_completion_function = readline_completion; 22825 #elif HAVE_LINENOISE 22826 linenoiseSetCompletionCallback(linenoise_completion); 22827 #endif 22828 data.in = 0; 22829 rc = process_input(&data); 22830 if( zHistory ){ 22831 shell_stifle_history(2000); 22832 shell_write_history(zHistory); 22833 free(zHistory); 22834 } 22835 }else{ 22836 data.in = stdin; 22837 rc = process_input(&data); 22838 } 22839 } 22840 free(azCmd); 22841 set_table_name(&data, 0); 22842 if( data.db ){ 22843 session_close_all(&data, -1); 22844 close_db(data.db); 22845 } 22846 for(i=0; i<ArraySize(data.aAuxDb); i++){ 22847 sqlite3_free(data.aAuxDb[i].zFreeOnClose); 22848 if( data.aAuxDb[i].db ){ 22849 session_close_all(&data, i); 22850 close_db(data.aAuxDb[i].db); 22851 } 22852 } 22853 find_home_dir(1); 22854 output_reset(&data); 22855 data.doXdgOpen = 0; 22856 clearTempFile(&data); 22857 #if !SQLITE_SHELL_IS_UTF8 22858 for(i=0; i<argcToFree; i++) free(argvToFree[i]); 22859 free(argvToFree); 22860 #endif 22861 free(data.colWidth); 22862 free(data.zNonce); 22863 /* Clear the global data structure so that valgrind will detect memory 22864 ** leaks */ 22865 memset(&data, 0, sizeof(data)); 22866 return rc; 22867 } 22868