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 typedef unsigned int u32; 38 typedef unsigned short int u16; 39 40 /* 41 ** Optionally #include a user-defined header, whereby compilation options 42 ** may be set prior to where they take effect, but after platform setup. 43 ** If SQLITE_CUSTOM_INCLUDE=? is defined, its value names the #include 44 ** file. Note that this macro has a like effect on sqlite3.c compilation. 45 */ 46 # define SHELL_STRINGIFY_(f) #f 47 # define SHELL_STRINGIFY(f) SHELL_STRINGIFY_(f) 48 #ifdef SQLITE_CUSTOM_INCLUDE 49 # include SHELL_STRINGIFY(SQLITE_CUSTOM_INCLUDE) 50 #endif 51 52 /* 53 ** Determine if we are dealing with WinRT, which provides only a subset of 54 ** the full Win32 API. 55 */ 56 #if !defined(SQLITE_OS_WINRT) 57 # define SQLITE_OS_WINRT 0 58 #endif 59 60 /* 61 ** If SQLITE_SHELL_FIDDLE is defined then the shell is modified 62 ** somewhat for use as a WASM module in a web browser. This flag 63 ** should only be used when building the "fiddle" web application, as 64 ** the browser-mode build has much different user input requirements 65 ** and this build mode rewires the user input subsystem to account for 66 ** that. 67 */ 68 69 /* 70 ** Warning pragmas copied from msvc.h in the core. 71 */ 72 #if defined(_MSC_VER) 73 #pragma warning(disable : 4054) 74 #pragma warning(disable : 4055) 75 #pragma warning(disable : 4100) 76 #pragma warning(disable : 4127) 77 #pragma warning(disable : 4130) 78 #pragma warning(disable : 4152) 79 #pragma warning(disable : 4189) 80 #pragma warning(disable : 4206) 81 #pragma warning(disable : 4210) 82 #pragma warning(disable : 4232) 83 #pragma warning(disable : 4244) 84 #pragma warning(disable : 4305) 85 #pragma warning(disable : 4306) 86 #pragma warning(disable : 4702) 87 #pragma warning(disable : 4706) 88 #endif /* defined(_MSC_VER) */ 89 90 /* 91 ** No support for loadable extensions in VxWorks. 92 */ 93 #if (defined(__RTP__) || defined(_WRS_KERNEL)) && !SQLITE_OMIT_LOAD_EXTENSION 94 # define SQLITE_OMIT_LOAD_EXTENSION 1 95 #endif 96 97 /* 98 ** Enable large-file support for fopen() and friends on unix. 99 */ 100 #ifndef SQLITE_DISABLE_LFS 101 # define _LARGE_FILE 1 102 # ifndef _FILE_OFFSET_BITS 103 # define _FILE_OFFSET_BITS 64 104 # endif 105 # define _LARGEFILE_SOURCE 1 106 #endif 107 108 #if defined(SQLITE_SHELL_FIDDLE) && !defined(_POSIX_SOURCE) 109 /* 110 ** emcc requires _POSIX_SOURCE (or one of several similar defines) 111 ** to expose strdup(). 112 */ 113 # define _POSIX_SOURCE 114 #endif 115 116 #include <stdlib.h> 117 #include <string.h> 118 #include <stdio.h> 119 #include <assert.h> 120 #include <math.h> 121 #include "sqlite3.h" 122 typedef sqlite3_int64 i64; 123 typedef sqlite3_uint64 u64; 124 typedef unsigned char u8; 125 #if SQLITE_USER_AUTHENTICATION 126 # include "sqlite3userauth.h" 127 #endif 128 #include <ctype.h> 129 #include <stdarg.h> 130 131 #if !defined(_WIN32) && !defined(WIN32) 132 # include <signal.h> 133 # if !defined(__RTP__) && !defined(_WRS_KERNEL) && !defined(SQLITE_WASI) 134 # include <pwd.h> 135 # endif 136 #endif 137 #if (!defined(_WIN32) && !defined(WIN32)) || defined(__MINGW32__) 138 # include <unistd.h> 139 # include <dirent.h> 140 # define GETPID getpid 141 # if defined(__MINGW32__) 142 # define DIRENT dirent 143 # ifndef S_ISLNK 144 # define S_ISLNK(mode) (0) 145 # endif 146 # endif 147 #else 148 # define GETPID (int)GetCurrentProcessId 149 #endif 150 #include <sys/types.h> 151 #include <sys/stat.h> 152 153 #if HAVE_READLINE 154 # include <readline/readline.h> 155 # include <readline/history.h> 156 #endif 157 158 #if HAVE_EDITLINE 159 # include <editline/readline.h> 160 #endif 161 162 #if HAVE_EDITLINE || HAVE_READLINE 163 164 # define shell_add_history(X) add_history(X) 165 # define shell_read_history(X) read_history(X) 166 # define shell_write_history(X) write_history(X) 167 # define shell_stifle_history(X) stifle_history(X) 168 # define shell_readline(X) readline(X) 169 170 #elif HAVE_LINENOISE 171 172 # include "linenoise.h" 173 # define shell_add_history(X) linenoiseHistoryAdd(X) 174 # define shell_read_history(X) linenoiseHistoryLoad(X) 175 # define shell_write_history(X) linenoiseHistorySave(X) 176 # define shell_stifle_history(X) linenoiseHistorySetMaxLen(X) 177 # define shell_readline(X) linenoise(X) 178 179 #else 180 181 # define shell_read_history(X) 182 # define shell_write_history(X) 183 # define shell_stifle_history(X) 184 185 # define SHELL_USE_LOCAL_GETLINE 1 186 #endif 187 188 #ifndef deliberate_fall_through 189 /* Quiet some compilers about some of our intentional code. */ 190 # if defined(GCC_VERSION) && GCC_VERSION>=7000000 191 # define deliberate_fall_through __attribute__((fallthrough)); 192 # else 193 # define deliberate_fall_through 194 # endif 195 #endif 196 197 #if defined(_WIN32) || defined(WIN32) 198 # if SQLITE_OS_WINRT 199 # define SQLITE_OMIT_POPEN 1 200 # else 201 # include <io.h> 202 # include <fcntl.h> 203 # define isatty(h) _isatty(h) 204 # ifndef access 205 # define access(f,m) _access((f),(m)) 206 # endif 207 # ifndef unlink 208 # define unlink _unlink 209 # endif 210 # ifndef strdup 211 # define strdup _strdup 212 # endif 213 # undef popen 214 # define popen _popen 215 # undef pclose 216 # define pclose _pclose 217 # endif 218 #else 219 /* Make sure isatty() has a prototype. */ 220 extern int isatty(int); 221 222 # if !defined(__RTP__) && !defined(_WRS_KERNEL) && !defined(SQLITE_WASI) 223 /* popen and pclose are not C89 functions and so are 224 ** sometimes omitted from the <stdio.h> header */ 225 extern FILE *popen(const char*,const char*); 226 extern int pclose(FILE*); 227 # else 228 # define SQLITE_OMIT_POPEN 1 229 # endif 230 #endif 231 232 #if defined(_WIN32_WCE) 233 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty() 234 * thus we always assume that we have a console. That can be 235 * overridden with the -batch command line option. 236 */ 237 #define isatty(x) 1 238 #endif 239 240 /* ctype macros that work with signed characters */ 241 #define IsSpace(X) isspace((unsigned char)X) 242 #define IsDigit(X) isdigit((unsigned char)X) 243 #define ToLower(X) (char)tolower((unsigned char)X) 244 245 #if defined(_WIN32) || defined(WIN32) 246 #if SQLITE_OS_WINRT 247 #include <intrin.h> 248 #endif 249 #undef WIN32_LEAN_AND_MEAN 250 #define WIN32_LEAN_AND_MEAN 251 #include <windows.h> 252 253 /* string conversion routines only needed on Win32 */ 254 extern char *sqlite3_win32_unicode_to_utf8(LPCWSTR); 255 extern LPWSTR sqlite3_win32_utf8_to_unicode(const char *zText); 256 #endif 257 258 /* Use console I/O package as a direct INCLUDE. */ 259 #define SQLITE_INTERNAL_LINKAGE static 260 261 #ifdef SQLITE_SHELL_FIDDLE 262 /* Deselect most features from the console I/O package for Fiddle. */ 263 # define SQLITE_CIO_NO_REDIRECT 264 # define SQLITE_CIO_NO_CLASSIFY 265 # define SQLITE_CIO_NO_TRANSLATE 266 # define SQLITE_CIO_NO_SETMODE 267 #endif 268 /************************* Begin ../ext/consio/console_io.h ******************/ 269 /* 270 ** 2023 November 1 271 ** 272 ** The author disclaims copyright to this source code. In place of 273 ** a legal notice, here is a blessing: 274 ** 275 ** May you do good and not evil. 276 ** May you find forgiveness for yourself and forgive others. 277 ** May you share freely, never taking more than you give. 278 ** 279 ******************************************************************************** 280 ** This file exposes various interfaces used for console and other I/O 281 ** by the SQLite project command-line tools. These interfaces are used 282 ** at either source conglomeration time, compilation time, or run time. 283 ** This source provides for either inclusion into conglomerated, 284 ** "single-source" forms or separate compilation then linking. 285 ** 286 ** Platform dependencies are "hidden" here by various stratagems so 287 ** that, provided certain conditions are met, the programs using this 288 ** source or object code compiled from it need no explicit conditional 289 ** compilation in their source for their console and stream I/O. 290 ** 291 ** The symbols and functionality exposed here are not a public API. 292 ** This code may change in tandem with other project code as needed. 293 ** 294 ** When this .h file and its companion .c are directly incorporated into 295 ** a source conglomeration (such as shell.c), the preprocessor symbol 296 ** CIO_WIN_WC_XLATE is defined as 0 or 1, reflecting whether console I/O 297 ** translation for Windows is effected for the build. 298 */ 299 #define HAVE_CONSOLE_IO_H 1 300 #ifndef SQLITE_INTERNAL_LINKAGE 301 # define SQLITE_INTERNAL_LINKAGE extern /* external to translation unit */ 302 # include <stdio.h> 303 #else 304 # define SHELL_NO_SYSINC /* Better yet, modify mkshellc.tcl for this. */ 305 #endif 306 307 #ifndef SQLITE3_H 308 /* # include "sqlite3.h" */ 309 #endif 310 311 #ifndef SQLITE_CIO_NO_CLASSIFY 312 313 /* Define enum for use with following function. */ 314 typedef enum StreamsAreConsole { 315 SAC_NoConsole = 0, 316 SAC_InConsole = 1, SAC_OutConsole = 2, SAC_ErrConsole = 4, 317 SAC_AnyConsole = 0x7 318 } StreamsAreConsole; 319 320 /* 321 ** Classify the three standard I/O streams according to whether 322 ** they are connected to a console attached to the process. 323 ** 324 ** Returns the bit-wise OR of SAC_{In,Out,Err}Console values, 325 ** or SAC_NoConsole if none of the streams reaches a console. 326 ** 327 ** This function should be called before any I/O is done with 328 ** the given streams. As a side-effect, the given inputs are 329 ** recorded so that later I/O operations on them may be done 330 ** differently than the C library FILE* I/O would be done, 331 ** iff the stream is used for the I/O functions that follow, 332 ** and to support the ones that use an implicit stream. 333 ** 334 ** On some platforms, stream or console mode alteration (aka 335 ** "Setup") may be made which is undone by consoleRestore(). 336 */ 337 SQLITE_INTERNAL_LINKAGE StreamsAreConsole 338 consoleClassifySetup( FILE *pfIn, FILE *pfOut, FILE *pfErr ); 339 /* A usual call for convenience: */ 340 #define SQLITE_STD_CONSOLE_INIT() consoleClassifySetup(stdin,stdout,stderr) 341 342 /* 343 ** After an initial call to consoleClassifySetup(...), renew 344 ** the same setup it effected. (A call not after is an error.) 345 ** This will restore state altered by consoleRestore(); 346 ** 347 ** Applications which run an inferior (child) process which 348 ** inherits the same I/O streams may call this function after 349 ** such a process exits to guard against console mode changes. 350 */ 351 SQLITE_INTERNAL_LINKAGE void consoleRenewSetup(void); 352 353 /* 354 ** Undo any side-effects left by consoleClassifySetup(...). 355 ** 356 ** This should be called after consoleClassifySetup() and 357 ** before the process terminates normally. It is suitable 358 ** for use with the atexit() C library procedure. After 359 ** this call, no console I/O should be done until one of 360 ** console{Classify or Renew}Setup(...) is called again. 361 ** 362 ** Applications which run an inferior (child) process that 363 ** inherits the same I/O streams might call this procedure 364 ** before so that said process will have a console setup 365 ** however users have configured it or come to expect. 366 */ 367 SQLITE_INTERNAL_LINKAGE void SQLITE_CDECL consoleRestore( void ); 368 369 #else /* defined(SQLITE_CIO_NO_CLASSIFY) */ 370 # define consoleClassifySetup(i,o,e) 371 # define consoleRenewSetup() 372 # define consoleRestore() 373 #endif /* defined(SQLITE_CIO_NO_CLASSIFY) */ 374 375 #ifndef SQLITE_CIO_NO_REDIRECT 376 /* 377 ** Set stream to be used for the functions below which write 378 ** to "the designated X stream", where X is Output or Error. 379 ** Returns the previous value. 380 ** 381 ** Alternatively, pass the special value, invalidFileStream, 382 ** to get the designated stream value without setting it. 383 ** 384 ** Before the designated streams are set, they default to 385 ** those passed to consoleClassifySetup(...), and before 386 ** that is called they default to stdout and stderr. 387 ** 388 ** It is error to close a stream so designated, then, without 389 ** designating another, use the corresponding {o,e}Emit(...). 390 */ 391 SQLITE_INTERNAL_LINKAGE FILE *invalidFileStream; 392 SQLITE_INTERNAL_LINKAGE FILE *setOutputStream(FILE *pf); 393 # ifdef CONSIO_SET_ERROR_STREAM 394 SQLITE_INTERNAL_LINKAGE FILE *setErrorStream(FILE *pf); 395 # endif 396 #else 397 # define setOutputStream(pf) 398 # define setErrorStream(pf) 399 #endif /* !defined(SQLITE_CIO_NO_REDIRECT) */ 400 401 #ifndef SQLITE_CIO_NO_TRANSLATE 402 /* 403 ** Emit output like fprintf(). If the output is going to the 404 ** console and translation from UTF-8 is necessary, perform 405 ** the needed translation. Otherwise, write formatted output 406 ** to the provided stream almost as-is, possibly with newline 407 ** translation as specified by set{Binary,Text}Mode(). 408 */ 409 SQLITE_INTERNAL_LINKAGE int fPrintfUtf8(FILE *pfO, const char *zFormat, ...); 410 /* Like fPrintfUtf8 except stream is always the designated output. */ 411 SQLITE_INTERNAL_LINKAGE int oPrintfUtf8(const char *zFormat, ...); 412 /* Like fPrintfUtf8 except stream is always the designated error. */ 413 SQLITE_INTERNAL_LINKAGE int ePrintfUtf8(const char *zFormat, ...); 414 415 /* 416 ** Emit output like fputs(). If the output is going to the 417 ** console and translation from UTF-8 is necessary, perform 418 ** the needed translation. Otherwise, write given text to the 419 ** provided stream almost as-is, possibly with newline 420 ** translation as specified by set{Binary,Text}Mode(). 421 */ 422 SQLITE_INTERNAL_LINKAGE int fPutsUtf8(const char *z, FILE *pfO); 423 /* Like fPutsUtf8 except stream is always the designated output. */ 424 SQLITE_INTERNAL_LINKAGE int oPutsUtf8(const char *z); 425 /* Like fPutsUtf8 except stream is always the designated error. */ 426 SQLITE_INTERNAL_LINKAGE int ePutsUtf8(const char *z); 427 428 /* 429 ** Emit output like fPutsUtf8(), except that the length of the 430 ** accepted char or character sequence is limited by nAccept. 431 ** 432 ** Returns the number of accepted char values. 433 */ 434 #ifdef CONSIO_SPUTB 435 SQLITE_INTERNAL_LINKAGE int 436 fPutbUtf8(FILE *pfOut, const char *cBuf, int nAccept); 437 /* Like fPutbUtf8 except stream is always the designated output. */ 438 #endif 439 SQLITE_INTERNAL_LINKAGE int 440 oPutbUtf8(const char *cBuf, int nAccept); 441 /* Like fPutbUtf8 except stream is always the designated error. */ 442 #ifdef CONSIO_EPUTB 443 SQLITE_INTERNAL_LINKAGE int 444 ePutbUtf8(const char *cBuf, int nAccept); 445 #endif 446 447 /* 448 ** Collect input like fgets(...) with special provisions for input 449 ** from the console on platforms that require same. Defers to the 450 ** C library fgets() when input is not from the console. Newline 451 ** translation may be done as set by set{Binary,Text}Mode(). As a 452 ** convenience, pfIn==NULL is treated as stdin. 453 */ 454 SQLITE_INTERNAL_LINKAGE char* fGetsUtf8(char *cBuf, int ncMax, FILE *pfIn); 455 /* Like fGetsUtf8 except stream is always the designated input. */ 456 /* SQLITE_INTERNAL_LINKAGE char* iGetsUtf8(char *cBuf, int ncMax); */ 457 458 #endif /* !defined(SQLITE_CIO_NO_TRANSLATE) */ 459 460 #ifndef SQLITE_CIO_NO_SETMODE 461 /* 462 ** Set given stream for binary mode, where newline translation is 463 ** not done, or for text mode where, for some platforms, newlines 464 ** are translated to the platform's conventional char sequence. 465 ** If bFlush true, flush the stream. 466 ** 467 ** An additional side-effect is that if the stream is one passed 468 ** to consoleClassifySetup() as an output, it is flushed first. 469 ** 470 ** Note that binary/text mode has no effect on console I/O 471 ** translation. On all platforms, newline to the console starts 472 ** a new line and CR,LF chars from the console become a newline. 473 */ 474 SQLITE_INTERNAL_LINKAGE void setBinaryMode(FILE *, short bFlush); 475 SQLITE_INTERNAL_LINKAGE void setTextMode(FILE *, short bFlush); 476 #endif 477 478 #ifdef SQLITE_CIO_PROMPTED_IN 479 typedef struct Prompts { 480 int numPrompts; 481 const char **azPrompts; 482 } Prompts; 483 484 /* 485 ** Macros for use of a line editor. 486 ** 487 ** The following macros define operations involving use of a 488 ** line-editing library or simple console interaction. 489 ** A "T" argument is a text (char *) buffer or filename. 490 ** A "N" argument is an integer. 491 ** 492 ** SHELL_ADD_HISTORY(T) // Record text as line(s) of history. 493 ** SHELL_READ_HISTORY(T) // Read history from file named by T. 494 ** SHELL_WRITE_HISTORY(T) // Write history to file named by T. 495 ** SHELL_STIFLE_HISTORY(N) // Limit history to N entries. 496 ** 497 ** A console program which does interactive console input is 498 ** expected to call: 499 ** SHELL_READ_HISTORY(T) before collecting such input; 500 ** SHELL_ADD_HISTORY(T) as record-worthy input is taken; 501 ** SHELL_STIFLE_HISTORY(N) after console input ceases; then 502 ** SHELL_WRITE_HISTORY(T) before the program exits. 503 */ 504 505 /* 506 ** Retrieve a single line of input text from an input stream. 507 ** 508 ** If pfIn is the input stream passed to consoleClassifySetup(), 509 ** and azPrompt is not NULL, then a prompt is issued before the 510 ** line is collected, as selected by the isContinuation flag. 511 ** Array azPrompt[{0,1}] holds the {main,continuation} prompt. 512 ** 513 ** If zBufPrior is not NULL then it is a buffer from a prior 514 ** call to this routine that can be reused, or will be freed. 515 ** 516 ** The result is stored in space obtained from malloc() and 517 ** must either be freed by the caller or else passed back to 518 ** this function as zBufPrior for reuse. 519 ** 520 ** This function may call upon services of a line-editing 521 ** library to interactively collect line edited input. 522 */ 523 SQLITE_INTERNAL_LINKAGE char * 524 shellGetLine(FILE *pfIn, char *zBufPrior, int nLen, 525 short isContinuation, Prompts azPrompt); 526 #endif /* defined(SQLITE_CIO_PROMPTED_IN) */ 527 /* 528 ** TBD: Define an interface for application(s) to generate 529 ** completion candidates for use by the line-editor. 530 ** 531 ** This may be premature; the CLI is the only application 532 ** that does this. Yet, getting line-editing melded into 533 ** console I/O is desirable because a line-editing library 534 ** may have to establish console operating mode, possibly 535 ** in a way that interferes with the above functionality. 536 */ 537 538 #if !(defined(SQLITE_CIO_NO_UTF8SCAN)&&defined(SQLITE_CIO_NO_TRANSLATE)) 539 /* Skip over as much z[] input char sequence as is valid UTF-8, 540 ** limited per nAccept char's or whole characters and containing 541 ** no char cn such that ((1<<cn) & ccm)!=0. On return, the 542 ** sequence z:return (inclusive:exclusive) is validated UTF-8. 543 ** Limit: nAccept>=0 => char count, nAccept<0 => character 544 */ 545 SQLITE_INTERNAL_LINKAGE const char* 546 zSkipValidUtf8(const char *z, int nAccept, long ccm); 547 548 #endif 549 550 /************************* End ../ext/consio/console_io.h ********************/ 551 /************************* Begin ../ext/consio/console_io.c ******************/ 552 /* 553 ** 2023 November 4 554 ** 555 ** The author disclaims copyright to this source code. In place of 556 ** a legal notice, here is a blessing: 557 ** 558 ** May you do good and not evil. 559 ** May you find forgiveness for yourself and forgive others. 560 ** May you share freely, never taking more than you give. 561 ** 562 ******************************************************************************** 563 ** This file implements various interfaces used for console and stream I/O 564 ** by the SQLite project command-line tools, as explained in console_io.h . 565 ** Functions prefixed by "SQLITE_INTERNAL_LINKAGE" behave as described there. 566 */ 567 568 #ifndef SQLITE_CDECL 569 # define SQLITE_CDECL 570 #endif 571 572 #ifndef SHELL_NO_SYSINC 573 # include <stdarg.h> 574 # include <string.h> 575 # include <stdlib.h> 576 # include <limits.h> 577 # include <assert.h> 578 /* # include "sqlite3.h" */ 579 #endif 580 #ifndef HAVE_CONSOLE_IO_H 581 # include "console_io.h" 582 #endif 583 #if defined(_MSC_VER) 584 # pragma warning(disable : 4204) 585 #endif 586 587 #ifndef SQLITE_CIO_NO_TRANSLATE 588 # if (defined(_WIN32) || defined(WIN32)) && !SQLITE_OS_WINRT 589 # ifndef SHELL_NO_SYSINC 590 # include <io.h> 591 # include <fcntl.h> 592 # undef WIN32_LEAN_AND_MEAN 593 # define WIN32_LEAN_AND_MEAN 594 # include <windows.h> 595 # endif 596 # define CIO_WIN_WC_XLATE 1 /* Use WCHAR Windows APIs for console I/O */ 597 # else 598 # ifndef SHELL_NO_SYSINC 599 # include <unistd.h> 600 # endif 601 # define CIO_WIN_WC_XLATE 0 /* Use plain C library stream I/O at console */ 602 # endif 603 #else 604 # define CIO_WIN_WC_XLATE 0 /* Not exposing translation routines at all */ 605 #endif 606 607 #if CIO_WIN_WC_XLATE 608 static HANDLE handleOfFile(FILE *pf){ 609 int fileDesc = _fileno(pf); 610 union { intptr_t osfh; HANDLE fh; } fid = { 611 (fileDesc>=0)? _get_osfhandle(fileDesc) : (intptr_t)INVALID_HANDLE_VALUE 612 }; 613 return fid.fh; 614 } 615 #endif 616 617 #ifndef SQLITE_CIO_NO_TRANSLATE 618 typedef struct PerStreamTags { 619 # if CIO_WIN_WC_XLATE 620 HANDLE hx; 621 DWORD consMode; 622 char acIncomplete[4]; 623 # else 624 short reachesConsole; 625 # endif 626 FILE *pf; 627 } PerStreamTags; 628 629 /* Define NULL-like value for things which can validly be 0. */ 630 # define SHELL_INVALID_FILE_PTR ((FILE *)~0) 631 # if CIO_WIN_WC_XLATE 632 # define SHELL_INVALID_CONS_MODE 0xFFFF0000 633 # endif 634 635 # if CIO_WIN_WC_XLATE 636 # define PST_INITIALIZER { INVALID_HANDLE_VALUE, SHELL_INVALID_CONS_MODE, \ 637 {0,0,0,0}, SHELL_INVALID_FILE_PTR } 638 # else 639 # define PST_INITIALIZER { 0, SHELL_INVALID_FILE_PTR } 640 # endif 641 642 /* Quickly say whether a known output is going to the console. */ 643 # if CIO_WIN_WC_XLATE 644 static short pstReachesConsole(PerStreamTags *ppst){ 645 return (ppst->hx != INVALID_HANDLE_VALUE); 646 } 647 # else 648 # define pstReachesConsole(ppst) 0 649 # endif 650 651 # if CIO_WIN_WC_XLATE 652 static void restoreConsoleArb(PerStreamTags *ppst){ 653 if( pstReachesConsole(ppst) ) SetConsoleMode(ppst->hx, ppst->consMode); 654 } 655 # else 656 # define restoreConsoleArb(ppst) 657 # endif 658 659 /* Say whether FILE* appears to be a console, collect associated info. */ 660 static short streamOfConsole(FILE *pf, /* out */ PerStreamTags *ppst){ 661 # if CIO_WIN_WC_XLATE 662 short rv = 0; 663 DWORD dwCM = SHELL_INVALID_CONS_MODE; 664 HANDLE fh = handleOfFile(pf); 665 ppst->pf = pf; 666 if( INVALID_HANDLE_VALUE != fh ){ 667 rv = (GetFileType(fh) == FILE_TYPE_CHAR && GetConsoleMode(fh,&dwCM)); 668 } 669 ppst->hx = (rv)? fh : INVALID_HANDLE_VALUE; 670 ppst->consMode = dwCM; 671 return rv; 672 # else 673 ppst->pf = pf; 674 ppst->reachesConsole = ( (short)isatty(fileno(pf)) ); 675 return ppst->reachesConsole; 676 # endif 677 } 678 679 # ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING 680 # define ENABLE_VIRTUAL_TERMINAL_PROCESSING (0x4) 681 # endif 682 683 # if CIO_WIN_WC_XLATE 684 /* Define console modes for use with the Windows Console API. */ 685 # define SHELL_CONI_MODE \ 686 (ENABLE_ECHO_INPUT | ENABLE_INSERT_MODE | ENABLE_LINE_INPUT | 0x80 \ 687 | ENABLE_QUICK_EDIT_MODE | ENABLE_EXTENDED_FLAGS | ENABLE_PROCESSED_INPUT) 688 # define SHELL_CONO_MODE (ENABLE_PROCESSED_OUTPUT | ENABLE_WRAP_AT_EOL_OUTPUT \ 689 | ENABLE_VIRTUAL_TERMINAL_PROCESSING) 690 # endif 691 692 typedef struct ConsoleInfo { 693 PerStreamTags pstSetup[3]; 694 PerStreamTags pstDesignated[3]; 695 StreamsAreConsole sacSetup; 696 } ConsoleInfo; 697 698 static short isValidStreamInfo(PerStreamTags *ppst){ 699 return (ppst->pf != SHELL_INVALID_FILE_PTR); 700 } 701 702 static ConsoleInfo consoleInfo = { 703 { /* pstSetup */ PST_INITIALIZER, PST_INITIALIZER, PST_INITIALIZER }, 704 { /* pstDesignated[] */ PST_INITIALIZER, PST_INITIALIZER, PST_INITIALIZER }, 705 SAC_NoConsole /* sacSetup */ 706 }; 707 708 SQLITE_INTERNAL_LINKAGE FILE* invalidFileStream = (FILE *)~0; 709 710 # if CIO_WIN_WC_XLATE 711 static void maybeSetupAsConsole(PerStreamTags *ppst, short odir){ 712 if( pstReachesConsole(ppst) ){ 713 DWORD cm = odir? SHELL_CONO_MODE : SHELL_CONI_MODE; 714 SetConsoleMode(ppst->hx, cm); 715 } 716 } 717 # else 718 # define maybeSetupAsConsole(ppst,odir) 719 # endif 720 721 SQLITE_INTERNAL_LINKAGE void consoleRenewSetup(void){ 722 # if CIO_WIN_WC_XLATE 723 int ix = 0; 724 while( ix < 6 ){ 725 PerStreamTags *ppst = (ix<3)? 726 &consoleInfo.pstSetup[ix] : &consoleInfo.pstDesignated[ix-3]; 727 maybeSetupAsConsole(ppst, (ix % 3)>0); 728 ++ix; 729 } 730 # endif 731 } 732 733 SQLITE_INTERNAL_LINKAGE StreamsAreConsole 734 consoleClassifySetup( FILE *pfIn, FILE *pfOut, FILE *pfErr ){ 735 StreamsAreConsole rv = SAC_NoConsole; 736 FILE* apf[3] = { pfIn, pfOut, pfErr }; 737 int ix; 738 for( ix = 2; ix >= 0; --ix ){ 739 PerStreamTags *ppst = &consoleInfo.pstSetup[ix]; 740 if( streamOfConsole(apf[ix], ppst) ){ 741 rv |= (SAC_InConsole<<ix); 742 } 743 consoleInfo.pstDesignated[ix] = *ppst; 744 if( ix > 0 ) fflush(apf[ix]); 745 } 746 consoleInfo.sacSetup = rv; 747 consoleRenewSetup(); 748 return rv; 749 } 750 751 SQLITE_INTERNAL_LINKAGE void SQLITE_CDECL consoleRestore( void ){ 752 # if CIO_WIN_WC_XLATE 753 static ConsoleInfo *pci = &consoleInfo; 754 if( pci->sacSetup ){ 755 int ix; 756 for( ix=0; ix<3; ++ix ){ 757 if( pci->sacSetup & (SAC_InConsole<<ix) ){ 758 PerStreamTags *ppst = &pci->pstSetup[ix]; 759 SetConsoleMode(ppst->hx, ppst->consMode); 760 } 761 } 762 } 763 # endif 764 } 765 #endif /* !defined(SQLITE_CIO_NO_TRANSLATE) */ 766 767 #ifdef SQLITE_CIO_INPUT_REDIR 768 /* Say whether given FILE* is among those known, via either 769 ** consoleClassifySetup() or set{Output,Error}Stream, as 770 ** readable, and return an associated PerStreamTags pointer 771 ** if so. Otherwise, return 0. 772 */ 773 static PerStreamTags * isKnownReadable(FILE *pf){ 774 static PerStreamTags *apst[] = { 775 &consoleInfo.pstDesignated[0], &consoleInfo.pstSetup[0], 0 776 }; 777 int ix = 0; 778 do { 779 if( apst[ix]->pf == pf ) break; 780 } while( apst[++ix] != 0 ); 781 return apst[ix]; 782 } 783 #endif 784 785 #ifndef SQLITE_CIO_NO_TRANSLATE 786 /* Say whether given FILE* is among those known, via either 787 ** consoleClassifySetup() or set{Output,Error}Stream, as 788 ** writable, and return an associated PerStreamTags pointer 789 ** if so. Otherwise, return 0. 790 */ 791 static PerStreamTags * isKnownWritable(FILE *pf){ 792 static PerStreamTags *apst[] = { 793 &consoleInfo.pstDesignated[1], &consoleInfo.pstDesignated[2], 794 &consoleInfo.pstSetup[1], &consoleInfo.pstSetup[2], 0 795 }; 796 int ix = 0; 797 do { 798 if( apst[ix]->pf == pf ) break; 799 } while( apst[++ix] != 0 ); 800 return apst[ix]; 801 } 802 803 static FILE *designateEmitStream(FILE *pf, unsigned chix){ 804 FILE *rv = consoleInfo.pstDesignated[chix].pf; 805 if( pf == invalidFileStream ) return rv; 806 else{ 807 /* Setting a possibly new output stream. */ 808 PerStreamTags *ppst = isKnownWritable(pf); 809 if( ppst != 0 ){ 810 PerStreamTags pst = *ppst; 811 consoleInfo.pstDesignated[chix] = pst; 812 }else streamOfConsole(pf, &consoleInfo.pstDesignated[chix]); 813 } 814 return rv; 815 } 816 817 SQLITE_INTERNAL_LINKAGE FILE *setOutputStream(FILE *pf){ 818 return designateEmitStream(pf, 1); 819 } 820 # ifdef CONSIO_SET_ERROR_STREAM 821 SQLITE_INTERNAL_LINKAGE FILE *setErrorStream(FILE *pf){ 822 return designateEmitStream(pf, 2); 823 } 824 # endif 825 #endif /* !defined(SQLITE_CIO_NO_TRANSLATE) */ 826 827 #ifndef SQLITE_CIO_NO_SETMODE 828 # if CIO_WIN_WC_XLATE 829 static void setModeFlushQ(FILE *pf, short bFlush, int mode){ 830 if( bFlush ) fflush(pf); 831 _setmode(_fileno(pf), mode); 832 } 833 # else 834 # define setModeFlushQ(f, b, m) if(b) fflush(f) 835 # endif 836 837 SQLITE_INTERNAL_LINKAGE void setBinaryMode(FILE *pf, short bFlush){ 838 setModeFlushQ(pf, bFlush, _O_BINARY); 839 } 840 SQLITE_INTERNAL_LINKAGE void setTextMode(FILE *pf, short bFlush){ 841 setModeFlushQ(pf, bFlush, _O_TEXT); 842 } 843 # undef setModeFlushQ 844 845 #else /* defined(SQLITE_CIO_NO_SETMODE) */ 846 # define setBinaryMode(f, bFlush) do{ if((bFlush)) fflush(f); }while(0) 847 # define setTextMode(f, bFlush) do{ if((bFlush)) fflush(f); }while(0) 848 #endif /* defined(SQLITE_CIO_NO_SETMODE) */ 849 850 #ifndef SQLITE_CIO_NO_TRANSLATE 851 # if CIO_WIN_WC_XLATE 852 /* Write buffer cBuf as output to stream known to reach console, 853 ** limited to ncTake char's. Return ncTake on success, else 0. */ 854 static int conZstrEmit(PerStreamTags *ppst, const char *z, int ncTake){ 855 int rv = 0; 856 if( z!=NULL ){ 857 int nwc = MultiByteToWideChar(CP_UTF8,0, z,ncTake, 0,0); 858 if( nwc > 0 ){ 859 WCHAR *zw = sqlite3_malloc64(nwc*sizeof(WCHAR)); 860 if( zw!=NULL ){ 861 nwc = MultiByteToWideChar(CP_UTF8,0, z,ncTake, zw,nwc); 862 if( nwc > 0 ){ 863 /* Translation from UTF-8 to UTF-16, then WCHARs out. */ 864 if( WriteConsoleW(ppst->hx, zw,nwc, 0, NULL) ){ 865 rv = ncTake; 866 } 867 } 868 sqlite3_free(zw); 869 } 870 } 871 } 872 return rv; 873 } 874 875 /* For {f,o,e}PrintfUtf8() when stream is known to reach console. */ 876 static int conioVmPrintf(PerStreamTags *ppst, const char *zFormat, va_list ap){ 877 char *z = sqlite3_vmprintf(zFormat, ap); 878 if( z ){ 879 int rv = conZstrEmit(ppst, z, (int)strlen(z)); 880 sqlite3_free(z); 881 return rv; 882 }else return 0; 883 } 884 # endif /* CIO_WIN_WC_XLATE */ 885 886 # ifdef CONSIO_GET_EMIT_STREAM 887 static PerStreamTags * getDesignatedEmitStream(FILE *pf, unsigned chix, 888 PerStreamTags *ppst){ 889 PerStreamTags *rv = isKnownWritable(pf); 890 short isValid = (rv!=0)? isValidStreamInfo(rv) : 0; 891 if( rv != 0 && isValid ) return rv; 892 streamOfConsole(pf, ppst); 893 return ppst; 894 } 895 # endif 896 897 /* Get stream info, either for designated output or error stream when 898 ** chix equals 1 or 2, or for an arbitrary stream when chix == 0. 899 ** In either case, ppst references a caller-owned PerStreamTags 900 ** struct which may be filled in if none of the known writable 901 ** streams is being held by consoleInfo. The ppf parameter is a 902 ** byref output when chix!=0 and a byref input when chix==0. 903 */ 904 static PerStreamTags * 905 getEmitStreamInfo(unsigned chix, PerStreamTags *ppst, 906 /* in/out */ FILE **ppf){ 907 PerStreamTags *ppstTry; 908 FILE *pfEmit; 909 if( chix > 0 ){ 910 ppstTry = &consoleInfo.pstDesignated[chix]; 911 if( !isValidStreamInfo(ppstTry) ){ 912 ppstTry = &consoleInfo.pstSetup[chix]; 913 pfEmit = ppst->pf; 914 }else pfEmit = ppstTry->pf; 915 if( !isValidStreamInfo(ppstTry) ){ 916 pfEmit = (chix > 1)? stderr : stdout; 917 ppstTry = ppst; 918 streamOfConsole(pfEmit, ppstTry); 919 } 920 *ppf = pfEmit; 921 }else{ 922 ppstTry = isKnownWritable(*ppf); 923 if( ppstTry != 0 ) return ppstTry; 924 streamOfConsole(*ppf, ppst); 925 return ppst; 926 } 927 return ppstTry; 928 } 929 930 SQLITE_INTERNAL_LINKAGE int oPrintfUtf8(const char *zFormat, ...){ 931 va_list ap; 932 int rv; 933 FILE *pfOut; 934 PerStreamTags pst = PST_INITIALIZER; /* for unknown streams */ 935 # if CIO_WIN_WC_XLATE 936 PerStreamTags *ppst = getEmitStreamInfo(1, &pst, &pfOut); 937 # else 938 getEmitStreamInfo(1, &pst, &pfOut); 939 # endif 940 assert(zFormat!=0); 941 va_start(ap, zFormat); 942 # if CIO_WIN_WC_XLATE 943 if( pstReachesConsole(ppst) ){ 944 rv = conioVmPrintf(ppst, zFormat, ap); 945 }else{ 946 # endif 947 rv = vfprintf(pfOut, zFormat, ap); 948 # if CIO_WIN_WC_XLATE 949 } 950 # endif 951 va_end(ap); 952 return rv; 953 } 954 955 SQLITE_INTERNAL_LINKAGE int ePrintfUtf8(const char *zFormat, ...){ 956 va_list ap; 957 int rv; 958 FILE *pfErr; 959 PerStreamTags pst = PST_INITIALIZER; /* for unknown streams */ 960 # if CIO_WIN_WC_XLATE 961 PerStreamTags *ppst = getEmitStreamInfo(2, &pst, &pfErr); 962 # else 963 getEmitStreamInfo(2, &pst, &pfErr); 964 # endif 965 assert(zFormat!=0); 966 va_start(ap, zFormat); 967 # if CIO_WIN_WC_XLATE 968 if( pstReachesConsole(ppst) ){ 969 rv = conioVmPrintf(ppst, zFormat, ap); 970 }else{ 971 # endif 972 rv = vfprintf(pfErr, zFormat, ap); 973 # if CIO_WIN_WC_XLATE 974 } 975 # endif 976 va_end(ap); 977 return rv; 978 } 979 980 SQLITE_INTERNAL_LINKAGE int fPrintfUtf8(FILE *pfO, const char *zFormat, ...){ 981 va_list ap; 982 int rv; 983 PerStreamTags pst = PST_INITIALIZER; /* for unknown streams */ 984 # if CIO_WIN_WC_XLATE 985 PerStreamTags *ppst = getEmitStreamInfo(0, &pst, &pfO); 986 # else 987 getEmitStreamInfo(0, &pst, &pfO); 988 # endif 989 assert(zFormat!=0); 990 va_start(ap, zFormat); 991 # if CIO_WIN_WC_XLATE 992 if( pstReachesConsole(ppst) ){ 993 maybeSetupAsConsole(ppst, 1); 994 rv = conioVmPrintf(ppst, zFormat, ap); 995 if( 0 == isKnownWritable(ppst->pf) ) restoreConsoleArb(ppst); 996 }else{ 997 # endif 998 rv = vfprintf(pfO, zFormat, ap); 999 # if CIO_WIN_WC_XLATE 1000 } 1001 # endif 1002 va_end(ap); 1003 return rv; 1004 } 1005 1006 SQLITE_INTERNAL_LINKAGE int fPutsUtf8(const char *z, FILE *pfO){ 1007 PerStreamTags pst = PST_INITIALIZER; /* for unknown streams */ 1008 # if CIO_WIN_WC_XLATE 1009 PerStreamTags *ppst = getEmitStreamInfo(0, &pst, &pfO); 1010 # else 1011 getEmitStreamInfo(0, &pst, &pfO); 1012 # endif 1013 assert(z!=0); 1014 # if CIO_WIN_WC_XLATE 1015 if( pstReachesConsole(ppst) ){ 1016 int rv; 1017 maybeSetupAsConsole(ppst, 1); 1018 rv = conZstrEmit(ppst, z, (int)strlen(z)); 1019 if( 0 == isKnownWritable(ppst->pf) ) restoreConsoleArb(ppst); 1020 return rv; 1021 }else { 1022 # endif 1023 return (fputs(z, pfO)<0)? 0 : (int)strlen(z); 1024 # if CIO_WIN_WC_XLATE 1025 } 1026 # endif 1027 } 1028 1029 SQLITE_INTERNAL_LINKAGE int ePutsUtf8(const char *z){ 1030 FILE *pfErr; 1031 PerStreamTags pst = PST_INITIALIZER; /* for unknown streams */ 1032 # if CIO_WIN_WC_XLATE 1033 PerStreamTags *ppst = getEmitStreamInfo(2, &pst, &pfErr); 1034 # else 1035 getEmitStreamInfo(2, &pst, &pfErr); 1036 # endif 1037 assert(z!=0); 1038 # if CIO_WIN_WC_XLATE 1039 if( pstReachesConsole(ppst) ) return conZstrEmit(ppst, z, (int)strlen(z)); 1040 else { 1041 # endif 1042 return (fputs(z, pfErr)<0)? 0 : (int)strlen(z); 1043 # if CIO_WIN_WC_XLATE 1044 } 1045 # endif 1046 } 1047 1048 SQLITE_INTERNAL_LINKAGE int oPutsUtf8(const char *z){ 1049 FILE *pfOut; 1050 PerStreamTags pst = PST_INITIALIZER; /* for unknown streams */ 1051 # if CIO_WIN_WC_XLATE 1052 PerStreamTags *ppst = getEmitStreamInfo(1, &pst, &pfOut); 1053 # else 1054 getEmitStreamInfo(1, &pst, &pfOut); 1055 # endif 1056 assert(z!=0); 1057 # if CIO_WIN_WC_XLATE 1058 if( pstReachesConsole(ppst) ) return conZstrEmit(ppst, z, (int)strlen(z)); 1059 else { 1060 # endif 1061 return (fputs(z, pfOut)<0)? 0 : (int)strlen(z); 1062 # if CIO_WIN_WC_XLATE 1063 } 1064 # endif 1065 } 1066 1067 #endif /* !defined(SQLITE_CIO_NO_TRANSLATE) */ 1068 1069 #if !(defined(SQLITE_CIO_NO_UTF8SCAN) && defined(SQLITE_CIO_NO_TRANSLATE)) 1070 /* Skip over as much z[] input char sequence as is valid UTF-8, 1071 ** limited per nAccept char's or whole characters and containing 1072 ** no char cn such that ((1<<cn) & ccm)!=0. On return, the 1073 ** sequence z:return (inclusive:exclusive) is validated UTF-8. 1074 ** Limit: nAccept>=0 => char count, nAccept<0 => character 1075 */ 1076 SQLITE_INTERNAL_LINKAGE const char* 1077 zSkipValidUtf8(const char *z, int nAccept, long ccm){ 1078 int ng = (nAccept<0)? -nAccept : 0; 1079 const char *pcLimit = (nAccept>=0)? z+nAccept : 0; 1080 assert(z!=0); 1081 while( (pcLimit)? (z<pcLimit) : (ng-- != 0) ){ 1082 char c = *z; 1083 if( (c & 0x80) == 0 ){ 1084 if( ccm != 0L && c < 0x20 && ((1L<<c) & ccm) != 0 ) return z; 1085 ++z; /* ASCII */ 1086 }else if( (c & 0xC0) != 0xC0 ) return z; /* not a lead byte */ 1087 else{ 1088 const char *zt = z+1; /* Got lead byte, look at trail bytes.*/ 1089 do{ 1090 if( pcLimit && zt >= pcLimit ) return z; 1091 else{ 1092 char ct = *zt++; 1093 if( ct==0 || (zt-z)>4 || (ct & 0xC0)!=0x80 ){ 1094 /* Trailing bytes are too few, too many, or invalid. */ 1095 return z; 1096 } 1097 } 1098 } while( ((c <<= 1) & 0x40) == 0x40 ); /* Eat lead byte's count. */ 1099 z = zt; 1100 } 1101 } 1102 return z; 1103 } 1104 #endif /*!(defined(SQLITE_CIO_NO_UTF8SCAN)&&defined(SQLITE_CIO_NO_TRANSLATE))*/ 1105 1106 #ifndef SQLITE_CIO_NO_TRANSLATE 1107 # ifdef CONSIO_SPUTB 1108 SQLITE_INTERNAL_LINKAGE int 1109 fPutbUtf8(FILE *pfO, const char *cBuf, int nAccept){ 1110 assert(pfO!=0); 1111 # if CIO_WIN_WC_XLATE 1112 PerStreamTags pst = PST_INITIALIZER; /* for unknown streams */ 1113 PerStreamTags *ppst = getEmitStreamInfo(0, &pst, &pfO); 1114 if( pstReachesConsole(ppst) ){ 1115 int rv; 1116 maybeSetupAsConsole(ppst, 1); 1117 rv = conZstrEmit(ppst, cBuf, nAccept); 1118 if( 0 == isKnownWritable(ppst->pf) ) restoreConsoleArb(ppst); 1119 return rv; 1120 }else { 1121 # endif 1122 return (int)fwrite(cBuf, 1, nAccept, pfO); 1123 # if CIO_WIN_WC_XLATE 1124 } 1125 # endif 1126 } 1127 # endif 1128 1129 SQLITE_INTERNAL_LINKAGE int 1130 oPutbUtf8(const char *cBuf, int nAccept){ 1131 FILE *pfOut; 1132 PerStreamTags pst = PST_INITIALIZER; /* for unknown streams */ 1133 # if CIO_WIN_WC_XLATE 1134 PerStreamTags *ppst = getEmitStreamInfo(1, &pst, &pfOut); 1135 # else 1136 getEmitStreamInfo(1, &pst, &pfOut); 1137 # endif 1138 # if CIO_WIN_WC_XLATE 1139 if( pstReachesConsole(ppst) ){ 1140 return conZstrEmit(ppst, cBuf, nAccept); 1141 }else { 1142 # endif 1143 return (int)fwrite(cBuf, 1, nAccept, pfOut); 1144 # if CIO_WIN_WC_XLATE 1145 } 1146 # endif 1147 } 1148 1149 # ifdef CONSIO_EPUTB 1150 SQLITE_INTERNAL_LINKAGE int 1151 ePutbUtf8(const char *cBuf, int nAccept){ 1152 FILE *pfErr; 1153 PerStreamTags pst = PST_INITIALIZER; /* for unknown streams */ 1154 PerStreamTags *ppst = getEmitStreamInfo(2, &pst, &pfErr); 1155 # if CIO_WIN_WC_XLATE 1156 if( pstReachesConsole(ppst) ){ 1157 return conZstrEmit(ppst, cBuf, nAccept); 1158 }else { 1159 # endif 1160 return (int)fwrite(cBuf, 1, nAccept, pfErr); 1161 # if CIO_WIN_WC_XLATE 1162 } 1163 # endif 1164 } 1165 # endif /* defined(CONSIO_EPUTB) */ 1166 1167 SQLITE_INTERNAL_LINKAGE char* fGetsUtf8(char *cBuf, int ncMax, FILE *pfIn){ 1168 if( pfIn==0 ) pfIn = stdin; 1169 # if CIO_WIN_WC_XLATE 1170 if( pfIn == consoleInfo.pstSetup[0].pf 1171 && (consoleInfo.sacSetup & SAC_InConsole)!=0 ){ 1172 # if CIO_WIN_WC_XLATE==1 1173 # define SHELL_GULP 150 /* Count of WCHARS to be gulped at a time */ 1174 WCHAR wcBuf[SHELL_GULP+1]; 1175 int lend = 0, noc = 0; 1176 if( ncMax > 0 ) cBuf[0] = 0; 1177 while( noc < ncMax-8-1 && !lend ){ 1178 /* There is room for at least 2 more characters and a 0-terminator. */ 1179 int na = (ncMax > SHELL_GULP*4+1 + noc)? SHELL_GULP : (ncMax-1 - noc)/4; 1180 # undef SHELL_GULP 1181 DWORD nbr = 0; 1182 BOOL bRC = ReadConsoleW(consoleInfo.pstSetup[0].hx, wcBuf, na, &nbr, 0); 1183 if( bRC && nbr>0 && (wcBuf[nbr-1]&0xF800)==0xD800 ){ 1184 /* Last WHAR read is first of a UTF-16 surrogate pair. Grab its mate. */ 1185 DWORD nbrx; 1186 bRC &= ReadConsoleW(consoleInfo.pstSetup[0].hx, wcBuf+nbr, 1, &nbrx, 0); 1187 if( bRC ) nbr += nbrx; 1188 } 1189 if( !bRC || (noc==0 && nbr==0) ) return 0; 1190 if( nbr > 0 ){ 1191 int nmb = WideCharToMultiByte(CP_UTF8, 0, wcBuf,nbr,0,0,0,0); 1192 if( nmb != 0 && noc+nmb <= ncMax ){ 1193 int iseg = noc; 1194 nmb = WideCharToMultiByte(CP_UTF8, 0, wcBuf,nbr,cBuf+noc,nmb,0,0); 1195 noc += nmb; 1196 /* Fixup line-ends as coded by Windows for CR (or "Enter".) 1197 ** This is done without regard for any setMode{Text,Binary}() 1198 ** call that might have been done on the interactive input. 1199 */ 1200 if( noc > 0 ){ 1201 if( cBuf[noc-1]=='\n' ){ 1202 lend = 1; 1203 if( noc > 1 && cBuf[noc-2]=='\r' ) cBuf[--noc-1] = '\n'; 1204 } 1205 } 1206 /* Check for ^Z (anywhere in line) too, to act as EOF. */ 1207 while( iseg < noc ){ 1208 if( cBuf[iseg]=='\x1a' ){ 1209 noc = iseg; /* Chop ^Z and anything following. */ 1210 lend = 1; /* Counts as end of line too. */ 1211 break; 1212 } 1213 ++iseg; 1214 } 1215 }else break; /* Drop apparent garbage in. (Could assert.) */ 1216 }else break; 1217 } 1218 /* If got nothing, (after ^Z chop), must be at end-of-file. */ 1219 if( noc > 0 ){ 1220 cBuf[noc] = 0; 1221 return cBuf; 1222 }else return 0; 1223 # endif 1224 }else{ 1225 # endif 1226 return fgets(cBuf, ncMax, pfIn); 1227 # if CIO_WIN_WC_XLATE 1228 } 1229 # endif 1230 } 1231 #endif /* !defined(SQLITE_CIO_NO_TRANSLATE) */ 1232 1233 #if defined(_MSC_VER) 1234 # pragma warning(default : 4204) 1235 #endif 1236 1237 #undef SHELL_INVALID_FILE_PTR 1238 1239 /************************* End ../ext/consio/console_io.c ********************/ 1240 1241 #ifndef SQLITE_SHELL_FIDDLE 1242 1243 /* From here onward, fgets() is redirected to the console_io library. */ 1244 # define fgets(b,n,f) fGetsUtf8(b,n,f) 1245 /* 1246 * Define macros for emitting output text in various ways: 1247 * sputz(s, z) => emit 0-terminated string z to given stream s 1248 * sputf(s, f, ...) => emit varargs per format f to given stream s 1249 * oputz(z) => emit 0-terminated string z to default stream 1250 * oputf(f, ...) => emit varargs per format f to default stream 1251 * eputz(z) => emit 0-terminated string z to error stream 1252 * eputf(f, ...) => emit varargs per format f to error stream 1253 * oputb(b, n) => emit char buffer b[0..n-1] to default stream 1254 * 1255 * Note that the default stream is whatever has been last set via: 1256 * setOutputStream(FILE *pf) 1257 * This is normally the stream that CLI normal output goes to. 1258 * For the stand-alone CLI, it is stdout with no .output redirect. 1259 * 1260 * The ?putz(z) forms are required for the Fiddle builds for string literal 1261 * output, in aid of enforcing format string to argument correspondence. 1262 */ 1263 # define sputz(s,z) fPutsUtf8(z,s) 1264 # define sputf fPrintfUtf8 1265 # define oputz(z) oPutsUtf8(z) 1266 # define oputf oPrintfUtf8 1267 # define eputz(z) ePutsUtf8(z) 1268 # define eputf ePrintfUtf8 1269 # define oputb(buf,na) oPutbUtf8(buf,na) 1270 1271 #else 1272 /* For Fiddle, all console handling and emit redirection is omitted. */ 1273 /* These next 3 macros are for emitting formatted output. When complaints 1274 * from the WASM build are issued for non-formatted output, (when a mere 1275 * string literal is to be emitted, the ?putz(z) forms should be used. 1276 * (This permits compile-time checking of format string / argument mismatch.) 1277 */ 1278 # define oputf(fmt, ...) printf(fmt,__VA_ARGS__) 1279 # define eputf(fmt, ...) fprintf(stderr,fmt,__VA_ARGS__) 1280 # define sputf(fp,fmt, ...) fprintf(fp,fmt,__VA_ARGS__) 1281 /* These next 3 macros are for emitting simple string literals. */ 1282 # define oputz(z) fputs(z,stdout) 1283 # define eputz(z) fputs(z,stderr) 1284 # define sputz(fp,z) fputs(z,fp) 1285 # define oputb(buf,na) fwrite(buf,1,na,stdout) 1286 #endif 1287 1288 /* True if the timer is enabled */ 1289 static int enableTimer = 0; 1290 1291 /* A version of strcmp() that works with NULL values */ 1292 static int cli_strcmp(const char *a, const char *b){ 1293 if( a==0 ) a = ""; 1294 if( b==0 ) b = ""; 1295 return strcmp(a,b); 1296 } 1297 static int cli_strncmp(const char *a, const char *b, size_t n){ 1298 if( a==0 ) a = ""; 1299 if( b==0 ) b = ""; 1300 return strncmp(a,b,n); 1301 } 1302 1303 /* Return the current wall-clock time */ 1304 static sqlite3_int64 timeOfDay(void){ 1305 static sqlite3_vfs *clockVfs = 0; 1306 sqlite3_int64 t; 1307 if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0); 1308 if( clockVfs==0 ) return 0; /* Never actually happens */ 1309 if( clockVfs->iVersion>=2 && clockVfs->xCurrentTimeInt64!=0 ){ 1310 clockVfs->xCurrentTimeInt64(clockVfs, &t); 1311 }else{ 1312 double r; 1313 clockVfs->xCurrentTime(clockVfs, &r); 1314 t = (sqlite3_int64)(r*86400000.0); 1315 } 1316 return t; 1317 } 1318 1319 #if !defined(_WIN32) && !defined(WIN32) && !defined(__minux) 1320 #include <sys/time.h> 1321 #include <sys/resource.h> 1322 1323 /* VxWorks does not support getrusage() as far as we can determine */ 1324 #if defined(_WRS_KERNEL) || defined(__RTP__) 1325 struct rusage { 1326 struct timeval ru_utime; /* user CPU time used */ 1327 struct timeval ru_stime; /* system CPU time used */ 1328 }; 1329 #define getrusage(A,B) memset(B,0,sizeof(*B)) 1330 #endif 1331 1332 /* Saved resource information for the beginning of an operation */ 1333 static struct rusage sBegin; /* CPU time at start */ 1334 static sqlite3_int64 iBegin; /* Wall-clock time at start */ 1335 1336 /* 1337 ** Begin timing an operation 1338 */ 1339 static void beginTimer(void){ 1340 if( enableTimer ){ 1341 getrusage(RUSAGE_SELF, &sBegin); 1342 iBegin = timeOfDay(); 1343 } 1344 } 1345 1346 /* Return the difference of two time_structs in seconds */ 1347 static double timeDiff(struct timeval *pStart, struct timeval *pEnd){ 1348 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 + 1349 (double)(pEnd->tv_sec - pStart->tv_sec); 1350 } 1351 1352 /* 1353 ** Print the timing results. 1354 */ 1355 static void endTimer(void){ 1356 if( enableTimer ){ 1357 sqlite3_int64 iEnd = timeOfDay(); 1358 struct rusage sEnd; 1359 getrusage(RUSAGE_SELF, &sEnd); 1360 sputf(stdout, "Run Time: real %.3f user %f sys %f\n", 1361 (iEnd - iBegin)*0.001, 1362 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime), 1363 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime)); 1364 } 1365 } 1366 1367 #define BEGIN_TIMER beginTimer() 1368 #define END_TIMER endTimer() 1369 #define HAS_TIMER 1 1370 1371 #elif (defined(_WIN32) || defined(WIN32)) 1372 1373 /* Saved resource information for the beginning of an operation */ 1374 static HANDLE hProcess; 1375 static FILETIME ftKernelBegin; 1376 static FILETIME ftUserBegin; 1377 static sqlite3_int64 ftWallBegin; 1378 typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME, 1379 LPFILETIME, LPFILETIME); 1380 static GETPROCTIMES getProcessTimesAddr = NULL; 1381 1382 /* 1383 ** Check to see if we have timer support. Return 1 if necessary 1384 ** support found (or found previously). 1385 */ 1386 static int hasTimer(void){ 1387 if( getProcessTimesAddr ){ 1388 return 1; 1389 } else { 1390 #if !SQLITE_OS_WINRT 1391 /* GetProcessTimes() isn't supported in WIN95 and some other Windows 1392 ** versions. See if the version we are running on has it, and if it 1393 ** does, save off a pointer to it and the current process handle. 1394 */ 1395 hProcess = GetCurrentProcess(); 1396 if( hProcess ){ 1397 HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll")); 1398 if( NULL != hinstLib ){ 1399 getProcessTimesAddr = 1400 (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes"); 1401 if( NULL != getProcessTimesAddr ){ 1402 return 1; 1403 } 1404 FreeLibrary(hinstLib); 1405 } 1406 } 1407 #endif 1408 } 1409 return 0; 1410 } 1411 1412 /* 1413 ** Begin timing an operation 1414 */ 1415 static void beginTimer(void){ 1416 if( enableTimer && getProcessTimesAddr ){ 1417 FILETIME ftCreation, ftExit; 1418 getProcessTimesAddr(hProcess,&ftCreation,&ftExit, 1419 &ftKernelBegin,&ftUserBegin); 1420 ftWallBegin = timeOfDay(); 1421 } 1422 } 1423 1424 /* Return the difference of two FILETIME structs in seconds */ 1425 static double timeDiff(FILETIME *pStart, FILETIME *pEnd){ 1426 sqlite_int64 i64Start = *((sqlite_int64 *) pStart); 1427 sqlite_int64 i64End = *((sqlite_int64 *) pEnd); 1428 return (double) ((i64End - i64Start) / 10000000.0); 1429 } 1430 1431 /* 1432 ** Print the timing results. 1433 */ 1434 static void endTimer(void){ 1435 if( enableTimer && getProcessTimesAddr){ 1436 FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd; 1437 sqlite3_int64 ftWallEnd = timeOfDay(); 1438 getProcessTimesAddr(hProcess,&ftCreation,&ftExit,&ftKernelEnd,&ftUserEnd); 1439 sputf(stdout, "Run Time: real %.3f user %f sys %f\n", 1440 (ftWallEnd - ftWallBegin)*0.001, 1441 timeDiff(&ftUserBegin, &ftUserEnd), 1442 timeDiff(&ftKernelBegin, &ftKernelEnd)); 1443 } 1444 } 1445 1446 #define BEGIN_TIMER beginTimer() 1447 #define END_TIMER endTimer() 1448 #define HAS_TIMER hasTimer() 1449 1450 #else 1451 #define BEGIN_TIMER 1452 #define END_TIMER 1453 #define HAS_TIMER 0 1454 #endif 1455 1456 /* 1457 ** Used to prevent warnings about unused parameters 1458 */ 1459 #define UNUSED_PARAMETER(x) (void)(x) 1460 1461 /* 1462 ** Number of elements in an array 1463 */ 1464 #define ArraySize(X) (int)(sizeof(X)/sizeof(X[0])) 1465 1466 /* 1467 ** If the following flag is set, then command execution stops 1468 ** at an error if we are not interactive. 1469 */ 1470 static int bail_on_error = 0; 1471 1472 /* 1473 ** Treat stdin as an interactive input if the following variable 1474 ** is true. Otherwise, assume stdin is connected to a file or pipe. 1475 */ 1476 static int stdin_is_interactive = 1; 1477 1478 /* 1479 ** On Windows systems we need to know if standard output is a console 1480 ** in order to show that UTF-16 translation is done in the sign-on 1481 ** banner. The following variable is true if it is the console. 1482 */ 1483 static int stdout_is_console = 1; 1484 1485 /* 1486 ** The following is the open SQLite database. We make a pointer 1487 ** to this database a static variable so that it can be accessed 1488 ** by the SIGINT handler to interrupt database processing. 1489 */ 1490 static sqlite3 *globalDb = 0; 1491 1492 /* 1493 ** True if an interrupt (Control-C) has been received. 1494 */ 1495 static volatile int seenInterrupt = 0; 1496 1497 /* 1498 ** This is the name of our program. It is set in main(), used 1499 ** in a number of other places, mostly for error messages. 1500 */ 1501 static char *Argv0; 1502 1503 /* 1504 ** Prompt strings. Initialized in main. Settable with 1505 ** .prompt main continue 1506 */ 1507 #define PROMPT_LEN_MAX 20 1508 /* First line prompt. default: "sqlite> " */ 1509 static char mainPrompt[PROMPT_LEN_MAX]; 1510 /* Continuation prompt. default: " ...> " */ 1511 static char continuePrompt[PROMPT_LEN_MAX]; 1512 1513 /* This is variant of the standard-library strncpy() routine with the 1514 ** one change that the destination string is always zero-terminated, even 1515 ** if there is no zero-terminator in the first n-1 characters of the source 1516 ** string. 1517 */ 1518 static char *shell_strncpy(char *dest, const char *src, size_t n){ 1519 size_t i; 1520 for(i=0; i<n-1 && src[i]!=0; i++) dest[i] = src[i]; 1521 dest[i] = 0; 1522 return dest; 1523 } 1524 1525 /* 1526 ** Optionally disable dynamic continuation prompt. 1527 ** Unless disabled, the continuation prompt shows open SQL lexemes if any, 1528 ** or open parentheses level if non-zero, or continuation prompt as set. 1529 ** This facility interacts with the scanner and process_input() where the 1530 ** below 5 macros are used. 1531 */ 1532 #ifdef SQLITE_OMIT_DYNAPROMPT 1533 # define CONTINUATION_PROMPT continuePrompt 1534 # define CONTINUE_PROMPT_RESET 1535 # define CONTINUE_PROMPT_AWAITS(p,s) 1536 # define CONTINUE_PROMPT_AWAITC(p,c) 1537 # define CONTINUE_PAREN_INCR(p,n) 1538 # define CONTINUE_PROMPT_PSTATE 0 1539 typedef void *t_NoDynaPrompt; 1540 # define SCAN_TRACKER_REFTYPE t_NoDynaPrompt 1541 #else 1542 # define CONTINUATION_PROMPT dynamicContinuePrompt() 1543 # define CONTINUE_PROMPT_RESET \ 1544 do {setLexemeOpen(&dynPrompt,0,0); trackParenLevel(&dynPrompt,0);} while(0) 1545 # define CONTINUE_PROMPT_AWAITS(p,s) \ 1546 if(p && stdin_is_interactive) setLexemeOpen(p, s, 0) 1547 # define CONTINUE_PROMPT_AWAITC(p,c) \ 1548 if(p && stdin_is_interactive) setLexemeOpen(p, 0, c) 1549 # define CONTINUE_PAREN_INCR(p,n) \ 1550 if(p && stdin_is_interactive) (trackParenLevel(p,n)) 1551 # define CONTINUE_PROMPT_PSTATE (&dynPrompt) 1552 typedef struct DynaPrompt *t_DynaPromptRef; 1553 # define SCAN_TRACKER_REFTYPE t_DynaPromptRef 1554 1555 static struct DynaPrompt { 1556 char dynamicPrompt[PROMPT_LEN_MAX]; 1557 char acAwait[2]; 1558 int inParenLevel; 1559 char *zScannerAwaits; 1560 } dynPrompt = { {0}, {0}, 0, 0 }; 1561 1562 /* Record parenthesis nesting level change, or force level to 0. */ 1563 static void trackParenLevel(struct DynaPrompt *p, int ni){ 1564 p->inParenLevel += ni; 1565 if( ni==0 ) p->inParenLevel = 0; 1566 p->zScannerAwaits = 0; 1567 } 1568 1569 /* Record that a lexeme is opened, or closed with args==0. */ 1570 static void setLexemeOpen(struct DynaPrompt *p, char *s, char c){ 1571 if( s!=0 || c==0 ){ 1572 p->zScannerAwaits = s; 1573 p->acAwait[0] = 0; 1574 }else{ 1575 p->acAwait[0] = c; 1576 p->zScannerAwaits = p->acAwait; 1577 } 1578 } 1579 1580 /* Upon demand, derive the continuation prompt to display. */ 1581 static char *dynamicContinuePrompt(void){ 1582 if( continuePrompt[0]==0 1583 || (dynPrompt.zScannerAwaits==0 && dynPrompt.inParenLevel == 0) ){ 1584 return continuePrompt; 1585 }else{ 1586 if( dynPrompt.zScannerAwaits ){ 1587 size_t ncp = strlen(continuePrompt); 1588 size_t ndp = strlen(dynPrompt.zScannerAwaits); 1589 if( ndp > ncp-3 ) return continuePrompt; 1590 strcpy(dynPrompt.dynamicPrompt, dynPrompt.zScannerAwaits); 1591 while( ndp<3 ) dynPrompt.dynamicPrompt[ndp++] = ' '; 1592 shell_strncpy(dynPrompt.dynamicPrompt+3, continuePrompt+3, 1593 PROMPT_LEN_MAX-4); 1594 }else{ 1595 if( dynPrompt.inParenLevel>9 ){ 1596 shell_strncpy(dynPrompt.dynamicPrompt, "(..", 4); 1597 }else if( dynPrompt.inParenLevel<0 ){ 1598 shell_strncpy(dynPrompt.dynamicPrompt, ")x!", 4); 1599 }else{ 1600 shell_strncpy(dynPrompt.dynamicPrompt, "(x.", 4); 1601 dynPrompt.dynamicPrompt[2] = (char)('0'+dynPrompt.inParenLevel); 1602 } 1603 shell_strncpy(dynPrompt.dynamicPrompt+3, continuePrompt+3, 1604 PROMPT_LEN_MAX-4); 1605 } 1606 } 1607 return dynPrompt.dynamicPrompt; 1608 } 1609 #endif /* !defined(SQLITE_OMIT_DYNAPROMPT) */ 1610 1611 /* Indicate out-of-memory and exit. */ 1612 static void shell_out_of_memory(void){ 1613 eputz("Error: out of memory\n"); 1614 exit(1); 1615 } 1616 1617 /* Check a pointer to see if it is NULL. If it is NULL, exit with an 1618 ** out-of-memory error. 1619 */ 1620 static void shell_check_oom(const void *p){ 1621 if( p==0 ) shell_out_of_memory(); 1622 } 1623 1624 /* 1625 ** Write I/O traces to the following stream. 1626 */ 1627 #ifdef SQLITE_ENABLE_IOTRACE 1628 static FILE *iotrace = 0; 1629 #endif 1630 1631 /* 1632 ** This routine works like printf in that its first argument is a 1633 ** format string and subsequent arguments are values to be substituted 1634 ** in place of % fields. The result of formatting this string 1635 ** is written to iotrace. 1636 */ 1637 #ifdef SQLITE_ENABLE_IOTRACE 1638 static void SQLITE_CDECL iotracePrintf(const char *zFormat, ...){ 1639 va_list ap; 1640 char *z; 1641 if( iotrace==0 ) return; 1642 va_start(ap, zFormat); 1643 z = sqlite3_vmprintf(zFormat, ap); 1644 va_end(ap); 1645 sputf(iotrace, "%s", z); 1646 sqlite3_free(z); 1647 } 1648 #endif 1649 1650 /* 1651 ** Output string zUtf to Out stream as w characters. If w is negative, 1652 ** then right-justify the text. W is the width in UTF-8 characters, not 1653 ** in bytes. This is different from the %*.*s specification in printf 1654 ** since with %*.*s the width is measured in bytes, not characters. 1655 */ 1656 static void utf8_width_print(int w, const char *zUtf){ 1657 int i; 1658 int n; 1659 int aw = w<0 ? -w : w; 1660 if( zUtf==0 ) zUtf = ""; 1661 for(i=n=0; zUtf[i]; i++){ 1662 if( (zUtf[i]&0xc0)!=0x80 ){ 1663 n++; 1664 if( n==aw ){ 1665 do{ i++; }while( (zUtf[i]&0xc0)==0x80 ); 1666 break; 1667 } 1668 } 1669 } 1670 if( n>=aw ){ 1671 oputf("%.*s", i, zUtf); 1672 }else if( w<0 ){ 1673 oputf("%*s%s", aw-n, "", zUtf); 1674 }else{ 1675 oputf("%s%*s", zUtf, aw-n, ""); 1676 } 1677 } 1678 1679 1680 /* 1681 ** Determines if a string is a number of not. 1682 */ 1683 static int isNumber(const char *z, int *realnum){ 1684 if( *z=='-' || *z=='+' ) z++; 1685 if( !IsDigit(*z) ){ 1686 return 0; 1687 } 1688 z++; 1689 if( realnum ) *realnum = 0; 1690 while( IsDigit(*z) ){ z++; } 1691 if( *z=='.' ){ 1692 z++; 1693 if( !IsDigit(*z) ) return 0; 1694 while( IsDigit(*z) ){ z++; } 1695 if( realnum ) *realnum = 1; 1696 } 1697 if( *z=='e' || *z=='E' ){ 1698 z++; 1699 if( *z=='+' || *z=='-' ) z++; 1700 if( !IsDigit(*z) ) return 0; 1701 while( IsDigit(*z) ){ z++; } 1702 if( realnum ) *realnum = 1; 1703 } 1704 return *z==0; 1705 } 1706 1707 /* 1708 ** Compute a string length that is limited to what can be stored in 1709 ** lower 30 bits of a 32-bit signed integer. 1710 */ 1711 static int strlen30(const char *z){ 1712 const char *z2 = z; 1713 while( *z2 ){ z2++; } 1714 return 0x3fffffff & (int)(z2 - z); 1715 } 1716 1717 /* 1718 ** Return the length of a string in characters. Multibyte UTF8 characters 1719 ** count as a single character. 1720 */ 1721 static int strlenChar(const char *z){ 1722 int n = 0; 1723 while( *z ){ 1724 if( (0xc0&*(z++))!=0x80 ) n++; 1725 } 1726 return n; 1727 } 1728 1729 /* 1730 ** Return open FILE * if zFile exists, can be opened for read 1731 ** and is an ordinary file or a character stream source. 1732 ** Otherwise return 0. 1733 */ 1734 static FILE * openChrSource(const char *zFile){ 1735 #if defined(_WIN32) || defined(WIN32) 1736 struct __stat64 x = {0}; 1737 # define STAT_CHR_SRC(mode) ((mode & (_S_IFCHR|_S_IFIFO|_S_IFREG))!=0) 1738 /* On Windows, open first, then check the stream nature. This order 1739 ** is necessary because _stat() and sibs, when checking a named pipe, 1740 ** effectively break the pipe as its supplier sees it. */ 1741 FILE *rv = fopen(zFile, "rb"); 1742 if( rv==0 ) return 0; 1743 if( _fstat64(_fileno(rv), &x) != 0 1744 || !STAT_CHR_SRC(x.st_mode)){ 1745 fclose(rv); 1746 rv = 0; 1747 } 1748 return rv; 1749 #else 1750 struct stat x = {0}; 1751 int rc = stat(zFile, &x); 1752 # define STAT_CHR_SRC(mode) (S_ISREG(mode)||S_ISFIFO(mode)||S_ISCHR(mode)) 1753 if( rc!=0 ) return 0; 1754 if( STAT_CHR_SRC(x.st_mode) ){ 1755 return fopen(zFile, "rb"); 1756 }else{ 1757 return 0; 1758 } 1759 #endif 1760 #undef STAT_CHR_SRC 1761 } 1762 1763 /* 1764 ** This routine reads a line of text from FILE in, stores 1765 ** the text in memory obtained from malloc() and returns a pointer 1766 ** to the text. NULL is returned at end of file, or if malloc() 1767 ** fails. 1768 ** 1769 ** If zLine is not NULL then it is a malloced buffer returned from 1770 ** a previous call to this routine that may be reused. 1771 */ 1772 static char *local_getline(char *zLine, FILE *in){ 1773 int nLine = zLine==0 ? 0 : 100; 1774 int n = 0; 1775 1776 while( 1 ){ 1777 if( n+100>nLine ){ 1778 nLine = nLine*2 + 100; 1779 zLine = realloc(zLine, nLine); 1780 shell_check_oom(zLine); 1781 } 1782 if( fgets(&zLine[n], nLine - n, in)==0 ){ 1783 if( n==0 ){ 1784 free(zLine); 1785 return 0; 1786 } 1787 zLine[n] = 0; 1788 break; 1789 } 1790 while( zLine[n] ) n++; 1791 if( n>0 && zLine[n-1]=='\n' ){ 1792 n--; 1793 if( n>0 && zLine[n-1]=='\r' ) n--; 1794 zLine[n] = 0; 1795 break; 1796 } 1797 } 1798 return zLine; 1799 } 1800 1801 /* 1802 ** Retrieve a single line of input text. 1803 ** 1804 ** If in==0 then read from standard input and prompt before each line. 1805 ** If isContinuation is true, then a continuation prompt is appropriate. 1806 ** If isContinuation is zero, then the main prompt should be used. 1807 ** 1808 ** If zPrior is not NULL then it is a buffer from a prior call to this 1809 ** routine that can be reused. 1810 ** 1811 ** The result is stored in space obtained from malloc() and must either 1812 ** be freed by the caller or else passed back into this routine via the 1813 ** zPrior argument for reuse. 1814 */ 1815 #ifndef SQLITE_SHELL_FIDDLE 1816 static char *one_input_line(FILE *in, char *zPrior, int isContinuation){ 1817 char *zPrompt; 1818 char *zResult; 1819 if( in!=0 ){ 1820 zResult = local_getline(zPrior, in); 1821 }else{ 1822 zPrompt = isContinuation ? CONTINUATION_PROMPT : mainPrompt; 1823 #if SHELL_USE_LOCAL_GETLINE 1824 sputz(stdout, zPrompt); 1825 fflush(stdout); 1826 do{ 1827 zResult = local_getline(zPrior, stdin); 1828 zPrior = 0; 1829 /* ^C trap creates a false EOF, so let "interrupt" thread catch up. */ 1830 if( zResult==0 ) sqlite3_sleep(50); 1831 }while( zResult==0 && seenInterrupt>0 ); 1832 #else 1833 free(zPrior); 1834 zResult = shell_readline(zPrompt); 1835 while( zResult==0 ){ 1836 /* ^C trap creates a false EOF, so let "interrupt" thread catch up. */ 1837 sqlite3_sleep(50); 1838 if( seenInterrupt==0 ) break; 1839 zResult = shell_readline(""); 1840 } 1841 if( zResult && *zResult ) shell_add_history(zResult); 1842 #endif 1843 } 1844 return zResult; 1845 } 1846 #endif /* !SQLITE_SHELL_FIDDLE */ 1847 1848 /* 1849 ** Return the value of a hexadecimal digit. Return -1 if the input 1850 ** is not a hex digit. 1851 */ 1852 static int hexDigitValue(char c){ 1853 if( c>='0' && c<='9' ) return c - '0'; 1854 if( c>='a' && c<='f' ) return c - 'a' + 10; 1855 if( c>='A' && c<='F' ) return c - 'A' + 10; 1856 return -1; 1857 } 1858 1859 /* 1860 ** Interpret zArg as an integer value, possibly with suffixes. 1861 */ 1862 static sqlite3_int64 integerValue(const char *zArg){ 1863 sqlite3_int64 v = 0; 1864 static const struct { char *zSuffix; int iMult; } aMult[] = { 1865 { "KiB", 1024 }, 1866 { "MiB", 1024*1024 }, 1867 { "GiB", 1024*1024*1024 }, 1868 { "KB", 1000 }, 1869 { "MB", 1000000 }, 1870 { "GB", 1000000000 }, 1871 { "K", 1000 }, 1872 { "M", 1000000 }, 1873 { "G", 1000000000 }, 1874 }; 1875 int i; 1876 int isNeg = 0; 1877 if( zArg[0]=='-' ){ 1878 isNeg = 1; 1879 zArg++; 1880 }else if( zArg[0]=='+' ){ 1881 zArg++; 1882 } 1883 if( zArg[0]=='0' && zArg[1]=='x' ){ 1884 int x; 1885 zArg += 2; 1886 while( (x = hexDigitValue(zArg[0]))>=0 ){ 1887 v = (v<<4) + x; 1888 zArg++; 1889 } 1890 }else{ 1891 while( IsDigit(zArg[0]) ){ 1892 v = v*10 + zArg[0] - '0'; 1893 zArg++; 1894 } 1895 } 1896 for(i=0; i<ArraySize(aMult); i++){ 1897 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){ 1898 v *= aMult[i].iMult; 1899 break; 1900 } 1901 } 1902 return isNeg? -v : v; 1903 } 1904 1905 /* 1906 ** A variable length string to which one can append text. 1907 */ 1908 typedef struct ShellText ShellText; 1909 struct ShellText { 1910 char *z; 1911 int n; 1912 int nAlloc; 1913 }; 1914 1915 /* 1916 ** Initialize and destroy a ShellText object 1917 */ 1918 static void initText(ShellText *p){ 1919 memset(p, 0, sizeof(*p)); 1920 } 1921 static void freeText(ShellText *p){ 1922 free(p->z); 1923 initText(p); 1924 } 1925 1926 /* zIn is either a pointer to a NULL-terminated string in memory obtained 1927 ** from malloc(), or a NULL pointer. The string pointed to by zAppend is 1928 ** added to zIn, and the result returned in memory obtained from malloc(). 1929 ** zIn, if it was not NULL, is freed. 1930 ** 1931 ** If the third argument, quote, is not '\0', then it is used as a 1932 ** quote character for zAppend. 1933 */ 1934 static void appendText(ShellText *p, const char *zAppend, char quote){ 1935 i64 len; 1936 i64 i; 1937 i64 nAppend = strlen30(zAppend); 1938 1939 len = nAppend+p->n+1; 1940 if( quote ){ 1941 len += 2; 1942 for(i=0; i<nAppend; i++){ 1943 if( zAppend[i]==quote ) len++; 1944 } 1945 } 1946 1947 if( p->z==0 || p->n+len>=p->nAlloc ){ 1948 p->nAlloc = p->nAlloc*2 + len + 20; 1949 p->z = realloc(p->z, p->nAlloc); 1950 shell_check_oom(p->z); 1951 } 1952 1953 if( quote ){ 1954 char *zCsr = p->z+p->n; 1955 *zCsr++ = quote; 1956 for(i=0; i<nAppend; i++){ 1957 *zCsr++ = zAppend[i]; 1958 if( zAppend[i]==quote ) *zCsr++ = quote; 1959 } 1960 *zCsr++ = quote; 1961 p->n = (int)(zCsr - p->z); 1962 *zCsr = '\0'; 1963 }else{ 1964 memcpy(p->z+p->n, zAppend, nAppend); 1965 p->n += nAppend; 1966 p->z[p->n] = '\0'; 1967 } 1968 } 1969 1970 /* 1971 ** Attempt to determine if identifier zName needs to be quoted, either 1972 ** because it contains non-alphanumeric characters, or because it is an 1973 ** SQLite keyword. Be conservative in this estimate: When in doubt assume 1974 ** that quoting is required. 1975 ** 1976 ** Return '"' if quoting is required. Return 0 if no quoting is required. 1977 */ 1978 static char quoteChar(const char *zName){ 1979 int i; 1980 if( zName==0 ) return '"'; 1981 if( !isalpha((unsigned char)zName[0]) && zName[0]!='_' ) return '"'; 1982 for(i=0; zName[i]; i++){ 1983 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ) return '"'; 1984 } 1985 return sqlite3_keyword_check(zName, i) ? '"' : 0; 1986 } 1987 1988 /* 1989 ** Construct a fake object name and column list to describe the structure 1990 ** of the view, virtual table, or table valued function zSchema.zName. 1991 */ 1992 static char *shellFakeSchema( 1993 sqlite3 *db, /* The database connection containing the vtab */ 1994 const char *zSchema, /* Schema of the database holding the vtab */ 1995 const char *zName /* The name of the virtual table */ 1996 ){ 1997 sqlite3_stmt *pStmt = 0; 1998 char *zSql; 1999 ShellText s; 2000 char cQuote; 2001 char *zDiv = "("; 2002 int nRow = 0; 2003 2004 zSql = sqlite3_mprintf("PRAGMA \"%w\".table_info=%Q;", 2005 zSchema ? zSchema : "main", zName); 2006 shell_check_oom(zSql); 2007 sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); 2008 sqlite3_free(zSql); 2009 initText(&s); 2010 if( zSchema ){ 2011 cQuote = quoteChar(zSchema); 2012 if( cQuote && sqlite3_stricmp(zSchema,"temp")==0 ) cQuote = 0; 2013 appendText(&s, zSchema, cQuote); 2014 appendText(&s, ".", 0); 2015 } 2016 cQuote = quoteChar(zName); 2017 appendText(&s, zName, cQuote); 2018 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 2019 const char *zCol = (const char*)sqlite3_column_text(pStmt, 1); 2020 nRow++; 2021 appendText(&s, zDiv, 0); 2022 zDiv = ","; 2023 if( zCol==0 ) zCol = ""; 2024 cQuote = quoteChar(zCol); 2025 appendText(&s, zCol, cQuote); 2026 } 2027 appendText(&s, ")", 0); 2028 sqlite3_finalize(pStmt); 2029 if( nRow==0 ){ 2030 freeText(&s); 2031 s.z = 0; 2032 } 2033 return s.z; 2034 } 2035 2036 /* 2037 ** SQL function: strtod(X) 2038 ** 2039 ** Use the C-library strtod() function to convert string X into a double. 2040 ** Used for comparing the accuracy of SQLite's internal text-to-float conversion 2041 ** routines against the C-library. 2042 */ 2043 static void shellStrtod( 2044 sqlite3_context *pCtx, 2045 int nVal, 2046 sqlite3_value **apVal 2047 ){ 2048 char *z = (char*)sqlite3_value_text(apVal[0]); 2049 UNUSED_PARAMETER(nVal); 2050 if( z==0 ) return; 2051 sqlite3_result_double(pCtx, strtod(z,0)); 2052 } 2053 2054 /* 2055 ** SQL function: dtostr(X) 2056 ** 2057 ** Use the C-library printf() function to convert real value X into a string. 2058 ** Used for comparing the accuracy of SQLite's internal float-to-text conversion 2059 ** routines against the C-library. 2060 */ 2061 static void shellDtostr( 2062 sqlite3_context *pCtx, 2063 int nVal, 2064 sqlite3_value **apVal 2065 ){ 2066 double r = sqlite3_value_double(apVal[0]); 2067 int n = nVal>=2 ? sqlite3_value_int(apVal[1]) : 26; 2068 char z[400]; 2069 if( n<1 ) n = 1; 2070 if( n>350 ) n = 350; 2071 sqlite3_snprintf(sizeof(z), z, "%#+.*e", n, r); 2072 sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT); 2073 } 2074 2075 2076 /* 2077 ** SQL function: shell_module_schema(X) 2078 ** 2079 ** Return a fake schema for the table-valued function or eponymous virtual 2080 ** table X. 2081 */ 2082 static void shellModuleSchema( 2083 sqlite3_context *pCtx, 2084 int nVal, 2085 sqlite3_value **apVal 2086 ){ 2087 const char *zName; 2088 char *zFake; 2089 UNUSED_PARAMETER(nVal); 2090 zName = (const char*)sqlite3_value_text(apVal[0]); 2091 zFake = zName? shellFakeSchema(sqlite3_context_db_handle(pCtx), 0, zName) : 0; 2092 if( zFake ){ 2093 sqlite3_result_text(pCtx, sqlite3_mprintf("/* %s */", zFake), 2094 -1, sqlite3_free); 2095 free(zFake); 2096 } 2097 } 2098 2099 /* 2100 ** SQL function: shell_add_schema(S,X) 2101 ** 2102 ** Add the schema name X to the CREATE statement in S and return the result. 2103 ** Examples: 2104 ** 2105 ** CREATE TABLE t1(x) -> CREATE TABLE xyz.t1(x); 2106 ** 2107 ** Also works on 2108 ** 2109 ** CREATE INDEX 2110 ** CREATE UNIQUE INDEX 2111 ** CREATE VIEW 2112 ** CREATE TRIGGER 2113 ** CREATE VIRTUAL TABLE 2114 ** 2115 ** This UDF is used by the .schema command to insert the schema name of 2116 ** attached databases into the middle of the sqlite_schema.sql field. 2117 */ 2118 static void shellAddSchemaName( 2119 sqlite3_context *pCtx, 2120 int nVal, 2121 sqlite3_value **apVal 2122 ){ 2123 static const char *aPrefix[] = { 2124 "TABLE", 2125 "INDEX", 2126 "UNIQUE INDEX", 2127 "VIEW", 2128 "TRIGGER", 2129 "VIRTUAL TABLE" 2130 }; 2131 int i = 0; 2132 const char *zIn = (const char*)sqlite3_value_text(apVal[0]); 2133 const char *zSchema = (const char*)sqlite3_value_text(apVal[1]); 2134 const char *zName = (const char*)sqlite3_value_text(apVal[2]); 2135 sqlite3 *db = sqlite3_context_db_handle(pCtx); 2136 UNUSED_PARAMETER(nVal); 2137 if( zIn!=0 && cli_strncmp(zIn, "CREATE ", 7)==0 ){ 2138 for(i=0; i<ArraySize(aPrefix); i++){ 2139 int n = strlen30(aPrefix[i]); 2140 if( cli_strncmp(zIn+7, aPrefix[i], n)==0 && zIn[n+7]==' ' ){ 2141 char *z = 0; 2142 char *zFake = 0; 2143 if( zSchema ){ 2144 char cQuote = quoteChar(zSchema); 2145 if( cQuote && sqlite3_stricmp(zSchema,"temp")!=0 ){ 2146 z = sqlite3_mprintf("%.*s \"%w\".%s", n+7, zIn, zSchema, zIn+n+8); 2147 }else{ 2148 z = sqlite3_mprintf("%.*s %s.%s", n+7, zIn, zSchema, zIn+n+8); 2149 } 2150 } 2151 if( zName 2152 && aPrefix[i][0]=='V' 2153 && (zFake = shellFakeSchema(db, zSchema, zName))!=0 2154 ){ 2155 if( z==0 ){ 2156 z = sqlite3_mprintf("%s\n/* %s */", zIn, zFake); 2157 }else{ 2158 z = sqlite3_mprintf("%z\n/* %s */", z, zFake); 2159 } 2160 free(zFake); 2161 } 2162 if( z ){ 2163 sqlite3_result_text(pCtx, z, -1, sqlite3_free); 2164 return; 2165 } 2166 } 2167 } 2168 } 2169 sqlite3_result_value(pCtx, apVal[0]); 2170 } 2171 2172 /* 2173 ** The source code for several run-time loadable extensions is inserted 2174 ** below by the ../tool/mkshellc.tcl script. Before processing that included 2175 ** code, we need to override some macros to make the included program code 2176 ** work here in the middle of this regular program. 2177 */ 2178 #define SQLITE_EXTENSION_INIT1 2179 #define SQLITE_EXTENSION_INIT2(X) (void)(X) 2180 2181 #if defined(_WIN32) && defined(_MSC_VER) 2182 /************************* Begin test_windirent.h ******************/ 2183 /* 2184 ** 2015 November 30 2185 ** 2186 ** The author disclaims copyright to this source code. In place of 2187 ** a legal notice, here is a blessing: 2188 ** 2189 ** May you do good and not evil. 2190 ** May you find forgiveness for yourself and forgive others. 2191 ** May you share freely, never taking more than you give. 2192 ** 2193 ************************************************************************* 2194 ** This file contains declarations for most of the opendir() family of 2195 ** POSIX functions on Win32 using the MSVCRT. 2196 */ 2197 2198 #if defined(_WIN32) && defined(_MSC_VER) && !defined(SQLITE_WINDIRENT_H) 2199 #define SQLITE_WINDIRENT_H 2200 2201 /* 2202 ** We need several data types from the Windows SDK header. 2203 */ 2204 2205 #ifndef WIN32_LEAN_AND_MEAN 2206 #define WIN32_LEAN_AND_MEAN 2207 #endif 2208 2209 #include "windows.h" 2210 2211 /* 2212 ** We need several support functions from the SQLite core. 2213 */ 2214 2215 /* #include "sqlite3.h" */ 2216 2217 /* 2218 ** We need several things from the ANSI and MSVCRT headers. 2219 */ 2220 2221 #include <stdio.h> 2222 #include <stdlib.h> 2223 #include <errno.h> 2224 #include <io.h> 2225 #include <limits.h> 2226 #include <sys/types.h> 2227 #include <sys/stat.h> 2228 2229 /* 2230 ** We may need several defines that should have been in "sys/stat.h". 2231 */ 2232 2233 #ifndef S_ISREG 2234 #define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG) 2235 #endif 2236 2237 #ifndef S_ISDIR 2238 #define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) 2239 #endif 2240 2241 #ifndef S_ISLNK 2242 #define S_ISLNK(mode) (0) 2243 #endif 2244 2245 /* 2246 ** We may need to provide the "mode_t" type. 2247 */ 2248 2249 #ifndef MODE_T_DEFINED 2250 #define MODE_T_DEFINED 2251 typedef unsigned short mode_t; 2252 #endif 2253 2254 /* 2255 ** We may need to provide the "ino_t" type. 2256 */ 2257 2258 #ifndef INO_T_DEFINED 2259 #define INO_T_DEFINED 2260 typedef unsigned short ino_t; 2261 #endif 2262 2263 /* 2264 ** We need to define "NAME_MAX" if it was not present in "limits.h". 2265 */ 2266 2267 #ifndef NAME_MAX 2268 # ifdef FILENAME_MAX 2269 # define NAME_MAX (FILENAME_MAX) 2270 # else 2271 # define NAME_MAX (260) 2272 # endif 2273 #endif 2274 2275 /* 2276 ** We need to define "NULL_INTPTR_T" and "BAD_INTPTR_T". 2277 */ 2278 2279 #ifndef NULL_INTPTR_T 2280 # define NULL_INTPTR_T ((intptr_t)(0)) 2281 #endif 2282 2283 #ifndef BAD_INTPTR_T 2284 # define BAD_INTPTR_T ((intptr_t)(-1)) 2285 #endif 2286 2287 /* 2288 ** We need to provide the necessary structures and related types. 2289 */ 2290 2291 #ifndef DIRENT_DEFINED 2292 #define DIRENT_DEFINED 2293 typedef struct DIRENT DIRENT; 2294 typedef DIRENT *LPDIRENT; 2295 struct DIRENT { 2296 ino_t d_ino; /* Sequence number, do not use. */ 2297 unsigned d_attributes; /* Win32 file attributes. */ 2298 char d_name[NAME_MAX + 1]; /* Name within the directory. */ 2299 }; 2300 #endif 2301 2302 #ifndef DIR_DEFINED 2303 #define DIR_DEFINED 2304 typedef struct DIR DIR; 2305 typedef DIR *LPDIR; 2306 struct DIR { 2307 intptr_t d_handle; /* Value returned by "_findfirst". */ 2308 DIRENT d_first; /* DIRENT constructed based on "_findfirst". */ 2309 DIRENT d_next; /* DIRENT constructed based on "_findnext". */ 2310 }; 2311 #endif 2312 2313 /* 2314 ** Provide a macro, for use by the implementation, to determine if a 2315 ** particular directory entry should be skipped over when searching for 2316 ** the next directory entry that should be returned by the readdir() or 2317 ** readdir_r() functions. 2318 */ 2319 2320 #ifndef is_filtered 2321 # define is_filtered(a) ((((a).attrib)&_A_HIDDEN) || (((a).attrib)&_A_SYSTEM)) 2322 #endif 2323 2324 /* 2325 ** Provide the function prototype for the POSIX compatible getenv() 2326 ** function. This function is not thread-safe. 2327 */ 2328 2329 extern const char *windirent_getenv(const char *name); 2330 2331 /* 2332 ** Finally, we can provide the function prototypes for the opendir(), 2333 ** readdir(), readdir_r(), and closedir() POSIX functions. 2334 */ 2335 2336 extern LPDIR opendir(const char *dirname); 2337 extern LPDIRENT readdir(LPDIR dirp); 2338 extern INT readdir_r(LPDIR dirp, LPDIRENT entry, LPDIRENT *result); 2339 extern INT closedir(LPDIR dirp); 2340 2341 #endif /* defined(WIN32) && defined(_MSC_VER) */ 2342 2343 /************************* End test_windirent.h ********************/ 2344 /************************* Begin test_windirent.c ******************/ 2345 /* 2346 ** 2015 November 30 2347 ** 2348 ** The author disclaims copyright to this source code. In place of 2349 ** a legal notice, here is a blessing: 2350 ** 2351 ** May you do good and not evil. 2352 ** May you find forgiveness for yourself and forgive others. 2353 ** May you share freely, never taking more than you give. 2354 ** 2355 ************************************************************************* 2356 ** This file contains code to implement most of the opendir() family of 2357 ** POSIX functions on Win32 using the MSVCRT. 2358 */ 2359 2360 #if defined(_WIN32) && defined(_MSC_VER) 2361 /* #include "test_windirent.h" */ 2362 2363 /* 2364 ** Implementation of the POSIX getenv() function using the Win32 API. 2365 ** This function is not thread-safe. 2366 */ 2367 const char *windirent_getenv( 2368 const char *name 2369 ){ 2370 static char value[32768]; /* Maximum length, per MSDN */ 2371 DWORD dwSize = sizeof(value) / sizeof(char); /* Size in chars */ 2372 DWORD dwRet; /* Value returned by GetEnvironmentVariableA() */ 2373 2374 memset(value, 0, sizeof(value)); 2375 dwRet = GetEnvironmentVariableA(name, value, dwSize); 2376 if( dwRet==0 || dwRet>dwSize ){ 2377 /* 2378 ** The function call to GetEnvironmentVariableA() failed -OR- 2379 ** the buffer is not large enough. Either way, return NULL. 2380 */ 2381 return 0; 2382 }else{ 2383 /* 2384 ** The function call to GetEnvironmentVariableA() succeeded 2385 ** -AND- the buffer contains the entire value. 2386 */ 2387 return value; 2388 } 2389 } 2390 2391 /* 2392 ** Implementation of the POSIX opendir() function using the MSVCRT. 2393 */ 2394 LPDIR opendir( 2395 const char *dirname 2396 ){ 2397 struct _finddata_t data; 2398 LPDIR dirp = (LPDIR)sqlite3_malloc(sizeof(DIR)); 2399 SIZE_T namesize = sizeof(data.name) / sizeof(data.name[0]); 2400 2401 if( dirp==NULL ) return NULL; 2402 memset(dirp, 0, sizeof(DIR)); 2403 2404 /* TODO: Remove this if Unix-style root paths are not used. */ 2405 if( sqlite3_stricmp(dirname, "/")==0 ){ 2406 dirname = windirent_getenv("SystemDrive"); 2407 } 2408 2409 memset(&data, 0, sizeof(struct _finddata_t)); 2410 _snprintf(data.name, namesize, "%s\\*", dirname); 2411 dirp->d_handle = _findfirst(data.name, &data); 2412 2413 if( dirp->d_handle==BAD_INTPTR_T ){ 2414 closedir(dirp); 2415 return NULL; 2416 } 2417 2418 /* TODO: Remove this block to allow hidden and/or system files. */ 2419 if( is_filtered(data) ){ 2420 next: 2421 2422 memset(&data, 0, sizeof(struct _finddata_t)); 2423 if( _findnext(dirp->d_handle, &data)==-1 ){ 2424 closedir(dirp); 2425 return NULL; 2426 } 2427 2428 /* TODO: Remove this block to allow hidden and/or system files. */ 2429 if( is_filtered(data) ) goto next; 2430 } 2431 2432 dirp->d_first.d_attributes = data.attrib; 2433 strncpy(dirp->d_first.d_name, data.name, NAME_MAX); 2434 dirp->d_first.d_name[NAME_MAX] = '\0'; 2435 2436 return dirp; 2437 } 2438 2439 /* 2440 ** Implementation of the POSIX readdir() function using the MSVCRT. 2441 */ 2442 LPDIRENT readdir( 2443 LPDIR dirp 2444 ){ 2445 struct _finddata_t data; 2446 2447 if( dirp==NULL ) return NULL; 2448 2449 if( dirp->d_first.d_ino==0 ){ 2450 dirp->d_first.d_ino++; 2451 dirp->d_next.d_ino++; 2452 2453 return &dirp->d_first; 2454 } 2455 2456 next: 2457 2458 memset(&data, 0, sizeof(struct _finddata_t)); 2459 if( _findnext(dirp->d_handle, &data)==-1 ) return NULL; 2460 2461 /* TODO: Remove this block to allow hidden and/or system files. */ 2462 if( is_filtered(data) ) goto next; 2463 2464 dirp->d_next.d_ino++; 2465 dirp->d_next.d_attributes = data.attrib; 2466 strncpy(dirp->d_next.d_name, data.name, NAME_MAX); 2467 dirp->d_next.d_name[NAME_MAX] = '\0'; 2468 2469 return &dirp->d_next; 2470 } 2471 2472 /* 2473 ** Implementation of the POSIX readdir_r() function using the MSVCRT. 2474 */ 2475 INT readdir_r( 2476 LPDIR dirp, 2477 LPDIRENT entry, 2478 LPDIRENT *result 2479 ){ 2480 struct _finddata_t data; 2481 2482 if( dirp==NULL ) return EBADF; 2483 2484 if( dirp->d_first.d_ino==0 ){ 2485 dirp->d_first.d_ino++; 2486 dirp->d_next.d_ino++; 2487 2488 entry->d_ino = dirp->d_first.d_ino; 2489 entry->d_attributes = dirp->d_first.d_attributes; 2490 strncpy(entry->d_name, dirp->d_first.d_name, NAME_MAX); 2491 entry->d_name[NAME_MAX] = '\0'; 2492 2493 *result = entry; 2494 return 0; 2495 } 2496 2497 next: 2498 2499 memset(&data, 0, sizeof(struct _finddata_t)); 2500 if( _findnext(dirp->d_handle, &data)==-1 ){ 2501 *result = NULL; 2502 return ENOENT; 2503 } 2504 2505 /* TODO: Remove this block to allow hidden and/or system files. */ 2506 if( is_filtered(data) ) goto next; 2507 2508 entry->d_ino = (ino_t)-1; /* not available */ 2509 entry->d_attributes = data.attrib; 2510 strncpy(entry->d_name, data.name, NAME_MAX); 2511 entry->d_name[NAME_MAX] = '\0'; 2512 2513 *result = entry; 2514 return 0; 2515 } 2516 2517 /* 2518 ** Implementation of the POSIX closedir() function using the MSVCRT. 2519 */ 2520 INT closedir( 2521 LPDIR dirp 2522 ){ 2523 INT result = 0; 2524 2525 if( dirp==NULL ) return EINVAL; 2526 2527 if( dirp->d_handle!=NULL_INTPTR_T && dirp->d_handle!=BAD_INTPTR_T ){ 2528 result = _findclose(dirp->d_handle); 2529 } 2530 2531 sqlite3_free(dirp); 2532 return result; 2533 } 2534 2535 #endif /* defined(WIN32) && defined(_MSC_VER) */ 2536 2537 /************************* End test_windirent.c ********************/ 2538 #define dirent DIRENT 2539 #endif 2540 /************************* Begin ../ext/misc/memtrace.c ******************/ 2541 /* 2542 ** 2019-01-21 2543 ** 2544 ** The author disclaims copyright to this source code. In place of 2545 ** a legal notice, here is a blessing: 2546 ** 2547 ** May you do good and not evil. 2548 ** May you find forgiveness for yourself and forgive others. 2549 ** May you share freely, never taking more than you give. 2550 ** 2551 ************************************************************************* 2552 ** 2553 ** This file implements an extension that uses the SQLITE_CONFIG_MALLOC 2554 ** mechanism to add a tracing layer on top of SQLite. If this extension 2555 ** is registered prior to sqlite3_initialize(), it will cause all memory 2556 ** allocation activities to be logged on standard output, or to some other 2557 ** FILE specified by the initializer. 2558 ** 2559 ** This file needs to be compiled into the application that uses it. 2560 ** 2561 ** This extension is used to implement the --memtrace option of the 2562 ** command-line shell. 2563 */ 2564 #include <assert.h> 2565 #include <string.h> 2566 #include <stdio.h> 2567 2568 /* The original memory allocation routines */ 2569 static sqlite3_mem_methods memtraceBase; 2570 static FILE *memtraceOut; 2571 2572 /* Methods that trace memory allocations */ 2573 static void *memtraceMalloc(int n){ 2574 if( memtraceOut ){ 2575 fprintf(memtraceOut, "MEMTRACE: allocate %d bytes\n", 2576 memtraceBase.xRoundup(n)); 2577 } 2578 return memtraceBase.xMalloc(n); 2579 } 2580 static void memtraceFree(void *p){ 2581 if( p==0 ) return; 2582 if( memtraceOut ){ 2583 fprintf(memtraceOut, "MEMTRACE: free %d bytes\n", memtraceBase.xSize(p)); 2584 } 2585 memtraceBase.xFree(p); 2586 } 2587 static void *memtraceRealloc(void *p, int n){ 2588 if( p==0 ) return memtraceMalloc(n); 2589 if( n==0 ){ 2590 memtraceFree(p); 2591 return 0; 2592 } 2593 if( memtraceOut ){ 2594 fprintf(memtraceOut, "MEMTRACE: resize %d -> %d bytes\n", 2595 memtraceBase.xSize(p), memtraceBase.xRoundup(n)); 2596 } 2597 return memtraceBase.xRealloc(p, n); 2598 } 2599 static int memtraceSize(void *p){ 2600 return memtraceBase.xSize(p); 2601 } 2602 static int memtraceRoundup(int n){ 2603 return memtraceBase.xRoundup(n); 2604 } 2605 static int memtraceInit(void *p){ 2606 return memtraceBase.xInit(p); 2607 } 2608 static void memtraceShutdown(void *p){ 2609 memtraceBase.xShutdown(p); 2610 } 2611 2612 /* The substitute memory allocator */ 2613 static sqlite3_mem_methods ersaztMethods = { 2614 memtraceMalloc, 2615 memtraceFree, 2616 memtraceRealloc, 2617 memtraceSize, 2618 memtraceRoundup, 2619 memtraceInit, 2620 memtraceShutdown, 2621 0 2622 }; 2623 2624 /* Begin tracing memory allocations to out. */ 2625 int sqlite3MemTraceActivate(FILE *out){ 2626 int rc = SQLITE_OK; 2627 if( memtraceBase.xMalloc==0 ){ 2628 rc = sqlite3_config(SQLITE_CONFIG_GETMALLOC, &memtraceBase); 2629 if( rc==SQLITE_OK ){ 2630 rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &ersaztMethods); 2631 } 2632 } 2633 memtraceOut = out; 2634 return rc; 2635 } 2636 2637 /* Deactivate memory tracing */ 2638 int sqlite3MemTraceDeactivate(void){ 2639 int rc = SQLITE_OK; 2640 if( memtraceBase.xMalloc!=0 ){ 2641 rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &memtraceBase); 2642 if( rc==SQLITE_OK ){ 2643 memset(&memtraceBase, 0, sizeof(memtraceBase)); 2644 } 2645 } 2646 memtraceOut = 0; 2647 return rc; 2648 } 2649 2650 /************************* End ../ext/misc/memtrace.c ********************/ 2651 /************************* Begin ../ext/misc/pcachetrace.c ******************/ 2652 /* 2653 ** 2023-06-21 2654 ** 2655 ** The author disclaims copyright to this source code. In place of 2656 ** a legal notice, here is a blessing: 2657 ** 2658 ** May you do good and not evil. 2659 ** May you find forgiveness for yourself and forgive others. 2660 ** May you share freely, never taking more than you give. 2661 ** 2662 ************************************************************************* 2663 ** 2664 ** This file implements an extension that uses the SQLITE_CONFIG_PCACHE2 2665 ** mechanism to add a tracing layer on top of pluggable page cache of 2666 ** SQLite. If this extension is registered prior to sqlite3_initialize(), 2667 ** it will cause all page cache activities to be logged on standard output, 2668 ** or to some other FILE specified by the initializer. 2669 ** 2670 ** This file needs to be compiled into the application that uses it. 2671 ** 2672 ** This extension is used to implement the --pcachetrace option of the 2673 ** command-line shell. 2674 */ 2675 #include <assert.h> 2676 #include <string.h> 2677 #include <stdio.h> 2678 2679 /* The original page cache routines */ 2680 static sqlite3_pcache_methods2 pcacheBase; 2681 static FILE *pcachetraceOut; 2682 2683 /* Methods that trace pcache activity */ 2684 static int pcachetraceInit(void *pArg){ 2685 int nRes; 2686 if( pcachetraceOut ){ 2687 fprintf(pcachetraceOut, "PCACHETRACE: xInit(%p)\n", pArg); 2688 } 2689 nRes = pcacheBase.xInit(pArg); 2690 if( pcachetraceOut ){ 2691 fprintf(pcachetraceOut, "PCACHETRACE: xInit(%p) -> %d\n", pArg, nRes); 2692 } 2693 return nRes; 2694 } 2695 static void pcachetraceShutdown(void *pArg){ 2696 if( pcachetraceOut ){ 2697 fprintf(pcachetraceOut, "PCACHETRACE: xShutdown(%p)\n", pArg); 2698 } 2699 pcacheBase.xShutdown(pArg); 2700 } 2701 static sqlite3_pcache *pcachetraceCreate(int szPage, int szExtra, int bPurge){ 2702 sqlite3_pcache *pRes; 2703 if( pcachetraceOut ){ 2704 fprintf(pcachetraceOut, "PCACHETRACE: xCreate(%d,%d,%d)\n", 2705 szPage, szExtra, bPurge); 2706 } 2707 pRes = pcacheBase.xCreate(szPage, szExtra, bPurge); 2708 if( pcachetraceOut ){ 2709 fprintf(pcachetraceOut, "PCACHETRACE: xCreate(%d,%d,%d) -> %p\n", 2710 szPage, szExtra, bPurge, pRes); 2711 } 2712 return pRes; 2713 } 2714 static void pcachetraceCachesize(sqlite3_pcache *p, int nCachesize){ 2715 if( pcachetraceOut ){ 2716 fprintf(pcachetraceOut, "PCACHETRACE: xCachesize(%p, %d)\n", p, nCachesize); 2717 } 2718 pcacheBase.xCachesize(p, nCachesize); 2719 } 2720 static int pcachetracePagecount(sqlite3_pcache *p){ 2721 int nRes; 2722 if( pcachetraceOut ){ 2723 fprintf(pcachetraceOut, "PCACHETRACE: xPagecount(%p)\n", p); 2724 } 2725 nRes = pcacheBase.xPagecount(p); 2726 if( pcachetraceOut ){ 2727 fprintf(pcachetraceOut, "PCACHETRACE: xPagecount(%p) -> %d\n", p, nRes); 2728 } 2729 return nRes; 2730 } 2731 static sqlite3_pcache_page *pcachetraceFetch( 2732 sqlite3_pcache *p, 2733 unsigned key, 2734 int crFg 2735 ){ 2736 sqlite3_pcache_page *pRes; 2737 if( pcachetraceOut ){ 2738 fprintf(pcachetraceOut, "PCACHETRACE: xFetch(%p,%u,%d)\n", p, key, crFg); 2739 } 2740 pRes = pcacheBase.xFetch(p, key, crFg); 2741 if( pcachetraceOut ){ 2742 fprintf(pcachetraceOut, "PCACHETRACE: xFetch(%p,%u,%d) -> %p\n", 2743 p, key, crFg, pRes); 2744 } 2745 return pRes; 2746 } 2747 static void pcachetraceUnpin( 2748 sqlite3_pcache *p, 2749 sqlite3_pcache_page *pPg, 2750 int bDiscard 2751 ){ 2752 if( pcachetraceOut ){ 2753 fprintf(pcachetraceOut, "PCACHETRACE: xUnpin(%p, %p, %d)\n", 2754 p, pPg, bDiscard); 2755 } 2756 pcacheBase.xUnpin(p, pPg, bDiscard); 2757 } 2758 static void pcachetraceRekey( 2759 sqlite3_pcache *p, 2760 sqlite3_pcache_page *pPg, 2761 unsigned oldKey, 2762 unsigned newKey 2763 ){ 2764 if( pcachetraceOut ){ 2765 fprintf(pcachetraceOut, "PCACHETRACE: xRekey(%p, %p, %u, %u)\n", 2766 p, pPg, oldKey, newKey); 2767 } 2768 pcacheBase.xRekey(p, pPg, oldKey, newKey); 2769 } 2770 static void pcachetraceTruncate(sqlite3_pcache *p, unsigned n){ 2771 if( pcachetraceOut ){ 2772 fprintf(pcachetraceOut, "PCACHETRACE: xTruncate(%p, %u)\n", p, n); 2773 } 2774 pcacheBase.xTruncate(p, n); 2775 } 2776 static void pcachetraceDestroy(sqlite3_pcache *p){ 2777 if( pcachetraceOut ){ 2778 fprintf(pcachetraceOut, "PCACHETRACE: xDestroy(%p)\n", p); 2779 } 2780 pcacheBase.xDestroy(p); 2781 } 2782 static void pcachetraceShrink(sqlite3_pcache *p){ 2783 if( pcachetraceOut ){ 2784 fprintf(pcachetraceOut, "PCACHETRACE: xShrink(%p)\n", p); 2785 } 2786 pcacheBase.xShrink(p); 2787 } 2788 2789 /* The substitute pcache methods */ 2790 static sqlite3_pcache_methods2 ersaztPcacheMethods = { 2791 0, 2792 0, 2793 pcachetraceInit, 2794 pcachetraceShutdown, 2795 pcachetraceCreate, 2796 pcachetraceCachesize, 2797 pcachetracePagecount, 2798 pcachetraceFetch, 2799 pcachetraceUnpin, 2800 pcachetraceRekey, 2801 pcachetraceTruncate, 2802 pcachetraceDestroy, 2803 pcachetraceShrink 2804 }; 2805 2806 /* Begin tracing memory allocations to out. */ 2807 int sqlite3PcacheTraceActivate(FILE *out){ 2808 int rc = SQLITE_OK; 2809 if( pcacheBase.xFetch==0 ){ 2810 rc = sqlite3_config(SQLITE_CONFIG_GETPCACHE2, &pcacheBase); 2811 if( rc==SQLITE_OK ){ 2812 rc = sqlite3_config(SQLITE_CONFIG_PCACHE2, &ersaztPcacheMethods); 2813 } 2814 } 2815 pcachetraceOut = out; 2816 return rc; 2817 } 2818 2819 /* Deactivate memory tracing */ 2820 int sqlite3PcacheTraceDeactivate(void){ 2821 int rc = SQLITE_OK; 2822 if( pcacheBase.xFetch!=0 ){ 2823 rc = sqlite3_config(SQLITE_CONFIG_PCACHE2, &pcacheBase); 2824 if( rc==SQLITE_OK ){ 2825 memset(&pcacheBase, 0, sizeof(pcacheBase)); 2826 } 2827 } 2828 pcachetraceOut = 0; 2829 return rc; 2830 } 2831 2832 /************************* End ../ext/misc/pcachetrace.c ********************/ 2833 /************************* Begin ../ext/misc/shathree.c ******************/ 2834 /* 2835 ** 2017-03-08 2836 ** 2837 ** The author disclaims copyright to this source code. In place of 2838 ** a legal notice, here is a blessing: 2839 ** 2840 ** May you do good and not evil. 2841 ** May you find forgiveness for yourself and forgive others. 2842 ** May you share freely, never taking more than you give. 2843 ** 2844 ****************************************************************************** 2845 ** 2846 ** This SQLite extension implements functions that compute SHA3 hashes 2847 ** in the way described by the (U.S.) NIST FIPS 202 SHA-3 Standard. 2848 ** Two SQL functions are implemented: 2849 ** 2850 ** sha3(X,SIZE) 2851 ** sha3_query(Y,SIZE) 2852 ** 2853 ** The sha3(X) function computes the SHA3 hash of the input X, or NULL if 2854 ** X is NULL. 2855 ** 2856 ** The sha3_query(Y) function evaluates all queries in the SQL statements of Y 2857 ** and returns a hash of their results. 2858 ** 2859 ** The SIZE argument is optional. If omitted, the SHA3-256 hash algorithm 2860 ** is used. If SIZE is included it must be one of the integers 224, 256, 2861 ** 384, or 512, to determine SHA3 hash variant that is computed. 2862 */ 2863 /* #include "sqlite3ext.h" */ 2864 SQLITE_EXTENSION_INIT1 2865 #include <assert.h> 2866 #include <string.h> 2867 #include <stdarg.h> 2868 2869 #ifndef SQLITE_AMALGAMATION 2870 /* typedef sqlite3_uint64 u64; */ 2871 #endif /* SQLITE_AMALGAMATION */ 2872 2873 /****************************************************************************** 2874 ** The Hash Engine 2875 */ 2876 /* 2877 ** Macros to determine whether the machine is big or little endian, 2878 ** and whether or not that determination is run-time or compile-time. 2879 ** 2880 ** For best performance, an attempt is made to guess at the byte-order 2881 ** using C-preprocessor macros. If that is unsuccessful, or if 2882 ** -DSHA3_BYTEORDER=0 is set, then byte-order is determined 2883 ** at run-time. 2884 */ 2885 #ifndef SHA3_BYTEORDER 2886 # if defined(i386) || defined(__i386__) || defined(_M_IX86) || \ 2887 defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || \ 2888 defined(_M_AMD64) || defined(_M_ARM) || defined(__x86) || \ 2889 defined(__arm__) 2890 # define SHA3_BYTEORDER 1234 2891 # elif defined(sparc) || defined(__ppc__) 2892 # define SHA3_BYTEORDER 4321 2893 # else 2894 # define SHA3_BYTEORDER 0 2895 # endif 2896 #endif 2897 2898 2899 /* 2900 ** State structure for a SHA3 hash in progress 2901 */ 2902 typedef struct SHA3Context SHA3Context; 2903 struct SHA3Context { 2904 union { 2905 u64 s[25]; /* Keccak state. 5x5 lines of 64 bits each */ 2906 unsigned char x[1600]; /* ... or 1600 bytes */ 2907 } u; 2908 unsigned nRate; /* Bytes of input accepted per Keccak iteration */ 2909 unsigned nLoaded; /* Input bytes loaded into u.x[] so far this cycle */ 2910 unsigned ixMask; /* Insert next input into u.x[nLoaded^ixMask]. */ 2911 }; 2912 2913 /* 2914 ** A single step of the Keccak mixing function for a 1600-bit state 2915 */ 2916 static void KeccakF1600Step(SHA3Context *p){ 2917 int i; 2918 u64 b0, b1, b2, b3, b4; 2919 u64 c0, c1, c2, c3, c4; 2920 u64 d0, d1, d2, d3, d4; 2921 static const u64 RC[] = { 2922 0x0000000000000001ULL, 0x0000000000008082ULL, 2923 0x800000000000808aULL, 0x8000000080008000ULL, 2924 0x000000000000808bULL, 0x0000000080000001ULL, 2925 0x8000000080008081ULL, 0x8000000000008009ULL, 2926 0x000000000000008aULL, 0x0000000000000088ULL, 2927 0x0000000080008009ULL, 0x000000008000000aULL, 2928 0x000000008000808bULL, 0x800000000000008bULL, 2929 0x8000000000008089ULL, 0x8000000000008003ULL, 2930 0x8000000000008002ULL, 0x8000000000000080ULL, 2931 0x000000000000800aULL, 0x800000008000000aULL, 2932 0x8000000080008081ULL, 0x8000000000008080ULL, 2933 0x0000000080000001ULL, 0x8000000080008008ULL 2934 }; 2935 # define a00 (p->u.s[0]) 2936 # define a01 (p->u.s[1]) 2937 # define a02 (p->u.s[2]) 2938 # define a03 (p->u.s[3]) 2939 # define a04 (p->u.s[4]) 2940 # define a10 (p->u.s[5]) 2941 # define a11 (p->u.s[6]) 2942 # define a12 (p->u.s[7]) 2943 # define a13 (p->u.s[8]) 2944 # define a14 (p->u.s[9]) 2945 # define a20 (p->u.s[10]) 2946 # define a21 (p->u.s[11]) 2947 # define a22 (p->u.s[12]) 2948 # define a23 (p->u.s[13]) 2949 # define a24 (p->u.s[14]) 2950 # define a30 (p->u.s[15]) 2951 # define a31 (p->u.s[16]) 2952 # define a32 (p->u.s[17]) 2953 # define a33 (p->u.s[18]) 2954 # define a34 (p->u.s[19]) 2955 # define a40 (p->u.s[20]) 2956 # define a41 (p->u.s[21]) 2957 # define a42 (p->u.s[22]) 2958 # define a43 (p->u.s[23]) 2959 # define a44 (p->u.s[24]) 2960 # define ROL64(a,x) ((a<<x)|(a>>(64-x))) 2961 2962 for(i=0; i<24; i+=4){ 2963 c0 = a00^a10^a20^a30^a40; 2964 c1 = a01^a11^a21^a31^a41; 2965 c2 = a02^a12^a22^a32^a42; 2966 c3 = a03^a13^a23^a33^a43; 2967 c4 = a04^a14^a24^a34^a44; 2968 d0 = c4^ROL64(c1, 1); 2969 d1 = c0^ROL64(c2, 1); 2970 d2 = c1^ROL64(c3, 1); 2971 d3 = c2^ROL64(c4, 1); 2972 d4 = c3^ROL64(c0, 1); 2973 2974 b0 = (a00^d0); 2975 b1 = ROL64((a11^d1), 44); 2976 b2 = ROL64((a22^d2), 43); 2977 b3 = ROL64((a33^d3), 21); 2978 b4 = ROL64((a44^d4), 14); 2979 a00 = b0 ^((~b1)& b2 ); 2980 a00 ^= RC[i]; 2981 a11 = b1 ^((~b2)& b3 ); 2982 a22 = b2 ^((~b3)& b4 ); 2983 a33 = b3 ^((~b4)& b0 ); 2984 a44 = b4 ^((~b0)& b1 ); 2985 2986 b2 = ROL64((a20^d0), 3); 2987 b3 = ROL64((a31^d1), 45); 2988 b4 = ROL64((a42^d2), 61); 2989 b0 = ROL64((a03^d3), 28); 2990 b1 = ROL64((a14^d4), 20); 2991 a20 = b0 ^((~b1)& b2 ); 2992 a31 = b1 ^((~b2)& b3 ); 2993 a42 = b2 ^((~b3)& b4 ); 2994 a03 = b3 ^((~b4)& b0 ); 2995 a14 = b4 ^((~b0)& b1 ); 2996 2997 b4 = ROL64((a40^d0), 18); 2998 b0 = ROL64((a01^d1), 1); 2999 b1 = ROL64((a12^d2), 6); 3000 b2 = ROL64((a23^d3), 25); 3001 b3 = ROL64((a34^d4), 8); 3002 a40 = b0 ^((~b1)& b2 ); 3003 a01 = b1 ^((~b2)& b3 ); 3004 a12 = b2 ^((~b3)& b4 ); 3005 a23 = b3 ^((~b4)& b0 ); 3006 a34 = b4 ^((~b0)& b1 ); 3007 3008 b1 = ROL64((a10^d0), 36); 3009 b2 = ROL64((a21^d1), 10); 3010 b3 = ROL64((a32^d2), 15); 3011 b4 = ROL64((a43^d3), 56); 3012 b0 = ROL64((a04^d4), 27); 3013 a10 = b0 ^((~b1)& b2 ); 3014 a21 = b1 ^((~b2)& b3 ); 3015 a32 = b2 ^((~b3)& b4 ); 3016 a43 = b3 ^((~b4)& b0 ); 3017 a04 = b4 ^((~b0)& b1 ); 3018 3019 b3 = ROL64((a30^d0), 41); 3020 b4 = ROL64((a41^d1), 2); 3021 b0 = ROL64((a02^d2), 62); 3022 b1 = ROL64((a13^d3), 55); 3023 b2 = ROL64((a24^d4), 39); 3024 a30 = b0 ^((~b1)& b2 ); 3025 a41 = b1 ^((~b2)& b3 ); 3026 a02 = b2 ^((~b3)& b4 ); 3027 a13 = b3 ^((~b4)& b0 ); 3028 a24 = b4 ^((~b0)& b1 ); 3029 3030 c0 = a00^a20^a40^a10^a30; 3031 c1 = a11^a31^a01^a21^a41; 3032 c2 = a22^a42^a12^a32^a02; 3033 c3 = a33^a03^a23^a43^a13; 3034 c4 = a44^a14^a34^a04^a24; 3035 d0 = c4^ROL64(c1, 1); 3036 d1 = c0^ROL64(c2, 1); 3037 d2 = c1^ROL64(c3, 1); 3038 d3 = c2^ROL64(c4, 1); 3039 d4 = c3^ROL64(c0, 1); 3040 3041 b0 = (a00^d0); 3042 b1 = ROL64((a31^d1), 44); 3043 b2 = ROL64((a12^d2), 43); 3044 b3 = ROL64((a43^d3), 21); 3045 b4 = ROL64((a24^d4), 14); 3046 a00 = b0 ^((~b1)& b2 ); 3047 a00 ^= RC[i+1]; 3048 a31 = b1 ^((~b2)& b3 ); 3049 a12 = b2 ^((~b3)& b4 ); 3050 a43 = b3 ^((~b4)& b0 ); 3051 a24 = b4 ^((~b0)& b1 ); 3052 3053 b2 = ROL64((a40^d0), 3); 3054 b3 = ROL64((a21^d1), 45); 3055 b4 = ROL64((a02^d2), 61); 3056 b0 = ROL64((a33^d3), 28); 3057 b1 = ROL64((a14^d4), 20); 3058 a40 = b0 ^((~b1)& b2 ); 3059 a21 = b1 ^((~b2)& b3 ); 3060 a02 = b2 ^((~b3)& b4 ); 3061 a33 = b3 ^((~b4)& b0 ); 3062 a14 = b4 ^((~b0)& b1 ); 3063 3064 b4 = ROL64((a30^d0), 18); 3065 b0 = ROL64((a11^d1), 1); 3066 b1 = ROL64((a42^d2), 6); 3067 b2 = ROL64((a23^d3), 25); 3068 b3 = ROL64((a04^d4), 8); 3069 a30 = b0 ^((~b1)& b2 ); 3070 a11 = b1 ^((~b2)& b3 ); 3071 a42 = b2 ^((~b3)& b4 ); 3072 a23 = b3 ^((~b4)& b0 ); 3073 a04 = b4 ^((~b0)& b1 ); 3074 3075 b1 = ROL64((a20^d0), 36); 3076 b2 = ROL64((a01^d1), 10); 3077 b3 = ROL64((a32^d2), 15); 3078 b4 = ROL64((a13^d3), 56); 3079 b0 = ROL64((a44^d4), 27); 3080 a20 = b0 ^((~b1)& b2 ); 3081 a01 = b1 ^((~b2)& b3 ); 3082 a32 = b2 ^((~b3)& b4 ); 3083 a13 = b3 ^((~b4)& b0 ); 3084 a44 = b4 ^((~b0)& b1 ); 3085 3086 b3 = ROL64((a10^d0), 41); 3087 b4 = ROL64((a41^d1), 2); 3088 b0 = ROL64((a22^d2), 62); 3089 b1 = ROL64((a03^d3), 55); 3090 b2 = ROL64((a34^d4), 39); 3091 a10 = b0 ^((~b1)& b2 ); 3092 a41 = b1 ^((~b2)& b3 ); 3093 a22 = b2 ^((~b3)& b4 ); 3094 a03 = b3 ^((~b4)& b0 ); 3095 a34 = b4 ^((~b0)& b1 ); 3096 3097 c0 = a00^a40^a30^a20^a10; 3098 c1 = a31^a21^a11^a01^a41; 3099 c2 = a12^a02^a42^a32^a22; 3100 c3 = a43^a33^a23^a13^a03; 3101 c4 = a24^a14^a04^a44^a34; 3102 d0 = c4^ROL64(c1, 1); 3103 d1 = c0^ROL64(c2, 1); 3104 d2 = c1^ROL64(c3, 1); 3105 d3 = c2^ROL64(c4, 1); 3106 d4 = c3^ROL64(c0, 1); 3107 3108 b0 = (a00^d0); 3109 b1 = ROL64((a21^d1), 44); 3110 b2 = ROL64((a42^d2), 43); 3111 b3 = ROL64((a13^d3), 21); 3112 b4 = ROL64((a34^d4), 14); 3113 a00 = b0 ^((~b1)& b2 ); 3114 a00 ^= RC[i+2]; 3115 a21 = b1 ^((~b2)& b3 ); 3116 a42 = b2 ^((~b3)& b4 ); 3117 a13 = b3 ^((~b4)& b0 ); 3118 a34 = b4 ^((~b0)& b1 ); 3119 3120 b2 = ROL64((a30^d0), 3); 3121 b3 = ROL64((a01^d1), 45); 3122 b4 = ROL64((a22^d2), 61); 3123 b0 = ROL64((a43^d3), 28); 3124 b1 = ROL64((a14^d4), 20); 3125 a30 = b0 ^((~b1)& b2 ); 3126 a01 = b1 ^((~b2)& b3 ); 3127 a22 = b2 ^((~b3)& b4 ); 3128 a43 = b3 ^((~b4)& b0 ); 3129 a14 = b4 ^((~b0)& b1 ); 3130 3131 b4 = ROL64((a10^d0), 18); 3132 b0 = ROL64((a31^d1), 1); 3133 b1 = ROL64((a02^d2), 6); 3134 b2 = ROL64((a23^d3), 25); 3135 b3 = ROL64((a44^d4), 8); 3136 a10 = b0 ^((~b1)& b2 ); 3137 a31 = b1 ^((~b2)& b3 ); 3138 a02 = b2 ^((~b3)& b4 ); 3139 a23 = b3 ^((~b4)& b0 ); 3140 a44 = b4 ^((~b0)& b1 ); 3141 3142 b1 = ROL64((a40^d0), 36); 3143 b2 = ROL64((a11^d1), 10); 3144 b3 = ROL64((a32^d2), 15); 3145 b4 = ROL64((a03^d3), 56); 3146 b0 = ROL64((a24^d4), 27); 3147 a40 = b0 ^((~b1)& b2 ); 3148 a11 = b1 ^((~b2)& b3 ); 3149 a32 = b2 ^((~b3)& b4 ); 3150 a03 = b3 ^((~b4)& b0 ); 3151 a24 = b4 ^((~b0)& b1 ); 3152 3153 b3 = ROL64((a20^d0), 41); 3154 b4 = ROL64((a41^d1), 2); 3155 b0 = ROL64((a12^d2), 62); 3156 b1 = ROL64((a33^d3), 55); 3157 b2 = ROL64((a04^d4), 39); 3158 a20 = b0 ^((~b1)& b2 ); 3159 a41 = b1 ^((~b2)& b3 ); 3160 a12 = b2 ^((~b3)& b4 ); 3161 a33 = b3 ^((~b4)& b0 ); 3162 a04 = b4 ^((~b0)& b1 ); 3163 3164 c0 = a00^a30^a10^a40^a20; 3165 c1 = a21^a01^a31^a11^a41; 3166 c2 = a42^a22^a02^a32^a12; 3167 c3 = a13^a43^a23^a03^a33; 3168 c4 = a34^a14^a44^a24^a04; 3169 d0 = c4^ROL64(c1, 1); 3170 d1 = c0^ROL64(c2, 1); 3171 d2 = c1^ROL64(c3, 1); 3172 d3 = c2^ROL64(c4, 1); 3173 d4 = c3^ROL64(c0, 1); 3174 3175 b0 = (a00^d0); 3176 b1 = ROL64((a01^d1), 44); 3177 b2 = ROL64((a02^d2), 43); 3178 b3 = ROL64((a03^d3), 21); 3179 b4 = ROL64((a04^d4), 14); 3180 a00 = b0 ^((~b1)& b2 ); 3181 a00 ^= RC[i+3]; 3182 a01 = b1 ^((~b2)& b3 ); 3183 a02 = b2 ^((~b3)& b4 ); 3184 a03 = b3 ^((~b4)& b0 ); 3185 a04 = b4 ^((~b0)& b1 ); 3186 3187 b2 = ROL64((a10^d0), 3); 3188 b3 = ROL64((a11^d1), 45); 3189 b4 = ROL64((a12^d2), 61); 3190 b0 = ROL64((a13^d3), 28); 3191 b1 = ROL64((a14^d4), 20); 3192 a10 = b0 ^((~b1)& b2 ); 3193 a11 = b1 ^((~b2)& b3 ); 3194 a12 = b2 ^((~b3)& b4 ); 3195 a13 = b3 ^((~b4)& b0 ); 3196 a14 = b4 ^((~b0)& b1 ); 3197 3198 b4 = ROL64((a20^d0), 18); 3199 b0 = ROL64((a21^d1), 1); 3200 b1 = ROL64((a22^d2), 6); 3201 b2 = ROL64((a23^d3), 25); 3202 b3 = ROL64((a24^d4), 8); 3203 a20 = b0 ^((~b1)& b2 ); 3204 a21 = b1 ^((~b2)& b3 ); 3205 a22 = b2 ^((~b3)& b4 ); 3206 a23 = b3 ^((~b4)& b0 ); 3207 a24 = b4 ^((~b0)& b1 ); 3208 3209 b1 = ROL64((a30^d0), 36); 3210 b2 = ROL64((a31^d1), 10); 3211 b3 = ROL64((a32^d2), 15); 3212 b4 = ROL64((a33^d3), 56); 3213 b0 = ROL64((a34^d4), 27); 3214 a30 = b0 ^((~b1)& b2 ); 3215 a31 = b1 ^((~b2)& b3 ); 3216 a32 = b2 ^((~b3)& b4 ); 3217 a33 = b3 ^((~b4)& b0 ); 3218 a34 = b4 ^((~b0)& b1 ); 3219 3220 b3 = ROL64((a40^d0), 41); 3221 b4 = ROL64((a41^d1), 2); 3222 b0 = ROL64((a42^d2), 62); 3223 b1 = ROL64((a43^d3), 55); 3224 b2 = ROL64((a44^d4), 39); 3225 a40 = b0 ^((~b1)& b2 ); 3226 a41 = b1 ^((~b2)& b3 ); 3227 a42 = b2 ^((~b3)& b4 ); 3228 a43 = b3 ^((~b4)& b0 ); 3229 a44 = b4 ^((~b0)& b1 ); 3230 } 3231 } 3232 3233 /* 3234 ** Initialize a new hash. iSize determines the size of the hash 3235 ** in bits and should be one of 224, 256, 384, or 512. Or iSize 3236 ** can be zero to use the default hash size of 256 bits. 3237 */ 3238 static void SHA3Init(SHA3Context *p, int iSize){ 3239 memset(p, 0, sizeof(*p)); 3240 if( iSize>=128 && iSize<=512 ){ 3241 p->nRate = (1600 - ((iSize + 31)&~31)*2)/8; 3242 }else{ 3243 p->nRate = (1600 - 2*256)/8; 3244 } 3245 #if SHA3_BYTEORDER==1234 3246 /* Known to be little-endian at compile-time. No-op */ 3247 #elif SHA3_BYTEORDER==4321 3248 p->ixMask = 7; /* Big-endian */ 3249 #else 3250 { 3251 static unsigned int one = 1; 3252 if( 1==*(unsigned char*)&one ){ 3253 /* Little endian. No byte swapping. */ 3254 p->ixMask = 0; 3255 }else{ 3256 /* Big endian. Byte swap. */ 3257 p->ixMask = 7; 3258 } 3259 } 3260 #endif 3261 } 3262 3263 /* 3264 ** Make consecutive calls to the SHA3Update function to add new content 3265 ** to the hash 3266 */ 3267 static void SHA3Update( 3268 SHA3Context *p, 3269 const unsigned char *aData, 3270 unsigned int nData 3271 ){ 3272 unsigned int i = 0; 3273 if( aData==0 ) return; 3274 #if SHA3_BYTEORDER==1234 3275 if( (p->nLoaded % 8)==0 && ((aData - (const unsigned char*)0)&7)==0 ){ 3276 for(; i+7<nData; i+=8){ 3277 p->u.s[p->nLoaded/8] ^= *(u64*)&aData[i]; 3278 p->nLoaded += 8; 3279 if( p->nLoaded>=p->nRate ){ 3280 KeccakF1600Step(p); 3281 p->nLoaded = 0; 3282 } 3283 } 3284 } 3285 #endif 3286 for(; i<nData; i++){ 3287 #if SHA3_BYTEORDER==1234 3288 p->u.x[p->nLoaded] ^= aData[i]; 3289 #elif SHA3_BYTEORDER==4321 3290 p->u.x[p->nLoaded^0x07] ^= aData[i]; 3291 #else 3292 p->u.x[p->nLoaded^p->ixMask] ^= aData[i]; 3293 #endif 3294 p->nLoaded++; 3295 if( p->nLoaded==p->nRate ){ 3296 KeccakF1600Step(p); 3297 p->nLoaded = 0; 3298 } 3299 } 3300 } 3301 3302 /* 3303 ** After all content has been added, invoke SHA3Final() to compute 3304 ** the final hash. The function returns a pointer to the binary 3305 ** hash value. 3306 */ 3307 static unsigned char *SHA3Final(SHA3Context *p){ 3308 unsigned int i; 3309 if( p->nLoaded==p->nRate-1 ){ 3310 const unsigned char c1 = 0x86; 3311 SHA3Update(p, &c1, 1); 3312 }else{ 3313 const unsigned char c2 = 0x06; 3314 const unsigned char c3 = 0x80; 3315 SHA3Update(p, &c2, 1); 3316 p->nLoaded = p->nRate - 1; 3317 SHA3Update(p, &c3, 1); 3318 } 3319 for(i=0; i<p->nRate; i++){ 3320 p->u.x[i+p->nRate] = p->u.x[i^p->ixMask]; 3321 } 3322 return &p->u.x[p->nRate]; 3323 } 3324 /* End of the hashing logic 3325 *****************************************************************************/ 3326 3327 /* 3328 ** Implementation of the sha3(X,SIZE) function. 3329 ** 3330 ** Return a BLOB which is the SIZE-bit SHA3 hash of X. The default 3331 ** size is 256. If X is a BLOB, it is hashed as is. 3332 ** For all other non-NULL types of input, X is converted into a UTF-8 string 3333 ** and the string is hashed without the trailing 0x00 terminator. The hash 3334 ** of a NULL value is NULL. 3335 */ 3336 static void sha3Func( 3337 sqlite3_context *context, 3338 int argc, 3339 sqlite3_value **argv 3340 ){ 3341 SHA3Context cx; 3342 int eType = sqlite3_value_type(argv[0]); 3343 int nByte = sqlite3_value_bytes(argv[0]); 3344 int iSize; 3345 if( argc==1 ){ 3346 iSize = 256; 3347 }else{ 3348 iSize = sqlite3_value_int(argv[1]); 3349 if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){ 3350 sqlite3_result_error(context, "SHA3 size should be one of: 224 256 " 3351 "384 512", -1); 3352 return; 3353 } 3354 } 3355 if( eType==SQLITE_NULL ) return; 3356 SHA3Init(&cx, iSize); 3357 if( eType==SQLITE_BLOB ){ 3358 SHA3Update(&cx, sqlite3_value_blob(argv[0]), nByte); 3359 }else{ 3360 SHA3Update(&cx, sqlite3_value_text(argv[0]), nByte); 3361 } 3362 sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT); 3363 } 3364 3365 /* Compute a string using sqlite3_vsnprintf() with a maximum length 3366 ** of 50 bytes and add it to the hash. 3367 */ 3368 static void sha3_step_vformat( 3369 SHA3Context *p, /* Add content to this context */ 3370 const char *zFormat, 3371 ... 3372 ){ 3373 va_list ap; 3374 int n; 3375 char zBuf[50]; 3376 va_start(ap, zFormat); 3377 sqlite3_vsnprintf(sizeof(zBuf),zBuf,zFormat,ap); 3378 va_end(ap); 3379 n = (int)strlen(zBuf); 3380 SHA3Update(p, (unsigned char*)zBuf, n); 3381 } 3382 3383 /* 3384 ** Implementation of the sha3_query(SQL,SIZE) function. 3385 ** 3386 ** This function compiles and runs the SQL statement(s) given in the 3387 ** argument. The results are hashed using a SIZE-bit SHA3. The default 3388 ** size is 256. 3389 ** 3390 ** The format of the byte stream that is hashed is summarized as follows: 3391 ** 3392 ** S<n>:<sql> 3393 ** R 3394 ** N 3395 ** I<int> 3396 ** F<ieee-float> 3397 ** B<size>:<bytes> 3398 ** T<size>:<text> 3399 ** 3400 ** <sql> is the original SQL text for each statement run and <n> is 3401 ** the size of that text. The SQL text is UTF-8. A single R character 3402 ** occurs before the start of each row. N means a NULL value. 3403 ** I mean an 8-byte little-endian integer <int>. F is a floating point 3404 ** number with an 8-byte little-endian IEEE floating point value <ieee-float>. 3405 ** B means blobs of <size> bytes. T means text rendered as <size> 3406 ** bytes of UTF-8. The <n> and <size> values are expressed as an ASCII 3407 ** text integers. 3408 ** 3409 ** For each SQL statement in the X input, there is one S segment. Each 3410 ** S segment is followed by zero or more R segments, one for each row in the 3411 ** result set. After each R, there are one or more N, I, F, B, or T segments, 3412 ** one for each column in the result set. Segments are concatentated directly 3413 ** with no delimiters of any kind. 3414 */ 3415 static void sha3QueryFunc( 3416 sqlite3_context *context, 3417 int argc, 3418 sqlite3_value **argv 3419 ){ 3420 sqlite3 *db = sqlite3_context_db_handle(context); 3421 const char *zSql = (const char*)sqlite3_value_text(argv[0]); 3422 sqlite3_stmt *pStmt = 0; 3423 int nCol; /* Number of columns in the result set */ 3424 int i; /* Loop counter */ 3425 int rc; 3426 int n; 3427 const char *z; 3428 SHA3Context cx; 3429 int iSize; 3430 3431 if( argc==1 ){ 3432 iSize = 256; 3433 }else{ 3434 iSize = sqlite3_value_int(argv[1]); 3435 if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){ 3436 sqlite3_result_error(context, "SHA3 size should be one of: 224 256 " 3437 "384 512", -1); 3438 return; 3439 } 3440 } 3441 if( zSql==0 ) return; 3442 SHA3Init(&cx, iSize); 3443 while( zSql[0] ){ 3444 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zSql); 3445 if( rc ){ 3446 char *zMsg = sqlite3_mprintf("error SQL statement [%s]: %s", 3447 zSql, sqlite3_errmsg(db)); 3448 sqlite3_finalize(pStmt); 3449 sqlite3_result_error(context, zMsg, -1); 3450 sqlite3_free(zMsg); 3451 return; 3452 } 3453 if( !sqlite3_stmt_readonly(pStmt) ){ 3454 char *zMsg = sqlite3_mprintf("non-query: [%s]", sqlite3_sql(pStmt)); 3455 sqlite3_finalize(pStmt); 3456 sqlite3_result_error(context, zMsg, -1); 3457 sqlite3_free(zMsg); 3458 return; 3459 } 3460 nCol = sqlite3_column_count(pStmt); 3461 z = sqlite3_sql(pStmt); 3462 if( z ){ 3463 n = (int)strlen(z); 3464 sha3_step_vformat(&cx,"S%d:",n); 3465 SHA3Update(&cx,(unsigned char*)z,n); 3466 } 3467 3468 /* Compute a hash over the result of the query */ 3469 while( SQLITE_ROW==sqlite3_step(pStmt) ){ 3470 SHA3Update(&cx,(const unsigned char*)"R",1); 3471 for(i=0; i<nCol; i++){ 3472 switch( sqlite3_column_type(pStmt,i) ){ 3473 case SQLITE_NULL: { 3474 SHA3Update(&cx, (const unsigned char*)"N",1); 3475 break; 3476 } 3477 case SQLITE_INTEGER: { 3478 sqlite3_uint64 u; 3479 int j; 3480 unsigned char x[9]; 3481 sqlite3_int64 v = sqlite3_column_int64(pStmt,i); 3482 memcpy(&u, &v, 8); 3483 for(j=8; j>=1; j--){ 3484 x[j] = u & 0xff; 3485 u >>= 8; 3486 } 3487 x[0] = 'I'; 3488 SHA3Update(&cx, x, 9); 3489 break; 3490 } 3491 case SQLITE_FLOAT: { 3492 sqlite3_uint64 u; 3493 int j; 3494 unsigned char x[9]; 3495 double r = sqlite3_column_double(pStmt,i); 3496 memcpy(&u, &r, 8); 3497 for(j=8; j>=1; j--){ 3498 x[j] = u & 0xff; 3499 u >>= 8; 3500 } 3501 x[0] = 'F'; 3502 SHA3Update(&cx,x,9); 3503 break; 3504 } 3505 case SQLITE_TEXT: { 3506 int n2 = sqlite3_column_bytes(pStmt, i); 3507 const unsigned char *z2 = sqlite3_column_text(pStmt, i); 3508 sha3_step_vformat(&cx,"T%d:",n2); 3509 SHA3Update(&cx, z2, n2); 3510 break; 3511 } 3512 case SQLITE_BLOB: { 3513 int n2 = sqlite3_column_bytes(pStmt, i); 3514 const unsigned char *z2 = sqlite3_column_blob(pStmt, i); 3515 sha3_step_vformat(&cx,"B%d:",n2); 3516 SHA3Update(&cx, z2, n2); 3517 break; 3518 } 3519 } 3520 } 3521 } 3522 sqlite3_finalize(pStmt); 3523 } 3524 sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT); 3525 } 3526 3527 3528 #ifdef _WIN32 3529 3530 #endif 3531 int sqlite3_shathree_init( 3532 sqlite3 *db, 3533 char **pzErrMsg, 3534 const sqlite3_api_routines *pApi 3535 ){ 3536 int rc = SQLITE_OK; 3537 SQLITE_EXTENSION_INIT2(pApi); 3538 (void)pzErrMsg; /* Unused parameter */ 3539 rc = sqlite3_create_function(db, "sha3", 1, 3540 SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC, 3541 0, sha3Func, 0, 0); 3542 if( rc==SQLITE_OK ){ 3543 rc = sqlite3_create_function(db, "sha3", 2, 3544 SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC, 3545 0, sha3Func, 0, 0); 3546 } 3547 if( rc==SQLITE_OK ){ 3548 rc = sqlite3_create_function(db, "sha3_query", 1, 3549 SQLITE_UTF8 | SQLITE_DIRECTONLY, 3550 0, sha3QueryFunc, 0, 0); 3551 } 3552 if( rc==SQLITE_OK ){ 3553 rc = sqlite3_create_function(db, "sha3_query", 2, 3554 SQLITE_UTF8 | SQLITE_DIRECTONLY, 3555 0, sha3QueryFunc, 0, 0); 3556 } 3557 return rc; 3558 } 3559 3560 /************************* End ../ext/misc/shathree.c ********************/ 3561 /************************* Begin ../ext/misc/uint.c ******************/ 3562 /* 3563 ** 2020-04-14 3564 ** 3565 ** The author disclaims copyright to this source code. In place of 3566 ** a legal notice, here is a blessing: 3567 ** 3568 ** May you do good and not evil. 3569 ** May you find forgiveness for yourself and forgive others. 3570 ** May you share freely, never taking more than you give. 3571 ** 3572 ****************************************************************************** 3573 ** 3574 ** This SQLite extension implements the UINT collating sequence. 3575 ** 3576 ** UINT works like BINARY for text, except that embedded strings 3577 ** of digits compare in numeric order. 3578 ** 3579 ** * Leading zeros are handled properly, in the sense that 3580 ** they do not mess of the maginitude comparison of embedded 3581 ** strings of digits. "x00123y" is equal to "x123y". 3582 ** 3583 ** * Only unsigned integers are recognized. Plus and minus 3584 ** signs are ignored. Decimal points and exponential notation 3585 ** are ignored. 3586 ** 3587 ** * Embedded integers can be of arbitrary length. Comparison 3588 ** is *not* limited integers that can be expressed as a 3589 ** 64-bit machine integer. 3590 */ 3591 /* #include "sqlite3ext.h" */ 3592 SQLITE_EXTENSION_INIT1 3593 #include <assert.h> 3594 #include <string.h> 3595 #include <ctype.h> 3596 3597 /* 3598 ** Compare text in lexicographic order, except strings of digits 3599 ** compare in numeric order. 3600 */ 3601 static int uintCollFunc( 3602 void *notUsed, 3603 int nKey1, const void *pKey1, 3604 int nKey2, const void *pKey2 3605 ){ 3606 const unsigned char *zA = (const unsigned char*)pKey1; 3607 const unsigned char *zB = (const unsigned char*)pKey2; 3608 int i=0, j=0, x; 3609 (void)notUsed; 3610 while( i<nKey1 && j<nKey2 ){ 3611 x = zA[i] - zB[j]; 3612 if( isdigit(zA[i]) ){ 3613 int k; 3614 if( !isdigit(zB[j]) ) return x; 3615 while( i<nKey1 && zA[i]=='0' ){ i++; } 3616 while( j<nKey2 && zB[j]=='0' ){ j++; } 3617 k = 0; 3618 while( i+k<nKey1 && isdigit(zA[i+k]) 3619 && j+k<nKey2 && isdigit(zB[j+k]) ){ 3620 k++; 3621 } 3622 if( i+k<nKey1 && isdigit(zA[i+k]) ){ 3623 return +1; 3624 }else if( j+k<nKey2 && isdigit(zB[j+k]) ){ 3625 return -1; 3626 }else{ 3627 x = memcmp(zA+i, zB+j, k); 3628 if( x ) return x; 3629 i += k; 3630 j += k; 3631 } 3632 }else if( x ){ 3633 return x; 3634 }else{ 3635 i++; 3636 j++; 3637 } 3638 } 3639 return (nKey1 - i) - (nKey2 - j); 3640 } 3641 3642 #ifdef _WIN32 3643 3644 #endif 3645 int sqlite3_uint_init( 3646 sqlite3 *db, 3647 char **pzErrMsg, 3648 const sqlite3_api_routines *pApi 3649 ){ 3650 SQLITE_EXTENSION_INIT2(pApi); 3651 (void)pzErrMsg; /* Unused parameter */ 3652 return sqlite3_create_collation(db, "uint", SQLITE_UTF8, 0, uintCollFunc); 3653 } 3654 3655 /************************* End ../ext/misc/uint.c ********************/ 3656 /************************* Begin ../ext/misc/decimal.c ******************/ 3657 /* 3658 ** 2020-06-22 3659 ** 3660 ** The author disclaims copyright to this source code. In place of 3661 ** a legal notice, here is a blessing: 3662 ** 3663 ** May you do good and not evil. 3664 ** May you find forgiveness for yourself and forgive others. 3665 ** May you share freely, never taking more than you give. 3666 ** 3667 ****************************************************************************** 3668 ** 3669 ** Routines to implement arbitrary-precision decimal math. 3670 ** 3671 ** The focus here is on simplicity and correctness, not performance. 3672 */ 3673 /* #include "sqlite3ext.h" */ 3674 SQLITE_EXTENSION_INIT1 3675 #include <assert.h> 3676 #include <string.h> 3677 #include <ctype.h> 3678 #include <stdlib.h> 3679 3680 /* Mark a function parameter as unused, to suppress nuisance compiler 3681 ** warnings. */ 3682 #ifndef UNUSED_PARAMETER 3683 # define UNUSED_PARAMETER(X) (void)(X) 3684 #endif 3685 3686 3687 /* A decimal object */ 3688 typedef struct Decimal Decimal; 3689 struct Decimal { 3690 char sign; /* 0 for positive, 1 for negative */ 3691 char oom; /* True if an OOM is encountered */ 3692 char isNull; /* True if holds a NULL rather than a number */ 3693 char isInit; /* True upon initialization */ 3694 int nDigit; /* Total number of digits */ 3695 int nFrac; /* Number of digits to the right of the decimal point */ 3696 signed char *a; /* Array of digits. Most significant first. */ 3697 }; 3698 3699 /* 3700 ** Release memory held by a Decimal, but do not free the object itself. 3701 */ 3702 static void decimal_clear(Decimal *p){ 3703 sqlite3_free(p->a); 3704 } 3705 3706 /* 3707 ** Destroy a Decimal object 3708 */ 3709 static void decimal_free(Decimal *p){ 3710 if( p ){ 3711 decimal_clear(p); 3712 sqlite3_free(p); 3713 } 3714 } 3715 3716 /* 3717 ** Allocate a new Decimal object initialized to the text in zIn[]. 3718 ** Return NULL if any kind of error occurs. 3719 */ 3720 static Decimal *decimalNewFromText(const char *zIn, int n){ 3721 Decimal *p = 0; 3722 int i; 3723 int iExp = 0; 3724 3725 p = sqlite3_malloc( sizeof(*p) ); 3726 if( p==0 ) goto new_from_text_failed; 3727 p->sign = 0; 3728 p->oom = 0; 3729 p->isInit = 1; 3730 p->isNull = 0; 3731 p->nDigit = 0; 3732 p->nFrac = 0; 3733 p->a = sqlite3_malloc64( n+1 ); 3734 if( p->a==0 ) goto new_from_text_failed; 3735 for(i=0; isspace(zIn[i]); i++){} 3736 if( zIn[i]=='-' ){ 3737 p->sign = 1; 3738 i++; 3739 }else if( zIn[i]=='+' ){ 3740 i++; 3741 } 3742 while( i<n && zIn[i]=='0' ) i++; 3743 while( i<n ){ 3744 char c = zIn[i]; 3745 if( c>='0' && c<='9' ){ 3746 p->a[p->nDigit++] = c - '0'; 3747 }else if( c=='.' ){ 3748 p->nFrac = p->nDigit + 1; 3749 }else if( c=='e' || c=='E' ){ 3750 int j = i+1; 3751 int neg = 0; 3752 if( j>=n ) break; 3753 if( zIn[j]=='-' ){ 3754 neg = 1; 3755 j++; 3756 }else if( zIn[j]=='+' ){ 3757 j++; 3758 } 3759 while( j<n && iExp<1000000 ){ 3760 if( zIn[j]>='0' && zIn[j]<='9' ){ 3761 iExp = iExp*10 + zIn[j] - '0'; 3762 } 3763 j++; 3764 } 3765 if( neg ) iExp = -iExp; 3766 break; 3767 } 3768 i++; 3769 } 3770 if( p->nFrac ){ 3771 p->nFrac = p->nDigit - (p->nFrac - 1); 3772 } 3773 if( iExp>0 ){ 3774 if( p->nFrac>0 ){ 3775 if( iExp<=p->nFrac ){ 3776 p->nFrac -= iExp; 3777 iExp = 0; 3778 }else{ 3779 iExp -= p->nFrac; 3780 p->nFrac = 0; 3781 } 3782 } 3783 if( iExp>0 ){ 3784 p->a = sqlite3_realloc64(p->a, p->nDigit + iExp + 1 ); 3785 if( p->a==0 ) goto new_from_text_failed; 3786 memset(p->a+p->nDigit, 0, iExp); 3787 p->nDigit += iExp; 3788 } 3789 }else if( iExp<0 ){ 3790 int nExtra; 3791 iExp = -iExp; 3792 nExtra = p->nDigit - p->nFrac - 1; 3793 if( nExtra ){ 3794 if( nExtra>=iExp ){ 3795 p->nFrac += iExp; 3796 iExp = 0; 3797 }else{ 3798 iExp -= nExtra; 3799 p->nFrac = p->nDigit - 1; 3800 } 3801 } 3802 if( iExp>0 ){ 3803 p->a = sqlite3_realloc64(p->a, p->nDigit + iExp + 1 ); 3804 if( p->a==0 ) goto new_from_text_failed; 3805 memmove(p->a+iExp, p->a, p->nDigit); 3806 memset(p->a, 0, iExp); 3807 p->nDigit += iExp; 3808 p->nFrac += iExp; 3809 } 3810 } 3811 return p; 3812 3813 new_from_text_failed: 3814 if( p ){ 3815 if( p->a ) sqlite3_free(p->a); 3816 sqlite3_free(p); 3817 } 3818 return 0; 3819 } 3820 3821 /* Forward reference */ 3822 static Decimal *decimalFromDouble(double); 3823 3824 /* 3825 ** Allocate a new Decimal object from an sqlite3_value. Return a pointer 3826 ** to the new object, or NULL if there is an error. If the pCtx argument 3827 ** is not NULL, then errors are reported on it as well. 3828 ** 3829 ** If the pIn argument is SQLITE_TEXT or SQLITE_INTEGER, it is converted 3830 ** directly into a Decimal. For SQLITE_FLOAT or for SQLITE_BLOB of length 3831 ** 8 bytes, the resulting double value is expanded into its decimal equivalent. 3832 ** If pIn is NULL or if it is a BLOB that is not exactly 8 bytes in length, 3833 ** then NULL is returned. 3834 */ 3835 static Decimal *decimal_new( 3836 sqlite3_context *pCtx, /* Report error here, if not null */ 3837 sqlite3_value *pIn, /* Construct the decimal object from this */ 3838 int bTextOnly /* Always interpret pIn as text if true */ 3839 ){ 3840 Decimal *p = 0; 3841 int eType = sqlite3_value_type(pIn); 3842 if( bTextOnly && (eType==SQLITE_FLOAT || eType==SQLITE_BLOB) ){ 3843 eType = SQLITE_TEXT; 3844 } 3845 switch( eType ){ 3846 case SQLITE_TEXT: 3847 case SQLITE_INTEGER: { 3848 const char *zIn = (const char*)sqlite3_value_text(pIn); 3849 int n = sqlite3_value_bytes(pIn); 3850 p = decimalNewFromText(zIn, n); 3851 if( p==0 ) goto new_failed; 3852 break; 3853 } 3854 3855 case SQLITE_FLOAT: { 3856 p = decimalFromDouble(sqlite3_value_double(pIn)); 3857 break; 3858 } 3859 3860 case SQLITE_BLOB: { 3861 const unsigned char *x; 3862 unsigned int i; 3863 sqlite3_uint64 v = 0; 3864 double r; 3865 3866 if( sqlite3_value_bytes(pIn)!=sizeof(r) ) break; 3867 x = sqlite3_value_blob(pIn); 3868 for(i=0; i<sizeof(r); i++){ 3869 v = (v<<8) | x[i]; 3870 } 3871 memcpy(&r, &v, sizeof(r)); 3872 p = decimalFromDouble(r); 3873 break; 3874 } 3875 3876 case SQLITE_NULL: { 3877 break; 3878 } 3879 } 3880 return p; 3881 3882 new_failed: 3883 if( pCtx ) sqlite3_result_error_nomem(pCtx); 3884 sqlite3_free(p); 3885 return 0; 3886 } 3887 3888 /* 3889 ** Make the given Decimal the result. 3890 */ 3891 static void decimal_result(sqlite3_context *pCtx, Decimal *p){ 3892 char *z; 3893 int i, j; 3894 int n; 3895 if( p==0 || p->oom ){ 3896 sqlite3_result_error_nomem(pCtx); 3897 return; 3898 } 3899 if( p->isNull ){ 3900 sqlite3_result_null(pCtx); 3901 return; 3902 } 3903 z = sqlite3_malloc( p->nDigit+4 ); 3904 if( z==0 ){ 3905 sqlite3_result_error_nomem(pCtx); 3906 return; 3907 } 3908 i = 0; 3909 if( p->nDigit==0 || (p->nDigit==1 && p->a[0]==0) ){ 3910 p->sign = 0; 3911 } 3912 if( p->sign ){ 3913 z[0] = '-'; 3914 i = 1; 3915 } 3916 n = p->nDigit - p->nFrac; 3917 if( n<=0 ){ 3918 z[i++] = '0'; 3919 } 3920 j = 0; 3921 while( n>1 && p->a[j]==0 ){ 3922 j++; 3923 n--; 3924 } 3925 while( n>0 ){ 3926 z[i++] = p->a[j] + '0'; 3927 j++; 3928 n--; 3929 } 3930 if( p->nFrac ){ 3931 z[i++] = '.'; 3932 do{ 3933 z[i++] = p->a[j] + '0'; 3934 j++; 3935 }while( j<p->nDigit ); 3936 } 3937 z[i] = 0; 3938 sqlite3_result_text(pCtx, z, i, sqlite3_free); 3939 } 3940 3941 /* 3942 ** Make the given Decimal the result in an format similar to '%+#e'. 3943 ** In other words, show exponential notation with leading and trailing 3944 ** zeros omitted. 3945 */ 3946 static void decimal_result_sci(sqlite3_context *pCtx, Decimal *p){ 3947 char *z; /* The output buffer */ 3948 int i; /* Loop counter */ 3949 int nZero; /* Number of leading zeros */ 3950 int nDigit; /* Number of digits not counting trailing zeros */ 3951 int nFrac; /* Digits to the right of the decimal point */ 3952 int exp; /* Exponent value */ 3953 signed char zero; /* Zero value */ 3954 signed char *a; /* Array of digits */ 3955 3956 if( p==0 || p->oom ){ 3957 sqlite3_result_error_nomem(pCtx); 3958 return; 3959 } 3960 if( p->isNull ){ 3961 sqlite3_result_null(pCtx); 3962 return; 3963 } 3964 for(nDigit=p->nDigit; nDigit>0 && p->a[nDigit-1]==0; nDigit--){} 3965 for(nZero=0; nZero<nDigit && p->a[nZero]==0; nZero++){} 3966 nFrac = p->nFrac + (nDigit - p->nDigit); 3967 nDigit -= nZero; 3968 z = sqlite3_malloc( nDigit+20 ); 3969 if( z==0 ){ 3970 sqlite3_result_error_nomem(pCtx); 3971 return; 3972 } 3973 if( nDigit==0 ){ 3974 zero = 0; 3975 a = &zero; 3976 nDigit = 1; 3977 nFrac = 0; 3978 }else{ 3979 a = &p->a[nZero]; 3980 } 3981 if( p->sign && nDigit>0 ){ 3982 z[0] = '-'; 3983 }else{ 3984 z[0] = '+'; 3985 } 3986 z[1] = a[0]+'0'; 3987 z[2] = '.'; 3988 if( nDigit==1 ){ 3989 z[3] = '0'; 3990 i = 4; 3991 }else{ 3992 for(i=1; i<nDigit; i++){ 3993 z[2+i] = a[i]+'0'; 3994 } 3995 i = nDigit+2; 3996 } 3997 exp = nDigit - nFrac - 1; 3998 sqlite3_snprintf(nDigit+20-i, &z[i], "e%+03d", exp); 3999 sqlite3_result_text(pCtx, z, -1, sqlite3_free); 4000 } 4001 4002 /* 4003 ** Compare to Decimal objects. Return negative, 0, or positive if the 4004 ** first object is less than, equal to, or greater than the second. 4005 ** 4006 ** Preconditions for this routine: 4007 ** 4008 ** pA!=0 4009 ** pA->isNull==0 4010 ** pB!=0 4011 ** pB->isNull==0 4012 */ 4013 static int decimal_cmp(const Decimal *pA, const Decimal *pB){ 4014 int nASig, nBSig, rc, n; 4015 if( pA->sign!=pB->sign ){ 4016 return pA->sign ? -1 : +1; 4017 } 4018 if( pA->sign ){ 4019 const Decimal *pTemp = pA; 4020 pA = pB; 4021 pB = pTemp; 4022 } 4023 nASig = pA->nDigit - pA->nFrac; 4024 nBSig = pB->nDigit - pB->nFrac; 4025 if( nASig!=nBSig ){ 4026 return nASig - nBSig; 4027 } 4028 n = pA->nDigit; 4029 if( n>pB->nDigit ) n = pB->nDigit; 4030 rc = memcmp(pA->a, pB->a, n); 4031 if( rc==0 ){ 4032 rc = pA->nDigit - pB->nDigit; 4033 } 4034 return rc; 4035 } 4036 4037 /* 4038 ** SQL Function: decimal_cmp(X, Y) 4039 ** 4040 ** Return negative, zero, or positive if X is less then, equal to, or 4041 ** greater than Y. 4042 */ 4043 static void decimalCmpFunc( 4044 sqlite3_context *context, 4045 int argc, 4046 sqlite3_value **argv 4047 ){ 4048 Decimal *pA = 0, *pB = 0; 4049 int rc; 4050 4051 UNUSED_PARAMETER(argc); 4052 pA = decimal_new(context, argv[0], 1); 4053 if( pA==0 || pA->isNull ) goto cmp_done; 4054 pB = decimal_new(context, argv[1], 1); 4055 if( pB==0 || pB->isNull ) goto cmp_done; 4056 rc = decimal_cmp(pA, pB); 4057 if( rc<0 ) rc = -1; 4058 else if( rc>0 ) rc = +1; 4059 sqlite3_result_int(context, rc); 4060 cmp_done: 4061 decimal_free(pA); 4062 decimal_free(pB); 4063 } 4064 4065 /* 4066 ** Expand the Decimal so that it has a least nDigit digits and nFrac 4067 ** digits to the right of the decimal point. 4068 */ 4069 static void decimal_expand(Decimal *p, int nDigit, int nFrac){ 4070 int nAddSig; 4071 int nAddFrac; 4072 if( p==0 ) return; 4073 nAddFrac = nFrac - p->nFrac; 4074 nAddSig = (nDigit - p->nDigit) - nAddFrac; 4075 if( nAddFrac==0 && nAddSig==0 ) return; 4076 p->a = sqlite3_realloc64(p->a, nDigit+1); 4077 if( p->a==0 ){ 4078 p->oom = 1; 4079 return; 4080 } 4081 if( nAddSig ){ 4082 memmove(p->a+nAddSig, p->a, p->nDigit); 4083 memset(p->a, 0, nAddSig); 4084 p->nDigit += nAddSig; 4085 } 4086 if( nAddFrac ){ 4087 memset(p->a+p->nDigit, 0, nAddFrac); 4088 p->nDigit += nAddFrac; 4089 p->nFrac += nAddFrac; 4090 } 4091 } 4092 4093 /* 4094 ** Add the value pB into pA. A := A + B. 4095 ** 4096 ** Both pA and pB might become denormalized by this routine. 4097 */ 4098 static void decimal_add(Decimal *pA, Decimal *pB){ 4099 int nSig, nFrac, nDigit; 4100 int i, rc; 4101 if( pA==0 ){ 4102 return; 4103 } 4104 if( pA->oom || pB==0 || pB->oom ){ 4105 pA->oom = 1; 4106 return; 4107 } 4108 if( pA->isNull || pB->isNull ){ 4109 pA->isNull = 1; 4110 return; 4111 } 4112 nSig = pA->nDigit - pA->nFrac; 4113 if( nSig && pA->a[0]==0 ) nSig--; 4114 if( nSig<pB->nDigit-pB->nFrac ){ 4115 nSig = pB->nDigit - pB->nFrac; 4116 } 4117 nFrac = pA->nFrac; 4118 if( nFrac<pB->nFrac ) nFrac = pB->nFrac; 4119 nDigit = nSig + nFrac + 1; 4120 decimal_expand(pA, nDigit, nFrac); 4121 decimal_expand(pB, nDigit, nFrac); 4122 if( pA->oom || pB->oom ){ 4123 pA->oom = 1; 4124 }else{ 4125 if( pA->sign==pB->sign ){ 4126 int carry = 0; 4127 for(i=nDigit-1; i>=0; i--){ 4128 int x = pA->a[i] + pB->a[i] + carry; 4129 if( x>=10 ){ 4130 carry = 1; 4131 pA->a[i] = x - 10; 4132 }else{ 4133 carry = 0; 4134 pA->a[i] = x; 4135 } 4136 } 4137 }else{ 4138 signed char *aA, *aB; 4139 int borrow = 0; 4140 rc = memcmp(pA->a, pB->a, nDigit); 4141 if( rc<0 ){ 4142 aA = pB->a; 4143 aB = pA->a; 4144 pA->sign = !pA->sign; 4145 }else{ 4146 aA = pA->a; 4147 aB = pB->a; 4148 } 4149 for(i=nDigit-1; i>=0; i--){ 4150 int x = aA[i] - aB[i] - borrow; 4151 if( x<0 ){ 4152 pA->a[i] = x+10; 4153 borrow = 1; 4154 }else{ 4155 pA->a[i] = x; 4156 borrow = 0; 4157 } 4158 } 4159 } 4160 } 4161 } 4162 4163 /* 4164 ** Multiply A by B. A := A * B 4165 ** 4166 ** All significant digits after the decimal point are retained. 4167 ** Trailing zeros after the decimal point are omitted as long as 4168 ** the number of digits after the decimal point is no less than 4169 ** either the number of digits in either input. 4170 */ 4171 static void decimalMul(Decimal *pA, Decimal *pB){ 4172 signed char *acc = 0; 4173 int i, j, k; 4174 int minFrac; 4175 4176 if( pA==0 || pA->oom || pA->isNull 4177 || pB==0 || pB->oom || pB->isNull 4178 ){ 4179 goto mul_end; 4180 } 4181 acc = sqlite3_malloc64( pA->nDigit + pB->nDigit + 2 ); 4182 if( acc==0 ){ 4183 pA->oom = 1; 4184 goto mul_end; 4185 } 4186 memset(acc, 0, pA->nDigit + pB->nDigit + 2); 4187 minFrac = pA->nFrac; 4188 if( pB->nFrac<minFrac ) minFrac = pB->nFrac; 4189 for(i=pA->nDigit-1; i>=0; i--){ 4190 signed char f = pA->a[i]; 4191 int carry = 0, x; 4192 for(j=pB->nDigit-1, k=i+j+3; j>=0; j--, k--){ 4193 x = acc[k] + f*pB->a[j] + carry; 4194 acc[k] = x%10; 4195 carry = x/10; 4196 } 4197 x = acc[k] + carry; 4198 acc[k] = x%10; 4199 acc[k-1] += x/10; 4200 } 4201 sqlite3_free(pA->a); 4202 pA->a = acc; 4203 acc = 0; 4204 pA->nDigit += pB->nDigit + 2; 4205 pA->nFrac += pB->nFrac; 4206 pA->sign ^= pB->sign; 4207 while( pA->nFrac>minFrac && pA->a[pA->nDigit-1]==0 ){ 4208 pA->nFrac--; 4209 pA->nDigit--; 4210 } 4211 4212 mul_end: 4213 sqlite3_free(acc); 4214 } 4215 4216 /* 4217 ** Create a new Decimal object that contains an integer power of 2. 4218 */ 4219 static Decimal *decimalPow2(int N){ 4220 Decimal *pA = 0; /* The result to be returned */ 4221 Decimal *pX = 0; /* Multiplier */ 4222 if( N<-20000 || N>20000 ) goto pow2_fault; 4223 pA = decimalNewFromText("1.0", 3); 4224 if( pA==0 || pA->oom ) goto pow2_fault; 4225 if( N==0 ) return pA; 4226 if( N>0 ){ 4227 pX = decimalNewFromText("2.0", 3); 4228 }else{ 4229 N = -N; 4230 pX = decimalNewFromText("0.5", 3); 4231 } 4232 if( pX==0 || pX->oom ) goto pow2_fault; 4233 while( 1 /* Exit by break */ ){ 4234 if( N & 1 ){ 4235 decimalMul(pA, pX); 4236 if( pA->oom ) goto pow2_fault; 4237 } 4238 N >>= 1; 4239 if( N==0 ) break; 4240 decimalMul(pX, pX); 4241 } 4242 decimal_free(pX); 4243 return pA; 4244 4245 pow2_fault: 4246 decimal_free(pA); 4247 decimal_free(pX); 4248 return 0; 4249 } 4250 4251 /* 4252 ** Use an IEEE754 binary64 ("double") to generate a new Decimal object. 4253 */ 4254 static Decimal *decimalFromDouble(double r){ 4255 sqlite3_int64 m, a; 4256 int e; 4257 int isNeg; 4258 Decimal *pA; 4259 Decimal *pX; 4260 char zNum[100]; 4261 if( r<0.0 ){ 4262 isNeg = 1; 4263 r = -r; 4264 }else{ 4265 isNeg = 0; 4266 } 4267 memcpy(&a,&r,sizeof(a)); 4268 if( a==0 ){ 4269 e = 0; 4270 m = 0; 4271 }else{ 4272 e = a>>52; 4273 m = a & ((((sqlite3_int64)1)<<52)-1); 4274 if( e==0 ){ 4275 m <<= 1; 4276 }else{ 4277 m |= ((sqlite3_int64)1)<<52; 4278 } 4279 while( e<1075 && m>0 && (m&1)==0 ){ 4280 m >>= 1; 4281 e++; 4282 } 4283 if( isNeg ) m = -m; 4284 e = e - 1075; 4285 if( e>971 ){ 4286 return 0; /* A NaN or an Infinity */ 4287 } 4288 } 4289 4290 /* At this point m is the integer significand and e is the exponent */ 4291 sqlite3_snprintf(sizeof(zNum), zNum, "%lld", m); 4292 pA = decimalNewFromText(zNum, (int)strlen(zNum)); 4293 pX = decimalPow2(e); 4294 decimalMul(pA, pX); 4295 decimal_free(pX); 4296 return pA; 4297 } 4298 4299 /* 4300 ** SQL Function: decimal(X) 4301 ** OR: decimal_exp(X) 4302 ** 4303 ** Convert input X into decimal and then back into text. 4304 ** 4305 ** If X is originally a float, then a full decimal expansion of that floating 4306 ** point value is done. Or if X is an 8-byte blob, it is interpreted 4307 ** as a float and similarly expanded. 4308 ** 4309 ** The decimal_exp(X) function returns the result in exponential notation. 4310 ** decimal(X) returns a complete decimal, without the e+NNN at the end. 4311 */ 4312 static void decimalFunc( 4313 sqlite3_context *context, 4314 int argc, 4315 sqlite3_value **argv 4316 ){ 4317 Decimal *p = decimal_new(context, argv[0], 0); 4318 UNUSED_PARAMETER(argc); 4319 if( p ){ 4320 if( sqlite3_user_data(context)!=0 ){ 4321 decimal_result_sci(context, p); 4322 }else{ 4323 decimal_result(context, p); 4324 } 4325 decimal_free(p); 4326 } 4327 } 4328 4329 /* 4330 ** Compare text in decimal order. 4331 */ 4332 static int decimalCollFunc( 4333 void *notUsed, 4334 int nKey1, const void *pKey1, 4335 int nKey2, const void *pKey2 4336 ){ 4337 const unsigned char *zA = (const unsigned char*)pKey1; 4338 const unsigned char *zB = (const unsigned char*)pKey2; 4339 Decimal *pA = decimalNewFromText((const char*)zA, nKey1); 4340 Decimal *pB = decimalNewFromText((const char*)zB, nKey2); 4341 int rc; 4342 UNUSED_PARAMETER(notUsed); 4343 if( pA==0 || pB==0 ){ 4344 rc = 0; 4345 }else{ 4346 rc = decimal_cmp(pA, pB); 4347 } 4348 decimal_free(pA); 4349 decimal_free(pB); 4350 return rc; 4351 } 4352 4353 4354 /* 4355 ** SQL Function: decimal_add(X, Y) 4356 ** decimal_sub(X, Y) 4357 ** 4358 ** Return the sum or difference of X and Y. 4359 */ 4360 static void decimalAddFunc( 4361 sqlite3_context *context, 4362 int argc, 4363 sqlite3_value **argv 4364 ){ 4365 Decimal *pA = decimal_new(context, argv[0], 1); 4366 Decimal *pB = decimal_new(context, argv[1], 1); 4367 UNUSED_PARAMETER(argc); 4368 decimal_add(pA, pB); 4369 decimal_result(context, pA); 4370 decimal_free(pA); 4371 decimal_free(pB); 4372 } 4373 static void decimalSubFunc( 4374 sqlite3_context *context, 4375 int argc, 4376 sqlite3_value **argv 4377 ){ 4378 Decimal *pA = decimal_new(context, argv[0], 1); 4379 Decimal *pB = decimal_new(context, argv[1], 1); 4380 UNUSED_PARAMETER(argc); 4381 if( pB ){ 4382 pB->sign = !pB->sign; 4383 decimal_add(pA, pB); 4384 decimal_result(context, pA); 4385 } 4386 decimal_free(pA); 4387 decimal_free(pB); 4388 } 4389 4390 /* Aggregate funcion: decimal_sum(X) 4391 ** 4392 ** Works like sum() except that it uses decimal arithmetic for unlimited 4393 ** precision. 4394 */ 4395 static void decimalSumStep( 4396 sqlite3_context *context, 4397 int argc, 4398 sqlite3_value **argv 4399 ){ 4400 Decimal *p; 4401 Decimal *pArg; 4402 UNUSED_PARAMETER(argc); 4403 p = sqlite3_aggregate_context(context, sizeof(*p)); 4404 if( p==0 ) return; 4405 if( !p->isInit ){ 4406 p->isInit = 1; 4407 p->a = sqlite3_malloc(2); 4408 if( p->a==0 ){ 4409 p->oom = 1; 4410 }else{ 4411 p->a[0] = 0; 4412 } 4413 p->nDigit = 1; 4414 p->nFrac = 0; 4415 } 4416 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; 4417 pArg = decimal_new(context, argv[0], 1); 4418 decimal_add(p, pArg); 4419 decimal_free(pArg); 4420 } 4421 static void decimalSumInverse( 4422 sqlite3_context *context, 4423 int argc, 4424 sqlite3_value **argv 4425 ){ 4426 Decimal *p; 4427 Decimal *pArg; 4428 UNUSED_PARAMETER(argc); 4429 p = sqlite3_aggregate_context(context, sizeof(*p)); 4430 if( p==0 ) return; 4431 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; 4432 pArg = decimal_new(context, argv[0], 1); 4433 if( pArg ) pArg->sign = !pArg->sign; 4434 decimal_add(p, pArg); 4435 decimal_free(pArg); 4436 } 4437 static void decimalSumValue(sqlite3_context *context){ 4438 Decimal *p = sqlite3_aggregate_context(context, 0); 4439 if( p==0 ) return; 4440 decimal_result(context, p); 4441 } 4442 static void decimalSumFinalize(sqlite3_context *context){ 4443 Decimal *p = sqlite3_aggregate_context(context, 0); 4444 if( p==0 ) return; 4445 decimal_result(context, p); 4446 decimal_clear(p); 4447 } 4448 4449 /* 4450 ** SQL Function: decimal_mul(X, Y) 4451 ** 4452 ** Return the product of X and Y. 4453 */ 4454 static void decimalMulFunc( 4455 sqlite3_context *context, 4456 int argc, 4457 sqlite3_value **argv 4458 ){ 4459 Decimal *pA = decimal_new(context, argv[0], 1); 4460 Decimal *pB = decimal_new(context, argv[1], 1); 4461 UNUSED_PARAMETER(argc); 4462 if( pA==0 || pA->oom || pA->isNull 4463 || pB==0 || pB->oom || pB->isNull 4464 ){ 4465 goto mul_end; 4466 } 4467 decimalMul(pA, pB); 4468 if( pA->oom ){ 4469 goto mul_end; 4470 } 4471 decimal_result(context, pA); 4472 4473 mul_end: 4474 decimal_free(pA); 4475 decimal_free(pB); 4476 } 4477 4478 /* 4479 ** SQL Function: decimal_pow2(N) 4480 ** 4481 ** Return the N-th power of 2. N must be an integer. 4482 */ 4483 static void decimalPow2Func( 4484 sqlite3_context *context, 4485 int argc, 4486 sqlite3_value **argv 4487 ){ 4488 UNUSED_PARAMETER(argc); 4489 if( sqlite3_value_type(argv[0])==SQLITE_INTEGER ){ 4490 Decimal *pA = decimalPow2(sqlite3_value_int(argv[0])); 4491 decimal_result_sci(context, pA); 4492 decimal_free(pA); 4493 } 4494 } 4495 4496 #ifdef _WIN32 4497 4498 #endif 4499 int sqlite3_decimal_init( 4500 sqlite3 *db, 4501 char **pzErrMsg, 4502 const sqlite3_api_routines *pApi 4503 ){ 4504 int rc = SQLITE_OK; 4505 static const struct { 4506 const char *zFuncName; 4507 int nArg; 4508 int iArg; 4509 void (*xFunc)(sqlite3_context*,int,sqlite3_value**); 4510 } aFunc[] = { 4511 { "decimal", 1, 0, decimalFunc }, 4512 { "decimal_exp", 1, 1, decimalFunc }, 4513 { "decimal_cmp", 2, 0, decimalCmpFunc }, 4514 { "decimal_add", 2, 0, decimalAddFunc }, 4515 { "decimal_sub", 2, 0, decimalSubFunc }, 4516 { "decimal_mul", 2, 0, decimalMulFunc }, 4517 { "decimal_pow2", 1, 0, decimalPow2Func }, 4518 }; 4519 unsigned int i; 4520 (void)pzErrMsg; /* Unused parameter */ 4521 4522 SQLITE_EXTENSION_INIT2(pApi); 4523 4524 for(i=0; i<(int)(sizeof(aFunc)/sizeof(aFunc[0])) && rc==SQLITE_OK; i++){ 4525 rc = sqlite3_create_function(db, aFunc[i].zFuncName, aFunc[i].nArg, 4526 SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC, 4527 aFunc[i].iArg ? db : 0, aFunc[i].xFunc, 0, 0); 4528 } 4529 if( rc==SQLITE_OK ){ 4530 rc = sqlite3_create_window_function(db, "decimal_sum", 1, 4531 SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC, 0, 4532 decimalSumStep, decimalSumFinalize, 4533 decimalSumValue, decimalSumInverse, 0); 4534 } 4535 if( rc==SQLITE_OK ){ 4536 rc = sqlite3_create_collation(db, "decimal", SQLITE_UTF8, 4537 0, decimalCollFunc); 4538 } 4539 return rc; 4540 } 4541 4542 /************************* End ../ext/misc/decimal.c ********************/ 4543 #undef sqlite3_base_init 4544 #define sqlite3_base_init sqlite3_base64_init 4545 /************************* Begin ../ext/misc/base64.c ******************/ 4546 /* 4547 ** 2022-11-18 4548 ** 4549 ** The author disclaims copyright to this source code. In place of 4550 ** a legal notice, here is a blessing: 4551 ** 4552 ** May you do good and not evil. 4553 ** May you find forgiveness for yourself and forgive others. 4554 ** May you share freely, never taking more than you give. 4555 ** 4556 ************************************************************************* 4557 ** 4558 ** This is a SQLite extension for converting in either direction 4559 ** between a (binary) blob and base64 text. Base64 can transit a 4560 ** sane USASCII channel unmolested. It also plays nicely in CSV or 4561 ** written as TCL brace-enclosed literals or SQL string literals, 4562 ** and can be used unmodified in XML-like documents. 4563 ** 4564 ** This is an independent implementation of conversions specified in 4565 ** RFC 4648, done on the above date by the author (Larry Brasfield) 4566 ** who thereby has the right to put this into the public domain. 4567 ** 4568 ** The conversions meet RFC 4648 requirements, provided that this 4569 ** C source specifies that line-feeds are included in the encoded 4570 ** data to limit visible line lengths to 72 characters and to 4571 ** terminate any encoded blob having non-zero length. 4572 ** 4573 ** Length limitations are not imposed except that the runtime 4574 ** SQLite string or blob length limits are respected. Otherwise, 4575 ** any length binary sequence can be represented and recovered. 4576 ** Generated base64 sequences, with their line-feeds included, 4577 ** can be concatenated; the result converted back to binary will 4578 ** be the concatenation of the represented binary sequences. 4579 ** 4580 ** This SQLite3 extension creates a function, base64(x), which 4581 ** either: converts text x containing base64 to a returned blob; 4582 ** or converts a blob x to returned text containing base64. An 4583 ** error will be thrown for other input argument types. 4584 ** 4585 ** This code relies on UTF-8 encoding only with respect to the 4586 ** meaning of the first 128 (7-bit) codes matching that of USASCII. 4587 ** It will fail miserably if somehow made to try to convert EBCDIC. 4588 ** Because it is table-driven, it could be enhanced to handle that, 4589 ** but the world and SQLite have moved on from that anachronism. 4590 ** 4591 ** To build the extension: 4592 ** Set shell variable SQDIR=<your favorite SQLite checkout directory> 4593 ** *Nix: gcc -O2 -shared -I$SQDIR -fPIC -o base64.so base64.c 4594 ** OSX: gcc -O2 -dynamiclib -fPIC -I$SQDIR -o base64.dylib base64.c 4595 ** Win32: gcc -O2 -shared -I%SQDIR% -o base64.dll base64.c 4596 ** Win32: cl /Os -I%SQDIR% base64.c -link -dll -out:base64.dll 4597 */ 4598 4599 #include <assert.h> 4600 4601 /* #include "sqlite3ext.h" */ 4602 4603 #ifndef deliberate_fall_through 4604 /* Quiet some compilers about some of our intentional code. */ 4605 # if GCC_VERSION>=7000000 4606 # define deliberate_fall_through __attribute__((fallthrough)); 4607 # else 4608 # define deliberate_fall_through 4609 # endif 4610 #endif 4611 4612 SQLITE_EXTENSION_INIT1; 4613 4614 #define PC 0x80 /* pad character */ 4615 #define WS 0x81 /* whitespace */ 4616 #define ND 0x82 /* Not above or digit-value */ 4617 #define PAD_CHAR '=' 4618 4619 #ifndef U8_TYPEDEF 4620 /* typedef unsigned char u8; */ 4621 #define U8_TYPEDEF 4622 #endif 4623 4624 /* Decoding table, ASCII (7-bit) value to base 64 digit value or other */ 4625 static const u8 b64DigitValues[128] = { 4626 /* HT LF VT FF CR */ 4627 ND,ND,ND,ND, ND,ND,ND,ND, ND,WS,WS,WS, WS,WS,ND,ND, 4628 /* US */ 4629 ND,ND,ND,ND, ND,ND,ND,ND, ND,ND,ND,ND, ND,ND,ND,ND, 4630 /*sp + / */ 4631 WS,ND,ND,ND, ND,ND,ND,ND, ND,ND,ND,62, ND,ND,ND,63, 4632 /* 0 1 5 9 = */ 4633 52,53,54,55, 56,57,58,59, 60,61,ND,ND, ND,PC,ND,ND, 4634 /* A O */ 4635 ND, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14, 4636 /* P Z */ 4637 15,16,17,18, 19,20,21,22, 23,24,25,ND, ND,ND,ND,ND, 4638 /* a o */ 4639 ND,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40, 4640 /* p z */ 4641 41,42,43,44, 45,46,47,48, 49,50,51,ND, ND,ND,ND,ND 4642 }; 4643 4644 static const char b64Numerals[64+1] 4645 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 4646 4647 #define BX_DV_PROTO(c) \ 4648 ((((u8)(c))<0x80)? (u8)(b64DigitValues[(u8)(c)]) : 0x80) 4649 #define IS_BX_DIGIT(bdp) (((u8)(bdp))<0x80) 4650 #define IS_BX_WS(bdp) ((bdp)==WS) 4651 #define IS_BX_PAD(bdp) ((bdp)==PC) 4652 #define BX_NUMERAL(dv) (b64Numerals[(u8)(dv)]) 4653 /* Width of base64 lines. Should be an integer multiple of 4. */ 4654 #define B64_DARK_MAX 72 4655 4656 /* Encode a byte buffer into base64 text with linefeeds appended to limit 4657 ** encoded group lengths to B64_DARK_MAX or to terminate the last group. 4658 */ 4659 static char* toBase64( u8 *pIn, int nbIn, char *pOut ){ 4660 int nCol = 0; 4661 while( nbIn >= 3 ){ 4662 /* Do the bit-shuffle, exploiting unsigned input to avoid masking. */ 4663 pOut[0] = BX_NUMERAL(pIn[0]>>2); 4664 pOut[1] = BX_NUMERAL(((pIn[0]<<4)|(pIn[1]>>4))&0x3f); 4665 pOut[2] = BX_NUMERAL(((pIn[1]&0xf)<<2)|(pIn[2]>>6)); 4666 pOut[3] = BX_NUMERAL(pIn[2]&0x3f); 4667 pOut += 4; 4668 nbIn -= 3; 4669 pIn += 3; 4670 if( (nCol += 4)>=B64_DARK_MAX || nbIn<=0 ){ 4671 *pOut++ = '\n'; 4672 nCol = 0; 4673 } 4674 } 4675 if( nbIn > 0 ){ 4676 signed char nco = nbIn+1; 4677 int nbe; 4678 unsigned long qv = *pIn++; 4679 for( nbe=1; nbe<3; ++nbe ){ 4680 qv <<= 8; 4681 if( nbe<nbIn ) qv |= *pIn++; 4682 } 4683 for( nbe=3; nbe>=0; --nbe ){ 4684 char ce = (nbe<nco)? BX_NUMERAL((u8)(qv & 0x3f)) : PAD_CHAR; 4685 qv >>= 6; 4686 pOut[nbe] = ce; 4687 } 4688 pOut += 4; 4689 *pOut++ = '\n'; 4690 } 4691 *pOut = 0; 4692 return pOut; 4693 } 4694 4695 /* Skip over text which is not base64 numeral(s). */ 4696 static char * skipNonB64( char *s, int nc ){ 4697 char c; 4698 while( nc-- > 0 && (c = *s) && !IS_BX_DIGIT(BX_DV_PROTO(c)) ) ++s; 4699 return s; 4700 } 4701 4702 /* Decode base64 text into a byte buffer. */ 4703 static u8* fromBase64( char *pIn, int ncIn, u8 *pOut ){ 4704 if( ncIn>0 && pIn[ncIn-1]=='\n' ) --ncIn; 4705 while( ncIn>0 && *pIn!=PAD_CHAR ){ 4706 static signed char nboi[] = { 0, 0, 1, 2, 3 }; 4707 char *pUse = skipNonB64(pIn, ncIn); 4708 unsigned long qv = 0L; 4709 int nti, nbo, nac; 4710 ncIn -= (pUse - pIn); 4711 pIn = pUse; 4712 nti = (ncIn>4)? 4 : ncIn; 4713 ncIn -= nti; 4714 nbo = nboi[nti]; 4715 if( nbo==0 ) break; 4716 for( nac=0; nac<4; ++nac ){ 4717 char c = (nac<nti)? *pIn++ : b64Numerals[0]; 4718 u8 bdp = BX_DV_PROTO(c); 4719 switch( bdp ){ 4720 case ND: 4721 /* Treat dark non-digits as pad, but they terminate decode too. */ 4722 ncIn = 0; 4723 deliberate_fall_through; 4724 case WS: 4725 /* Treat whitespace as pad and terminate this group.*/ 4726 nti = nac; 4727 deliberate_fall_through; 4728 case PC: 4729 bdp = 0; 4730 --nbo; 4731 deliberate_fall_through; 4732 default: /* bdp is the digit value. */ 4733 qv = qv<<6 | bdp; 4734 break; 4735 } 4736 } 4737 switch( nbo ){ 4738 case 3: 4739 pOut[2] = (qv) & 0xff; 4740 case 2: 4741 pOut[1] = (qv>>8) & 0xff; 4742 case 1: 4743 pOut[0] = (qv>>16) & 0xff; 4744 } 4745 pOut += nbo; 4746 } 4747 return pOut; 4748 } 4749 4750 /* This function does the work for the SQLite base64(x) UDF. */ 4751 static void base64(sqlite3_context *context, int na, sqlite3_value *av[]){ 4752 int nb, nc, nv = sqlite3_value_bytes(av[0]); 4753 int nvMax = sqlite3_limit(sqlite3_context_db_handle(context), 4754 SQLITE_LIMIT_LENGTH, -1); 4755 char *cBuf; 4756 u8 *bBuf; 4757 assert(na==1); 4758 switch( sqlite3_value_type(av[0]) ){ 4759 case SQLITE_BLOB: 4760 nb = nv; 4761 nc = 4*(nv+2/3); /* quads needed */ 4762 nc += (nc+(B64_DARK_MAX-1))/B64_DARK_MAX + 1; /* LFs and a 0-terminator */ 4763 if( nvMax < nc ){ 4764 sqlite3_result_error(context, "blob expanded to base64 too big", -1); 4765 return; 4766 } 4767 bBuf = (u8*)sqlite3_value_blob(av[0]); 4768 if( !bBuf ){ 4769 if( SQLITE_NOMEM==sqlite3_errcode(sqlite3_context_db_handle(context)) ){ 4770 goto memFail; 4771 } 4772 sqlite3_result_text(context,"",-1,SQLITE_STATIC); 4773 break; 4774 } 4775 cBuf = sqlite3_malloc(nc); 4776 if( !cBuf ) goto memFail; 4777 nc = (int)(toBase64(bBuf, nb, cBuf) - cBuf); 4778 sqlite3_result_text(context, cBuf, nc, sqlite3_free); 4779 break; 4780 case SQLITE_TEXT: 4781 nc = nv; 4782 nb = 3*((nv+3)/4); /* may overestimate due to LF and padding */ 4783 if( nvMax < nb ){ 4784 sqlite3_result_error(context, "blob from base64 may be too big", -1); 4785 return; 4786 }else if( nb<1 ){ 4787 nb = 1; 4788 } 4789 cBuf = (char *)sqlite3_value_text(av[0]); 4790 if( !cBuf ){ 4791 if( SQLITE_NOMEM==sqlite3_errcode(sqlite3_context_db_handle(context)) ){ 4792 goto memFail; 4793 } 4794 sqlite3_result_zeroblob(context, 0); 4795 break; 4796 } 4797 bBuf = sqlite3_malloc(nb); 4798 if( !bBuf ) goto memFail; 4799 nb = (int)(fromBase64(cBuf, nc, bBuf) - bBuf); 4800 sqlite3_result_blob(context, bBuf, nb, sqlite3_free); 4801 break; 4802 default: 4803 sqlite3_result_error(context, "base64 accepts only blob or text", -1); 4804 return; 4805 } 4806 return; 4807 memFail: 4808 sqlite3_result_error(context, "base64 OOM", -1); 4809 } 4810 4811 /* 4812 ** Establish linkage to running SQLite library. 4813 */ 4814 #ifndef SQLITE_SHELL_EXTFUNCS 4815 #ifdef _WIN32 4816 4817 #endif 4818 int sqlite3_base_init 4819 #else 4820 static int sqlite3_base64_init 4821 #endif 4822 (sqlite3 *db, char **pzErr, const sqlite3_api_routines *pApi){ 4823 SQLITE_EXTENSION_INIT2(pApi); 4824 (void)pzErr; 4825 return sqlite3_create_function 4826 (db, "base64", 1, 4827 SQLITE_DETERMINISTIC|SQLITE_INNOCUOUS|SQLITE_DIRECTONLY|SQLITE_UTF8, 4828 0, base64, 0, 0); 4829 } 4830 4831 /* 4832 ** Define some macros to allow this extension to be built into the shell 4833 ** conveniently, in conjunction with use of SQLITE_SHELL_EXTFUNCS. This 4834 ** allows shell.c, as distributed, to have this extension built in. 4835 */ 4836 #define BASE64_INIT(db) sqlite3_base64_init(db, 0, 0) 4837 #define BASE64_EXPOSE(db, pzErr) /* Not needed, ..._init() does this. */ 4838 4839 /************************* End ../ext/misc/base64.c ********************/ 4840 #undef sqlite3_base_init 4841 #define sqlite3_base_init sqlite3_base85_init 4842 #define OMIT_BASE85_CHECKER 4843 /************************* Begin ../ext/misc/base85.c ******************/ 4844 /* 4845 ** 2022-11-16 4846 ** 4847 ** The author disclaims copyright to this source code. In place of 4848 ** a legal notice, here is a blessing: 4849 ** 4850 ** May you do good and not evil. 4851 ** May you find forgiveness for yourself and forgive others. 4852 ** May you share freely, never taking more than you give. 4853 ** 4854 ************************************************************************* 4855 ** 4856 ** This is a utility for converting binary to base85 or vice-versa. 4857 ** It can be built as a standalone program or an SQLite3 extension. 4858 ** 4859 ** Much like base64 representations, base85 can be sent through a 4860 ** sane USASCII channel unmolested. It also plays nicely in CSV or 4861 ** written as TCL brace-enclosed literals or SQL string literals. 4862 ** It is not suited for unmodified use in XML-like documents. 4863 ** 4864 ** The encoding used resembles Ascii85, but was devised by the author 4865 ** (Larry Brasfield) before Mozilla, Adobe, ZMODEM or other Ascii85 4866 ** variant sources existed, in the 1984 timeframe on a VAX mainframe. 4867 ** Further, this is an independent implementation of a base85 system. 4868 ** Hence, the author has rightfully put this into the public domain. 4869 ** 4870 ** Base85 numerals are taken from the set of 7-bit USASCII codes, 4871 ** excluding control characters and Space ! " ' ( ) { | } ~ Del 4872 ** in code order representing digit values 0 to 84 (base 10.) 4873 ** 4874 ** Groups of 4 bytes, interpreted as big-endian 32-bit values, 4875 ** are represented as 5-digit base85 numbers with MS to LS digit 4876 ** order. Groups of 1-3 bytes are represented with 2-4 digits, 4877 ** still big-endian but 8-24 bit values. (Using big-endian yields 4878 ** the simplest transition to byte groups smaller than 4 bytes. 4879 ** These byte groups can also be considered base-256 numbers.) 4880 ** Groups of 0 bytes are represented with 0 digits and vice-versa. 4881 ** No pad characters are used; Encoded base85 numeral sequence 4882 ** (aka "group") length maps 1-to-1 to the decoded binary length. 4883 ** 4884 ** Any character not in the base85 numeral set delimits groups. 4885 ** When base85 is streamed or stored in containers of indefinite 4886 ** size, newline is used to separate it into sub-sequences of no 4887 ** more than 80 digits so that fgets() can be used to read it. 4888 ** 4889 ** Length limitations are not imposed except that the runtime 4890 ** SQLite string or blob length limits are respected. Otherwise, 4891 ** any length binary sequence can be represented and recovered. 4892 ** Base85 sequences can be concatenated by separating them with 4893 ** a non-base85 character; the conversion to binary will then 4894 ** be the concatenation of the represented binary sequences. 4895 4896 ** The standalone program either converts base85 on stdin to create 4897 ** a binary file or converts a binary file to base85 on stdout. 4898 ** Read or make it blurt its help for invocation details. 4899 ** 4900 ** The SQLite3 extension creates a function, base85(x), which will 4901 ** either convert text base85 to a blob or a blob to text base85 4902 ** and return the result (or throw an error for other types.) 4903 ** Unless built with OMIT_BASE85_CHECKER defined, it also creates a 4904 ** function, is_base85(t), which returns 1 iff the text t contains 4905 ** nothing other than base85 numerals and whitespace, or 0 otherwise. 4906 ** 4907 ** To build the extension: 4908 ** Set shell variable SQDIR=<your favorite SQLite checkout directory> 4909 ** and variable OPTS to -DOMIT_BASE85_CHECKER if is_base85() unwanted. 4910 ** *Nix: gcc -O2 -shared -I$SQDIR $OPTS -fPIC -o base85.so base85.c 4911 ** OSX: gcc -O2 -dynamiclib -fPIC -I$SQDIR $OPTS -o base85.dylib base85.c 4912 ** Win32: gcc -O2 -shared -I%SQDIR% %OPTS% -o base85.dll base85.c 4913 ** Win32: cl /Os -I%SQDIR% %OPTS% base85.c -link -dll -out:base85.dll 4914 ** 4915 ** To build the standalone program, define PP symbol BASE85_STANDALONE. Eg. 4916 ** *Nix or OSX: gcc -O2 -DBASE85_STANDALONE base85.c -o base85 4917 ** Win32: gcc -O2 -DBASE85_STANDALONE -o base85.exe base85.c 4918 ** Win32: cl /Os /MD -DBASE85_STANDALONE base85.c 4919 */ 4920 4921 #include <stdio.h> 4922 #include <memory.h> 4923 #include <string.h> 4924 #include <assert.h> 4925 #ifndef OMIT_BASE85_CHECKER 4926 # include <ctype.h> 4927 #endif 4928 4929 #ifndef BASE85_STANDALONE 4930 4931 /* # include "sqlite3ext.h" */ 4932 4933 SQLITE_EXTENSION_INIT1; 4934 4935 #else 4936 4937 # ifdef _WIN32 4938 # include <io.h> 4939 # include <fcntl.h> 4940 # else 4941 # define setmode(fd,m) 4942 # endif 4943 4944 static char *zHelp = 4945 "Usage: base85 <dirFlag> <binFile>\n" 4946 " <dirFlag> is either -r to read or -w to write <binFile>,\n" 4947 " content to be converted to/from base85 on stdout/stdin.\n" 4948 " <binFile> names a binary file to be rendered or created.\n" 4949 " Or, the name '-' refers to the stdin or stdout stream.\n" 4950 ; 4951 4952 static void sayHelp(){ 4953 printf("%s", zHelp); 4954 } 4955 #endif 4956 4957 #ifndef U8_TYPEDEF 4958 /* typedef unsigned char u8; */ 4959 #define U8_TYPEDEF 4960 #endif 4961 4962 /* Classify c according to interval within USASCII set w.r.t. base85 4963 * Values of 1 and 3 are base85 numerals. Values of 0, 2, or 4 are not. 4964 */ 4965 #define B85_CLASS( c ) (((c)>='#')+((c)>'&')+((c)>='*')+((c)>'z')) 4966 4967 /* Provide digitValue to b85Numeral offset as a function of above class. */ 4968 static u8 b85_cOffset[] = { 0, '#', 0, '*'-4, 0 }; 4969 #define B85_DNOS( c ) b85_cOffset[B85_CLASS(c)] 4970 4971 /* Say whether c is a base85 numeral. */ 4972 #define IS_B85( c ) (B85_CLASS(c) & 1) 4973 4974 #if 0 /* Not used, */ 4975 static u8 base85DigitValue( char c ){ 4976 u8 dv = (u8)(c - '#'); 4977 if( dv>87 ) return 0xff; 4978 return (dv > 3)? dv-3 : dv; 4979 } 4980 #endif 4981 4982 /* Width of base64 lines. Should be an integer multiple of 5. */ 4983 #define B85_DARK_MAX 80 4984 4985 4986 static char * skipNonB85( char *s, int nc ){ 4987 char c; 4988 while( nc-- > 0 && (c = *s) && !IS_B85(c) ) ++s; 4989 return s; 4990 } 4991 4992 /* Convert small integer, known to be in 0..84 inclusive, to base85 numeral. 4993 * Do not use the macro form with argument expression having a side-effect.*/ 4994 #if 0 4995 static char base85Numeral( u8 b ){ 4996 return (b < 4)? (char)(b + '#') : (char)(b - 4 + '*'); 4997 } 4998 #else 4999 # define base85Numeral( dn )\ 5000 ((char)(((dn) < 4)? (char)((dn) + '#') : (char)((dn) - 4 + '*'))) 5001 #endif 5002 5003 static char *putcs(char *pc, char *s){ 5004 char c; 5005 while( (c = *s++)!=0 ) *pc++ = c; 5006 return pc; 5007 } 5008 5009 /* Encode a byte buffer into base85 text. If pSep!=0, it's a C string 5010 ** to be appended to encoded groups to limit their length to B85_DARK_MAX 5011 ** or to terminate the last group (to aid concatenation.) 5012 */ 5013 static char* toBase85( u8 *pIn, int nbIn, char *pOut, char *pSep ){ 5014 int nCol = 0; 5015 while( nbIn >= 4 ){ 5016 int nco = 5; 5017 unsigned long qbv = (((unsigned long)pIn[0])<<24) | 5018 (pIn[1]<<16) | (pIn[2]<<8) | pIn[3]; 5019 while( nco > 0 ){ 5020 unsigned nqv = (unsigned)(qbv/85UL); 5021 unsigned char dv = qbv - 85UL*nqv; 5022 qbv = nqv; 5023 pOut[--nco] = base85Numeral(dv); 5024 } 5025 nbIn -= 4; 5026 pIn += 4; 5027 pOut += 5; 5028 if( pSep && (nCol += 5)>=B85_DARK_MAX ){ 5029 pOut = putcs(pOut, pSep); 5030 nCol = 0; 5031 } 5032 } 5033 if( nbIn > 0 ){ 5034 int nco = nbIn + 1; 5035 unsigned long qv = *pIn++; 5036 int nbe = 1; 5037 while( nbe++ < nbIn ){ 5038 qv = (qv<<8) | *pIn++; 5039 } 5040 nCol += nco; 5041 while( nco > 0 ){ 5042 u8 dv = (u8)(qv % 85); 5043 qv /= 85; 5044 pOut[--nco] = base85Numeral(dv); 5045 } 5046 pOut += (nbIn+1); 5047 } 5048 if( pSep && nCol>0 ) pOut = putcs(pOut, pSep); 5049 *pOut = 0; 5050 return pOut; 5051 } 5052 5053 /* Decode base85 text into a byte buffer. */ 5054 static u8* fromBase85( char *pIn, int ncIn, u8 *pOut ){ 5055 if( ncIn>0 && pIn[ncIn-1]=='\n' ) --ncIn; 5056 while( ncIn>0 ){ 5057 static signed char nboi[] = { 0, 0, 1, 2, 3, 4 }; 5058 char *pUse = skipNonB85(pIn, ncIn); 5059 unsigned long qv = 0L; 5060 int nti, nbo; 5061 ncIn -= (pUse - pIn); 5062 pIn = pUse; 5063 nti = (ncIn>5)? 5 : ncIn; 5064 nbo = nboi[nti]; 5065 if( nbo==0 ) break; 5066 while( nti>0 ){ 5067 char c = *pIn++; 5068 u8 cdo = B85_DNOS(c); 5069 --ncIn; 5070 if( cdo==0 ) break; 5071 qv = 85 * qv + (c - cdo); 5072 --nti; 5073 } 5074 nbo -= nti; /* Adjust for early (non-digit) end of group. */ 5075 switch( nbo ){ 5076 case 4: 5077 *pOut++ = (qv >> 24)&0xff; 5078 case 3: 5079 *pOut++ = (qv >> 16)&0xff; 5080 case 2: 5081 *pOut++ = (qv >> 8)&0xff; 5082 case 1: 5083 *pOut++ = qv&0xff; 5084 case 0: 5085 break; 5086 } 5087 } 5088 return pOut; 5089 } 5090 5091 #ifndef OMIT_BASE85_CHECKER 5092 /* Say whether input char sequence is all (base85 and/or whitespace).*/ 5093 static int allBase85( char *p, int len ){ 5094 char c; 5095 while( len-- > 0 && (c = *p++) != 0 ){ 5096 if( !IS_B85(c) && !isspace(c) ) return 0; 5097 } 5098 return 1; 5099 } 5100 #endif 5101 5102 #ifndef BASE85_STANDALONE 5103 5104 # ifndef OMIT_BASE85_CHECKER 5105 /* This function does the work for the SQLite is_base85(t) UDF. */ 5106 static void is_base85(sqlite3_context *context, int na, sqlite3_value *av[]){ 5107 assert(na==1); 5108 switch( sqlite3_value_type(av[0]) ){ 5109 case SQLITE_TEXT: 5110 { 5111 int rv = allBase85( (char *)sqlite3_value_text(av[0]), 5112 sqlite3_value_bytes(av[0]) ); 5113 sqlite3_result_int(context, rv); 5114 } 5115 break; 5116 case SQLITE_NULL: 5117 sqlite3_result_null(context); 5118 break; 5119 default: 5120 sqlite3_result_error(context, "is_base85 accepts only text or NULL", -1); 5121 return; 5122 } 5123 } 5124 # endif 5125 5126 /* This function does the work for the SQLite base85(x) UDF. */ 5127 static void base85(sqlite3_context *context, int na, sqlite3_value *av[]){ 5128 int nb, nc, nv = sqlite3_value_bytes(av[0]); 5129 int nvMax = sqlite3_limit(sqlite3_context_db_handle(context), 5130 SQLITE_LIMIT_LENGTH, -1); 5131 char *cBuf; 5132 u8 *bBuf; 5133 assert(na==1); 5134 switch( sqlite3_value_type(av[0]) ){ 5135 case SQLITE_BLOB: 5136 nb = nv; 5137 /* ulongs tail newlines tailenc+nul*/ 5138 nc = 5*(nv/4) + nv%4 + nv/64+1 + 2; 5139 if( nvMax < nc ){ 5140 sqlite3_result_error(context, "blob expanded to base85 too big", -1); 5141 return; 5142 } 5143 bBuf = (u8*)sqlite3_value_blob(av[0]); 5144 if( !bBuf ){ 5145 if( SQLITE_NOMEM==sqlite3_errcode(sqlite3_context_db_handle(context)) ){ 5146 goto memFail; 5147 } 5148 sqlite3_result_text(context,"",-1,SQLITE_STATIC); 5149 break; 5150 } 5151 cBuf = sqlite3_malloc(nc); 5152 if( !cBuf ) goto memFail; 5153 nc = (int)(toBase85(bBuf, nb, cBuf, "\n") - cBuf); 5154 sqlite3_result_text(context, cBuf, nc, sqlite3_free); 5155 break; 5156 case SQLITE_TEXT: 5157 nc = nv; 5158 nb = 4*(nv/5) + nv%5; /* may overestimate */ 5159 if( nvMax < nb ){ 5160 sqlite3_result_error(context, "blob from base85 may be too big", -1); 5161 return; 5162 }else if( nb<1 ){ 5163 nb = 1; 5164 } 5165 cBuf = (char *)sqlite3_value_text(av[0]); 5166 if( !cBuf ){ 5167 if( SQLITE_NOMEM==sqlite3_errcode(sqlite3_context_db_handle(context)) ){ 5168 goto memFail; 5169 } 5170 sqlite3_result_zeroblob(context, 0); 5171 break; 5172 } 5173 bBuf = sqlite3_malloc(nb); 5174 if( !bBuf ) goto memFail; 5175 nb = (int)(fromBase85(cBuf, nc, bBuf) - bBuf); 5176 sqlite3_result_blob(context, bBuf, nb, sqlite3_free); 5177 break; 5178 default: 5179 sqlite3_result_error(context, "base85 accepts only blob or text.", -1); 5180 return; 5181 } 5182 return; 5183 memFail: 5184 sqlite3_result_error(context, "base85 OOM", -1); 5185 } 5186 5187 /* 5188 ** Establish linkage to running SQLite library. 5189 */ 5190 #ifndef SQLITE_SHELL_EXTFUNCS 5191 #ifdef _WIN32 5192 5193 #endif 5194 int sqlite3_base_init 5195 #else 5196 static int sqlite3_base85_init 5197 #endif 5198 (sqlite3 *db, char **pzErr, const sqlite3_api_routines *pApi){ 5199 SQLITE_EXTENSION_INIT2(pApi); 5200 (void)pzErr; 5201 # ifndef OMIT_BASE85_CHECKER 5202 { 5203 int rc = sqlite3_create_function 5204 (db, "is_base85", 1, 5205 SQLITE_DETERMINISTIC|SQLITE_INNOCUOUS|SQLITE_UTF8, 5206 0, is_base85, 0, 0); 5207 if( rc!=SQLITE_OK ) return rc; 5208 } 5209 # endif 5210 return sqlite3_create_function 5211 (db, "base85", 1, 5212 SQLITE_DETERMINISTIC|SQLITE_INNOCUOUS|SQLITE_DIRECTONLY|SQLITE_UTF8, 5213 0, base85, 0, 0); 5214 } 5215 5216 /* 5217 ** Define some macros to allow this extension to be built into the shell 5218 ** conveniently, in conjunction with use of SQLITE_SHELL_EXTFUNCS. This 5219 ** allows shell.c, as distributed, to have this extension built in. 5220 */ 5221 # define BASE85_INIT(db) sqlite3_base85_init(db, 0, 0) 5222 # define BASE85_EXPOSE(db, pzErr) /* Not needed, ..._init() does this. */ 5223 5224 #else /* standalone program */ 5225 5226 int main(int na, char *av[]){ 5227 int cin; 5228 int rc = 0; 5229 u8 bBuf[4*(B85_DARK_MAX/5)]; 5230 char cBuf[5*(sizeof(bBuf)/4)+2]; 5231 size_t nio; 5232 # ifndef OMIT_BASE85_CHECKER 5233 int b85Clean = 1; 5234 # endif 5235 char rw; 5236 FILE *fb = 0, *foc = 0; 5237 char fmode[3] = "xb"; 5238 if( na < 3 || av[1][0]!='-' || (rw = av[1][1])==0 || (rw!='r' && rw!='w') ){ 5239 sayHelp(); 5240 return 0; 5241 } 5242 fmode[0] = rw; 5243 if( av[2][0]=='-' && av[2][1]==0 ){ 5244 switch( rw ){ 5245 case 'r': 5246 fb = stdin; 5247 setmode(fileno(stdin), O_BINARY); 5248 break; 5249 case 'w': 5250 fb = stdout; 5251 setmode(fileno(stdout), O_BINARY); 5252 break; 5253 } 5254 }else{ 5255 fb = fopen(av[2], fmode); 5256 foc = fb; 5257 } 5258 if( !fb ){ 5259 fprintf(stderr, "Cannot open %s for %c\n", av[2], rw); 5260 rc = 1; 5261 }else{ 5262 switch( rw ){ 5263 case 'r': 5264 while( (nio = fread( bBuf, 1, sizeof(bBuf), fb))>0 ){ 5265 toBase85( bBuf, (int)nio, cBuf, 0 ); 5266 fprintf(stdout, "%s\n", cBuf); 5267 } 5268 break; 5269 case 'w': 5270 while( 0 != fgets(cBuf, sizeof(cBuf), stdin) ){ 5271 int nc = strlen(cBuf); 5272 size_t nbo = fromBase85( cBuf, nc, bBuf ) - bBuf; 5273 if( 1 != fwrite(bBuf, nbo, 1, fb) ) rc = 1; 5274 # ifndef OMIT_BASE85_CHECKER 5275 b85Clean &= allBase85( cBuf, nc ); 5276 # endif 5277 } 5278 break; 5279 default: 5280 sayHelp(); 5281 rc = 1; 5282 } 5283 if( foc ) fclose(foc); 5284 } 5285 # ifndef OMIT_BASE85_CHECKER 5286 if( !b85Clean ){ 5287 fprintf(stderr, "Base85 input had non-base85 dark or control content.\n"); 5288 } 5289 # endif 5290 return rc; 5291 } 5292 5293 #endif 5294 5295 /************************* End ../ext/misc/base85.c ********************/ 5296 /************************* Begin ../ext/misc/ieee754.c ******************/ 5297 /* 5298 ** 2013-04-17 5299 ** 5300 ** The author disclaims copyright to this source code. In place of 5301 ** a legal notice, here is a blessing: 5302 ** 5303 ** May you do good and not evil. 5304 ** May you find forgiveness for yourself and forgive others. 5305 ** May you share freely, never taking more than you give. 5306 ** 5307 ****************************************************************************** 5308 ** 5309 ** This SQLite extension implements functions for the exact display 5310 ** and input of IEEE754 Binary64 floating-point numbers. 5311 ** 5312 ** ieee754(X) 5313 ** ieee754(Y,Z) 5314 ** 5315 ** In the first form, the value X should be a floating-point number. 5316 ** The function will return a string of the form 'ieee754(Y,Z)' where 5317 ** Y and Z are integers such that X==Y*pow(2,Z). 5318 ** 5319 ** In the second form, Y and Z are integers which are the mantissa and 5320 ** base-2 exponent of a new floating point number. The function returns 5321 ** a floating-point value equal to Y*pow(2,Z). 5322 ** 5323 ** Examples: 5324 ** 5325 ** ieee754(2.0) -> 'ieee754(2,0)' 5326 ** ieee754(45.25) -> 'ieee754(181,-2)' 5327 ** ieee754(2, 0) -> 2.0 5328 ** ieee754(181, -2) -> 45.25 5329 ** 5330 ** Two additional functions break apart the one-argument ieee754() 5331 ** result into separate integer values: 5332 ** 5333 ** ieee754_mantissa(45.25) -> 181 5334 ** ieee754_exponent(45.25) -> -2 5335 ** 5336 ** These functions convert binary64 numbers into blobs and back again. 5337 ** 5338 ** ieee754_from_blob(x'3ff0000000000000') -> 1.0 5339 ** ieee754_to_blob(1.0) -> x'3ff0000000000000' 5340 ** 5341 ** In all single-argument functions, if the argument is an 8-byte blob 5342 ** then that blob is interpreted as a big-endian binary64 value. 5343 ** 5344 ** 5345 ** EXACT DECIMAL REPRESENTATION OF BINARY64 VALUES 5346 ** ----------------------------------------------- 5347 ** 5348 ** This extension in combination with the separate 'decimal' extension 5349 ** can be used to compute the exact decimal representation of binary64 5350 ** values. To begin, first compute a table of exponent values: 5351 ** 5352 ** CREATE TABLE pow2(x INTEGER PRIMARY KEY, v TEXT); 5353 ** WITH RECURSIVE c(x,v) AS ( 5354 ** VALUES(0,'1') 5355 ** UNION ALL 5356 ** SELECT x+1, decimal_mul(v,'2') FROM c WHERE x+1<=971 5357 ** ) INSERT INTO pow2(x,v) SELECT x, v FROM c; 5358 ** WITH RECURSIVE c(x,v) AS ( 5359 ** VALUES(-1,'0.5') 5360 ** UNION ALL 5361 ** SELECT x-1, decimal_mul(v,'0.5') FROM c WHERE x-1>=-1075 5362 ** ) INSERT INTO pow2(x,v) SELECT x, v FROM c; 5363 ** 5364 ** Then, to compute the exact decimal representation of a floating 5365 ** point value (the value 47.49 is used in the example) do: 5366 ** 5367 ** WITH c(n) AS (VALUES(47.49)) 5368 ** ---------------^^^^^---- Replace with whatever you want 5369 ** SELECT decimal_mul(ieee754_mantissa(c.n),pow2.v) 5370 ** FROM pow2, c WHERE pow2.x=ieee754_exponent(c.n); 5371 ** 5372 ** Here is a query to show various boundry values for the binary64 5373 ** number format: 5374 ** 5375 ** WITH c(name,bin) AS (VALUES 5376 ** ('minimum positive value', x'0000000000000001'), 5377 ** ('maximum subnormal value', x'000fffffffffffff'), 5378 ** ('mininum positive nornal value', x'0010000000000000'), 5379 ** ('maximum value', x'7fefffffffffffff')) 5380 ** SELECT c.name, decimal_mul(ieee754_mantissa(c.bin),pow2.v) 5381 ** FROM pow2, c WHERE pow2.x=ieee754_exponent(c.bin); 5382 ** 5383 */ 5384 /* #include "sqlite3ext.h" */ 5385 SQLITE_EXTENSION_INIT1 5386 #include <assert.h> 5387 #include <string.h> 5388 5389 /* Mark a function parameter as unused, to suppress nuisance compiler 5390 ** warnings. */ 5391 #ifndef UNUSED_PARAMETER 5392 # define UNUSED_PARAMETER(X) (void)(X) 5393 #endif 5394 5395 /* 5396 ** Implementation of the ieee754() function 5397 */ 5398 static void ieee754func( 5399 sqlite3_context *context, 5400 int argc, 5401 sqlite3_value **argv 5402 ){ 5403 if( argc==1 ){ 5404 sqlite3_int64 m, a; 5405 double r; 5406 int e; 5407 int isNeg; 5408 char zResult[100]; 5409 assert( sizeof(m)==sizeof(r) ); 5410 if( sqlite3_value_type(argv[0])==SQLITE_BLOB 5411 && sqlite3_value_bytes(argv[0])==sizeof(r) 5412 ){ 5413 const unsigned char *x = sqlite3_value_blob(argv[0]); 5414 unsigned int i; 5415 sqlite3_uint64 v = 0; 5416 for(i=0; i<sizeof(r); i++){ 5417 v = (v<<8) | x[i]; 5418 } 5419 memcpy(&r, &v, sizeof(r)); 5420 }else{ 5421 r = sqlite3_value_double(argv[0]); 5422 } 5423 if( r<0.0 ){ 5424 isNeg = 1; 5425 r = -r; 5426 }else{ 5427 isNeg = 0; 5428 } 5429 memcpy(&a,&r,sizeof(a)); 5430 if( a==0 ){ 5431 e = 0; 5432 m = 0; 5433 }else{ 5434 e = a>>52; 5435 m = a & ((((sqlite3_int64)1)<<52)-1); 5436 if( e==0 ){ 5437 m <<= 1; 5438 }else{ 5439 m |= ((sqlite3_int64)1)<<52; 5440 } 5441 while( e<1075 && m>0 && (m&1)==0 ){ 5442 m >>= 1; 5443 e++; 5444 } 5445 if( isNeg ) m = -m; 5446 } 5447 switch( *(int*)sqlite3_user_data(context) ){ 5448 case 0: 5449 sqlite3_snprintf(sizeof(zResult), zResult, "ieee754(%lld,%d)", 5450 m, e-1075); 5451 sqlite3_result_text(context, zResult, -1, SQLITE_TRANSIENT); 5452 break; 5453 case 1: 5454 sqlite3_result_int64(context, m); 5455 break; 5456 case 2: 5457 sqlite3_result_int(context, e-1075); 5458 break; 5459 } 5460 }else{ 5461 sqlite3_int64 m, e, a; 5462 double r; 5463 int isNeg = 0; 5464 m = sqlite3_value_int64(argv[0]); 5465 e = sqlite3_value_int64(argv[1]); 5466 5467 /* Limit the range of e. Ticket 22dea1cfdb9151e4 2021-03-02 */ 5468 if( e>10000 ){ 5469 e = 10000; 5470 }else if( e<-10000 ){ 5471 e = -10000; 5472 } 5473 5474 if( m<0 ){ 5475 isNeg = 1; 5476 m = -m; 5477 if( m<0 ) return; 5478 }else if( m==0 && e>-1000 && e<1000 ){ 5479 sqlite3_result_double(context, 0.0); 5480 return; 5481 } 5482 while( (m>>32)&0xffe00000 ){ 5483 m >>= 1; 5484 e++; 5485 } 5486 while( m!=0 && ((m>>32)&0xfff00000)==0 ){ 5487 m <<= 1; 5488 e--; 5489 } 5490 e += 1075; 5491 if( e<=0 ){ 5492 /* Subnormal */ 5493 if( 1-e >= 64 ){ 5494 m = 0; 5495 }else{ 5496 m >>= 1-e; 5497 } 5498 e = 0; 5499 }else if( e>0x7ff ){ 5500 e = 0x7ff; 5501 } 5502 a = m & ((((sqlite3_int64)1)<<52)-1); 5503 a |= e<<52; 5504 if( isNeg ) a |= ((sqlite3_uint64)1)<<63; 5505 memcpy(&r, &a, sizeof(r)); 5506 sqlite3_result_double(context, r); 5507 } 5508 } 5509 5510 /* 5511 ** Functions to convert between blobs and floats. 5512 */ 5513 static void ieee754func_from_blob( 5514 sqlite3_context *context, 5515 int argc, 5516 sqlite3_value **argv 5517 ){ 5518 UNUSED_PARAMETER(argc); 5519 if( sqlite3_value_type(argv[0])==SQLITE_BLOB 5520 && sqlite3_value_bytes(argv[0])==sizeof(double) 5521 ){ 5522 double r; 5523 const unsigned char *x = sqlite3_value_blob(argv[0]); 5524 unsigned int i; 5525 sqlite3_uint64 v = 0; 5526 for(i=0; i<sizeof(r); i++){ 5527 v = (v<<8) | x[i]; 5528 } 5529 memcpy(&r, &v, sizeof(r)); 5530 sqlite3_result_double(context, r); 5531 } 5532 } 5533 static void ieee754func_to_blob( 5534 sqlite3_context *context, 5535 int argc, 5536 sqlite3_value **argv 5537 ){ 5538 UNUSED_PARAMETER(argc); 5539 if( sqlite3_value_type(argv[0])==SQLITE_FLOAT 5540 || sqlite3_value_type(argv[0])==SQLITE_INTEGER 5541 ){ 5542 double r = sqlite3_value_double(argv[0]); 5543 sqlite3_uint64 v; 5544 unsigned char a[sizeof(r)]; 5545 unsigned int i; 5546 memcpy(&v, &r, sizeof(r)); 5547 for(i=1; i<=sizeof(r); i++){ 5548 a[sizeof(r)-i] = v&0xff; 5549 v >>= 8; 5550 } 5551 sqlite3_result_blob(context, a, sizeof(r), SQLITE_TRANSIENT); 5552 } 5553 } 5554 5555 /* 5556 ** SQL Function: ieee754_inc(r,N) 5557 ** 5558 ** Move the floating point value r by N quantums and return the new 5559 ** values. 5560 ** 5561 ** Behind the scenes: this routine merely casts r into a 64-bit unsigned 5562 ** integer, adds N, then casts the value back into float. 5563 ** 5564 ** Example: To find the smallest positive number: 5565 ** 5566 ** SELECT ieee754_inc(0.0,+1); 5567 */ 5568 static void ieee754inc( 5569 sqlite3_context *context, 5570 int argc, 5571 sqlite3_value **argv 5572 ){ 5573 double r; 5574 sqlite3_int64 N; 5575 sqlite3_uint64 m1, m2; 5576 double r2; 5577 UNUSED_PARAMETER(argc); 5578 r = sqlite3_value_double(argv[0]); 5579 N = sqlite3_value_int64(argv[1]); 5580 memcpy(&m1, &r, 8); 5581 m2 = m1 + N; 5582 memcpy(&r2, &m2, 8); 5583 sqlite3_result_double(context, r2); 5584 } 5585 5586 5587 #ifdef _WIN32 5588 5589 #endif 5590 int sqlite3_ieee_init( 5591 sqlite3 *db, 5592 char **pzErrMsg, 5593 const sqlite3_api_routines *pApi 5594 ){ 5595 static const struct { 5596 char *zFName; 5597 int nArg; 5598 int iAux; 5599 void (*xFunc)(sqlite3_context*,int,sqlite3_value**); 5600 } aFunc[] = { 5601 { "ieee754", 1, 0, ieee754func }, 5602 { "ieee754", 2, 0, ieee754func }, 5603 { "ieee754_mantissa", 1, 1, ieee754func }, 5604 { "ieee754_exponent", 1, 2, ieee754func }, 5605 { "ieee754_to_blob", 1, 0, ieee754func_to_blob }, 5606 { "ieee754_from_blob", 1, 0, ieee754func_from_blob }, 5607 { "ieee754_inc", 2, 0, ieee754inc }, 5608 }; 5609 unsigned int i; 5610 int rc = SQLITE_OK; 5611 SQLITE_EXTENSION_INIT2(pApi); 5612 (void)pzErrMsg; /* Unused parameter */ 5613 for(i=0; i<sizeof(aFunc)/sizeof(aFunc[0]) && rc==SQLITE_OK; i++){ 5614 rc = sqlite3_create_function(db, aFunc[i].zFName, aFunc[i].nArg, 5615 SQLITE_UTF8|SQLITE_INNOCUOUS, 5616 (void*)&aFunc[i].iAux, 5617 aFunc[i].xFunc, 0, 0); 5618 } 5619 return rc; 5620 } 5621 5622 /************************* End ../ext/misc/ieee754.c ********************/ 5623 /************************* Begin ../ext/misc/series.c ******************/ 5624 /* 5625 ** 2015-08-18, 2023-04-28 5626 ** 5627 ** The author disclaims copyright to this source code. In place of 5628 ** a legal notice, here is a blessing: 5629 ** 5630 ** May you do good and not evil. 5631 ** May you find forgiveness for yourself and forgive others. 5632 ** May you share freely, never taking more than you give. 5633 ** 5634 ************************************************************************* 5635 ** 5636 ** This file demonstrates how to create a table-valued-function using 5637 ** a virtual table. This demo implements the generate_series() function 5638 ** which gives the same results as the eponymous function in PostgreSQL, 5639 ** within the limitation that its arguments are signed 64-bit integers. 5640 ** 5641 ** Considering its equivalents to generate_series(start,stop,step): A 5642 ** value V[n] sequence is produced for integer n ascending from 0 where 5643 ** ( V[n] == start + n * step && sgn(V[n] - stop) * sgn(step) >= 0 ) 5644 ** for each produced value (independent of production time ordering.) 5645 ** 5646 ** All parameters must be either integer or convertable to integer. 5647 ** The start parameter is required. 5648 ** The stop parameter defaults to (1<<32)-1 (aka 4294967295 or 0xffffffff) 5649 ** The step parameter defaults to 1 and 0 is treated as 1. 5650 ** 5651 ** Examples: 5652 ** 5653 ** SELECT * FROM generate_series(0,100,5); 5654 ** 5655 ** The query above returns integers from 0 through 100 counting by steps 5656 ** of 5. 5657 ** 5658 ** SELECT * FROM generate_series(0,100); 5659 ** 5660 ** Integers from 0 through 100 with a step size of 1. 5661 ** 5662 ** SELECT * FROM generate_series(20) LIMIT 10; 5663 ** 5664 ** Integers 20 through 29. 5665 ** 5666 ** SELECT * FROM generate_series(0,-100,-5); 5667 ** 5668 ** Integers 0 -5 -10 ... -100. 5669 ** 5670 ** SELECT * FROM generate_series(0,-1); 5671 ** 5672 ** Empty sequence. 5673 ** 5674 ** HOW IT WORKS 5675 ** 5676 ** The generate_series "function" is really a virtual table with the 5677 ** following schema: 5678 ** 5679 ** CREATE TABLE generate_series( 5680 ** value, 5681 ** start HIDDEN, 5682 ** stop HIDDEN, 5683 ** step HIDDEN 5684 ** ); 5685 ** 5686 ** The virtual table also has a rowid, logically equivalent to n+1 where 5687 ** "n" is the ascending integer in the aforesaid production definition. 5688 ** 5689 ** Function arguments in queries against this virtual table are translated 5690 ** into equality constraints against successive hidden columns. In other 5691 ** words, the following pairs of queries are equivalent to each other: 5692 ** 5693 ** SELECT * FROM generate_series(0,100,5); 5694 ** SELECT * FROM generate_series WHERE start=0 AND stop=100 AND step=5; 5695 ** 5696 ** SELECT * FROM generate_series(0,100); 5697 ** SELECT * FROM generate_series WHERE start=0 AND stop=100; 5698 ** 5699 ** SELECT * FROM generate_series(20) LIMIT 10; 5700 ** SELECT * FROM generate_series WHERE start=20 LIMIT 10; 5701 ** 5702 ** The generate_series virtual table implementation leaves the xCreate method 5703 ** set to NULL. This means that it is not possible to do a CREATE VIRTUAL 5704 ** TABLE command with "generate_series" as the USING argument. Instead, there 5705 ** is a single generate_series virtual table that is always available without 5706 ** having to be created first. 5707 ** 5708 ** The xBestIndex method looks for equality constraints against the hidden 5709 ** start, stop, and step columns, and if present, it uses those constraints 5710 ** to bound the sequence of generated values. If the equality constraints 5711 ** are missing, it uses 0 for start, 4294967295 for stop, and 1 for step. 5712 ** xBestIndex returns a small cost when both start and stop are available, 5713 ** and a very large cost if either start or stop are unavailable. This 5714 ** encourages the query planner to order joins such that the bounds of the 5715 ** series are well-defined. 5716 */ 5717 /* #include "sqlite3ext.h" */ 5718 SQLITE_EXTENSION_INIT1 5719 #include <assert.h> 5720 #include <string.h> 5721 #include <limits.h> 5722 5723 #ifndef SQLITE_OMIT_VIRTUALTABLE 5724 /* 5725 ** Return that member of a generate_series(...) sequence whose 0-based 5726 ** index is ix. The 0th member is given by smBase. The sequence members 5727 ** progress per ix increment by smStep. 5728 */ 5729 static sqlite3_int64 genSeqMember( 5730 sqlite3_int64 smBase, 5731 sqlite3_int64 smStep, 5732 sqlite3_uint64 ix 5733 ){ 5734 static const sqlite3_uint64 mxI64 = 5735 ((sqlite3_uint64)0x7fffffff)<<32 | 0xffffffff; 5736 if( ix>=mxI64 ){ 5737 /* Get ix into signed i64 range. */ 5738 ix -= mxI64; 5739 /* With 2's complement ALU, this next can be 1 step, but is split into 5740 * 2 for UBSAN's satisfaction (and hypothetical 1's complement ALUs.) */ 5741 smBase += (mxI64/2) * smStep; 5742 smBase += (mxI64 - mxI64/2) * smStep; 5743 } 5744 /* Under UBSAN (or on 1's complement machines), must do this last term 5745 * in steps to avoid the dreaded (and harmless) signed multiply overlow. */ 5746 if( ix>=2 ){ 5747 sqlite3_int64 ix2 = (sqlite3_int64)ix/2; 5748 smBase += ix2*smStep; 5749 ix -= ix2; 5750 } 5751 return smBase + ((sqlite3_int64)ix)*smStep; 5752 } 5753 5754 /* typedef unsigned char u8; */ 5755 5756 typedef struct SequenceSpec { 5757 sqlite3_int64 iBase; /* Starting value ("start") */ 5758 sqlite3_int64 iTerm; /* Given terminal value ("stop") */ 5759 sqlite3_int64 iStep; /* Increment ("step") */ 5760 sqlite3_uint64 uSeqIndexMax; /* maximum sequence index (aka "n") */ 5761 sqlite3_uint64 uSeqIndexNow; /* Current index during generation */ 5762 sqlite3_int64 iValueNow; /* Current value during generation */ 5763 u8 isNotEOF; /* Sequence generation not exhausted */ 5764 u8 isReversing; /* Sequence is being reverse generated */ 5765 } SequenceSpec; 5766 5767 /* 5768 ** Prepare a SequenceSpec for use in generating an integer series 5769 ** given initialized iBase, iTerm and iStep values. Sequence is 5770 ** initialized per given isReversing. Other members are computed. 5771 */ 5772 static void setupSequence( SequenceSpec *pss ){ 5773 int bSameSigns; 5774 pss->uSeqIndexMax = 0; 5775 pss->isNotEOF = 0; 5776 bSameSigns = (pss->iBase < 0)==(pss->iTerm < 0); 5777 if( pss->iTerm < pss->iBase ){ 5778 sqlite3_uint64 nuspan = 0; 5779 if( bSameSigns ){ 5780 nuspan = (sqlite3_uint64)(pss->iBase - pss->iTerm); 5781 }else{ 5782 /* Under UBSAN (or on 1's complement machines), must do this in steps. 5783 * In this clause, iBase>=0 and iTerm<0 . */ 5784 nuspan = 1; 5785 nuspan += pss->iBase; 5786 nuspan += -(pss->iTerm+1); 5787 } 5788 if( pss->iStep<0 ){ 5789 pss->isNotEOF = 1; 5790 if( nuspan==ULONG_MAX ){ 5791 pss->uSeqIndexMax = ( pss->iStep>LLONG_MIN )? nuspan/-pss->iStep : 1; 5792 }else if( pss->iStep>LLONG_MIN ){ 5793 pss->uSeqIndexMax = nuspan/-pss->iStep; 5794 } 5795 } 5796 }else if( pss->iTerm > pss->iBase ){ 5797 sqlite3_uint64 puspan = 0; 5798 if( bSameSigns ){ 5799 puspan = (sqlite3_uint64)(pss->iTerm - pss->iBase); 5800 }else{ 5801 /* Under UBSAN (or on 1's complement machines), must do this in steps. 5802 * In this clause, iTerm>=0 and iBase<0 . */ 5803 puspan = 1; 5804 puspan += pss->iTerm; 5805 puspan += -(pss->iBase+1); 5806 } 5807 if( pss->iStep>0 ){ 5808 pss->isNotEOF = 1; 5809 pss->uSeqIndexMax = puspan/pss->iStep; 5810 } 5811 }else if( pss->iTerm == pss->iBase ){ 5812 pss->isNotEOF = 1; 5813 pss->uSeqIndexMax = 0; 5814 } 5815 pss->uSeqIndexNow = (pss->isReversing)? pss->uSeqIndexMax : 0; 5816 pss->iValueNow = (pss->isReversing) 5817 ? genSeqMember(pss->iBase, pss->iStep, pss->uSeqIndexMax) 5818 : pss->iBase; 5819 } 5820 5821 /* 5822 ** Progress sequence generator to yield next value, if any. 5823 ** Leave its state to either yield next value or be at EOF. 5824 ** Return whether there is a next value, or 0 at EOF. 5825 */ 5826 static int progressSequence( SequenceSpec *pss ){ 5827 if( !pss->isNotEOF ) return 0; 5828 if( pss->isReversing ){ 5829 if( pss->uSeqIndexNow > 0 ){ 5830 pss->uSeqIndexNow--; 5831 pss->iValueNow -= pss->iStep; 5832 }else{ 5833 pss->isNotEOF = 0; 5834 } 5835 }else{ 5836 if( pss->uSeqIndexNow < pss->uSeqIndexMax ){ 5837 pss->uSeqIndexNow++; 5838 pss->iValueNow += pss->iStep; 5839 }else{ 5840 pss->isNotEOF = 0; 5841 } 5842 } 5843 return pss->isNotEOF; 5844 } 5845 5846 /* series_cursor is a subclass of sqlite3_vtab_cursor which will 5847 ** serve as the underlying representation of a cursor that scans 5848 ** over rows of the result 5849 */ 5850 typedef struct series_cursor series_cursor; 5851 struct series_cursor { 5852 sqlite3_vtab_cursor base; /* Base class - must be first */ 5853 SequenceSpec ss; /* (this) Derived class data */ 5854 }; 5855 5856 /* 5857 ** The seriesConnect() method is invoked to create a new 5858 ** series_vtab that describes the generate_series virtual table. 5859 ** 5860 ** Think of this routine as the constructor for series_vtab objects. 5861 ** 5862 ** All this routine needs to do is: 5863 ** 5864 ** (1) Allocate the series_vtab object and initialize all fields. 5865 ** 5866 ** (2) Tell SQLite (via the sqlite3_declare_vtab() interface) what the 5867 ** result set of queries against generate_series will look like. 5868 */ 5869 static int seriesConnect( 5870 sqlite3 *db, 5871 void *pUnused, 5872 int argcUnused, const char *const*argvUnused, 5873 sqlite3_vtab **ppVtab, 5874 char **pzErrUnused 5875 ){ 5876 sqlite3_vtab *pNew; 5877 int rc; 5878 5879 /* Column numbers */ 5880 #define SERIES_COLUMN_VALUE 0 5881 #define SERIES_COLUMN_START 1 5882 #define SERIES_COLUMN_STOP 2 5883 #define SERIES_COLUMN_STEP 3 5884 5885 (void)pUnused; 5886 (void)argcUnused; 5887 (void)argvUnused; 5888 (void)pzErrUnused; 5889 rc = sqlite3_declare_vtab(db, 5890 "CREATE TABLE x(value,start hidden,stop hidden,step hidden)"); 5891 if( rc==SQLITE_OK ){ 5892 pNew = *ppVtab = sqlite3_malloc( sizeof(*pNew) ); 5893 if( pNew==0 ) return SQLITE_NOMEM; 5894 memset(pNew, 0, sizeof(*pNew)); 5895 sqlite3_vtab_config(db, SQLITE_VTAB_INNOCUOUS); 5896 } 5897 return rc; 5898 } 5899 5900 /* 5901 ** This method is the destructor for series_cursor objects. 5902 */ 5903 static int seriesDisconnect(sqlite3_vtab *pVtab){ 5904 sqlite3_free(pVtab); 5905 return SQLITE_OK; 5906 } 5907 5908 /* 5909 ** Constructor for a new series_cursor object. 5910 */ 5911 static int seriesOpen(sqlite3_vtab *pUnused, sqlite3_vtab_cursor **ppCursor){ 5912 series_cursor *pCur; 5913 (void)pUnused; 5914 pCur = sqlite3_malloc( sizeof(*pCur) ); 5915 if( pCur==0 ) return SQLITE_NOMEM; 5916 memset(pCur, 0, sizeof(*pCur)); 5917 *ppCursor = &pCur->base; 5918 return SQLITE_OK; 5919 } 5920 5921 /* 5922 ** Destructor for a series_cursor. 5923 */ 5924 static int seriesClose(sqlite3_vtab_cursor *cur){ 5925 sqlite3_free(cur); 5926 return SQLITE_OK; 5927 } 5928 5929 5930 /* 5931 ** Advance a series_cursor to its next row of output. 5932 */ 5933 static int seriesNext(sqlite3_vtab_cursor *cur){ 5934 series_cursor *pCur = (series_cursor*)cur; 5935 progressSequence( & pCur->ss ); 5936 return SQLITE_OK; 5937 } 5938 5939 /* 5940 ** Return values of columns for the row at which the series_cursor 5941 ** is currently pointing. 5942 */ 5943 static int seriesColumn( 5944 sqlite3_vtab_cursor *cur, /* The cursor */ 5945 sqlite3_context *ctx, /* First argument to sqlite3_result_...() */ 5946 int i /* Which column to return */ 5947 ){ 5948 series_cursor *pCur = (series_cursor*)cur; 5949 sqlite3_int64 x = 0; 5950 switch( i ){ 5951 case SERIES_COLUMN_START: x = pCur->ss.iBase; break; 5952 case SERIES_COLUMN_STOP: x = pCur->ss.iTerm; break; 5953 case SERIES_COLUMN_STEP: x = pCur->ss.iStep; break; 5954 default: x = pCur->ss.iValueNow; break; 5955 } 5956 sqlite3_result_int64(ctx, x); 5957 return SQLITE_OK; 5958 } 5959 5960 #ifndef LARGEST_UINT64 5961 #define LARGEST_UINT64 (0xffffffff|(((sqlite3_uint64)0xffffffff)<<32)) 5962 #endif 5963 5964 /* 5965 ** Return the rowid for the current row, logically equivalent to n+1 where 5966 ** "n" is the ascending integer in the aforesaid production definition. 5967 */ 5968 static int seriesRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ 5969 series_cursor *pCur = (series_cursor*)cur; 5970 sqlite3_uint64 n = pCur->ss.uSeqIndexNow; 5971 *pRowid = (sqlite3_int64)((n<LARGEST_UINT64)? n+1 : 0); 5972 return SQLITE_OK; 5973 } 5974 5975 /* 5976 ** Return TRUE if the cursor has been moved off of the last 5977 ** row of output. 5978 */ 5979 static int seriesEof(sqlite3_vtab_cursor *cur){ 5980 series_cursor *pCur = (series_cursor*)cur; 5981 return !pCur->ss.isNotEOF; 5982 } 5983 5984 /* True to cause run-time checking of the start=, stop=, and/or step= 5985 ** parameters. The only reason to do this is for testing the 5986 ** constraint checking logic for virtual tables in the SQLite core. 5987 */ 5988 #ifndef SQLITE_SERIES_CONSTRAINT_VERIFY 5989 # define SQLITE_SERIES_CONSTRAINT_VERIFY 0 5990 #endif 5991 5992 /* 5993 ** This method is called to "rewind" the series_cursor object back 5994 ** to the first row of output. This method is always called at least 5995 ** once prior to any call to seriesColumn() or seriesRowid() or 5996 ** seriesEof(). 5997 ** 5998 ** The query plan selected by seriesBestIndex is passed in the idxNum 5999 ** parameter. (idxStr is not used in this implementation.) idxNum 6000 ** is a bitmask showing which constraints are available: 6001 ** 6002 ** 0x01: start=VALUE 6003 ** 0x02: stop=VALUE 6004 ** 0x04: step=VALUE 6005 ** 0x08: descending order 6006 ** 0x10: ascending order 6007 ** 0x20: LIMIT VALUE 6008 ** 0x40: OFFSET VALUE 6009 ** 6010 ** This routine should initialize the cursor and position it so that it 6011 ** is pointing at the first row, or pointing off the end of the table 6012 ** (so that seriesEof() will return true) if the table is empty. 6013 */ 6014 static int seriesFilter( 6015 sqlite3_vtab_cursor *pVtabCursor, 6016 int idxNum, const char *idxStrUnused, 6017 int argc, sqlite3_value **argv 6018 ){ 6019 series_cursor *pCur = (series_cursor *)pVtabCursor; 6020 int i = 0; 6021 (void)idxStrUnused; 6022 if( idxNum & 0x01 ){ 6023 pCur->ss.iBase = sqlite3_value_int64(argv[i++]); 6024 }else{ 6025 pCur->ss.iBase = 0; 6026 } 6027 if( idxNum & 0x02 ){ 6028 pCur->ss.iTerm = sqlite3_value_int64(argv[i++]); 6029 }else{ 6030 pCur->ss.iTerm = 0xffffffff; 6031 } 6032 if( idxNum & 0x04 ){ 6033 pCur->ss.iStep = sqlite3_value_int64(argv[i++]); 6034 if( pCur->ss.iStep==0 ){ 6035 pCur->ss.iStep = 1; 6036 }else if( pCur->ss.iStep<0 ){ 6037 if( (idxNum & 0x10)==0 ) idxNum |= 0x08; 6038 } 6039 }else{ 6040 pCur->ss.iStep = 1; 6041 } 6042 if( idxNum & 0x20 ){ 6043 sqlite3_int64 iLimit = sqlite3_value_int64(argv[i++]); 6044 sqlite3_int64 iTerm; 6045 if( idxNum & 0x40 ){ 6046 sqlite3_int64 iOffset = sqlite3_value_int64(argv[i++]); 6047 if( iOffset>0 ){ 6048 pCur->ss.iBase += pCur->ss.iStep*iOffset; 6049 } 6050 } 6051 if( iLimit>=0 ){ 6052 iTerm = pCur->ss.iBase + (iLimit - 1)*pCur->ss.iStep; 6053 if( pCur->ss.iStep<0 ){ 6054 if( iTerm>pCur->ss.iTerm ) pCur->ss.iTerm = iTerm; 6055 }else{ 6056 if( iTerm<pCur->ss.iTerm ) pCur->ss.iTerm = iTerm; 6057 } 6058 } 6059 } 6060 for(i=0; i<argc; i++){ 6061 if( sqlite3_value_type(argv[i])==SQLITE_NULL ){ 6062 /* If any of the constraints have a NULL value, then return no rows. 6063 ** See ticket https://www.sqlite.org/src/info/fac496b61722daf2 */ 6064 pCur->ss.iBase = 1; 6065 pCur->ss.iTerm = 0; 6066 pCur->ss.iStep = 1; 6067 break; 6068 } 6069 } 6070 if( idxNum & 0x08 ){ 6071 pCur->ss.isReversing = pCur->ss.iStep > 0; 6072 }else{ 6073 pCur->ss.isReversing = pCur->ss.iStep < 0; 6074 } 6075 setupSequence( &pCur->ss ); 6076 return SQLITE_OK; 6077 } 6078 6079 /* 6080 ** SQLite will invoke this method one or more times while planning a query 6081 ** that uses the generate_series virtual table. This routine needs to create 6082 ** a query plan for each invocation and compute an estimated cost for that 6083 ** plan. 6084 ** 6085 ** In this implementation idxNum is used to represent the 6086 ** query plan. idxStr is unused. 6087 ** 6088 ** The query plan is represented by bits in idxNum: 6089 ** 6090 ** 0x01 start = $value -- constraint exists 6091 ** 0x02 stop = $value -- constraint exists 6092 ** 0x04 step = $value -- constraint exists 6093 ** 0x08 output is in descending order 6094 ** 0x10 output is in ascending order 6095 ** 0x20 LIMIT $value -- constraint exists 6096 ** 0x40 OFFSET $value -- constraint exists 6097 */ 6098 static int seriesBestIndex( 6099 sqlite3_vtab *pVTab, 6100 sqlite3_index_info *pIdxInfo 6101 ){ 6102 int i, j; /* Loop over constraints */ 6103 int idxNum = 0; /* The query plan bitmask */ 6104 #ifndef ZERO_ARGUMENT_GENERATE_SERIES 6105 int bStartSeen = 0; /* EQ constraint seen on the START column */ 6106 #endif 6107 int unusableMask = 0; /* Mask of unusable constraints */ 6108 int nArg = 0; /* Number of arguments that seriesFilter() expects */ 6109 int aIdx[5]; /* Constraints on start, stop, step, LIMIT, OFFSET */ 6110 const struct sqlite3_index_constraint *pConstraint; 6111 6112 /* This implementation assumes that the start, stop, and step columns 6113 ** are the last three columns in the virtual table. */ 6114 assert( SERIES_COLUMN_STOP == SERIES_COLUMN_START+1 ); 6115 assert( SERIES_COLUMN_STEP == SERIES_COLUMN_START+2 ); 6116 6117 aIdx[0] = aIdx[1] = aIdx[2] = aIdx[3] = aIdx[4] = -1; 6118 pConstraint = pIdxInfo->aConstraint; 6119 for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){ 6120 int iCol; /* 0 for start, 1 for stop, 2 for step */ 6121 int iMask; /* bitmask for those column */ 6122 int op = pConstraint->op; 6123 if( op>=SQLITE_INDEX_CONSTRAINT_LIMIT 6124 && op<=SQLITE_INDEX_CONSTRAINT_OFFSET 6125 ){ 6126 if( pConstraint->usable==0 ){ 6127 /* do nothing */ 6128 }else if( op==SQLITE_INDEX_CONSTRAINT_LIMIT ){ 6129 aIdx[3] = i; 6130 idxNum |= 0x20; 6131 }else{ 6132 assert( op==SQLITE_INDEX_CONSTRAINT_OFFSET ); 6133 aIdx[4] = i; 6134 idxNum |= 0x40; 6135 } 6136 continue; 6137 } 6138 if( pConstraint->iColumn<SERIES_COLUMN_START ) continue; 6139 iCol = pConstraint->iColumn - SERIES_COLUMN_START; 6140 assert( iCol>=0 && iCol<=2 ); 6141 iMask = 1 << iCol; 6142 #ifndef ZERO_ARGUMENT_GENERATE_SERIES 6143 if( iCol==0 && op==SQLITE_INDEX_CONSTRAINT_EQ ){ 6144 bStartSeen = 1; 6145 } 6146 #endif 6147 if( pConstraint->usable==0 ){ 6148 unusableMask |= iMask; 6149 continue; 6150 }else if( op==SQLITE_INDEX_CONSTRAINT_EQ ){ 6151 idxNum |= iMask; 6152 aIdx[iCol] = i; 6153 } 6154 } 6155 if( aIdx[3]==0 ){ 6156 /* Ignore OFFSET if LIMIT is omitted */ 6157 idxNum &= ~0x60; 6158 aIdx[4] = 0; 6159 } 6160 for(i=0; i<5; i++){ 6161 if( (j = aIdx[i])>=0 ){ 6162 pIdxInfo->aConstraintUsage[j].argvIndex = ++nArg; 6163 pIdxInfo->aConstraintUsage[j].omit = 6164 !SQLITE_SERIES_CONSTRAINT_VERIFY || i>=3; 6165 } 6166 } 6167 /* The current generate_column() implementation requires at least one 6168 ** argument (the START value). Legacy versions assumed START=0 if the 6169 ** first argument was omitted. Compile with -DZERO_ARGUMENT_GENERATE_SERIES 6170 ** to obtain the legacy behavior */ 6171 #ifndef ZERO_ARGUMENT_GENERATE_SERIES 6172 if( !bStartSeen ){ 6173 sqlite3_free(pVTab->zErrMsg); 6174 pVTab->zErrMsg = sqlite3_mprintf( 6175 "first argument to \"generate_series()\" missing or unusable"); 6176 return SQLITE_ERROR; 6177 } 6178 #endif 6179 if( (unusableMask & ~idxNum)!=0 ){ 6180 /* The start, stop, and step columns are inputs. Therefore if there 6181 ** are unusable constraints on any of start, stop, or step then 6182 ** this plan is unusable */ 6183 return SQLITE_CONSTRAINT; 6184 } 6185 if( (idxNum & 0x03)==0x03 ){ 6186 /* Both start= and stop= boundaries are available. This is the 6187 ** the preferred case */ 6188 pIdxInfo->estimatedCost = (double)(2 - ((idxNum&4)!=0)); 6189 pIdxInfo->estimatedRows = 1000; 6190 if( pIdxInfo->nOrderBy>=1 && pIdxInfo->aOrderBy[0].iColumn==0 ){ 6191 if( pIdxInfo->aOrderBy[0].desc ){ 6192 idxNum |= 0x08; 6193 }else{ 6194 idxNum |= 0x10; 6195 } 6196 pIdxInfo->orderByConsumed = 1; 6197 } 6198 }else if( (idxNum & 0x21)==0x21 ){ 6199 /* We have start= and LIMIT */ 6200 pIdxInfo->estimatedRows = 2500; 6201 }else{ 6202 /* If either boundary is missing, we have to generate a huge span 6203 ** of numbers. Make this case very expensive so that the query 6204 ** planner will work hard to avoid it. */ 6205 pIdxInfo->estimatedRows = 2147483647; 6206 } 6207 pIdxInfo->idxNum = idxNum; 6208 return SQLITE_OK; 6209 } 6210 6211 /* 6212 ** This following structure defines all the methods for the 6213 ** generate_series virtual table. 6214 */ 6215 static sqlite3_module seriesModule = { 6216 0, /* iVersion */ 6217 0, /* xCreate */ 6218 seriesConnect, /* xConnect */ 6219 seriesBestIndex, /* xBestIndex */ 6220 seriesDisconnect, /* xDisconnect */ 6221 0, /* xDestroy */ 6222 seriesOpen, /* xOpen - open a cursor */ 6223 seriesClose, /* xClose - close a cursor */ 6224 seriesFilter, /* xFilter - configure scan constraints */ 6225 seriesNext, /* xNext - advance a cursor */ 6226 seriesEof, /* xEof - check for end of scan */ 6227 seriesColumn, /* xColumn - read data */ 6228 seriesRowid, /* xRowid - read data */ 6229 0, /* xUpdate */ 6230 0, /* xBegin */ 6231 0, /* xSync */ 6232 0, /* xCommit */ 6233 0, /* xRollback */ 6234 0, /* xFindMethod */ 6235 0, /* xRename */ 6236 0, /* xSavepoint */ 6237 0, /* xRelease */ 6238 0, /* xRollbackTo */ 6239 0, /* xShadowName */ 6240 0 /* xIntegrity */ 6241 }; 6242 6243 #endif /* SQLITE_OMIT_VIRTUALTABLE */ 6244 6245 #ifdef _WIN32 6246 6247 #endif 6248 int sqlite3_series_init( 6249 sqlite3 *db, 6250 char **pzErrMsg, 6251 const sqlite3_api_routines *pApi 6252 ){ 6253 int rc = SQLITE_OK; 6254 SQLITE_EXTENSION_INIT2(pApi); 6255 #ifndef SQLITE_OMIT_VIRTUALTABLE 6256 if( sqlite3_libversion_number()<3008012 && pzErrMsg!=0 ){ 6257 *pzErrMsg = sqlite3_mprintf( 6258 "generate_series() requires SQLite 3.8.12 or later"); 6259 return SQLITE_ERROR; 6260 } 6261 rc = sqlite3_create_module(db, "generate_series", &seriesModule, 0); 6262 #endif 6263 return rc; 6264 } 6265 6266 /************************* End ../ext/misc/series.c ********************/ 6267 /************************* Begin ../ext/misc/regexp.c ******************/ 6268 /* 6269 ** 2012-11-13 6270 ** 6271 ** The author disclaims copyright to this source code. In place of 6272 ** a legal notice, here is a blessing: 6273 ** 6274 ** May you do good and not evil. 6275 ** May you find forgiveness for yourself and forgive others. 6276 ** May you share freely, never taking more than you give. 6277 ** 6278 ****************************************************************************** 6279 ** 6280 ** The code in this file implements a compact but reasonably 6281 ** efficient regular-expression matcher for posix extended regular 6282 ** expressions against UTF8 text. 6283 ** 6284 ** This file is an SQLite extension. It registers a single function 6285 ** named "regexp(A,B)" where A is the regular expression and B is the 6286 ** string to be matched. By registering this function, SQLite will also 6287 ** then implement the "B regexp A" operator. Note that with the function 6288 ** the regular expression comes first, but with the operator it comes 6289 ** second. 6290 ** 6291 ** The following regular expression syntax is supported: 6292 ** 6293 ** X* zero or more occurrences of X 6294 ** X+ one or more occurrences of X 6295 ** X? zero or one occurrences of X 6296 ** X{p,q} between p and q occurrences of X 6297 ** (X) match X 6298 ** X|Y X or Y 6299 ** ^X X occurring at the beginning of the string 6300 ** X$ X occurring at the end of the string 6301 ** . Match any single character 6302 ** \c Character c where c is one of \{}()[]|*+?. 6303 ** \c C-language escapes for c in afnrtv. ex: \t or \n 6304 ** \uXXXX Where XXXX is exactly 4 hex digits, unicode value XXXX 6305 ** \xXX Where XX is exactly 2 hex digits, unicode value XX 6306 ** [abc] Any single character from the set abc 6307 ** [^abc] Any single character not in the set abc 6308 ** [a-z] Any single character in the range a-z 6309 ** [^a-z] Any single character not in the range a-z 6310 ** \b Word boundary 6311 ** \w Word character. [A-Za-z0-9_] 6312 ** \W Non-word character 6313 ** \d Digit 6314 ** \D Non-digit 6315 ** \s Whitespace character 6316 ** \S Non-whitespace character 6317 ** 6318 ** A nondeterministic finite automaton (NFA) is used for matching, so the 6319 ** performance is bounded by O(N*M) where N is the size of the regular 6320 ** expression and M is the size of the input string. The matcher never 6321 ** exhibits exponential behavior. Note that the X{p,q} operator expands 6322 ** to p copies of X following by q-p copies of X? and that the size of the 6323 ** regular expression in the O(N*M) performance bound is computed after 6324 ** this expansion. 6325 */ 6326 #include <string.h> 6327 #include <stdlib.h> 6328 /* #include "sqlite3ext.h" */ 6329 SQLITE_EXTENSION_INIT1 6330 6331 /* 6332 ** The following #defines change the names of some functions implemented in 6333 ** this file to prevent name collisions with C-library functions of the 6334 ** same name. 6335 */ 6336 #define re_match sqlite3re_match 6337 #define re_compile sqlite3re_compile 6338 #define re_free sqlite3re_free 6339 6340 /* The end-of-input character */ 6341 #define RE_EOF 0 /* End of input */ 6342 #define RE_START 0xfffffff /* Start of input - larger than an UTF-8 */ 6343 6344 /* The NFA is implemented as sequence of opcodes taken from the following 6345 ** set. Each opcode has a single integer argument. 6346 */ 6347 #define RE_OP_MATCH 1 /* Match the one character in the argument */ 6348 #define RE_OP_ANY 2 /* Match any one character. (Implements ".") */ 6349 #define RE_OP_ANYSTAR 3 /* Special optimized version of .* */ 6350 #define RE_OP_FORK 4 /* Continue to both next and opcode at iArg */ 6351 #define RE_OP_GOTO 5 /* Jump to opcode at iArg */ 6352 #define RE_OP_ACCEPT 6 /* Halt and indicate a successful match */ 6353 #define RE_OP_CC_INC 7 /* Beginning of a [...] character class */ 6354 #define RE_OP_CC_EXC 8 /* Beginning of a [^...] character class */ 6355 #define RE_OP_CC_VALUE 9 /* Single value in a character class */ 6356 #define RE_OP_CC_RANGE 10 /* Range of values in a character class */ 6357 #define RE_OP_WORD 11 /* Perl word character [A-Za-z0-9_] */ 6358 #define RE_OP_NOTWORD 12 /* Not a perl word character */ 6359 #define RE_OP_DIGIT 13 /* digit: [0-9] */ 6360 #define RE_OP_NOTDIGIT 14 /* Not a digit */ 6361 #define RE_OP_SPACE 15 /* space: [ \t\n\r\v\f] */ 6362 #define RE_OP_NOTSPACE 16 /* Not a digit */ 6363 #define RE_OP_BOUNDARY 17 /* Boundary between word and non-word */ 6364 #define RE_OP_ATSTART 18 /* Currently at the start of the string */ 6365 6366 #if defined(SQLITE_DEBUG) 6367 /* Opcode names used for symbolic debugging */ 6368 static const char *ReOpName[] = { 6369 "EOF", 6370 "MATCH", 6371 "ANY", 6372 "ANYSTAR", 6373 "FORK", 6374 "GOTO", 6375 "ACCEPT", 6376 "CC_INC", 6377 "CC_EXC", 6378 "CC_VALUE", 6379 "CC_RANGE", 6380 "WORD", 6381 "NOTWORD", 6382 "DIGIT", 6383 "NOTDIGIT", 6384 "SPACE", 6385 "NOTSPACE", 6386 "BOUNDARY", 6387 "ATSTART", 6388 }; 6389 #endif /* SQLITE_DEBUG */ 6390 6391 6392 /* Each opcode is a "state" in the NFA */ 6393 typedef unsigned short ReStateNumber; 6394 6395 /* Because this is an NFA and not a DFA, multiple states can be active at 6396 ** once. An instance of the following object records all active states in 6397 ** the NFA. The implementation is optimized for the common case where the 6398 ** number of actives states is small. 6399 */ 6400 typedef struct ReStateSet { 6401 unsigned nState; /* Number of current states */ 6402 ReStateNumber *aState; /* Current states */ 6403 } ReStateSet; 6404 6405 /* An input string read one character at a time. 6406 */ 6407 typedef struct ReInput ReInput; 6408 struct ReInput { 6409 const unsigned char *z; /* All text */ 6410 int i; /* Next byte to read */ 6411 int mx; /* EOF when i>=mx */ 6412 }; 6413 6414 /* A compiled NFA (or an NFA that is in the process of being compiled) is 6415 ** an instance of the following object. 6416 */ 6417 typedef struct ReCompiled ReCompiled; 6418 struct ReCompiled { 6419 ReInput sIn; /* Regular expression text */ 6420 const char *zErr; /* Error message to return */ 6421 char *aOp; /* Operators for the virtual machine */ 6422 int *aArg; /* Arguments to each operator */ 6423 unsigned (*xNextChar)(ReInput*); /* Next character function */ 6424 unsigned char zInit[12]; /* Initial text to match */ 6425 int nInit; /* Number of bytes in zInit */ 6426 unsigned nState; /* Number of entries in aOp[] and aArg[] */ 6427 unsigned nAlloc; /* Slots allocated for aOp[] and aArg[] */ 6428 }; 6429 6430 /* Add a state to the given state set if it is not already there */ 6431 static void re_add_state(ReStateSet *pSet, int newState){ 6432 unsigned i; 6433 for(i=0; i<pSet->nState; i++) if( pSet->aState[i]==newState ) return; 6434 pSet->aState[pSet->nState++] = (ReStateNumber)newState; 6435 } 6436 6437 /* Extract the next unicode character from *pzIn and return it. Advance 6438 ** *pzIn to the first byte past the end of the character returned. To 6439 ** be clear: this routine converts utf8 to unicode. This routine is 6440 ** optimized for the common case where the next character is a single byte. 6441 */ 6442 static unsigned re_next_char(ReInput *p){ 6443 unsigned c; 6444 if( p->i>=p->mx ) return 0; 6445 c = p->z[p->i++]; 6446 if( c>=0x80 ){ 6447 if( (c&0xe0)==0xc0 && p->i<p->mx && (p->z[p->i]&0xc0)==0x80 ){ 6448 c = (c&0x1f)<<6 | (p->z[p->i++]&0x3f); 6449 if( c<0x80 ) c = 0xfffd; 6450 }else if( (c&0xf0)==0xe0 && p->i+1<p->mx && (p->z[p->i]&0xc0)==0x80 6451 && (p->z[p->i+1]&0xc0)==0x80 ){ 6452 c = (c&0x0f)<<12 | ((p->z[p->i]&0x3f)<<6) | (p->z[p->i+1]&0x3f); 6453 p->i += 2; 6454 if( c<=0x7ff || (c>=0xd800 && c<=0xdfff) ) c = 0xfffd; 6455 }else if( (c&0xf8)==0xf0 && p->i+2<p->mx && (p->z[p->i]&0xc0)==0x80 6456 && (p->z[p->i+1]&0xc0)==0x80 && (p->z[p->i+2]&0xc0)==0x80 ){ 6457 c = (c&0x07)<<18 | ((p->z[p->i]&0x3f)<<12) | ((p->z[p->i+1]&0x3f)<<6) 6458 | (p->z[p->i+2]&0x3f); 6459 p->i += 3; 6460 if( c<=0xffff || c>0x10ffff ) c = 0xfffd; 6461 }else{ 6462 c = 0xfffd; 6463 } 6464 } 6465 return c; 6466 } 6467 static unsigned re_next_char_nocase(ReInput *p){ 6468 unsigned c = re_next_char(p); 6469 if( c>='A' && c<='Z' ) c += 'a' - 'A'; 6470 return c; 6471 } 6472 6473 /* Return true if c is a perl "word" character: [A-Za-z0-9_] */ 6474 static int re_word_char(int c){ 6475 return (c>='0' && c<='9') || (c>='a' && c<='z') 6476 || (c>='A' && c<='Z') || c=='_'; 6477 } 6478 6479 /* Return true if c is a "digit" character: [0-9] */ 6480 static int re_digit_char(int c){ 6481 return (c>='0' && c<='9'); 6482 } 6483 6484 /* Return true if c is a perl "space" character: [ \t\r\n\v\f] */ 6485 static int re_space_char(int c){ 6486 return c==' ' || c=='\t' || c=='\n' || c=='\r' || c=='\v' || c=='\f'; 6487 } 6488 6489 /* Run a compiled regular expression on the zero-terminated input 6490 ** string zIn[]. Return true on a match and false if there is no match. 6491 */ 6492 static int re_match(ReCompiled *pRe, const unsigned char *zIn, int nIn){ 6493 ReStateSet aStateSet[2], *pThis, *pNext; 6494 ReStateNumber aSpace[100]; 6495 ReStateNumber *pToFree; 6496 unsigned int i = 0; 6497 unsigned int iSwap = 0; 6498 int c = RE_START; 6499 int cPrev = 0; 6500 int rc = 0; 6501 ReInput in; 6502 6503 in.z = zIn; 6504 in.i = 0; 6505 in.mx = nIn>=0 ? nIn : (int)strlen((char const*)zIn); 6506 6507 /* Look for the initial prefix match, if there is one. */ 6508 if( pRe->nInit ){ 6509 unsigned char x = pRe->zInit[0]; 6510 while( in.i+pRe->nInit<=in.mx 6511 && (zIn[in.i]!=x || 6512 strncmp((const char*)zIn+in.i, (const char*)pRe->zInit, pRe->nInit)!=0) 6513 ){ 6514 in.i++; 6515 } 6516 if( in.i+pRe->nInit>in.mx ) return 0; 6517 c = RE_START-1; 6518 } 6519 6520 if( pRe->nState<=(sizeof(aSpace)/(sizeof(aSpace[0])*2)) ){ 6521 pToFree = 0; 6522 aStateSet[0].aState = aSpace; 6523 }else{ 6524 pToFree = sqlite3_malloc64( sizeof(ReStateNumber)*2*pRe->nState ); 6525 if( pToFree==0 ) return -1; 6526 aStateSet[0].aState = pToFree; 6527 } 6528 aStateSet[1].aState = &aStateSet[0].aState[pRe->nState]; 6529 pNext = &aStateSet[1]; 6530 pNext->nState = 0; 6531 re_add_state(pNext, 0); 6532 while( c!=RE_EOF && pNext->nState>0 ){ 6533 cPrev = c; 6534 c = pRe->xNextChar(&in); 6535 pThis = pNext; 6536 pNext = &aStateSet[iSwap]; 6537 iSwap = 1 - iSwap; 6538 pNext->nState = 0; 6539 for(i=0; i<pThis->nState; i++){ 6540 int x = pThis->aState[i]; 6541 switch( pRe->aOp[x] ){ 6542 case RE_OP_MATCH: { 6543 if( pRe->aArg[x]==c ) re_add_state(pNext, x+1); 6544 break; 6545 } 6546 case RE_OP_ATSTART: { 6547 if( cPrev==RE_START ) re_add_state(pThis, x+1); 6548 break; 6549 } 6550 case RE_OP_ANY: { 6551 if( c!=0 ) re_add_state(pNext, x+1); 6552 break; 6553 } 6554 case RE_OP_WORD: { 6555 if( re_word_char(c) ) re_add_state(pNext, x+1); 6556 break; 6557 } 6558 case RE_OP_NOTWORD: { 6559 if( !re_word_char(c) && c!=0 ) re_add_state(pNext, x+1); 6560 break; 6561 } 6562 case RE_OP_DIGIT: { 6563 if( re_digit_char(c) ) re_add_state(pNext, x+1); 6564 break; 6565 } 6566 case RE_OP_NOTDIGIT: { 6567 if( !re_digit_char(c) && c!=0 ) re_add_state(pNext, x+1); 6568 break; 6569 } 6570 case RE_OP_SPACE: { 6571 if( re_space_char(c) ) re_add_state(pNext, x+1); 6572 break; 6573 } 6574 case RE_OP_NOTSPACE: { 6575 if( !re_space_char(c) && c!=0 ) re_add_state(pNext, x+1); 6576 break; 6577 } 6578 case RE_OP_BOUNDARY: { 6579 if( re_word_char(c)!=re_word_char(cPrev) ) re_add_state(pThis, x+1); 6580 break; 6581 } 6582 case RE_OP_ANYSTAR: { 6583 re_add_state(pNext, x); 6584 re_add_state(pThis, x+1); 6585 break; 6586 } 6587 case RE_OP_FORK: { 6588 re_add_state(pThis, x+pRe->aArg[x]); 6589 re_add_state(pThis, x+1); 6590 break; 6591 } 6592 case RE_OP_GOTO: { 6593 re_add_state(pThis, x+pRe->aArg[x]); 6594 break; 6595 } 6596 case RE_OP_ACCEPT: { 6597 rc = 1; 6598 goto re_match_end; 6599 } 6600 case RE_OP_CC_EXC: { 6601 if( c==0 ) break; 6602 /* fall-through */ goto re_op_cc_inc; 6603 } 6604 case RE_OP_CC_INC: re_op_cc_inc: { 6605 int j = 1; 6606 int n = pRe->aArg[x]; 6607 int hit = 0; 6608 for(j=1; j>0 && j<n; j++){ 6609 if( pRe->aOp[x+j]==RE_OP_CC_VALUE ){ 6610 if( pRe->aArg[x+j]==c ){ 6611 hit = 1; 6612 j = -1; 6613 } 6614 }else{ 6615 if( pRe->aArg[x+j]<=c && pRe->aArg[x+j+1]>=c ){ 6616 hit = 1; 6617 j = -1; 6618 }else{ 6619 j++; 6620 } 6621 } 6622 } 6623 if( pRe->aOp[x]==RE_OP_CC_EXC ) hit = !hit; 6624 if( hit ) re_add_state(pNext, x+n); 6625 break; 6626 } 6627 } 6628 } 6629 } 6630 for(i=0; i<pNext->nState; i++){ 6631 int x = pNext->aState[i]; 6632 while( pRe->aOp[x]==RE_OP_GOTO ) x += pRe->aArg[x]; 6633 if( pRe->aOp[x]==RE_OP_ACCEPT ){ rc = 1; break; } 6634 } 6635 re_match_end: 6636 sqlite3_free(pToFree); 6637 return rc; 6638 } 6639 6640 /* Resize the opcode and argument arrays for an RE under construction. 6641 */ 6642 static int re_resize(ReCompiled *p, int N){ 6643 char *aOp; 6644 int *aArg; 6645 aOp = sqlite3_realloc64(p->aOp, N*sizeof(p->aOp[0])); 6646 if( aOp==0 ) return 1; 6647 p->aOp = aOp; 6648 aArg = sqlite3_realloc64(p->aArg, N*sizeof(p->aArg[0])); 6649 if( aArg==0 ) return 1; 6650 p->aArg = aArg; 6651 p->nAlloc = N; 6652 return 0; 6653 } 6654 6655 /* Insert a new opcode and argument into an RE under construction. The 6656 ** insertion point is just prior to existing opcode iBefore. 6657 */ 6658 static int re_insert(ReCompiled *p, int iBefore, int op, int arg){ 6659 int i; 6660 if( p->nAlloc<=p->nState && re_resize(p, p->nAlloc*2) ) return 0; 6661 for(i=p->nState; i>iBefore; i--){ 6662 p->aOp[i] = p->aOp[i-1]; 6663 p->aArg[i] = p->aArg[i-1]; 6664 } 6665 p->nState++; 6666 p->aOp[iBefore] = (char)op; 6667 p->aArg[iBefore] = arg; 6668 return iBefore; 6669 } 6670 6671 /* Append a new opcode and argument to the end of the RE under construction. 6672 */ 6673 static int re_append(ReCompiled *p, int op, int arg){ 6674 return re_insert(p, p->nState, op, arg); 6675 } 6676 6677 /* Make a copy of N opcodes starting at iStart onto the end of the RE 6678 ** under construction. 6679 */ 6680 static void re_copy(ReCompiled *p, int iStart, int N){ 6681 if( p->nState+N>=p->nAlloc && re_resize(p, p->nAlloc*2+N) ) return; 6682 memcpy(&p->aOp[p->nState], &p->aOp[iStart], N*sizeof(p->aOp[0])); 6683 memcpy(&p->aArg[p->nState], &p->aArg[iStart], N*sizeof(p->aArg[0])); 6684 p->nState += N; 6685 } 6686 6687 /* Return true if c is a hexadecimal digit character: [0-9a-fA-F] 6688 ** If c is a hex digit, also set *pV = (*pV)*16 + valueof(c). If 6689 ** c is not a hex digit *pV is unchanged. 6690 */ 6691 static int re_hex(int c, int *pV){ 6692 if( c>='0' && c<='9' ){ 6693 c -= '0'; 6694 }else if( c>='a' && c<='f' ){ 6695 c -= 'a' - 10; 6696 }else if( c>='A' && c<='F' ){ 6697 c -= 'A' - 10; 6698 }else{ 6699 return 0; 6700 } 6701 *pV = (*pV)*16 + (c & 0xff); 6702 return 1; 6703 } 6704 6705 /* A backslash character has been seen, read the next character and 6706 ** return its interpretation. 6707 */ 6708 static unsigned re_esc_char(ReCompiled *p){ 6709 static const char zEsc[] = "afnrtv\\()*.+?[$^{|}]"; 6710 static const char zTrans[] = "\a\f\n\r\t\v"; 6711 int i, v = 0; 6712 char c; 6713 if( p->sIn.i>=p->sIn.mx ) return 0; 6714 c = p->sIn.z[p->sIn.i]; 6715 if( c=='u' && p->sIn.i+4<p->sIn.mx ){ 6716 const unsigned char *zIn = p->sIn.z + p->sIn.i; 6717 if( re_hex(zIn[1],&v) 6718 && re_hex(zIn[2],&v) 6719 && re_hex(zIn[3],&v) 6720 && re_hex(zIn[4],&v) 6721 ){ 6722 p->sIn.i += 5; 6723 return v; 6724 } 6725 } 6726 if( c=='x' && p->sIn.i+2<p->sIn.mx ){ 6727 const unsigned char *zIn = p->sIn.z + p->sIn.i; 6728 if( re_hex(zIn[1],&v) 6729 && re_hex(zIn[2],&v) 6730 ){ 6731 p->sIn.i += 3; 6732 return v; 6733 } 6734 } 6735 for(i=0; zEsc[i] && zEsc[i]!=c; i++){} 6736 if( zEsc[i] ){ 6737 if( i<6 ) c = zTrans[i]; 6738 p->sIn.i++; 6739 }else{ 6740 p->zErr = "unknown \\ escape"; 6741 } 6742 return c; 6743 } 6744 6745 /* Forward declaration */ 6746 static const char *re_subcompile_string(ReCompiled*); 6747 6748 /* Peek at the next byte of input */ 6749 static unsigned char rePeek(ReCompiled *p){ 6750 return p->sIn.i<p->sIn.mx ? p->sIn.z[p->sIn.i] : 0; 6751 } 6752 6753 /* Compile RE text into a sequence of opcodes. Continue up to the 6754 ** first unmatched ")" character, then return. If an error is found, 6755 ** return a pointer to the error message string. 6756 */ 6757 static const char *re_subcompile_re(ReCompiled *p){ 6758 const char *zErr; 6759 int iStart, iEnd, iGoto; 6760 iStart = p->nState; 6761 zErr = re_subcompile_string(p); 6762 if( zErr ) return zErr; 6763 while( rePeek(p)=='|' ){ 6764 iEnd = p->nState; 6765 re_insert(p, iStart, RE_OP_FORK, iEnd + 2 - iStart); 6766 iGoto = re_append(p, RE_OP_GOTO, 0); 6767 p->sIn.i++; 6768 zErr = re_subcompile_string(p); 6769 if( zErr ) return zErr; 6770 p->aArg[iGoto] = p->nState - iGoto; 6771 } 6772 return 0; 6773 } 6774 6775 /* Compile an element of regular expression text (anything that can be 6776 ** an operand to the "|" operator). Return NULL on success or a pointer 6777 ** to the error message if there is a problem. 6778 */ 6779 static const char *re_subcompile_string(ReCompiled *p){ 6780 int iPrev = -1; 6781 int iStart; 6782 unsigned c; 6783 const char *zErr; 6784 while( (c = p->xNextChar(&p->sIn))!=0 ){ 6785 iStart = p->nState; 6786 switch( c ){ 6787 case '|': 6788 case ')': { 6789 p->sIn.i--; 6790 return 0; 6791 } 6792 case '(': { 6793 zErr = re_subcompile_re(p); 6794 if( zErr ) return zErr; 6795 if( rePeek(p)!=')' ) return "unmatched '('"; 6796 p->sIn.i++; 6797 break; 6798 } 6799 case '.': { 6800 if( rePeek(p)=='*' ){ 6801 re_append(p, RE_OP_ANYSTAR, 0); 6802 p->sIn.i++; 6803 }else{ 6804 re_append(p, RE_OP_ANY, 0); 6805 } 6806 break; 6807 } 6808 case '*': { 6809 if( iPrev<0 ) return "'*' without operand"; 6810 re_insert(p, iPrev, RE_OP_GOTO, p->nState - iPrev + 1); 6811 re_append(p, RE_OP_FORK, iPrev - p->nState + 1); 6812 break; 6813 } 6814 case '+': { 6815 if( iPrev<0 ) return "'+' without operand"; 6816 re_append(p, RE_OP_FORK, iPrev - p->nState); 6817 break; 6818 } 6819 case '?': { 6820 if( iPrev<0 ) return "'?' without operand"; 6821 re_insert(p, iPrev, RE_OP_FORK, p->nState - iPrev+1); 6822 break; 6823 } 6824 case '$': { 6825 re_append(p, RE_OP_MATCH, RE_EOF); 6826 break; 6827 } 6828 case '^': { 6829 re_append(p, RE_OP_ATSTART, 0); 6830 break; 6831 } 6832 case '{': { 6833 int m = 0, n = 0; 6834 int sz, j; 6835 if( iPrev<0 ) return "'{m,n}' without operand"; 6836 while( (c=rePeek(p))>='0' && c<='9' ){ m = m*10 + c - '0'; p->sIn.i++; } 6837 n = m; 6838 if( c==',' ){ 6839 p->sIn.i++; 6840 n = 0; 6841 while( (c=rePeek(p))>='0' && c<='9' ){ n = n*10 + c-'0'; p->sIn.i++; } 6842 } 6843 if( c!='}' ) return "unmatched '{'"; 6844 if( n>0 && n<m ) return "n less than m in '{m,n}'"; 6845 p->sIn.i++; 6846 sz = p->nState - iPrev; 6847 if( m==0 ){ 6848 if( n==0 ) return "both m and n are zero in '{m,n}'"; 6849 re_insert(p, iPrev, RE_OP_FORK, sz+1); 6850 iPrev++; 6851 n--; 6852 }else{ 6853 for(j=1; j<m; j++) re_copy(p, iPrev, sz); 6854 } 6855 for(j=m; j<n; j++){ 6856 re_append(p, RE_OP_FORK, sz+1); 6857 re_copy(p, iPrev, sz); 6858 } 6859 if( n==0 && m>0 ){ 6860 re_append(p, RE_OP_FORK, -sz); 6861 } 6862 break; 6863 } 6864 case '[': { 6865 unsigned int iFirst = p->nState; 6866 if( rePeek(p)=='^' ){ 6867 re_append(p, RE_OP_CC_EXC, 0); 6868 p->sIn.i++; 6869 }else{ 6870 re_append(p, RE_OP_CC_INC, 0); 6871 } 6872 while( (c = p->xNextChar(&p->sIn))!=0 ){ 6873 if( c=='[' && rePeek(p)==':' ){ 6874 return "POSIX character classes not supported"; 6875 } 6876 if( c=='\\' ) c = re_esc_char(p); 6877 if( rePeek(p)=='-' ){ 6878 re_append(p, RE_OP_CC_RANGE, c); 6879 p->sIn.i++; 6880 c = p->xNextChar(&p->sIn); 6881 if( c=='\\' ) c = re_esc_char(p); 6882 re_append(p, RE_OP_CC_RANGE, c); 6883 }else{ 6884 re_append(p, RE_OP_CC_VALUE, c); 6885 } 6886 if( rePeek(p)==']' ){ p->sIn.i++; break; } 6887 } 6888 if( c==0 ) return "unclosed '['"; 6889 if( p->nState>iFirst ) p->aArg[iFirst] = p->nState - iFirst; 6890 break; 6891 } 6892 case '\\': { 6893 int specialOp = 0; 6894 switch( rePeek(p) ){ 6895 case 'b': specialOp = RE_OP_BOUNDARY; break; 6896 case 'd': specialOp = RE_OP_DIGIT; break; 6897 case 'D': specialOp = RE_OP_NOTDIGIT; break; 6898 case 's': specialOp = RE_OP_SPACE; break; 6899 case 'S': specialOp = RE_OP_NOTSPACE; break; 6900 case 'w': specialOp = RE_OP_WORD; break; 6901 case 'W': specialOp = RE_OP_NOTWORD; break; 6902 } 6903 if( specialOp ){ 6904 p->sIn.i++; 6905 re_append(p, specialOp, 0); 6906 }else{ 6907 c = re_esc_char(p); 6908 re_append(p, RE_OP_MATCH, c); 6909 } 6910 break; 6911 } 6912 default: { 6913 re_append(p, RE_OP_MATCH, c); 6914 break; 6915 } 6916 } 6917 iPrev = iStart; 6918 } 6919 return 0; 6920 } 6921 6922 /* Free and reclaim all the memory used by a previously compiled 6923 ** regular expression. Applications should invoke this routine once 6924 ** for every call to re_compile() to avoid memory leaks. 6925 */ 6926 static void re_free(ReCompiled *pRe){ 6927 if( pRe ){ 6928 sqlite3_free(pRe->aOp); 6929 sqlite3_free(pRe->aArg); 6930 sqlite3_free(pRe); 6931 } 6932 } 6933 6934 /* 6935 ** Compile a textual regular expression in zIn[] into a compiled regular 6936 ** expression suitable for us by re_match() and return a pointer to the 6937 ** compiled regular expression in *ppRe. Return NULL on success or an 6938 ** error message if something goes wrong. 6939 */ 6940 static const char *re_compile(ReCompiled **ppRe, const char *zIn, int noCase){ 6941 ReCompiled *pRe; 6942 const char *zErr; 6943 int i, j; 6944 6945 *ppRe = 0; 6946 pRe = sqlite3_malloc( sizeof(*pRe) ); 6947 if( pRe==0 ){ 6948 return "out of memory"; 6949 } 6950 memset(pRe, 0, sizeof(*pRe)); 6951 pRe->xNextChar = noCase ? re_next_char_nocase : re_next_char; 6952 if( re_resize(pRe, 30) ){ 6953 re_free(pRe); 6954 return "out of memory"; 6955 } 6956 if( zIn[0]=='^' ){ 6957 zIn++; 6958 }else{ 6959 re_append(pRe, RE_OP_ANYSTAR, 0); 6960 } 6961 pRe->sIn.z = (unsigned char*)zIn; 6962 pRe->sIn.i = 0; 6963 pRe->sIn.mx = (int)strlen(zIn); 6964 zErr = re_subcompile_re(pRe); 6965 if( zErr ){ 6966 re_free(pRe); 6967 return zErr; 6968 } 6969 if( pRe->sIn.i>=pRe->sIn.mx ){ 6970 re_append(pRe, RE_OP_ACCEPT, 0); 6971 *ppRe = pRe; 6972 }else{ 6973 re_free(pRe); 6974 return "unrecognized character"; 6975 } 6976 6977 /* The following is a performance optimization. If the regex begins with 6978 ** ".*" (if the input regex lacks an initial "^") and afterwards there are 6979 ** one or more matching characters, enter those matching characters into 6980 ** zInit[]. The re_match() routine can then search ahead in the input 6981 ** string looking for the initial match without having to run the whole 6982 ** regex engine over the string. Do not worry about trying to match 6983 ** unicode characters beyond plane 0 - those are very rare and this is 6984 ** just an optimization. */ 6985 if( pRe->aOp[0]==RE_OP_ANYSTAR && !noCase ){ 6986 for(j=0, i=1; j<(int)sizeof(pRe->zInit)-2 && pRe->aOp[i]==RE_OP_MATCH; i++){ 6987 unsigned x = pRe->aArg[i]; 6988 if( x<=0x7f ){ 6989 pRe->zInit[j++] = (unsigned char)x; 6990 }else if( x<=0x7ff ){ 6991 pRe->zInit[j++] = (unsigned char)(0xc0 | (x>>6)); 6992 pRe->zInit[j++] = 0x80 | (x&0x3f); 6993 }else if( x<=0xffff ){ 6994 pRe->zInit[j++] = (unsigned char)(0xe0 | (x>>12)); 6995 pRe->zInit[j++] = 0x80 | ((x>>6)&0x3f); 6996 pRe->zInit[j++] = 0x80 | (x&0x3f); 6997 }else{ 6998 break; 6999 } 7000 } 7001 if( j>0 && pRe->zInit[j-1]==0 ) j--; 7002 pRe->nInit = j; 7003 } 7004 return pRe->zErr; 7005 } 7006 7007 /* 7008 ** Implementation of the regexp() SQL function. This function implements 7009 ** the build-in REGEXP operator. The first argument to the function is the 7010 ** pattern and the second argument is the string. So, the SQL statements: 7011 ** 7012 ** A REGEXP B 7013 ** 7014 ** is implemented as regexp(B,A). 7015 */ 7016 static void re_sql_func( 7017 sqlite3_context *context, 7018 int argc, 7019 sqlite3_value **argv 7020 ){ 7021 ReCompiled *pRe; /* Compiled regular expression */ 7022 const char *zPattern; /* The regular expression */ 7023 const unsigned char *zStr;/* String being searched */ 7024 const char *zErr; /* Compile error message */ 7025 int setAux = 0; /* True to invoke sqlite3_set_auxdata() */ 7026 7027 (void)argc; /* Unused */ 7028 pRe = sqlite3_get_auxdata(context, 0); 7029 if( pRe==0 ){ 7030 zPattern = (const char*)sqlite3_value_text(argv[0]); 7031 if( zPattern==0 ) return; 7032 zErr = re_compile(&pRe, zPattern, sqlite3_user_data(context)!=0); 7033 if( zErr ){ 7034 re_free(pRe); 7035 sqlite3_result_error(context, zErr, -1); 7036 return; 7037 } 7038 if( pRe==0 ){ 7039 sqlite3_result_error_nomem(context); 7040 return; 7041 } 7042 setAux = 1; 7043 } 7044 zStr = (const unsigned char*)sqlite3_value_text(argv[1]); 7045 if( zStr!=0 ){ 7046 sqlite3_result_int(context, re_match(pRe, zStr, -1)); 7047 } 7048 if( setAux ){ 7049 sqlite3_set_auxdata(context, 0, pRe, (void(*)(void*))re_free); 7050 } 7051 } 7052 7053 #if defined(SQLITE_DEBUG) 7054 /* 7055 ** This function is used for testing and debugging only. It is only available 7056 ** if the SQLITE_DEBUG compile-time option is used. 7057 ** 7058 ** Compile a regular expression and then convert the compiled expression into 7059 ** text and return that text. 7060 */ 7061 static void re_bytecode_func( 7062 sqlite3_context *context, 7063 int argc, 7064 sqlite3_value **argv 7065 ){ 7066 const char *zPattern; 7067 const char *zErr; 7068 ReCompiled *pRe; 7069 sqlite3_str *pStr; 7070 int i; 7071 int n; 7072 char *z; 7073 (void)argc; 7074 7075 zPattern = (const char*)sqlite3_value_text(argv[0]); 7076 if( zPattern==0 ) return; 7077 zErr = re_compile(&pRe, zPattern, sqlite3_user_data(context)!=0); 7078 if( zErr ){ 7079 re_free(pRe); 7080 sqlite3_result_error(context, zErr, -1); 7081 return; 7082 } 7083 if( pRe==0 ){ 7084 sqlite3_result_error_nomem(context); 7085 return; 7086 } 7087 pStr = sqlite3_str_new(0); 7088 if( pStr==0 ) goto re_bytecode_func_err; 7089 if( pRe->nInit>0 ){ 7090 sqlite3_str_appendf(pStr, "INIT "); 7091 for(i=0; i<pRe->nInit; i++){ 7092 sqlite3_str_appendf(pStr, "%02x", pRe->zInit[i]); 7093 } 7094 sqlite3_str_appendf(pStr, "\n"); 7095 } 7096 for(i=0; (unsigned)i<pRe->nState; i++){ 7097 sqlite3_str_appendf(pStr, "%-8s %4d\n", 7098 ReOpName[(unsigned char)pRe->aOp[i]], pRe->aArg[i]); 7099 } 7100 n = sqlite3_str_length(pStr); 7101 z = sqlite3_str_finish(pStr); 7102 if( n==0 ){ 7103 sqlite3_free(z); 7104 }else{ 7105 sqlite3_result_text(context, z, n-1, sqlite3_free); 7106 } 7107 7108 re_bytecode_func_err: 7109 re_free(pRe); 7110 } 7111 7112 #endif /* SQLITE_DEBUG */ 7113 7114 7115 /* 7116 ** Invoke this routine to register the regexp() function with the 7117 ** SQLite database connection. 7118 */ 7119 #ifdef _WIN32 7120 7121 #endif 7122 int sqlite3_regexp_init( 7123 sqlite3 *db, 7124 char **pzErrMsg, 7125 const sqlite3_api_routines *pApi 7126 ){ 7127 int rc = SQLITE_OK; 7128 SQLITE_EXTENSION_INIT2(pApi); 7129 (void)pzErrMsg; /* Unused */ 7130 rc = sqlite3_create_function(db, "regexp", 2, 7131 SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC, 7132 0, re_sql_func, 0, 0); 7133 if( rc==SQLITE_OK ){ 7134 /* The regexpi(PATTERN,STRING) function is a case-insensitive version 7135 ** of regexp(PATTERN,STRING). */ 7136 rc = sqlite3_create_function(db, "regexpi", 2, 7137 SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC, 7138 (void*)db, re_sql_func, 0, 0); 7139 #if defined(SQLITE_DEBUG) 7140 if( rc==SQLITE_OK ){ 7141 rc = sqlite3_create_function(db, "regexp_bytecode", 1, 7142 SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC, 7143 0, re_bytecode_func, 0, 0); 7144 } 7145 #endif /* SQLITE_DEBUG */ 7146 } 7147 return rc; 7148 } 7149 7150 /************************* End ../ext/misc/regexp.c ********************/ 7151 #ifndef SQLITE_SHELL_FIDDLE 7152 /************************* Begin ../ext/misc/fileio.c ******************/ 7153 /* 7154 ** 2014-06-13 7155 ** 7156 ** The author disclaims copyright to this source code. In place of 7157 ** a legal notice, here is a blessing: 7158 ** 7159 ** May you do good and not evil. 7160 ** May you find forgiveness for yourself and forgive others. 7161 ** May you share freely, never taking more than you give. 7162 ** 7163 ****************************************************************************** 7164 ** 7165 ** This SQLite extension implements SQL functions readfile() and 7166 ** writefile(), and eponymous virtual type "fsdir". 7167 ** 7168 ** WRITEFILE(FILE, DATA [, MODE [, MTIME]]): 7169 ** 7170 ** If neither of the optional arguments is present, then this UDF 7171 ** function writes blob DATA to file FILE. If successful, the number 7172 ** of bytes written is returned. If an error occurs, NULL is returned. 7173 ** 7174 ** If the first option argument - MODE - is present, then it must 7175 ** be passed an integer value that corresponds to a POSIX mode 7176 ** value (file type + permissions, as returned in the stat.st_mode 7177 ** field by the stat() system call). Three types of files may 7178 ** be written/created: 7179 ** 7180 ** regular files: (mode & 0170000)==0100000 7181 ** symbolic links: (mode & 0170000)==0120000 7182 ** directories: (mode & 0170000)==0040000 7183 ** 7184 ** For a directory, the DATA is ignored. For a symbolic link, it is 7185 ** interpreted as text and used as the target of the link. For a 7186 ** regular file, it is interpreted as a blob and written into the 7187 ** named file. Regardless of the type of file, its permissions are 7188 ** set to (mode & 0777) before returning. 7189 ** 7190 ** If the optional MTIME argument is present, then it is interpreted 7191 ** as an integer - the number of seconds since the unix epoch. The 7192 ** modification-time of the target file is set to this value before 7193 ** returning. 7194 ** 7195 ** If three or more arguments are passed to this function and an 7196 ** error is encountered, an exception is raised. 7197 ** 7198 ** READFILE(FILE): 7199 ** 7200 ** Read and return the contents of file FILE (type blob) from disk. 7201 ** 7202 ** FSDIR: 7203 ** 7204 ** Used as follows: 7205 ** 7206 ** SELECT * FROM fsdir($path [, $dir]); 7207 ** 7208 ** Parameter $path is an absolute or relative pathname. If the file that it 7209 ** refers to does not exist, it is an error. If the path refers to a regular 7210 ** file or symbolic link, it returns a single row. Or, if the path refers 7211 ** to a directory, it returns one row for the directory, and one row for each 7212 ** file within the hierarchy rooted at $path. 7213 ** 7214 ** Each row has the following columns: 7215 ** 7216 ** name: Path to file or directory (text value). 7217 ** mode: Value of stat.st_mode for directory entry (an integer). 7218 ** mtime: Value of stat.st_mtime for directory entry (an integer). 7219 ** data: For a regular file, a blob containing the file data. For a 7220 ** symlink, a text value containing the text of the link. For a 7221 ** directory, NULL. 7222 ** 7223 ** If a non-NULL value is specified for the optional $dir parameter and 7224 ** $path is a relative path, then $path is interpreted relative to $dir. 7225 ** And the paths returned in the "name" column of the table are also 7226 ** relative to directory $dir. 7227 ** 7228 ** Notes on building this extension for Windows: 7229 ** Unless linked statically with the SQLite library, a preprocessor 7230 ** symbol, FILEIO_WIN32_DLL, must be #define'd to create a stand-alone 7231 ** DLL form of this extension for WIN32. See its use below for details. 7232 */ 7233 /* #include "sqlite3ext.h" */ 7234 SQLITE_EXTENSION_INIT1 7235 #include <stdio.h> 7236 #include <string.h> 7237 #include <assert.h> 7238 7239 #include <sys/types.h> 7240 #include <sys/stat.h> 7241 #include <fcntl.h> 7242 #if !defined(_WIN32) && !defined(WIN32) 7243 # include <unistd.h> 7244 # include <dirent.h> 7245 # include <utime.h> 7246 # include <sys/time.h> 7247 #else 7248 # include "windows.h" 7249 # include <io.h> 7250 # include <direct.h> 7251 /* # include "test_windirent.h" */ 7252 # define dirent DIRENT 7253 # ifndef chmod 7254 # define chmod _chmod 7255 # endif 7256 # ifndef stat 7257 # define stat _stat 7258 # endif 7259 # define mkdir(path,mode) _mkdir(path) 7260 # define lstat(path,buf) stat(path,buf) 7261 #endif 7262 #include <time.h> 7263 #include <errno.h> 7264 7265 7266 /* 7267 ** Structure of the fsdir() table-valued function 7268 */ 7269 /* 0 1 2 3 4 5 */ 7270 #define FSDIR_SCHEMA "(name,mode,mtime,data,path HIDDEN,dir HIDDEN)" 7271 #define FSDIR_COLUMN_NAME 0 /* Name of the file */ 7272 #define FSDIR_COLUMN_MODE 1 /* Access mode */ 7273 #define FSDIR_COLUMN_MTIME 2 /* Last modification time */ 7274 #define FSDIR_COLUMN_DATA 3 /* File content */ 7275 #define FSDIR_COLUMN_PATH 4 /* Path to top of search */ 7276 #define FSDIR_COLUMN_DIR 5 /* Path is relative to this directory */ 7277 7278 7279 /* 7280 ** Set the result stored by context ctx to a blob containing the 7281 ** contents of file zName. Or, leave the result unchanged (NULL) 7282 ** if the file does not exist or is unreadable. 7283 ** 7284 ** If the file exceeds the SQLite blob size limit, through an 7285 ** SQLITE_TOOBIG error. 7286 ** 7287 ** Throw an SQLITE_IOERR if there are difficulties pulling the file 7288 ** off of disk. 7289 */ 7290 static void readFileContents(sqlite3_context *ctx, const char *zName){ 7291 FILE *in; 7292 sqlite3_int64 nIn; 7293 void *pBuf; 7294 sqlite3 *db; 7295 int mxBlob; 7296 7297 in = fopen(zName, "rb"); 7298 if( in==0 ){ 7299 /* File does not exist or is unreadable. Leave the result set to NULL. */ 7300 return; 7301 } 7302 fseek(in, 0, SEEK_END); 7303 nIn = ftell(in); 7304 rewind(in); 7305 db = sqlite3_context_db_handle(ctx); 7306 mxBlob = sqlite3_limit(db, SQLITE_LIMIT_LENGTH, -1); 7307 if( nIn>mxBlob ){ 7308 sqlite3_result_error_code(ctx, SQLITE_TOOBIG); 7309 fclose(in); 7310 return; 7311 } 7312 pBuf = sqlite3_malloc64( nIn ? nIn : 1 ); 7313 if( pBuf==0 ){ 7314 sqlite3_result_error_nomem(ctx); 7315 fclose(in); 7316 return; 7317 } 7318 if( nIn==(sqlite3_int64)fread(pBuf, 1, (size_t)nIn, in) ){ 7319 sqlite3_result_blob64(ctx, pBuf, nIn, sqlite3_free); 7320 }else{ 7321 sqlite3_result_error_code(ctx, SQLITE_IOERR); 7322 sqlite3_free(pBuf); 7323 } 7324 fclose(in); 7325 } 7326 7327 /* 7328 ** Implementation of the "readfile(X)" SQL function. The entire content 7329 ** of the file named X is read and returned as a BLOB. NULL is returned 7330 ** if the file does not exist or is unreadable. 7331 */ 7332 static void readfileFunc( 7333 sqlite3_context *context, 7334 int argc, 7335 sqlite3_value **argv 7336 ){ 7337 const char *zName; 7338 (void)(argc); /* Unused parameter */ 7339 zName = (const char*)sqlite3_value_text(argv[0]); 7340 if( zName==0 ) return; 7341 readFileContents(context, zName); 7342 } 7343 7344 /* 7345 ** Set the error message contained in context ctx to the results of 7346 ** vprintf(zFmt, ...). 7347 */ 7348 static void ctxErrorMsg(sqlite3_context *ctx, const char *zFmt, ...){ 7349 char *zMsg = 0; 7350 va_list ap; 7351 va_start(ap, zFmt); 7352 zMsg = sqlite3_vmprintf(zFmt, ap); 7353 sqlite3_result_error(ctx, zMsg, -1); 7354 sqlite3_free(zMsg); 7355 va_end(ap); 7356 } 7357 7358 #if defined(_WIN32) 7359 /* 7360 ** This function is designed to convert a Win32 FILETIME structure into the 7361 ** number of seconds since the Unix Epoch (1970-01-01 00:00:00 UTC). 7362 */ 7363 static sqlite3_uint64 fileTimeToUnixTime( 7364 LPFILETIME pFileTime 7365 ){ 7366 SYSTEMTIME epochSystemTime; 7367 ULARGE_INTEGER epochIntervals; 7368 FILETIME epochFileTime; 7369 ULARGE_INTEGER fileIntervals; 7370 7371 memset(&epochSystemTime, 0, sizeof(SYSTEMTIME)); 7372 epochSystemTime.wYear = 1970; 7373 epochSystemTime.wMonth = 1; 7374 epochSystemTime.wDay = 1; 7375 SystemTimeToFileTime(&epochSystemTime, &epochFileTime); 7376 epochIntervals.LowPart = epochFileTime.dwLowDateTime; 7377 epochIntervals.HighPart = epochFileTime.dwHighDateTime; 7378 7379 fileIntervals.LowPart = pFileTime->dwLowDateTime; 7380 fileIntervals.HighPart = pFileTime->dwHighDateTime; 7381 7382 return (fileIntervals.QuadPart - epochIntervals.QuadPart) / 10000000; 7383 } 7384 7385 7386 #if defined(FILEIO_WIN32_DLL) && (defined(_WIN32) || defined(WIN32)) 7387 # /* To allow a standalone DLL, use this next replacement function: */ 7388 # undef sqlite3_win32_utf8_to_unicode 7389 # define sqlite3_win32_utf8_to_unicode utf8_to_utf16 7390 # 7391 LPWSTR utf8_to_utf16(const char *z){ 7392 int nAllot = MultiByteToWideChar(CP_UTF8, 0, z, -1, NULL, 0); 7393 LPWSTR rv = sqlite3_malloc(nAllot * sizeof(WCHAR)); 7394 if( rv!=0 && 0 < MultiByteToWideChar(CP_UTF8, 0, z, -1, rv, nAllot) ) 7395 return rv; 7396 sqlite3_free(rv); 7397 return 0; 7398 } 7399 #endif 7400 7401 /* 7402 ** This function attempts to normalize the time values found in the stat() 7403 ** buffer to UTC. This is necessary on Win32, where the runtime library 7404 ** appears to return these values as local times. 7405 */ 7406 static void statTimesToUtc( 7407 const char *zPath, 7408 struct stat *pStatBuf 7409 ){ 7410 HANDLE hFindFile; 7411 WIN32_FIND_DATAW fd; 7412 LPWSTR zUnicodeName; 7413 extern LPWSTR sqlite3_win32_utf8_to_unicode(const char*); 7414 zUnicodeName = sqlite3_win32_utf8_to_unicode(zPath); 7415 if( zUnicodeName ){ 7416 memset(&fd, 0, sizeof(WIN32_FIND_DATAW)); 7417 hFindFile = FindFirstFileW(zUnicodeName, &fd); 7418 if( hFindFile!=NULL ){ 7419 pStatBuf->st_ctime = (time_t)fileTimeToUnixTime(&fd.ftCreationTime); 7420 pStatBuf->st_atime = (time_t)fileTimeToUnixTime(&fd.ftLastAccessTime); 7421 pStatBuf->st_mtime = (time_t)fileTimeToUnixTime(&fd.ftLastWriteTime); 7422 FindClose(hFindFile); 7423 } 7424 sqlite3_free(zUnicodeName); 7425 } 7426 } 7427 #endif 7428 7429 /* 7430 ** This function is used in place of stat(). On Windows, special handling 7431 ** is required in order for the included time to be returned as UTC. On all 7432 ** other systems, this function simply calls stat(). 7433 */ 7434 static int fileStat( 7435 const char *zPath, 7436 struct stat *pStatBuf 7437 ){ 7438 #if defined(_WIN32) 7439 int rc = stat(zPath, pStatBuf); 7440 if( rc==0 ) statTimesToUtc(zPath, pStatBuf); 7441 return rc; 7442 #else 7443 return stat(zPath, pStatBuf); 7444 #endif 7445 } 7446 7447 /* 7448 ** This function is used in place of lstat(). On Windows, special handling 7449 ** is required in order for the included time to be returned as UTC. On all 7450 ** other systems, this function simply calls lstat(). 7451 */ 7452 static int fileLinkStat( 7453 const char *zPath, 7454 struct stat *pStatBuf 7455 ){ 7456 #if defined(_WIN32) 7457 int rc = lstat(zPath, pStatBuf); 7458 if( rc==0 ) statTimesToUtc(zPath, pStatBuf); 7459 return rc; 7460 #else 7461 return lstat(zPath, pStatBuf); 7462 #endif 7463 } 7464 7465 /* 7466 ** Argument zFile is the name of a file that will be created and/or written 7467 ** by SQL function writefile(). This function ensures that the directory 7468 ** zFile will be written to exists, creating it if required. The permissions 7469 ** for any path components created by this function are set in accordance 7470 ** with the current umask. 7471 ** 7472 ** If an OOM condition is encountered, SQLITE_NOMEM is returned. Otherwise, 7473 ** SQLITE_OK is returned if the directory is successfully created, or 7474 ** SQLITE_ERROR otherwise. 7475 */ 7476 static int makeDirectory( 7477 const char *zFile 7478 ){ 7479 char *zCopy = sqlite3_mprintf("%s", zFile); 7480 int rc = SQLITE_OK; 7481 7482 if( zCopy==0 ){ 7483 rc = SQLITE_NOMEM; 7484 }else{ 7485 int nCopy = (int)strlen(zCopy); 7486 int i = 1; 7487 7488 while( rc==SQLITE_OK ){ 7489 struct stat sStat; 7490 int rc2; 7491 7492 for(; zCopy[i]!='/' && i<nCopy; i++); 7493 if( i==nCopy ) break; 7494 zCopy[i] = '\0'; 7495 7496 rc2 = fileStat(zCopy, &sStat); 7497 if( rc2!=0 ){ 7498 if( mkdir(zCopy, 0777) ) rc = SQLITE_ERROR; 7499 }else{ 7500 if( !S_ISDIR(sStat.st_mode) ) rc = SQLITE_ERROR; 7501 } 7502 zCopy[i] = '/'; 7503 i++; 7504 } 7505 7506 sqlite3_free(zCopy); 7507 } 7508 7509 return rc; 7510 } 7511 7512 /* 7513 ** This function does the work for the writefile() UDF. Refer to 7514 ** header comments at the top of this file for details. 7515 */ 7516 static int writeFile( 7517 sqlite3_context *pCtx, /* Context to return bytes written in */ 7518 const char *zFile, /* File to write */ 7519 sqlite3_value *pData, /* Data to write */ 7520 mode_t mode, /* MODE parameter passed to writefile() */ 7521 sqlite3_int64 mtime /* MTIME parameter (or -1 to not set time) */ 7522 ){ 7523 if( zFile==0 ) return 1; 7524 #if !defined(_WIN32) && !defined(WIN32) 7525 if( S_ISLNK(mode) ){ 7526 const char *zTo = (const char*)sqlite3_value_text(pData); 7527 if( zTo==0 ) return 1; 7528 unlink(zFile); 7529 if( symlink(zTo, zFile)<0 ) return 1; 7530 }else 7531 #endif 7532 { 7533 if( S_ISDIR(mode) ){ 7534 if( mkdir(zFile, mode) ){ 7535 /* The mkdir() call to create the directory failed. This might not 7536 ** be an error though - if there is already a directory at the same 7537 ** path and either the permissions already match or can be changed 7538 ** to do so using chmod(), it is not an error. */ 7539 struct stat sStat; 7540 if( errno!=EEXIST 7541 || 0!=fileStat(zFile, &sStat) 7542 || !S_ISDIR(sStat.st_mode) 7543 || ((sStat.st_mode&0777)!=(mode&0777) && 0!=chmod(zFile, mode&0777)) 7544 ){ 7545 return 1; 7546 } 7547 } 7548 }else{ 7549 sqlite3_int64 nWrite = 0; 7550 const char *z; 7551 int rc = 0; 7552 FILE *out = fopen(zFile, "wb"); 7553 if( out==0 ) return 1; 7554 z = (const char*)sqlite3_value_blob(pData); 7555 if( z ){ 7556 sqlite3_int64 n = fwrite(z, 1, sqlite3_value_bytes(pData), out); 7557 nWrite = sqlite3_value_bytes(pData); 7558 if( nWrite!=n ){ 7559 rc = 1; 7560 } 7561 } 7562 fclose(out); 7563 if( rc==0 && mode && chmod(zFile, mode & 0777) ){ 7564 rc = 1; 7565 } 7566 if( rc ) return 2; 7567 sqlite3_result_int64(pCtx, nWrite); 7568 } 7569 } 7570 7571 if( mtime>=0 ){ 7572 #if defined(_WIN32) 7573 #if !SQLITE_OS_WINRT 7574 /* Windows */ 7575 FILETIME lastAccess; 7576 FILETIME lastWrite; 7577 SYSTEMTIME currentTime; 7578 LONGLONG intervals; 7579 HANDLE hFile; 7580 LPWSTR zUnicodeName; 7581 extern LPWSTR sqlite3_win32_utf8_to_unicode(const char*); 7582 7583 GetSystemTime(¤tTime); 7584 SystemTimeToFileTime(¤tTime, &lastAccess); 7585 intervals = Int32x32To64(mtime, 10000000) + 116444736000000000; 7586 lastWrite.dwLowDateTime = (DWORD)intervals; 7587 lastWrite.dwHighDateTime = intervals >> 32; 7588 zUnicodeName = sqlite3_win32_utf8_to_unicode(zFile); 7589 if( zUnicodeName==0 ){ 7590 return 1; 7591 } 7592 hFile = CreateFileW( 7593 zUnicodeName, FILE_WRITE_ATTRIBUTES, 0, NULL, OPEN_EXISTING, 7594 FILE_FLAG_BACKUP_SEMANTICS, NULL 7595 ); 7596 sqlite3_free(zUnicodeName); 7597 if( hFile!=INVALID_HANDLE_VALUE ){ 7598 BOOL bResult = SetFileTime(hFile, NULL, &lastAccess, &lastWrite); 7599 CloseHandle(hFile); 7600 return !bResult; 7601 }else{ 7602 return 1; 7603 } 7604 #endif 7605 #elif defined(AT_FDCWD) && 0 /* utimensat() is not universally available */ 7606 /* Recent unix */ 7607 struct timespec times[2]; 7608 times[0].tv_nsec = times[1].tv_nsec = 0; 7609 times[0].tv_sec = time(0); 7610 times[1].tv_sec = mtime; 7611 if( utimensat(AT_FDCWD, zFile, times, AT_SYMLINK_NOFOLLOW) ){ 7612 return 1; 7613 } 7614 #else 7615 /* Legacy unix. 7616 ** 7617 ** Do not use utimes() on a symbolic link - it sees through the link and 7618 ** modifies the timestamps on the target. Or fails if the target does 7619 ** not exist. */ 7620 if( 0==S_ISLNK(mode) ){ 7621 struct timeval times[2]; 7622 times[0].tv_usec = times[1].tv_usec = 0; 7623 times[0].tv_sec = time(0); 7624 times[1].tv_sec = mtime; 7625 if( utimes(zFile, times) ){ 7626 return 1; 7627 } 7628 } 7629 #endif 7630 } 7631 7632 return 0; 7633 } 7634 7635 /* 7636 ** Implementation of the "writefile(W,X[,Y[,Z]]])" SQL function. 7637 ** Refer to header comments at the top of this file for details. 7638 */ 7639 static void writefileFunc( 7640 sqlite3_context *context, 7641 int argc, 7642 sqlite3_value **argv 7643 ){ 7644 const char *zFile; 7645 mode_t mode = 0; 7646 int res; 7647 sqlite3_int64 mtime = -1; 7648 7649 if( argc<2 || argc>4 ){ 7650 sqlite3_result_error(context, 7651 "wrong number of arguments to function writefile()", -1 7652 ); 7653 return; 7654 } 7655 7656 zFile = (const char*)sqlite3_value_text(argv[0]); 7657 if( zFile==0 ) return; 7658 if( argc>=3 ){ 7659 mode = (mode_t)sqlite3_value_int(argv[2]); 7660 } 7661 if( argc==4 ){ 7662 mtime = sqlite3_value_int64(argv[3]); 7663 } 7664 7665 res = writeFile(context, zFile, argv[1], mode, mtime); 7666 if( res==1 && errno==ENOENT ){ 7667 if( makeDirectory(zFile)==SQLITE_OK ){ 7668 res = writeFile(context, zFile, argv[1], mode, mtime); 7669 } 7670 } 7671 7672 if( argc>2 && res!=0 ){ 7673 if( S_ISLNK(mode) ){ 7674 ctxErrorMsg(context, "failed to create symlink: %s", zFile); 7675 }else if( S_ISDIR(mode) ){ 7676 ctxErrorMsg(context, "failed to create directory: %s", zFile); 7677 }else{ 7678 ctxErrorMsg(context, "failed to write file: %s", zFile); 7679 } 7680 } 7681 } 7682 7683 /* 7684 ** SQL function: lsmode(MODE) 7685 ** 7686 ** Given a numberic st_mode from stat(), convert it into a human-readable 7687 ** text string in the style of "ls -l". 7688 */ 7689 static void lsModeFunc( 7690 sqlite3_context *context, 7691 int argc, 7692 sqlite3_value **argv 7693 ){ 7694 int i; 7695 int iMode = sqlite3_value_int(argv[0]); 7696 char z[16]; 7697 (void)argc; 7698 if( S_ISLNK(iMode) ){ 7699 z[0] = 'l'; 7700 }else if( S_ISREG(iMode) ){ 7701 z[0] = '-'; 7702 }else if( S_ISDIR(iMode) ){ 7703 z[0] = 'd'; 7704 }else{ 7705 z[0] = '?'; 7706 } 7707 for(i=0; i<3; i++){ 7708 int m = (iMode >> ((2-i)*3)); 7709 char *a = &z[1 + i*3]; 7710 a[0] = (m & 0x4) ? 'r' : '-'; 7711 a[1] = (m & 0x2) ? 'w' : '-'; 7712 a[2] = (m & 0x1) ? 'x' : '-'; 7713 } 7714 z[10] = '\0'; 7715 sqlite3_result_text(context, z, -1, SQLITE_TRANSIENT); 7716 } 7717 7718 #ifndef SQLITE_OMIT_VIRTUALTABLE 7719 7720 /* 7721 ** Cursor type for recursively iterating through a directory structure. 7722 */ 7723 typedef struct fsdir_cursor fsdir_cursor; 7724 typedef struct FsdirLevel FsdirLevel; 7725 7726 struct FsdirLevel { 7727 DIR *pDir; /* From opendir() */ 7728 char *zDir; /* Name of directory (nul-terminated) */ 7729 }; 7730 7731 struct fsdir_cursor { 7732 sqlite3_vtab_cursor base; /* Base class - must be first */ 7733 7734 int nLvl; /* Number of entries in aLvl[] array */ 7735 int iLvl; /* Index of current entry */ 7736 FsdirLevel *aLvl; /* Hierarchy of directories being traversed */ 7737 7738 const char *zBase; 7739 int nBase; 7740 7741 struct stat sStat; /* Current lstat() results */ 7742 char *zPath; /* Path to current entry */ 7743 sqlite3_int64 iRowid; /* Current rowid */ 7744 }; 7745 7746 typedef struct fsdir_tab fsdir_tab; 7747 struct fsdir_tab { 7748 sqlite3_vtab base; /* Base class - must be first */ 7749 }; 7750 7751 /* 7752 ** Construct a new fsdir virtual table object. 7753 */ 7754 static int fsdirConnect( 7755 sqlite3 *db, 7756 void *pAux, 7757 int argc, const char *const*argv, 7758 sqlite3_vtab **ppVtab, 7759 char **pzErr 7760 ){ 7761 fsdir_tab *pNew = 0; 7762 int rc; 7763 (void)pAux; 7764 (void)argc; 7765 (void)argv; 7766 (void)pzErr; 7767 rc = sqlite3_declare_vtab(db, "CREATE TABLE x" FSDIR_SCHEMA); 7768 if( rc==SQLITE_OK ){ 7769 pNew = (fsdir_tab*)sqlite3_malloc( sizeof(*pNew) ); 7770 if( pNew==0 ) return SQLITE_NOMEM; 7771 memset(pNew, 0, sizeof(*pNew)); 7772 sqlite3_vtab_config(db, SQLITE_VTAB_DIRECTONLY); 7773 } 7774 *ppVtab = (sqlite3_vtab*)pNew; 7775 return rc; 7776 } 7777 7778 /* 7779 ** This method is the destructor for fsdir vtab objects. 7780 */ 7781 static int fsdirDisconnect(sqlite3_vtab *pVtab){ 7782 sqlite3_free(pVtab); 7783 return SQLITE_OK; 7784 } 7785 7786 /* 7787 ** Constructor for a new fsdir_cursor object. 7788 */ 7789 static int fsdirOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ 7790 fsdir_cursor *pCur; 7791 (void)p; 7792 pCur = sqlite3_malloc( sizeof(*pCur) ); 7793 if( pCur==0 ) return SQLITE_NOMEM; 7794 memset(pCur, 0, sizeof(*pCur)); 7795 pCur->iLvl = -1; 7796 *ppCursor = &pCur->base; 7797 return SQLITE_OK; 7798 } 7799 7800 /* 7801 ** Reset a cursor back to the state it was in when first returned 7802 ** by fsdirOpen(). 7803 */ 7804 static void fsdirResetCursor(fsdir_cursor *pCur){ 7805 int i; 7806 for(i=0; i<=pCur->iLvl; i++){ 7807 FsdirLevel *pLvl = &pCur->aLvl[i]; 7808 if( pLvl->pDir ) closedir(pLvl->pDir); 7809 sqlite3_free(pLvl->zDir); 7810 } 7811 sqlite3_free(pCur->zPath); 7812 sqlite3_free(pCur->aLvl); 7813 pCur->aLvl = 0; 7814 pCur->zPath = 0; 7815 pCur->zBase = 0; 7816 pCur->nBase = 0; 7817 pCur->nLvl = 0; 7818 pCur->iLvl = -1; 7819 pCur->iRowid = 1; 7820 } 7821 7822 /* 7823 ** Destructor for an fsdir_cursor. 7824 */ 7825 static int fsdirClose(sqlite3_vtab_cursor *cur){ 7826 fsdir_cursor *pCur = (fsdir_cursor*)cur; 7827 7828 fsdirResetCursor(pCur); 7829 sqlite3_free(pCur); 7830 return SQLITE_OK; 7831 } 7832 7833 /* 7834 ** Set the error message for the virtual table associated with cursor 7835 ** pCur to the results of vprintf(zFmt, ...). 7836 */ 7837 static void fsdirSetErrmsg(fsdir_cursor *pCur, const char *zFmt, ...){ 7838 va_list ap; 7839 va_start(ap, zFmt); 7840 pCur->base.pVtab->zErrMsg = sqlite3_vmprintf(zFmt, ap); 7841 va_end(ap); 7842 } 7843 7844 7845 /* 7846 ** Advance an fsdir_cursor to its next row of output. 7847 */ 7848 static int fsdirNext(sqlite3_vtab_cursor *cur){ 7849 fsdir_cursor *pCur = (fsdir_cursor*)cur; 7850 mode_t m = pCur->sStat.st_mode; 7851 7852 pCur->iRowid++; 7853 if( S_ISDIR(m) ){ 7854 /* Descend into this directory */ 7855 int iNew = pCur->iLvl + 1; 7856 FsdirLevel *pLvl; 7857 if( iNew>=pCur->nLvl ){ 7858 int nNew = iNew+1; 7859 sqlite3_int64 nByte = nNew*sizeof(FsdirLevel); 7860 FsdirLevel *aNew = (FsdirLevel*)sqlite3_realloc64(pCur->aLvl, nByte); 7861 if( aNew==0 ) return SQLITE_NOMEM; 7862 memset(&aNew[pCur->nLvl], 0, sizeof(FsdirLevel)*(nNew-pCur->nLvl)); 7863 pCur->aLvl = aNew; 7864 pCur->nLvl = nNew; 7865 } 7866 pCur->iLvl = iNew; 7867 pLvl = &pCur->aLvl[iNew]; 7868 7869 pLvl->zDir = pCur->zPath; 7870 pCur->zPath = 0; 7871 pLvl->pDir = opendir(pLvl->zDir); 7872 if( pLvl->pDir==0 ){ 7873 fsdirSetErrmsg(pCur, "cannot read directory: %s", pCur->zPath); 7874 return SQLITE_ERROR; 7875 } 7876 } 7877 7878 while( pCur->iLvl>=0 ){ 7879 FsdirLevel *pLvl = &pCur->aLvl[pCur->iLvl]; 7880 struct dirent *pEntry = readdir(pLvl->pDir); 7881 if( pEntry ){ 7882 if( pEntry->d_name[0]=='.' ){ 7883 if( pEntry->d_name[1]=='.' && pEntry->d_name[2]=='\0' ) continue; 7884 if( pEntry->d_name[1]=='\0' ) continue; 7885 } 7886 sqlite3_free(pCur->zPath); 7887 pCur->zPath = sqlite3_mprintf("%s/%s", pLvl->zDir, pEntry->d_name); 7888 if( pCur->zPath==0 ) return SQLITE_NOMEM; 7889 if( fileLinkStat(pCur->zPath, &pCur->sStat) ){ 7890 fsdirSetErrmsg(pCur, "cannot stat file: %s", pCur->zPath); 7891 return SQLITE_ERROR; 7892 } 7893 return SQLITE_OK; 7894 } 7895 closedir(pLvl->pDir); 7896 sqlite3_free(pLvl->zDir); 7897 pLvl->pDir = 0; 7898 pLvl->zDir = 0; 7899 pCur->iLvl--; 7900 } 7901 7902 /* EOF */ 7903 sqlite3_free(pCur->zPath); 7904 pCur->zPath = 0; 7905 return SQLITE_OK; 7906 } 7907 7908 /* 7909 ** Return values of columns for the row at which the series_cursor 7910 ** is currently pointing. 7911 */ 7912 static int fsdirColumn( 7913 sqlite3_vtab_cursor *cur, /* The cursor */ 7914 sqlite3_context *ctx, /* First argument to sqlite3_result_...() */ 7915 int i /* Which column to return */ 7916 ){ 7917 fsdir_cursor *pCur = (fsdir_cursor*)cur; 7918 switch( i ){ 7919 case FSDIR_COLUMN_NAME: { 7920 sqlite3_result_text(ctx, &pCur->zPath[pCur->nBase], -1, SQLITE_TRANSIENT); 7921 break; 7922 } 7923 7924 case FSDIR_COLUMN_MODE: 7925 sqlite3_result_int64(ctx, pCur->sStat.st_mode); 7926 break; 7927 7928 case FSDIR_COLUMN_MTIME: 7929 sqlite3_result_int64(ctx, pCur->sStat.st_mtime); 7930 break; 7931 7932 case FSDIR_COLUMN_DATA: { 7933 mode_t m = pCur->sStat.st_mode; 7934 if( S_ISDIR(m) ){ 7935 sqlite3_result_null(ctx); 7936 #if !defined(_WIN32) && !defined(WIN32) 7937 }else if( S_ISLNK(m) ){ 7938 char aStatic[64]; 7939 char *aBuf = aStatic; 7940 sqlite3_int64 nBuf = 64; 7941 int n; 7942 7943 while( 1 ){ 7944 n = readlink(pCur->zPath, aBuf, nBuf); 7945 if( n<nBuf ) break; 7946 if( aBuf!=aStatic ) sqlite3_free(aBuf); 7947 nBuf = nBuf*2; 7948 aBuf = sqlite3_malloc64(nBuf); 7949 if( aBuf==0 ){ 7950 sqlite3_result_error_nomem(ctx); 7951 return SQLITE_NOMEM; 7952 } 7953 } 7954 7955 sqlite3_result_text(ctx, aBuf, n, SQLITE_TRANSIENT); 7956 if( aBuf!=aStatic ) sqlite3_free(aBuf); 7957 #endif 7958 }else{ 7959 readFileContents(ctx, pCur->zPath); 7960 } 7961 } 7962 case FSDIR_COLUMN_PATH: 7963 default: { 7964 /* The FSDIR_COLUMN_PATH and FSDIR_COLUMN_DIR are input parameters. 7965 ** always return their values as NULL */ 7966 break; 7967 } 7968 } 7969 return SQLITE_OK; 7970 } 7971 7972 /* 7973 ** Return the rowid for the current row. In this implementation, the 7974 ** first row returned is assigned rowid value 1, and each subsequent 7975 ** row a value 1 more than that of the previous. 7976 */ 7977 static int fsdirRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ 7978 fsdir_cursor *pCur = (fsdir_cursor*)cur; 7979 *pRowid = pCur->iRowid; 7980 return SQLITE_OK; 7981 } 7982 7983 /* 7984 ** Return TRUE if the cursor has been moved off of the last 7985 ** row of output. 7986 */ 7987 static int fsdirEof(sqlite3_vtab_cursor *cur){ 7988 fsdir_cursor *pCur = (fsdir_cursor*)cur; 7989 return (pCur->zPath==0); 7990 } 7991 7992 /* 7993 ** xFilter callback. 7994 ** 7995 ** idxNum==1 PATH parameter only 7996 ** idxNum==2 Both PATH and DIR supplied 7997 */ 7998 static int fsdirFilter( 7999 sqlite3_vtab_cursor *cur, 8000 int idxNum, const char *idxStr, 8001 int argc, sqlite3_value **argv 8002 ){ 8003 const char *zDir = 0; 8004 fsdir_cursor *pCur = (fsdir_cursor*)cur; 8005 (void)idxStr; 8006 fsdirResetCursor(pCur); 8007 8008 if( idxNum==0 ){ 8009 fsdirSetErrmsg(pCur, "table function fsdir requires an argument"); 8010 return SQLITE_ERROR; 8011 } 8012 8013 assert( argc==idxNum && (argc==1 || argc==2) ); 8014 zDir = (const char*)sqlite3_value_text(argv[0]); 8015 if( zDir==0 ){ 8016 fsdirSetErrmsg(pCur, "table function fsdir requires a non-NULL argument"); 8017 return SQLITE_ERROR; 8018 } 8019 if( argc==2 ){ 8020 pCur->zBase = (const char*)sqlite3_value_text(argv[1]); 8021 } 8022 if( pCur->zBase ){ 8023 pCur->nBase = (int)strlen(pCur->zBase)+1; 8024 pCur->zPath = sqlite3_mprintf("%s/%s", pCur->zBase, zDir); 8025 }else{ 8026 pCur->zPath = sqlite3_mprintf("%s", zDir); 8027 } 8028 8029 if( pCur->zPath==0 ){ 8030 return SQLITE_NOMEM; 8031 } 8032 if( fileLinkStat(pCur->zPath, &pCur->sStat) ){ 8033 fsdirSetErrmsg(pCur, "cannot stat file: %s", pCur->zPath); 8034 return SQLITE_ERROR; 8035 } 8036 8037 return SQLITE_OK; 8038 } 8039 8040 /* 8041 ** SQLite will invoke this method one or more times while planning a query 8042 ** that uses the generate_series virtual table. This routine needs to create 8043 ** a query plan for each invocation and compute an estimated cost for that 8044 ** plan. 8045 ** 8046 ** In this implementation idxNum is used to represent the 8047 ** query plan. idxStr is unused. 8048 ** 8049 ** The query plan is represented by values of idxNum: 8050 ** 8051 ** (1) The path value is supplied by argv[0] 8052 ** (2) Path is in argv[0] and dir is in argv[1] 8053 */ 8054 static int fsdirBestIndex( 8055 sqlite3_vtab *tab, 8056 sqlite3_index_info *pIdxInfo 8057 ){ 8058 int i; /* Loop over constraints */ 8059 int idxPath = -1; /* Index in pIdxInfo->aConstraint of PATH= */ 8060 int idxDir = -1; /* Index in pIdxInfo->aConstraint of DIR= */ 8061 int seenPath = 0; /* True if an unusable PATH= constraint is seen */ 8062 int seenDir = 0; /* True if an unusable DIR= constraint is seen */ 8063 const struct sqlite3_index_constraint *pConstraint; 8064 8065 (void)tab; 8066 pConstraint = pIdxInfo->aConstraint; 8067 for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){ 8068 if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue; 8069 switch( pConstraint->iColumn ){ 8070 case FSDIR_COLUMN_PATH: { 8071 if( pConstraint->usable ){ 8072 idxPath = i; 8073 seenPath = 0; 8074 }else if( idxPath<0 ){ 8075 seenPath = 1; 8076 } 8077 break; 8078 } 8079 case FSDIR_COLUMN_DIR: { 8080 if( pConstraint->usable ){ 8081 idxDir = i; 8082 seenDir = 0; 8083 }else if( idxDir<0 ){ 8084 seenDir = 1; 8085 } 8086 break; 8087 } 8088 } 8089 } 8090 if( seenPath || seenDir ){ 8091 /* If input parameters are unusable, disallow this plan */ 8092 return SQLITE_CONSTRAINT; 8093 } 8094 8095 if( idxPath<0 ){ 8096 pIdxInfo->idxNum = 0; 8097 /* The pIdxInfo->estimatedCost should have been initialized to a huge 8098 ** number. Leave it unchanged. */ 8099 pIdxInfo->estimatedRows = 0x7fffffff; 8100 }else{ 8101 pIdxInfo->aConstraintUsage[idxPath].omit = 1; 8102 pIdxInfo->aConstraintUsage[idxPath].argvIndex = 1; 8103 if( idxDir>=0 ){ 8104 pIdxInfo->aConstraintUsage[idxDir].omit = 1; 8105 pIdxInfo->aConstraintUsage[idxDir].argvIndex = 2; 8106 pIdxInfo->idxNum = 2; 8107 pIdxInfo->estimatedCost = 10.0; 8108 }else{ 8109 pIdxInfo->idxNum = 1; 8110 pIdxInfo->estimatedCost = 100.0; 8111 } 8112 } 8113 8114 return SQLITE_OK; 8115 } 8116 8117 /* 8118 ** Register the "fsdir" virtual table. 8119 */ 8120 static int fsdirRegister(sqlite3 *db){ 8121 static sqlite3_module fsdirModule = { 8122 0, /* iVersion */ 8123 0, /* xCreate */ 8124 fsdirConnect, /* xConnect */ 8125 fsdirBestIndex, /* xBestIndex */ 8126 fsdirDisconnect, /* xDisconnect */ 8127 0, /* xDestroy */ 8128 fsdirOpen, /* xOpen - open a cursor */ 8129 fsdirClose, /* xClose - close a cursor */ 8130 fsdirFilter, /* xFilter - configure scan constraints */ 8131 fsdirNext, /* xNext - advance a cursor */ 8132 fsdirEof, /* xEof - check for end of scan */ 8133 fsdirColumn, /* xColumn - read data */ 8134 fsdirRowid, /* xRowid - read data */ 8135 0, /* xUpdate */ 8136 0, /* xBegin */ 8137 0, /* xSync */ 8138 0, /* xCommit */ 8139 0, /* xRollback */ 8140 0, /* xFindMethod */ 8141 0, /* xRename */ 8142 0, /* xSavepoint */ 8143 0, /* xRelease */ 8144 0, /* xRollbackTo */ 8145 0, /* xShadowName */ 8146 0 /* xIntegrity */ 8147 }; 8148 8149 int rc = sqlite3_create_module(db, "fsdir", &fsdirModule, 0); 8150 return rc; 8151 } 8152 #else /* SQLITE_OMIT_VIRTUALTABLE */ 8153 # define fsdirRegister(x) SQLITE_OK 8154 #endif 8155 8156 #ifdef _WIN32 8157 8158 #endif 8159 int sqlite3_fileio_init( 8160 sqlite3 *db, 8161 char **pzErrMsg, 8162 const sqlite3_api_routines *pApi 8163 ){ 8164 int rc = SQLITE_OK; 8165 SQLITE_EXTENSION_INIT2(pApi); 8166 (void)pzErrMsg; /* Unused parameter */ 8167 rc = sqlite3_create_function(db, "readfile", 1, 8168 SQLITE_UTF8|SQLITE_DIRECTONLY, 0, 8169 readfileFunc, 0, 0); 8170 if( rc==SQLITE_OK ){ 8171 rc = sqlite3_create_function(db, "writefile", -1, 8172 SQLITE_UTF8|SQLITE_DIRECTONLY, 0, 8173 writefileFunc, 0, 0); 8174 } 8175 if( rc==SQLITE_OK ){ 8176 rc = sqlite3_create_function(db, "lsmode", 1, SQLITE_UTF8, 0, 8177 lsModeFunc, 0, 0); 8178 } 8179 if( rc==SQLITE_OK ){ 8180 rc = fsdirRegister(db); 8181 } 8182 return rc; 8183 } 8184 8185 #if defined(FILEIO_WIN32_DLL) && (defined(_WIN32) || defined(WIN32)) 8186 /* To allow a standalone DLL, make test_windirent.c use the same 8187 * redefined SQLite API calls as the above extension code does. 8188 * Just pull in this .c to accomplish this. As a beneficial side 8189 * effect, this extension becomes a single translation unit. */ 8190 # include "test_windirent.c" 8191 #endif 8192 8193 /************************* End ../ext/misc/fileio.c ********************/ 8194 /************************* Begin ../ext/misc/completion.c ******************/ 8195 /* 8196 ** 2017-07-10 8197 ** 8198 ** The author disclaims copyright to this source code. In place of 8199 ** a legal notice, here is a blessing: 8200 ** 8201 ** May you do good and not evil. 8202 ** May you find forgiveness for yourself and forgive others. 8203 ** May you share freely, never taking more than you give. 8204 ** 8205 ************************************************************************* 8206 ** 8207 ** This file implements an eponymous virtual table that returns suggested 8208 ** completions for a partial SQL input. 8209 ** 8210 ** Suggested usage: 8211 ** 8212 ** SELECT DISTINCT candidate COLLATE nocase 8213 ** FROM completion($prefix,$wholeline) 8214 ** ORDER BY 1; 8215 ** 8216 ** The two query parameters are optional. $prefix is the text of the 8217 ** current word being typed and that is to be completed. $wholeline is 8218 ** the complete input line, used for context. 8219 ** 8220 ** The raw completion() table might return the same candidate multiple 8221 ** times, for example if the same column name is used to two or more 8222 ** tables. And the candidates are returned in an arbitrary order. Hence, 8223 ** the DISTINCT and ORDER BY are recommended. 8224 ** 8225 ** This virtual table operates at the speed of human typing, and so there 8226 ** is no attempt to make it fast. Even a slow implementation will be much 8227 ** faster than any human can type. 8228 ** 8229 */ 8230 /* #include "sqlite3ext.h" */ 8231 SQLITE_EXTENSION_INIT1 8232 #include <assert.h> 8233 #include <string.h> 8234 #include <ctype.h> 8235 8236 #ifndef SQLITE_OMIT_VIRTUALTABLE 8237 8238 /* completion_vtab is a subclass of sqlite3_vtab which will 8239 ** serve as the underlying representation of a completion virtual table 8240 */ 8241 typedef struct completion_vtab completion_vtab; 8242 struct completion_vtab { 8243 sqlite3_vtab base; /* Base class - must be first */ 8244 sqlite3 *db; /* Database connection for this completion vtab */ 8245 }; 8246 8247 /* completion_cursor is a subclass of sqlite3_vtab_cursor which will 8248 ** serve as the underlying representation of a cursor that scans 8249 ** over rows of the result 8250 */ 8251 typedef struct completion_cursor completion_cursor; 8252 struct completion_cursor { 8253 sqlite3_vtab_cursor base; /* Base class - must be first */ 8254 sqlite3 *db; /* Database connection for this cursor */ 8255 int nPrefix, nLine; /* Number of bytes in zPrefix and zLine */ 8256 char *zPrefix; /* The prefix for the word we want to complete */ 8257 char *zLine; /* The whole that we want to complete */ 8258 const char *zCurrentRow; /* Current output row */ 8259 int szRow; /* Length of the zCurrentRow string */ 8260 sqlite3_stmt *pStmt; /* Current statement */ 8261 sqlite3_int64 iRowid; /* The rowid */ 8262 int ePhase; /* Current phase */ 8263 int j; /* inter-phase counter */ 8264 }; 8265 8266 /* Values for ePhase: 8267 */ 8268 #define COMPLETION_FIRST_PHASE 1 8269 #define COMPLETION_KEYWORDS 1 8270 #define COMPLETION_PRAGMAS 2 8271 #define COMPLETION_FUNCTIONS 3 8272 #define COMPLETION_COLLATIONS 4 8273 #define COMPLETION_INDEXES 5 8274 #define COMPLETION_TRIGGERS 6 8275 #define COMPLETION_DATABASES 7 8276 #define COMPLETION_TABLES 8 /* Also VIEWs and TRIGGERs */ 8277 #define COMPLETION_COLUMNS 9 8278 #define COMPLETION_MODULES 10 8279 #define COMPLETION_EOF 11 8280 8281 /* 8282 ** The completionConnect() method is invoked to create a new 8283 ** completion_vtab that describes the completion virtual table. 8284 ** 8285 ** Think of this routine as the constructor for completion_vtab objects. 8286 ** 8287 ** All this routine needs to do is: 8288 ** 8289 ** (1) Allocate the completion_vtab object and initialize all fields. 8290 ** 8291 ** (2) Tell SQLite (via the sqlite3_declare_vtab() interface) what the 8292 ** result set of queries against completion will look like. 8293 */ 8294 static int completionConnect( 8295 sqlite3 *db, 8296 void *pAux, 8297 int argc, const char *const*argv, 8298 sqlite3_vtab **ppVtab, 8299 char **pzErr 8300 ){ 8301 completion_vtab *pNew; 8302 int rc; 8303 8304 (void)(pAux); /* Unused parameter */ 8305 (void)(argc); /* Unused parameter */ 8306 (void)(argv); /* Unused parameter */ 8307 (void)(pzErr); /* Unused parameter */ 8308 8309 /* Column numbers */ 8310 #define COMPLETION_COLUMN_CANDIDATE 0 /* Suggested completion of the input */ 8311 #define COMPLETION_COLUMN_PREFIX 1 /* Prefix of the word to be completed */ 8312 #define COMPLETION_COLUMN_WHOLELINE 2 /* Entire line seen so far */ 8313 #define COMPLETION_COLUMN_PHASE 3 /* ePhase - used for debugging only */ 8314 8315 sqlite3_vtab_config(db, SQLITE_VTAB_INNOCUOUS); 8316 rc = sqlite3_declare_vtab(db, 8317 "CREATE TABLE x(" 8318 " candidate TEXT," 8319 " prefix TEXT HIDDEN," 8320 " wholeline TEXT HIDDEN," 8321 " phase INT HIDDEN" /* Used for debugging only */ 8322 ")"); 8323 if( rc==SQLITE_OK ){ 8324 pNew = sqlite3_malloc( sizeof(*pNew) ); 8325 *ppVtab = (sqlite3_vtab*)pNew; 8326 if( pNew==0 ) return SQLITE_NOMEM; 8327 memset(pNew, 0, sizeof(*pNew)); 8328 pNew->db = db; 8329 } 8330 return rc; 8331 } 8332 8333 /* 8334 ** This method is the destructor for completion_cursor objects. 8335 */ 8336 static int completionDisconnect(sqlite3_vtab *pVtab){ 8337 sqlite3_free(pVtab); 8338 return SQLITE_OK; 8339 } 8340 8341 /* 8342 ** Constructor for a new completion_cursor object. 8343 */ 8344 static int completionOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ 8345 completion_cursor *pCur; 8346 pCur = sqlite3_malloc( sizeof(*pCur) ); 8347 if( pCur==0 ) return SQLITE_NOMEM; 8348 memset(pCur, 0, sizeof(*pCur)); 8349 pCur->db = ((completion_vtab*)p)->db; 8350 *ppCursor = &pCur->base; 8351 return SQLITE_OK; 8352 } 8353 8354 /* 8355 ** Reset the completion_cursor. 8356 */ 8357 static void completionCursorReset(completion_cursor *pCur){ 8358 sqlite3_free(pCur->zPrefix); pCur->zPrefix = 0; pCur->nPrefix = 0; 8359 sqlite3_free(pCur->zLine); pCur->zLine = 0; pCur->nLine = 0; 8360 sqlite3_finalize(pCur->pStmt); pCur->pStmt = 0; 8361 pCur->j = 0; 8362 } 8363 8364 /* 8365 ** Destructor for a completion_cursor. 8366 */ 8367 static int completionClose(sqlite3_vtab_cursor *cur){ 8368 completionCursorReset((completion_cursor*)cur); 8369 sqlite3_free(cur); 8370 return SQLITE_OK; 8371 } 8372 8373 /* 8374 ** Advance a completion_cursor to its next row of output. 8375 ** 8376 ** The ->ePhase, ->j, and ->pStmt fields of the completion_cursor object 8377 ** record the current state of the scan. This routine sets ->zCurrentRow 8378 ** to the current row of output and then returns. If no more rows remain, 8379 ** then ->ePhase is set to COMPLETION_EOF which will signal the virtual 8380 ** table that has reached the end of its scan. 8381 ** 8382 ** The current implementation just lists potential identifiers and 8383 ** keywords and filters them by zPrefix. Future enhancements should 8384 ** take zLine into account to try to restrict the set of identifiers and 8385 ** keywords based on what would be legal at the current point of input. 8386 */ 8387 static int completionNext(sqlite3_vtab_cursor *cur){ 8388 completion_cursor *pCur = (completion_cursor*)cur; 8389 int eNextPhase = 0; /* Next phase to try if current phase reaches end */ 8390 int iCol = -1; /* If >=0, step pCur->pStmt and use the i-th column */ 8391 pCur->iRowid++; 8392 while( pCur->ePhase!=COMPLETION_EOF ){ 8393 switch( pCur->ePhase ){ 8394 case COMPLETION_KEYWORDS: { 8395 if( pCur->j >= sqlite3_keyword_count() ){ 8396 pCur->zCurrentRow = 0; 8397 pCur->ePhase = COMPLETION_DATABASES; 8398 }else{ 8399 sqlite3_keyword_name(pCur->j++, &pCur->zCurrentRow, &pCur->szRow); 8400 } 8401 iCol = -1; 8402 break; 8403 } 8404 case COMPLETION_DATABASES: { 8405 if( pCur->pStmt==0 ){ 8406 sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1, 8407 &pCur->pStmt, 0); 8408 } 8409 iCol = 1; 8410 eNextPhase = COMPLETION_TABLES; 8411 break; 8412 } 8413 case COMPLETION_TABLES: { 8414 if( pCur->pStmt==0 ){ 8415 sqlite3_stmt *pS2; 8416 char *zSql = 0; 8417 const char *zSep = ""; 8418 sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1, &pS2, 0); 8419 while( sqlite3_step(pS2)==SQLITE_ROW ){ 8420 const char *zDb = (const char*)sqlite3_column_text(pS2, 1); 8421 zSql = sqlite3_mprintf( 8422 "%z%s" 8423 "SELECT name FROM \"%w\".sqlite_schema", 8424 zSql, zSep, zDb 8425 ); 8426 if( zSql==0 ) return SQLITE_NOMEM; 8427 zSep = " UNION "; 8428 } 8429 sqlite3_finalize(pS2); 8430 sqlite3_prepare_v2(pCur->db, zSql, -1, &pCur->pStmt, 0); 8431 sqlite3_free(zSql); 8432 } 8433 iCol = 0; 8434 eNextPhase = COMPLETION_COLUMNS; 8435 break; 8436 } 8437 case COMPLETION_COLUMNS: { 8438 if( pCur->pStmt==0 ){ 8439 sqlite3_stmt *pS2; 8440 char *zSql = 0; 8441 const char *zSep = ""; 8442 sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1, &pS2, 0); 8443 while( sqlite3_step(pS2)==SQLITE_ROW ){ 8444 const char *zDb = (const char*)sqlite3_column_text(pS2, 1); 8445 zSql = sqlite3_mprintf( 8446 "%z%s" 8447 "SELECT pti.name FROM \"%w\".sqlite_schema AS sm" 8448 " JOIN pragma_table_info(sm.name,%Q) AS pti" 8449 " WHERE sm.type='table'", 8450 zSql, zSep, zDb, zDb 8451 ); 8452 if( zSql==0 ) return SQLITE_NOMEM; 8453 zSep = " UNION "; 8454 } 8455 sqlite3_finalize(pS2); 8456 sqlite3_prepare_v2(pCur->db, zSql, -1, &pCur->pStmt, 0); 8457 sqlite3_free(zSql); 8458 } 8459 iCol = 0; 8460 eNextPhase = COMPLETION_EOF; 8461 break; 8462 } 8463 } 8464 if( iCol<0 ){ 8465 /* This case is when the phase presets zCurrentRow */ 8466 if( pCur->zCurrentRow==0 ) continue; 8467 }else{ 8468 if( sqlite3_step(pCur->pStmt)==SQLITE_ROW ){ 8469 /* Extract the next row of content */ 8470 pCur->zCurrentRow = (const char*)sqlite3_column_text(pCur->pStmt, iCol); 8471 pCur->szRow = sqlite3_column_bytes(pCur->pStmt, iCol); 8472 }else{ 8473 /* When all rows are finished, advance to the next phase */ 8474 sqlite3_finalize(pCur->pStmt); 8475 pCur->pStmt = 0; 8476 pCur->ePhase = eNextPhase; 8477 continue; 8478 } 8479 } 8480 if( pCur->nPrefix==0 ) break; 8481 if( pCur->nPrefix<=pCur->szRow 8482 && sqlite3_strnicmp(pCur->zPrefix, pCur->zCurrentRow, pCur->nPrefix)==0 8483 ){ 8484 break; 8485 } 8486 } 8487 8488 return SQLITE_OK; 8489 } 8490 8491 /* 8492 ** Return values of columns for the row at which the completion_cursor 8493 ** is currently pointing. 8494 */ 8495 static int completionColumn( 8496 sqlite3_vtab_cursor *cur, /* The cursor */ 8497 sqlite3_context *ctx, /* First argument to sqlite3_result_...() */ 8498 int i /* Which column to return */ 8499 ){ 8500 completion_cursor *pCur = (completion_cursor*)cur; 8501 switch( i ){ 8502 case COMPLETION_COLUMN_CANDIDATE: { 8503 sqlite3_result_text(ctx, pCur->zCurrentRow, pCur->szRow,SQLITE_TRANSIENT); 8504 break; 8505 } 8506 case COMPLETION_COLUMN_PREFIX: { 8507 sqlite3_result_text(ctx, pCur->zPrefix, -1, SQLITE_TRANSIENT); 8508 break; 8509 } 8510 case COMPLETION_COLUMN_WHOLELINE: { 8511 sqlite3_result_text(ctx, pCur->zLine, -1, SQLITE_TRANSIENT); 8512 break; 8513 } 8514 case COMPLETION_COLUMN_PHASE: { 8515 sqlite3_result_int(ctx, pCur->ePhase); 8516 break; 8517 } 8518 } 8519 return SQLITE_OK; 8520 } 8521 8522 /* 8523 ** Return the rowid for the current row. In this implementation, the 8524 ** rowid is the same as the output value. 8525 */ 8526 static int completionRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ 8527 completion_cursor *pCur = (completion_cursor*)cur; 8528 *pRowid = pCur->iRowid; 8529 return SQLITE_OK; 8530 } 8531 8532 /* 8533 ** Return TRUE if the cursor has been moved off of the last 8534 ** row of output. 8535 */ 8536 static int completionEof(sqlite3_vtab_cursor *cur){ 8537 completion_cursor *pCur = (completion_cursor*)cur; 8538 return pCur->ePhase >= COMPLETION_EOF; 8539 } 8540 8541 /* 8542 ** This method is called to "rewind" the completion_cursor object back 8543 ** to the first row of output. This method is always called at least 8544 ** once prior to any call to completionColumn() or completionRowid() or 8545 ** completionEof(). 8546 */ 8547 static int completionFilter( 8548 sqlite3_vtab_cursor *pVtabCursor, 8549 int idxNum, const char *idxStr, 8550 int argc, sqlite3_value **argv 8551 ){ 8552 completion_cursor *pCur = (completion_cursor *)pVtabCursor; 8553 int iArg = 0; 8554 (void)(idxStr); /* Unused parameter */ 8555 (void)(argc); /* Unused parameter */ 8556 completionCursorReset(pCur); 8557 if( idxNum & 1 ){ 8558 pCur->nPrefix = sqlite3_value_bytes(argv[iArg]); 8559 if( pCur->nPrefix>0 ){ 8560 pCur->zPrefix = sqlite3_mprintf("%s", sqlite3_value_text(argv[iArg])); 8561 if( pCur->zPrefix==0 ) return SQLITE_NOMEM; 8562 } 8563 iArg = 1; 8564 } 8565 if( idxNum & 2 ){ 8566 pCur->nLine = sqlite3_value_bytes(argv[iArg]); 8567 if( pCur->nLine>0 ){ 8568 pCur->zLine = sqlite3_mprintf("%s", sqlite3_value_text(argv[iArg])); 8569 if( pCur->zLine==0 ) return SQLITE_NOMEM; 8570 } 8571 } 8572 if( pCur->zLine!=0 && pCur->zPrefix==0 ){ 8573 int i = pCur->nLine; 8574 while( i>0 && (isalnum(pCur->zLine[i-1]) || pCur->zLine[i-1]=='_') ){ 8575 i--; 8576 } 8577 pCur->nPrefix = pCur->nLine - i; 8578 if( pCur->nPrefix>0 ){ 8579 pCur->zPrefix = sqlite3_mprintf("%.*s", pCur->nPrefix, pCur->zLine + i); 8580 if( pCur->zPrefix==0 ) return SQLITE_NOMEM; 8581 } 8582 } 8583 pCur->iRowid = 0; 8584 pCur->ePhase = COMPLETION_FIRST_PHASE; 8585 return completionNext(pVtabCursor); 8586 } 8587 8588 /* 8589 ** SQLite will invoke this method one or more times while planning a query 8590 ** that uses the completion virtual table. This routine needs to create 8591 ** a query plan for each invocation and compute an estimated cost for that 8592 ** plan. 8593 ** 8594 ** There are two hidden parameters that act as arguments to the table-valued 8595 ** function: "prefix" and "wholeline". Bit 0 of idxNum is set if "prefix" 8596 ** is available and bit 1 is set if "wholeline" is available. 8597 */ 8598 static int completionBestIndex( 8599 sqlite3_vtab *tab, 8600 sqlite3_index_info *pIdxInfo 8601 ){ 8602 int i; /* Loop over constraints */ 8603 int idxNum = 0; /* The query plan bitmask */ 8604 int prefixIdx = -1; /* Index of the start= constraint, or -1 if none */ 8605 int wholelineIdx = -1; /* Index of the stop= constraint, or -1 if none */ 8606 int nArg = 0; /* Number of arguments that completeFilter() expects */ 8607 const struct sqlite3_index_constraint *pConstraint; 8608 8609 (void)(tab); /* Unused parameter */ 8610 pConstraint = pIdxInfo->aConstraint; 8611 for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){ 8612 if( pConstraint->usable==0 ) continue; 8613 if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue; 8614 switch( pConstraint->iColumn ){ 8615 case COMPLETION_COLUMN_PREFIX: 8616 prefixIdx = i; 8617 idxNum |= 1; 8618 break; 8619 case COMPLETION_COLUMN_WHOLELINE: 8620 wholelineIdx = i; 8621 idxNum |= 2; 8622 break; 8623 } 8624 } 8625 if( prefixIdx>=0 ){ 8626 pIdxInfo->aConstraintUsage[prefixIdx].argvIndex = ++nArg; 8627 pIdxInfo->aConstraintUsage[prefixIdx].omit = 1; 8628 } 8629 if( wholelineIdx>=0 ){ 8630 pIdxInfo->aConstraintUsage[wholelineIdx].argvIndex = ++nArg; 8631 pIdxInfo->aConstraintUsage[wholelineIdx].omit = 1; 8632 } 8633 pIdxInfo->idxNum = idxNum; 8634 pIdxInfo->estimatedCost = (double)5000 - 1000*nArg; 8635 pIdxInfo->estimatedRows = 500 - 100*nArg; 8636 return SQLITE_OK; 8637 } 8638 8639 /* 8640 ** This following structure defines all the methods for the 8641 ** completion virtual table. 8642 */ 8643 static sqlite3_module completionModule = { 8644 0, /* iVersion */ 8645 0, /* xCreate */ 8646 completionConnect, /* xConnect */ 8647 completionBestIndex, /* xBestIndex */ 8648 completionDisconnect, /* xDisconnect */ 8649 0, /* xDestroy */ 8650 completionOpen, /* xOpen - open a cursor */ 8651 completionClose, /* xClose - close a cursor */ 8652 completionFilter, /* xFilter - configure scan constraints */ 8653 completionNext, /* xNext - advance a cursor */ 8654 completionEof, /* xEof - check for end of scan */ 8655 completionColumn, /* xColumn - read data */ 8656 completionRowid, /* xRowid - read data */ 8657 0, /* xUpdate */ 8658 0, /* xBegin */ 8659 0, /* xSync */ 8660 0, /* xCommit */ 8661 0, /* xRollback */ 8662 0, /* xFindMethod */ 8663 0, /* xRename */ 8664 0, /* xSavepoint */ 8665 0, /* xRelease */ 8666 0, /* xRollbackTo */ 8667 0, /* xShadowName */ 8668 0 /* xIntegrity */ 8669 }; 8670 8671 #endif /* SQLITE_OMIT_VIRTUALTABLE */ 8672 8673 int sqlite3CompletionVtabInit(sqlite3 *db){ 8674 int rc = SQLITE_OK; 8675 #ifndef SQLITE_OMIT_VIRTUALTABLE 8676 rc = sqlite3_create_module(db, "completion", &completionModule, 0); 8677 #endif 8678 return rc; 8679 } 8680 8681 #ifdef _WIN32 8682 8683 #endif 8684 int sqlite3_completion_init( 8685 sqlite3 *db, 8686 char **pzErrMsg, 8687 const sqlite3_api_routines *pApi 8688 ){ 8689 int rc = SQLITE_OK; 8690 SQLITE_EXTENSION_INIT2(pApi); 8691 (void)(pzErrMsg); /* Unused parameter */ 8692 #ifndef SQLITE_OMIT_VIRTUALTABLE 8693 rc = sqlite3CompletionVtabInit(db); 8694 #endif 8695 return rc; 8696 } 8697 8698 /************************* End ../ext/misc/completion.c ********************/ 8699 /************************* Begin ../ext/misc/appendvfs.c ******************/ 8700 /* 8701 ** 2017-10-20 8702 ** 8703 ** The author disclaims copyright to this source code. In place of 8704 ** a legal notice, here is a blessing: 8705 ** 8706 ** May you do good and not evil. 8707 ** May you find forgiveness for yourself and forgive others. 8708 ** May you share freely, never taking more than you give. 8709 ** 8710 ****************************************************************************** 8711 ** 8712 ** This file implements a VFS shim that allows an SQLite database to be 8713 ** appended onto the end of some other file, such as an executable. 8714 ** 8715 ** A special record must appear at the end of the file that identifies the 8716 ** file as an appended database and provides the offset to the first page 8717 ** of the exposed content. (Or, it is the length of the content prefix.) 8718 ** For best performance page 1 should be located at a disk page boundary, 8719 ** though that is not required. 8720 ** 8721 ** When opening a database using this VFS, the connection might treat 8722 ** the file as an ordinary SQLite database, or it might treat it as a 8723 ** database appended onto some other file. The decision is made by 8724 ** applying the following rules in order: 8725 ** 8726 ** (1) An empty file is an ordinary database. 8727 ** 8728 ** (2) If the file ends with the appendvfs trailer string 8729 ** "Start-Of-SQLite3-NNNNNNNN" that file is an appended database. 8730 ** 8731 ** (3) If the file begins with the standard SQLite prefix string 8732 ** "SQLite format 3", that file is an ordinary database. 8733 ** 8734 ** (4) If none of the above apply and the SQLITE_OPEN_CREATE flag is 8735 ** set, then a new database is appended to the already existing file. 8736 ** 8737 ** (5) Otherwise, SQLITE_CANTOPEN is returned. 8738 ** 8739 ** To avoid unnecessary complications with the PENDING_BYTE, the size of 8740 ** the file containing the database is limited to 1GiB. (1073741824 bytes) 8741 ** This VFS will not read or write past the 1GiB mark. This restriction 8742 ** might be lifted in future versions. For now, if you need a larger 8743 ** database, then keep it in a separate file. 8744 ** 8745 ** If the file being opened is a plain database (not an appended one), then 8746 ** this shim is a pass-through into the default underlying VFS. (rule 3) 8747 **/ 8748 /* #include "sqlite3ext.h" */ 8749 SQLITE_EXTENSION_INIT1 8750 #include <string.h> 8751 #include <assert.h> 8752 8753 /* The append mark at the end of the database is: 8754 ** 8755 ** Start-Of-SQLite3-NNNNNNNN 8756 ** 123456789 123456789 12345 8757 ** 8758 ** The NNNNNNNN represents a 64-bit big-endian unsigned integer which is 8759 ** the offset to page 1, and also the length of the prefix content. 8760 */ 8761 #define APND_MARK_PREFIX "Start-Of-SQLite3-" 8762 #define APND_MARK_PREFIX_SZ 17 8763 #define APND_MARK_FOS_SZ 8 8764 #define APND_MARK_SIZE (APND_MARK_PREFIX_SZ+APND_MARK_FOS_SZ) 8765 8766 /* 8767 ** Maximum size of the combined prefix + database + append-mark. This 8768 ** must be less than 0x40000000 to avoid locking issues on Windows. 8769 */ 8770 #define APND_MAX_SIZE (0x40000000) 8771 8772 /* 8773 ** Try to align the database to an even multiple of APND_ROUNDUP bytes. 8774 */ 8775 #ifndef APND_ROUNDUP 8776 #define APND_ROUNDUP 4096 8777 #endif 8778 #define APND_ALIGN_MASK ((sqlite3_int64)(APND_ROUNDUP-1)) 8779 #define APND_START_ROUNDUP(fsz) (((fsz)+APND_ALIGN_MASK) & ~APND_ALIGN_MASK) 8780 8781 /* 8782 ** Forward declaration of objects used by this utility 8783 */ 8784 typedef struct sqlite3_vfs ApndVfs; 8785 typedef struct ApndFile ApndFile; 8786 8787 /* Access to a lower-level VFS that (might) implement dynamic loading, 8788 ** access to randomness, etc. 8789 */ 8790 #define ORIGVFS(p) ((sqlite3_vfs*)((p)->pAppData)) 8791 #define ORIGFILE(p) ((sqlite3_file*)(((ApndFile*)(p))+1)) 8792 8793 /* An open appendvfs file 8794 ** 8795 ** An instance of this structure describes the appended database file. 8796 ** A separate sqlite3_file object is always appended. The appended 8797 ** sqlite3_file object (which can be accessed using ORIGFILE()) describes 8798 ** the entire file, including the prefix, the database, and the 8799 ** append-mark. 8800 ** 8801 ** The structure of an AppendVFS database is like this: 8802 ** 8803 ** +-------------+---------+----------+-------------+ 8804 ** | prefix-file | padding | database | append-mark | 8805 ** +-------------+---------+----------+-------------+ 8806 ** ^ ^ 8807 ** | | 8808 ** iPgOne iMark 8809 ** 8810 ** 8811 ** "prefix file" - file onto which the database has been appended. 8812 ** "padding" - zero or more bytes inserted so that "database" 8813 ** starts on an APND_ROUNDUP boundary 8814 ** "database" - The SQLite database file 8815 ** "append-mark" - The 25-byte "Start-Of-SQLite3-NNNNNNNN" that indicates 8816 ** the offset from the start of prefix-file to the start 8817 ** of "database". 8818 ** 8819 ** The size of the database is iMark - iPgOne. 8820 ** 8821 ** The NNNNNNNN in the "Start-Of-SQLite3-NNNNNNNN" suffix is the value 8822 ** of iPgOne stored as a big-ending 64-bit integer. 8823 ** 8824 ** iMark will be the size of the underlying file minus 25 (APND_MARKSIZE). 8825 ** Or, iMark is -1 to indicate that it has not yet been written. 8826 */ 8827 struct ApndFile { 8828 sqlite3_file base; /* Subclass. MUST BE FIRST! */ 8829 sqlite3_int64 iPgOne; /* Offset to the start of the database */ 8830 sqlite3_int64 iMark; /* Offset of the append mark. -1 if unwritten */ 8831 /* Always followed by another sqlite3_file that describes the whole file */ 8832 }; 8833 8834 /* 8835 ** Methods for ApndFile 8836 */ 8837 static int apndClose(sqlite3_file*); 8838 static int apndRead(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst); 8839 static int apndWrite(sqlite3_file*,const void*,int iAmt, sqlite3_int64 iOfst); 8840 static int apndTruncate(sqlite3_file*, sqlite3_int64 size); 8841 static int apndSync(sqlite3_file*, int flags); 8842 static int apndFileSize(sqlite3_file*, sqlite3_int64 *pSize); 8843 static int apndLock(sqlite3_file*, int); 8844 static int apndUnlock(sqlite3_file*, int); 8845 static int apndCheckReservedLock(sqlite3_file*, int *pResOut); 8846 static int apndFileControl(sqlite3_file*, int op, void *pArg); 8847 static int apndSectorSize(sqlite3_file*); 8848 static int apndDeviceCharacteristics(sqlite3_file*); 8849 static int apndShmMap(sqlite3_file*, int iPg, int pgsz, int, void volatile**); 8850 static int apndShmLock(sqlite3_file*, int offset, int n, int flags); 8851 static void apndShmBarrier(sqlite3_file*); 8852 static int apndShmUnmap(sqlite3_file*, int deleteFlag); 8853 static int apndFetch(sqlite3_file*, sqlite3_int64 iOfst, int iAmt, void **pp); 8854 static int apndUnfetch(sqlite3_file*, sqlite3_int64 iOfst, void *p); 8855 8856 /* 8857 ** Methods for ApndVfs 8858 */ 8859 static int apndOpen(sqlite3_vfs*, const char *, sqlite3_file*, int , int *); 8860 static int apndDelete(sqlite3_vfs*, const char *zName, int syncDir); 8861 static int apndAccess(sqlite3_vfs*, const char *zName, int flags, int *); 8862 static int apndFullPathname(sqlite3_vfs*, const char *zName, int, char *zOut); 8863 static void *apndDlOpen(sqlite3_vfs*, const char *zFilename); 8864 static void apndDlError(sqlite3_vfs*, int nByte, char *zErrMsg); 8865 static void (*apndDlSym(sqlite3_vfs *pVfs, void *p, const char*zSym))(void); 8866 static void apndDlClose(sqlite3_vfs*, void*); 8867 static int apndRandomness(sqlite3_vfs*, int nByte, char *zOut); 8868 static int apndSleep(sqlite3_vfs*, int microseconds); 8869 static int apndCurrentTime(sqlite3_vfs*, double*); 8870 static int apndGetLastError(sqlite3_vfs*, int, char *); 8871 static int apndCurrentTimeInt64(sqlite3_vfs*, sqlite3_int64*); 8872 static int apndSetSystemCall(sqlite3_vfs*, const char*,sqlite3_syscall_ptr); 8873 static sqlite3_syscall_ptr apndGetSystemCall(sqlite3_vfs*, const char *z); 8874 static const char *apndNextSystemCall(sqlite3_vfs*, const char *zName); 8875 8876 static sqlite3_vfs apnd_vfs = { 8877 3, /* iVersion (set when registered) */ 8878 0, /* szOsFile (set when registered) */ 8879 1024, /* mxPathname */ 8880 0, /* pNext */ 8881 "apndvfs", /* zName */ 8882 0, /* pAppData (set when registered) */ 8883 apndOpen, /* xOpen */ 8884 apndDelete, /* xDelete */ 8885 apndAccess, /* xAccess */ 8886 apndFullPathname, /* xFullPathname */ 8887 apndDlOpen, /* xDlOpen */ 8888 apndDlError, /* xDlError */ 8889 apndDlSym, /* xDlSym */ 8890 apndDlClose, /* xDlClose */ 8891 apndRandomness, /* xRandomness */ 8892 apndSleep, /* xSleep */ 8893 apndCurrentTime, /* xCurrentTime */ 8894 apndGetLastError, /* xGetLastError */ 8895 apndCurrentTimeInt64, /* xCurrentTimeInt64 */ 8896 apndSetSystemCall, /* xSetSystemCall */ 8897 apndGetSystemCall, /* xGetSystemCall */ 8898 apndNextSystemCall /* xNextSystemCall */ 8899 }; 8900 8901 static const sqlite3_io_methods apnd_io_methods = { 8902 3, /* iVersion */ 8903 apndClose, /* xClose */ 8904 apndRead, /* xRead */ 8905 apndWrite, /* xWrite */ 8906 apndTruncate, /* xTruncate */ 8907 apndSync, /* xSync */ 8908 apndFileSize, /* xFileSize */ 8909 apndLock, /* xLock */ 8910 apndUnlock, /* xUnlock */ 8911 apndCheckReservedLock, /* xCheckReservedLock */ 8912 apndFileControl, /* xFileControl */ 8913 apndSectorSize, /* xSectorSize */ 8914 apndDeviceCharacteristics, /* xDeviceCharacteristics */ 8915 apndShmMap, /* xShmMap */ 8916 apndShmLock, /* xShmLock */ 8917 apndShmBarrier, /* xShmBarrier */ 8918 apndShmUnmap, /* xShmUnmap */ 8919 apndFetch, /* xFetch */ 8920 apndUnfetch /* xUnfetch */ 8921 }; 8922 8923 /* 8924 ** Close an apnd-file. 8925 */ 8926 static int apndClose(sqlite3_file *pFile){ 8927 pFile = ORIGFILE(pFile); 8928 return pFile->pMethods->xClose(pFile); 8929 } 8930 8931 /* 8932 ** Read data from an apnd-file. 8933 */ 8934 static int apndRead( 8935 sqlite3_file *pFile, 8936 void *zBuf, 8937 int iAmt, 8938 sqlite_int64 iOfst 8939 ){ 8940 ApndFile *paf = (ApndFile *)pFile; 8941 pFile = ORIGFILE(pFile); 8942 return pFile->pMethods->xRead(pFile, zBuf, iAmt, paf->iPgOne+iOfst); 8943 } 8944 8945 /* 8946 ** Add the append-mark onto what should become the end of the file. 8947 * If and only if this succeeds, internal ApndFile.iMark is updated. 8948 * Parameter iWriteEnd is the appendvfs-relative offset of the new mark. 8949 */ 8950 static int apndWriteMark( 8951 ApndFile *paf, 8952 sqlite3_file *pFile, 8953 sqlite_int64 iWriteEnd 8954 ){ 8955 sqlite_int64 iPgOne = paf->iPgOne; 8956 unsigned char a[APND_MARK_SIZE]; 8957 int i = APND_MARK_FOS_SZ; 8958 int rc; 8959 assert(pFile == ORIGFILE(paf)); 8960 memcpy(a, APND_MARK_PREFIX, APND_MARK_PREFIX_SZ); 8961 while( --i >= 0 ){ 8962 a[APND_MARK_PREFIX_SZ+i] = (unsigned char)(iPgOne & 0xff); 8963 iPgOne >>= 8; 8964 } 8965 iWriteEnd += paf->iPgOne; 8966 if( SQLITE_OK==(rc = pFile->pMethods->xWrite 8967 (pFile, a, APND_MARK_SIZE, iWriteEnd)) ){ 8968 paf->iMark = iWriteEnd; 8969 } 8970 return rc; 8971 } 8972 8973 /* 8974 ** Write data to an apnd-file. 8975 */ 8976 static int apndWrite( 8977 sqlite3_file *pFile, 8978 const void *zBuf, 8979 int iAmt, 8980 sqlite_int64 iOfst 8981 ){ 8982 ApndFile *paf = (ApndFile *)pFile; 8983 sqlite_int64 iWriteEnd = iOfst + iAmt; 8984 if( iWriteEnd>=APND_MAX_SIZE ) return SQLITE_FULL; 8985 pFile = ORIGFILE(pFile); 8986 /* If append-mark is absent or will be overwritten, write it. */ 8987 if( paf->iMark < 0 || paf->iPgOne + iWriteEnd > paf->iMark ){ 8988 int rc = apndWriteMark(paf, pFile, iWriteEnd); 8989 if( SQLITE_OK!=rc ) return rc; 8990 } 8991 return pFile->pMethods->xWrite(pFile, zBuf, iAmt, paf->iPgOne+iOfst); 8992 } 8993 8994 /* 8995 ** Truncate an apnd-file. 8996 */ 8997 static int apndTruncate(sqlite3_file *pFile, sqlite_int64 size){ 8998 ApndFile *paf = (ApndFile *)pFile; 8999 pFile = ORIGFILE(pFile); 9000 /* The append mark goes out first so truncate failure does not lose it. */ 9001 if( SQLITE_OK!=apndWriteMark(paf, pFile, size) ) return SQLITE_IOERR; 9002 /* Truncate underlying file just past append mark */ 9003 return pFile->pMethods->xTruncate(pFile, paf->iMark+APND_MARK_SIZE); 9004 } 9005 9006 /* 9007 ** Sync an apnd-file. 9008 */ 9009 static int apndSync(sqlite3_file *pFile, int flags){ 9010 pFile = ORIGFILE(pFile); 9011 return pFile->pMethods->xSync(pFile, flags); 9012 } 9013 9014 /* 9015 ** Return the current file-size of an apnd-file. 9016 ** If the append mark is not yet there, the file-size is 0. 9017 */ 9018 static int apndFileSize(sqlite3_file *pFile, sqlite_int64 *pSize){ 9019 ApndFile *paf = (ApndFile *)pFile; 9020 *pSize = ( paf->iMark >= 0 )? (paf->iMark - paf->iPgOne) : 0; 9021 return SQLITE_OK; 9022 } 9023 9024 /* 9025 ** Lock an apnd-file. 9026 */ 9027 static int apndLock(sqlite3_file *pFile, int eLock){ 9028 pFile = ORIGFILE(pFile); 9029 return pFile->pMethods->xLock(pFile, eLock); 9030 } 9031 9032 /* 9033 ** Unlock an apnd-file. 9034 */ 9035 static int apndUnlock(sqlite3_file *pFile, int eLock){ 9036 pFile = ORIGFILE(pFile); 9037 return pFile->pMethods->xUnlock(pFile, eLock); 9038 } 9039 9040 /* 9041 ** Check if another file-handle holds a RESERVED lock on an apnd-file. 9042 */ 9043 static int apndCheckReservedLock(sqlite3_file *pFile, int *pResOut){ 9044 pFile = ORIGFILE(pFile); 9045 return pFile->pMethods->xCheckReservedLock(pFile, pResOut); 9046 } 9047 9048 /* 9049 ** File control method. For custom operations on an apnd-file. 9050 */ 9051 static int apndFileControl(sqlite3_file *pFile, int op, void *pArg){ 9052 ApndFile *paf = (ApndFile *)pFile; 9053 int rc; 9054 pFile = ORIGFILE(pFile); 9055 if( op==SQLITE_FCNTL_SIZE_HINT ) *(sqlite3_int64*)pArg += paf->iPgOne; 9056 rc = pFile->pMethods->xFileControl(pFile, op, pArg); 9057 if( rc==SQLITE_OK && op==SQLITE_FCNTL_VFSNAME ){ 9058 *(char**)pArg = sqlite3_mprintf("apnd(%lld)/%z", paf->iPgOne,*(char**)pArg); 9059 } 9060 return rc; 9061 } 9062 9063 /* 9064 ** Return the sector-size in bytes for an apnd-file. 9065 */ 9066 static int apndSectorSize(sqlite3_file *pFile){ 9067 pFile = ORIGFILE(pFile); 9068 return pFile->pMethods->xSectorSize(pFile); 9069 } 9070 9071 /* 9072 ** Return the device characteristic flags supported by an apnd-file. 9073 */ 9074 static int apndDeviceCharacteristics(sqlite3_file *pFile){ 9075 pFile = ORIGFILE(pFile); 9076 return pFile->pMethods->xDeviceCharacteristics(pFile); 9077 } 9078 9079 /* Create a shared memory file mapping */ 9080 static int apndShmMap( 9081 sqlite3_file *pFile, 9082 int iPg, 9083 int pgsz, 9084 int bExtend, 9085 void volatile **pp 9086 ){ 9087 pFile = ORIGFILE(pFile); 9088 return pFile->pMethods->xShmMap(pFile,iPg,pgsz,bExtend,pp); 9089 } 9090 9091 /* Perform locking on a shared-memory segment */ 9092 static int apndShmLock(sqlite3_file *pFile, int offset, int n, int flags){ 9093 pFile = ORIGFILE(pFile); 9094 return pFile->pMethods->xShmLock(pFile,offset,n,flags); 9095 } 9096 9097 /* Memory barrier operation on shared memory */ 9098 static void apndShmBarrier(sqlite3_file *pFile){ 9099 pFile = ORIGFILE(pFile); 9100 pFile->pMethods->xShmBarrier(pFile); 9101 } 9102 9103 /* Unmap a shared memory segment */ 9104 static int apndShmUnmap(sqlite3_file *pFile, int deleteFlag){ 9105 pFile = ORIGFILE(pFile); 9106 return pFile->pMethods->xShmUnmap(pFile,deleteFlag); 9107 } 9108 9109 /* Fetch a page of a memory-mapped file */ 9110 static int apndFetch( 9111 sqlite3_file *pFile, 9112 sqlite3_int64 iOfst, 9113 int iAmt, 9114 void **pp 9115 ){ 9116 ApndFile *p = (ApndFile *)pFile; 9117 if( p->iMark < 0 || iOfst+iAmt > p->iMark ){ 9118 return SQLITE_IOERR; /* Cannot read what is not yet there. */ 9119 } 9120 pFile = ORIGFILE(pFile); 9121 return pFile->pMethods->xFetch(pFile, iOfst+p->iPgOne, iAmt, pp); 9122 } 9123 9124 /* Release a memory-mapped page */ 9125 static int apndUnfetch(sqlite3_file *pFile, sqlite3_int64 iOfst, void *pPage){ 9126 ApndFile *p = (ApndFile *)pFile; 9127 pFile = ORIGFILE(pFile); 9128 return pFile->pMethods->xUnfetch(pFile, iOfst+p->iPgOne, pPage); 9129 } 9130 9131 /* 9132 ** Try to read the append-mark off the end of a file. Return the 9133 ** start of the appended database if the append-mark is present. 9134 ** If there is no valid append-mark, return -1; 9135 ** 9136 ** An append-mark is only valid if the NNNNNNNN start-of-database offset 9137 ** indicates that the appended database contains at least one page. The 9138 ** start-of-database value must be a multiple of 512. 9139 */ 9140 static sqlite3_int64 apndReadMark(sqlite3_int64 sz, sqlite3_file *pFile){ 9141 int rc, i; 9142 sqlite3_int64 iMark; 9143 int msbs = 8 * (APND_MARK_FOS_SZ-1); 9144 unsigned char a[APND_MARK_SIZE]; 9145 9146 if( APND_MARK_SIZE!=(sz & 0x1ff) ) return -1; 9147 rc = pFile->pMethods->xRead(pFile, a, APND_MARK_SIZE, sz-APND_MARK_SIZE); 9148 if( rc ) return -1; 9149 if( memcmp(a, APND_MARK_PREFIX, APND_MARK_PREFIX_SZ)!=0 ) return -1; 9150 iMark = ((sqlite3_int64)(a[APND_MARK_PREFIX_SZ] & 0x7f)) << msbs; 9151 for(i=1; i<8; i++){ 9152 msbs -= 8; 9153 iMark |= (sqlite3_int64)a[APND_MARK_PREFIX_SZ+i]<<msbs; 9154 } 9155 if( iMark > (sz - APND_MARK_SIZE - 512) ) return -1; 9156 if( iMark & 0x1ff ) return -1; 9157 return iMark; 9158 } 9159 9160 static const char apvfsSqliteHdr[] = "SQLite format 3"; 9161 /* 9162 ** Check to see if the file is an appendvfs SQLite database file. 9163 ** Return true iff it is such. Parameter sz is the file's size. 9164 */ 9165 static int apndIsAppendvfsDatabase(sqlite3_int64 sz, sqlite3_file *pFile){ 9166 int rc; 9167 char zHdr[16]; 9168 sqlite3_int64 iMark = apndReadMark(sz, pFile); 9169 if( iMark>=0 ){ 9170 /* If file has the correct end-marker, the expected odd size, and the 9171 ** SQLite DB type marker where the end-marker puts it, then it 9172 ** is an appendvfs database. 9173 */ 9174 rc = pFile->pMethods->xRead(pFile, zHdr, sizeof(zHdr), iMark); 9175 if( SQLITE_OK==rc 9176 && memcmp(zHdr, apvfsSqliteHdr, sizeof(zHdr))==0 9177 && (sz & 0x1ff) == APND_MARK_SIZE 9178 && sz>=512+APND_MARK_SIZE 9179 ){ 9180 return 1; /* It's an appendvfs database */ 9181 } 9182 } 9183 return 0; 9184 } 9185 9186 /* 9187 ** Check to see if the file is an ordinary SQLite database file. 9188 ** Return true iff so. Parameter sz is the file's size. 9189 */ 9190 static int apndIsOrdinaryDatabaseFile(sqlite3_int64 sz, sqlite3_file *pFile){ 9191 char zHdr[16]; 9192 if( apndIsAppendvfsDatabase(sz, pFile) /* rule 2 */ 9193 || (sz & 0x1ff) != 0 9194 || SQLITE_OK!=pFile->pMethods->xRead(pFile, zHdr, sizeof(zHdr), 0) 9195 || memcmp(zHdr, apvfsSqliteHdr, sizeof(zHdr))!=0 9196 ){ 9197 return 0; 9198 }else{ 9199 return 1; 9200 } 9201 } 9202 9203 /* 9204 ** Open an apnd file handle. 9205 */ 9206 static int apndOpen( 9207 sqlite3_vfs *pApndVfs, 9208 const char *zName, 9209 sqlite3_file *pFile, 9210 int flags, 9211 int *pOutFlags 9212 ){ 9213 ApndFile *pApndFile = (ApndFile*)pFile; 9214 sqlite3_file *pBaseFile = ORIGFILE(pFile); 9215 sqlite3_vfs *pBaseVfs = ORIGVFS(pApndVfs); 9216 int rc; 9217 sqlite3_int64 sz = 0; 9218 if( (flags & SQLITE_OPEN_MAIN_DB)==0 ){ 9219 /* The appendvfs is not to be used for transient or temporary databases. 9220 ** Just use the base VFS open to initialize the given file object and 9221 ** open the underlying file. (Appendvfs is then unused for this file.) 9222 */ 9223 return pBaseVfs->xOpen(pBaseVfs, zName, pFile, flags, pOutFlags); 9224 } 9225 memset(pApndFile, 0, sizeof(ApndFile)); 9226 pFile->pMethods = &apnd_io_methods; 9227 pApndFile->iMark = -1; /* Append mark not yet written */ 9228 9229 rc = pBaseVfs->xOpen(pBaseVfs, zName, pBaseFile, flags, pOutFlags); 9230 if( rc==SQLITE_OK ){ 9231 rc = pBaseFile->pMethods->xFileSize(pBaseFile, &sz); 9232 if( rc ){ 9233 pBaseFile->pMethods->xClose(pBaseFile); 9234 } 9235 } 9236 if( rc ){ 9237 pFile->pMethods = 0; 9238 return rc; 9239 } 9240 if( apndIsOrdinaryDatabaseFile(sz, pBaseFile) ){ 9241 /* The file being opened appears to be just an ordinary DB. Copy 9242 ** the base dispatch-table so this instance mimics the base VFS. 9243 */ 9244 memmove(pApndFile, pBaseFile, pBaseVfs->szOsFile); 9245 return SQLITE_OK; 9246 } 9247 pApndFile->iPgOne = apndReadMark(sz, pFile); 9248 if( pApndFile->iPgOne>=0 ){ 9249 pApndFile->iMark = sz - APND_MARK_SIZE; /* Append mark found */ 9250 return SQLITE_OK; 9251 } 9252 if( (flags & SQLITE_OPEN_CREATE)==0 ){ 9253 pBaseFile->pMethods->xClose(pBaseFile); 9254 rc = SQLITE_CANTOPEN; 9255 pFile->pMethods = 0; 9256 }else{ 9257 /* Round newly added appendvfs location to #define'd page boundary. 9258 ** Note that nothing has yet been written to the underlying file. 9259 ** The append mark will be written along with first content write. 9260 ** Until then, paf->iMark value indicates it is not yet written. 9261 */ 9262 pApndFile->iPgOne = APND_START_ROUNDUP(sz); 9263 } 9264 return rc; 9265 } 9266 9267 /* 9268 ** Delete an apnd file. 9269 ** For an appendvfs, this could mean delete the appendvfs portion, 9270 ** leaving the appendee as it was before it gained an appendvfs. 9271 ** For now, this code deletes the underlying file too. 9272 */ 9273 static int apndDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){ 9274 return ORIGVFS(pVfs)->xDelete(ORIGVFS(pVfs), zPath, dirSync); 9275 } 9276 9277 /* 9278 ** All other VFS methods are pass-thrus. 9279 */ 9280 static int apndAccess( 9281 sqlite3_vfs *pVfs, 9282 const char *zPath, 9283 int flags, 9284 int *pResOut 9285 ){ 9286 return ORIGVFS(pVfs)->xAccess(ORIGVFS(pVfs), zPath, flags, pResOut); 9287 } 9288 static int apndFullPathname( 9289 sqlite3_vfs *pVfs, 9290 const char *zPath, 9291 int nOut, 9292 char *zOut 9293 ){ 9294 return ORIGVFS(pVfs)->xFullPathname(ORIGVFS(pVfs),zPath,nOut,zOut); 9295 } 9296 static void *apndDlOpen(sqlite3_vfs *pVfs, const char *zPath){ 9297 return ORIGVFS(pVfs)->xDlOpen(ORIGVFS(pVfs), zPath); 9298 } 9299 static void apndDlError(sqlite3_vfs *pVfs, int nByte, char *zErrMsg){ 9300 ORIGVFS(pVfs)->xDlError(ORIGVFS(pVfs), nByte, zErrMsg); 9301 } 9302 static void (*apndDlSym(sqlite3_vfs *pVfs, void *p, const char *zSym))(void){ 9303 return ORIGVFS(pVfs)->xDlSym(ORIGVFS(pVfs), p, zSym); 9304 } 9305 static void apndDlClose(sqlite3_vfs *pVfs, void *pHandle){ 9306 ORIGVFS(pVfs)->xDlClose(ORIGVFS(pVfs), pHandle); 9307 } 9308 static int apndRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){ 9309 return ORIGVFS(pVfs)->xRandomness(ORIGVFS(pVfs), nByte, zBufOut); 9310 } 9311 static int apndSleep(sqlite3_vfs *pVfs, int nMicro){ 9312 return ORIGVFS(pVfs)->xSleep(ORIGVFS(pVfs), nMicro); 9313 } 9314 static int apndCurrentTime(sqlite3_vfs *pVfs, double *pTimeOut){ 9315 return ORIGVFS(pVfs)->xCurrentTime(ORIGVFS(pVfs), pTimeOut); 9316 } 9317 static int apndGetLastError(sqlite3_vfs *pVfs, int a, char *b){ 9318 return ORIGVFS(pVfs)->xGetLastError(ORIGVFS(pVfs), a, b); 9319 } 9320 static int apndCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *p){ 9321 return ORIGVFS(pVfs)->xCurrentTimeInt64(ORIGVFS(pVfs), p); 9322 } 9323 static int apndSetSystemCall( 9324 sqlite3_vfs *pVfs, 9325 const char *zName, 9326 sqlite3_syscall_ptr pCall 9327 ){ 9328 return ORIGVFS(pVfs)->xSetSystemCall(ORIGVFS(pVfs),zName,pCall); 9329 } 9330 static sqlite3_syscall_ptr apndGetSystemCall( 9331 sqlite3_vfs *pVfs, 9332 const char *zName 9333 ){ 9334 return ORIGVFS(pVfs)->xGetSystemCall(ORIGVFS(pVfs),zName); 9335 } 9336 static const char *apndNextSystemCall(sqlite3_vfs *pVfs, const char *zName){ 9337 return ORIGVFS(pVfs)->xNextSystemCall(ORIGVFS(pVfs), zName); 9338 } 9339 9340 9341 #ifdef _WIN32 9342 9343 #endif 9344 /* 9345 ** This routine is called when the extension is loaded. 9346 ** Register the new VFS. 9347 */ 9348 int sqlite3_appendvfs_init( 9349 sqlite3 *db, 9350 char **pzErrMsg, 9351 const sqlite3_api_routines *pApi 9352 ){ 9353 int rc = SQLITE_OK; 9354 sqlite3_vfs *pOrig; 9355 SQLITE_EXTENSION_INIT2(pApi); 9356 (void)pzErrMsg; 9357 (void)db; 9358 pOrig = sqlite3_vfs_find(0); 9359 if( pOrig==0 ) return SQLITE_ERROR; 9360 apnd_vfs.iVersion = pOrig->iVersion; 9361 apnd_vfs.pAppData = pOrig; 9362 apnd_vfs.szOsFile = pOrig->szOsFile + sizeof(ApndFile); 9363 rc = sqlite3_vfs_register(&apnd_vfs, 0); 9364 #ifdef APPENDVFS_TEST 9365 if( rc==SQLITE_OK ){ 9366 rc = sqlite3_auto_extension((void(*)(void))apndvfsRegister); 9367 } 9368 #endif 9369 if( rc==SQLITE_OK ) rc = SQLITE_OK_LOAD_PERMANENTLY; 9370 return rc; 9371 } 9372 9373 /************************* End ../ext/misc/appendvfs.c ********************/ 9374 #endif 9375 #ifdef SQLITE_HAVE_ZLIB 9376 /************************* Begin ../ext/misc/zipfile.c ******************/ 9377 /* 9378 ** 2017-12-26 9379 ** 9380 ** The author disclaims copyright to this source code. In place of 9381 ** a legal notice, here is a blessing: 9382 ** 9383 ** May you do good and not evil. 9384 ** May you find forgiveness for yourself and forgive others. 9385 ** May you share freely, never taking more than you give. 9386 ** 9387 ****************************************************************************** 9388 ** 9389 ** This file implements a virtual table for reading and writing ZIP archive 9390 ** files. 9391 ** 9392 ** Usage example: 9393 ** 9394 ** SELECT name, sz, datetime(mtime,'unixepoch') FROM zipfile($filename); 9395 ** 9396 ** Current limitations: 9397 ** 9398 ** * No support for encryption 9399 ** * No support for ZIP archives spanning multiple files 9400 ** * No support for zip64 extensions 9401 ** * Only the "inflate/deflate" (zlib) compression method is supported 9402 */ 9403 /* #include "sqlite3ext.h" */ 9404 SQLITE_EXTENSION_INIT1 9405 #include <stdio.h> 9406 #include <string.h> 9407 #include <assert.h> 9408 #include <stdint.h> 9409 9410 #include <zlib.h> 9411 9412 #ifndef SQLITE_OMIT_VIRTUALTABLE 9413 9414 #ifndef SQLITE_AMALGAMATION 9415 9416 #ifndef UINT32_TYPE 9417 # ifdef HAVE_UINT32_T 9418 # define UINT32_TYPE uint32_t 9419 # else 9420 # define UINT32_TYPE unsigned int 9421 # endif 9422 #endif 9423 #ifndef UINT16_TYPE 9424 # ifdef HAVE_UINT16_T 9425 # define UINT16_TYPE uint16_t 9426 # else 9427 # define UINT16_TYPE unsigned short int 9428 # endif 9429 #endif 9430 /* typedef sqlite3_int64 i64; */ 9431 /* typedef unsigned char u8; */ 9432 /* typedef UINT32_TYPE u32; // 4-byte unsigned integer // */ 9433 /* typedef UINT16_TYPE u16; // 2-byte unsigned integer // */ 9434 #define MIN(a,b) ((a)<(b) ? (a) : (b)) 9435 9436 #if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST) 9437 # define SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS 1 9438 #endif 9439 #if defined(SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS) 9440 # define ALWAYS(X) (1) 9441 # define NEVER(X) (0) 9442 #elif !defined(NDEBUG) 9443 # define ALWAYS(X) ((X)?1:(assert(0),0)) 9444 # define NEVER(X) ((X)?(assert(0),1):0) 9445 #else 9446 # define ALWAYS(X) (X) 9447 # define NEVER(X) (X) 9448 #endif 9449 9450 #endif /* SQLITE_AMALGAMATION */ 9451 9452 /* 9453 ** Definitions for mode bitmasks S_IFDIR, S_IFREG and S_IFLNK. 9454 ** 9455 ** In some ways it would be better to obtain these values from system 9456 ** header files. But, the dependency is undesirable and (a) these 9457 ** have been stable for decades, (b) the values are part of POSIX and 9458 ** are also made explicit in [man stat], and (c) are part of the 9459 ** file format for zip archives. 9460 */ 9461 #ifndef S_IFDIR 9462 # define S_IFDIR 0040000 9463 #endif 9464 #ifndef S_IFREG 9465 # define S_IFREG 0100000 9466 #endif 9467 #ifndef S_IFLNK 9468 # define S_IFLNK 0120000 9469 #endif 9470 9471 static const char ZIPFILE_SCHEMA[] = 9472 "CREATE TABLE y(" 9473 "name PRIMARY KEY," /* 0: Name of file in zip archive */ 9474 "mode," /* 1: POSIX mode for file */ 9475 "mtime," /* 2: Last modification time (secs since 1970)*/ 9476 "sz," /* 3: Size of object */ 9477 "rawdata," /* 4: Raw data */ 9478 "data," /* 5: Uncompressed data */ 9479 "method," /* 6: Compression method (integer) */ 9480 "z HIDDEN" /* 7: Name of zip file */ 9481 ") WITHOUT ROWID;"; 9482 9483 #define ZIPFILE_F_COLUMN_IDX 7 /* Index of column "file" in the above */ 9484 #define ZIPFILE_BUFFER_SIZE (64*1024) 9485 9486 9487 /* 9488 ** Magic numbers used to read and write zip files. 9489 ** 9490 ** ZIPFILE_NEWENTRY_MADEBY: 9491 ** Use this value for the "version-made-by" field in new zip file 9492 ** entries. The upper byte indicates "unix", and the lower byte 9493 ** indicates that the zip file matches pkzip specification 3.0. 9494 ** This is what info-zip seems to do. 9495 ** 9496 ** ZIPFILE_NEWENTRY_REQUIRED: 9497 ** Value for "version-required-to-extract" field of new entries. 9498 ** Version 2.0 is required to support folders and deflate compression. 9499 ** 9500 ** ZIPFILE_NEWENTRY_FLAGS: 9501 ** Value for "general-purpose-bit-flags" field of new entries. Bit 9502 ** 11 means "utf-8 filename and comment". 9503 ** 9504 ** ZIPFILE_SIGNATURE_CDS: 9505 ** First 4 bytes of a valid CDS record. 9506 ** 9507 ** ZIPFILE_SIGNATURE_LFH: 9508 ** First 4 bytes of a valid LFH record. 9509 ** 9510 ** ZIPFILE_SIGNATURE_EOCD 9511 ** First 4 bytes of a valid EOCD record. 9512 */ 9513 #define ZIPFILE_EXTRA_TIMESTAMP 0x5455 9514 #define ZIPFILE_NEWENTRY_MADEBY ((3<<8) + 30) 9515 #define ZIPFILE_NEWENTRY_REQUIRED 20 9516 #define ZIPFILE_NEWENTRY_FLAGS 0x800 9517 #define ZIPFILE_SIGNATURE_CDS 0x02014b50 9518 #define ZIPFILE_SIGNATURE_LFH 0x04034b50 9519 #define ZIPFILE_SIGNATURE_EOCD 0x06054b50 9520 9521 /* 9522 ** The sizes of the fixed-size part of each of the three main data 9523 ** structures in a zip archive. 9524 */ 9525 #define ZIPFILE_LFH_FIXED_SZ 30 9526 #define ZIPFILE_EOCD_FIXED_SZ 22 9527 #define ZIPFILE_CDS_FIXED_SZ 46 9528 9529 /* 9530 *** 4.3.16 End of central directory record: 9531 *** 9532 *** end of central dir signature 4 bytes (0x06054b50) 9533 *** number of this disk 2 bytes 9534 *** number of the disk with the 9535 *** start of the central directory 2 bytes 9536 *** total number of entries in the 9537 *** central directory on this disk 2 bytes 9538 *** total number of entries in 9539 *** the central directory 2 bytes 9540 *** size of the central directory 4 bytes 9541 *** offset of start of central 9542 *** directory with respect to 9543 *** the starting disk number 4 bytes 9544 *** .ZIP file comment length 2 bytes 9545 *** .ZIP file comment (variable size) 9546 */ 9547 typedef struct ZipfileEOCD ZipfileEOCD; 9548 struct ZipfileEOCD { 9549 u16 iDisk; 9550 u16 iFirstDisk; 9551 u16 nEntry; 9552 u16 nEntryTotal; 9553 u32 nSize; 9554 u32 iOffset; 9555 }; 9556 9557 /* 9558 *** 4.3.12 Central directory structure: 9559 *** 9560 *** ... 9561 *** 9562 *** central file header signature 4 bytes (0x02014b50) 9563 *** version made by 2 bytes 9564 *** version needed to extract 2 bytes 9565 *** general purpose bit flag 2 bytes 9566 *** compression method 2 bytes 9567 *** last mod file time 2 bytes 9568 *** last mod file date 2 bytes 9569 *** crc-32 4 bytes 9570 *** compressed size 4 bytes 9571 *** uncompressed size 4 bytes 9572 *** file name length 2 bytes 9573 *** extra field length 2 bytes 9574 *** file comment length 2 bytes 9575 *** disk number start 2 bytes 9576 *** internal file attributes 2 bytes 9577 *** external file attributes 4 bytes 9578 *** relative offset of local header 4 bytes 9579 */ 9580 typedef struct ZipfileCDS ZipfileCDS; 9581 struct ZipfileCDS { 9582 u16 iVersionMadeBy; 9583 u16 iVersionExtract; 9584 u16 flags; 9585 u16 iCompression; 9586 u16 mTime; 9587 u16 mDate; 9588 u32 crc32; 9589 u32 szCompressed; 9590 u32 szUncompressed; 9591 u16 nFile; 9592 u16 nExtra; 9593 u16 nComment; 9594 u16 iDiskStart; 9595 u16 iInternalAttr; 9596 u32 iExternalAttr; 9597 u32 iOffset; 9598 char *zFile; /* Filename (sqlite3_malloc()) */ 9599 }; 9600 9601 /* 9602 *** 4.3.7 Local file header: 9603 *** 9604 *** local file header signature 4 bytes (0x04034b50) 9605 *** version needed to extract 2 bytes 9606 *** general purpose bit flag 2 bytes 9607 *** compression method 2 bytes 9608 *** last mod file time 2 bytes 9609 *** last mod file date 2 bytes 9610 *** crc-32 4 bytes 9611 *** compressed size 4 bytes 9612 *** uncompressed size 4 bytes 9613 *** file name length 2 bytes 9614 *** extra field length 2 bytes 9615 *** 9616 */ 9617 typedef struct ZipfileLFH ZipfileLFH; 9618 struct ZipfileLFH { 9619 u16 iVersionExtract; 9620 u16 flags; 9621 u16 iCompression; 9622 u16 mTime; 9623 u16 mDate; 9624 u32 crc32; 9625 u32 szCompressed; 9626 u32 szUncompressed; 9627 u16 nFile; 9628 u16 nExtra; 9629 }; 9630 9631 typedef struct ZipfileEntry ZipfileEntry; 9632 struct ZipfileEntry { 9633 ZipfileCDS cds; /* Parsed CDS record */ 9634 u32 mUnixTime; /* Modification time, in UNIX format */ 9635 u8 *aExtra; /* cds.nExtra+cds.nComment bytes of extra data */ 9636 i64 iDataOff; /* Offset to data in file (if aData==0) */ 9637 u8 *aData; /* cds.szCompressed bytes of compressed data */ 9638 ZipfileEntry *pNext; /* Next element in in-memory CDS */ 9639 }; 9640 9641 /* 9642 ** Cursor type for zipfile tables. 9643 */ 9644 typedef struct ZipfileCsr ZipfileCsr; 9645 struct ZipfileCsr { 9646 sqlite3_vtab_cursor base; /* Base class - must be first */ 9647 i64 iId; /* Cursor ID */ 9648 u8 bEof; /* True when at EOF */ 9649 u8 bNoop; /* If next xNext() call is no-op */ 9650 9651 /* Used outside of write transactions */ 9652 FILE *pFile; /* Zip file */ 9653 i64 iNextOff; /* Offset of next record in central directory */ 9654 ZipfileEOCD eocd; /* Parse of central directory record */ 9655 9656 ZipfileEntry *pFreeEntry; /* Free this list when cursor is closed or reset */ 9657 ZipfileEntry *pCurrent; /* Current entry */ 9658 ZipfileCsr *pCsrNext; /* Next cursor on same virtual table */ 9659 }; 9660 9661 typedef struct ZipfileTab ZipfileTab; 9662 struct ZipfileTab { 9663 sqlite3_vtab base; /* Base class - must be first */ 9664 char *zFile; /* Zip file this table accesses (may be NULL) */ 9665 sqlite3 *db; /* Host database connection */ 9666 u8 *aBuffer; /* Temporary buffer used for various tasks */ 9667 9668 ZipfileCsr *pCsrList; /* List of cursors */ 9669 i64 iNextCsrid; 9670 9671 /* The following are used by write transactions only */ 9672 ZipfileEntry *pFirstEntry; /* Linked list of all files (if pWriteFd!=0) */ 9673 ZipfileEntry *pLastEntry; /* Last element in pFirstEntry list */ 9674 FILE *pWriteFd; /* File handle open on zip archive */ 9675 i64 szCurrent; /* Current size of zip archive */ 9676 i64 szOrig; /* Size of archive at start of transaction */ 9677 }; 9678 9679 /* 9680 ** Set the error message contained in context ctx to the results of 9681 ** vprintf(zFmt, ...). 9682 */ 9683 static void zipfileCtxErrorMsg(sqlite3_context *ctx, const char *zFmt, ...){ 9684 char *zMsg = 0; 9685 va_list ap; 9686 va_start(ap, zFmt); 9687 zMsg = sqlite3_vmprintf(zFmt, ap); 9688 sqlite3_result_error(ctx, zMsg, -1); 9689 sqlite3_free(zMsg); 9690 va_end(ap); 9691 } 9692 9693 /* 9694 ** If string zIn is quoted, dequote it in place. Otherwise, if the string 9695 ** is not quoted, do nothing. 9696 */ 9697 static void zipfileDequote(char *zIn){ 9698 char q = zIn[0]; 9699 if( q=='"' || q=='\'' || q=='`' || q=='[' ){ 9700 int iIn = 1; 9701 int iOut = 0; 9702 if( q=='[' ) q = ']'; 9703 while( ALWAYS(zIn[iIn]) ){ 9704 char c = zIn[iIn++]; 9705 if( c==q && zIn[iIn++]!=q ) break; 9706 zIn[iOut++] = c; 9707 } 9708 zIn[iOut] = '\0'; 9709 } 9710 } 9711 9712 /* 9713 ** Construct a new ZipfileTab virtual table object. 9714 ** 9715 ** argv[0] -> module name ("zipfile") 9716 ** argv[1] -> database name 9717 ** argv[2] -> table name 9718 ** argv[...] -> "column name" and other module argument fields. 9719 */ 9720 static int zipfileConnect( 9721 sqlite3 *db, 9722 void *pAux, 9723 int argc, const char *const*argv, 9724 sqlite3_vtab **ppVtab, 9725 char **pzErr 9726 ){ 9727 int nByte = sizeof(ZipfileTab) + ZIPFILE_BUFFER_SIZE; 9728 int nFile = 0; 9729 const char *zFile = 0; 9730 ZipfileTab *pNew = 0; 9731 int rc; 9732 (void)pAux; 9733 9734 /* If the table name is not "zipfile", require that the argument be 9735 ** specified. This stops zipfile tables from being created as: 9736 ** 9737 ** CREATE VIRTUAL TABLE zzz USING zipfile(); 9738 ** 9739 ** It does not prevent: 9740 ** 9741 ** CREATE VIRTUAL TABLE zipfile USING zipfile(); 9742 */ 9743 assert( 0==sqlite3_stricmp(argv[0], "zipfile") ); 9744 if( (0!=sqlite3_stricmp(argv[2], "zipfile") && argc<4) || argc>4 ){ 9745 *pzErr = sqlite3_mprintf("zipfile constructor requires one argument"); 9746 return SQLITE_ERROR; 9747 } 9748 9749 if( argc>3 ){ 9750 zFile = argv[3]; 9751 nFile = (int)strlen(zFile)+1; 9752 } 9753 9754 rc = sqlite3_declare_vtab(db, ZIPFILE_SCHEMA); 9755 if( rc==SQLITE_OK ){ 9756 pNew = (ZipfileTab*)sqlite3_malloc64((sqlite3_int64)nByte+nFile); 9757 if( pNew==0 ) return SQLITE_NOMEM; 9758 memset(pNew, 0, nByte+nFile); 9759 pNew->db = db; 9760 pNew->aBuffer = (u8*)&pNew[1]; 9761 if( zFile ){ 9762 pNew->zFile = (char*)&pNew->aBuffer[ZIPFILE_BUFFER_SIZE]; 9763 memcpy(pNew->zFile, zFile, nFile); 9764 zipfileDequote(pNew->zFile); 9765 } 9766 } 9767 sqlite3_vtab_config(db, SQLITE_VTAB_DIRECTONLY); 9768 *ppVtab = (sqlite3_vtab*)pNew; 9769 return rc; 9770 } 9771 9772 /* 9773 ** Free the ZipfileEntry structure indicated by the only argument. 9774 */ 9775 static void zipfileEntryFree(ZipfileEntry *p){ 9776 if( p ){ 9777 sqlite3_free(p->cds.zFile); 9778 sqlite3_free(p); 9779 } 9780 } 9781 9782 /* 9783 ** Release resources that should be freed at the end of a write 9784 ** transaction. 9785 */ 9786 static void zipfileCleanupTransaction(ZipfileTab *pTab){ 9787 ZipfileEntry *pEntry; 9788 ZipfileEntry *pNext; 9789 9790 if( pTab->pWriteFd ){ 9791 fclose(pTab->pWriteFd); 9792 pTab->pWriteFd = 0; 9793 } 9794 for(pEntry=pTab->pFirstEntry; pEntry; pEntry=pNext){ 9795 pNext = pEntry->pNext; 9796 zipfileEntryFree(pEntry); 9797 } 9798 pTab->pFirstEntry = 0; 9799 pTab->pLastEntry = 0; 9800 pTab->szCurrent = 0; 9801 pTab->szOrig = 0; 9802 } 9803 9804 /* 9805 ** This method is the destructor for zipfile vtab objects. 9806 */ 9807 static int zipfileDisconnect(sqlite3_vtab *pVtab){ 9808 zipfileCleanupTransaction((ZipfileTab*)pVtab); 9809 sqlite3_free(pVtab); 9810 return SQLITE_OK; 9811 } 9812 9813 /* 9814 ** Constructor for a new ZipfileCsr object. 9815 */ 9816 static int zipfileOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCsr){ 9817 ZipfileTab *pTab = (ZipfileTab*)p; 9818 ZipfileCsr *pCsr; 9819 pCsr = sqlite3_malloc(sizeof(*pCsr)); 9820 *ppCsr = (sqlite3_vtab_cursor*)pCsr; 9821 if( pCsr==0 ){ 9822 return SQLITE_NOMEM; 9823 } 9824 memset(pCsr, 0, sizeof(*pCsr)); 9825 pCsr->iId = ++pTab->iNextCsrid; 9826 pCsr->pCsrNext = pTab->pCsrList; 9827 pTab->pCsrList = pCsr; 9828 return SQLITE_OK; 9829 } 9830 9831 /* 9832 ** Reset a cursor back to the state it was in when first returned 9833 ** by zipfileOpen(). 9834 */ 9835 static void zipfileResetCursor(ZipfileCsr *pCsr){ 9836 ZipfileEntry *p; 9837 ZipfileEntry *pNext; 9838 9839 pCsr->bEof = 0; 9840 if( pCsr->pFile ){ 9841 fclose(pCsr->pFile); 9842 pCsr->pFile = 0; 9843 zipfileEntryFree(pCsr->pCurrent); 9844 pCsr->pCurrent = 0; 9845 } 9846 9847 for(p=pCsr->pFreeEntry; p; p=pNext){ 9848 pNext = p->pNext; 9849 zipfileEntryFree(p); 9850 } 9851 } 9852 9853 /* 9854 ** Destructor for an ZipfileCsr. 9855 */ 9856 static int zipfileClose(sqlite3_vtab_cursor *cur){ 9857 ZipfileCsr *pCsr = (ZipfileCsr*)cur; 9858 ZipfileTab *pTab = (ZipfileTab*)(pCsr->base.pVtab); 9859 ZipfileCsr **pp; 9860 zipfileResetCursor(pCsr); 9861 9862 /* Remove this cursor from the ZipfileTab.pCsrList list. */ 9863 for(pp=&pTab->pCsrList; *pp!=pCsr; pp=&((*pp)->pCsrNext)); 9864 *pp = pCsr->pCsrNext; 9865 9866 sqlite3_free(pCsr); 9867 return SQLITE_OK; 9868 } 9869 9870 /* 9871 ** Set the error message for the virtual table associated with cursor 9872 ** pCsr to the results of vprintf(zFmt, ...). 9873 */ 9874 static void zipfileTableErr(ZipfileTab *pTab, const char *zFmt, ...){ 9875 va_list ap; 9876 va_start(ap, zFmt); 9877 sqlite3_free(pTab->base.zErrMsg); 9878 pTab->base.zErrMsg = sqlite3_vmprintf(zFmt, ap); 9879 va_end(ap); 9880 } 9881 static void zipfileCursorErr(ZipfileCsr *pCsr, const char *zFmt, ...){ 9882 va_list ap; 9883 va_start(ap, zFmt); 9884 sqlite3_free(pCsr->base.pVtab->zErrMsg); 9885 pCsr->base.pVtab->zErrMsg = sqlite3_vmprintf(zFmt, ap); 9886 va_end(ap); 9887 } 9888 9889 /* 9890 ** Read nRead bytes of data from offset iOff of file pFile into buffer 9891 ** aRead[]. Return SQLITE_OK if successful, or an SQLite error code 9892 ** otherwise. 9893 ** 9894 ** If an error does occur, output variable (*pzErrmsg) may be set to point 9895 ** to an English language error message. It is the responsibility of the 9896 ** caller to eventually free this buffer using 9897 ** sqlite3_free(). 9898 */ 9899 static int zipfileReadData( 9900 FILE *pFile, /* Read from this file */ 9901 u8 *aRead, /* Read into this buffer */ 9902 int nRead, /* Number of bytes to read */ 9903 i64 iOff, /* Offset to read from */ 9904 char **pzErrmsg /* OUT: Error message (from sqlite3_malloc) */ 9905 ){ 9906 size_t n; 9907 fseek(pFile, (long)iOff, SEEK_SET); 9908 n = fread(aRead, 1, nRead, pFile); 9909 if( (int)n!=nRead ){ 9910 *pzErrmsg = sqlite3_mprintf("error in fread()"); 9911 return SQLITE_ERROR; 9912 } 9913 return SQLITE_OK; 9914 } 9915 9916 static int zipfileAppendData( 9917 ZipfileTab *pTab, 9918 const u8 *aWrite, 9919 int nWrite 9920 ){ 9921 if( nWrite>0 ){ 9922 size_t n = nWrite; 9923 fseek(pTab->pWriteFd, (long)pTab->szCurrent, SEEK_SET); 9924 n = fwrite(aWrite, 1, nWrite, pTab->pWriteFd); 9925 if( (int)n!=nWrite ){ 9926 pTab->base.zErrMsg = sqlite3_mprintf("error in fwrite()"); 9927 return SQLITE_ERROR; 9928 } 9929 pTab->szCurrent += nWrite; 9930 } 9931 return SQLITE_OK; 9932 } 9933 9934 /* 9935 ** Read and return a 16-bit little-endian unsigned integer from buffer aBuf. 9936 */ 9937 static u16 zipfileGetU16(const u8 *aBuf){ 9938 return (aBuf[1] << 8) + aBuf[0]; 9939 } 9940 9941 /* 9942 ** Read and return a 32-bit little-endian unsigned integer from buffer aBuf. 9943 */ 9944 static u32 zipfileGetU32(const u8 *aBuf){ 9945 if( aBuf==0 ) return 0; 9946 return ((u32)(aBuf[3]) << 24) 9947 + ((u32)(aBuf[2]) << 16) 9948 + ((u32)(aBuf[1]) << 8) 9949 + ((u32)(aBuf[0]) << 0); 9950 } 9951 9952 /* 9953 ** Write a 16-bit little endiate integer into buffer aBuf. 9954 */ 9955 static void zipfilePutU16(u8 *aBuf, u16 val){ 9956 aBuf[0] = val & 0xFF; 9957 aBuf[1] = (val>>8) & 0xFF; 9958 } 9959 9960 /* 9961 ** Write a 32-bit little endiate integer into buffer aBuf. 9962 */ 9963 static void zipfilePutU32(u8 *aBuf, u32 val){ 9964 aBuf[0] = val & 0xFF; 9965 aBuf[1] = (val>>8) & 0xFF; 9966 aBuf[2] = (val>>16) & 0xFF; 9967 aBuf[3] = (val>>24) & 0xFF; 9968 } 9969 9970 #define zipfileRead32(aBuf) ( aBuf+=4, zipfileGetU32(aBuf-4) ) 9971 #define zipfileRead16(aBuf) ( aBuf+=2, zipfileGetU16(aBuf-2) ) 9972 9973 #define zipfileWrite32(aBuf,val) { zipfilePutU32(aBuf,val); aBuf+=4; } 9974 #define zipfileWrite16(aBuf,val) { zipfilePutU16(aBuf,val); aBuf+=2; } 9975 9976 /* 9977 ** Magic numbers used to read CDS records. 9978 */ 9979 #define ZIPFILE_CDS_NFILE_OFF 28 9980 #define ZIPFILE_CDS_SZCOMPRESSED_OFF 20 9981 9982 /* 9983 ** Decode the CDS record in buffer aBuf into (*pCDS). Return SQLITE_ERROR 9984 ** if the record is not well-formed, or SQLITE_OK otherwise. 9985 */ 9986 static int zipfileReadCDS(u8 *aBuf, ZipfileCDS *pCDS){ 9987 u8 *aRead = aBuf; 9988 u32 sig = zipfileRead32(aRead); 9989 int rc = SQLITE_OK; 9990 if( sig!=ZIPFILE_SIGNATURE_CDS ){ 9991 rc = SQLITE_ERROR; 9992 }else{ 9993 pCDS->iVersionMadeBy = zipfileRead16(aRead); 9994 pCDS->iVersionExtract = zipfileRead16(aRead); 9995 pCDS->flags = zipfileRead16(aRead); 9996 pCDS->iCompression = zipfileRead16(aRead); 9997 pCDS->mTime = zipfileRead16(aRead); 9998 pCDS->mDate = zipfileRead16(aRead); 9999 pCDS->crc32 = zipfileRead32(aRead); 10000 pCDS->szCompressed = zipfileRead32(aRead); 10001 pCDS->szUncompressed = zipfileRead32(aRead); 10002 assert( aRead==&aBuf[ZIPFILE_CDS_NFILE_OFF] ); 10003 pCDS->nFile = zipfileRead16(aRead); 10004 pCDS->nExtra = zipfileRead16(aRead); 10005 pCDS->nComment = zipfileRead16(aRead); 10006 pCDS->iDiskStart = zipfileRead16(aRead); 10007 pCDS->iInternalAttr = zipfileRead16(aRead); 10008 pCDS->iExternalAttr = zipfileRead32(aRead); 10009 pCDS->iOffset = zipfileRead32(aRead); 10010 assert( aRead==&aBuf[ZIPFILE_CDS_FIXED_SZ] ); 10011 } 10012 10013 return rc; 10014 } 10015 10016 /* 10017 ** Decode the LFH record in buffer aBuf into (*pLFH). Return SQLITE_ERROR 10018 ** if the record is not well-formed, or SQLITE_OK otherwise. 10019 */ 10020 static int zipfileReadLFH( 10021 u8 *aBuffer, 10022 ZipfileLFH *pLFH 10023 ){ 10024 u8 *aRead = aBuffer; 10025 int rc = SQLITE_OK; 10026 10027 u32 sig = zipfileRead32(aRead); 10028 if( sig!=ZIPFILE_SIGNATURE_LFH ){ 10029 rc = SQLITE_ERROR; 10030 }else{ 10031 pLFH->iVersionExtract = zipfileRead16(aRead); 10032 pLFH->flags = zipfileRead16(aRead); 10033 pLFH->iCompression = zipfileRead16(aRead); 10034 pLFH->mTime = zipfileRead16(aRead); 10035 pLFH->mDate = zipfileRead16(aRead); 10036 pLFH->crc32 = zipfileRead32(aRead); 10037 pLFH->szCompressed = zipfileRead32(aRead); 10038 pLFH->szUncompressed = zipfileRead32(aRead); 10039 pLFH->nFile = zipfileRead16(aRead); 10040 pLFH->nExtra = zipfileRead16(aRead); 10041 } 10042 return rc; 10043 } 10044 10045 10046 /* 10047 ** Buffer aExtra (size nExtra bytes) contains zip archive "extra" fields. 10048 ** Scan through this buffer to find an "extra-timestamp" field. If one 10049 ** exists, extract the 32-bit modification-timestamp from it and store 10050 ** the value in output parameter *pmTime. 10051 ** 10052 ** Zero is returned if no extra-timestamp record could be found (and so 10053 ** *pmTime is left unchanged), or non-zero otherwise. 10054 ** 10055 ** The general format of an extra field is: 10056 ** 10057 ** Header ID 2 bytes 10058 ** Data Size 2 bytes 10059 ** Data N bytes 10060 */ 10061 static int zipfileScanExtra(u8 *aExtra, int nExtra, u32 *pmTime){ 10062 int ret = 0; 10063 u8 *p = aExtra; 10064 u8 *pEnd = &aExtra[nExtra]; 10065 10066 while( p<pEnd ){ 10067 u16 id = zipfileRead16(p); 10068 u16 nByte = zipfileRead16(p); 10069 10070 switch( id ){ 10071 case ZIPFILE_EXTRA_TIMESTAMP: { 10072 u8 b = p[0]; 10073 if( b & 0x01 ){ /* 0x01 -> modtime is present */ 10074 *pmTime = zipfileGetU32(&p[1]); 10075 ret = 1; 10076 } 10077 break; 10078 } 10079 } 10080 10081 p += nByte; 10082 } 10083 return ret; 10084 } 10085 10086 /* 10087 ** Convert the standard MS-DOS timestamp stored in the mTime and mDate 10088 ** fields of the CDS structure passed as the only argument to a 32-bit 10089 ** UNIX seconds-since-the-epoch timestamp. Return the result. 10090 ** 10091 ** "Standard" MS-DOS time format: 10092 ** 10093 ** File modification time: 10094 ** Bits 00-04: seconds divided by 2 10095 ** Bits 05-10: minute 10096 ** Bits 11-15: hour 10097 ** File modification date: 10098 ** Bits 00-04: day 10099 ** Bits 05-08: month (1-12) 10100 ** Bits 09-15: years from 1980 10101 ** 10102 ** https://msdn.microsoft.com/en-us/library/9kkf9tah.aspx 10103 */ 10104 static u32 zipfileMtime(ZipfileCDS *pCDS){ 10105 int Y,M,D,X1,X2,A,B,sec,min,hr; 10106 i64 JDsec; 10107 Y = (1980 + ((pCDS->mDate >> 9) & 0x7F)); 10108 M = ((pCDS->mDate >> 5) & 0x0F); 10109 D = (pCDS->mDate & 0x1F); 10110 sec = (pCDS->mTime & 0x1F)*2; 10111 min = (pCDS->mTime >> 5) & 0x3F; 10112 hr = (pCDS->mTime >> 11) & 0x1F; 10113 if( M<=2 ){ 10114 Y--; 10115 M += 12; 10116 } 10117 X1 = 36525*(Y+4716)/100; 10118 X2 = 306001*(M+1)/10000; 10119 A = Y/100; 10120 B = 2 - A + (A/4); 10121 JDsec = (i64)((X1 + X2 + D + B - 1524.5)*86400) + hr*3600 + min*60 + sec; 10122 return (u32)(JDsec - (i64)24405875*(i64)8640); 10123 } 10124 10125 /* 10126 ** The opposite of zipfileMtime(). This function populates the mTime and 10127 ** mDate fields of the CDS structure passed as the first argument according 10128 ** to the UNIX timestamp value passed as the second. 10129 */ 10130 static void zipfileMtimeToDos(ZipfileCDS *pCds, u32 mUnixTime){ 10131 /* Convert unix timestamp to JD (2440588 is noon on 1/1/1970) */ 10132 i64 JD = (i64)2440588 + mUnixTime / (24*60*60); 10133 10134 int A, B, C, D, E; 10135 int yr, mon, day; 10136 int hr, min, sec; 10137 10138 A = (int)((JD - 1867216.25)/36524.25); 10139 A = (int)(JD + 1 + A - (A/4)); 10140 B = A + 1524; 10141 C = (int)((B - 122.1)/365.25); 10142 D = (36525*(C&32767))/100; 10143 E = (int)((B-D)/30.6001); 10144 10145 day = B - D - (int)(30.6001*E); 10146 mon = (E<14 ? E-1 : E-13); 10147 yr = mon>2 ? C-4716 : C-4715; 10148 10149 hr = (mUnixTime % (24*60*60)) / (60*60); 10150 min = (mUnixTime % (60*60)) / 60; 10151 sec = (mUnixTime % 60); 10152 10153 if( yr>=1980 ){ 10154 pCds->mDate = (u16)(day + (mon << 5) + ((yr-1980) << 9)); 10155 pCds->mTime = (u16)(sec/2 + (min<<5) + (hr<<11)); 10156 }else{ 10157 pCds->mDate = pCds->mTime = 0; 10158 } 10159 10160 assert( mUnixTime<315507600 10161 || mUnixTime==zipfileMtime(pCds) 10162 || ((mUnixTime % 2) && mUnixTime-1==zipfileMtime(pCds)) 10163 /* || (mUnixTime % 2) */ 10164 ); 10165 } 10166 10167 /* 10168 ** If aBlob is not NULL, then it is a pointer to a buffer (nBlob bytes in 10169 ** size) containing an entire zip archive image. Or, if aBlob is NULL, 10170 ** then pFile is a file-handle open on a zip file. In either case, this 10171 ** function creates a ZipfileEntry object based on the zip archive entry 10172 ** for which the CDS record is at offset iOff. 10173 ** 10174 ** If successful, SQLITE_OK is returned and (*ppEntry) set to point to 10175 ** the new object. Otherwise, an SQLite error code is returned and the 10176 ** final value of (*ppEntry) undefined. 10177 */ 10178 static int zipfileGetEntry( 10179 ZipfileTab *pTab, /* Store any error message here */ 10180 const u8 *aBlob, /* Pointer to in-memory file image */ 10181 int nBlob, /* Size of aBlob[] in bytes */ 10182 FILE *pFile, /* If aBlob==0, read from this file */ 10183 i64 iOff, /* Offset of CDS record */ 10184 ZipfileEntry **ppEntry /* OUT: Pointer to new object */ 10185 ){ 10186 u8 *aRead; 10187 char **pzErr = &pTab->base.zErrMsg; 10188 int rc = SQLITE_OK; 10189 (void)nBlob; 10190 10191 if( aBlob==0 ){ 10192 aRead = pTab->aBuffer; 10193 rc = zipfileReadData(pFile, aRead, ZIPFILE_CDS_FIXED_SZ, iOff, pzErr); 10194 }else{ 10195 aRead = (u8*)&aBlob[iOff]; 10196 } 10197 10198 if( rc==SQLITE_OK ){ 10199 sqlite3_int64 nAlloc; 10200 ZipfileEntry *pNew; 10201 10202 int nFile = zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF]); 10203 int nExtra = zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF+2]); 10204 nExtra += zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF+4]); 10205 10206 nAlloc = sizeof(ZipfileEntry) + nExtra; 10207 if( aBlob ){ 10208 nAlloc += zipfileGetU32(&aRead[ZIPFILE_CDS_SZCOMPRESSED_OFF]); 10209 } 10210 10211 pNew = (ZipfileEntry*)sqlite3_malloc64(nAlloc); 10212 if( pNew==0 ){ 10213 rc = SQLITE_NOMEM; 10214 }else{ 10215 memset(pNew, 0, sizeof(ZipfileEntry)); 10216 rc = zipfileReadCDS(aRead, &pNew->cds); 10217 if( rc!=SQLITE_OK ){ 10218 *pzErr = sqlite3_mprintf("failed to read CDS at offset %lld", iOff); 10219 }else if( aBlob==0 ){ 10220 rc = zipfileReadData( 10221 pFile, aRead, nExtra+nFile, iOff+ZIPFILE_CDS_FIXED_SZ, pzErr 10222 ); 10223 }else{ 10224 aRead = (u8*)&aBlob[iOff + ZIPFILE_CDS_FIXED_SZ]; 10225 } 10226 } 10227 10228 if( rc==SQLITE_OK ){ 10229 u32 *pt = &pNew->mUnixTime; 10230 pNew->cds.zFile = sqlite3_mprintf("%.*s", nFile, aRead); 10231 pNew->aExtra = (u8*)&pNew[1]; 10232 memcpy(pNew->aExtra, &aRead[nFile], nExtra); 10233 if( pNew->cds.zFile==0 ){ 10234 rc = SQLITE_NOMEM; 10235 }else if( 0==zipfileScanExtra(&aRead[nFile], pNew->cds.nExtra, pt) ){ 10236 pNew->mUnixTime = zipfileMtime(&pNew->cds); 10237 } 10238 } 10239 10240 if( rc==SQLITE_OK ){ 10241 static const int szFix = ZIPFILE_LFH_FIXED_SZ; 10242 ZipfileLFH lfh; 10243 if( pFile ){ 10244 rc = zipfileReadData(pFile, aRead, szFix, pNew->cds.iOffset, pzErr); 10245 }else{ 10246 aRead = (u8*)&aBlob[pNew->cds.iOffset]; 10247 } 10248 10249 if( rc==SQLITE_OK ) rc = zipfileReadLFH(aRead, &lfh); 10250 if( rc==SQLITE_OK ){ 10251 pNew->iDataOff = pNew->cds.iOffset + ZIPFILE_LFH_FIXED_SZ; 10252 pNew->iDataOff += lfh.nFile + lfh.nExtra; 10253 if( aBlob && pNew->cds.szCompressed ){ 10254 pNew->aData = &pNew->aExtra[nExtra]; 10255 memcpy(pNew->aData, &aBlob[pNew->iDataOff], pNew->cds.szCompressed); 10256 } 10257 }else{ 10258 *pzErr = sqlite3_mprintf("failed to read LFH at offset %d", 10259 (int)pNew->cds.iOffset 10260 ); 10261 } 10262 } 10263 10264 if( rc!=SQLITE_OK ){ 10265 zipfileEntryFree(pNew); 10266 }else{ 10267 *ppEntry = pNew; 10268 } 10269 } 10270 10271 return rc; 10272 } 10273 10274 /* 10275 ** Advance an ZipfileCsr to its next row of output. 10276 */ 10277 static int zipfileNext(sqlite3_vtab_cursor *cur){ 10278 ZipfileCsr *pCsr = (ZipfileCsr*)cur; 10279 int rc = SQLITE_OK; 10280 10281 if( pCsr->pFile ){ 10282 i64 iEof = pCsr->eocd.iOffset + pCsr->eocd.nSize; 10283 zipfileEntryFree(pCsr->pCurrent); 10284 pCsr->pCurrent = 0; 10285 if( pCsr->iNextOff>=iEof ){ 10286 pCsr->bEof = 1; 10287 }else{ 10288 ZipfileEntry *p = 0; 10289 ZipfileTab *pTab = (ZipfileTab*)(cur->pVtab); 10290 rc = zipfileGetEntry(pTab, 0, 0, pCsr->pFile, pCsr->iNextOff, &p); 10291 if( rc==SQLITE_OK ){ 10292 pCsr->iNextOff += ZIPFILE_CDS_FIXED_SZ; 10293 pCsr->iNextOff += (int)p->cds.nExtra + p->cds.nFile + p->cds.nComment; 10294 } 10295 pCsr->pCurrent = p; 10296 } 10297 }else{ 10298 if( !pCsr->bNoop ){ 10299 pCsr->pCurrent = pCsr->pCurrent->pNext; 10300 } 10301 if( pCsr->pCurrent==0 ){ 10302 pCsr->bEof = 1; 10303 } 10304 } 10305 10306 pCsr->bNoop = 0; 10307 return rc; 10308 } 10309 10310 static void zipfileFree(void *p) { 10311 sqlite3_free(p); 10312 } 10313 10314 /* 10315 ** Buffer aIn (size nIn bytes) contains compressed data. Uncompressed, the 10316 ** size is nOut bytes. This function uncompresses the data and sets the 10317 ** return value in context pCtx to the result (a blob). 10318 ** 10319 ** If an error occurs, an error code is left in pCtx instead. 10320 */ 10321 static void zipfileInflate( 10322 sqlite3_context *pCtx, /* Store result here */ 10323 const u8 *aIn, /* Compressed data */ 10324 int nIn, /* Size of buffer aIn[] in bytes */ 10325 int nOut /* Expected output size */ 10326 ){ 10327 u8 *aRes = sqlite3_malloc(nOut); 10328 if( aRes==0 ){ 10329 sqlite3_result_error_nomem(pCtx); 10330 }else{ 10331 int err; 10332 z_stream str; 10333 memset(&str, 0, sizeof(str)); 10334 10335 str.next_in = (Byte*)aIn; 10336 str.avail_in = nIn; 10337 str.next_out = (Byte*)aRes; 10338 str.avail_out = nOut; 10339 10340 err = inflateInit2(&str, -15); 10341 if( err!=Z_OK ){ 10342 zipfileCtxErrorMsg(pCtx, "inflateInit2() failed (%d)", err); 10343 }else{ 10344 err = inflate(&str, Z_NO_FLUSH); 10345 if( err!=Z_STREAM_END ){ 10346 zipfileCtxErrorMsg(pCtx, "inflate() failed (%d)", err); 10347 }else{ 10348 sqlite3_result_blob(pCtx, aRes, nOut, zipfileFree); 10349 aRes = 0; 10350 } 10351 } 10352 sqlite3_free(aRes); 10353 inflateEnd(&str); 10354 } 10355 } 10356 10357 /* 10358 ** Buffer aIn (size nIn bytes) contains uncompressed data. This function 10359 ** compresses it and sets (*ppOut) to point to a buffer containing the 10360 ** compressed data. The caller is responsible for eventually calling 10361 ** sqlite3_free() to release buffer (*ppOut). Before returning, (*pnOut) 10362 ** is set to the size of buffer (*ppOut) in bytes. 10363 ** 10364 ** If no error occurs, SQLITE_OK is returned. Otherwise, an SQLite error 10365 ** code is returned and an error message left in virtual-table handle 10366 ** pTab. The values of (*ppOut) and (*pnOut) are left unchanged in this 10367 ** case. 10368 */ 10369 static int zipfileDeflate( 10370 const u8 *aIn, int nIn, /* Input */ 10371 u8 **ppOut, int *pnOut, /* Output */ 10372 char **pzErr /* OUT: Error message */ 10373 ){ 10374 int rc = SQLITE_OK; 10375 sqlite3_int64 nAlloc; 10376 z_stream str; 10377 u8 *aOut; 10378 10379 memset(&str, 0, sizeof(str)); 10380 str.next_in = (Bytef*)aIn; 10381 str.avail_in = nIn; 10382 deflateInit2(&str, 9, Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY); 10383 10384 nAlloc = deflateBound(&str, nIn); 10385 aOut = (u8*)sqlite3_malloc64(nAlloc); 10386 if( aOut==0 ){ 10387 rc = SQLITE_NOMEM; 10388 }else{ 10389 int res; 10390 str.next_out = aOut; 10391 str.avail_out = nAlloc; 10392 res = deflate(&str, Z_FINISH); 10393 if( res==Z_STREAM_END ){ 10394 *ppOut = aOut; 10395 *pnOut = (int)str.total_out; 10396 }else{ 10397 sqlite3_free(aOut); 10398 *pzErr = sqlite3_mprintf("zipfile: deflate() error"); 10399 rc = SQLITE_ERROR; 10400 } 10401 deflateEnd(&str); 10402 } 10403 10404 return rc; 10405 } 10406 10407 10408 /* 10409 ** Return values of columns for the row at which the series_cursor 10410 ** is currently pointing. 10411 */ 10412 static int zipfileColumn( 10413 sqlite3_vtab_cursor *cur, /* The cursor */ 10414 sqlite3_context *ctx, /* First argument to sqlite3_result_...() */ 10415 int i /* Which column to return */ 10416 ){ 10417 ZipfileCsr *pCsr = (ZipfileCsr*)cur; 10418 ZipfileCDS *pCDS = &pCsr->pCurrent->cds; 10419 int rc = SQLITE_OK; 10420 switch( i ){ 10421 case 0: /* name */ 10422 sqlite3_result_text(ctx, pCDS->zFile, -1, SQLITE_TRANSIENT); 10423 break; 10424 case 1: /* mode */ 10425 /* TODO: Whether or not the following is correct surely depends on 10426 ** the platform on which the archive was created. */ 10427 sqlite3_result_int(ctx, pCDS->iExternalAttr >> 16); 10428 break; 10429 case 2: { /* mtime */ 10430 sqlite3_result_int64(ctx, pCsr->pCurrent->mUnixTime); 10431 break; 10432 } 10433 case 3: { /* sz */ 10434 if( sqlite3_vtab_nochange(ctx)==0 ){ 10435 sqlite3_result_int64(ctx, pCDS->szUncompressed); 10436 } 10437 break; 10438 } 10439 case 4: /* rawdata */ 10440 if( sqlite3_vtab_nochange(ctx) ) break; 10441 case 5: { /* data */ 10442 if( i==4 || pCDS->iCompression==0 || pCDS->iCompression==8 ){ 10443 int sz = pCDS->szCompressed; 10444 int szFinal = pCDS->szUncompressed; 10445 if( szFinal>0 ){ 10446 u8 *aBuf; 10447 u8 *aFree = 0; 10448 if( pCsr->pCurrent->aData ){ 10449 aBuf = pCsr->pCurrent->aData; 10450 }else{ 10451 aBuf = aFree = sqlite3_malloc64(sz); 10452 if( aBuf==0 ){ 10453 rc = SQLITE_NOMEM; 10454 }else{ 10455 FILE *pFile = pCsr->pFile; 10456 if( pFile==0 ){ 10457 pFile = ((ZipfileTab*)(pCsr->base.pVtab))->pWriteFd; 10458 } 10459 rc = zipfileReadData(pFile, aBuf, sz, pCsr->pCurrent->iDataOff, 10460 &pCsr->base.pVtab->zErrMsg 10461 ); 10462 } 10463 } 10464 if( rc==SQLITE_OK ){ 10465 if( i==5 && pCDS->iCompression ){ 10466 zipfileInflate(ctx, aBuf, sz, szFinal); 10467 }else{ 10468 sqlite3_result_blob(ctx, aBuf, sz, SQLITE_TRANSIENT); 10469 } 10470 } 10471 sqlite3_free(aFree); 10472 }else{ 10473 /* Figure out if this is a directory or a zero-sized file. Consider 10474 ** it to be a directory either if the mode suggests so, or if 10475 ** the final character in the name is '/'. */ 10476 u32 mode = pCDS->iExternalAttr >> 16; 10477 if( !(mode & S_IFDIR) 10478 && pCDS->nFile>=1 10479 && pCDS->zFile[pCDS->nFile-1]!='/' 10480 ){ 10481 sqlite3_result_blob(ctx, "", 0, SQLITE_STATIC); 10482 } 10483 } 10484 } 10485 break; 10486 } 10487 case 6: /* method */ 10488 sqlite3_result_int(ctx, pCDS->iCompression); 10489 break; 10490 default: /* z */ 10491 assert( i==7 ); 10492 sqlite3_result_int64(ctx, pCsr->iId); 10493 break; 10494 } 10495 10496 return rc; 10497 } 10498 10499 /* 10500 ** Return TRUE if the cursor is at EOF. 10501 */ 10502 static int zipfileEof(sqlite3_vtab_cursor *cur){ 10503 ZipfileCsr *pCsr = (ZipfileCsr*)cur; 10504 return pCsr->bEof; 10505 } 10506 10507 /* 10508 ** If aBlob is not NULL, then it points to a buffer nBlob bytes in size 10509 ** containing an entire zip archive image. Or, if aBlob is NULL, then pFile 10510 ** is guaranteed to be a file-handle open on a zip file. 10511 ** 10512 ** This function attempts to locate the EOCD record within the zip archive 10513 ** and populate *pEOCD with the results of decoding it. SQLITE_OK is 10514 ** returned if successful. Otherwise, an SQLite error code is returned and 10515 ** an English language error message may be left in virtual-table pTab. 10516 */ 10517 static int zipfileReadEOCD( 10518 ZipfileTab *pTab, /* Return errors here */ 10519 const u8 *aBlob, /* Pointer to in-memory file image */ 10520 int nBlob, /* Size of aBlob[] in bytes */ 10521 FILE *pFile, /* Read from this file if aBlob==0 */ 10522 ZipfileEOCD *pEOCD /* Object to populate */ 10523 ){ 10524 u8 *aRead = pTab->aBuffer; /* Temporary buffer */ 10525 int nRead; /* Bytes to read from file */ 10526 int rc = SQLITE_OK; 10527 10528 memset(pEOCD, 0, sizeof(ZipfileEOCD)); 10529 if( aBlob==0 ){ 10530 i64 iOff; /* Offset to read from */ 10531 i64 szFile; /* Total size of file in bytes */ 10532 fseek(pFile, 0, SEEK_END); 10533 szFile = (i64)ftell(pFile); 10534 if( szFile==0 ){ 10535 return SQLITE_OK; 10536 } 10537 nRead = (int)(MIN(szFile, ZIPFILE_BUFFER_SIZE)); 10538 iOff = szFile - nRead; 10539 rc = zipfileReadData(pFile, aRead, nRead, iOff, &pTab->base.zErrMsg); 10540 }else{ 10541 nRead = (int)(MIN(nBlob, ZIPFILE_BUFFER_SIZE)); 10542 aRead = (u8*)&aBlob[nBlob-nRead]; 10543 } 10544 10545 if( rc==SQLITE_OK ){ 10546 int i; 10547 10548 /* Scan backwards looking for the signature bytes */ 10549 for(i=nRead-20; i>=0; i--){ 10550 if( aRead[i]==0x50 && aRead[i+1]==0x4b 10551 && aRead[i+2]==0x05 && aRead[i+3]==0x06 10552 ){ 10553 break; 10554 } 10555 } 10556 if( i<0 ){ 10557 pTab->base.zErrMsg = sqlite3_mprintf( 10558 "cannot find end of central directory record" 10559 ); 10560 return SQLITE_ERROR; 10561 } 10562 10563 aRead += i+4; 10564 pEOCD->iDisk = zipfileRead16(aRead); 10565 pEOCD->iFirstDisk = zipfileRead16(aRead); 10566 pEOCD->nEntry = zipfileRead16(aRead); 10567 pEOCD->nEntryTotal = zipfileRead16(aRead); 10568 pEOCD->nSize = zipfileRead32(aRead); 10569 pEOCD->iOffset = zipfileRead32(aRead); 10570 } 10571 10572 return rc; 10573 } 10574 10575 /* 10576 ** Add object pNew to the linked list that begins at ZipfileTab.pFirstEntry 10577 ** and ends with pLastEntry. If argument pBefore is NULL, then pNew is added 10578 ** to the end of the list. Otherwise, it is added to the list immediately 10579 ** before pBefore (which is guaranteed to be a part of said list). 10580 */ 10581 static void zipfileAddEntry( 10582 ZipfileTab *pTab, 10583 ZipfileEntry *pBefore, 10584 ZipfileEntry *pNew 10585 ){ 10586 assert( (pTab->pFirstEntry==0)==(pTab->pLastEntry==0) ); 10587 assert( pNew->pNext==0 ); 10588 if( pBefore==0 ){ 10589 if( pTab->pFirstEntry==0 ){ 10590 pTab->pFirstEntry = pTab->pLastEntry = pNew; 10591 }else{ 10592 assert( pTab->pLastEntry->pNext==0 ); 10593 pTab->pLastEntry->pNext = pNew; 10594 pTab->pLastEntry = pNew; 10595 } 10596 }else{ 10597 ZipfileEntry **pp; 10598 for(pp=&pTab->pFirstEntry; *pp!=pBefore; pp=&((*pp)->pNext)); 10599 pNew->pNext = pBefore; 10600 *pp = pNew; 10601 } 10602 } 10603 10604 static int zipfileLoadDirectory(ZipfileTab *pTab, const u8 *aBlob, int nBlob){ 10605 ZipfileEOCD eocd; 10606 int rc; 10607 int i; 10608 i64 iOff; 10609 10610 rc = zipfileReadEOCD(pTab, aBlob, nBlob, pTab->pWriteFd, &eocd); 10611 iOff = eocd.iOffset; 10612 for(i=0; rc==SQLITE_OK && i<eocd.nEntry; i++){ 10613 ZipfileEntry *pNew = 0; 10614 rc = zipfileGetEntry(pTab, aBlob, nBlob, pTab->pWriteFd, iOff, &pNew); 10615 10616 if( rc==SQLITE_OK ){ 10617 zipfileAddEntry(pTab, 0, pNew); 10618 iOff += ZIPFILE_CDS_FIXED_SZ; 10619 iOff += (int)pNew->cds.nExtra + pNew->cds.nFile + pNew->cds.nComment; 10620 } 10621 } 10622 return rc; 10623 } 10624 10625 /* 10626 ** xFilter callback. 10627 */ 10628 static int zipfileFilter( 10629 sqlite3_vtab_cursor *cur, 10630 int idxNum, const char *idxStr, 10631 int argc, sqlite3_value **argv 10632 ){ 10633 ZipfileTab *pTab = (ZipfileTab*)cur->pVtab; 10634 ZipfileCsr *pCsr = (ZipfileCsr*)cur; 10635 const char *zFile = 0; /* Zip file to scan */ 10636 int rc = SQLITE_OK; /* Return Code */ 10637 int bInMemory = 0; /* True for an in-memory zipfile */ 10638 10639 (void)idxStr; 10640 (void)argc; 10641 10642 zipfileResetCursor(pCsr); 10643 10644 if( pTab->zFile ){ 10645 zFile = pTab->zFile; 10646 }else if( idxNum==0 ){ 10647 zipfileCursorErr(pCsr, "zipfile() function requires an argument"); 10648 return SQLITE_ERROR; 10649 }else if( sqlite3_value_type(argv[0])==SQLITE_BLOB ){ 10650 static const u8 aEmptyBlob = 0; 10651 const u8 *aBlob = (const u8*)sqlite3_value_blob(argv[0]); 10652 int nBlob = sqlite3_value_bytes(argv[0]); 10653 assert( pTab->pFirstEntry==0 ); 10654 if( aBlob==0 ){ 10655 aBlob = &aEmptyBlob; 10656 nBlob = 0; 10657 } 10658 rc = zipfileLoadDirectory(pTab, aBlob, nBlob); 10659 pCsr->pFreeEntry = pTab->pFirstEntry; 10660 pTab->pFirstEntry = pTab->pLastEntry = 0; 10661 if( rc!=SQLITE_OK ) return rc; 10662 bInMemory = 1; 10663 }else{ 10664 zFile = (const char*)sqlite3_value_text(argv[0]); 10665 } 10666 10667 if( 0==pTab->pWriteFd && 0==bInMemory ){ 10668 pCsr->pFile = zFile ? fopen(zFile, "rb") : 0; 10669 if( pCsr->pFile==0 ){ 10670 zipfileCursorErr(pCsr, "cannot open file: %s", zFile); 10671 rc = SQLITE_ERROR; 10672 }else{ 10673 rc = zipfileReadEOCD(pTab, 0, 0, pCsr->pFile, &pCsr->eocd); 10674 if( rc==SQLITE_OK ){ 10675 if( pCsr->eocd.nEntry==0 ){ 10676 pCsr->bEof = 1; 10677 }else{ 10678 pCsr->iNextOff = pCsr->eocd.iOffset; 10679 rc = zipfileNext(cur); 10680 } 10681 } 10682 } 10683 }else{ 10684 pCsr->bNoop = 1; 10685 pCsr->pCurrent = pCsr->pFreeEntry ? pCsr->pFreeEntry : pTab->pFirstEntry; 10686 rc = zipfileNext(cur); 10687 } 10688 10689 return rc; 10690 } 10691 10692 /* 10693 ** xBestIndex callback. 10694 */ 10695 static int zipfileBestIndex( 10696 sqlite3_vtab *tab, 10697 sqlite3_index_info *pIdxInfo 10698 ){ 10699 int i; 10700 int idx = -1; 10701 int unusable = 0; 10702 (void)tab; 10703 10704 for(i=0; i<pIdxInfo->nConstraint; i++){ 10705 const struct sqlite3_index_constraint *pCons = &pIdxInfo->aConstraint[i]; 10706 if( pCons->iColumn!=ZIPFILE_F_COLUMN_IDX ) continue; 10707 if( pCons->usable==0 ){ 10708 unusable = 1; 10709 }else if( pCons->op==SQLITE_INDEX_CONSTRAINT_EQ ){ 10710 idx = i; 10711 } 10712 } 10713 pIdxInfo->estimatedCost = 1000.0; 10714 if( idx>=0 ){ 10715 pIdxInfo->aConstraintUsage[idx].argvIndex = 1; 10716 pIdxInfo->aConstraintUsage[idx].omit = 1; 10717 pIdxInfo->idxNum = 1; 10718 }else if( unusable ){ 10719 return SQLITE_CONSTRAINT; 10720 } 10721 return SQLITE_OK; 10722 } 10723 10724 static ZipfileEntry *zipfileNewEntry(const char *zPath){ 10725 ZipfileEntry *pNew; 10726 pNew = sqlite3_malloc(sizeof(ZipfileEntry)); 10727 if( pNew ){ 10728 memset(pNew, 0, sizeof(ZipfileEntry)); 10729 pNew->cds.zFile = sqlite3_mprintf("%s", zPath); 10730 if( pNew->cds.zFile==0 ){ 10731 sqlite3_free(pNew); 10732 pNew = 0; 10733 } 10734 } 10735 return pNew; 10736 } 10737 10738 static int zipfileSerializeLFH(ZipfileEntry *pEntry, u8 *aBuf){ 10739 ZipfileCDS *pCds = &pEntry->cds; 10740 u8 *a = aBuf; 10741 10742 pCds->nExtra = 9; 10743 10744 /* Write the LFH itself */ 10745 zipfileWrite32(a, ZIPFILE_SIGNATURE_LFH); 10746 zipfileWrite16(a, pCds->iVersionExtract); 10747 zipfileWrite16(a, pCds->flags); 10748 zipfileWrite16(a, pCds->iCompression); 10749 zipfileWrite16(a, pCds->mTime); 10750 zipfileWrite16(a, pCds->mDate); 10751 zipfileWrite32(a, pCds->crc32); 10752 zipfileWrite32(a, pCds->szCompressed); 10753 zipfileWrite32(a, pCds->szUncompressed); 10754 zipfileWrite16(a, (u16)pCds->nFile); 10755 zipfileWrite16(a, pCds->nExtra); 10756 assert( a==&aBuf[ZIPFILE_LFH_FIXED_SZ] ); 10757 10758 /* Add the file name */ 10759 memcpy(a, pCds->zFile, (int)pCds->nFile); 10760 a += (int)pCds->nFile; 10761 10762 /* The "extra" data */ 10763 zipfileWrite16(a, ZIPFILE_EXTRA_TIMESTAMP); 10764 zipfileWrite16(a, 5); 10765 *a++ = 0x01; 10766 zipfileWrite32(a, pEntry->mUnixTime); 10767 10768 return a-aBuf; 10769 } 10770 10771 static int zipfileAppendEntry( 10772 ZipfileTab *pTab, 10773 ZipfileEntry *pEntry, 10774 const u8 *pData, 10775 int nData 10776 ){ 10777 u8 *aBuf = pTab->aBuffer; 10778 int nBuf; 10779 int rc; 10780 10781 nBuf = zipfileSerializeLFH(pEntry, aBuf); 10782 rc = zipfileAppendData(pTab, aBuf, nBuf); 10783 if( rc==SQLITE_OK ){ 10784 pEntry->iDataOff = pTab->szCurrent; 10785 rc = zipfileAppendData(pTab, pData, nData); 10786 } 10787 10788 return rc; 10789 } 10790 10791 static int zipfileGetMode( 10792 sqlite3_value *pVal, 10793 int bIsDir, /* If true, default to directory */ 10794 u32 *pMode, /* OUT: Mode value */ 10795 char **pzErr /* OUT: Error message */ 10796 ){ 10797 const char *z = (const char*)sqlite3_value_text(pVal); 10798 u32 mode = 0; 10799 if( z==0 ){ 10800 mode = (bIsDir ? (S_IFDIR + 0755) : (S_IFREG + 0644)); 10801 }else if( z[0]>='0' && z[0]<='9' ){ 10802 mode = (unsigned int)sqlite3_value_int(pVal); 10803 }else{ 10804 const char zTemplate[11] = "-rwxrwxrwx"; 10805 int i; 10806 if( strlen(z)!=10 ) goto parse_error; 10807 switch( z[0] ){ 10808 case '-': mode |= S_IFREG; break; 10809 case 'd': mode |= S_IFDIR; break; 10810 case 'l': mode |= S_IFLNK; break; 10811 default: goto parse_error; 10812 } 10813 for(i=1; i<10; i++){ 10814 if( z[i]==zTemplate[i] ) mode |= 1 << (9-i); 10815 else if( z[i]!='-' ) goto parse_error; 10816 } 10817 } 10818 if( ((mode & S_IFDIR)==0)==bIsDir ){ 10819 /* The "mode" attribute is a directory, but data has been specified. 10820 ** Or vice-versa - no data but "mode" is a file or symlink. */ 10821 *pzErr = sqlite3_mprintf("zipfile: mode does not match data"); 10822 return SQLITE_CONSTRAINT; 10823 } 10824 *pMode = mode; 10825 return SQLITE_OK; 10826 10827 parse_error: 10828 *pzErr = sqlite3_mprintf("zipfile: parse error in mode: %s", z); 10829 return SQLITE_ERROR; 10830 } 10831 10832 /* 10833 ** Both (const char*) arguments point to nul-terminated strings. Argument 10834 ** nB is the value of strlen(zB). This function returns 0 if the strings are 10835 ** identical, ignoring any trailing '/' character in either path. */ 10836 static int zipfileComparePath(const char *zA, const char *zB, int nB){ 10837 int nA = (int)strlen(zA); 10838 if( nA>0 && zA[nA-1]=='/' ) nA--; 10839 if( nB>0 && zB[nB-1]=='/' ) nB--; 10840 if( nA==nB && memcmp(zA, zB, nA)==0 ) return 0; 10841 return 1; 10842 } 10843 10844 static int zipfileBegin(sqlite3_vtab *pVtab){ 10845 ZipfileTab *pTab = (ZipfileTab*)pVtab; 10846 int rc = SQLITE_OK; 10847 10848 assert( pTab->pWriteFd==0 ); 10849 if( pTab->zFile==0 || pTab->zFile[0]==0 ){ 10850 pTab->base.zErrMsg = sqlite3_mprintf("zipfile: missing filename"); 10851 return SQLITE_ERROR; 10852 } 10853 10854 /* Open a write fd on the file. Also load the entire central directory 10855 ** structure into memory. During the transaction any new file data is 10856 ** appended to the archive file, but the central directory is accumulated 10857 ** in main-memory until the transaction is committed. */ 10858 pTab->pWriteFd = fopen(pTab->zFile, "ab+"); 10859 if( pTab->pWriteFd==0 ){ 10860 pTab->base.zErrMsg = sqlite3_mprintf( 10861 "zipfile: failed to open file %s for writing", pTab->zFile 10862 ); 10863 rc = SQLITE_ERROR; 10864 }else{ 10865 fseek(pTab->pWriteFd, 0, SEEK_END); 10866 pTab->szCurrent = pTab->szOrig = (i64)ftell(pTab->pWriteFd); 10867 rc = zipfileLoadDirectory(pTab, 0, 0); 10868 } 10869 10870 if( rc!=SQLITE_OK ){ 10871 zipfileCleanupTransaction(pTab); 10872 } 10873 10874 return rc; 10875 } 10876 10877 /* 10878 ** Return the current time as a 32-bit timestamp in UNIX epoch format (like 10879 ** time(2)). 10880 */ 10881 static u32 zipfileTime(void){ 10882 sqlite3_vfs *pVfs = sqlite3_vfs_find(0); 10883 u32 ret; 10884 if( pVfs==0 ) return 0; 10885 if( pVfs->iVersion>=2 && pVfs->xCurrentTimeInt64 ){ 10886 i64 ms; 10887 pVfs->xCurrentTimeInt64(pVfs, &ms); 10888 ret = (u32)((ms/1000) - ((i64)24405875 * 8640)); 10889 }else{ 10890 double day; 10891 pVfs->xCurrentTime(pVfs, &day); 10892 ret = (u32)((day - 2440587.5) * 86400); 10893 } 10894 return ret; 10895 } 10896 10897 /* 10898 ** Return a 32-bit timestamp in UNIX epoch format. 10899 ** 10900 ** If the value passed as the only argument is either NULL or an SQL NULL, 10901 ** return the current time. Otherwise, return the value stored in (*pVal) 10902 ** cast to a 32-bit unsigned integer. 10903 */ 10904 static u32 zipfileGetTime(sqlite3_value *pVal){ 10905 if( pVal==0 || sqlite3_value_type(pVal)==SQLITE_NULL ){ 10906 return zipfileTime(); 10907 } 10908 return (u32)sqlite3_value_int64(pVal); 10909 } 10910 10911 /* 10912 ** Unless it is NULL, entry pOld is currently part of the pTab->pFirstEntry 10913 ** linked list. Remove it from the list and free the object. 10914 */ 10915 static void zipfileRemoveEntryFromList(ZipfileTab *pTab, ZipfileEntry *pOld){ 10916 if( pOld ){ 10917 if( pTab->pFirstEntry==pOld ){ 10918 pTab->pFirstEntry = pOld->pNext; 10919 if( pTab->pLastEntry==pOld ) pTab->pLastEntry = 0; 10920 }else{ 10921 ZipfileEntry *p; 10922 for(p=pTab->pFirstEntry; p; p=p->pNext){ 10923 if( p->pNext==pOld ){ 10924 p->pNext = pOld->pNext; 10925 if( pTab->pLastEntry==pOld ) pTab->pLastEntry = p; 10926 break; 10927 } 10928 } 10929 } 10930 zipfileEntryFree(pOld); 10931 } 10932 } 10933 10934 /* 10935 ** xUpdate method. 10936 */ 10937 static int zipfileUpdate( 10938 sqlite3_vtab *pVtab, 10939 int nVal, 10940 sqlite3_value **apVal, 10941 sqlite_int64 *pRowid 10942 ){ 10943 ZipfileTab *pTab = (ZipfileTab*)pVtab; 10944 int rc = SQLITE_OK; /* Return Code */ 10945 ZipfileEntry *pNew = 0; /* New in-memory CDS entry */ 10946 10947 u32 mode = 0; /* Mode for new entry */ 10948 u32 mTime = 0; /* Modification time for new entry */ 10949 i64 sz = 0; /* Uncompressed size */ 10950 const char *zPath = 0; /* Path for new entry */ 10951 int nPath = 0; /* strlen(zPath) */ 10952 const u8 *pData = 0; /* Pointer to buffer containing content */ 10953 int nData = 0; /* Size of pData buffer in bytes */ 10954 int iMethod = 0; /* Compression method for new entry */ 10955 u8 *pFree = 0; /* Free this */ 10956 char *zFree = 0; /* Also free this */ 10957 ZipfileEntry *pOld = 0; 10958 ZipfileEntry *pOld2 = 0; 10959 int bUpdate = 0; /* True for an update that modifies "name" */ 10960 int bIsDir = 0; 10961 u32 iCrc32 = 0; 10962 10963 (void)pRowid; 10964 10965 if( pTab->pWriteFd==0 ){ 10966 rc = zipfileBegin(pVtab); 10967 if( rc!=SQLITE_OK ) return rc; 10968 } 10969 10970 /* If this is a DELETE or UPDATE, find the archive entry to delete. */ 10971 if( sqlite3_value_type(apVal[0])!=SQLITE_NULL ){ 10972 const char *zDelete = (const char*)sqlite3_value_text(apVal[0]); 10973 int nDelete = (int)strlen(zDelete); 10974 if( nVal>1 ){ 10975 const char *zUpdate = (const char*)sqlite3_value_text(apVal[1]); 10976 if( zUpdate && zipfileComparePath(zUpdate, zDelete, nDelete)!=0 ){ 10977 bUpdate = 1; 10978 } 10979 } 10980 for(pOld=pTab->pFirstEntry; 1; pOld=pOld->pNext){ 10981 if( zipfileComparePath(pOld->cds.zFile, zDelete, nDelete)==0 ){ 10982 break; 10983 } 10984 assert( pOld->pNext ); 10985 } 10986 } 10987 10988 if( nVal>1 ){ 10989 /* Check that "sz" and "rawdata" are both NULL: */ 10990 if( sqlite3_value_type(apVal[5])!=SQLITE_NULL ){ 10991 zipfileTableErr(pTab, "sz must be NULL"); 10992 rc = SQLITE_CONSTRAINT; 10993 } 10994 if( sqlite3_value_type(apVal[6])!=SQLITE_NULL ){ 10995 zipfileTableErr(pTab, "rawdata must be NULL"); 10996 rc = SQLITE_CONSTRAINT; 10997 } 10998 10999 if( rc==SQLITE_OK ){ 11000 if( sqlite3_value_type(apVal[7])==SQLITE_NULL ){ 11001 /* data=NULL. A directory */ 11002 bIsDir = 1; 11003 }else{ 11004 /* Value specified for "data", and possibly "method". This must be 11005 ** a regular file or a symlink. */ 11006 const u8 *aIn = sqlite3_value_blob(apVal[7]); 11007 int nIn = sqlite3_value_bytes(apVal[7]); 11008 int bAuto = sqlite3_value_type(apVal[8])==SQLITE_NULL; 11009 11010 iMethod = sqlite3_value_int(apVal[8]); 11011 sz = nIn; 11012 pData = aIn; 11013 nData = nIn; 11014 if( iMethod!=0 && iMethod!=8 ){ 11015 zipfileTableErr(pTab, "unknown compression method: %d", iMethod); 11016 rc = SQLITE_CONSTRAINT; 11017 }else{ 11018 if( bAuto || iMethod ){ 11019 int nCmp; 11020 rc = zipfileDeflate(aIn, nIn, &pFree, &nCmp, &pTab->base.zErrMsg); 11021 if( rc==SQLITE_OK ){ 11022 if( iMethod || nCmp<nIn ){ 11023 iMethod = 8; 11024 pData = pFree; 11025 nData = nCmp; 11026 } 11027 } 11028 } 11029 iCrc32 = crc32(0, aIn, nIn); 11030 } 11031 } 11032 } 11033 11034 if( rc==SQLITE_OK ){ 11035 rc = zipfileGetMode(apVal[3], bIsDir, &mode, &pTab->base.zErrMsg); 11036 } 11037 11038 if( rc==SQLITE_OK ){ 11039 zPath = (const char*)sqlite3_value_text(apVal[2]); 11040 if( zPath==0 ) zPath = ""; 11041 nPath = (int)strlen(zPath); 11042 mTime = zipfileGetTime(apVal[4]); 11043 } 11044 11045 if( rc==SQLITE_OK && bIsDir ){ 11046 /* For a directory, check that the last character in the path is a 11047 ** '/'. This appears to be required for compatibility with info-zip 11048 ** (the unzip command on unix). It does not create directories 11049 ** otherwise. */ 11050 if( nPath<=0 || zPath[nPath-1]!='/' ){ 11051 zFree = sqlite3_mprintf("%s/", zPath); 11052 zPath = (const char*)zFree; 11053 if( zFree==0 ){ 11054 rc = SQLITE_NOMEM; 11055 nPath = 0; 11056 }else{ 11057 nPath = (int)strlen(zPath); 11058 } 11059 } 11060 } 11061 11062 /* Check that we're not inserting a duplicate entry -OR- updating an 11063 ** entry with a path, thereby making it into a duplicate. */ 11064 if( (pOld==0 || bUpdate) && rc==SQLITE_OK ){ 11065 ZipfileEntry *p; 11066 for(p=pTab->pFirstEntry; p; p=p->pNext){ 11067 if( zipfileComparePath(p->cds.zFile, zPath, nPath)==0 ){ 11068 switch( sqlite3_vtab_on_conflict(pTab->db) ){ 11069 case SQLITE_IGNORE: { 11070 goto zipfile_update_done; 11071 } 11072 case SQLITE_REPLACE: { 11073 pOld2 = p; 11074 break; 11075 } 11076 default: { 11077 zipfileTableErr(pTab, "duplicate name: \"%s\"", zPath); 11078 rc = SQLITE_CONSTRAINT; 11079 break; 11080 } 11081 } 11082 break; 11083 } 11084 } 11085 } 11086 11087 if( rc==SQLITE_OK ){ 11088 /* Create the new CDS record. */ 11089 pNew = zipfileNewEntry(zPath); 11090 if( pNew==0 ){ 11091 rc = SQLITE_NOMEM; 11092 }else{ 11093 pNew->cds.iVersionMadeBy = ZIPFILE_NEWENTRY_MADEBY; 11094 pNew->cds.iVersionExtract = ZIPFILE_NEWENTRY_REQUIRED; 11095 pNew->cds.flags = ZIPFILE_NEWENTRY_FLAGS; 11096 pNew->cds.iCompression = (u16)iMethod; 11097 zipfileMtimeToDos(&pNew->cds, mTime); 11098 pNew->cds.crc32 = iCrc32; 11099 pNew->cds.szCompressed = nData; 11100 pNew->cds.szUncompressed = (u32)sz; 11101 pNew->cds.iExternalAttr = (mode<<16); 11102 pNew->cds.iOffset = (u32)pTab->szCurrent; 11103 pNew->cds.nFile = (u16)nPath; 11104 pNew->mUnixTime = (u32)mTime; 11105 rc = zipfileAppendEntry(pTab, pNew, pData, nData); 11106 zipfileAddEntry(pTab, pOld, pNew); 11107 } 11108 } 11109 } 11110 11111 if( rc==SQLITE_OK && (pOld || pOld2) ){ 11112 ZipfileCsr *pCsr; 11113 for(pCsr=pTab->pCsrList; pCsr; pCsr=pCsr->pCsrNext){ 11114 if( pCsr->pCurrent && (pCsr->pCurrent==pOld || pCsr->pCurrent==pOld2) ){ 11115 pCsr->pCurrent = pCsr->pCurrent->pNext; 11116 pCsr->bNoop = 1; 11117 } 11118 } 11119 11120 zipfileRemoveEntryFromList(pTab, pOld); 11121 zipfileRemoveEntryFromList(pTab, pOld2); 11122 } 11123 11124 zipfile_update_done: 11125 sqlite3_free(pFree); 11126 sqlite3_free(zFree); 11127 return rc; 11128 } 11129 11130 static int zipfileSerializeEOCD(ZipfileEOCD *p, u8 *aBuf){ 11131 u8 *a = aBuf; 11132 zipfileWrite32(a, ZIPFILE_SIGNATURE_EOCD); 11133 zipfileWrite16(a, p->iDisk); 11134 zipfileWrite16(a, p->iFirstDisk); 11135 zipfileWrite16(a, p->nEntry); 11136 zipfileWrite16(a, p->nEntryTotal); 11137 zipfileWrite32(a, p->nSize); 11138 zipfileWrite32(a, p->iOffset); 11139 zipfileWrite16(a, 0); /* Size of trailing comment in bytes*/ 11140 11141 return a-aBuf; 11142 } 11143 11144 static int zipfileAppendEOCD(ZipfileTab *pTab, ZipfileEOCD *p){ 11145 int nBuf = zipfileSerializeEOCD(p, pTab->aBuffer); 11146 assert( nBuf==ZIPFILE_EOCD_FIXED_SZ ); 11147 return zipfileAppendData(pTab, pTab->aBuffer, nBuf); 11148 } 11149 11150 /* 11151 ** Serialize the CDS structure into buffer aBuf[]. Return the number 11152 ** of bytes written. 11153 */ 11154 static int zipfileSerializeCDS(ZipfileEntry *pEntry, u8 *aBuf){ 11155 u8 *a = aBuf; 11156 ZipfileCDS *pCDS = &pEntry->cds; 11157 11158 if( pEntry->aExtra==0 ){ 11159 pCDS->nExtra = 9; 11160 } 11161 11162 zipfileWrite32(a, ZIPFILE_SIGNATURE_CDS); 11163 zipfileWrite16(a, pCDS->iVersionMadeBy); 11164 zipfileWrite16(a, pCDS->iVersionExtract); 11165 zipfileWrite16(a, pCDS->flags); 11166 zipfileWrite16(a, pCDS->iCompression); 11167 zipfileWrite16(a, pCDS->mTime); 11168 zipfileWrite16(a, pCDS->mDate); 11169 zipfileWrite32(a, pCDS->crc32); 11170 zipfileWrite32(a, pCDS->szCompressed); 11171 zipfileWrite32(a, pCDS->szUncompressed); 11172 assert( a==&aBuf[ZIPFILE_CDS_NFILE_OFF] ); 11173 zipfileWrite16(a, pCDS->nFile); 11174 zipfileWrite16(a, pCDS->nExtra); 11175 zipfileWrite16(a, pCDS->nComment); 11176 zipfileWrite16(a, pCDS->iDiskStart); 11177 zipfileWrite16(a, pCDS->iInternalAttr); 11178 zipfileWrite32(a, pCDS->iExternalAttr); 11179 zipfileWrite32(a, pCDS->iOffset); 11180 11181 memcpy(a, pCDS->zFile, pCDS->nFile); 11182 a += pCDS->nFile; 11183 11184 if( pEntry->aExtra ){ 11185 int n = (int)pCDS->nExtra + (int)pCDS->nComment; 11186 memcpy(a, pEntry->aExtra, n); 11187 a += n; 11188 }else{ 11189 assert( pCDS->nExtra==9 ); 11190 zipfileWrite16(a, ZIPFILE_EXTRA_TIMESTAMP); 11191 zipfileWrite16(a, 5); 11192 *a++ = 0x01; 11193 zipfileWrite32(a, pEntry->mUnixTime); 11194 } 11195 11196 return a-aBuf; 11197 } 11198 11199 static int zipfileCommit(sqlite3_vtab *pVtab){ 11200 ZipfileTab *pTab = (ZipfileTab*)pVtab; 11201 int rc = SQLITE_OK; 11202 if( pTab->pWriteFd ){ 11203 i64 iOffset = pTab->szCurrent; 11204 ZipfileEntry *p; 11205 ZipfileEOCD eocd; 11206 int nEntry = 0; 11207 11208 /* Write out all entries */ 11209 for(p=pTab->pFirstEntry; rc==SQLITE_OK && p; p=p->pNext){ 11210 int n = zipfileSerializeCDS(p, pTab->aBuffer); 11211 rc = zipfileAppendData(pTab, pTab->aBuffer, n); 11212 nEntry++; 11213 } 11214 11215 /* Write out the EOCD record */ 11216 eocd.iDisk = 0; 11217 eocd.iFirstDisk = 0; 11218 eocd.nEntry = (u16)nEntry; 11219 eocd.nEntryTotal = (u16)nEntry; 11220 eocd.nSize = (u32)(pTab->szCurrent - iOffset); 11221 eocd.iOffset = (u32)iOffset; 11222 rc = zipfileAppendEOCD(pTab, &eocd); 11223 11224 zipfileCleanupTransaction(pTab); 11225 } 11226 return rc; 11227 } 11228 11229 static int zipfileRollback(sqlite3_vtab *pVtab){ 11230 return zipfileCommit(pVtab); 11231 } 11232 11233 static ZipfileCsr *zipfileFindCursor(ZipfileTab *pTab, i64 iId){ 11234 ZipfileCsr *pCsr; 11235 for(pCsr=pTab->pCsrList; pCsr; pCsr=pCsr->pCsrNext){ 11236 if( iId==pCsr->iId ) break; 11237 } 11238 return pCsr; 11239 } 11240 11241 static void zipfileFunctionCds( 11242 sqlite3_context *context, 11243 int argc, 11244 sqlite3_value **argv 11245 ){ 11246 ZipfileCsr *pCsr; 11247 ZipfileTab *pTab = (ZipfileTab*)sqlite3_user_data(context); 11248 assert( argc>0 ); 11249 11250 pCsr = zipfileFindCursor(pTab, sqlite3_value_int64(argv[0])); 11251 if( pCsr ){ 11252 ZipfileCDS *p = &pCsr->pCurrent->cds; 11253 char *zRes = sqlite3_mprintf("{" 11254 "\"version-made-by\" : %u, " 11255 "\"version-to-extract\" : %u, " 11256 "\"flags\" : %u, " 11257 "\"compression\" : %u, " 11258 "\"time\" : %u, " 11259 "\"date\" : %u, " 11260 "\"crc32\" : %u, " 11261 "\"compressed-size\" : %u, " 11262 "\"uncompressed-size\" : %u, " 11263 "\"file-name-length\" : %u, " 11264 "\"extra-field-length\" : %u, " 11265 "\"file-comment-length\" : %u, " 11266 "\"disk-number-start\" : %u, " 11267 "\"internal-attr\" : %u, " 11268 "\"external-attr\" : %u, " 11269 "\"offset\" : %u }", 11270 (u32)p->iVersionMadeBy, (u32)p->iVersionExtract, 11271 (u32)p->flags, (u32)p->iCompression, 11272 (u32)p->mTime, (u32)p->mDate, 11273 (u32)p->crc32, (u32)p->szCompressed, 11274 (u32)p->szUncompressed, (u32)p->nFile, 11275 (u32)p->nExtra, (u32)p->nComment, 11276 (u32)p->iDiskStart, (u32)p->iInternalAttr, 11277 (u32)p->iExternalAttr, (u32)p->iOffset 11278 ); 11279 11280 if( zRes==0 ){ 11281 sqlite3_result_error_nomem(context); 11282 }else{ 11283 sqlite3_result_text(context, zRes, -1, SQLITE_TRANSIENT); 11284 sqlite3_free(zRes); 11285 } 11286 } 11287 } 11288 11289 /* 11290 ** xFindFunction method. 11291 */ 11292 static int zipfileFindFunction( 11293 sqlite3_vtab *pVtab, /* Virtual table handle */ 11294 int nArg, /* Number of SQL function arguments */ 11295 const char *zName, /* Name of SQL function */ 11296 void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), /* OUT: Result */ 11297 void **ppArg /* OUT: User data for *pxFunc */ 11298 ){ 11299 (void)nArg; 11300 if( sqlite3_stricmp("zipfile_cds", zName)==0 ){ 11301 *pxFunc = zipfileFunctionCds; 11302 *ppArg = (void*)pVtab; 11303 return 1; 11304 } 11305 return 0; 11306 } 11307 11308 typedef struct ZipfileBuffer ZipfileBuffer; 11309 struct ZipfileBuffer { 11310 u8 *a; /* Pointer to buffer */ 11311 int n; /* Size of buffer in bytes */ 11312 int nAlloc; /* Byte allocated at a[] */ 11313 }; 11314 11315 typedef struct ZipfileCtx ZipfileCtx; 11316 struct ZipfileCtx { 11317 int nEntry; 11318 ZipfileBuffer body; 11319 ZipfileBuffer cds; 11320 }; 11321 11322 static int zipfileBufferGrow(ZipfileBuffer *pBuf, int nByte){ 11323 if( pBuf->n+nByte>pBuf->nAlloc ){ 11324 u8 *aNew; 11325 sqlite3_int64 nNew = pBuf->n ? pBuf->n*2 : 512; 11326 int nReq = pBuf->n + nByte; 11327 11328 while( nNew<nReq ) nNew = nNew*2; 11329 aNew = sqlite3_realloc64(pBuf->a, nNew); 11330 if( aNew==0 ) return SQLITE_NOMEM; 11331 pBuf->a = aNew; 11332 pBuf->nAlloc = (int)nNew; 11333 } 11334 return SQLITE_OK; 11335 } 11336 11337 /* 11338 ** xStep() callback for the zipfile() aggregate. This can be called in 11339 ** any of the following ways: 11340 ** 11341 ** SELECT zipfile(name,data) ... 11342 ** SELECT zipfile(name,mode,mtime,data) ... 11343 ** SELECT zipfile(name,mode,mtime,data,method) ... 11344 */ 11345 static void zipfileStep(sqlite3_context *pCtx, int nVal, sqlite3_value **apVal){ 11346 ZipfileCtx *p; /* Aggregate function context */ 11347 ZipfileEntry e; /* New entry to add to zip archive */ 11348 11349 sqlite3_value *pName = 0; 11350 sqlite3_value *pMode = 0; 11351 sqlite3_value *pMtime = 0; 11352 sqlite3_value *pData = 0; 11353 sqlite3_value *pMethod = 0; 11354 11355 int bIsDir = 0; 11356 u32 mode; 11357 int rc = SQLITE_OK; 11358 char *zErr = 0; 11359 11360 int iMethod = -1; /* Compression method to use (0 or 8) */ 11361 11362 const u8 *aData = 0; /* Possibly compressed data for new entry */ 11363 int nData = 0; /* Size of aData[] in bytes */ 11364 int szUncompressed = 0; /* Size of data before compression */ 11365 u8 *aFree = 0; /* Free this before returning */ 11366 u32 iCrc32 = 0; /* crc32 of uncompressed data */ 11367 11368 char *zName = 0; /* Path (name) of new entry */ 11369 int nName = 0; /* Size of zName in bytes */ 11370 char *zFree = 0; /* Free this before returning */ 11371 int nByte; 11372 11373 memset(&e, 0, sizeof(e)); 11374 p = (ZipfileCtx*)sqlite3_aggregate_context(pCtx, sizeof(ZipfileCtx)); 11375 if( p==0 ) return; 11376 11377 /* Martial the arguments into stack variables */ 11378 if( nVal!=2 && nVal!=4 && nVal!=5 ){ 11379 zErr = sqlite3_mprintf("wrong number of arguments to function zipfile()"); 11380 rc = SQLITE_ERROR; 11381 goto zipfile_step_out; 11382 } 11383 pName = apVal[0]; 11384 if( nVal==2 ){ 11385 pData = apVal[1]; 11386 }else{ 11387 pMode = apVal[1]; 11388 pMtime = apVal[2]; 11389 pData = apVal[3]; 11390 if( nVal==5 ){ 11391 pMethod = apVal[4]; 11392 } 11393 } 11394 11395 /* Check that the 'name' parameter looks ok. */ 11396 zName = (char*)sqlite3_value_text(pName); 11397 nName = sqlite3_value_bytes(pName); 11398 if( zName==0 ){ 11399 zErr = sqlite3_mprintf("first argument to zipfile() must be non-NULL"); 11400 rc = SQLITE_ERROR; 11401 goto zipfile_step_out; 11402 } 11403 11404 /* Inspect the 'method' parameter. This must be either 0 (store), 8 (use 11405 ** deflate compression) or NULL (choose automatically). */ 11406 if( pMethod && SQLITE_NULL!=sqlite3_value_type(pMethod) ){ 11407 iMethod = (int)sqlite3_value_int64(pMethod); 11408 if( iMethod!=0 && iMethod!=8 ){ 11409 zErr = sqlite3_mprintf("illegal method value: %d", iMethod); 11410 rc = SQLITE_ERROR; 11411 goto zipfile_step_out; 11412 } 11413 } 11414 11415 /* Now inspect the data. If this is NULL, then the new entry must be a 11416 ** directory. Otherwise, figure out whether or not the data should 11417 ** be deflated or simply stored in the zip archive. */ 11418 if( sqlite3_value_type(pData)==SQLITE_NULL ){ 11419 bIsDir = 1; 11420 iMethod = 0; 11421 }else{ 11422 aData = sqlite3_value_blob(pData); 11423 szUncompressed = nData = sqlite3_value_bytes(pData); 11424 iCrc32 = crc32(0, aData, nData); 11425 if( iMethod<0 || iMethod==8 ){ 11426 int nOut = 0; 11427 rc = zipfileDeflate(aData, nData, &aFree, &nOut, &zErr); 11428 if( rc!=SQLITE_OK ){ 11429 goto zipfile_step_out; 11430 } 11431 if( iMethod==8 || nOut<nData ){ 11432 aData = aFree; 11433 nData = nOut; 11434 iMethod = 8; 11435 }else{ 11436 iMethod = 0; 11437 } 11438 } 11439 } 11440 11441 /* Decode the "mode" argument. */ 11442 rc = zipfileGetMode(pMode, bIsDir, &mode, &zErr); 11443 if( rc ) goto zipfile_step_out; 11444 11445 /* Decode the "mtime" argument. */ 11446 e.mUnixTime = zipfileGetTime(pMtime); 11447 11448 /* If this is a directory entry, ensure that there is exactly one '/' 11449 ** at the end of the path. Or, if this is not a directory and the path 11450 ** ends in '/' it is an error. */ 11451 if( bIsDir==0 ){ 11452 if( nName>0 && zName[nName-1]=='/' ){ 11453 zErr = sqlite3_mprintf("non-directory name must not end with /"); 11454 rc = SQLITE_ERROR; 11455 goto zipfile_step_out; 11456 } 11457 }else{ 11458 if( nName==0 || zName[nName-1]!='/' ){ 11459 zName = zFree = sqlite3_mprintf("%s/", zName); 11460 if( zName==0 ){ 11461 rc = SQLITE_NOMEM; 11462 goto zipfile_step_out; 11463 } 11464 nName = (int)strlen(zName); 11465 }else{ 11466 while( nName>1 && zName[nName-2]=='/' ) nName--; 11467 } 11468 } 11469 11470 /* Assemble the ZipfileEntry object for the new zip archive entry */ 11471 e.cds.iVersionMadeBy = ZIPFILE_NEWENTRY_MADEBY; 11472 e.cds.iVersionExtract = ZIPFILE_NEWENTRY_REQUIRED; 11473 e.cds.flags = ZIPFILE_NEWENTRY_FLAGS; 11474 e.cds.iCompression = (u16)iMethod; 11475 zipfileMtimeToDos(&e.cds, (u32)e.mUnixTime); 11476 e.cds.crc32 = iCrc32; 11477 e.cds.szCompressed = nData; 11478 e.cds.szUncompressed = szUncompressed; 11479 e.cds.iExternalAttr = (mode<<16); 11480 e.cds.iOffset = p->body.n; 11481 e.cds.nFile = (u16)nName; 11482 e.cds.zFile = zName; 11483 11484 /* Append the LFH to the body of the new archive */ 11485 nByte = ZIPFILE_LFH_FIXED_SZ + e.cds.nFile + 9; 11486 if( (rc = zipfileBufferGrow(&p->body, nByte)) ) goto zipfile_step_out; 11487 p->body.n += zipfileSerializeLFH(&e, &p->body.a[p->body.n]); 11488 11489 /* Append the data to the body of the new archive */ 11490 if( nData>0 ){ 11491 if( (rc = zipfileBufferGrow(&p->body, nData)) ) goto zipfile_step_out; 11492 memcpy(&p->body.a[p->body.n], aData, nData); 11493 p->body.n += nData; 11494 } 11495 11496 /* Append the CDS record to the directory of the new archive */ 11497 nByte = ZIPFILE_CDS_FIXED_SZ + e.cds.nFile + 9; 11498 if( (rc = zipfileBufferGrow(&p->cds, nByte)) ) goto zipfile_step_out; 11499 p->cds.n += zipfileSerializeCDS(&e, &p->cds.a[p->cds.n]); 11500 11501 /* Increment the count of entries in the archive */ 11502 p->nEntry++; 11503 11504 zipfile_step_out: 11505 sqlite3_free(aFree); 11506 sqlite3_free(zFree); 11507 if( rc ){ 11508 if( zErr ){ 11509 sqlite3_result_error(pCtx, zErr, -1); 11510 }else{ 11511 sqlite3_result_error_code(pCtx, rc); 11512 } 11513 } 11514 sqlite3_free(zErr); 11515 } 11516 11517 /* 11518 ** xFinalize() callback for zipfile aggregate function. 11519 */ 11520 static void zipfileFinal(sqlite3_context *pCtx){ 11521 ZipfileCtx *p; 11522 ZipfileEOCD eocd; 11523 sqlite3_int64 nZip; 11524 u8 *aZip; 11525 11526 p = (ZipfileCtx*)sqlite3_aggregate_context(pCtx, sizeof(ZipfileCtx)); 11527 if( p==0 ) return; 11528 if( p->nEntry>0 ){ 11529 memset(&eocd, 0, sizeof(eocd)); 11530 eocd.nEntry = (u16)p->nEntry; 11531 eocd.nEntryTotal = (u16)p->nEntry; 11532 eocd.nSize = p->cds.n; 11533 eocd.iOffset = p->body.n; 11534 11535 nZip = p->body.n + p->cds.n + ZIPFILE_EOCD_FIXED_SZ; 11536 aZip = (u8*)sqlite3_malloc64(nZip); 11537 if( aZip==0 ){ 11538 sqlite3_result_error_nomem(pCtx); 11539 }else{ 11540 memcpy(aZip, p->body.a, p->body.n); 11541 memcpy(&aZip[p->body.n], p->cds.a, p->cds.n); 11542 zipfileSerializeEOCD(&eocd, &aZip[p->body.n + p->cds.n]); 11543 sqlite3_result_blob(pCtx, aZip, (int)nZip, zipfileFree); 11544 } 11545 } 11546 11547 sqlite3_free(p->body.a); 11548 sqlite3_free(p->cds.a); 11549 } 11550 11551 11552 /* 11553 ** Register the "zipfile" virtual table. 11554 */ 11555 static int zipfileRegister(sqlite3 *db){ 11556 static sqlite3_module zipfileModule = { 11557 1, /* iVersion */ 11558 zipfileConnect, /* xCreate */ 11559 zipfileConnect, /* xConnect */ 11560 zipfileBestIndex, /* xBestIndex */ 11561 zipfileDisconnect, /* xDisconnect */ 11562 zipfileDisconnect, /* xDestroy */ 11563 zipfileOpen, /* xOpen - open a cursor */ 11564 zipfileClose, /* xClose - close a cursor */ 11565 zipfileFilter, /* xFilter - configure scan constraints */ 11566 zipfileNext, /* xNext - advance a cursor */ 11567 zipfileEof, /* xEof - check for end of scan */ 11568 zipfileColumn, /* xColumn - read data */ 11569 0, /* xRowid - read data */ 11570 zipfileUpdate, /* xUpdate */ 11571 zipfileBegin, /* xBegin */ 11572 0, /* xSync */ 11573 zipfileCommit, /* xCommit */ 11574 zipfileRollback, /* xRollback */ 11575 zipfileFindFunction, /* xFindMethod */ 11576 0, /* xRename */ 11577 0, /* xSavepoint */ 11578 0, /* xRelease */ 11579 0, /* xRollback */ 11580 0, /* xShadowName */ 11581 0 /* xIntegrity */ 11582 }; 11583 11584 int rc = sqlite3_create_module(db, "zipfile" , &zipfileModule, 0); 11585 if( rc==SQLITE_OK ) rc = sqlite3_overload_function(db, "zipfile_cds", -1); 11586 if( rc==SQLITE_OK ){ 11587 rc = sqlite3_create_function(db, "zipfile", -1, SQLITE_UTF8, 0, 0, 11588 zipfileStep, zipfileFinal 11589 ); 11590 } 11591 assert( sizeof(i64)==8 ); 11592 assert( sizeof(u32)==4 ); 11593 assert( sizeof(u16)==2 ); 11594 assert( sizeof(u8)==1 ); 11595 return rc; 11596 } 11597 #else /* SQLITE_OMIT_VIRTUALTABLE */ 11598 # define zipfileRegister(x) SQLITE_OK 11599 #endif 11600 11601 #ifdef _WIN32 11602 11603 #endif 11604 int sqlite3_zipfile_init( 11605 sqlite3 *db, 11606 char **pzErrMsg, 11607 const sqlite3_api_routines *pApi 11608 ){ 11609 SQLITE_EXTENSION_INIT2(pApi); 11610 (void)pzErrMsg; /* Unused parameter */ 11611 return zipfileRegister(db); 11612 } 11613 11614 /************************* End ../ext/misc/zipfile.c ********************/ 11615 /************************* Begin ../ext/misc/sqlar.c ******************/ 11616 /* 11617 ** 2017-12-17 11618 ** 11619 ** The author disclaims copyright to this source code. In place of 11620 ** a legal notice, here is a blessing: 11621 ** 11622 ** May you do good and not evil. 11623 ** May you find forgiveness for yourself and forgive others. 11624 ** May you share freely, never taking more than you give. 11625 ** 11626 ****************************************************************************** 11627 ** 11628 ** Utility functions sqlar_compress() and sqlar_uncompress(). Useful 11629 ** for working with sqlar archives and used by the shell tool's built-in 11630 ** sqlar support. 11631 */ 11632 /* #include "sqlite3ext.h" */ 11633 SQLITE_EXTENSION_INIT1 11634 #include <zlib.h> 11635 #include <assert.h> 11636 11637 /* 11638 ** Implementation of the "sqlar_compress(X)" SQL function. 11639 ** 11640 ** If the type of X is SQLITE_BLOB, and compressing that blob using 11641 ** zlib utility function compress() yields a smaller blob, return the 11642 ** compressed blob. Otherwise, return a copy of X. 11643 ** 11644 ** SQLar uses the "zlib format" for compressed content. The zlib format 11645 ** contains a two-byte identification header and a four-byte checksum at 11646 ** the end. This is different from ZIP which uses the raw deflate format. 11647 ** 11648 ** Future enhancements to SQLar might add support for new compression formats. 11649 ** If so, those new formats will be identified by alternative headers in the 11650 ** compressed data. 11651 */ 11652 static void sqlarCompressFunc( 11653 sqlite3_context *context, 11654 int argc, 11655 sqlite3_value **argv 11656 ){ 11657 assert( argc==1 ); 11658 if( sqlite3_value_type(argv[0])==SQLITE_BLOB ){ 11659 const Bytef *pData = sqlite3_value_blob(argv[0]); 11660 uLong nData = sqlite3_value_bytes(argv[0]); 11661 uLongf nOut = compressBound(nData); 11662 Bytef *pOut; 11663 11664 pOut = (Bytef*)sqlite3_malloc(nOut); 11665 if( pOut==0 ){ 11666 sqlite3_result_error_nomem(context); 11667 return; 11668 }else{ 11669 if( Z_OK!=compress(pOut, &nOut, pData, nData) ){ 11670 sqlite3_result_error(context, "error in compress()", -1); 11671 }else if( nOut<nData ){ 11672 sqlite3_result_blob(context, pOut, nOut, SQLITE_TRANSIENT); 11673 }else{ 11674 sqlite3_result_value(context, argv[0]); 11675 } 11676 sqlite3_free(pOut); 11677 } 11678 }else{ 11679 sqlite3_result_value(context, argv[0]); 11680 } 11681 } 11682 11683 /* 11684 ** Implementation of the "sqlar_uncompress(X,SZ)" SQL function 11685 ** 11686 ** Parameter SZ is interpreted as an integer. If it is less than or 11687 ** equal to zero, then this function returns a copy of X. Or, if 11688 ** SZ is equal to the size of X when interpreted as a blob, also 11689 ** return a copy of X. Otherwise, decompress blob X using zlib 11690 ** utility function uncompress() and return the results (another 11691 ** blob). 11692 */ 11693 static void sqlarUncompressFunc( 11694 sqlite3_context *context, 11695 int argc, 11696 sqlite3_value **argv 11697 ){ 11698 uLong nData; 11699 sqlite3_int64 sz; 11700 11701 assert( argc==2 ); 11702 sz = sqlite3_value_int(argv[1]); 11703 11704 if( sz<=0 || sz==(nData = sqlite3_value_bytes(argv[0])) ){ 11705 sqlite3_result_value(context, argv[0]); 11706 }else{ 11707 uLongf szf = sz; 11708 const Bytef *pData= sqlite3_value_blob(argv[0]); 11709 Bytef *pOut = sqlite3_malloc(sz); 11710 if( pOut==0 ){ 11711 sqlite3_result_error_nomem(context); 11712 }else if( Z_OK!=uncompress(pOut, &szf, pData, nData) ){ 11713 sqlite3_result_error(context, "error in uncompress()", -1); 11714 }else{ 11715 sqlite3_result_blob(context, pOut, szf, SQLITE_TRANSIENT); 11716 } 11717 sqlite3_free(pOut); 11718 } 11719 } 11720 11721 #ifdef _WIN32 11722 11723 #endif 11724 int sqlite3_sqlar_init( 11725 sqlite3 *db, 11726 char **pzErrMsg, 11727 const sqlite3_api_routines *pApi 11728 ){ 11729 int rc = SQLITE_OK; 11730 SQLITE_EXTENSION_INIT2(pApi); 11731 (void)pzErrMsg; /* Unused parameter */ 11732 rc = sqlite3_create_function(db, "sqlar_compress", 1, 11733 SQLITE_UTF8|SQLITE_INNOCUOUS, 0, 11734 sqlarCompressFunc, 0, 0); 11735 if( rc==SQLITE_OK ){ 11736 rc = sqlite3_create_function(db, "sqlar_uncompress", 2, 11737 SQLITE_UTF8|SQLITE_INNOCUOUS, 0, 11738 sqlarUncompressFunc, 0, 0); 11739 } 11740 return rc; 11741 } 11742 11743 /************************* End ../ext/misc/sqlar.c ********************/ 11744 #endif 11745 /************************* Begin ../ext/expert/sqlite3expert.h ******************/ 11746 /* 11747 ** 2017 April 07 11748 ** 11749 ** The author disclaims copyright to this source code. In place of 11750 ** a legal notice, here is a blessing: 11751 ** 11752 ** May you do good and not evil. 11753 ** May you find forgiveness for yourself and forgive others. 11754 ** May you share freely, never taking more than you give. 11755 ** 11756 ************************************************************************* 11757 */ 11758 #if !defined(SQLITEEXPERT_H) 11759 #define SQLITEEXPERT_H 1 11760 /* #include "sqlite3.h" */ 11761 11762 typedef struct sqlite3expert sqlite3expert; 11763 11764 /* 11765 ** Create a new sqlite3expert object. 11766 ** 11767 ** If successful, a pointer to the new object is returned and (*pzErr) set 11768 ** to NULL. Or, if an error occurs, NULL is returned and (*pzErr) set to 11769 ** an English-language error message. In this case it is the responsibility 11770 ** of the caller to eventually free the error message buffer using 11771 ** sqlite3_free(). 11772 */ 11773 sqlite3expert *sqlite3_expert_new(sqlite3 *db, char **pzErr); 11774 11775 /* 11776 ** Configure an sqlite3expert object. 11777 ** 11778 ** EXPERT_CONFIG_SAMPLE: 11779 ** By default, sqlite3_expert_analyze() generates sqlite_stat1 data for 11780 ** each candidate index. This involves scanning and sorting the entire 11781 ** contents of each user database table once for each candidate index 11782 ** associated with the table. For large databases, this can be 11783 ** prohibitively slow. This option allows the sqlite3expert object to 11784 ** be configured so that sqlite_stat1 data is instead generated based on a 11785 ** subset of each table, or so that no sqlite_stat1 data is used at all. 11786 ** 11787 ** A single integer argument is passed to this option. If the value is less 11788 ** than or equal to zero, then no sqlite_stat1 data is generated or used by 11789 ** the analysis - indexes are recommended based on the database schema only. 11790 ** Or, if the value is 100 or greater, complete sqlite_stat1 data is 11791 ** generated for each candidate index (this is the default). Finally, if the 11792 ** value falls between 0 and 100, then it represents the percentage of user 11793 ** table rows that should be considered when generating sqlite_stat1 data. 11794 ** 11795 ** Examples: 11796 ** 11797 ** // Do not generate any sqlite_stat1 data 11798 ** sqlite3_expert_config(pExpert, EXPERT_CONFIG_SAMPLE, 0); 11799 ** 11800 ** // Generate sqlite_stat1 data based on 10% of the rows in each table. 11801 ** sqlite3_expert_config(pExpert, EXPERT_CONFIG_SAMPLE, 10); 11802 */ 11803 int sqlite3_expert_config(sqlite3expert *p, int op, ...); 11804 11805 #define EXPERT_CONFIG_SAMPLE 1 /* int */ 11806 11807 /* 11808 ** Specify zero or more SQL statements to be included in the analysis. 11809 ** 11810 ** Buffer zSql must contain zero or more complete SQL statements. This 11811 ** function parses all statements contained in the buffer and adds them 11812 ** to the internal list of statements to analyze. If successful, SQLITE_OK 11813 ** is returned and (*pzErr) set to NULL. Or, if an error occurs - for example 11814 ** due to a error in the SQL - an SQLite error code is returned and (*pzErr) 11815 ** may be set to point to an English language error message. In this case 11816 ** the caller is responsible for eventually freeing the error message buffer 11817 ** using sqlite3_free(). 11818 ** 11819 ** If an error does occur while processing one of the statements in the 11820 ** buffer passed as the second argument, none of the statements in the 11821 ** buffer are added to the analysis. 11822 ** 11823 ** This function must be called before sqlite3_expert_analyze(). If a call 11824 ** to this function is made on an sqlite3expert object that has already 11825 ** been passed to sqlite3_expert_analyze() SQLITE_MISUSE is returned 11826 ** immediately and no statements are added to the analysis. 11827 */ 11828 int sqlite3_expert_sql( 11829 sqlite3expert *p, /* From a successful sqlite3_expert_new() */ 11830 const char *zSql, /* SQL statement(s) to add */ 11831 char **pzErr /* OUT: Error message (if any) */ 11832 ); 11833 11834 11835 /* 11836 ** This function is called after the sqlite3expert object has been configured 11837 ** with all SQL statements using sqlite3_expert_sql() to actually perform 11838 ** the analysis. Once this function has been called, it is not possible to 11839 ** add further SQL statements to the analysis. 11840 ** 11841 ** If successful, SQLITE_OK is returned and (*pzErr) is set to NULL. Or, if 11842 ** an error occurs, an SQLite error code is returned and (*pzErr) set to 11843 ** point to a buffer containing an English language error message. In this 11844 ** case it is the responsibility of the caller to eventually free the buffer 11845 ** using sqlite3_free(). 11846 ** 11847 ** If an error does occur within this function, the sqlite3expert object 11848 ** is no longer useful for any purpose. At that point it is no longer 11849 ** possible to add further SQL statements to the object or to re-attempt 11850 ** the analysis. The sqlite3expert object must still be freed using a call 11851 ** sqlite3_expert_destroy(). 11852 */ 11853 int sqlite3_expert_analyze(sqlite3expert *p, char **pzErr); 11854 11855 /* 11856 ** Return the total number of statements loaded using sqlite3_expert_sql(). 11857 ** The total number of SQL statements may be different from the total number 11858 ** to calls to sqlite3_expert_sql(). 11859 */ 11860 int sqlite3_expert_count(sqlite3expert*); 11861 11862 /* 11863 ** Return a component of the report. 11864 ** 11865 ** This function is called after sqlite3_expert_analyze() to extract the 11866 ** results of the analysis. Each call to this function returns either a 11867 ** NULL pointer or a pointer to a buffer containing a nul-terminated string. 11868 ** The value passed as the third argument must be one of the EXPERT_REPORT_* 11869 ** #define constants defined below. 11870 ** 11871 ** For some EXPERT_REPORT_* parameters, the buffer returned contains 11872 ** information relating to a specific SQL statement. In these cases that 11873 ** SQL statement is identified by the value passed as the second argument. 11874 ** SQL statements are numbered from 0 in the order in which they are parsed. 11875 ** If an out-of-range value (less than zero or equal to or greater than the 11876 ** value returned by sqlite3_expert_count()) is passed as the second argument 11877 ** along with such an EXPERT_REPORT_* parameter, NULL is always returned. 11878 ** 11879 ** EXPERT_REPORT_SQL: 11880 ** Return the text of SQL statement iStmt. 11881 ** 11882 ** EXPERT_REPORT_INDEXES: 11883 ** Return a buffer containing the CREATE INDEX statements for all recommended 11884 ** indexes for statement iStmt. If there are no new recommeded indexes, NULL 11885 ** is returned. 11886 ** 11887 ** EXPERT_REPORT_PLAN: 11888 ** Return a buffer containing the EXPLAIN QUERY PLAN output for SQL query 11889 ** iStmt after the proposed indexes have been added to the database schema. 11890 ** 11891 ** EXPERT_REPORT_CANDIDATES: 11892 ** Return a pointer to a buffer containing the CREATE INDEX statements 11893 ** for all indexes that were tested (for all SQL statements). The iStmt 11894 ** parameter is ignored for EXPERT_REPORT_CANDIDATES calls. 11895 */ 11896 const char *sqlite3_expert_report(sqlite3expert*, int iStmt, int eReport); 11897 11898 /* 11899 ** Values for the third argument passed to sqlite3_expert_report(). 11900 */ 11901 #define EXPERT_REPORT_SQL 1 11902 #define EXPERT_REPORT_INDEXES 2 11903 #define EXPERT_REPORT_PLAN 3 11904 #define EXPERT_REPORT_CANDIDATES 4 11905 11906 /* 11907 ** Free an (sqlite3expert*) handle and all associated resources. There 11908 ** should be one call to this function for each successful call to 11909 ** sqlite3-expert_new(). 11910 */ 11911 void sqlite3_expert_destroy(sqlite3expert*); 11912 11913 #endif /* !defined(SQLITEEXPERT_H) */ 11914 11915 /************************* End ../ext/expert/sqlite3expert.h ********************/ 11916 /************************* Begin ../ext/expert/sqlite3expert.c ******************/ 11917 /* 11918 ** 2017 April 09 11919 ** 11920 ** The author disclaims copyright to this source code. In place of 11921 ** a legal notice, here is a blessing: 11922 ** 11923 ** May you do good and not evil. 11924 ** May you find forgiveness for yourself and forgive others. 11925 ** May you share freely, never taking more than you give. 11926 ** 11927 ************************************************************************* 11928 */ 11929 /* #include "sqlite3expert.h" */ 11930 #include <assert.h> 11931 #include <string.h> 11932 #include <stdio.h> 11933 11934 #if !defined(SQLITE_AMALGAMATION) 11935 #if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST) 11936 # define SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS 1 11937 #endif 11938 #if defined(SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS) 11939 # define ALWAYS(X) (1) 11940 # define NEVER(X) (0) 11941 #elif !defined(NDEBUG) 11942 # define ALWAYS(X) ((X)?1:(assert(0),0)) 11943 # define NEVER(X) ((X)?(assert(0),1):0) 11944 #else 11945 # define ALWAYS(X) (X) 11946 # define NEVER(X) (X) 11947 #endif 11948 #endif /* !defined(SQLITE_AMALGAMATION) */ 11949 11950 11951 #ifndef SQLITE_OMIT_VIRTUALTABLE 11952 11953 /* typedef sqlite3_int64 i64; */ 11954 /* typedef sqlite3_uint64 u64; */ 11955 11956 typedef struct IdxColumn IdxColumn; 11957 typedef struct IdxConstraint IdxConstraint; 11958 typedef struct IdxScan IdxScan; 11959 typedef struct IdxStatement IdxStatement; 11960 typedef struct IdxTable IdxTable; 11961 typedef struct IdxWrite IdxWrite; 11962 11963 #define STRLEN (int)strlen 11964 11965 /* 11966 ** A temp table name that we assume no user database will actually use. 11967 ** If this assumption proves incorrect triggers on the table with the 11968 ** conflicting name will be ignored. 11969 */ 11970 #define UNIQUE_TABLE_NAME "t592690916721053953805701627921227776" 11971 11972 /* 11973 ** A single constraint. Equivalent to either "col = ?" or "col < ?" (or 11974 ** any other type of single-ended range constraint on a column). 11975 ** 11976 ** pLink: 11977 ** Used to temporarily link IdxConstraint objects into lists while 11978 ** creating candidate indexes. 11979 */ 11980 struct IdxConstraint { 11981 char *zColl; /* Collation sequence */ 11982 int bRange; /* True for range, false for eq */ 11983 int iCol; /* Constrained table column */ 11984 int bFlag; /* Used by idxFindCompatible() */ 11985 int bDesc; /* True if ORDER BY <expr> DESC */ 11986 IdxConstraint *pNext; /* Next constraint in pEq or pRange list */ 11987 IdxConstraint *pLink; /* See above */ 11988 }; 11989 11990 /* 11991 ** A single scan of a single table. 11992 */ 11993 struct IdxScan { 11994 IdxTable *pTab; /* Associated table object */ 11995 int iDb; /* Database containing table zTable */ 11996 i64 covering; /* Mask of columns required for cov. index */ 11997 IdxConstraint *pOrder; /* ORDER BY columns */ 11998 IdxConstraint *pEq; /* List of == constraints */ 11999 IdxConstraint *pRange; /* List of < constraints */ 12000 IdxScan *pNextScan; /* Next IdxScan object for same analysis */ 12001 }; 12002 12003 /* 12004 ** Information regarding a single database table. Extracted from 12005 ** "PRAGMA table_info" by function idxGetTableInfo(). 12006 */ 12007 struct IdxColumn { 12008 char *zName; 12009 char *zColl; 12010 int iPk; 12011 }; 12012 struct IdxTable { 12013 int nCol; 12014 char *zName; /* Table name */ 12015 IdxColumn *aCol; 12016 IdxTable *pNext; /* Next table in linked list of all tables */ 12017 }; 12018 12019 /* 12020 ** An object of the following type is created for each unique table/write-op 12021 ** seen. The objects are stored in a singly-linked list beginning at 12022 ** sqlite3expert.pWrite. 12023 */ 12024 struct IdxWrite { 12025 IdxTable *pTab; 12026 int eOp; /* SQLITE_UPDATE, DELETE or INSERT */ 12027 IdxWrite *pNext; 12028 }; 12029 12030 /* 12031 ** Each statement being analyzed is represented by an instance of this 12032 ** structure. 12033 */ 12034 struct IdxStatement { 12035 int iId; /* Statement number */ 12036 char *zSql; /* SQL statement */ 12037 char *zIdx; /* Indexes */ 12038 char *zEQP; /* Plan */ 12039 IdxStatement *pNext; 12040 }; 12041 12042 12043 /* 12044 ** A hash table for storing strings. With space for a payload string 12045 ** with each entry. Methods are: 12046 ** 12047 ** idxHashInit() 12048 ** idxHashClear() 12049 ** idxHashAdd() 12050 ** idxHashSearch() 12051 */ 12052 #define IDX_HASH_SIZE 1023 12053 typedef struct IdxHashEntry IdxHashEntry; 12054 typedef struct IdxHash IdxHash; 12055 struct IdxHashEntry { 12056 char *zKey; /* nul-terminated key */ 12057 char *zVal; /* nul-terminated value string */ 12058 char *zVal2; /* nul-terminated value string 2 */ 12059 IdxHashEntry *pHashNext; /* Next entry in same hash bucket */ 12060 IdxHashEntry *pNext; /* Next entry in hash */ 12061 }; 12062 struct IdxHash { 12063 IdxHashEntry *pFirst; 12064 IdxHashEntry *aHash[IDX_HASH_SIZE]; 12065 }; 12066 12067 /* 12068 ** sqlite3expert object. 12069 */ 12070 struct sqlite3expert { 12071 int iSample; /* Percentage of tables to sample for stat1 */ 12072 sqlite3 *db; /* User database */ 12073 sqlite3 *dbm; /* In-memory db for this analysis */ 12074 sqlite3 *dbv; /* Vtab schema for this analysis */ 12075 IdxTable *pTable; /* List of all IdxTable objects */ 12076 IdxScan *pScan; /* List of scan objects */ 12077 IdxWrite *pWrite; /* List of write objects */ 12078 IdxStatement *pStatement; /* List of IdxStatement objects */ 12079 int bRun; /* True once analysis has run */ 12080 char **pzErrmsg; 12081 int rc; /* Error code from whereinfo hook */ 12082 IdxHash hIdx; /* Hash containing all candidate indexes */ 12083 char *zCandidates; /* For EXPERT_REPORT_CANDIDATES */ 12084 }; 12085 12086 12087 /* 12088 ** Allocate and return nByte bytes of zeroed memory using sqlite3_malloc(). 12089 ** If the allocation fails, set *pRc to SQLITE_NOMEM and return NULL. 12090 */ 12091 static void *idxMalloc(int *pRc, int nByte){ 12092 void *pRet; 12093 assert( *pRc==SQLITE_OK ); 12094 assert( nByte>0 ); 12095 pRet = sqlite3_malloc(nByte); 12096 if( pRet ){ 12097 memset(pRet, 0, nByte); 12098 }else{ 12099 *pRc = SQLITE_NOMEM; 12100 } 12101 return pRet; 12102 } 12103 12104 /* 12105 ** Initialize an IdxHash hash table. 12106 */ 12107 static void idxHashInit(IdxHash *pHash){ 12108 memset(pHash, 0, sizeof(IdxHash)); 12109 } 12110 12111 /* 12112 ** Reset an IdxHash hash table. 12113 */ 12114 static void idxHashClear(IdxHash *pHash){ 12115 int i; 12116 for(i=0; i<IDX_HASH_SIZE; i++){ 12117 IdxHashEntry *pEntry; 12118 IdxHashEntry *pNext; 12119 for(pEntry=pHash->aHash[i]; pEntry; pEntry=pNext){ 12120 pNext = pEntry->pHashNext; 12121 sqlite3_free(pEntry->zVal2); 12122 sqlite3_free(pEntry); 12123 } 12124 } 12125 memset(pHash, 0, sizeof(IdxHash)); 12126 } 12127 12128 /* 12129 ** Return the index of the hash bucket that the string specified by the 12130 ** arguments to this function belongs. 12131 */ 12132 static int idxHashString(const char *z, int n){ 12133 unsigned int ret = 0; 12134 int i; 12135 for(i=0; i<n; i++){ 12136 ret += (ret<<3) + (unsigned char)(z[i]); 12137 } 12138 return (int)(ret % IDX_HASH_SIZE); 12139 } 12140 12141 /* 12142 ** If zKey is already present in the hash table, return non-zero and do 12143 ** nothing. Otherwise, add an entry with key zKey and payload string zVal to 12144 ** the hash table passed as the second argument. 12145 */ 12146 static int idxHashAdd( 12147 int *pRc, 12148 IdxHash *pHash, 12149 const char *zKey, 12150 const char *zVal 12151 ){ 12152 int nKey = STRLEN(zKey); 12153 int iHash = idxHashString(zKey, nKey); 12154 int nVal = (zVal ? STRLEN(zVal) : 0); 12155 IdxHashEntry *pEntry; 12156 assert( iHash>=0 ); 12157 for(pEntry=pHash->aHash[iHash]; pEntry; pEntry=pEntry->pHashNext){ 12158 if( STRLEN(pEntry->zKey)==nKey && 0==memcmp(pEntry->zKey, zKey, nKey) ){ 12159 return 1; 12160 } 12161 } 12162 pEntry = idxMalloc(pRc, sizeof(IdxHashEntry) + nKey+1 + nVal+1); 12163 if( pEntry ){ 12164 pEntry->zKey = (char*)&pEntry[1]; 12165 memcpy(pEntry->zKey, zKey, nKey); 12166 if( zVal ){ 12167 pEntry->zVal = &pEntry->zKey[nKey+1]; 12168 memcpy(pEntry->zVal, zVal, nVal); 12169 } 12170 pEntry->pHashNext = pHash->aHash[iHash]; 12171 pHash->aHash[iHash] = pEntry; 12172 12173 pEntry->pNext = pHash->pFirst; 12174 pHash->pFirst = pEntry; 12175 } 12176 return 0; 12177 } 12178 12179 /* 12180 ** If zKey/nKey is present in the hash table, return a pointer to the 12181 ** hash-entry object. 12182 */ 12183 static IdxHashEntry *idxHashFind(IdxHash *pHash, const char *zKey, int nKey){ 12184 int iHash; 12185 IdxHashEntry *pEntry; 12186 if( nKey<0 ) nKey = STRLEN(zKey); 12187 iHash = idxHashString(zKey, nKey); 12188 assert( iHash>=0 ); 12189 for(pEntry=pHash->aHash[iHash]; pEntry; pEntry=pEntry->pHashNext){ 12190 if( STRLEN(pEntry->zKey)==nKey && 0==memcmp(pEntry->zKey, zKey, nKey) ){ 12191 return pEntry; 12192 } 12193 } 12194 return 0; 12195 } 12196 12197 /* 12198 ** If the hash table contains an entry with a key equal to the string 12199 ** passed as the final two arguments to this function, return a pointer 12200 ** to the payload string. Otherwise, if zKey/nKey is not present in the 12201 ** hash table, return NULL. 12202 */ 12203 static const char *idxHashSearch(IdxHash *pHash, const char *zKey, int nKey){ 12204 IdxHashEntry *pEntry = idxHashFind(pHash, zKey, nKey); 12205 if( pEntry ) return pEntry->zVal; 12206 return 0; 12207 } 12208 12209 /* 12210 ** Allocate and return a new IdxConstraint object. Set the IdxConstraint.zColl 12211 ** variable to point to a copy of nul-terminated string zColl. 12212 */ 12213 static IdxConstraint *idxNewConstraint(int *pRc, const char *zColl){ 12214 IdxConstraint *pNew; 12215 int nColl = STRLEN(zColl); 12216 12217 assert( *pRc==SQLITE_OK ); 12218 pNew = (IdxConstraint*)idxMalloc(pRc, sizeof(IdxConstraint) * nColl + 1); 12219 if( pNew ){ 12220 pNew->zColl = (char*)&pNew[1]; 12221 memcpy(pNew->zColl, zColl, nColl+1); 12222 } 12223 return pNew; 12224 } 12225 12226 /* 12227 ** An error associated with database handle db has just occurred. Pass 12228 ** the error message to callback function xOut. 12229 */ 12230 static void idxDatabaseError( 12231 sqlite3 *db, /* Database handle */ 12232 char **pzErrmsg /* Write error here */ 12233 ){ 12234 *pzErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(db)); 12235 } 12236 12237 /* 12238 ** Prepare an SQL statement. 12239 */ 12240 static int idxPrepareStmt( 12241 sqlite3 *db, /* Database handle to compile against */ 12242 sqlite3_stmt **ppStmt, /* OUT: Compiled SQL statement */ 12243 char **pzErrmsg, /* OUT: sqlite3_malloc()ed error message */ 12244 const char *zSql /* SQL statement to compile */ 12245 ){ 12246 int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0); 12247 if( rc!=SQLITE_OK ){ 12248 *ppStmt = 0; 12249 idxDatabaseError(db, pzErrmsg); 12250 } 12251 return rc; 12252 } 12253 12254 /* 12255 ** Prepare an SQL statement using the results of a printf() formatting. 12256 */ 12257 static int idxPrintfPrepareStmt( 12258 sqlite3 *db, /* Database handle to compile against */ 12259 sqlite3_stmt **ppStmt, /* OUT: Compiled SQL statement */ 12260 char **pzErrmsg, /* OUT: sqlite3_malloc()ed error message */ 12261 const char *zFmt, /* printf() format of SQL statement */ 12262 ... /* Trailing printf() arguments */ 12263 ){ 12264 va_list ap; 12265 int rc; 12266 char *zSql; 12267 va_start(ap, zFmt); 12268 zSql = sqlite3_vmprintf(zFmt, ap); 12269 if( zSql==0 ){ 12270 rc = SQLITE_NOMEM; 12271 }else{ 12272 rc = idxPrepareStmt(db, ppStmt, pzErrmsg, zSql); 12273 sqlite3_free(zSql); 12274 } 12275 va_end(ap); 12276 return rc; 12277 } 12278 12279 12280 /************************************************************************* 12281 ** Beginning of virtual table implementation. 12282 */ 12283 typedef struct ExpertVtab ExpertVtab; 12284 struct ExpertVtab { 12285 sqlite3_vtab base; 12286 IdxTable *pTab; 12287 sqlite3expert *pExpert; 12288 }; 12289 12290 typedef struct ExpertCsr ExpertCsr; 12291 struct ExpertCsr { 12292 sqlite3_vtab_cursor base; 12293 sqlite3_stmt *pData; 12294 }; 12295 12296 static char *expertDequote(const char *zIn){ 12297 int n = STRLEN(zIn); 12298 char *zRet = sqlite3_malloc(n); 12299 12300 assert( zIn[0]=='\'' ); 12301 assert( zIn[n-1]=='\'' ); 12302 12303 if( zRet ){ 12304 int iOut = 0; 12305 int iIn = 0; 12306 for(iIn=1; iIn<(n-1); iIn++){ 12307 if( zIn[iIn]=='\'' ){ 12308 assert( zIn[iIn+1]=='\'' ); 12309 iIn++; 12310 } 12311 zRet[iOut++] = zIn[iIn]; 12312 } 12313 zRet[iOut] = '\0'; 12314 } 12315 12316 return zRet; 12317 } 12318 12319 /* 12320 ** This function is the implementation of both the xConnect and xCreate 12321 ** methods of the r-tree virtual table. 12322 ** 12323 ** argv[0] -> module name 12324 ** argv[1] -> database name 12325 ** argv[2] -> table name 12326 ** argv[...] -> column names... 12327 */ 12328 static int expertConnect( 12329 sqlite3 *db, 12330 void *pAux, 12331 int argc, const char *const*argv, 12332 sqlite3_vtab **ppVtab, 12333 char **pzErr 12334 ){ 12335 sqlite3expert *pExpert = (sqlite3expert*)pAux; 12336 ExpertVtab *p = 0; 12337 int rc; 12338 12339 if( argc!=4 ){ 12340 *pzErr = sqlite3_mprintf("internal error!"); 12341 rc = SQLITE_ERROR; 12342 }else{ 12343 char *zCreateTable = expertDequote(argv[3]); 12344 if( zCreateTable ){ 12345 rc = sqlite3_declare_vtab(db, zCreateTable); 12346 if( rc==SQLITE_OK ){ 12347 p = idxMalloc(&rc, sizeof(ExpertVtab)); 12348 } 12349 if( rc==SQLITE_OK ){ 12350 p->pExpert = pExpert; 12351 p->pTab = pExpert->pTable; 12352 assert( sqlite3_stricmp(p->pTab->zName, argv[2])==0 ); 12353 } 12354 sqlite3_free(zCreateTable); 12355 }else{ 12356 rc = SQLITE_NOMEM; 12357 } 12358 } 12359 12360 *ppVtab = (sqlite3_vtab*)p; 12361 return rc; 12362 } 12363 12364 static int expertDisconnect(sqlite3_vtab *pVtab){ 12365 ExpertVtab *p = (ExpertVtab*)pVtab; 12366 sqlite3_free(p); 12367 return SQLITE_OK; 12368 } 12369 12370 static int expertBestIndex(sqlite3_vtab *pVtab, sqlite3_index_info *pIdxInfo){ 12371 ExpertVtab *p = (ExpertVtab*)pVtab; 12372 int rc = SQLITE_OK; 12373 int n = 0; 12374 IdxScan *pScan; 12375 const int opmask = 12376 SQLITE_INDEX_CONSTRAINT_EQ | SQLITE_INDEX_CONSTRAINT_GT | 12377 SQLITE_INDEX_CONSTRAINT_LT | SQLITE_INDEX_CONSTRAINT_GE | 12378 SQLITE_INDEX_CONSTRAINT_LE; 12379 12380 pScan = idxMalloc(&rc, sizeof(IdxScan)); 12381 if( pScan ){ 12382 int i; 12383 12384 /* Link the new scan object into the list */ 12385 pScan->pTab = p->pTab; 12386 pScan->pNextScan = p->pExpert->pScan; 12387 p->pExpert->pScan = pScan; 12388 12389 /* Add the constraints to the IdxScan object */ 12390 for(i=0; i<pIdxInfo->nConstraint; i++){ 12391 struct sqlite3_index_constraint *pCons = &pIdxInfo->aConstraint[i]; 12392 if( pCons->usable 12393 && pCons->iColumn>=0 12394 && p->pTab->aCol[pCons->iColumn].iPk==0 12395 && (pCons->op & opmask) 12396 ){ 12397 IdxConstraint *pNew; 12398 const char *zColl = sqlite3_vtab_collation(pIdxInfo, i); 12399 pNew = idxNewConstraint(&rc, zColl); 12400 if( pNew ){ 12401 pNew->iCol = pCons->iColumn; 12402 if( pCons->op==SQLITE_INDEX_CONSTRAINT_EQ ){ 12403 pNew->pNext = pScan->pEq; 12404 pScan->pEq = pNew; 12405 }else{ 12406 pNew->bRange = 1; 12407 pNew->pNext = pScan->pRange; 12408 pScan->pRange = pNew; 12409 } 12410 } 12411 n++; 12412 pIdxInfo->aConstraintUsage[i].argvIndex = n; 12413 } 12414 } 12415 12416 /* Add the ORDER BY to the IdxScan object */ 12417 for(i=pIdxInfo->nOrderBy-1; i>=0; i--){ 12418 int iCol = pIdxInfo->aOrderBy[i].iColumn; 12419 if( iCol>=0 ){ 12420 IdxConstraint *pNew = idxNewConstraint(&rc, p->pTab->aCol[iCol].zColl); 12421 if( pNew ){ 12422 pNew->iCol = iCol; 12423 pNew->bDesc = pIdxInfo->aOrderBy[i].desc; 12424 pNew->pNext = pScan->pOrder; 12425 pNew->pLink = pScan->pOrder; 12426 pScan->pOrder = pNew; 12427 n++; 12428 } 12429 } 12430 } 12431 } 12432 12433 pIdxInfo->estimatedCost = 1000000.0 / (n+1); 12434 return rc; 12435 } 12436 12437 static int expertUpdate( 12438 sqlite3_vtab *pVtab, 12439 int nData, 12440 sqlite3_value **azData, 12441 sqlite_int64 *pRowid 12442 ){ 12443 (void)pVtab; 12444 (void)nData; 12445 (void)azData; 12446 (void)pRowid; 12447 return SQLITE_OK; 12448 } 12449 12450 /* 12451 ** Virtual table module xOpen method. 12452 */ 12453 static int expertOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){ 12454 int rc = SQLITE_OK; 12455 ExpertCsr *pCsr; 12456 (void)pVTab; 12457 pCsr = idxMalloc(&rc, sizeof(ExpertCsr)); 12458 *ppCursor = (sqlite3_vtab_cursor*)pCsr; 12459 return rc; 12460 } 12461 12462 /* 12463 ** Virtual table module xClose method. 12464 */ 12465 static int expertClose(sqlite3_vtab_cursor *cur){ 12466 ExpertCsr *pCsr = (ExpertCsr*)cur; 12467 sqlite3_finalize(pCsr->pData); 12468 sqlite3_free(pCsr); 12469 return SQLITE_OK; 12470 } 12471 12472 /* 12473 ** Virtual table module xEof method. 12474 ** 12475 ** Return non-zero if the cursor does not currently point to a valid 12476 ** record (i.e if the scan has finished), or zero otherwise. 12477 */ 12478 static int expertEof(sqlite3_vtab_cursor *cur){ 12479 ExpertCsr *pCsr = (ExpertCsr*)cur; 12480 return pCsr->pData==0; 12481 } 12482 12483 /* 12484 ** Virtual table module xNext method. 12485 */ 12486 static int expertNext(sqlite3_vtab_cursor *cur){ 12487 ExpertCsr *pCsr = (ExpertCsr*)cur; 12488 int rc = SQLITE_OK; 12489 12490 assert( pCsr->pData ); 12491 rc = sqlite3_step(pCsr->pData); 12492 if( rc!=SQLITE_ROW ){ 12493 rc = sqlite3_finalize(pCsr->pData); 12494 pCsr->pData = 0; 12495 }else{ 12496 rc = SQLITE_OK; 12497 } 12498 12499 return rc; 12500 } 12501 12502 /* 12503 ** Virtual table module xRowid method. 12504 */ 12505 static int expertRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ 12506 (void)cur; 12507 *pRowid = 0; 12508 return SQLITE_OK; 12509 } 12510 12511 /* 12512 ** Virtual table module xColumn method. 12513 */ 12514 static int expertColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){ 12515 ExpertCsr *pCsr = (ExpertCsr*)cur; 12516 sqlite3_value *pVal; 12517 pVal = sqlite3_column_value(pCsr->pData, i); 12518 if( pVal ){ 12519 sqlite3_result_value(ctx, pVal); 12520 } 12521 return SQLITE_OK; 12522 } 12523 12524 /* 12525 ** Virtual table module xFilter method. 12526 */ 12527 static int expertFilter( 12528 sqlite3_vtab_cursor *cur, 12529 int idxNum, const char *idxStr, 12530 int argc, sqlite3_value **argv 12531 ){ 12532 ExpertCsr *pCsr = (ExpertCsr*)cur; 12533 ExpertVtab *pVtab = (ExpertVtab*)(cur->pVtab); 12534 sqlite3expert *pExpert = pVtab->pExpert; 12535 int rc; 12536 12537 (void)idxNum; 12538 (void)idxStr; 12539 (void)argc; 12540 (void)argv; 12541 rc = sqlite3_finalize(pCsr->pData); 12542 pCsr->pData = 0; 12543 if( rc==SQLITE_OK ){ 12544 rc = idxPrintfPrepareStmt(pExpert->db, &pCsr->pData, &pVtab->base.zErrMsg, 12545 "SELECT * FROM main.%Q WHERE sqlite_expert_sample()", pVtab->pTab->zName 12546 ); 12547 } 12548 12549 if( rc==SQLITE_OK ){ 12550 rc = expertNext(cur); 12551 } 12552 return rc; 12553 } 12554 12555 static int idxRegisterVtab(sqlite3expert *p){ 12556 static sqlite3_module expertModule = { 12557 2, /* iVersion */ 12558 expertConnect, /* xCreate - create a table */ 12559 expertConnect, /* xConnect - connect to an existing table */ 12560 expertBestIndex, /* xBestIndex - Determine search strategy */ 12561 expertDisconnect, /* xDisconnect - Disconnect from a table */ 12562 expertDisconnect, /* xDestroy - Drop a table */ 12563 expertOpen, /* xOpen - open a cursor */ 12564 expertClose, /* xClose - close a cursor */ 12565 expertFilter, /* xFilter - configure scan constraints */ 12566 expertNext, /* xNext - advance a cursor */ 12567 expertEof, /* xEof */ 12568 expertColumn, /* xColumn - read data */ 12569 expertRowid, /* xRowid - read data */ 12570 expertUpdate, /* xUpdate - write data */ 12571 0, /* xBegin - begin transaction */ 12572 0, /* xSync - sync transaction */ 12573 0, /* xCommit - commit transaction */ 12574 0, /* xRollback - rollback transaction */ 12575 0, /* xFindFunction - function overloading */ 12576 0, /* xRename - rename the table */ 12577 0, /* xSavepoint */ 12578 0, /* xRelease */ 12579 0, /* xRollbackTo */ 12580 0, /* xShadowName */ 12581 0, /* xIntegrity */ 12582 }; 12583 12584 return sqlite3_create_module(p->dbv, "expert", &expertModule, (void*)p); 12585 } 12586 /* 12587 ** End of virtual table implementation. 12588 *************************************************************************/ 12589 /* 12590 ** Finalize SQL statement pStmt. If (*pRc) is SQLITE_OK when this function 12591 ** is called, set it to the return value of sqlite3_finalize() before 12592 ** returning. Otherwise, discard the sqlite3_finalize() return value. 12593 */ 12594 static void idxFinalize(int *pRc, sqlite3_stmt *pStmt){ 12595 int rc = sqlite3_finalize(pStmt); 12596 if( *pRc==SQLITE_OK ) *pRc = rc; 12597 } 12598 12599 /* 12600 ** Attempt to allocate an IdxTable structure corresponding to table zTab 12601 ** in the main database of connection db. If successful, set (*ppOut) to 12602 ** point to the new object and return SQLITE_OK. Otherwise, return an 12603 ** SQLite error code and set (*ppOut) to NULL. In this case *pzErrmsg may be 12604 ** set to point to an error string. 12605 ** 12606 ** It is the responsibility of the caller to eventually free either the 12607 ** IdxTable object or error message using sqlite3_free(). 12608 */ 12609 static int idxGetTableInfo( 12610 sqlite3 *db, /* Database connection to read details from */ 12611 const char *zTab, /* Table name */ 12612 IdxTable **ppOut, /* OUT: New object (if successful) */ 12613 char **pzErrmsg /* OUT: Error message (if not) */ 12614 ){ 12615 sqlite3_stmt *p1 = 0; 12616 int nCol = 0; 12617 int nTab; 12618 int nByte; 12619 IdxTable *pNew = 0; 12620 int rc, rc2; 12621 char *pCsr = 0; 12622 int nPk = 0; 12623 12624 *ppOut = 0; 12625 if( zTab==0 ) return SQLITE_ERROR; 12626 nTab = STRLEN(zTab); 12627 nByte = sizeof(IdxTable) + nTab + 1; 12628 rc = idxPrintfPrepareStmt(db, &p1, pzErrmsg, "PRAGMA table_xinfo=%Q", zTab); 12629 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){ 12630 const char *zCol = (const char*)sqlite3_column_text(p1, 1); 12631 const char *zColSeq = 0; 12632 if( zCol==0 ){ 12633 rc = SQLITE_ERROR; 12634 break; 12635 } 12636 nByte += 1 + STRLEN(zCol); 12637 rc = sqlite3_table_column_metadata( 12638 db, "main", zTab, zCol, 0, &zColSeq, 0, 0, 0 12639 ); 12640 if( zColSeq==0 ) zColSeq = "binary"; 12641 nByte += 1 + STRLEN(zColSeq); 12642 nCol++; 12643 nPk += (sqlite3_column_int(p1, 5)>0); 12644 } 12645 rc2 = sqlite3_reset(p1); 12646 if( rc==SQLITE_OK ) rc = rc2; 12647 12648 nByte += sizeof(IdxColumn) * nCol; 12649 if( rc==SQLITE_OK ){ 12650 pNew = idxMalloc(&rc, nByte); 12651 } 12652 if( rc==SQLITE_OK ){ 12653 pNew->aCol = (IdxColumn*)&pNew[1]; 12654 pNew->nCol = nCol; 12655 pCsr = (char*)&pNew->aCol[nCol]; 12656 } 12657 12658 nCol = 0; 12659 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){ 12660 const char *zCol = (const char*)sqlite3_column_text(p1, 1); 12661 const char *zColSeq = 0; 12662 int nCopy; 12663 if( zCol==0 ) continue; 12664 nCopy = STRLEN(zCol) + 1; 12665 pNew->aCol[nCol].zName = pCsr; 12666 pNew->aCol[nCol].iPk = (sqlite3_column_int(p1, 5)==1 && nPk==1); 12667 memcpy(pCsr, zCol, nCopy); 12668 pCsr += nCopy; 12669 12670 rc = sqlite3_table_column_metadata( 12671 db, "main", zTab, zCol, 0, &zColSeq, 0, 0, 0 12672 ); 12673 if( rc==SQLITE_OK ){ 12674 if( zColSeq==0 ) zColSeq = "binary"; 12675 nCopy = STRLEN(zColSeq) + 1; 12676 pNew->aCol[nCol].zColl = pCsr; 12677 memcpy(pCsr, zColSeq, nCopy); 12678 pCsr += nCopy; 12679 } 12680 12681 nCol++; 12682 } 12683 idxFinalize(&rc, p1); 12684 12685 if( rc!=SQLITE_OK ){ 12686 sqlite3_free(pNew); 12687 pNew = 0; 12688 }else if( ALWAYS(pNew!=0) ){ 12689 pNew->zName = pCsr; 12690 if( ALWAYS(pNew->zName!=0) ) memcpy(pNew->zName, zTab, nTab+1); 12691 } 12692 12693 *ppOut = pNew; 12694 return rc; 12695 } 12696 12697 /* 12698 ** This function is a no-op if *pRc is set to anything other than 12699 ** SQLITE_OK when it is called. 12700 ** 12701 ** If *pRc is initially set to SQLITE_OK, then the text specified by 12702 ** the printf() style arguments is appended to zIn and the result returned 12703 ** in a buffer allocated by sqlite3_malloc(). sqlite3_free() is called on 12704 ** zIn before returning. 12705 */ 12706 static char *idxAppendText(int *pRc, char *zIn, const char *zFmt, ...){ 12707 va_list ap; 12708 char *zAppend = 0; 12709 char *zRet = 0; 12710 int nIn = zIn ? STRLEN(zIn) : 0; 12711 int nAppend = 0; 12712 va_start(ap, zFmt); 12713 if( *pRc==SQLITE_OK ){ 12714 zAppend = sqlite3_vmprintf(zFmt, ap); 12715 if( zAppend ){ 12716 nAppend = STRLEN(zAppend); 12717 zRet = (char*)sqlite3_malloc(nIn + nAppend + 1); 12718 } 12719 if( zAppend && zRet ){ 12720 if( nIn ) memcpy(zRet, zIn, nIn); 12721 memcpy(&zRet[nIn], zAppend, nAppend+1); 12722 }else{ 12723 sqlite3_free(zRet); 12724 zRet = 0; 12725 *pRc = SQLITE_NOMEM; 12726 } 12727 sqlite3_free(zAppend); 12728 sqlite3_free(zIn); 12729 } 12730 va_end(ap); 12731 return zRet; 12732 } 12733 12734 /* 12735 ** Return true if zId must be quoted in order to use it as an SQL 12736 ** identifier, or false otherwise. 12737 */ 12738 static int idxIdentifierRequiresQuotes(const char *zId){ 12739 int i; 12740 int nId = STRLEN(zId); 12741 12742 if( sqlite3_keyword_check(zId, nId) ) return 1; 12743 12744 for(i=0; zId[i]; i++){ 12745 if( !(zId[i]=='_') 12746 && !(zId[i]>='0' && zId[i]<='9') 12747 && !(zId[i]>='a' && zId[i]<='z') 12748 && !(zId[i]>='A' && zId[i]<='Z') 12749 ){ 12750 return 1; 12751 } 12752 } 12753 return 0; 12754 } 12755 12756 /* 12757 ** This function appends an index column definition suitable for constraint 12758 ** pCons to the string passed as zIn and returns the result. 12759 */ 12760 static char *idxAppendColDefn( 12761 int *pRc, /* IN/OUT: Error code */ 12762 char *zIn, /* Column defn accumulated so far */ 12763 IdxTable *pTab, /* Table index will be created on */ 12764 IdxConstraint *pCons 12765 ){ 12766 char *zRet = zIn; 12767 IdxColumn *p = &pTab->aCol[pCons->iCol]; 12768 if( zRet ) zRet = idxAppendText(pRc, zRet, ", "); 12769 12770 if( idxIdentifierRequiresQuotes(p->zName) ){ 12771 zRet = idxAppendText(pRc, zRet, "%Q", p->zName); 12772 }else{ 12773 zRet = idxAppendText(pRc, zRet, "%s", p->zName); 12774 } 12775 12776 if( sqlite3_stricmp(p->zColl, pCons->zColl) ){ 12777 if( idxIdentifierRequiresQuotes(pCons->zColl) ){ 12778 zRet = idxAppendText(pRc, zRet, " COLLATE %Q", pCons->zColl); 12779 }else{ 12780 zRet = idxAppendText(pRc, zRet, " COLLATE %s", pCons->zColl); 12781 } 12782 } 12783 12784 if( pCons->bDesc ){ 12785 zRet = idxAppendText(pRc, zRet, " DESC"); 12786 } 12787 return zRet; 12788 } 12789 12790 /* 12791 ** Search database dbm for an index compatible with the one idxCreateFromCons() 12792 ** would create from arguments pScan, pEq and pTail. If no error occurs and 12793 ** such an index is found, return non-zero. Or, if no such index is found, 12794 ** return zero. 12795 ** 12796 ** If an error occurs, set *pRc to an SQLite error code and return zero. 12797 */ 12798 static int idxFindCompatible( 12799 int *pRc, /* OUT: Error code */ 12800 sqlite3* dbm, /* Database to search */ 12801 IdxScan *pScan, /* Scan for table to search for index on */ 12802 IdxConstraint *pEq, /* List of == constraints */ 12803 IdxConstraint *pTail /* List of range constraints */ 12804 ){ 12805 const char *zTbl = pScan->pTab->zName; 12806 sqlite3_stmt *pIdxList = 0; 12807 IdxConstraint *pIter; 12808 int nEq = 0; /* Number of elements in pEq */ 12809 int rc; 12810 12811 /* Count the elements in list pEq */ 12812 for(pIter=pEq; pIter; pIter=pIter->pLink) nEq++; 12813 12814 rc = idxPrintfPrepareStmt(dbm, &pIdxList, 0, "PRAGMA index_list=%Q", zTbl); 12815 while( rc==SQLITE_OK && sqlite3_step(pIdxList)==SQLITE_ROW ){ 12816 int bMatch = 1; 12817 IdxConstraint *pT = pTail; 12818 sqlite3_stmt *pInfo = 0; 12819 const char *zIdx = (const char*)sqlite3_column_text(pIdxList, 1); 12820 if( zIdx==0 ) continue; 12821 12822 /* Zero the IdxConstraint.bFlag values in the pEq list */ 12823 for(pIter=pEq; pIter; pIter=pIter->pLink) pIter->bFlag = 0; 12824 12825 rc = idxPrintfPrepareStmt(dbm, &pInfo, 0, "PRAGMA index_xInfo=%Q", zIdx); 12826 while( rc==SQLITE_OK && sqlite3_step(pInfo)==SQLITE_ROW ){ 12827 int iIdx = sqlite3_column_int(pInfo, 0); 12828 int iCol = sqlite3_column_int(pInfo, 1); 12829 const char *zColl = (const char*)sqlite3_column_text(pInfo, 4); 12830 12831 if( iIdx<nEq ){ 12832 for(pIter=pEq; pIter; pIter=pIter->pLink){ 12833 if( pIter->bFlag ) continue; 12834 if( pIter->iCol!=iCol ) continue; 12835 if( sqlite3_stricmp(pIter->zColl, zColl) ) continue; 12836 pIter->bFlag = 1; 12837 break; 12838 } 12839 if( pIter==0 ){ 12840 bMatch = 0; 12841 break; 12842 } 12843 }else{ 12844 if( pT ){ 12845 if( pT->iCol!=iCol || sqlite3_stricmp(pT->zColl, zColl) ){ 12846 bMatch = 0; 12847 break; 12848 } 12849 pT = pT->pLink; 12850 } 12851 } 12852 } 12853 idxFinalize(&rc, pInfo); 12854 12855 if( rc==SQLITE_OK && bMatch ){ 12856 sqlite3_finalize(pIdxList); 12857 return 1; 12858 } 12859 } 12860 idxFinalize(&rc, pIdxList); 12861 12862 *pRc = rc; 12863 return 0; 12864 } 12865 12866 /* Callback for sqlite3_exec() with query with leading count(*) column. 12867 * The first argument is expected to be an int*, referent to be incremented 12868 * if that leading column is not exactly '0'. 12869 */ 12870 static int countNonzeros(void* pCount, int nc, 12871 char* azResults[], char* azColumns[]){ 12872 (void)azColumns; /* Suppress unused parameter warning */ 12873 if( nc>0 && (azResults[0][0]!='0' || azResults[0][1]!=0) ){ 12874 *((int *)pCount) += 1; 12875 } 12876 return 0; 12877 } 12878 12879 static int idxCreateFromCons( 12880 sqlite3expert *p, 12881 IdxScan *pScan, 12882 IdxConstraint *pEq, 12883 IdxConstraint *pTail 12884 ){ 12885 sqlite3 *dbm = p->dbm; 12886 int rc = SQLITE_OK; 12887 if( (pEq || pTail) && 0==idxFindCompatible(&rc, dbm, pScan, pEq, pTail) ){ 12888 IdxTable *pTab = pScan->pTab; 12889 char *zCols = 0; 12890 char *zIdx = 0; 12891 IdxConstraint *pCons; 12892 unsigned int h = 0; 12893 const char *zFmt; 12894 12895 for(pCons=pEq; pCons; pCons=pCons->pLink){ 12896 zCols = idxAppendColDefn(&rc, zCols, pTab, pCons); 12897 } 12898 for(pCons=pTail; pCons; pCons=pCons->pLink){ 12899 zCols = idxAppendColDefn(&rc, zCols, pTab, pCons); 12900 } 12901 12902 if( rc==SQLITE_OK ){ 12903 /* Hash the list of columns to come up with a name for the index */ 12904 const char *zTable = pScan->pTab->zName; 12905 int quoteTable = idxIdentifierRequiresQuotes(zTable); 12906 char *zName = 0; /* Index name */ 12907 int collisions = 0; 12908 do{ 12909 int i; 12910 char *zFind; 12911 for(i=0; zCols[i]; i++){ 12912 h += ((h<<3) + zCols[i]); 12913 } 12914 sqlite3_free(zName); 12915 zName = sqlite3_mprintf("%s_idx_%08x", zTable, h); 12916 if( zName==0 ) break; 12917 /* Is is unique among table, view and index names? */ 12918 zFmt = "SELECT count(*) FROM sqlite_schema WHERE name=%Q" 12919 " AND type in ('index','table','view')"; 12920 zFind = sqlite3_mprintf(zFmt, zName); 12921 i = 0; 12922 rc = sqlite3_exec(dbm, zFind, countNonzeros, &i, 0); 12923 assert(rc==SQLITE_OK); 12924 sqlite3_free(zFind); 12925 if( i==0 ){ 12926 collisions = 0; 12927 break; 12928 } 12929 ++collisions; 12930 }while( collisions<50 && zName!=0 ); 12931 if( collisions ){ 12932 /* This return means "Gave up trying to find a unique index name." */ 12933 rc = SQLITE_BUSY_TIMEOUT; 12934 }else if( zName==0 ){ 12935 rc = SQLITE_NOMEM; 12936 }else{ 12937 if( quoteTable ){ 12938 zFmt = "CREATE INDEX \"%w\" ON \"%w\"(%s)"; 12939 }else{ 12940 zFmt = "CREATE INDEX %s ON %s(%s)"; 12941 } 12942 zIdx = sqlite3_mprintf(zFmt, zName, zTable, zCols); 12943 if( !zIdx ){ 12944 rc = SQLITE_NOMEM; 12945 }else{ 12946 rc = sqlite3_exec(dbm, zIdx, 0, 0, p->pzErrmsg); 12947 if( rc!=SQLITE_OK ){ 12948 rc = SQLITE_BUSY_TIMEOUT; 12949 }else{ 12950 idxHashAdd(&rc, &p->hIdx, zName, zIdx); 12951 } 12952 } 12953 sqlite3_free(zName); 12954 sqlite3_free(zIdx); 12955 } 12956 } 12957 12958 sqlite3_free(zCols); 12959 } 12960 return rc; 12961 } 12962 12963 /* 12964 ** Return true if list pList (linked by IdxConstraint.pLink) contains 12965 ** a constraint compatible with *p. Otherwise return false. 12966 */ 12967 static int idxFindConstraint(IdxConstraint *pList, IdxConstraint *p){ 12968 IdxConstraint *pCmp; 12969 for(pCmp=pList; pCmp; pCmp=pCmp->pLink){ 12970 if( p->iCol==pCmp->iCol ) return 1; 12971 } 12972 return 0; 12973 } 12974 12975 static int idxCreateFromWhere( 12976 sqlite3expert *p, 12977 IdxScan *pScan, /* Create indexes for this scan */ 12978 IdxConstraint *pTail /* range/ORDER BY constraints for inclusion */ 12979 ){ 12980 IdxConstraint *p1 = 0; 12981 IdxConstraint *pCon; 12982 int rc; 12983 12984 /* Gather up all the == constraints. */ 12985 for(pCon=pScan->pEq; pCon; pCon=pCon->pNext){ 12986 if( !idxFindConstraint(p1, pCon) && !idxFindConstraint(pTail, pCon) ){ 12987 pCon->pLink = p1; 12988 p1 = pCon; 12989 } 12990 } 12991 12992 /* Create an index using the == constraints collected above. And the 12993 ** range constraint/ORDER BY terms passed in by the caller, if any. */ 12994 rc = idxCreateFromCons(p, pScan, p1, pTail); 12995 12996 /* If no range/ORDER BY passed by the caller, create a version of the 12997 ** index for each range constraint. */ 12998 if( pTail==0 ){ 12999 for(pCon=pScan->pRange; rc==SQLITE_OK && pCon; pCon=pCon->pNext){ 13000 assert( pCon->pLink==0 ); 13001 if( !idxFindConstraint(p1, pCon) && !idxFindConstraint(pTail, pCon) ){ 13002 rc = idxCreateFromCons(p, pScan, p1, pCon); 13003 } 13004 } 13005 } 13006 13007 return rc; 13008 } 13009 13010 /* 13011 ** Create candidate indexes in database [dbm] based on the data in 13012 ** linked-list pScan. 13013 */ 13014 static int idxCreateCandidates(sqlite3expert *p){ 13015 int rc = SQLITE_OK; 13016 IdxScan *pIter; 13017 13018 for(pIter=p->pScan; pIter && rc==SQLITE_OK; pIter=pIter->pNextScan){ 13019 rc = idxCreateFromWhere(p, pIter, 0); 13020 if( rc==SQLITE_OK && pIter->pOrder ){ 13021 rc = idxCreateFromWhere(p, pIter, pIter->pOrder); 13022 } 13023 } 13024 13025 return rc; 13026 } 13027 13028 /* 13029 ** Free all elements of the linked list starting at pConstraint. 13030 */ 13031 static void idxConstraintFree(IdxConstraint *pConstraint){ 13032 IdxConstraint *pNext; 13033 IdxConstraint *p; 13034 13035 for(p=pConstraint; p; p=pNext){ 13036 pNext = p->pNext; 13037 sqlite3_free(p); 13038 } 13039 } 13040 13041 /* 13042 ** Free all elements of the linked list starting from pScan up until pLast 13043 ** (pLast is not freed). 13044 */ 13045 static void idxScanFree(IdxScan *pScan, IdxScan *pLast){ 13046 IdxScan *p; 13047 IdxScan *pNext; 13048 for(p=pScan; p!=pLast; p=pNext){ 13049 pNext = p->pNextScan; 13050 idxConstraintFree(p->pOrder); 13051 idxConstraintFree(p->pEq); 13052 idxConstraintFree(p->pRange); 13053 sqlite3_free(p); 13054 } 13055 } 13056 13057 /* 13058 ** Free all elements of the linked list starting from pStatement up 13059 ** until pLast (pLast is not freed). 13060 */ 13061 static void idxStatementFree(IdxStatement *pStatement, IdxStatement *pLast){ 13062 IdxStatement *p; 13063 IdxStatement *pNext; 13064 for(p=pStatement; p!=pLast; p=pNext){ 13065 pNext = p->pNext; 13066 sqlite3_free(p->zEQP); 13067 sqlite3_free(p->zIdx); 13068 sqlite3_free(p); 13069 } 13070 } 13071 13072 /* 13073 ** Free the linked list of IdxTable objects starting at pTab. 13074 */ 13075 static void idxTableFree(IdxTable *pTab){ 13076 IdxTable *pIter; 13077 IdxTable *pNext; 13078 for(pIter=pTab; pIter; pIter=pNext){ 13079 pNext = pIter->pNext; 13080 sqlite3_free(pIter); 13081 } 13082 } 13083 13084 /* 13085 ** Free the linked list of IdxWrite objects starting at pTab. 13086 */ 13087 static void idxWriteFree(IdxWrite *pTab){ 13088 IdxWrite *pIter; 13089 IdxWrite *pNext; 13090 for(pIter=pTab; pIter; pIter=pNext){ 13091 pNext = pIter->pNext; 13092 sqlite3_free(pIter); 13093 } 13094 } 13095 13096 13097 13098 /* 13099 ** This function is called after candidate indexes have been created. It 13100 ** runs all the queries to see which indexes they prefer, and populates 13101 ** IdxStatement.zIdx and IdxStatement.zEQP with the results. 13102 */ 13103 static int idxFindIndexes( 13104 sqlite3expert *p, 13105 char **pzErr /* OUT: Error message (sqlite3_malloc) */ 13106 ){ 13107 IdxStatement *pStmt; 13108 sqlite3 *dbm = p->dbm; 13109 int rc = SQLITE_OK; 13110 13111 IdxHash hIdx; 13112 idxHashInit(&hIdx); 13113 13114 for(pStmt=p->pStatement; rc==SQLITE_OK && pStmt; pStmt=pStmt->pNext){ 13115 IdxHashEntry *pEntry; 13116 sqlite3_stmt *pExplain = 0; 13117 idxHashClear(&hIdx); 13118 rc = idxPrintfPrepareStmt(dbm, &pExplain, pzErr, 13119 "EXPLAIN QUERY PLAN %s", pStmt->zSql 13120 ); 13121 while( rc==SQLITE_OK && sqlite3_step(pExplain)==SQLITE_ROW ){ 13122 /* int iId = sqlite3_column_int(pExplain, 0); */ 13123 /* int iParent = sqlite3_column_int(pExplain, 1); */ 13124 /* int iNotUsed = sqlite3_column_int(pExplain, 2); */ 13125 const char *zDetail = (const char*)sqlite3_column_text(pExplain, 3); 13126 int nDetail; 13127 int i; 13128 13129 if( !zDetail ) continue; 13130 nDetail = STRLEN(zDetail); 13131 13132 for(i=0; i<nDetail; i++){ 13133 const char *zIdx = 0; 13134 if( i+13<nDetail && memcmp(&zDetail[i], " USING INDEX ", 13)==0 ){ 13135 zIdx = &zDetail[i+13]; 13136 }else if( i+22<nDetail 13137 && memcmp(&zDetail[i], " USING COVERING INDEX ", 22)==0 13138 ){ 13139 zIdx = &zDetail[i+22]; 13140 } 13141 if( zIdx ){ 13142 const char *zSql; 13143 int nIdx = 0; 13144 while( zIdx[nIdx]!='\0' && (zIdx[nIdx]!=' ' || zIdx[nIdx+1]!='(') ){ 13145 nIdx++; 13146 } 13147 zSql = idxHashSearch(&p->hIdx, zIdx, nIdx); 13148 if( zSql ){ 13149 idxHashAdd(&rc, &hIdx, zSql, 0); 13150 if( rc ) goto find_indexes_out; 13151 } 13152 break; 13153 } 13154 } 13155 13156 if( zDetail[0]!='-' ){ 13157 pStmt->zEQP = idxAppendText(&rc, pStmt->zEQP, "%s\n", zDetail); 13158 } 13159 } 13160 13161 for(pEntry=hIdx.pFirst; pEntry; pEntry=pEntry->pNext){ 13162 pStmt->zIdx = idxAppendText(&rc, pStmt->zIdx, "%s;\n", pEntry->zKey); 13163 } 13164 13165 idxFinalize(&rc, pExplain); 13166 } 13167 13168 find_indexes_out: 13169 idxHashClear(&hIdx); 13170 return rc; 13171 } 13172 13173 static int idxAuthCallback( 13174 void *pCtx, 13175 int eOp, 13176 const char *z3, 13177 const char *z4, 13178 const char *zDb, 13179 const char *zTrigger 13180 ){ 13181 int rc = SQLITE_OK; 13182 (void)z4; 13183 (void)zTrigger; 13184 if( eOp==SQLITE_INSERT || eOp==SQLITE_UPDATE || eOp==SQLITE_DELETE ){ 13185 if( sqlite3_stricmp(zDb, "main")==0 ){ 13186 sqlite3expert *p = (sqlite3expert*)pCtx; 13187 IdxTable *pTab; 13188 for(pTab=p->pTable; pTab; pTab=pTab->pNext){ 13189 if( 0==sqlite3_stricmp(z3, pTab->zName) ) break; 13190 } 13191 if( pTab ){ 13192 IdxWrite *pWrite; 13193 for(pWrite=p->pWrite; pWrite; pWrite=pWrite->pNext){ 13194 if( pWrite->pTab==pTab && pWrite->eOp==eOp ) break; 13195 } 13196 if( pWrite==0 ){ 13197 pWrite = idxMalloc(&rc, sizeof(IdxWrite)); 13198 if( rc==SQLITE_OK ){ 13199 pWrite->pTab = pTab; 13200 pWrite->eOp = eOp; 13201 pWrite->pNext = p->pWrite; 13202 p->pWrite = pWrite; 13203 } 13204 } 13205 } 13206 } 13207 } 13208 return rc; 13209 } 13210 13211 static int idxProcessOneTrigger( 13212 sqlite3expert *p, 13213 IdxWrite *pWrite, 13214 char **pzErr 13215 ){ 13216 static const char *zInt = UNIQUE_TABLE_NAME; 13217 static const char *zDrop = "DROP TABLE " UNIQUE_TABLE_NAME; 13218 IdxTable *pTab = pWrite->pTab; 13219 const char *zTab = pTab->zName; 13220 const char *zSql = 13221 "SELECT 'CREATE TEMP' || substr(sql, 7) FROM sqlite_schema " 13222 "WHERE tbl_name = %Q AND type IN ('table', 'trigger') " 13223 "ORDER BY type;"; 13224 sqlite3_stmt *pSelect = 0; 13225 int rc = SQLITE_OK; 13226 char *zWrite = 0; 13227 13228 /* Create the table and its triggers in the temp schema */ 13229 rc = idxPrintfPrepareStmt(p->db, &pSelect, pzErr, zSql, zTab, zTab); 13230 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSelect) ){ 13231 const char *zCreate = (const char*)sqlite3_column_text(pSelect, 0); 13232 if( zCreate==0 ) continue; 13233 rc = sqlite3_exec(p->dbv, zCreate, 0, 0, pzErr); 13234 } 13235 idxFinalize(&rc, pSelect); 13236 13237 /* Rename the table in the temp schema to zInt */ 13238 if( rc==SQLITE_OK ){ 13239 char *z = sqlite3_mprintf("ALTER TABLE temp.%Q RENAME TO %Q", zTab, zInt); 13240 if( z==0 ){ 13241 rc = SQLITE_NOMEM; 13242 }else{ 13243 rc = sqlite3_exec(p->dbv, z, 0, 0, pzErr); 13244 sqlite3_free(z); 13245 } 13246 } 13247 13248 switch( pWrite->eOp ){ 13249 case SQLITE_INSERT: { 13250 int i; 13251 zWrite = idxAppendText(&rc, zWrite, "INSERT INTO %Q VALUES(", zInt); 13252 for(i=0; i<pTab->nCol; i++){ 13253 zWrite = idxAppendText(&rc, zWrite, "%s?", i==0 ? "" : ", "); 13254 } 13255 zWrite = idxAppendText(&rc, zWrite, ")"); 13256 break; 13257 } 13258 case SQLITE_UPDATE: { 13259 int i; 13260 zWrite = idxAppendText(&rc, zWrite, "UPDATE %Q SET ", zInt); 13261 for(i=0; i<pTab->nCol; i++){ 13262 zWrite = idxAppendText(&rc, zWrite, "%s%Q=?", i==0 ? "" : ", ", 13263 pTab->aCol[i].zName 13264 ); 13265 } 13266 break; 13267 } 13268 default: { 13269 assert( pWrite->eOp==SQLITE_DELETE ); 13270 if( rc==SQLITE_OK ){ 13271 zWrite = sqlite3_mprintf("DELETE FROM %Q", zInt); 13272 if( zWrite==0 ) rc = SQLITE_NOMEM; 13273 } 13274 } 13275 } 13276 13277 if( rc==SQLITE_OK ){ 13278 sqlite3_stmt *pX = 0; 13279 rc = sqlite3_prepare_v2(p->dbv, zWrite, -1, &pX, 0); 13280 idxFinalize(&rc, pX); 13281 if( rc!=SQLITE_OK ){ 13282 idxDatabaseError(p->dbv, pzErr); 13283 } 13284 } 13285 sqlite3_free(zWrite); 13286 13287 if( rc==SQLITE_OK ){ 13288 rc = sqlite3_exec(p->dbv, zDrop, 0, 0, pzErr); 13289 } 13290 13291 return rc; 13292 } 13293 13294 static int idxProcessTriggers(sqlite3expert *p, char **pzErr){ 13295 int rc = SQLITE_OK; 13296 IdxWrite *pEnd = 0; 13297 IdxWrite *pFirst = p->pWrite; 13298 13299 while( rc==SQLITE_OK && pFirst!=pEnd ){ 13300 IdxWrite *pIter; 13301 for(pIter=pFirst; rc==SQLITE_OK && pIter!=pEnd; pIter=pIter->pNext){ 13302 rc = idxProcessOneTrigger(p, pIter, pzErr); 13303 } 13304 pEnd = pFirst; 13305 pFirst = p->pWrite; 13306 } 13307 13308 return rc; 13309 } 13310 13311 13312 static int idxCreateVtabSchema(sqlite3expert *p, char **pzErrmsg){ 13313 int rc = idxRegisterVtab(p); 13314 sqlite3_stmt *pSchema = 0; 13315 13316 /* For each table in the main db schema: 13317 ** 13318 ** 1) Add an entry to the p->pTable list, and 13319 ** 2) Create the equivalent virtual table in dbv. 13320 */ 13321 rc = idxPrepareStmt(p->db, &pSchema, pzErrmsg, 13322 "SELECT type, name, sql, 1 FROM sqlite_schema " 13323 "WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%%' " 13324 " UNION ALL " 13325 "SELECT type, name, sql, 2 FROM sqlite_schema " 13326 "WHERE type = 'trigger'" 13327 " AND tbl_name IN(SELECT name FROM sqlite_schema WHERE type = 'view') " 13328 "ORDER BY 4, 1" 13329 ); 13330 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSchema) ){ 13331 const char *zType = (const char*)sqlite3_column_text(pSchema, 0); 13332 const char *zName = (const char*)sqlite3_column_text(pSchema, 1); 13333 const char *zSql = (const char*)sqlite3_column_text(pSchema, 2); 13334 13335 if( zType==0 || zName==0 ) continue; 13336 if( zType[0]=='v' || zType[1]=='r' ){ 13337 if( zSql ) rc = sqlite3_exec(p->dbv, zSql, 0, 0, pzErrmsg); 13338 }else{ 13339 IdxTable *pTab; 13340 rc = idxGetTableInfo(p->db, zName, &pTab, pzErrmsg); 13341 if( rc==SQLITE_OK ){ 13342 int i; 13343 char *zInner = 0; 13344 char *zOuter = 0; 13345 pTab->pNext = p->pTable; 13346 p->pTable = pTab; 13347 13348 /* The statement the vtab will pass to sqlite3_declare_vtab() */ 13349 zInner = idxAppendText(&rc, 0, "CREATE TABLE x("); 13350 for(i=0; i<pTab->nCol; i++){ 13351 zInner = idxAppendText(&rc, zInner, "%s%Q COLLATE %s", 13352 (i==0 ? "" : ", "), pTab->aCol[i].zName, pTab->aCol[i].zColl 13353 ); 13354 } 13355 zInner = idxAppendText(&rc, zInner, ")"); 13356 13357 /* The CVT statement to create the vtab */ 13358 zOuter = idxAppendText(&rc, 0, 13359 "CREATE VIRTUAL TABLE %Q USING expert(%Q)", zName, zInner 13360 ); 13361 if( rc==SQLITE_OK ){ 13362 rc = sqlite3_exec(p->dbv, zOuter, 0, 0, pzErrmsg); 13363 } 13364 sqlite3_free(zInner); 13365 sqlite3_free(zOuter); 13366 } 13367 } 13368 } 13369 idxFinalize(&rc, pSchema); 13370 return rc; 13371 } 13372 13373 struct IdxSampleCtx { 13374 int iTarget; 13375 double target; /* Target nRet/nRow value */ 13376 double nRow; /* Number of rows seen */ 13377 double nRet; /* Number of rows returned */ 13378 }; 13379 13380 static void idxSampleFunc( 13381 sqlite3_context *pCtx, 13382 int argc, 13383 sqlite3_value **argv 13384 ){ 13385 struct IdxSampleCtx *p = (struct IdxSampleCtx*)sqlite3_user_data(pCtx); 13386 int bRet; 13387 13388 (void)argv; 13389 assert( argc==0 ); 13390 if( p->nRow==0.0 ){ 13391 bRet = 1; 13392 }else{ 13393 bRet = (p->nRet / p->nRow) <= p->target; 13394 if( bRet==0 ){ 13395 unsigned short rnd; 13396 sqlite3_randomness(2, (void*)&rnd); 13397 bRet = ((int)rnd % 100) <= p->iTarget; 13398 } 13399 } 13400 13401 sqlite3_result_int(pCtx, bRet); 13402 p->nRow += 1.0; 13403 p->nRet += (double)bRet; 13404 } 13405 13406 struct IdxRemCtx { 13407 int nSlot; 13408 struct IdxRemSlot { 13409 int eType; /* SQLITE_NULL, INTEGER, REAL, TEXT, BLOB */ 13410 i64 iVal; /* SQLITE_INTEGER value */ 13411 double rVal; /* SQLITE_FLOAT value */ 13412 int nByte; /* Bytes of space allocated at z */ 13413 int n; /* Size of buffer z */ 13414 char *z; /* SQLITE_TEXT/BLOB value */ 13415 } aSlot[1]; 13416 }; 13417 13418 /* 13419 ** Implementation of scalar function sqlite_expert_rem(). 13420 */ 13421 static void idxRemFunc( 13422 sqlite3_context *pCtx, 13423 int argc, 13424 sqlite3_value **argv 13425 ){ 13426 struct IdxRemCtx *p = (struct IdxRemCtx*)sqlite3_user_data(pCtx); 13427 struct IdxRemSlot *pSlot; 13428 int iSlot; 13429 assert( argc==2 ); 13430 13431 iSlot = sqlite3_value_int(argv[0]); 13432 assert( iSlot<p->nSlot ); 13433 pSlot = &p->aSlot[iSlot]; 13434 13435 switch( pSlot->eType ){ 13436 case SQLITE_NULL: 13437 /* no-op */ 13438 break; 13439 13440 case SQLITE_INTEGER: 13441 sqlite3_result_int64(pCtx, pSlot->iVal); 13442 break; 13443 13444 case SQLITE_FLOAT: 13445 sqlite3_result_double(pCtx, pSlot->rVal); 13446 break; 13447 13448 case SQLITE_BLOB: 13449 sqlite3_result_blob(pCtx, pSlot->z, pSlot->n, SQLITE_TRANSIENT); 13450 break; 13451 13452 case SQLITE_TEXT: 13453 sqlite3_result_text(pCtx, pSlot->z, pSlot->n, SQLITE_TRANSIENT); 13454 break; 13455 } 13456 13457 pSlot->eType = sqlite3_value_type(argv[1]); 13458 switch( pSlot->eType ){ 13459 case SQLITE_NULL: 13460 /* no-op */ 13461 break; 13462 13463 case SQLITE_INTEGER: 13464 pSlot->iVal = sqlite3_value_int64(argv[1]); 13465 break; 13466 13467 case SQLITE_FLOAT: 13468 pSlot->rVal = sqlite3_value_double(argv[1]); 13469 break; 13470 13471 case SQLITE_BLOB: 13472 case SQLITE_TEXT: { 13473 int nByte = sqlite3_value_bytes(argv[1]); 13474 const void *pData = 0; 13475 if( nByte>pSlot->nByte ){ 13476 char *zNew = (char*)sqlite3_realloc(pSlot->z, nByte*2); 13477 if( zNew==0 ){ 13478 sqlite3_result_error_nomem(pCtx); 13479 return; 13480 } 13481 pSlot->nByte = nByte*2; 13482 pSlot->z = zNew; 13483 } 13484 pSlot->n = nByte; 13485 if( pSlot->eType==SQLITE_BLOB ){ 13486 pData = sqlite3_value_blob(argv[1]); 13487 if( pData ) memcpy(pSlot->z, pData, nByte); 13488 }else{ 13489 pData = sqlite3_value_text(argv[1]); 13490 memcpy(pSlot->z, pData, nByte); 13491 } 13492 break; 13493 } 13494 } 13495 } 13496 13497 static int idxLargestIndex(sqlite3 *db, int *pnMax, char **pzErr){ 13498 int rc = SQLITE_OK; 13499 const char *zMax = 13500 "SELECT max(i.seqno) FROM " 13501 " sqlite_schema AS s, " 13502 " pragma_index_list(s.name) AS l, " 13503 " pragma_index_info(l.name) AS i " 13504 "WHERE s.type = 'table'"; 13505 sqlite3_stmt *pMax = 0; 13506 13507 *pnMax = 0; 13508 rc = idxPrepareStmt(db, &pMax, pzErr, zMax); 13509 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pMax) ){ 13510 *pnMax = sqlite3_column_int(pMax, 0) + 1; 13511 } 13512 idxFinalize(&rc, pMax); 13513 13514 return rc; 13515 } 13516 13517 static int idxPopulateOneStat1( 13518 sqlite3expert *p, 13519 sqlite3_stmt *pIndexXInfo, 13520 sqlite3_stmt *pWriteStat, 13521 const char *zTab, 13522 const char *zIdx, 13523 char **pzErr 13524 ){ 13525 char *zCols = 0; 13526 char *zOrder = 0; 13527 char *zQuery = 0; 13528 int nCol = 0; 13529 int i; 13530 sqlite3_stmt *pQuery = 0; 13531 int *aStat = 0; 13532 int rc = SQLITE_OK; 13533 13534 assert( p->iSample>0 ); 13535 13536 /* Formulate the query text */ 13537 sqlite3_bind_text(pIndexXInfo, 1, zIdx, -1, SQLITE_STATIC); 13538 while( SQLITE_OK==rc && SQLITE_ROW==sqlite3_step(pIndexXInfo) ){ 13539 const char *zComma = zCols==0 ? "" : ", "; 13540 const char *zName = (const char*)sqlite3_column_text(pIndexXInfo, 0); 13541 const char *zColl = (const char*)sqlite3_column_text(pIndexXInfo, 1); 13542 zCols = idxAppendText(&rc, zCols, 13543 "%sx.%Q IS sqlite_expert_rem(%d, x.%Q) COLLATE %s", 13544 zComma, zName, nCol, zName, zColl 13545 ); 13546 zOrder = idxAppendText(&rc, zOrder, "%s%d", zComma, ++nCol); 13547 } 13548 sqlite3_reset(pIndexXInfo); 13549 if( rc==SQLITE_OK ){ 13550 if( p->iSample==100 ){ 13551 zQuery = sqlite3_mprintf( 13552 "SELECT %s FROM %Q x ORDER BY %s", zCols, zTab, zOrder 13553 ); 13554 }else{ 13555 zQuery = sqlite3_mprintf( 13556 "SELECT %s FROM temp."UNIQUE_TABLE_NAME" x ORDER BY %s", zCols, zOrder 13557 ); 13558 } 13559 } 13560 sqlite3_free(zCols); 13561 sqlite3_free(zOrder); 13562 13563 /* Formulate the query text */ 13564 if( rc==SQLITE_OK ){ 13565 sqlite3 *dbrem = (p->iSample==100 ? p->db : p->dbv); 13566 rc = idxPrepareStmt(dbrem, &pQuery, pzErr, zQuery); 13567 } 13568 sqlite3_free(zQuery); 13569 13570 if( rc==SQLITE_OK ){ 13571 aStat = (int*)idxMalloc(&rc, sizeof(int)*(nCol+1)); 13572 } 13573 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pQuery) ){ 13574 IdxHashEntry *pEntry; 13575 char *zStat = 0; 13576 for(i=0; i<=nCol; i++) aStat[i] = 1; 13577 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pQuery) ){ 13578 aStat[0]++; 13579 for(i=0; i<nCol; i++){ 13580 if( sqlite3_column_int(pQuery, i)==0 ) break; 13581 } 13582 for(/*no-op*/; i<nCol; i++){ 13583 aStat[i+1]++; 13584 } 13585 } 13586 13587 if( rc==SQLITE_OK ){ 13588 int s0 = aStat[0]; 13589 zStat = sqlite3_mprintf("%d", s0); 13590 if( zStat==0 ) rc = SQLITE_NOMEM; 13591 for(i=1; rc==SQLITE_OK && i<=nCol; i++){ 13592 zStat = idxAppendText(&rc, zStat, " %d", (s0+aStat[i]/2) / aStat[i]); 13593 } 13594 } 13595 13596 if( rc==SQLITE_OK ){ 13597 sqlite3_bind_text(pWriteStat, 1, zTab, -1, SQLITE_STATIC); 13598 sqlite3_bind_text(pWriteStat, 2, zIdx, -1, SQLITE_STATIC); 13599 sqlite3_bind_text(pWriteStat, 3, zStat, -1, SQLITE_STATIC); 13600 sqlite3_step(pWriteStat); 13601 rc = sqlite3_reset(pWriteStat); 13602 } 13603 13604 pEntry = idxHashFind(&p->hIdx, zIdx, STRLEN(zIdx)); 13605 if( pEntry ){ 13606 assert( pEntry->zVal2==0 ); 13607 pEntry->zVal2 = zStat; 13608 }else{ 13609 sqlite3_free(zStat); 13610 } 13611 } 13612 sqlite3_free(aStat); 13613 idxFinalize(&rc, pQuery); 13614 13615 return rc; 13616 } 13617 13618 static int idxBuildSampleTable(sqlite3expert *p, const char *zTab){ 13619 int rc; 13620 char *zSql; 13621 13622 rc = sqlite3_exec(p->dbv,"DROP TABLE IF EXISTS temp."UNIQUE_TABLE_NAME,0,0,0); 13623 if( rc!=SQLITE_OK ) return rc; 13624 13625 zSql = sqlite3_mprintf( 13626 "CREATE TABLE temp." UNIQUE_TABLE_NAME " AS SELECT * FROM %Q", zTab 13627 ); 13628 if( zSql==0 ) return SQLITE_NOMEM; 13629 rc = sqlite3_exec(p->dbv, zSql, 0, 0, 0); 13630 sqlite3_free(zSql); 13631 13632 return rc; 13633 } 13634 13635 /* 13636 ** This function is called as part of sqlite3_expert_analyze(). Candidate 13637 ** indexes have already been created in database sqlite3expert.dbm, this 13638 ** function populates sqlite_stat1 table in the same database. 13639 ** 13640 ** The stat1 data is generated by querying the 13641 */ 13642 static int idxPopulateStat1(sqlite3expert *p, char **pzErr){ 13643 int rc = SQLITE_OK; 13644 int nMax =0; 13645 struct IdxRemCtx *pCtx = 0; 13646 struct IdxSampleCtx samplectx; 13647 int i; 13648 i64 iPrev = -100000; 13649 sqlite3_stmt *pAllIndex = 0; 13650 sqlite3_stmt *pIndexXInfo = 0; 13651 sqlite3_stmt *pWrite = 0; 13652 13653 const char *zAllIndex = 13654 "SELECT s.rowid, s.name, l.name FROM " 13655 " sqlite_schema AS s, " 13656 " pragma_index_list(s.name) AS l " 13657 "WHERE s.type = 'table'"; 13658 const char *zIndexXInfo = 13659 "SELECT name, coll FROM pragma_index_xinfo(?) WHERE key"; 13660 const char *zWrite = "INSERT INTO sqlite_stat1 VALUES(?, ?, ?)"; 13661 13662 /* If iSample==0, no sqlite_stat1 data is required. */ 13663 if( p->iSample==0 ) return SQLITE_OK; 13664 13665 rc = idxLargestIndex(p->dbm, &nMax, pzErr); 13666 if( nMax<=0 || rc!=SQLITE_OK ) return rc; 13667 13668 rc = sqlite3_exec(p->dbm, "ANALYZE; PRAGMA writable_schema=1", 0, 0, 0); 13669 13670 if( rc==SQLITE_OK ){ 13671 int nByte = sizeof(struct IdxRemCtx) + (sizeof(struct IdxRemSlot) * nMax); 13672 pCtx = (struct IdxRemCtx*)idxMalloc(&rc, nByte); 13673 } 13674 13675 if( rc==SQLITE_OK ){ 13676 sqlite3 *dbrem = (p->iSample==100 ? p->db : p->dbv); 13677 rc = sqlite3_create_function(dbrem, "sqlite_expert_rem", 13678 2, SQLITE_UTF8, (void*)pCtx, idxRemFunc, 0, 0 13679 ); 13680 } 13681 if( rc==SQLITE_OK ){ 13682 rc = sqlite3_create_function(p->db, "sqlite_expert_sample", 13683 0, SQLITE_UTF8, (void*)&samplectx, idxSampleFunc, 0, 0 13684 ); 13685 } 13686 13687 if( rc==SQLITE_OK ){ 13688 pCtx->nSlot = nMax+1; 13689 rc = idxPrepareStmt(p->dbm, &pAllIndex, pzErr, zAllIndex); 13690 } 13691 if( rc==SQLITE_OK ){ 13692 rc = idxPrepareStmt(p->dbm, &pIndexXInfo, pzErr, zIndexXInfo); 13693 } 13694 if( rc==SQLITE_OK ){ 13695 rc = idxPrepareStmt(p->dbm, &pWrite, pzErr, zWrite); 13696 } 13697 13698 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pAllIndex) ){ 13699 i64 iRowid = sqlite3_column_int64(pAllIndex, 0); 13700 const char *zTab = (const char*)sqlite3_column_text(pAllIndex, 1); 13701 const char *zIdx = (const char*)sqlite3_column_text(pAllIndex, 2); 13702 if( zTab==0 || zIdx==0 ) continue; 13703 if( p->iSample<100 && iPrev!=iRowid ){ 13704 samplectx.target = (double)p->iSample / 100.0; 13705 samplectx.iTarget = p->iSample; 13706 samplectx.nRow = 0.0; 13707 samplectx.nRet = 0.0; 13708 rc = idxBuildSampleTable(p, zTab); 13709 if( rc!=SQLITE_OK ) break; 13710 } 13711 rc = idxPopulateOneStat1(p, pIndexXInfo, pWrite, zTab, zIdx, pzErr); 13712 iPrev = iRowid; 13713 } 13714 if( rc==SQLITE_OK && p->iSample<100 ){ 13715 rc = sqlite3_exec(p->dbv, 13716 "DROP TABLE IF EXISTS temp." UNIQUE_TABLE_NAME, 0,0,0 13717 ); 13718 } 13719 13720 idxFinalize(&rc, pAllIndex); 13721 idxFinalize(&rc, pIndexXInfo); 13722 idxFinalize(&rc, pWrite); 13723 13724 if( pCtx ){ 13725 for(i=0; i<pCtx->nSlot; i++){ 13726 sqlite3_free(pCtx->aSlot[i].z); 13727 } 13728 sqlite3_free(pCtx); 13729 } 13730 13731 if( rc==SQLITE_OK ){ 13732 rc = sqlite3_exec(p->dbm, "ANALYZE sqlite_schema", 0, 0, 0); 13733 } 13734 13735 sqlite3_create_function(p->db, "sqlite_expert_rem", 2, SQLITE_UTF8, 0,0,0,0); 13736 sqlite3_create_function(p->db, "sqlite_expert_sample", 0,SQLITE_UTF8,0,0,0,0); 13737 13738 sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp."UNIQUE_TABLE_NAME,0,0,0); 13739 return rc; 13740 } 13741 13742 /* 13743 ** Define and possibly pretend to use a useless collation sequence. 13744 ** This pretense allows expert to accept SQL using custom collations. 13745 */ 13746 int dummyCompare(void *up1, int up2, const void *up3, int up4, const void *up5){ 13747 (void)up1; 13748 (void)up2; 13749 (void)up3; 13750 (void)up4; 13751 (void)up5; 13752 assert(0); /* VDBE should never be run. */ 13753 return 0; 13754 } 13755 /* And a callback to register above upon actual need */ 13756 void useDummyCS(void *up1, sqlite3 *db, int etr, const char *zName){ 13757 (void)up1; 13758 sqlite3_create_collation_v2(db, zName, etr, 0, dummyCompare, 0); 13759 } 13760 13761 #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) \ 13762 && !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS) 13763 /* 13764 ** dummy functions for no-op implementation of UDFs during expert's work 13765 */ 13766 void dummyUDF(sqlite3_context *up1, int up2, sqlite3_value **up3){ 13767 (void)up1; 13768 (void)up2; 13769 (void)up3; 13770 assert(0); /* VDBE should never be run. */ 13771 } 13772 void dummyUDFvalue(sqlite3_context *up1){ 13773 (void)up1; 13774 assert(0); /* VDBE should never be run. */ 13775 } 13776 13777 /* 13778 ** Register UDFs from user database with another. 13779 */ 13780 int registerUDFs(sqlite3 *dbSrc, sqlite3 *dbDst){ 13781 sqlite3_stmt *pStmt; 13782 int rc = sqlite3_prepare_v2(dbSrc, 13783 "SELECT name,type,enc,narg,flags " 13784 "FROM pragma_function_list() " 13785 "WHERE builtin==0", -1, &pStmt, 0); 13786 if( rc==SQLITE_OK ){ 13787 while( SQLITE_ROW==(rc = sqlite3_step(pStmt)) ){ 13788 int nargs = sqlite3_column_int(pStmt,3); 13789 int flags = sqlite3_column_int(pStmt,4); 13790 const char *name = (char*)sqlite3_column_text(pStmt,0); 13791 const char *type = (char*)sqlite3_column_text(pStmt,1); 13792 const char *enc = (char*)sqlite3_column_text(pStmt,2); 13793 if( name==0 || type==0 || enc==0 ){ 13794 /* no-op. Only happens on OOM */ 13795 }else{ 13796 int ienc = SQLITE_UTF8; 13797 int rcf = SQLITE_ERROR; 13798 if( strcmp(enc,"utf16le")==0 ) ienc = SQLITE_UTF16LE; 13799 else if( strcmp(enc,"utf16be")==0 ) ienc = SQLITE_UTF16BE; 13800 ienc |= (flags & (SQLITE_DETERMINISTIC|SQLITE_DIRECTONLY)); 13801 if( strcmp(type,"w")==0 ){ 13802 rcf = sqlite3_create_window_function(dbDst,name,nargs,ienc,0, 13803 dummyUDF,dummyUDFvalue,0,0,0); 13804 }else if( strcmp(type,"a")==0 ){ 13805 rcf = sqlite3_create_function(dbDst,name,nargs,ienc,0, 13806 0,dummyUDF,dummyUDFvalue); 13807 }else if( strcmp(type,"s")==0 ){ 13808 rcf = sqlite3_create_function(dbDst,name,nargs,ienc,0, 13809 dummyUDF,0,0); 13810 } 13811 if( rcf!=SQLITE_OK ){ 13812 rc = rcf; 13813 break; 13814 } 13815 } 13816 } 13817 sqlite3_finalize(pStmt); 13818 if( rc==SQLITE_DONE ) rc = SQLITE_OK; 13819 } 13820 return rc; 13821 } 13822 #endif 13823 13824 /* 13825 ** Allocate a new sqlite3expert object. 13826 */ 13827 sqlite3expert *sqlite3_expert_new(sqlite3 *db, char **pzErrmsg){ 13828 int rc = SQLITE_OK; 13829 sqlite3expert *pNew; 13830 13831 pNew = (sqlite3expert*)idxMalloc(&rc, sizeof(sqlite3expert)); 13832 13833 /* Open two in-memory databases to work with. The "vtab database" (dbv) 13834 ** will contain a virtual table corresponding to each real table in 13835 ** the user database schema, and a copy of each view. It is used to 13836 ** collect information regarding the WHERE, ORDER BY and other clauses 13837 ** of the user's query. 13838 */ 13839 if( rc==SQLITE_OK ){ 13840 pNew->db = db; 13841 pNew->iSample = 100; 13842 rc = sqlite3_open(":memory:", &pNew->dbv); 13843 } 13844 if( rc==SQLITE_OK ){ 13845 rc = sqlite3_open(":memory:", &pNew->dbm); 13846 if( rc==SQLITE_OK ){ 13847 sqlite3_db_config(pNew->dbm, SQLITE_DBCONFIG_TRIGGER_EQP, 1, (int*)0); 13848 } 13849 } 13850 13851 /* Allow custom collations to be dealt with through prepare. */ 13852 if( rc==SQLITE_OK ) rc = sqlite3_collation_needed(pNew->dbm,0,useDummyCS); 13853 if( rc==SQLITE_OK ) rc = sqlite3_collation_needed(pNew->dbv,0,useDummyCS); 13854 13855 #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) \ 13856 && !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS) 13857 /* Register UDFs from database [db] with [dbm] and [dbv]. */ 13858 if( rc==SQLITE_OK ){ 13859 rc = registerUDFs(pNew->db, pNew->dbm); 13860 } 13861 if( rc==SQLITE_OK ){ 13862 rc = registerUDFs(pNew->db, pNew->dbv); 13863 } 13864 #endif 13865 13866 /* Copy the entire schema of database [db] into [dbm]. */ 13867 if( rc==SQLITE_OK ){ 13868 sqlite3_stmt *pSql = 0; 13869 rc = idxPrintfPrepareStmt(pNew->db, &pSql, pzErrmsg, 13870 "SELECT sql FROM sqlite_schema WHERE name NOT LIKE 'sqlite_%%'" 13871 " AND sql NOT LIKE 'CREATE VIRTUAL %%' ORDER BY rowid" 13872 ); 13873 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){ 13874 const char *zSql = (const char*)sqlite3_column_text(pSql, 0); 13875 if( zSql ) rc = sqlite3_exec(pNew->dbm, zSql, 0, 0, pzErrmsg); 13876 } 13877 idxFinalize(&rc, pSql); 13878 } 13879 13880 /* Create the vtab schema */ 13881 if( rc==SQLITE_OK ){ 13882 rc = idxCreateVtabSchema(pNew, pzErrmsg); 13883 } 13884 13885 /* Register the auth callback with dbv */ 13886 if( rc==SQLITE_OK ){ 13887 sqlite3_set_authorizer(pNew->dbv, idxAuthCallback, (void*)pNew); 13888 } 13889 13890 /* If an error has occurred, free the new object and reutrn NULL. Otherwise, 13891 ** return the new sqlite3expert handle. */ 13892 if( rc!=SQLITE_OK ){ 13893 sqlite3_expert_destroy(pNew); 13894 pNew = 0; 13895 } 13896 return pNew; 13897 } 13898 13899 /* 13900 ** Configure an sqlite3expert object. 13901 */ 13902 int sqlite3_expert_config(sqlite3expert *p, int op, ...){ 13903 int rc = SQLITE_OK; 13904 va_list ap; 13905 va_start(ap, op); 13906 switch( op ){ 13907 case EXPERT_CONFIG_SAMPLE: { 13908 int iVal = va_arg(ap, int); 13909 if( iVal<0 ) iVal = 0; 13910 if( iVal>100 ) iVal = 100; 13911 p->iSample = iVal; 13912 break; 13913 } 13914 default: 13915 rc = SQLITE_NOTFOUND; 13916 break; 13917 } 13918 13919 va_end(ap); 13920 return rc; 13921 } 13922 13923 /* 13924 ** Add an SQL statement to the analysis. 13925 */ 13926 int sqlite3_expert_sql( 13927 sqlite3expert *p, /* From sqlite3_expert_new() */ 13928 const char *zSql, /* SQL statement to add */ 13929 char **pzErr /* OUT: Error message (if any) */ 13930 ){ 13931 IdxScan *pScanOrig = p->pScan; 13932 IdxStatement *pStmtOrig = p->pStatement; 13933 int rc = SQLITE_OK; 13934 const char *zStmt = zSql; 13935 13936 if( p->bRun ) return SQLITE_MISUSE; 13937 13938 while( rc==SQLITE_OK && zStmt && zStmt[0] ){ 13939 sqlite3_stmt *pStmt = 0; 13940 /* Ensure that the provided statement compiles against user's DB. */ 13941 rc = idxPrepareStmt(p->db, &pStmt, pzErr, zStmt); 13942 if( rc!=SQLITE_OK ) break; 13943 sqlite3_finalize(pStmt); 13944 rc = sqlite3_prepare_v2(p->dbv, zStmt, -1, &pStmt, &zStmt); 13945 if( rc==SQLITE_OK ){ 13946 if( pStmt ){ 13947 IdxStatement *pNew; 13948 const char *z = sqlite3_sql(pStmt); 13949 int n = STRLEN(z); 13950 pNew = (IdxStatement*)idxMalloc(&rc, sizeof(IdxStatement) + n+1); 13951 if( rc==SQLITE_OK ){ 13952 pNew->zSql = (char*)&pNew[1]; 13953 memcpy(pNew->zSql, z, n+1); 13954 pNew->pNext = p->pStatement; 13955 if( p->pStatement ) pNew->iId = p->pStatement->iId+1; 13956 p->pStatement = pNew; 13957 } 13958 sqlite3_finalize(pStmt); 13959 } 13960 }else{ 13961 idxDatabaseError(p->dbv, pzErr); 13962 } 13963 } 13964 13965 if( rc!=SQLITE_OK ){ 13966 idxScanFree(p->pScan, pScanOrig); 13967 idxStatementFree(p->pStatement, pStmtOrig); 13968 p->pScan = pScanOrig; 13969 p->pStatement = pStmtOrig; 13970 } 13971 13972 return rc; 13973 } 13974 13975 int sqlite3_expert_analyze(sqlite3expert *p, char **pzErr){ 13976 int rc; 13977 IdxHashEntry *pEntry; 13978 13979 /* Do trigger processing to collect any extra IdxScan structures */ 13980 rc = idxProcessTriggers(p, pzErr); 13981 13982 /* Create candidate indexes within the in-memory database file */ 13983 if( rc==SQLITE_OK ){ 13984 rc = idxCreateCandidates(p); 13985 }else if ( rc==SQLITE_BUSY_TIMEOUT ){ 13986 if( pzErr ) 13987 *pzErr = sqlite3_mprintf("Cannot find a unique index name to propose."); 13988 return rc; 13989 } 13990 13991 /* Generate the stat1 data */ 13992 if( rc==SQLITE_OK ){ 13993 rc = idxPopulateStat1(p, pzErr); 13994 } 13995 13996 /* Formulate the EXPERT_REPORT_CANDIDATES text */ 13997 for(pEntry=p->hIdx.pFirst; pEntry; pEntry=pEntry->pNext){ 13998 p->zCandidates = idxAppendText(&rc, p->zCandidates, 13999 "%s;%s%s\n", pEntry->zVal, 14000 pEntry->zVal2 ? " -- stat1: " : "", pEntry->zVal2 14001 ); 14002 } 14003 14004 /* Figure out which of the candidate indexes are preferred by the query 14005 ** planner and report the results to the user. */ 14006 if( rc==SQLITE_OK ){ 14007 rc = idxFindIndexes(p, pzErr); 14008 } 14009 14010 if( rc==SQLITE_OK ){ 14011 p->bRun = 1; 14012 } 14013 return rc; 14014 } 14015 14016 /* 14017 ** Return the total number of statements that have been added to this 14018 ** sqlite3expert using sqlite3_expert_sql(). 14019 */ 14020 int sqlite3_expert_count(sqlite3expert *p){ 14021 int nRet = 0; 14022 if( p->pStatement ) nRet = p->pStatement->iId+1; 14023 return nRet; 14024 } 14025 14026 /* 14027 ** Return a component of the report. 14028 */ 14029 const char *sqlite3_expert_report(sqlite3expert *p, int iStmt, int eReport){ 14030 const char *zRet = 0; 14031 IdxStatement *pStmt; 14032 14033 if( p->bRun==0 ) return 0; 14034 for(pStmt=p->pStatement; pStmt && pStmt->iId!=iStmt; pStmt=pStmt->pNext); 14035 switch( eReport ){ 14036 case EXPERT_REPORT_SQL: 14037 if( pStmt ) zRet = pStmt->zSql; 14038 break; 14039 case EXPERT_REPORT_INDEXES: 14040 if( pStmt ) zRet = pStmt->zIdx; 14041 break; 14042 case EXPERT_REPORT_PLAN: 14043 if( pStmt ) zRet = pStmt->zEQP; 14044 break; 14045 case EXPERT_REPORT_CANDIDATES: 14046 zRet = p->zCandidates; 14047 break; 14048 } 14049 return zRet; 14050 } 14051 14052 /* 14053 ** Free an sqlite3expert object. 14054 */ 14055 void sqlite3_expert_destroy(sqlite3expert *p){ 14056 if( p ){ 14057 sqlite3_close(p->dbm); 14058 sqlite3_close(p->dbv); 14059 idxScanFree(p->pScan, 0); 14060 idxStatementFree(p->pStatement, 0); 14061 idxTableFree(p->pTable); 14062 idxWriteFree(p->pWrite); 14063 idxHashClear(&p->hIdx); 14064 sqlite3_free(p->zCandidates); 14065 sqlite3_free(p); 14066 } 14067 } 14068 14069 #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */ 14070 14071 /************************* End ../ext/expert/sqlite3expert.c ********************/ 14072 14073 /************************* Begin ../ext/intck/sqlite3intck.h ******************/ 14074 /* 14075 ** 2024-02-08 14076 ** 14077 ** The author disclaims copyright to this source code. In place of 14078 ** a legal notice, here is a blessing: 14079 ** 14080 ** May you do good and not evil. 14081 ** May you find forgiveness for yourself and forgive others. 14082 ** May you share freely, never taking more than you give. 14083 ** 14084 ************************************************************************* 14085 */ 14086 14087 /* 14088 ** Incremental Integrity-Check Extension 14089 ** ------------------------------------- 14090 ** 14091 ** This module contains code to check whether or not an SQLite database 14092 ** is well-formed or corrupt. This is the same task as performed by SQLite's 14093 ** built-in "PRAGMA integrity_check" command. This module differs from 14094 ** "PRAGMA integrity_check" in that: 14095 ** 14096 ** + It is less thorough - this module does not detect certain types 14097 ** of corruption that are detected by the PRAGMA command. However, 14098 ** it does detect all kinds of corruption that are likely to cause 14099 ** errors in SQLite applications. 14100 ** 14101 ** + It is slower. Sometimes up to three times slower. 14102 ** 14103 ** + It allows integrity-check operations to be split into multiple 14104 ** transactions, so that the database does not need to be read-locked 14105 ** for the duration of the integrity-check. 14106 ** 14107 ** One way to use the API to run integrity-check on the "main" database 14108 ** of handle db is: 14109 ** 14110 ** int rc = SQLITE_OK; 14111 ** sqlite3_intck *p = 0; 14112 ** 14113 ** sqlite3_intck_open(db, "main", &p); 14114 ** while( SQLITE_OK==sqlite3_intck_step(p) ){ 14115 ** const char *zMsg = sqlite3_intck_message(p); 14116 ** if( zMsg ) printf("corruption: %s\n", zMsg); 14117 ** } 14118 ** rc = sqlite3_intck_error(p, &zErr); 14119 ** if( rc!=SQLITE_OK ){ 14120 ** printf("error occured (rc=%d), (errmsg=%s)\n", rc, zErr); 14121 ** } 14122 ** sqlite3_intck_close(p); 14123 ** 14124 ** Usually, the sqlite3_intck object opens a read transaction within the 14125 ** first call to sqlite3_intck_step() and holds it open until the 14126 ** integrity-check is complete. However, if sqlite3_intck_unlock() is 14127 ** called, the read transaction is ended and a new read transaction opened 14128 ** by the subsequent call to sqlite3_intck_step(). 14129 */ 14130 14131 #ifndef _SQLITE_INTCK_H 14132 #define _SQLITE_INTCK_H 14133 14134 /* #include "sqlite3.h" */ 14135 14136 #ifdef __cplusplus 14137 extern "C" { 14138 #endif 14139 14140 /* 14141 ** An ongoing incremental integrity-check operation is represented by an 14142 ** opaque pointer of the following type. 14143 */ 14144 typedef struct sqlite3_intck sqlite3_intck; 14145 14146 /* 14147 ** Open a new incremental integrity-check object. If successful, populate 14148 ** output variable (*ppOut) with the new object handle and return SQLITE_OK. 14149 ** Or, if an error occurs, set (*ppOut) to NULL and return an SQLite error 14150 ** code (e.g. SQLITE_NOMEM). 14151 ** 14152 ** The integrity-check will be conducted on database zDb (which must be "main", 14153 ** "temp", or the name of an attached database) of database handle db. Once 14154 ** this function has been called successfully, the caller should not use 14155 ** database handle db until the integrity-check object has been destroyed 14156 ** using sqlite3_intck_close(). 14157 */ 14158 int sqlite3_intck_open( 14159 sqlite3 *db, /* Database handle */ 14160 const char *zDb, /* Database name ("main", "temp" etc.) */ 14161 sqlite3_intck **ppOut /* OUT: New sqlite3_intck handle */ 14162 ); 14163 14164 /* 14165 ** Close and release all resources associated with a handle opened by an 14166 ** earlier call to sqlite3_intck_open(). The results of using an 14167 ** integrity-check handle after it has been passed to this function are 14168 ** undefined. 14169 */ 14170 void sqlite3_intck_close(sqlite3_intck *pCk); 14171 14172 /* 14173 ** Do the next step of the integrity-check operation specified by the handle 14174 ** passed as the only argument. This function returns SQLITE_DONE if the 14175 ** integrity-check operation is finished, or an SQLite error code if 14176 ** an error occurs, or SQLITE_OK if no error occurs but the integrity-check 14177 ** is not finished. It is not considered an error if database corruption 14178 ** is encountered. 14179 ** 14180 ** Following a successful call to sqlite3_intck_step() (one that returns 14181 ** SQLITE_OK), sqlite3_intck_message() returns a non-NULL value if 14182 ** corruption was detected in the db. 14183 ** 14184 ** If an error occurs and a value other than SQLITE_OK or SQLITE_DONE is 14185 ** returned, then the integrity-check handle is placed in an error state. 14186 ** In this state all subsequent calls to sqlite3_intck_step() or 14187 ** sqlite3_intck_unlock() will immediately return the same error. The 14188 ** sqlite3_intck_error() method may be used to obtain an English language 14189 ** error message in this case. 14190 */ 14191 int sqlite3_intck_step(sqlite3_intck *pCk); 14192 14193 /* 14194 ** If the previous call to sqlite3_intck_step() encountered corruption 14195 ** within the database, then this function returns a pointer to a buffer 14196 ** containing a nul-terminated string describing the corruption in 14197 ** English. If the previous call to sqlite3_intck_step() did not encounter 14198 ** corruption, or if there was no previous call, this function returns 14199 ** NULL. 14200 */ 14201 const char *sqlite3_intck_message(sqlite3_intck *pCk); 14202 14203 /* 14204 ** Close any read-transaction opened by an earlier call to 14205 ** sqlite3_intck_step(). Any subsequent call to sqlite3_intck_step() will 14206 ** open a new transaction. Return SQLITE_OK if successful, or an SQLite error 14207 ** code otherwise. 14208 ** 14209 ** If an error occurs, then the integrity-check handle is placed in an error 14210 ** state. In this state all subsequent calls to sqlite3_intck_step() or 14211 ** sqlite3_intck_unlock() will immediately return the same error. The 14212 ** sqlite3_intck_error() method may be used to obtain an English language 14213 ** error message in this case. 14214 */ 14215 int sqlite3_intck_unlock(sqlite3_intck *pCk); 14216 14217 /* 14218 ** If an error has occurred in an earlier call to sqlite3_intck_step() 14219 ** or sqlite3_intck_unlock(), then this method returns the associated 14220 ** SQLite error code. Additionally, if pzErr is not NULL, then (*pzErr) 14221 ** may be set to point to a nul-terminated string containing an English 14222 ** language error message. Or, if no error message is available, to 14223 ** NULL. 14224 ** 14225 ** If no error has occurred within sqlite3_intck_step() or 14226 ** sqlite_intck_unlock() calls on the handle passed as the first argument, 14227 ** then SQLITE_OK is returned and (*pzErr) set to NULL. 14228 */ 14229 int sqlite3_intck_error(sqlite3_intck *pCk, const char **pzErr); 14230 14231 /* 14232 ** This API is used for testing only. It returns the full-text of an SQL 14233 ** statement used to test object zObj, which may be a table or index. 14234 ** The returned buffer is valid until the next call to either this function 14235 ** or sqlite3_intck_close() on the same sqlite3_intck handle. 14236 */ 14237 const char *sqlite3_intck_test_sql(sqlite3_intck *pCk, const char *zObj); 14238 14239 14240 #ifdef __cplusplus 14241 } /* end of the 'extern "C"' block */ 14242 #endif 14243 14244 #endif /* ifndef _SQLITE_INTCK_H */ 14245 14246 /************************* End ../ext/intck/sqlite3intck.h ********************/ 14247 /************************* Begin ../ext/intck/sqlite3intck.c ******************/ 14248 /* 14249 ** 2024-02-08 14250 ** 14251 ** The author disclaims copyright to this source code. In place of 14252 ** a legal notice, here is a blessing: 14253 ** 14254 ** May you do good and not evil. 14255 ** May you find forgiveness for yourself and forgive others. 14256 ** May you share freely, never taking more than you give. 14257 ** 14258 ************************************************************************* 14259 */ 14260 14261 /* #include "sqlite3intck.h" */ 14262 #include <string.h> 14263 #include <assert.h> 14264 14265 #include <stdio.h> 14266 #include <stdlib.h> 14267 14268 /* 14269 ** nKeyVal: 14270 ** The number of values that make up the 'key' for the current pCheck 14271 ** statement. 14272 ** 14273 ** rc: 14274 ** Error code returned by most recent sqlite3_intck_step() or 14275 ** sqlite3_intck_unlock() call. This is set to SQLITE_DONE when 14276 ** the integrity-check operation is finished. 14277 ** 14278 ** zErr: 14279 ** If the object has entered the error state, this is the error message. 14280 ** Is freed using sqlite3_free() when the object is deleted. 14281 ** 14282 ** zTestSql: 14283 ** The value returned by the most recent call to sqlite3_intck_testsql(). 14284 ** Each call to testsql() frees the previous zTestSql value (using 14285 ** sqlite3_free()) and replaces it with the new value it will return. 14286 */ 14287 struct sqlite3_intck { 14288 sqlite3 *db; 14289 const char *zDb; /* Copy of zDb parameter to _open() */ 14290 char *zObj; /* Current object. Or NULL. */ 14291 14292 sqlite3_stmt *pCheck; /* Current check statement */ 14293 char *zKey; 14294 int nKeyVal; 14295 14296 char *zMessage; 14297 int bCorruptSchema; 14298 14299 int rc; /* Error code */ 14300 char *zErr; /* Error message */ 14301 char *zTestSql; /* Returned by sqlite3_intck_test_sql() */ 14302 }; 14303 14304 14305 /* 14306 ** Some error has occurred while using database p->db. Save the error message 14307 ** and error code currently held by the database handle in p->rc and p->zErr. 14308 */ 14309 static void intckSaveErrmsg(sqlite3_intck *p){ 14310 p->rc = sqlite3_errcode(p->db); 14311 sqlite3_free(p->zErr); 14312 p->zErr = sqlite3_mprintf("%s", sqlite3_errmsg(p->db)); 14313 } 14314 14315 /* 14316 ** If the handle passed as the first argument is already in the error state, 14317 ** then this function is a no-op (returns NULL immediately). Otherwise, if an 14318 ** error occurs within this function, it leaves an error in said handle. 14319 ** 14320 ** Otherwise, this function attempts to prepare SQL statement zSql and 14321 ** return the resulting statement handle to the user. 14322 */ 14323 static sqlite3_stmt *intckPrepare(sqlite3_intck *p, const char *zSql){ 14324 sqlite3_stmt *pRet = 0; 14325 if( p->rc==SQLITE_OK ){ 14326 p->rc = sqlite3_prepare_v2(p->db, zSql, -1, &pRet, 0); 14327 if( p->rc!=SQLITE_OK ){ 14328 intckSaveErrmsg(p); 14329 assert( pRet==0 ); 14330 } 14331 } 14332 return pRet; 14333 } 14334 14335 /* 14336 ** If the handle passed as the first argument is already in the error state, 14337 ** then this function is a no-op (returns NULL immediately). Otherwise, if an 14338 ** error occurs within this function, it leaves an error in said handle. 14339 ** 14340 ** Otherwise, this function treats argument zFmt as a printf() style format 14341 ** string. It formats it according to the trailing arguments and then 14342 ** attempts to prepare the results and return the resulting prepared 14343 ** statement. 14344 */ 14345 static sqlite3_stmt *intckPrepareFmt(sqlite3_intck *p, const char *zFmt, ...){ 14346 sqlite3_stmt *pRet = 0; 14347 va_list ap; 14348 char *zSql = 0; 14349 va_start(ap, zFmt); 14350 zSql = sqlite3_vmprintf(zFmt, ap); 14351 if( p->rc==SQLITE_OK && zSql==0 ){ 14352 p->rc = SQLITE_NOMEM; 14353 } 14354 pRet = intckPrepare(p, zSql); 14355 sqlite3_free(zSql); 14356 va_end(ap); 14357 return pRet; 14358 } 14359 14360 /* 14361 ** Finalize SQL statement pStmt. If an error occurs and the handle passed 14362 ** as the first argument does not already contain an error, store the 14363 ** error in the handle. 14364 */ 14365 static void intckFinalize(sqlite3_intck *p, sqlite3_stmt *pStmt){ 14366 int rc = sqlite3_finalize(pStmt); 14367 if( p->rc==SQLITE_OK && rc!=SQLITE_OK ){ 14368 intckSaveErrmsg(p); 14369 } 14370 } 14371 14372 /* 14373 ** If there is already an error in handle p, return it. Otherwise, call 14374 ** sqlite3_step() on the statement handle and return that value. 14375 */ 14376 static int intckStep(sqlite3_intck *p, sqlite3_stmt *pStmt){ 14377 if( p->rc ) return p->rc; 14378 return sqlite3_step(pStmt); 14379 } 14380 14381 /* 14382 ** Execute SQL statement zSql. There is no way to obtain any results 14383 ** returned by the statement. This function uses the sqlite3_intck error 14384 ** code convention. 14385 */ 14386 static void intckExec(sqlite3_intck *p, const char *zSql){ 14387 sqlite3_stmt *pStmt = 0; 14388 pStmt = intckPrepare(p, zSql); 14389 intckStep(p, pStmt); 14390 intckFinalize(p, pStmt); 14391 } 14392 14393 /* 14394 ** A wrapper around sqlite3_mprintf() that uses the sqlite3_intck error 14395 ** code convention. 14396 */ 14397 static char *intckMprintf(sqlite3_intck *p, const char *zFmt, ...){ 14398 va_list ap; 14399 char *zRet = 0; 14400 va_start(ap, zFmt); 14401 zRet = sqlite3_vmprintf(zFmt, ap); 14402 if( p->rc==SQLITE_OK ){ 14403 if( zRet==0 ){ 14404 p->rc = SQLITE_NOMEM; 14405 } 14406 }else{ 14407 sqlite3_free(zRet); 14408 zRet = 0; 14409 } 14410 return zRet; 14411 } 14412 14413 /* 14414 ** This is used by sqlite3_intck_unlock() to save the vector key value 14415 ** required to restart the current pCheck query as a nul-terminated string 14416 ** in p->zKey. 14417 */ 14418 static void intckSaveKey(sqlite3_intck *p){ 14419 int ii; 14420 char *zSql = 0; 14421 sqlite3_stmt *pStmt = 0; 14422 sqlite3_stmt *pXinfo = 0; 14423 const char *zDir = 0; 14424 14425 assert( p->pCheck ); 14426 assert( p->zKey==0 ); 14427 14428 pXinfo = intckPrepareFmt(p, 14429 "SELECT group_concat(desc, '') FROM %Q.sqlite_schema s, " 14430 "pragma_index_xinfo(%Q, %Q) " 14431 "WHERE s.type='index' AND s.name=%Q", 14432 p->zDb, p->zObj, p->zDb, p->zObj 14433 ); 14434 if( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pXinfo) ){ 14435 zDir = (const char*)sqlite3_column_text(pXinfo, 0); 14436 } 14437 14438 if( zDir==0 ){ 14439 /* Object is a table, not an index. This is the easy case,as there are 14440 ** no DESC columns or NULL values in a primary key. */ 14441 const char *zSep = "SELECT '(' || "; 14442 for(ii=0; ii<p->nKeyVal; ii++){ 14443 zSql = intckMprintf(p, "%z%squote(?)", zSql, zSep); 14444 zSep = " || ', ' || "; 14445 } 14446 zSql = intckMprintf(p, "%z || ')'", zSql); 14447 }else{ 14448 14449 /* Object is an index. */ 14450 assert( p->nKeyVal>1 ); 14451 for(ii=p->nKeyVal; ii>0; ii--){ 14452 int bLastIsDesc = zDir[ii-1]=='1'; 14453 int bLastIsNull = sqlite3_column_type(p->pCheck, ii)==SQLITE_NULL; 14454 const char *zLast = sqlite3_column_name(p->pCheck, ii); 14455 char *zLhs = 0; 14456 char *zRhs = 0; 14457 char *zWhere = 0; 14458 14459 if( bLastIsNull ){ 14460 if( bLastIsDesc ) continue; 14461 zWhere = intckMprintf(p, "'%s IS NOT NULL'", zLast); 14462 }else{ 14463 const char *zOp = bLastIsDesc ? "<" : ">"; 14464 zWhere = intckMprintf(p, "'%s %s ' || quote(?%d)", zLast, zOp, ii); 14465 } 14466 14467 if( ii>1 ){ 14468 const char *zLhsSep = ""; 14469 const char *zRhsSep = ""; 14470 int jj; 14471 for(jj=0; jj<ii-1; jj++){ 14472 const char *zAlias = (const char*)sqlite3_column_name(p->pCheck,jj+1); 14473 zLhs = intckMprintf(p, "%z%s%s", zLhs, zLhsSep, zAlias); 14474 zRhs = intckMprintf(p, "%z%squote(?%d)", zRhs, zRhsSep, jj+1); 14475 zLhsSep = ","; 14476 zRhsSep = " || ',' || "; 14477 } 14478 14479 zWhere = intckMprintf(p, 14480 "'(%z) IS (' || %z || ') AND ' || %z", 14481 zLhs, zRhs, zWhere); 14482 } 14483 zWhere = intckMprintf(p, "'WHERE ' || %z", zWhere); 14484 14485 zSql = intckMprintf(p, "%z%s(quote( %z ) )", 14486 zSql, 14487 (zSql==0 ? "VALUES" : ",\n "), 14488 zWhere 14489 ); 14490 } 14491 zSql = intckMprintf(p, 14492 "WITH wc(q) AS (\n%z\n)" 14493 "SELECT 'VALUES' || group_concat('(' || q || ')', ',\n ') FROM wc" 14494 , zSql 14495 ); 14496 } 14497 14498 pStmt = intckPrepare(p, zSql); 14499 if( p->rc==SQLITE_OK ){ 14500 for(ii=0; ii<p->nKeyVal; ii++){ 14501 sqlite3_bind_value(pStmt, ii+1, sqlite3_column_value(p->pCheck, ii+1)); 14502 } 14503 if( SQLITE_ROW==sqlite3_step(pStmt) ){ 14504 p->zKey = intckMprintf(p,"%s",(const char*)sqlite3_column_text(pStmt, 0)); 14505 } 14506 intckFinalize(p, pStmt); 14507 } 14508 14509 sqlite3_free(zSql); 14510 intckFinalize(p, pXinfo); 14511 } 14512 14513 /* 14514 ** Find the next database object (table or index) to check. If successful, 14515 ** set sqlite3_intck.zObj to point to a nul-terminated buffer containing 14516 ** the object's name before returning. 14517 */ 14518 static void intckFindObject(sqlite3_intck *p){ 14519 sqlite3_stmt *pStmt = 0; 14520 char *zPrev = p->zObj; 14521 p->zObj = 0; 14522 14523 assert( p->rc==SQLITE_OK ); 14524 assert( p->pCheck==0 ); 14525 14526 pStmt = intckPrepareFmt(p, 14527 "WITH tables(table_name) AS (" 14528 " SELECT name" 14529 " FROM %Q.sqlite_schema WHERE (type='table' OR type='index') AND rootpage" 14530 " UNION ALL " 14531 " SELECT 'sqlite_schema'" 14532 ")" 14533 "SELECT table_name FROM tables " 14534 "WHERE ?1 IS NULL OR table_name%s?1 " 14535 "ORDER BY 1" 14536 , p->zDb, (p->zKey ? ">=" : ">") 14537 ); 14538 14539 if( p->rc==SQLITE_OK ){ 14540 sqlite3_bind_text(pStmt, 1, zPrev, -1, SQLITE_TRANSIENT); 14541 if( sqlite3_step(pStmt)==SQLITE_ROW ){ 14542 p->zObj = intckMprintf(p,"%s",(const char*)sqlite3_column_text(pStmt, 0)); 14543 } 14544 } 14545 intckFinalize(p, pStmt); 14546 14547 /* If this is a new object, ensure the previous key value is cleared. */ 14548 if( sqlite3_stricmp(p->zObj, zPrev) ){ 14549 sqlite3_free(p->zKey); 14550 p->zKey = 0; 14551 } 14552 14553 sqlite3_free(zPrev); 14554 } 14555 14556 /* 14557 ** Return the size in bytes of the first token in nul-terminated buffer z. 14558 ** For the purposes of this call, a token is either: 14559 ** 14560 ** * a quoted SQL string, 14561 * * a contiguous series of ascii alphabet characters, or 14562 * * any other single byte. 14563 */ 14564 static int intckGetToken(const char *z){ 14565 char c = z[0]; 14566 int iRet = 1; 14567 if( c=='\'' || c=='"' || c=='`' ){ 14568 while( 1 ){ 14569 if( z[iRet]==c ){ 14570 iRet++; 14571 if( z[iRet]!=c ) break; 14572 } 14573 iRet++; 14574 } 14575 } 14576 else if( c=='[' ){ 14577 while( z[iRet++]!=']' && z[iRet] ); 14578 } 14579 else if( (c>='A' && c<='Z') || (c>='a' && c<='z') ){ 14580 while( (z[iRet]>='A' && z[iRet]<='Z') || (z[iRet]>='a' && z[iRet]<='z') ){ 14581 iRet++; 14582 } 14583 } 14584 14585 return iRet; 14586 } 14587 14588 /* 14589 ** Return true if argument c is an ascii whitespace character. 14590 */ 14591 static int intckIsSpace(char c){ 14592 return (c==' ' || c=='\t' || c=='\n' || c=='\r'); 14593 } 14594 14595 /* 14596 ** Argument z points to the text of a CREATE INDEX statement. This function 14597 ** identifies the part of the text that contains either the index WHERE 14598 ** clause (if iCol<0) or the iCol'th column of the index. 14599 ** 14600 ** If (iCol<0), the identified fragment does not include the "WHERE" keyword, 14601 ** only the expression that follows it. If (iCol>=0) then the identified 14602 ** fragment does not include any trailing sort-order keywords - "ASC" or 14603 ** "DESC". 14604 ** 14605 ** If the CREATE INDEX statement does not contain the requested field or 14606 ** clause, NULL is returned and (*pnByte) is set to 0. Otherwise, a pointer to 14607 ** the identified fragment is returned and output parameter (*pnByte) set 14608 ** to its size in bytes. 14609 */ 14610 static const char *intckParseCreateIndex(const char *z, int iCol, int *pnByte){ 14611 int iOff = 0; 14612 int iThisCol = 0; 14613 int iStart = 0; 14614 int nOpen = 0; 14615 14616 const char *zRet = 0; 14617 int nRet = 0; 14618 14619 int iEndOfCol = 0; 14620 14621 /* Skip forward until the first "(" token */ 14622 while( z[iOff]!='(' ){ 14623 iOff += intckGetToken(&z[iOff]); 14624 if( z[iOff]=='\0' ) return 0; 14625 } 14626 assert( z[iOff]=='(' ); 14627 14628 nOpen = 1; 14629 iOff++; 14630 iStart = iOff; 14631 while( z[iOff] ){ 14632 const char *zToken = &z[iOff]; 14633 int nToken = 0; 14634 14635 /* Check if this is the end of the current column - either a "," or ")" 14636 ** when nOpen==1. */ 14637 if( nOpen==1 ){ 14638 if( z[iOff]==',' || z[iOff]==')' ){ 14639 if( iCol==iThisCol ){ 14640 int iEnd = iEndOfCol ? iEndOfCol : iOff; 14641 nRet = (iEnd - iStart); 14642 zRet = &z[iStart]; 14643 break; 14644 } 14645 iStart = iOff+1; 14646 while( intckIsSpace(z[iStart]) ) iStart++; 14647 iThisCol++; 14648 } 14649 if( z[iOff]==')' ) break; 14650 } 14651 if( z[iOff]=='(' ) nOpen++; 14652 if( z[iOff]==')' ) nOpen--; 14653 nToken = intckGetToken(zToken); 14654 14655 if( (nToken==3 && 0==sqlite3_strnicmp(zToken, "ASC", nToken)) 14656 || (nToken==4 && 0==sqlite3_strnicmp(zToken, "DESC", nToken)) 14657 ){ 14658 iEndOfCol = iOff; 14659 }else if( 0==intckIsSpace(zToken[0]) ){ 14660 iEndOfCol = 0; 14661 } 14662 14663 iOff += nToken; 14664 } 14665 14666 /* iStart is now the byte offset of 1 byte passed the final ')' in the 14667 ** CREATE INDEX statement. Try to find a WHERE clause to return. */ 14668 while( zRet==0 && z[iOff] ){ 14669 int n = intckGetToken(&z[iOff]); 14670 if( n==5 && 0==sqlite3_strnicmp(&z[iOff], "where", 5) ){ 14671 zRet = &z[iOff+5]; 14672 nRet = (int)strlen(zRet); 14673 } 14674 iOff += n; 14675 } 14676 14677 /* Trim any whitespace from the start and end of the returned string. */ 14678 if( zRet ){ 14679 while( intckIsSpace(zRet[0]) ){ 14680 nRet--; 14681 zRet++; 14682 } 14683 while( nRet>0 && intckIsSpace(zRet[nRet-1]) ) nRet--; 14684 } 14685 14686 *pnByte = nRet; 14687 return zRet; 14688 } 14689 14690 /* 14691 ** User-defined SQL function wrapper for intckParseCreateIndex(): 14692 ** 14693 ** SELECT parse_create_index(<sql>, <icol>); 14694 */ 14695 static void intckParseCreateIndexFunc( 14696 sqlite3_context *pCtx, 14697 int nVal, 14698 sqlite3_value **apVal 14699 ){ 14700 const char *zSql = (const char*)sqlite3_value_text(apVal[0]); 14701 int idx = sqlite3_value_int(apVal[1]); 14702 const char *zRes = 0; 14703 int nRes = 0; 14704 14705 assert( nVal==2 ); 14706 if( zSql ){ 14707 zRes = intckParseCreateIndex(zSql, idx, &nRes); 14708 } 14709 sqlite3_result_text(pCtx, zRes, nRes, SQLITE_TRANSIENT); 14710 } 14711 14712 /* 14713 ** Return true if sqlite3_intck.db has automatic indexes enabled, false 14714 ** otherwise. 14715 */ 14716 static int intckGetAutoIndex(sqlite3_intck *p){ 14717 int bRet = 0; 14718 sqlite3_stmt *pStmt = 0; 14719 pStmt = intckPrepare(p, "PRAGMA automatic_index"); 14720 if( SQLITE_ROW==intckStep(p, pStmt) ){ 14721 bRet = sqlite3_column_int(pStmt, 0); 14722 } 14723 intckFinalize(p, pStmt); 14724 return bRet; 14725 } 14726 14727 /* 14728 ** Return true if zObj is an index, or false otherwise. 14729 */ 14730 static int intckIsIndex(sqlite3_intck *p, const char *zObj){ 14731 int bRet = 0; 14732 sqlite3_stmt *pStmt = 0; 14733 pStmt = intckPrepareFmt(p, 14734 "SELECT 1 FROM %Q.sqlite_schema WHERE name=%Q AND type='index'", 14735 p->zDb, zObj 14736 ); 14737 if( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ 14738 bRet = 1; 14739 } 14740 intckFinalize(p, pStmt); 14741 return bRet; 14742 } 14743 14744 /* 14745 ** Return a pointer to a nul-terminated buffer containing the SQL statement 14746 ** used to check database object zObj (a table or index) for corruption. 14747 ** If parameter zPrev is not NULL, then it must be a string containing the 14748 ** vector key required to restart the check where it left off last time. 14749 ** If pnKeyVal is not NULL, then (*pnKeyVal) is set to the number of 14750 ** columns in the vector key value for the specified object. 14751 ** 14752 ** This function uses the sqlite3_intck error code convention. 14753 */ 14754 static char *intckCheckObjectSql( 14755 sqlite3_intck *p, /* Integrity check object */ 14756 const char *zObj, /* Object (table or index) to scan */ 14757 const char *zPrev, /* Restart key vector, if any */ 14758 int *pnKeyVal /* OUT: Number of key-values for this scan */ 14759 ){ 14760 char *zRet = 0; 14761 sqlite3_stmt *pStmt = 0; 14762 int bAutoIndex = 0; 14763 int bIsIndex = 0; 14764 14765 const char *zCommon = 14766 /* Relation without_rowid also contains just one row. Column "b" is 14767 ** set to true if the table being examined is a WITHOUT ROWID table, 14768 ** or false otherwise. */ 14769 ", without_rowid(b) AS (" 14770 " SELECT EXISTS (" 14771 " SELECT 1 FROM tabname, pragma_index_list(tab, db) AS l" 14772 " WHERE origin='pk' " 14773 " AND NOT EXISTS (SELECT 1 FROM sqlite_schema WHERE name=l.name)" 14774 " )" 14775 ")" 14776 "" 14777 /* Table idx_cols contains 1 row for each column in each index on the 14778 ** table being checked. Columns are: 14779 ** 14780 ** idx_name: Name of the index. 14781 ** idx_ispk: True if this index is the PK of a WITHOUT ROWID table. 14782 ** col_name: Name of indexed column, or NULL for index on expression. 14783 ** col_expr: Indexed expression, including COLLATE clause. 14784 ** col_alias: Alias used for column in 'intck_wrapper' table. 14785 */ 14786 ", idx_cols(idx_name, idx_ispk, col_name, col_expr, col_alias) AS (" 14787 " SELECT l.name, (l.origin=='pk' AND w.b), i.name, COALESCE((" 14788 " SELECT parse_create_index(sql, i.seqno) FROM " 14789 " sqlite_schema WHERE name = l.name" 14790 " ), format('\"%w\"', i.name) || ' COLLATE ' || quote(i.coll))," 14791 " 'c' || row_number() OVER ()" 14792 " FROM " 14793 " tabname t," 14794 " without_rowid w," 14795 " pragma_index_list(t.tab, t.db) l," 14796 " pragma_index_xinfo(l.name) i" 14797 " WHERE i.key" 14798 " UNION ALL" 14799 " SELECT '', 1, '_rowid_', '_rowid_', 'r1' FROM without_rowid WHERE b=0" 14800 ")" 14801 "" 14802 "" 14803 /* 14804 ** For a PK declared as "PRIMARY KEY(a, b) ... WITHOUT ROWID", where 14805 ** the intck_wrapper aliases of "a" and "b" are "c1" and "c2": 14806 ** 14807 ** o_pk: "o.c1, o.c2" 14808 ** i_pk: "i.'a', i.'b'" 14809 ** ... 14810 ** n_pk: 2 14811 */ 14812 ", tabpk(db, tab, idx, o_pk, i_pk, q_pk, eq_pk, ps_pk, pk_pk, n_pk) AS (" 14813 " WITH pkfields(f, a) AS (" 14814 " SELECT i.col_name, i.col_alias FROM idx_cols i WHERE i.idx_ispk" 14815 " )" 14816 " SELECT t.db, t.tab, t.idx, " 14817 " group_concat(a, ', '), " 14818 " group_concat('i.'||quote(f), ', '), " 14819 " group_concat('quote(o.'||a||')', ' || '','' || '), " 14820 " format('(%s)==(%s)'," 14821 " group_concat('o.'||a, ', '), " 14822 " group_concat(format('\"%w\"', f), ', ')" 14823 " )," 14824 " group_concat('%s', ',')," 14825 " group_concat('quote('||a||')', ', '), " 14826 " count(*)" 14827 " FROM tabname t, pkfields" 14828 ")" 14829 "" 14830 ", idx(name, match_expr, partial, partial_alias, idx_ps, idx_idx) AS (" 14831 " SELECT idx_name," 14832 " format('(%s,%s) IS (%s,%s)', " 14833 " group_concat(i.col_expr, ', '), i_pk," 14834 " group_concat('o.'||i.col_alias, ', '), o_pk" 14835 " ), " 14836 " parse_create_index(" 14837 " (SELECT sql FROM sqlite_schema WHERE name=idx_name), -1" 14838 " )," 14839 " 'cond' || row_number() OVER ()" 14840 " , group_concat('%s', ',')" 14841 " , group_concat('quote('||i.col_alias||')', ', ')" 14842 " FROM tabpk t, " 14843 " without_rowid w," 14844 " idx_cols i" 14845 " WHERE i.idx_ispk==0 " 14846 " GROUP BY idx_name" 14847 ")" 14848 "" 14849 ", wrapper_with(s) AS (" 14850 " SELECT 'intck_wrapper AS (\n SELECT\n ' || (" 14851 " WITH f(a, b) AS (" 14852 " SELECT col_expr, col_alias FROM idx_cols" 14853 " UNION ALL " 14854 " SELECT partial, partial_alias FROM idx WHERE partial IS NOT NULL" 14855 " )" 14856 " SELECT group_concat(format('%s AS %s', a, b), ',\n ') FROM f" 14857 " )" 14858 " || format('\n FROM %Q.%Q ', t.db, t.tab)" 14859 /* If the object being checked is a table, append "NOT INDEXED". 14860 ** Otherwise, append "INDEXED BY <index>", and then, if the index 14861 ** is a partial index " WHERE <condition>". */ 14862 " || CASE WHEN t.idx IS NULL THEN " 14863 " 'NOT INDEXED'" 14864 " ELSE" 14865 " format('INDEXED BY %Q%s', t.idx, ' WHERE '||i.partial)" 14866 " END" 14867 " || '\n)'" 14868 " FROM tabname t LEFT JOIN idx i ON (i.name=t.idx)" 14869 ")" 14870 "" 14871 ; 14872 14873 bAutoIndex = intckGetAutoIndex(p); 14874 if( bAutoIndex ) intckExec(p, "PRAGMA automatic_index = 0"); 14875 14876 bIsIndex = intckIsIndex(p, zObj); 14877 if( bIsIndex ){ 14878 pStmt = intckPrepareFmt(p, 14879 /* Table idxname contains a single row. The first column, "db", contains 14880 ** the name of the db containing the table (e.g. "main") and the second, 14881 ** "tab", the name of the table itself. */ 14882 "WITH tabname(db, tab, idx) AS (" 14883 " SELECT %Q, (SELECT tbl_name FROM %Q.sqlite_schema WHERE name=%Q), %Q " 14884 ")" 14885 "" 14886 ", whereclause(w_c) AS (%s)" 14887 "" 14888 "%s" /* zCommon */ 14889 "" 14890 ", case_statement(c) AS (" 14891 " SELECT " 14892 " 'CASE WHEN (' || group_concat(col_alias, ', ') || ', 1) IS (\n' " 14893 " || ' SELECT ' || group_concat(col_expr, ', ') || ', 1 FROM '" 14894 " || format('%%Q.%%Q NOT INDEXED WHERE %%s\n', t.db, t.tab, p.eq_pk)" 14895 " || ' )\n THEN NULL\n '" 14896 " || 'ELSE format(''surplus entry ('" 14897 " || group_concat('%%s', ',') || ',' || p.ps_pk" 14898 " || ') in index ' || t.idx || ''', ' " 14899 " || group_concat('quote('||i.col_alias||')', ', ') || ', ' || p.pk_pk" 14900 " || ')'" 14901 " || '\n END AS error_message'" 14902 " FROM tabname t, tabpk p, idx_cols i WHERE i.idx_name=t.idx" 14903 ")" 14904 "" 14905 ", thiskey(k, n) AS (" 14906 " SELECT group_concat(i.col_alias, ', ') || ', ' || p.o_pk, " 14907 " count(*) + p.n_pk " 14908 " FROM tabpk p, idx_cols i WHERE i.idx_name=p.idx" 14909 ")" 14910 "" 14911 ", main_select(m, n) AS (" 14912 " SELECT format(" 14913 " 'WITH %%s\n' ||" 14914 " ', idx_checker AS (\n' ||" 14915 " ' SELECT %%s,\n' ||" 14916 " ' %%s\n' || " 14917 " ' FROM intck_wrapper AS o\n' ||" 14918 " ')\n'," 14919 " ww.s, c, t.k" 14920 " ), t.n" 14921 " FROM case_statement, wrapper_with ww, thiskey t" 14922 ")" 14923 14924 "SELECT m || " 14925 " group_concat('SELECT * FROM idx_checker ' || w_c, ' UNION ALL '), n" 14926 " FROM " 14927 "main_select, whereclause " 14928 , p->zDb, p->zDb, zObj, zObj 14929 , zPrev ? zPrev : "VALUES('')", zCommon 14930 ); 14931 }else{ 14932 pStmt = intckPrepareFmt(p, 14933 /* Table tabname contains a single row. The first column, "db", contains 14934 ** the name of the db containing the table (e.g. "main") and the second, 14935 ** "tab", the name of the table itself. */ 14936 "WITH tabname(db, tab, idx, prev) AS (SELECT %Q, %Q, NULL, %Q)" 14937 "" 14938 "%s" /* zCommon */ 14939 14940 /* expr(e) contains one row for each index on table zObj. Value e 14941 ** is set to an expression that evaluates to NULL if the required 14942 ** entry is present in the index, or an error message otherwise. */ 14943 ", expr(e, p) AS (" 14944 " SELECT format('CASE WHEN EXISTS \n" 14945 " (SELECT 1 FROM %%Q.%%Q AS i INDEXED BY %%Q WHERE %%s%%s)\n" 14946 " THEN NULL\n" 14947 " ELSE format(''entry (%%s,%%s) missing from index %%s'', %%s, %%s)\n" 14948 " END\n'" 14949 " , t.db, t.tab, i.name, i.match_expr, ' AND (' || partial || ')'," 14950 " i.idx_ps, t.ps_pk, i.name, i.idx_idx, t.pk_pk)," 14951 " CASE WHEN partial IS NULL THEN NULL ELSE i.partial_alias END" 14952 " FROM tabpk t, idx i" 14953 ")" 14954 14955 ", numbered(ii, cond, e) AS (" 14956 " SELECT 0, 'n.ii=0', 'NULL'" 14957 " UNION ALL " 14958 " SELECT row_number() OVER ()," 14959 " '(n.ii='||row_number() OVER ()||COALESCE(' AND '||p||')', ')'), e" 14960 " FROM expr" 14961 ")" 14962 14963 ", counter_with(w) AS (" 14964 " SELECT 'WITH intck_counter(ii) AS (\n ' || " 14965 " group_concat('SELECT '||ii, ' UNION ALL\n ') " 14966 " || '\n)' FROM numbered" 14967 ")" 14968 "" 14969 ", case_statement(c) AS (" 14970 " SELECT 'CASE ' || " 14971 " group_concat(format('\n WHEN %%s THEN (%%s)', cond, e), '') ||" 14972 " '\nEND AS error_message'" 14973 " FROM numbered" 14974 ")" 14975 "" 14976 14977 /* This table contains a single row consisting of a single value - 14978 ** the text of an SQL expression that may be used by the main SQL 14979 ** statement to output an SQL literal that can be used to resume 14980 ** the scan if it is suspended. e.g. for a rowid table, an expression 14981 ** like: 14982 ** 14983 ** format('(%d,%d)', _rowid_, n.ii) 14984 */ 14985 ", thiskey(k, n) AS (" 14986 " SELECT o_pk || ', ii', n_pk+1 FROM tabpk" 14987 ")" 14988 "" 14989 ", whereclause(w_c) AS (" 14990 " SELECT CASE WHEN prev!='' THEN " 14991 " '\nWHERE (' || o_pk ||', n.ii) > ' || prev" 14992 " ELSE ''" 14993 " END" 14994 " FROM tabpk, tabname" 14995 ")" 14996 "" 14997 ", main_select(m, n) AS (" 14998 " SELECT format(" 14999 " '%%s, %%s\nSELECT %%s,\n%%s\nFROM intck_wrapper AS o" 15000 ", intck_counter AS n%%s\nORDER BY %%s', " 15001 " w, ww.s, c, thiskey.k, whereclause.w_c, t.o_pk" 15002 " ), thiskey.n" 15003 " FROM case_statement, tabpk t, counter_with, " 15004 " wrapper_with ww, thiskey, whereclause" 15005 ")" 15006 15007 "SELECT m, n FROM main_select", 15008 p->zDb, zObj, zPrev, zCommon 15009 ); 15010 } 15011 15012 while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ 15013 zRet = intckMprintf(p, "%s", (const char*)sqlite3_column_text(pStmt, 0)); 15014 if( pnKeyVal ){ 15015 *pnKeyVal = sqlite3_column_int(pStmt, 1); 15016 } 15017 } 15018 intckFinalize(p, pStmt); 15019 15020 if( bAutoIndex ) intckExec(p, "PRAGMA automatic_index = 1"); 15021 return zRet; 15022 } 15023 15024 /* 15025 ** Open a new integrity-check object. 15026 */ 15027 int sqlite3_intck_open( 15028 sqlite3 *db, /* Database handle to operate on */ 15029 const char *zDbArg, /* "main", "temp" etc. */ 15030 sqlite3_intck **ppOut /* OUT: New integrity-check handle */ 15031 ){ 15032 sqlite3_intck *pNew = 0; 15033 int rc = SQLITE_OK; 15034 const char *zDb = zDbArg ? zDbArg : "main"; 15035 int nDb = (int)strlen(zDb); 15036 15037 pNew = (sqlite3_intck*)sqlite3_malloc(sizeof(*pNew) + nDb + 1); 15038 if( pNew==0 ){ 15039 rc = SQLITE_NOMEM; 15040 }else{ 15041 memset(pNew, 0, sizeof(*pNew)); 15042 pNew->db = db; 15043 pNew->zDb = (const char*)&pNew[1]; 15044 memcpy(&pNew[1], zDb, nDb+1); 15045 rc = sqlite3_create_function(db, "parse_create_index", 15046 2, SQLITE_UTF8, 0, intckParseCreateIndexFunc, 0, 0 15047 ); 15048 if( rc!=SQLITE_OK ){ 15049 sqlite3_intck_close(pNew); 15050 pNew = 0; 15051 } 15052 } 15053 15054 *ppOut = pNew; 15055 return rc; 15056 } 15057 15058 /* 15059 ** Free the integrity-check object. 15060 */ 15061 void sqlite3_intck_close(sqlite3_intck *p){ 15062 if( p ){ 15063 sqlite3_finalize(p->pCheck); 15064 sqlite3_create_function( 15065 p->db, "parse_create_index", 1, SQLITE_UTF8, 0, 0, 0, 0 15066 ); 15067 sqlite3_free(p->zObj); 15068 sqlite3_free(p->zKey); 15069 sqlite3_free(p->zTestSql); 15070 sqlite3_free(p->zErr); 15071 sqlite3_free(p->zMessage); 15072 sqlite3_free(p); 15073 } 15074 } 15075 15076 /* 15077 ** Step the integrity-check object. 15078 */ 15079 int sqlite3_intck_step(sqlite3_intck *p){ 15080 if( p->rc==SQLITE_OK ){ 15081 15082 if( p->zMessage ){ 15083 sqlite3_free(p->zMessage); 15084 p->zMessage = 0; 15085 } 15086 15087 if( p->bCorruptSchema ){ 15088 p->rc = SQLITE_DONE; 15089 }else 15090 if( p->pCheck==0 ){ 15091 intckFindObject(p); 15092 if( p->rc==SQLITE_OK ){ 15093 if( p->zObj ){ 15094 char *zSql = 0; 15095 zSql = intckCheckObjectSql(p, p->zObj, p->zKey, &p->nKeyVal); 15096 p->pCheck = intckPrepare(p, zSql); 15097 sqlite3_free(zSql); 15098 sqlite3_free(p->zKey); 15099 p->zKey = 0; 15100 }else{ 15101 p->rc = SQLITE_DONE; 15102 } 15103 }else if( p->rc==SQLITE_CORRUPT ){ 15104 p->rc = SQLITE_OK; 15105 p->zMessage = intckMprintf(p, "%s", 15106 "corruption found while reading database schema" 15107 ); 15108 p->bCorruptSchema = 1; 15109 } 15110 } 15111 15112 if( p->pCheck ){ 15113 assert( p->rc==SQLITE_OK ); 15114 if( sqlite3_step(p->pCheck)==SQLITE_ROW ){ 15115 /* Normal case, do nothing. */ 15116 }else{ 15117 intckFinalize(p, p->pCheck); 15118 p->pCheck = 0; 15119 p->nKeyVal = 0; 15120 if( p->rc==SQLITE_CORRUPT ){ 15121 p->rc = SQLITE_OK; 15122 p->zMessage = intckMprintf(p, 15123 "corruption found while scanning database object %s", p->zObj 15124 ); 15125 } 15126 } 15127 } 15128 } 15129 15130 return p->rc; 15131 } 15132 15133 /* 15134 ** Return a message describing the corruption encountered by the most recent 15135 ** call to sqlite3_intck_step(), or NULL if no corruption was encountered. 15136 */ 15137 const char *sqlite3_intck_message(sqlite3_intck *p){ 15138 assert( p->pCheck==0 || p->zMessage==0 ); 15139 if( p->zMessage ){ 15140 return p->zMessage; 15141 } 15142 if( p->pCheck ){ 15143 return (const char*)sqlite3_column_text(p->pCheck, 0); 15144 } 15145 return 0; 15146 } 15147 15148 /* 15149 ** Return the error code and message. 15150 */ 15151 int sqlite3_intck_error(sqlite3_intck *p, const char **pzErr){ 15152 if( pzErr ) *pzErr = p->zErr; 15153 return (p->rc==SQLITE_DONE ? SQLITE_OK : p->rc); 15154 } 15155 15156 /* 15157 ** Close any read transaction the integrity-check object is holding open 15158 ** on the database. 15159 */ 15160 int sqlite3_intck_unlock(sqlite3_intck *p){ 15161 if( p->rc==SQLITE_OK && p->pCheck ){ 15162 assert( p->zKey==0 && p->nKeyVal>0 ); 15163 intckSaveKey(p); 15164 intckFinalize(p, p->pCheck); 15165 p->pCheck = 0; 15166 } 15167 return p->rc; 15168 } 15169 15170 /* 15171 ** Return the SQL statement used to check object zObj. Or, if zObj is 15172 ** NULL, the current SQL statement. 15173 */ 15174 const char *sqlite3_intck_test_sql(sqlite3_intck *p, const char *zObj){ 15175 sqlite3_free(p->zTestSql); 15176 if( zObj ){ 15177 p->zTestSql = intckCheckObjectSql(p, zObj, 0, 0); 15178 }else{ 15179 if( p->zObj ){ 15180 p->zTestSql = intckCheckObjectSql(p, p->zObj, p->zKey, 0); 15181 }else{ 15182 sqlite3_free(p->zTestSql); 15183 p->zTestSql = 0; 15184 } 15185 } 15186 return p->zTestSql; 15187 } 15188 15189 /************************* End ../ext/intck/sqlite3intck.c ********************/ 15190 15191 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) 15192 #define SQLITE_SHELL_HAVE_RECOVER 1 15193 #else 15194 #define SQLITE_SHELL_HAVE_RECOVER 0 15195 #endif 15196 #if SQLITE_SHELL_HAVE_RECOVER 15197 /************************* Begin ../ext/recover/sqlite3recover.h ******************/ 15198 /* 15199 ** 2022-08-27 15200 ** 15201 ** The author disclaims copyright to this source code. In place of 15202 ** a legal notice, here is a blessing: 15203 ** 15204 ** May you do good and not evil. 15205 ** May you find forgiveness for yourself and forgive others. 15206 ** May you share freely, never taking more than you give. 15207 ** 15208 ************************************************************************* 15209 ** 15210 ** This file contains the public interface to the "recover" extension - 15211 ** an SQLite extension designed to recover data from corrupted database 15212 ** files. 15213 */ 15214 15215 /* 15216 ** OVERVIEW: 15217 ** 15218 ** To use the API to recover data from a corrupted database, an 15219 ** application: 15220 ** 15221 ** 1) Creates an sqlite3_recover handle by calling either 15222 ** sqlite3_recover_init() or sqlite3_recover_init_sql(). 15223 ** 15224 ** 2) Configures the new handle using one or more calls to 15225 ** sqlite3_recover_config(). 15226 ** 15227 ** 3) Executes the recovery by repeatedly calling sqlite3_recover_step() on 15228 ** the handle until it returns something other than SQLITE_OK. If it 15229 ** returns SQLITE_DONE, then the recovery operation completed without 15230 ** error. If it returns some other non-SQLITE_OK value, then an error 15231 ** has occurred. 15232 ** 15233 ** 4) Retrieves any error code and English language error message using the 15234 ** sqlite3_recover_errcode() and sqlite3_recover_errmsg() APIs, 15235 ** respectively. 15236 ** 15237 ** 5) Destroys the sqlite3_recover handle and frees all resources 15238 ** using sqlite3_recover_finish(). 15239 ** 15240 ** The application may abandon the recovery operation at any point 15241 ** before it is finished by passing the sqlite3_recover handle to 15242 ** sqlite3_recover_finish(). This is not an error, but the final state 15243 ** of the output database, or the results of running the partial script 15244 ** delivered to the SQL callback, are undefined. 15245 */ 15246 15247 #ifndef _SQLITE_RECOVER_H 15248 #define _SQLITE_RECOVER_H 15249 15250 /* #include "sqlite3.h" */ 15251 15252 #ifdef __cplusplus 15253 extern "C" { 15254 #endif 15255 15256 /* 15257 ** An instance of the sqlite3_recover object represents a recovery 15258 ** operation in progress. 15259 ** 15260 ** Constructors: 15261 ** 15262 ** sqlite3_recover_init() 15263 ** sqlite3_recover_init_sql() 15264 ** 15265 ** Destructor: 15266 ** 15267 ** sqlite3_recover_finish() 15268 ** 15269 ** Methods: 15270 ** 15271 ** sqlite3_recover_config() 15272 ** sqlite3_recover_errcode() 15273 ** sqlite3_recover_errmsg() 15274 ** sqlite3_recover_run() 15275 ** sqlite3_recover_step() 15276 */ 15277 typedef struct sqlite3_recover sqlite3_recover; 15278 15279 /* 15280 ** These two APIs attempt to create and return a new sqlite3_recover object. 15281 ** In both cases the first two arguments identify the (possibly 15282 ** corrupt) database to recover data from. The first argument is an open 15283 ** database handle and the second the name of a database attached to that 15284 ** handle (i.e. "main", "temp" or the name of an attached database). 15285 ** 15286 ** If sqlite3_recover_init() is used to create the new sqlite3_recover 15287 ** handle, then data is recovered into a new database, identified by 15288 ** string parameter zUri. zUri may be an absolute or relative file path, 15289 ** or may be an SQLite URI. If the identified database file already exists, 15290 ** it is overwritten. 15291 ** 15292 ** If sqlite3_recover_init_sql() is invoked, then any recovered data will 15293 ** be returned to the user as a series of SQL statements. Executing these 15294 ** SQL statements results in the same database as would have been created 15295 ** had sqlite3_recover_init() been used. For each SQL statement in the 15296 ** output, the callback function passed as the third argument (xSql) is 15297 ** invoked once. The first parameter is a passed a copy of the fourth argument 15298 ** to this function (pCtx) as its first parameter, and a pointer to a 15299 ** nul-terminated buffer containing the SQL statement formated as UTF-8 as 15300 ** the second. If the xSql callback returns any value other than SQLITE_OK, 15301 ** then processing is immediately abandoned and the value returned used as 15302 ** the recover handle error code (see below). 15303 ** 15304 ** If an out-of-memory error occurs, NULL may be returned instead of 15305 ** a valid handle. In all other cases, it is the responsibility of the 15306 ** application to avoid resource leaks by ensuring that 15307 ** sqlite3_recover_finish() is called on all allocated handles. 15308 */ 15309 sqlite3_recover *sqlite3_recover_init( 15310 sqlite3* db, 15311 const char *zDb, 15312 const char *zUri 15313 ); 15314 sqlite3_recover *sqlite3_recover_init_sql( 15315 sqlite3* db, 15316 const char *zDb, 15317 int (*xSql)(void*, const char*), 15318 void *pCtx 15319 ); 15320 15321 /* 15322 ** Configure an sqlite3_recover object that has just been created using 15323 ** sqlite3_recover_init() or sqlite3_recover_init_sql(). This function 15324 ** may only be called before the first call to sqlite3_recover_step() 15325 ** or sqlite3_recover_run() on the object. 15326 ** 15327 ** The second argument passed to this function must be one of the 15328 ** SQLITE_RECOVER_* symbols defined below. Valid values for the third argument 15329 ** depend on the specific SQLITE_RECOVER_* symbol in use. 15330 ** 15331 ** SQLITE_OK is returned if the configuration operation was successful, 15332 ** or an SQLite error code otherwise. 15333 */ 15334 int sqlite3_recover_config(sqlite3_recover*, int op, void *pArg); 15335 15336 /* 15337 ** SQLITE_RECOVER_LOST_AND_FOUND: 15338 ** The pArg argument points to a string buffer containing the name 15339 ** of a "lost-and-found" table in the output database, or NULL. If 15340 ** the argument is non-NULL and the database contains seemingly 15341 ** valid pages that cannot be associated with any table in the 15342 ** recovered part of the schema, data is extracted from these 15343 ** pages to add to the lost-and-found table. 15344 ** 15345 ** SQLITE_RECOVER_FREELIST_CORRUPT: 15346 ** The pArg value must actually be a pointer to a value of type 15347 ** int containing value 0 or 1 cast as a (void*). If this option is set 15348 ** (argument is 1) and a lost-and-found table has been configured using 15349 ** SQLITE_RECOVER_LOST_AND_FOUND, then is assumed that the freelist is 15350 ** corrupt and an attempt is made to recover records from pages that 15351 ** appear to be linked into the freelist. Otherwise, pages on the freelist 15352 ** are ignored. Setting this option can recover more data from the 15353 ** database, but often ends up "recovering" deleted records. The default 15354 ** value is 0 (clear). 15355 ** 15356 ** SQLITE_RECOVER_ROWIDS: 15357 ** The pArg value must actually be a pointer to a value of type 15358 ** int containing value 0 or 1 cast as a (void*). If this option is set 15359 ** (argument is 1), then an attempt is made to recover rowid values 15360 ** that are not also INTEGER PRIMARY KEY values. If this option is 15361 ** clear, then new rowids are assigned to all recovered rows. The 15362 ** default value is 1 (set). 15363 ** 15364 ** SQLITE_RECOVER_SLOWINDEXES: 15365 ** The pArg value must actually be a pointer to a value of type 15366 ** int containing value 0 or 1 cast as a (void*). If this option is clear 15367 ** (argument is 0), then when creating an output database, the recover 15368 ** module creates and populates non-UNIQUE indexes right at the end of the 15369 ** recovery operation - after all recoverable data has been inserted 15370 ** into the new database. This is faster overall, but means that the 15371 ** final call to sqlite3_recover_step() for a recovery operation may 15372 ** be need to create a large number of indexes, which may be very slow. 15373 ** 15374 ** Or, if this option is set (argument is 1), then non-UNIQUE indexes 15375 ** are created in the output database before it is populated with 15376 ** recovered data. This is slower overall, but avoids the slow call 15377 ** to sqlite3_recover_step() at the end of the recovery operation. 15378 ** 15379 ** The default option value is 0. 15380 */ 15381 #define SQLITE_RECOVER_LOST_AND_FOUND 1 15382 #define SQLITE_RECOVER_FREELIST_CORRUPT 2 15383 #define SQLITE_RECOVER_ROWIDS 3 15384 #define SQLITE_RECOVER_SLOWINDEXES 4 15385 15386 /* 15387 ** Perform a unit of work towards the recovery operation. This function 15388 ** must normally be called multiple times to complete database recovery. 15389 ** 15390 ** If no error occurs but the recovery operation is not completed, this 15391 ** function returns SQLITE_OK. If recovery has been completed successfully 15392 ** then SQLITE_DONE is returned. If an error has occurred, then an SQLite 15393 ** error code (e.g. SQLITE_IOERR or SQLITE_NOMEM) is returned. It is not 15394 ** considered an error if some or all of the data cannot be recovered 15395 ** due to database corruption. 15396 ** 15397 ** Once sqlite3_recover_step() has returned a value other than SQLITE_OK, 15398 ** all further such calls on the same recover handle are no-ops that return 15399 ** the same non-SQLITE_OK value. 15400 */ 15401 int sqlite3_recover_step(sqlite3_recover*); 15402 15403 /* 15404 ** Run the recovery operation to completion. Return SQLITE_OK if successful, 15405 ** or an SQLite error code otherwise. Calling this function is the same 15406 ** as executing: 15407 ** 15408 ** while( SQLITE_OK==sqlite3_recover_step(p) ); 15409 ** return sqlite3_recover_errcode(p); 15410 */ 15411 int sqlite3_recover_run(sqlite3_recover*); 15412 15413 /* 15414 ** If an error has been encountered during a prior call to 15415 ** sqlite3_recover_step(), then this function attempts to return a 15416 ** pointer to a buffer containing an English language explanation of 15417 ** the error. If no error message is available, or if an out-of memory 15418 ** error occurs while attempting to allocate a buffer in which to format 15419 ** the error message, NULL is returned. 15420 ** 15421 ** The returned buffer remains valid until the sqlite3_recover handle is 15422 ** destroyed using sqlite3_recover_finish(). 15423 */ 15424 const char *sqlite3_recover_errmsg(sqlite3_recover*); 15425 15426 /* 15427 ** If this function is called on an sqlite3_recover handle after 15428 ** an error occurs, an SQLite error code is returned. Otherwise, SQLITE_OK. 15429 */ 15430 int sqlite3_recover_errcode(sqlite3_recover*); 15431 15432 /* 15433 ** Clean up a recovery object created by a call to sqlite3_recover_init(). 15434 ** The results of using a recovery object with any API after it has been 15435 ** passed to this function are undefined. 15436 ** 15437 ** This function returns the same value as sqlite3_recover_errcode(). 15438 */ 15439 int sqlite3_recover_finish(sqlite3_recover*); 15440 15441 15442 #ifdef __cplusplus 15443 } /* end of the 'extern "C"' block */ 15444 #endif 15445 15446 #endif /* ifndef _SQLITE_RECOVER_H */ 15447 15448 /************************* End ../ext/recover/sqlite3recover.h ********************/ 15449 # ifndef SQLITE_HAVE_SQLITE3R 15450 /************************* Begin ../ext/recover/dbdata.c ******************/ 15451 /* 15452 ** 2019-04-17 15453 ** 15454 ** The author disclaims copyright to this source code. In place of 15455 ** a legal notice, here is a blessing: 15456 ** 15457 ** May you do good and not evil. 15458 ** May you find forgiveness for yourself and forgive others. 15459 ** May you share freely, never taking more than you give. 15460 ** 15461 ****************************************************************************** 15462 ** 15463 ** This file contains an implementation of two eponymous virtual tables, 15464 ** "sqlite_dbdata" and "sqlite_dbptr". Both modules require that the 15465 ** "sqlite_dbpage" eponymous virtual table be available. 15466 ** 15467 ** SQLITE_DBDATA: 15468 ** sqlite_dbdata is used to extract data directly from a database b-tree 15469 ** page and its associated overflow pages, bypassing the b-tree layer. 15470 ** The table schema is equivalent to: 15471 ** 15472 ** CREATE TABLE sqlite_dbdata( 15473 ** pgno INTEGER, 15474 ** cell INTEGER, 15475 ** field INTEGER, 15476 ** value ANY, 15477 ** schema TEXT HIDDEN 15478 ** ); 15479 ** 15480 ** IMPORTANT: THE VIRTUAL TABLE SCHEMA ABOVE IS SUBJECT TO CHANGE. IN THE 15481 ** FUTURE NEW NON-HIDDEN COLUMNS MAY BE ADDED BETWEEN "value" AND 15482 ** "schema". 15483 ** 15484 ** Each page of the database is inspected. If it cannot be interpreted as 15485 ** a b-tree page, or if it is a b-tree page containing 0 entries, the 15486 ** sqlite_dbdata table contains no rows for that page. Otherwise, the 15487 ** table contains one row for each field in the record associated with 15488 ** each cell on the page. For intkey b-trees, the key value is stored in 15489 ** field -1. 15490 ** 15491 ** For example, for the database: 15492 ** 15493 ** CREATE TABLE t1(a, b); -- root page is page 2 15494 ** INSERT INTO t1(rowid, a, b) VALUES(5, 'v', 'five'); 15495 ** INSERT INTO t1(rowid, a, b) VALUES(10, 'x', 'ten'); 15496 ** 15497 ** the sqlite_dbdata table contains, as well as from entries related to 15498 ** page 1, content equivalent to: 15499 ** 15500 ** INSERT INTO sqlite_dbdata(pgno, cell, field, value) VALUES 15501 ** (2, 0, -1, 5 ), 15502 ** (2, 0, 0, 'v' ), 15503 ** (2, 0, 1, 'five'), 15504 ** (2, 1, -1, 10 ), 15505 ** (2, 1, 0, 'x' ), 15506 ** (2, 1, 1, 'ten' ); 15507 ** 15508 ** If database corruption is encountered, this module does not report an 15509 ** error. Instead, it attempts to extract as much data as possible and 15510 ** ignores the corruption. 15511 ** 15512 ** SQLITE_DBPTR: 15513 ** The sqlite_dbptr table has the following schema: 15514 ** 15515 ** CREATE TABLE sqlite_dbptr( 15516 ** pgno INTEGER, 15517 ** child INTEGER, 15518 ** schema TEXT HIDDEN 15519 ** ); 15520 ** 15521 ** It contains one entry for each b-tree pointer between a parent and 15522 ** child page in the database. 15523 */ 15524 15525 #if !defined(SQLITEINT_H) 15526 /* #include "sqlite3.h" */ 15527 15528 /* typedef unsigned char u8; */ 15529 /* typedef unsigned int u32; */ 15530 15531 #endif 15532 #include <string.h> 15533 #include <assert.h> 15534 15535 #ifndef SQLITE_OMIT_VIRTUALTABLE 15536 15537 #define DBDATA_PADDING_BYTES 100 15538 15539 typedef struct DbdataTable DbdataTable; 15540 typedef struct DbdataCursor DbdataCursor; 15541 typedef struct DbdataBuffer DbdataBuffer; 15542 15543 /* 15544 ** Buffer type. 15545 */ 15546 struct DbdataBuffer { 15547 u8 *aBuf; 15548 sqlite3_int64 nBuf; 15549 }; 15550 15551 /* Cursor object */ 15552 struct DbdataCursor { 15553 sqlite3_vtab_cursor base; /* Base class. Must be first */ 15554 sqlite3_stmt *pStmt; /* For fetching database pages */ 15555 15556 int iPgno; /* Current page number */ 15557 u8 *aPage; /* Buffer containing page */ 15558 int nPage; /* Size of aPage[] in bytes */ 15559 int nCell; /* Number of cells on aPage[] */ 15560 int iCell; /* Current cell number */ 15561 int bOnePage; /* True to stop after one page */ 15562 int szDb; 15563 sqlite3_int64 iRowid; 15564 15565 /* Only for the sqlite_dbdata table */ 15566 DbdataBuffer rec; 15567 sqlite3_int64 nRec; /* Size of pRec[] in bytes */ 15568 sqlite3_int64 nHdr; /* Size of header in bytes */ 15569 int iField; /* Current field number */ 15570 u8 *pHdrPtr; 15571 u8 *pPtr; 15572 u32 enc; /* Text encoding */ 15573 15574 sqlite3_int64 iIntkey; /* Integer key value */ 15575 }; 15576 15577 /* Table object */ 15578 struct DbdataTable { 15579 sqlite3_vtab base; /* Base class. Must be first */ 15580 sqlite3 *db; /* The database connection */ 15581 sqlite3_stmt *pStmt; /* For fetching database pages */ 15582 int bPtr; /* True for sqlite3_dbptr table */ 15583 }; 15584 15585 /* Column and schema definitions for sqlite_dbdata */ 15586 #define DBDATA_COLUMN_PGNO 0 15587 #define DBDATA_COLUMN_CELL 1 15588 #define DBDATA_COLUMN_FIELD 2 15589 #define DBDATA_COLUMN_VALUE 3 15590 #define DBDATA_COLUMN_SCHEMA 4 15591 #define DBDATA_SCHEMA \ 15592 "CREATE TABLE x(" \ 15593 " pgno INTEGER," \ 15594 " cell INTEGER," \ 15595 " field INTEGER," \ 15596 " value ANY," \ 15597 " schema TEXT HIDDEN" \ 15598 ")" 15599 15600 /* Column and schema definitions for sqlite_dbptr */ 15601 #define DBPTR_COLUMN_PGNO 0 15602 #define DBPTR_COLUMN_CHILD 1 15603 #define DBPTR_COLUMN_SCHEMA 2 15604 #define DBPTR_SCHEMA \ 15605 "CREATE TABLE x(" \ 15606 " pgno INTEGER," \ 15607 " child INTEGER," \ 15608 " schema TEXT HIDDEN" \ 15609 ")" 15610 15611 /* 15612 ** Ensure the buffer passed as the first argument is at least nMin bytes 15613 ** in size. If an error occurs while attempting to resize the buffer, 15614 ** SQLITE_NOMEM is returned. Otherwise, SQLITE_OK. 15615 */ 15616 static int dbdataBufferSize(DbdataBuffer *pBuf, sqlite3_int64 nMin){ 15617 if( nMin>pBuf->nBuf ){ 15618 sqlite3_int64 nNew = nMin+16384; 15619 u8 *aNew = (u8*)sqlite3_realloc64(pBuf->aBuf, nNew); 15620 15621 if( aNew==0 ) return SQLITE_NOMEM; 15622 pBuf->aBuf = aNew; 15623 pBuf->nBuf = nNew; 15624 } 15625 return SQLITE_OK; 15626 } 15627 15628 /* 15629 ** Release the allocation managed by buffer pBuf. 15630 */ 15631 static void dbdataBufferFree(DbdataBuffer *pBuf){ 15632 sqlite3_free(pBuf->aBuf); 15633 memset(pBuf, 0, sizeof(*pBuf)); 15634 } 15635 15636 /* 15637 ** Connect to an sqlite_dbdata (pAux==0) or sqlite_dbptr (pAux!=0) virtual 15638 ** table. 15639 */ 15640 static int dbdataConnect( 15641 sqlite3 *db, 15642 void *pAux, 15643 int argc, const char *const*argv, 15644 sqlite3_vtab **ppVtab, 15645 char **pzErr 15646 ){ 15647 DbdataTable *pTab = 0; 15648 int rc = sqlite3_declare_vtab(db, pAux ? DBPTR_SCHEMA : DBDATA_SCHEMA); 15649 15650 (void)argc; 15651 (void)argv; 15652 (void)pzErr; 15653 sqlite3_vtab_config(db, SQLITE_VTAB_USES_ALL_SCHEMAS); 15654 if( rc==SQLITE_OK ){ 15655 pTab = (DbdataTable*)sqlite3_malloc64(sizeof(DbdataTable)); 15656 if( pTab==0 ){ 15657 rc = SQLITE_NOMEM; 15658 }else{ 15659 memset(pTab, 0, sizeof(DbdataTable)); 15660 pTab->db = db; 15661 pTab->bPtr = (pAux!=0); 15662 } 15663 } 15664 15665 *ppVtab = (sqlite3_vtab*)pTab; 15666 return rc; 15667 } 15668 15669 /* 15670 ** Disconnect from or destroy a sqlite_dbdata or sqlite_dbptr virtual table. 15671 */ 15672 static int dbdataDisconnect(sqlite3_vtab *pVtab){ 15673 DbdataTable *pTab = (DbdataTable*)pVtab; 15674 if( pTab ){ 15675 sqlite3_finalize(pTab->pStmt); 15676 sqlite3_free(pVtab); 15677 } 15678 return SQLITE_OK; 15679 } 15680 15681 /* 15682 ** This function interprets two types of constraints: 15683 ** 15684 ** schema=? 15685 ** pgno=? 15686 ** 15687 ** If neither are present, idxNum is set to 0. If schema=? is present, 15688 ** the 0x01 bit in idxNum is set. If pgno=? is present, the 0x02 bit 15689 ** in idxNum is set. 15690 ** 15691 ** If both parameters are present, schema is in position 0 and pgno in 15692 ** position 1. 15693 */ 15694 static int dbdataBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdx){ 15695 DbdataTable *pTab = (DbdataTable*)tab; 15696 int i; 15697 int iSchema = -1; 15698 int iPgno = -1; 15699 int colSchema = (pTab->bPtr ? DBPTR_COLUMN_SCHEMA : DBDATA_COLUMN_SCHEMA); 15700 15701 for(i=0; i<pIdx->nConstraint; i++){ 15702 struct sqlite3_index_constraint *p = &pIdx->aConstraint[i]; 15703 if( p->op==SQLITE_INDEX_CONSTRAINT_EQ ){ 15704 if( p->iColumn==colSchema ){ 15705 if( p->usable==0 ) return SQLITE_CONSTRAINT; 15706 iSchema = i; 15707 } 15708 if( p->iColumn==DBDATA_COLUMN_PGNO && p->usable ){ 15709 iPgno = i; 15710 } 15711 } 15712 } 15713 15714 if( iSchema>=0 ){ 15715 pIdx->aConstraintUsage[iSchema].argvIndex = 1; 15716 pIdx->aConstraintUsage[iSchema].omit = 1; 15717 } 15718 if( iPgno>=0 ){ 15719 pIdx->aConstraintUsage[iPgno].argvIndex = 1 + (iSchema>=0); 15720 pIdx->aConstraintUsage[iPgno].omit = 1; 15721 pIdx->estimatedCost = 100; 15722 pIdx->estimatedRows = 50; 15723 15724 if( pTab->bPtr==0 && pIdx->nOrderBy && pIdx->aOrderBy[0].desc==0 ){ 15725 int iCol = pIdx->aOrderBy[0].iColumn; 15726 if( pIdx->nOrderBy==1 ){ 15727 pIdx->orderByConsumed = (iCol==0 || iCol==1); 15728 }else if( pIdx->nOrderBy==2 && pIdx->aOrderBy[1].desc==0 && iCol==0 ){ 15729 pIdx->orderByConsumed = (pIdx->aOrderBy[1].iColumn==1); 15730 } 15731 } 15732 15733 }else{ 15734 pIdx->estimatedCost = 100000000; 15735 pIdx->estimatedRows = 1000000000; 15736 } 15737 pIdx->idxNum = (iSchema>=0 ? 0x01 : 0x00) | (iPgno>=0 ? 0x02 : 0x00); 15738 return SQLITE_OK; 15739 } 15740 15741 /* 15742 ** Open a new sqlite_dbdata or sqlite_dbptr cursor. 15743 */ 15744 static int dbdataOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){ 15745 DbdataCursor *pCsr; 15746 15747 pCsr = (DbdataCursor*)sqlite3_malloc64(sizeof(DbdataCursor)); 15748 if( pCsr==0 ){ 15749 return SQLITE_NOMEM; 15750 }else{ 15751 memset(pCsr, 0, sizeof(DbdataCursor)); 15752 pCsr->base.pVtab = pVTab; 15753 } 15754 15755 *ppCursor = (sqlite3_vtab_cursor *)pCsr; 15756 return SQLITE_OK; 15757 } 15758 15759 /* 15760 ** Restore a cursor object to the state it was in when first allocated 15761 ** by dbdataOpen(). 15762 */ 15763 static void dbdataResetCursor(DbdataCursor *pCsr){ 15764 DbdataTable *pTab = (DbdataTable*)(pCsr->base.pVtab); 15765 if( pTab->pStmt==0 ){ 15766 pTab->pStmt = pCsr->pStmt; 15767 }else{ 15768 sqlite3_finalize(pCsr->pStmt); 15769 } 15770 pCsr->pStmt = 0; 15771 pCsr->iPgno = 1; 15772 pCsr->iCell = 0; 15773 pCsr->iField = 0; 15774 pCsr->bOnePage = 0; 15775 sqlite3_free(pCsr->aPage); 15776 dbdataBufferFree(&pCsr->rec); 15777 pCsr->aPage = 0; 15778 pCsr->nRec = 0; 15779 } 15780 15781 /* 15782 ** Close an sqlite_dbdata or sqlite_dbptr cursor. 15783 */ 15784 static int dbdataClose(sqlite3_vtab_cursor *pCursor){ 15785 DbdataCursor *pCsr = (DbdataCursor*)pCursor; 15786 dbdataResetCursor(pCsr); 15787 sqlite3_free(pCsr); 15788 return SQLITE_OK; 15789 } 15790 15791 /* 15792 ** Utility methods to decode 16 and 32-bit big-endian unsigned integers. 15793 */ 15794 static u32 get_uint16(unsigned char *a){ 15795 return (a[0]<<8)|a[1]; 15796 } 15797 static u32 get_uint32(unsigned char *a){ 15798 return ((u32)a[0]<<24) 15799 | ((u32)a[1]<<16) 15800 | ((u32)a[2]<<8) 15801 | ((u32)a[3]); 15802 } 15803 15804 /* 15805 ** Load page pgno from the database via the sqlite_dbpage virtual table. 15806 ** If successful, set (*ppPage) to point to a buffer containing the page 15807 ** data, (*pnPage) to the size of that buffer in bytes and return 15808 ** SQLITE_OK. In this case it is the responsibility of the caller to 15809 ** eventually free the buffer using sqlite3_free(). 15810 ** 15811 ** Or, if an error occurs, set both (*ppPage) and (*pnPage) to 0 and 15812 ** return an SQLite error code. 15813 */ 15814 static int dbdataLoadPage( 15815 DbdataCursor *pCsr, /* Cursor object */ 15816 u32 pgno, /* Page number of page to load */ 15817 u8 **ppPage, /* OUT: pointer to page buffer */ 15818 int *pnPage /* OUT: Size of (*ppPage) in bytes */ 15819 ){ 15820 int rc2; 15821 int rc = SQLITE_OK; 15822 sqlite3_stmt *pStmt = pCsr->pStmt; 15823 15824 *ppPage = 0; 15825 *pnPage = 0; 15826 if( pgno>0 ){ 15827 sqlite3_bind_int64(pStmt, 2, pgno); 15828 if( SQLITE_ROW==sqlite3_step(pStmt) ){ 15829 int nCopy = sqlite3_column_bytes(pStmt, 0); 15830 if( nCopy>0 ){ 15831 u8 *pPage; 15832 pPage = (u8*)sqlite3_malloc64(nCopy + DBDATA_PADDING_BYTES); 15833 if( pPage==0 ){ 15834 rc = SQLITE_NOMEM; 15835 }else{ 15836 const u8 *pCopy = sqlite3_column_blob(pStmt, 0); 15837 memcpy(pPage, pCopy, nCopy); 15838 memset(&pPage[nCopy], 0, DBDATA_PADDING_BYTES); 15839 } 15840 *ppPage = pPage; 15841 *pnPage = nCopy; 15842 } 15843 } 15844 rc2 = sqlite3_reset(pStmt); 15845 if( rc==SQLITE_OK ) rc = rc2; 15846 } 15847 15848 return rc; 15849 } 15850 15851 /* 15852 ** Read a varint. Put the value in *pVal and return the number of bytes. 15853 */ 15854 static int dbdataGetVarint(const u8 *z, sqlite3_int64 *pVal){ 15855 sqlite3_uint64 u = 0; 15856 int i; 15857 for(i=0; i<8; i++){ 15858 u = (u<<7) + (z[i]&0x7f); 15859 if( (z[i]&0x80)==0 ){ *pVal = (sqlite3_int64)u; return i+1; } 15860 } 15861 u = (u<<8) + (z[i]&0xff); 15862 *pVal = (sqlite3_int64)u; 15863 return 9; 15864 } 15865 15866 /* 15867 ** Like dbdataGetVarint(), but set the output to 0 if it is less than 0 15868 ** or greater than 0xFFFFFFFF. This can be used for all varints in an 15869 ** SQLite database except for key values in intkey tables. 15870 */ 15871 static int dbdataGetVarintU32(const u8 *z, sqlite3_int64 *pVal){ 15872 sqlite3_int64 val; 15873 int nRet = dbdataGetVarint(z, &val); 15874 if( val<0 || val>0xFFFFFFFF ) val = 0; 15875 *pVal = val; 15876 return nRet; 15877 } 15878 15879 /* 15880 ** Return the number of bytes of space used by an SQLite value of type 15881 ** eType. 15882 */ 15883 static int dbdataValueBytes(int eType){ 15884 switch( eType ){ 15885 case 0: case 8: case 9: 15886 case 10: case 11: 15887 return 0; 15888 case 1: 15889 return 1; 15890 case 2: 15891 return 2; 15892 case 3: 15893 return 3; 15894 case 4: 15895 return 4; 15896 case 5: 15897 return 6; 15898 case 6: 15899 case 7: 15900 return 8; 15901 default: 15902 if( eType>0 ){ 15903 return ((eType-12) / 2); 15904 } 15905 return 0; 15906 } 15907 } 15908 15909 /* 15910 ** Load a value of type eType from buffer pData and use it to set the 15911 ** result of context object pCtx. 15912 */ 15913 static void dbdataValue( 15914 sqlite3_context *pCtx, 15915 u32 enc, 15916 int eType, 15917 u8 *pData, 15918 sqlite3_int64 nData 15919 ){ 15920 if( eType>=0 ){ 15921 if( dbdataValueBytes(eType)<=nData ){ 15922 switch( eType ){ 15923 case 0: 15924 case 10: 15925 case 11: 15926 sqlite3_result_null(pCtx); 15927 break; 15928 15929 case 8: 15930 sqlite3_result_int(pCtx, 0); 15931 break; 15932 case 9: 15933 sqlite3_result_int(pCtx, 1); 15934 break; 15935 15936 case 1: case 2: case 3: case 4: case 5: case 6: case 7: { 15937 sqlite3_uint64 v = (signed char)pData[0]; 15938 pData++; 15939 switch( eType ){ 15940 case 7: 15941 case 6: v = (v<<16) + (pData[0]<<8) + pData[1]; pData += 2; 15942 case 5: v = (v<<16) + (pData[0]<<8) + pData[1]; pData += 2; 15943 case 4: v = (v<<8) + pData[0]; pData++; 15944 case 3: v = (v<<8) + pData[0]; pData++; 15945 case 2: v = (v<<8) + pData[0]; pData++; 15946 } 15947 15948 if( eType==7 ){ 15949 double r; 15950 memcpy(&r, &v, sizeof(r)); 15951 sqlite3_result_double(pCtx, r); 15952 }else{ 15953 sqlite3_result_int64(pCtx, (sqlite3_int64)v); 15954 } 15955 break; 15956 } 15957 15958 default: { 15959 int n = ((eType-12) / 2); 15960 if( eType % 2 ){ 15961 switch( enc ){ 15962 #ifndef SQLITE_OMIT_UTF16 15963 case SQLITE_UTF16BE: 15964 sqlite3_result_text16be(pCtx, (void*)pData, n, SQLITE_TRANSIENT); 15965 break; 15966 case SQLITE_UTF16LE: 15967 sqlite3_result_text16le(pCtx, (void*)pData, n, SQLITE_TRANSIENT); 15968 break; 15969 #endif 15970 default: 15971 sqlite3_result_text(pCtx, (char*)pData, n, SQLITE_TRANSIENT); 15972 break; 15973 } 15974 }else{ 15975 sqlite3_result_blob(pCtx, pData, n, SQLITE_TRANSIENT); 15976 } 15977 } 15978 } 15979 }else{ 15980 if( eType==7 ){ 15981 sqlite3_result_double(pCtx, 0.0); 15982 }else if( eType<7 ){ 15983 sqlite3_result_int(pCtx, 0); 15984 }else if( eType%2 ){ 15985 sqlite3_result_text(pCtx, "", 0, SQLITE_STATIC); 15986 }else{ 15987 sqlite3_result_blob(pCtx, "", 0, SQLITE_STATIC); 15988 } 15989 } 15990 } 15991 } 15992 15993 /* This macro is a copy of the MX_CELL() macro in the SQLite core. Given 15994 ** a page-size, it returns the maximum number of cells that may be present 15995 ** on the page. */ 15996 #define DBDATA_MX_CELL(pgsz) ((pgsz-8)/6) 15997 15998 /* Maximum number of fields that may appear in a single record. This is 15999 ** the "hard-limit", according to comments in sqliteLimit.h. */ 16000 #define DBDATA_MX_FIELD 32676 16001 16002 /* 16003 ** Move an sqlite_dbdata or sqlite_dbptr cursor to the next entry. 16004 */ 16005 static int dbdataNext(sqlite3_vtab_cursor *pCursor){ 16006 DbdataCursor *pCsr = (DbdataCursor*)pCursor; 16007 DbdataTable *pTab = (DbdataTable*)pCursor->pVtab; 16008 16009 pCsr->iRowid++; 16010 while( 1 ){ 16011 int rc; 16012 int iOff = (pCsr->iPgno==1 ? 100 : 0); 16013 int bNextPage = 0; 16014 16015 if( pCsr->aPage==0 ){ 16016 while( 1 ){ 16017 if( pCsr->bOnePage==0 && pCsr->iPgno>pCsr->szDb ) return SQLITE_OK; 16018 rc = dbdataLoadPage(pCsr, pCsr->iPgno, &pCsr->aPage, &pCsr->nPage); 16019 if( rc!=SQLITE_OK ) return rc; 16020 if( pCsr->aPage && pCsr->nPage>=256 ) break; 16021 sqlite3_free(pCsr->aPage); 16022 pCsr->aPage = 0; 16023 if( pCsr->bOnePage ) return SQLITE_OK; 16024 pCsr->iPgno++; 16025 } 16026 16027 assert( iOff+3+2<=pCsr->nPage ); 16028 pCsr->iCell = pTab->bPtr ? -2 : 0; 16029 pCsr->nCell = get_uint16(&pCsr->aPage[iOff+3]); 16030 if( pCsr->nCell>DBDATA_MX_CELL(pCsr->nPage) ){ 16031 pCsr->nCell = DBDATA_MX_CELL(pCsr->nPage); 16032 } 16033 } 16034 16035 if( pTab->bPtr ){ 16036 if( pCsr->aPage[iOff]!=0x02 && pCsr->aPage[iOff]!=0x05 ){ 16037 pCsr->iCell = pCsr->nCell; 16038 } 16039 pCsr->iCell++; 16040 if( pCsr->iCell>=pCsr->nCell ){ 16041 sqlite3_free(pCsr->aPage); 16042 pCsr->aPage = 0; 16043 if( pCsr->bOnePage ) return SQLITE_OK; 16044 pCsr->iPgno++; 16045 }else{ 16046 return SQLITE_OK; 16047 } 16048 }else{ 16049 /* If there is no record loaded, load it now. */ 16050 assert( pCsr->rec.aBuf!=0 || pCsr->nRec==0 ); 16051 if( pCsr->nRec==0 ){ 16052 int bHasRowid = 0; 16053 int nPointer = 0; 16054 sqlite3_int64 nPayload = 0; 16055 sqlite3_int64 nHdr = 0; 16056 int iHdr; 16057 int U, X; 16058 int nLocal; 16059 16060 switch( pCsr->aPage[iOff] ){ 16061 case 0x02: 16062 nPointer = 4; 16063 break; 16064 case 0x0a: 16065 break; 16066 case 0x0d: 16067 bHasRowid = 1; 16068 break; 16069 default: 16070 /* This is not a b-tree page with records on it. Continue. */ 16071 pCsr->iCell = pCsr->nCell; 16072 break; 16073 } 16074 16075 if( pCsr->iCell>=pCsr->nCell ){ 16076 bNextPage = 1; 16077 }else{ 16078 int iCellPtr = iOff + 8 + nPointer + pCsr->iCell*2; 16079 16080 if( iCellPtr>pCsr->nPage ){ 16081 bNextPage = 1; 16082 }else{ 16083 iOff = get_uint16(&pCsr->aPage[iCellPtr]); 16084 } 16085 16086 /* For an interior node cell, skip past the child-page number */ 16087 iOff += nPointer; 16088 16089 /* Load the "byte of payload including overflow" field */ 16090 if( bNextPage || iOff>pCsr->nPage || iOff<=iCellPtr ){ 16091 bNextPage = 1; 16092 }else{ 16093 iOff += dbdataGetVarintU32(&pCsr->aPage[iOff], &nPayload); 16094 if( nPayload>0x7fffff00 ) nPayload &= 0x3fff; 16095 if( nPayload==0 ) nPayload = 1; 16096 } 16097 16098 /* If this is a leaf intkey cell, load the rowid */ 16099 if( bHasRowid && !bNextPage && iOff<pCsr->nPage ){ 16100 iOff += dbdataGetVarint(&pCsr->aPage[iOff], &pCsr->iIntkey); 16101 } 16102 16103 /* Figure out how much data to read from the local page */ 16104 U = pCsr->nPage; 16105 if( bHasRowid ){ 16106 X = U-35; 16107 }else{ 16108 X = ((U-12)*64/255)-23; 16109 } 16110 if( nPayload<=X ){ 16111 nLocal = nPayload; 16112 }else{ 16113 int M, K; 16114 M = ((U-12)*32/255)-23; 16115 K = M+((nPayload-M)%(U-4)); 16116 if( K<=X ){ 16117 nLocal = K; 16118 }else{ 16119 nLocal = M; 16120 } 16121 } 16122 16123 if( bNextPage || nLocal+iOff>pCsr->nPage ){ 16124 bNextPage = 1; 16125 }else{ 16126 16127 /* Allocate space for payload. And a bit more to catch small buffer 16128 ** overruns caused by attempting to read a varint or similar from 16129 ** near the end of a corrupt record. */ 16130 rc = dbdataBufferSize(&pCsr->rec, nPayload+DBDATA_PADDING_BYTES); 16131 if( rc!=SQLITE_OK ) return rc; 16132 assert( nPayload!=0 ); 16133 16134 /* Load the nLocal bytes of payload */ 16135 memcpy(pCsr->rec.aBuf, &pCsr->aPage[iOff], nLocal); 16136 iOff += nLocal; 16137 16138 /* Load content from overflow pages */ 16139 if( nPayload>nLocal ){ 16140 sqlite3_int64 nRem = nPayload - nLocal; 16141 u32 pgnoOvfl = get_uint32(&pCsr->aPage[iOff]); 16142 while( nRem>0 ){ 16143 u8 *aOvfl = 0; 16144 int nOvfl = 0; 16145 int nCopy; 16146 rc = dbdataLoadPage(pCsr, pgnoOvfl, &aOvfl, &nOvfl); 16147 assert( rc!=SQLITE_OK || aOvfl==0 || nOvfl==pCsr->nPage ); 16148 if( rc!=SQLITE_OK ) return rc; 16149 if( aOvfl==0 ) break; 16150 16151 nCopy = U-4; 16152 if( nCopy>nRem ) nCopy = nRem; 16153 memcpy(&pCsr->rec.aBuf[nPayload-nRem], &aOvfl[4], nCopy); 16154 nRem -= nCopy; 16155 16156 pgnoOvfl = get_uint32(aOvfl); 16157 sqlite3_free(aOvfl); 16158 } 16159 nPayload -= nRem; 16160 } 16161 memset(&pCsr->rec.aBuf[nPayload], 0, DBDATA_PADDING_BYTES); 16162 pCsr->nRec = nPayload; 16163 16164 iHdr = dbdataGetVarintU32(pCsr->rec.aBuf, &nHdr); 16165 if( nHdr>nPayload ) nHdr = 0; 16166 pCsr->nHdr = nHdr; 16167 pCsr->pHdrPtr = &pCsr->rec.aBuf[iHdr]; 16168 pCsr->pPtr = &pCsr->rec.aBuf[pCsr->nHdr]; 16169 pCsr->iField = (bHasRowid ? -1 : 0); 16170 } 16171 } 16172 }else{ 16173 pCsr->iField++; 16174 if( pCsr->iField>0 ){ 16175 sqlite3_int64 iType; 16176 if( pCsr->pHdrPtr>=&pCsr->rec.aBuf[pCsr->nRec] 16177 || pCsr->iField>=DBDATA_MX_FIELD 16178 ){ 16179 bNextPage = 1; 16180 }else{ 16181 int szField = 0; 16182 pCsr->pHdrPtr += dbdataGetVarintU32(pCsr->pHdrPtr, &iType); 16183 szField = dbdataValueBytes(iType); 16184 if( (pCsr->nRec - (pCsr->pPtr - pCsr->rec.aBuf))<szField ){ 16185 pCsr->pPtr = &pCsr->rec.aBuf[pCsr->nRec]; 16186 }else{ 16187 pCsr->pPtr += szField; 16188 } 16189 } 16190 } 16191 } 16192 16193 if( bNextPage ){ 16194 sqlite3_free(pCsr->aPage); 16195 pCsr->aPage = 0; 16196 pCsr->nRec = 0; 16197 if( pCsr->bOnePage ) return SQLITE_OK; 16198 pCsr->iPgno++; 16199 }else{ 16200 if( pCsr->iField<0 || pCsr->pHdrPtr<&pCsr->rec.aBuf[pCsr->nHdr] ){ 16201 return SQLITE_OK; 16202 } 16203 16204 /* Advance to the next cell. The next iteration of the loop will load 16205 ** the record and so on. */ 16206 pCsr->nRec = 0; 16207 pCsr->iCell++; 16208 } 16209 } 16210 } 16211 16212 assert( !"can't get here" ); 16213 return SQLITE_OK; 16214 } 16215 16216 /* 16217 ** Return true if the cursor is at EOF. 16218 */ 16219 static int dbdataEof(sqlite3_vtab_cursor *pCursor){ 16220 DbdataCursor *pCsr = (DbdataCursor*)pCursor; 16221 return pCsr->aPage==0; 16222 } 16223 16224 /* 16225 ** Return true if nul-terminated string zSchema ends in "()". Or false 16226 ** otherwise. 16227 */ 16228 static int dbdataIsFunction(const char *zSchema){ 16229 size_t n = strlen(zSchema); 16230 if( n>2 && zSchema[n-2]=='(' && zSchema[n-1]==')' ){ 16231 return (int)n-2; 16232 } 16233 return 0; 16234 } 16235 16236 /* 16237 ** Determine the size in pages of database zSchema (where zSchema is 16238 ** "main", "temp" or the name of an attached database) and set 16239 ** pCsr->szDb accordingly. If successful, return SQLITE_OK. Otherwise, 16240 ** an SQLite error code. 16241 */ 16242 static int dbdataDbsize(DbdataCursor *pCsr, const char *zSchema){ 16243 DbdataTable *pTab = (DbdataTable*)pCsr->base.pVtab; 16244 char *zSql = 0; 16245 int rc, rc2; 16246 int nFunc = 0; 16247 sqlite3_stmt *pStmt = 0; 16248 16249 if( (nFunc = dbdataIsFunction(zSchema))>0 ){ 16250 zSql = sqlite3_mprintf("SELECT %.*s(0)", nFunc, zSchema); 16251 }else{ 16252 zSql = sqlite3_mprintf("PRAGMA %Q.page_count", zSchema); 16253 } 16254 if( zSql==0 ) return SQLITE_NOMEM; 16255 16256 rc = sqlite3_prepare_v2(pTab->db, zSql, -1, &pStmt, 0); 16257 sqlite3_free(zSql); 16258 if( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){ 16259 pCsr->szDb = sqlite3_column_int(pStmt, 0); 16260 } 16261 rc2 = sqlite3_finalize(pStmt); 16262 if( rc==SQLITE_OK ) rc = rc2; 16263 return rc; 16264 } 16265 16266 /* 16267 ** Attempt to figure out the encoding of the database by retrieving page 1 16268 ** and inspecting the header field. If successful, set the pCsr->enc variable 16269 ** and return SQLITE_OK. Otherwise, return an SQLite error code. 16270 */ 16271 static int dbdataGetEncoding(DbdataCursor *pCsr){ 16272 int rc = SQLITE_OK; 16273 int nPg1 = 0; 16274 u8 *aPg1 = 0; 16275 rc = dbdataLoadPage(pCsr, 1, &aPg1, &nPg1); 16276 if( rc==SQLITE_OK && nPg1>=(56+4) ){ 16277 pCsr->enc = get_uint32(&aPg1[56]); 16278 } 16279 sqlite3_free(aPg1); 16280 return rc; 16281 } 16282 16283 16284 /* 16285 ** xFilter method for sqlite_dbdata and sqlite_dbptr. 16286 */ 16287 static int dbdataFilter( 16288 sqlite3_vtab_cursor *pCursor, 16289 int idxNum, const char *idxStr, 16290 int argc, sqlite3_value **argv 16291 ){ 16292 DbdataCursor *pCsr = (DbdataCursor*)pCursor; 16293 DbdataTable *pTab = (DbdataTable*)pCursor->pVtab; 16294 int rc = SQLITE_OK; 16295 const char *zSchema = "main"; 16296 (void)idxStr; 16297 (void)argc; 16298 16299 dbdataResetCursor(pCsr); 16300 assert( pCsr->iPgno==1 ); 16301 if( idxNum & 0x01 ){ 16302 zSchema = (const char*)sqlite3_value_text(argv[0]); 16303 if( zSchema==0 ) zSchema = ""; 16304 } 16305 if( idxNum & 0x02 ){ 16306 pCsr->iPgno = sqlite3_value_int(argv[(idxNum & 0x01)]); 16307 pCsr->bOnePage = 1; 16308 }else{ 16309 rc = dbdataDbsize(pCsr, zSchema); 16310 } 16311 16312 if( rc==SQLITE_OK ){ 16313 int nFunc = 0; 16314 if( pTab->pStmt ){ 16315 pCsr->pStmt = pTab->pStmt; 16316 pTab->pStmt = 0; 16317 }else if( (nFunc = dbdataIsFunction(zSchema))>0 ){ 16318 char *zSql = sqlite3_mprintf("SELECT %.*s(?2)", nFunc, zSchema); 16319 if( zSql==0 ){ 16320 rc = SQLITE_NOMEM; 16321 }else{ 16322 rc = sqlite3_prepare_v2(pTab->db, zSql, -1, &pCsr->pStmt, 0); 16323 sqlite3_free(zSql); 16324 } 16325 }else{ 16326 rc = sqlite3_prepare_v2(pTab->db, 16327 "SELECT data FROM sqlite_dbpage(?) WHERE pgno=?", -1, 16328 &pCsr->pStmt, 0 16329 ); 16330 } 16331 } 16332 if( rc==SQLITE_OK ){ 16333 rc = sqlite3_bind_text(pCsr->pStmt, 1, zSchema, -1, SQLITE_TRANSIENT); 16334 } 16335 16336 /* Try to determine the encoding of the db by inspecting the header 16337 ** field on page 1. */ 16338 if( rc==SQLITE_OK ){ 16339 rc = dbdataGetEncoding(pCsr); 16340 } 16341 16342 if( rc!=SQLITE_OK ){ 16343 pTab->base.zErrMsg = sqlite3_mprintf("%s", sqlite3_errmsg(pTab->db)); 16344 } 16345 16346 if( rc==SQLITE_OK ){ 16347 rc = dbdataNext(pCursor); 16348 } 16349 return rc; 16350 } 16351 16352 /* 16353 ** Return a column for the sqlite_dbdata or sqlite_dbptr table. 16354 */ 16355 static int dbdataColumn( 16356 sqlite3_vtab_cursor *pCursor, 16357 sqlite3_context *ctx, 16358 int i 16359 ){ 16360 DbdataCursor *pCsr = (DbdataCursor*)pCursor; 16361 DbdataTable *pTab = (DbdataTable*)pCursor->pVtab; 16362 if( pTab->bPtr ){ 16363 switch( i ){ 16364 case DBPTR_COLUMN_PGNO: 16365 sqlite3_result_int64(ctx, pCsr->iPgno); 16366 break; 16367 case DBPTR_COLUMN_CHILD: { 16368 int iOff = pCsr->iPgno==1 ? 100 : 0; 16369 if( pCsr->iCell<0 ){ 16370 iOff += 8; 16371 }else{ 16372 iOff += 12 + pCsr->iCell*2; 16373 if( iOff>pCsr->nPage ) return SQLITE_OK; 16374 iOff = get_uint16(&pCsr->aPage[iOff]); 16375 } 16376 if( iOff<=pCsr->nPage ){ 16377 sqlite3_result_int64(ctx, get_uint32(&pCsr->aPage[iOff])); 16378 } 16379 break; 16380 } 16381 } 16382 }else{ 16383 switch( i ){ 16384 case DBDATA_COLUMN_PGNO: 16385 sqlite3_result_int64(ctx, pCsr->iPgno); 16386 break; 16387 case DBDATA_COLUMN_CELL: 16388 sqlite3_result_int(ctx, pCsr->iCell); 16389 break; 16390 case DBDATA_COLUMN_FIELD: 16391 sqlite3_result_int(ctx, pCsr->iField); 16392 break; 16393 case DBDATA_COLUMN_VALUE: { 16394 if( pCsr->iField<0 ){ 16395 sqlite3_result_int64(ctx, pCsr->iIntkey); 16396 }else if( &pCsr->rec.aBuf[pCsr->nRec] >= pCsr->pPtr ){ 16397 sqlite3_int64 iType; 16398 dbdataGetVarintU32(pCsr->pHdrPtr, &iType); 16399 dbdataValue( 16400 ctx, pCsr->enc, iType, pCsr->pPtr, 16401 &pCsr->rec.aBuf[pCsr->nRec] - pCsr->pPtr 16402 ); 16403 } 16404 break; 16405 } 16406 } 16407 } 16408 return SQLITE_OK; 16409 } 16410 16411 /* 16412 ** Return the rowid for an sqlite_dbdata or sqlite_dptr table. 16413 */ 16414 static int dbdataRowid(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){ 16415 DbdataCursor *pCsr = (DbdataCursor*)pCursor; 16416 *pRowid = pCsr->iRowid; 16417 return SQLITE_OK; 16418 } 16419 16420 16421 /* 16422 ** Invoke this routine to register the "sqlite_dbdata" virtual table module 16423 */ 16424 static int sqlite3DbdataRegister(sqlite3 *db){ 16425 static sqlite3_module dbdata_module = { 16426 0, /* iVersion */ 16427 0, /* xCreate */ 16428 dbdataConnect, /* xConnect */ 16429 dbdataBestIndex, /* xBestIndex */ 16430 dbdataDisconnect, /* xDisconnect */ 16431 0, /* xDestroy */ 16432 dbdataOpen, /* xOpen - open a cursor */ 16433 dbdataClose, /* xClose - close a cursor */ 16434 dbdataFilter, /* xFilter - configure scan constraints */ 16435 dbdataNext, /* xNext - advance a cursor */ 16436 dbdataEof, /* xEof - check for end of scan */ 16437 dbdataColumn, /* xColumn - read data */ 16438 dbdataRowid, /* xRowid - read data */ 16439 0, /* xUpdate */ 16440 0, /* xBegin */ 16441 0, /* xSync */ 16442 0, /* xCommit */ 16443 0, /* xRollback */ 16444 0, /* xFindMethod */ 16445 0, /* xRename */ 16446 0, /* xSavepoint */ 16447 0, /* xRelease */ 16448 0, /* xRollbackTo */ 16449 0, /* xShadowName */ 16450 0 /* xIntegrity */ 16451 }; 16452 16453 int rc = sqlite3_create_module(db, "sqlite_dbdata", &dbdata_module, 0); 16454 if( rc==SQLITE_OK ){ 16455 rc = sqlite3_create_module(db, "sqlite_dbptr", &dbdata_module, (void*)1); 16456 } 16457 return rc; 16458 } 16459 16460 int sqlite3_dbdata_init( 16461 sqlite3 *db, 16462 char **pzErrMsg, 16463 const sqlite3_api_routines *pApi 16464 ){ 16465 (void)pzErrMsg; 16466 return sqlite3DbdataRegister(db); 16467 } 16468 16469 #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */ 16470 16471 /************************* End ../ext/recover/dbdata.c ********************/ 16472 /************************* Begin ../ext/recover/sqlite3recover.c ******************/ 16473 /* 16474 ** 2022-08-27 16475 ** 16476 ** The author disclaims copyright to this source code. In place of 16477 ** a legal notice, here is a blessing: 16478 ** 16479 ** May you do good and not evil. 16480 ** May you find forgiveness for yourself and forgive others. 16481 ** May you share freely, never taking more than you give. 16482 ** 16483 ************************************************************************* 16484 ** 16485 */ 16486 16487 16488 /* #include "sqlite3recover.h" */ 16489 #include <assert.h> 16490 #include <string.h> 16491 16492 #ifndef SQLITE_OMIT_VIRTUALTABLE 16493 16494 /* 16495 ** Declaration for public API function in file dbdata.c. This may be called 16496 ** with NULL as the final two arguments to register the sqlite_dbptr and 16497 ** sqlite_dbdata virtual tables with a database handle. 16498 */ 16499 #ifdef _WIN32 16500 16501 #endif 16502 int sqlite3_dbdata_init(sqlite3*, char**, const sqlite3_api_routines*); 16503 16504 /* typedef unsigned int u32; */ 16505 /* typedef unsigned char u8; */ 16506 /* typedef sqlite3_int64 i64; */ 16507 16508 typedef struct RecoverTable RecoverTable; 16509 typedef struct RecoverColumn RecoverColumn; 16510 16511 /* 16512 ** When recovering rows of data that can be associated with table 16513 ** definitions recovered from the sqlite_schema table, each table is 16514 ** represented by an instance of the following object. 16515 ** 16516 ** iRoot: 16517 ** The root page in the original database. Not necessarily (and usually 16518 ** not) the same in the recovered database. 16519 ** 16520 ** zTab: 16521 ** Name of the table. 16522 ** 16523 ** nCol/aCol[]: 16524 ** aCol[] is an array of nCol columns. In the order in which they appear 16525 ** in the table. 16526 ** 16527 ** bIntkey: 16528 ** Set to true for intkey tables, false for WITHOUT ROWID. 16529 ** 16530 ** iRowidBind: 16531 ** Each column in the aCol[] array has associated with it the index of 16532 ** the bind parameter its values will be bound to in the INSERT statement 16533 ** used to construct the output database. If the table does has a rowid 16534 ** but not an INTEGER PRIMARY KEY column, then iRowidBind contains the 16535 ** index of the bind paramater to which the rowid value should be bound. 16536 ** Otherwise, it contains -1. If the table does contain an INTEGER PRIMARY 16537 ** KEY column, then the rowid value should be bound to the index associated 16538 ** with the column. 16539 ** 16540 ** pNext: 16541 ** All RecoverTable objects used by the recovery operation are allocated 16542 ** and populated as part of creating the recovered database schema in 16543 ** the output database, before any non-schema data are recovered. They 16544 ** are then stored in a singly-linked list linked by this variable beginning 16545 ** at sqlite3_recover.pTblList. 16546 */ 16547 struct RecoverTable { 16548 u32 iRoot; /* Root page in original database */ 16549 char *zTab; /* Name of table */ 16550 int nCol; /* Number of columns in table */ 16551 RecoverColumn *aCol; /* Array of columns */ 16552 int bIntkey; /* True for intkey, false for without rowid */ 16553 int iRowidBind; /* If >0, bind rowid to INSERT here */ 16554 RecoverTable *pNext; 16555 }; 16556 16557 /* 16558 ** Each database column is represented by an instance of the following object 16559 ** stored in the RecoverTable.aCol[] array of the associated table. 16560 ** 16561 ** iField: 16562 ** The index of the associated field within database records. Or -1 if 16563 ** there is no associated field (e.g. for virtual generated columns). 16564 ** 16565 ** iBind: 16566 ** The bind index of the INSERT statement to bind this columns values 16567 ** to. Or 0 if there is no such index (iff (iField<0)). 16568 ** 16569 ** bIPK: 16570 ** True if this is the INTEGER PRIMARY KEY column. 16571 ** 16572 ** zCol: 16573 ** Name of column. 16574 ** 16575 ** eHidden: 16576 ** A RECOVER_EHIDDEN_* constant value (see below for interpretation of each). 16577 */ 16578 struct RecoverColumn { 16579 int iField; /* Field in record on disk */ 16580 int iBind; /* Binding to use in INSERT */ 16581 int bIPK; /* True for IPK column */ 16582 char *zCol; 16583 int eHidden; 16584 }; 16585 16586 #define RECOVER_EHIDDEN_NONE 0 /* Normal database column */ 16587 #define RECOVER_EHIDDEN_HIDDEN 1 /* Column is __HIDDEN__ */ 16588 #define RECOVER_EHIDDEN_VIRTUAL 2 /* Virtual generated column */ 16589 #define RECOVER_EHIDDEN_STORED 3 /* Stored generated column */ 16590 16591 /* 16592 ** Bitmap object used to track pages in the input database. Allocated 16593 ** and manipulated only by the following functions: 16594 ** 16595 ** recoverBitmapAlloc() 16596 ** recoverBitmapFree() 16597 ** recoverBitmapSet() 16598 ** recoverBitmapQuery() 16599 ** 16600 ** nPg: 16601 ** Largest page number that may be stored in the bitmap. The range 16602 ** of valid keys is 1 to nPg, inclusive. 16603 ** 16604 ** aElem[]: 16605 ** Array large enough to contain a bit for each key. For key value 16606 ** iKey, the associated bit is the bit (iKey%32) of aElem[iKey/32]. 16607 ** In other words, the following is true if bit iKey is set, or 16608 ** false if it is clear: 16609 ** 16610 ** (aElem[iKey/32] & (1 << (iKey%32))) ? 1 : 0 16611 */ 16612 typedef struct RecoverBitmap RecoverBitmap; 16613 struct RecoverBitmap { 16614 i64 nPg; /* Size of bitmap */ 16615 u32 aElem[1]; /* Array of 32-bit bitmasks */ 16616 }; 16617 16618 /* 16619 ** State variables (part of the sqlite3_recover structure) used while 16620 ** recovering data for tables identified in the recovered schema (state 16621 ** RECOVER_STATE_WRITING). 16622 */ 16623 typedef struct RecoverStateW1 RecoverStateW1; 16624 struct RecoverStateW1 { 16625 sqlite3_stmt *pTbls; 16626 sqlite3_stmt *pSel; 16627 sqlite3_stmt *pInsert; 16628 int nInsert; 16629 16630 RecoverTable *pTab; /* Table currently being written */ 16631 int nMax; /* Max column count in any schema table */ 16632 sqlite3_value **apVal; /* Array of nMax values */ 16633 int nVal; /* Number of valid entries in apVal[] */ 16634 int bHaveRowid; 16635 i64 iRowid; 16636 i64 iPrevPage; 16637 int iPrevCell; 16638 }; 16639 16640 /* 16641 ** State variables (part of the sqlite3_recover structure) used while 16642 ** recovering data destined for the lost and found table (states 16643 ** RECOVER_STATE_LOSTANDFOUND[123]). 16644 */ 16645 typedef struct RecoverStateLAF RecoverStateLAF; 16646 struct RecoverStateLAF { 16647 RecoverBitmap *pUsed; 16648 i64 nPg; /* Size of db in pages */ 16649 sqlite3_stmt *pAllAndParent; 16650 sqlite3_stmt *pMapInsert; 16651 sqlite3_stmt *pMaxField; 16652 sqlite3_stmt *pUsedPages; 16653 sqlite3_stmt *pFindRoot; 16654 sqlite3_stmt *pInsert; /* INSERT INTO lost_and_found ... */ 16655 sqlite3_stmt *pAllPage; 16656 sqlite3_stmt *pPageData; 16657 sqlite3_value **apVal; 16658 int nMaxField; 16659 }; 16660 16661 /* 16662 ** Main recover handle structure. 16663 */ 16664 struct sqlite3_recover { 16665 /* Copies of sqlite3_recover_init[_sql]() parameters */ 16666 sqlite3 *dbIn; /* Input database */ 16667 char *zDb; /* Name of input db ("main" etc.) */ 16668 char *zUri; /* URI for output database */ 16669 void *pSqlCtx; /* SQL callback context */ 16670 int (*xSql)(void*,const char*); /* Pointer to SQL callback function */ 16671 16672 /* Values configured by sqlite3_recover_config() */ 16673 char *zStateDb; /* State database to use (or NULL) */ 16674 char *zLostAndFound; /* Name of lost-and-found table (or NULL) */ 16675 int bFreelistCorrupt; /* SQLITE_RECOVER_FREELIST_CORRUPT setting */ 16676 int bRecoverRowid; /* SQLITE_RECOVER_ROWIDS setting */ 16677 int bSlowIndexes; /* SQLITE_RECOVER_SLOWINDEXES setting */ 16678 16679 int pgsz; 16680 int detected_pgsz; 16681 int nReserve; 16682 u8 *pPage1Disk; 16683 u8 *pPage1Cache; 16684 16685 /* Error code and error message */ 16686 int errCode; /* For sqlite3_recover_errcode() */ 16687 char *zErrMsg; /* For sqlite3_recover_errmsg() */ 16688 16689 int eState; 16690 int bCloseTransaction; 16691 16692 /* Variables used with eState==RECOVER_STATE_WRITING */ 16693 RecoverStateW1 w1; 16694 16695 /* Variables used with states RECOVER_STATE_LOSTANDFOUND[123] */ 16696 RecoverStateLAF laf; 16697 16698 /* Fields used within sqlite3_recover_run() */ 16699 sqlite3 *dbOut; /* Output database */ 16700 sqlite3_stmt *pGetPage; /* SELECT against input db sqlite_dbdata */ 16701 RecoverTable *pTblList; /* List of tables recovered from schema */ 16702 }; 16703 16704 /* 16705 ** The various states in which an sqlite3_recover object may exist: 16706 ** 16707 ** RECOVER_STATE_INIT: 16708 ** The object is initially created in this state. sqlite3_recover_step() 16709 ** has yet to be called. This is the only state in which it is permitted 16710 ** to call sqlite3_recover_config(). 16711 ** 16712 ** RECOVER_STATE_WRITING: 16713 ** 16714 ** RECOVER_STATE_LOSTANDFOUND1: 16715 ** State to populate the bitmap of pages used by other tables or the 16716 ** database freelist. 16717 ** 16718 ** RECOVER_STATE_LOSTANDFOUND2: 16719 ** Populate the recovery.map table - used to figure out a "root" page 16720 ** for each lost page from in the database from which records are 16721 ** extracted. 16722 ** 16723 ** RECOVER_STATE_LOSTANDFOUND3: 16724 ** Populate the lost-and-found table itself. 16725 */ 16726 #define RECOVER_STATE_INIT 0 16727 #define RECOVER_STATE_WRITING 1 16728 #define RECOVER_STATE_LOSTANDFOUND1 2 16729 #define RECOVER_STATE_LOSTANDFOUND2 3 16730 #define RECOVER_STATE_LOSTANDFOUND3 4 16731 #define RECOVER_STATE_SCHEMA2 5 16732 #define RECOVER_STATE_DONE 6 16733 16734 16735 /* 16736 ** Global variables used by this extension. 16737 */ 16738 typedef struct RecoverGlobal RecoverGlobal; 16739 struct RecoverGlobal { 16740 const sqlite3_io_methods *pMethods; 16741 sqlite3_recover *p; 16742 }; 16743 static RecoverGlobal recover_g; 16744 16745 /* 16746 ** Use this static SQLite mutex to protect the globals during the 16747 ** first call to sqlite3_recover_step(). 16748 */ 16749 #define RECOVER_MUTEX_ID SQLITE_MUTEX_STATIC_APP2 16750 16751 16752 /* 16753 ** Default value for SQLITE_RECOVER_ROWIDS (sqlite3_recover.bRecoverRowid). 16754 */ 16755 #define RECOVER_ROWID_DEFAULT 1 16756 16757 /* 16758 ** Mutex handling: 16759 ** 16760 ** recoverEnterMutex() - Enter the recovery mutex 16761 ** recoverLeaveMutex() - Leave the recovery mutex 16762 ** recoverAssertMutexHeld() - Assert that the recovery mutex is held 16763 */ 16764 #if defined(SQLITE_THREADSAFE) && SQLITE_THREADSAFE==0 16765 # define recoverEnterMutex() 16766 # define recoverLeaveMutex() 16767 #else 16768 static void recoverEnterMutex(void){ 16769 sqlite3_mutex_enter(sqlite3_mutex_alloc(RECOVER_MUTEX_ID)); 16770 } 16771 static void recoverLeaveMutex(void){ 16772 sqlite3_mutex_leave(sqlite3_mutex_alloc(RECOVER_MUTEX_ID)); 16773 } 16774 #endif 16775 #if SQLITE_THREADSAFE+0>=1 && defined(SQLITE_DEBUG) 16776 static void recoverAssertMutexHeld(void){ 16777 assert( sqlite3_mutex_held(sqlite3_mutex_alloc(RECOVER_MUTEX_ID)) ); 16778 } 16779 #else 16780 # define recoverAssertMutexHeld() 16781 #endif 16782 16783 16784 /* 16785 ** Like strlen(). But handles NULL pointer arguments. 16786 */ 16787 static int recoverStrlen(const char *zStr){ 16788 if( zStr==0 ) return 0; 16789 return (int)(strlen(zStr)&0x7fffffff); 16790 } 16791 16792 /* 16793 ** This function is a no-op if the recover handle passed as the first 16794 ** argument already contains an error (if p->errCode!=SQLITE_OK). 16795 ** 16796 ** Otherwise, an attempt is made to allocate, zero and return a buffer nByte 16797 ** bytes in size. If successful, a pointer to the new buffer is returned. Or, 16798 ** if an OOM error occurs, NULL is returned and the handle error code 16799 ** (p->errCode) set to SQLITE_NOMEM. 16800 */ 16801 static void *recoverMalloc(sqlite3_recover *p, i64 nByte){ 16802 void *pRet = 0; 16803 assert( nByte>0 ); 16804 if( p->errCode==SQLITE_OK ){ 16805 pRet = sqlite3_malloc64(nByte); 16806 if( pRet ){ 16807 memset(pRet, 0, nByte); 16808 }else{ 16809 p->errCode = SQLITE_NOMEM; 16810 } 16811 } 16812 return pRet; 16813 } 16814 16815 /* 16816 ** Set the error code and error message for the recover handle passed as 16817 ** the first argument. The error code is set to the value of parameter 16818 ** errCode. 16819 ** 16820 ** Parameter zFmt must be a printf() style formatting string. The handle 16821 ** error message is set to the result of using any trailing arguments for 16822 ** parameter substitutions in the formatting string. 16823 ** 16824 ** For example: 16825 ** 16826 ** recoverError(p, SQLITE_ERROR, "no such table: %s", zTablename); 16827 */ 16828 static int recoverError( 16829 sqlite3_recover *p, 16830 int errCode, 16831 const char *zFmt, ... 16832 ){ 16833 char *z = 0; 16834 va_list ap; 16835 va_start(ap, zFmt); 16836 if( zFmt ){ 16837 z = sqlite3_vmprintf(zFmt, ap); 16838 } 16839 va_end(ap); 16840 sqlite3_free(p->zErrMsg); 16841 p->zErrMsg = z; 16842 p->errCode = errCode; 16843 return errCode; 16844 } 16845 16846 16847 /* 16848 ** This function is a no-op if p->errCode is initially other than SQLITE_OK. 16849 ** In this case it returns NULL. 16850 ** 16851 ** Otherwise, an attempt is made to allocate and return a bitmap object 16852 ** large enough to store a bit for all page numbers between 1 and nPg, 16853 ** inclusive. The bitmap is initially zeroed. 16854 */ 16855 static RecoverBitmap *recoverBitmapAlloc(sqlite3_recover *p, i64 nPg){ 16856 int nElem = (nPg+1+31) / 32; 16857 int nByte = sizeof(RecoverBitmap) + nElem*sizeof(u32); 16858 RecoverBitmap *pRet = (RecoverBitmap*)recoverMalloc(p, nByte); 16859 16860 if( pRet ){ 16861 pRet->nPg = nPg; 16862 } 16863 return pRet; 16864 } 16865 16866 /* 16867 ** Free a bitmap object allocated by recoverBitmapAlloc(). 16868 */ 16869 static void recoverBitmapFree(RecoverBitmap *pMap){ 16870 sqlite3_free(pMap); 16871 } 16872 16873 /* 16874 ** Set the bit associated with page iPg in bitvec pMap. 16875 */ 16876 static void recoverBitmapSet(RecoverBitmap *pMap, i64 iPg){ 16877 if( iPg<=pMap->nPg ){ 16878 int iElem = (iPg / 32); 16879 int iBit = (iPg % 32); 16880 pMap->aElem[iElem] |= (((u32)1) << iBit); 16881 } 16882 } 16883 16884 /* 16885 ** Query bitmap object pMap for the state of the bit associated with page 16886 ** iPg. Return 1 if it is set, or 0 otherwise. 16887 */ 16888 static int recoverBitmapQuery(RecoverBitmap *pMap, i64 iPg){ 16889 int ret = 1; 16890 if( iPg<=pMap->nPg && iPg>0 ){ 16891 int iElem = (iPg / 32); 16892 int iBit = (iPg % 32); 16893 ret = (pMap->aElem[iElem] & (((u32)1) << iBit)) ? 1 : 0; 16894 } 16895 return ret; 16896 } 16897 16898 /* 16899 ** Set the recover handle error to the error code and message returned by 16900 ** calling sqlite3_errcode() and sqlite3_errmsg(), respectively, on database 16901 ** handle db. 16902 */ 16903 static int recoverDbError(sqlite3_recover *p, sqlite3 *db){ 16904 return recoverError(p, sqlite3_errcode(db), "%s", sqlite3_errmsg(db)); 16905 } 16906 16907 /* 16908 ** This function is a no-op if recover handle p already contains an error 16909 ** (if p->errCode!=SQLITE_OK). 16910 ** 16911 ** Otherwise, it attempts to prepare the SQL statement in zSql against 16912 ** database handle db. If successful, the statement handle is returned. 16913 ** Or, if an error occurs, NULL is returned and an error left in the 16914 ** recover handle. 16915 */ 16916 static sqlite3_stmt *recoverPrepare( 16917 sqlite3_recover *p, 16918 sqlite3 *db, 16919 const char *zSql 16920 ){ 16921 sqlite3_stmt *pStmt = 0; 16922 if( p->errCode==SQLITE_OK ){ 16923 if( sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0) ){ 16924 recoverDbError(p, db); 16925 } 16926 } 16927 return pStmt; 16928 } 16929 16930 /* 16931 ** This function is a no-op if recover handle p already contains an error 16932 ** (if p->errCode!=SQLITE_OK). 16933 ** 16934 ** Otherwise, argument zFmt is used as a printf() style format string, 16935 ** along with any trailing arguments, to create an SQL statement. This 16936 ** SQL statement is prepared against database handle db and, if successful, 16937 ** the statment handle returned. Or, if an error occurs - either during 16938 ** the printf() formatting or when preparing the resulting SQL - an 16939 ** error code and message are left in the recover handle. 16940 */ 16941 static sqlite3_stmt *recoverPreparePrintf( 16942 sqlite3_recover *p, 16943 sqlite3 *db, 16944 const char *zFmt, ... 16945 ){ 16946 sqlite3_stmt *pStmt = 0; 16947 if( p->errCode==SQLITE_OK ){ 16948 va_list ap; 16949 char *z; 16950 va_start(ap, zFmt); 16951 z = sqlite3_vmprintf(zFmt, ap); 16952 va_end(ap); 16953 if( z==0 ){ 16954 p->errCode = SQLITE_NOMEM; 16955 }else{ 16956 pStmt = recoverPrepare(p, db, z); 16957 sqlite3_free(z); 16958 } 16959 } 16960 return pStmt; 16961 } 16962 16963 /* 16964 ** Reset SQLite statement handle pStmt. If the call to sqlite3_reset() 16965 ** indicates that an error occurred, and there is not already an error 16966 ** in the recover handle passed as the first argument, set the error 16967 ** code and error message appropriately. 16968 ** 16969 ** This function returns a copy of the statement handle pointer passed 16970 ** as the second argument. 16971 */ 16972 static sqlite3_stmt *recoverReset(sqlite3_recover *p, sqlite3_stmt *pStmt){ 16973 int rc = sqlite3_reset(pStmt); 16974 if( rc!=SQLITE_OK && rc!=SQLITE_CONSTRAINT && p->errCode==SQLITE_OK ){ 16975 recoverDbError(p, sqlite3_db_handle(pStmt)); 16976 } 16977 return pStmt; 16978 } 16979 16980 /* 16981 ** Finalize SQLite statement handle pStmt. If the call to sqlite3_reset() 16982 ** indicates that an error occurred, and there is not already an error 16983 ** in the recover handle passed as the first argument, set the error 16984 ** code and error message appropriately. 16985 */ 16986 static void recoverFinalize(sqlite3_recover *p, sqlite3_stmt *pStmt){ 16987 sqlite3 *db = sqlite3_db_handle(pStmt); 16988 int rc = sqlite3_finalize(pStmt); 16989 if( rc!=SQLITE_OK && p->errCode==SQLITE_OK ){ 16990 recoverDbError(p, db); 16991 } 16992 } 16993 16994 /* 16995 ** This function is a no-op if recover handle p already contains an error 16996 ** (if p->errCode!=SQLITE_OK). A copy of p->errCode is returned in this 16997 ** case. 16998 ** 16999 ** Otherwise, execute SQL script zSql. If successful, return SQLITE_OK. 17000 ** Or, if an error occurs, leave an error code and message in the recover 17001 ** handle and return a copy of the error code. 17002 */ 17003 static int recoverExec(sqlite3_recover *p, sqlite3 *db, const char *zSql){ 17004 if( p->errCode==SQLITE_OK ){ 17005 int rc = sqlite3_exec(db, zSql, 0, 0, 0); 17006 if( rc ){ 17007 recoverDbError(p, db); 17008 } 17009 } 17010 return p->errCode; 17011 } 17012 17013 /* 17014 ** Bind the value pVal to parameter iBind of statement pStmt. Leave an 17015 ** error in the recover handle passed as the first argument if an error 17016 ** (e.g. an OOM) occurs. 17017 */ 17018 static void recoverBindValue( 17019 sqlite3_recover *p, 17020 sqlite3_stmt *pStmt, 17021 int iBind, 17022 sqlite3_value *pVal 17023 ){ 17024 if( p->errCode==SQLITE_OK ){ 17025 int rc = sqlite3_bind_value(pStmt, iBind, pVal); 17026 if( rc ) recoverError(p, rc, 0); 17027 } 17028 } 17029 17030 /* 17031 ** This function is a no-op if recover handle p already contains an error 17032 ** (if p->errCode!=SQLITE_OK). NULL is returned in this case. 17033 ** 17034 ** Otherwise, an attempt is made to interpret zFmt as a printf() style 17035 ** formatting string and the result of using the trailing arguments for 17036 ** parameter substitution with it written into a buffer obtained from 17037 ** sqlite3_malloc(). If successful, a pointer to the buffer is returned. 17038 ** It is the responsibility of the caller to eventually free the buffer 17039 ** using sqlite3_free(). 17040 ** 17041 ** Or, if an error occurs, an error code and message is left in the recover 17042 ** handle and NULL returned. 17043 */ 17044 static char *recoverMPrintf(sqlite3_recover *p, const char *zFmt, ...){ 17045 va_list ap; 17046 char *z; 17047 va_start(ap, zFmt); 17048 z = sqlite3_vmprintf(zFmt, ap); 17049 va_end(ap); 17050 if( p->errCode==SQLITE_OK ){ 17051 if( z==0 ) p->errCode = SQLITE_NOMEM; 17052 }else{ 17053 sqlite3_free(z); 17054 z = 0; 17055 } 17056 return z; 17057 } 17058 17059 /* 17060 ** This function is a no-op if recover handle p already contains an error 17061 ** (if p->errCode!=SQLITE_OK). Zero is returned in this case. 17062 ** 17063 ** Otherwise, execute "PRAGMA page_count" against the input database. If 17064 ** successful, return the integer result. Or, if an error occurs, leave an 17065 ** error code and error message in the sqlite3_recover handle and return 17066 ** zero. 17067 */ 17068 static i64 recoverPageCount(sqlite3_recover *p){ 17069 i64 nPg = 0; 17070 if( p->errCode==SQLITE_OK ){ 17071 sqlite3_stmt *pStmt = 0; 17072 pStmt = recoverPreparePrintf(p, p->dbIn, "PRAGMA %Q.page_count", p->zDb); 17073 if( pStmt ){ 17074 sqlite3_step(pStmt); 17075 nPg = sqlite3_column_int64(pStmt, 0); 17076 } 17077 recoverFinalize(p, pStmt); 17078 } 17079 return nPg; 17080 } 17081 17082 /* 17083 ** Implementation of SQL scalar function "read_i32". The first argument to 17084 ** this function must be a blob. The second a non-negative integer. This 17085 ** function reads and returns a 32-bit big-endian integer from byte 17086 ** offset (4*<arg2>) of the blob. 17087 ** 17088 ** SELECT read_i32(<blob>, <idx>) 17089 */ 17090 static void recoverReadI32( 17091 sqlite3_context *context, 17092 int argc, 17093 sqlite3_value **argv 17094 ){ 17095 const unsigned char *pBlob; 17096 int nBlob; 17097 int iInt; 17098 17099 assert( argc==2 ); 17100 nBlob = sqlite3_value_bytes(argv[0]); 17101 pBlob = (const unsigned char*)sqlite3_value_blob(argv[0]); 17102 iInt = sqlite3_value_int(argv[1]) & 0xFFFF; 17103 17104 if( (iInt+1)*4<=nBlob ){ 17105 const unsigned char *a = &pBlob[iInt*4]; 17106 i64 iVal = ((i64)a[0]<<24) 17107 + ((i64)a[1]<<16) 17108 + ((i64)a[2]<< 8) 17109 + ((i64)a[3]<< 0); 17110 sqlite3_result_int64(context, iVal); 17111 } 17112 } 17113 17114 /* 17115 ** Implementation of SQL scalar function "page_is_used". This function 17116 ** is used as part of the procedure for locating orphan rows for the 17117 ** lost-and-found table, and it depends on those routines having populated 17118 ** the sqlite3_recover.laf.pUsed variable. 17119 ** 17120 ** The only argument to this function is a page-number. It returns true 17121 ** if the page has already been used somehow during data recovery, or false 17122 ** otherwise. 17123 ** 17124 ** SELECT page_is_used(<pgno>); 17125 */ 17126 static void recoverPageIsUsed( 17127 sqlite3_context *pCtx, 17128 int nArg, 17129 sqlite3_value **apArg 17130 ){ 17131 sqlite3_recover *p = (sqlite3_recover*)sqlite3_user_data(pCtx); 17132 i64 pgno = sqlite3_value_int64(apArg[0]); 17133 assert( nArg==1 ); 17134 sqlite3_result_int(pCtx, recoverBitmapQuery(p->laf.pUsed, pgno)); 17135 } 17136 17137 /* 17138 ** The implementation of a user-defined SQL function invoked by the 17139 ** sqlite_dbdata and sqlite_dbptr virtual table modules to access pages 17140 ** of the database being recovered. 17141 ** 17142 ** This function always takes a single integer argument. If the argument 17143 ** is zero, then the value returned is the number of pages in the db being 17144 ** recovered. If the argument is greater than zero, it is a page number. 17145 ** The value returned in this case is an SQL blob containing the data for 17146 ** the identified page of the db being recovered. e.g. 17147 ** 17148 ** SELECT getpage(0); -- return number of pages in db 17149 ** SELECT getpage(4); -- return page 4 of db as a blob of data 17150 */ 17151 static void recoverGetPage( 17152 sqlite3_context *pCtx, 17153 int nArg, 17154 sqlite3_value **apArg 17155 ){ 17156 sqlite3_recover *p = (sqlite3_recover*)sqlite3_user_data(pCtx); 17157 i64 pgno = sqlite3_value_int64(apArg[0]); 17158 sqlite3_stmt *pStmt = 0; 17159 17160 assert( nArg==1 ); 17161 if( pgno==0 ){ 17162 i64 nPg = recoverPageCount(p); 17163 sqlite3_result_int64(pCtx, nPg); 17164 return; 17165 }else{ 17166 if( p->pGetPage==0 ){ 17167 pStmt = p->pGetPage = recoverPreparePrintf( 17168 p, p->dbIn, "SELECT data FROM sqlite_dbpage(%Q) WHERE pgno=?", p->zDb 17169 ); 17170 }else if( p->errCode==SQLITE_OK ){ 17171 pStmt = p->pGetPage; 17172 } 17173 17174 if( pStmt ){ 17175 sqlite3_bind_int64(pStmt, 1, pgno); 17176 if( SQLITE_ROW==sqlite3_step(pStmt) ){ 17177 const u8 *aPg; 17178 int nPg; 17179 assert( p->errCode==SQLITE_OK ); 17180 aPg = sqlite3_column_blob(pStmt, 0); 17181 nPg = sqlite3_column_bytes(pStmt, 0); 17182 if( pgno==1 && nPg==p->pgsz && 0==memcmp(p->pPage1Cache, aPg, nPg) ){ 17183 aPg = p->pPage1Disk; 17184 } 17185 sqlite3_result_blob(pCtx, aPg, nPg-p->nReserve, SQLITE_TRANSIENT); 17186 } 17187 recoverReset(p, pStmt); 17188 } 17189 } 17190 17191 if( p->errCode ){ 17192 if( p->zErrMsg ) sqlite3_result_error(pCtx, p->zErrMsg, -1); 17193 sqlite3_result_error_code(pCtx, p->errCode); 17194 } 17195 } 17196 17197 /* 17198 ** Find a string that is not found anywhere in z[]. Return a pointer 17199 ** to that string. 17200 ** 17201 ** Try to use zA and zB first. If both of those are already found in z[] 17202 ** then make up some string and store it in the buffer zBuf. 17203 */ 17204 static const char *recoverUnusedString( 17205 const char *z, /* Result must not appear anywhere in z */ 17206 const char *zA, const char *zB, /* Try these first */ 17207 char *zBuf /* Space to store a generated string */ 17208 ){ 17209 unsigned i = 0; 17210 if( strstr(z, zA)==0 ) return zA; 17211 if( strstr(z, zB)==0 ) return zB; 17212 do{ 17213 sqlite3_snprintf(20,zBuf,"(%s%u)", zA, i++); 17214 }while( strstr(z,zBuf)!=0 ); 17215 return zBuf; 17216 } 17217 17218 /* 17219 ** Implementation of scalar SQL function "escape_crnl". The argument passed to 17220 ** this function is the output of built-in function quote(). If the first 17221 ** character of the input is "'", indicating that the value passed to quote() 17222 ** was a text value, then this function searches the input for "\n" and "\r" 17223 ** characters and adds a wrapper similar to the following: 17224 ** 17225 ** replace(replace(<input>, '\n', char(10), '\r', char(13)); 17226 ** 17227 ** Or, if the first character of the input is not "'", then a copy of the input 17228 ** is returned. 17229 */ 17230 static void recoverEscapeCrnl( 17231 sqlite3_context *context, 17232 int argc, 17233 sqlite3_value **argv 17234 ){ 17235 const char *zText = (const char*)sqlite3_value_text(argv[0]); 17236 (void)argc; 17237 if( zText && zText[0]=='\'' ){ 17238 int nText = sqlite3_value_bytes(argv[0]); 17239 int i; 17240 char zBuf1[20]; 17241 char zBuf2[20]; 17242 const char *zNL = 0; 17243 const char *zCR = 0; 17244 int nCR = 0; 17245 int nNL = 0; 17246 17247 for(i=0; zText[i]; i++){ 17248 if( zNL==0 && zText[i]=='\n' ){ 17249 zNL = recoverUnusedString(zText, "\\n", "\\012", zBuf1); 17250 nNL = (int)strlen(zNL); 17251 } 17252 if( zCR==0 && zText[i]=='\r' ){ 17253 zCR = recoverUnusedString(zText, "\\r", "\\015", zBuf2); 17254 nCR = (int)strlen(zCR); 17255 } 17256 } 17257 17258 if( zNL || zCR ){ 17259 int iOut = 0; 17260 i64 nMax = (nNL > nCR) ? nNL : nCR; 17261 i64 nAlloc = nMax * nText + (nMax+64)*2; 17262 char *zOut = (char*)sqlite3_malloc64(nAlloc); 17263 if( zOut==0 ){ 17264 sqlite3_result_error_nomem(context); 17265 return; 17266 } 17267 17268 if( zNL && zCR ){ 17269 memcpy(&zOut[iOut], "replace(replace(", 16); 17270 iOut += 16; 17271 }else{ 17272 memcpy(&zOut[iOut], "replace(", 8); 17273 iOut += 8; 17274 } 17275 for(i=0; zText[i]; i++){ 17276 if( zText[i]=='\n' ){ 17277 memcpy(&zOut[iOut], zNL, nNL); 17278 iOut += nNL; 17279 }else if( zText[i]=='\r' ){ 17280 memcpy(&zOut[iOut], zCR, nCR); 17281 iOut += nCR; 17282 }else{ 17283 zOut[iOut] = zText[i]; 17284 iOut++; 17285 } 17286 } 17287 17288 if( zNL ){ 17289 memcpy(&zOut[iOut], ",'", 2); iOut += 2; 17290 memcpy(&zOut[iOut], zNL, nNL); iOut += nNL; 17291 memcpy(&zOut[iOut], "', char(10))", 12); iOut += 12; 17292 } 17293 if( zCR ){ 17294 memcpy(&zOut[iOut], ",'", 2); iOut += 2; 17295 memcpy(&zOut[iOut], zCR, nCR); iOut += nCR; 17296 memcpy(&zOut[iOut], "', char(13))", 12); iOut += 12; 17297 } 17298 17299 sqlite3_result_text(context, zOut, iOut, SQLITE_TRANSIENT); 17300 sqlite3_free(zOut); 17301 return; 17302 } 17303 } 17304 17305 sqlite3_result_value(context, argv[0]); 17306 } 17307 17308 /* 17309 ** This function is a no-op if recover handle p already contains an error 17310 ** (if p->errCode!=SQLITE_OK). A copy of the error code is returned in 17311 ** this case. 17312 ** 17313 ** Otherwise, attempt to populate temporary table "recovery.schema" with the 17314 ** parts of the database schema that can be extracted from the input database. 17315 ** 17316 ** If no error occurs, SQLITE_OK is returned. Otherwise, an error code 17317 ** and error message are left in the recover handle and a copy of the 17318 ** error code returned. It is not considered an error if part of all of 17319 ** the database schema cannot be recovered due to corruption. 17320 */ 17321 static int recoverCacheSchema(sqlite3_recover *p){ 17322 return recoverExec(p, p->dbOut, 17323 "WITH RECURSIVE pages(p) AS (" 17324 " SELECT 1" 17325 " UNION" 17326 " SELECT child FROM sqlite_dbptr('getpage()'), pages WHERE pgno=p" 17327 ")" 17328 "INSERT INTO recovery.schema SELECT" 17329 " max(CASE WHEN field=0 THEN value ELSE NULL END)," 17330 " max(CASE WHEN field=1 THEN value ELSE NULL END)," 17331 " max(CASE WHEN field=2 THEN value ELSE NULL END)," 17332 " max(CASE WHEN field=3 THEN value ELSE NULL END)," 17333 " max(CASE WHEN field=4 THEN value ELSE NULL END)" 17334 "FROM sqlite_dbdata('getpage()') WHERE pgno IN (" 17335 " SELECT p FROM pages" 17336 ") GROUP BY pgno, cell" 17337 ); 17338 } 17339 17340 /* 17341 ** If this recover handle is not in SQL callback mode (i.e. was not created 17342 ** using sqlite3_recover_init_sql()) of if an error has already occurred, 17343 ** this function is a no-op. Otherwise, issue a callback with SQL statement 17344 ** zSql as the parameter. 17345 ** 17346 ** If the callback returns non-zero, set the recover handle error code to 17347 ** the value returned (so that the caller will abandon processing). 17348 */ 17349 static void recoverSqlCallback(sqlite3_recover *p, const char *zSql){ 17350 if( p->errCode==SQLITE_OK && p->xSql ){ 17351 int res = p->xSql(p->pSqlCtx, zSql); 17352 if( res ){ 17353 recoverError(p, SQLITE_ERROR, "callback returned an error - %d", res); 17354 } 17355 } 17356 } 17357 17358 /* 17359 ** Transfer the following settings from the input database to the output 17360 ** database: 17361 ** 17362 ** + page-size, 17363 ** + auto-vacuum settings, 17364 ** + database encoding, 17365 ** + user-version (PRAGMA user_version), and 17366 ** + application-id (PRAGMA application_id), and 17367 */ 17368 static void recoverTransferSettings(sqlite3_recover *p){ 17369 const char *aPragma[] = { 17370 "encoding", 17371 "page_size", 17372 "auto_vacuum", 17373 "user_version", 17374 "application_id" 17375 }; 17376 int ii; 17377 17378 /* Truncate the output database to 0 pages in size. This is done by 17379 ** opening a new, empty, temp db, then using the backup API to clobber 17380 ** any existing output db with a copy of it. */ 17381 if( p->errCode==SQLITE_OK ){ 17382 sqlite3 *db2 = 0; 17383 int rc = sqlite3_open("", &db2); 17384 if( rc!=SQLITE_OK ){ 17385 recoverDbError(p, db2); 17386 return; 17387 } 17388 17389 for(ii=0; ii<(int)(sizeof(aPragma)/sizeof(aPragma[0])); ii++){ 17390 const char *zPrag = aPragma[ii]; 17391 sqlite3_stmt *p1 = 0; 17392 p1 = recoverPreparePrintf(p, p->dbIn, "PRAGMA %Q.%s", p->zDb, zPrag); 17393 if( p->errCode==SQLITE_OK && sqlite3_step(p1)==SQLITE_ROW ){ 17394 const char *zArg = (const char*)sqlite3_column_text(p1, 0); 17395 char *z2 = recoverMPrintf(p, "PRAGMA %s = %Q", zPrag, zArg); 17396 recoverSqlCallback(p, z2); 17397 recoverExec(p, db2, z2); 17398 sqlite3_free(z2); 17399 if( zArg==0 ){ 17400 recoverError(p, SQLITE_NOMEM, 0); 17401 } 17402 } 17403 recoverFinalize(p, p1); 17404 } 17405 recoverExec(p, db2, "CREATE TABLE t1(a); DROP TABLE t1;"); 17406 17407 if( p->errCode==SQLITE_OK ){ 17408 sqlite3 *db = p->dbOut; 17409 sqlite3_backup *pBackup = sqlite3_backup_init(db, "main", db2, "main"); 17410 if( pBackup ){ 17411 sqlite3_backup_step(pBackup, -1); 17412 p->errCode = sqlite3_backup_finish(pBackup); 17413 }else{ 17414 recoverDbError(p, db); 17415 } 17416 } 17417 17418 sqlite3_close(db2); 17419 } 17420 } 17421 17422 /* 17423 ** This function is a no-op if recover handle p already contains an error 17424 ** (if p->errCode!=SQLITE_OK). A copy of the error code is returned in 17425 ** this case. 17426 ** 17427 ** Otherwise, an attempt is made to open the output database, attach 17428 ** and create the schema of the temporary database used to store 17429 ** intermediate data, and to register all required user functions and 17430 ** virtual table modules with the output handle. 17431 ** 17432 ** If no error occurs, SQLITE_OK is returned. Otherwise, an error code 17433 ** and error message are left in the recover handle and a copy of the 17434 ** error code returned. 17435 */ 17436 static int recoverOpenOutput(sqlite3_recover *p){ 17437 struct Func { 17438 const char *zName; 17439 int nArg; 17440 void (*xFunc)(sqlite3_context*,int,sqlite3_value **); 17441 } aFunc[] = { 17442 { "getpage", 1, recoverGetPage }, 17443 { "page_is_used", 1, recoverPageIsUsed }, 17444 { "read_i32", 2, recoverReadI32 }, 17445 { "escape_crnl", 1, recoverEscapeCrnl }, 17446 }; 17447 17448 const int flags = SQLITE_OPEN_URI|SQLITE_OPEN_CREATE|SQLITE_OPEN_READWRITE; 17449 sqlite3 *db = 0; /* New database handle */ 17450 int ii; /* For iterating through aFunc[] */ 17451 17452 assert( p->dbOut==0 ); 17453 17454 if( sqlite3_open_v2(p->zUri, &db, flags, 0) ){ 17455 recoverDbError(p, db); 17456 } 17457 17458 /* Register the sqlite_dbdata and sqlite_dbptr virtual table modules. 17459 ** These two are registered with the output database handle - this 17460 ** module depends on the input handle supporting the sqlite_dbpage 17461 ** virtual table only. */ 17462 if( p->errCode==SQLITE_OK ){ 17463 p->errCode = sqlite3_dbdata_init(db, 0, 0); 17464 } 17465 17466 /* Register the custom user-functions with the output handle. */ 17467 for(ii=0; 17468 p->errCode==SQLITE_OK && ii<(int)(sizeof(aFunc)/sizeof(aFunc[0])); 17469 ii++){ 17470 p->errCode = sqlite3_create_function(db, aFunc[ii].zName, 17471 aFunc[ii].nArg, SQLITE_UTF8, (void*)p, aFunc[ii].xFunc, 0, 0 17472 ); 17473 } 17474 17475 p->dbOut = db; 17476 return p->errCode; 17477 } 17478 17479 /* 17480 ** Attach the auxiliary database 'recovery' to the output database handle. 17481 ** This temporary database is used during the recovery process and then 17482 ** discarded. 17483 */ 17484 static void recoverOpenRecovery(sqlite3_recover *p){ 17485 char *zSql = recoverMPrintf(p, "ATTACH %Q AS recovery;", p->zStateDb); 17486 recoverExec(p, p->dbOut, zSql); 17487 recoverExec(p, p->dbOut, 17488 "PRAGMA writable_schema = 1;" 17489 "CREATE TABLE recovery.map(pgno INTEGER PRIMARY KEY, parent INT);" 17490 "CREATE TABLE recovery.schema(type, name, tbl_name, rootpage, sql);" 17491 ); 17492 sqlite3_free(zSql); 17493 } 17494 17495 17496 /* 17497 ** This function is a no-op if recover handle p already contains an error 17498 ** (if p->errCode!=SQLITE_OK). 17499 ** 17500 ** Otherwise, argument zName must be the name of a table that has just been 17501 ** created in the output database. This function queries the output db 17502 ** for the schema of said table, and creates a RecoverTable object to 17503 ** store the schema in memory. The new RecoverTable object is linked into 17504 ** the list at sqlite3_recover.pTblList. 17505 ** 17506 ** Parameter iRoot must be the root page of table zName in the INPUT 17507 ** database. 17508 */ 17509 static void recoverAddTable( 17510 sqlite3_recover *p, 17511 const char *zName, /* Name of table created in output db */ 17512 i64 iRoot /* Root page of same table in INPUT db */ 17513 ){ 17514 sqlite3_stmt *pStmt = recoverPreparePrintf(p, p->dbOut, 17515 "PRAGMA table_xinfo(%Q)", zName 17516 ); 17517 17518 if( pStmt ){ 17519 int iPk = -1; 17520 int iBind = 1; 17521 RecoverTable *pNew = 0; 17522 int nCol = 0; 17523 int nName = recoverStrlen(zName); 17524 int nByte = 0; 17525 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 17526 nCol++; 17527 nByte += (sqlite3_column_bytes(pStmt, 1)+1); 17528 } 17529 nByte += sizeof(RecoverTable) + nCol*sizeof(RecoverColumn) + nName+1; 17530 recoverReset(p, pStmt); 17531 17532 pNew = recoverMalloc(p, nByte); 17533 if( pNew ){ 17534 int i = 0; 17535 int iField = 0; 17536 char *csr = 0; 17537 pNew->aCol = (RecoverColumn*)&pNew[1]; 17538 pNew->zTab = csr = (char*)&pNew->aCol[nCol]; 17539 pNew->nCol = nCol; 17540 pNew->iRoot = iRoot; 17541 memcpy(csr, zName, nName); 17542 csr += nName+1; 17543 17544 for(i=0; sqlite3_step(pStmt)==SQLITE_ROW; i++){ 17545 int iPKF = sqlite3_column_int(pStmt, 5); 17546 int n = sqlite3_column_bytes(pStmt, 1); 17547 const char *z = (const char*)sqlite3_column_text(pStmt, 1); 17548 const char *zType = (const char*)sqlite3_column_text(pStmt, 2); 17549 int eHidden = sqlite3_column_int(pStmt, 6); 17550 17551 if( iPk==-1 && iPKF==1 && !sqlite3_stricmp("integer", zType) ) iPk = i; 17552 if( iPKF>1 ) iPk = -2; 17553 pNew->aCol[i].zCol = csr; 17554 pNew->aCol[i].eHidden = eHidden; 17555 if( eHidden==RECOVER_EHIDDEN_VIRTUAL ){ 17556 pNew->aCol[i].iField = -1; 17557 }else{ 17558 pNew->aCol[i].iField = iField++; 17559 } 17560 if( eHidden!=RECOVER_EHIDDEN_VIRTUAL 17561 && eHidden!=RECOVER_EHIDDEN_STORED 17562 ){ 17563 pNew->aCol[i].iBind = iBind++; 17564 } 17565 memcpy(csr, z, n); 17566 csr += (n+1); 17567 } 17568 17569 pNew->pNext = p->pTblList; 17570 p->pTblList = pNew; 17571 pNew->bIntkey = 1; 17572 } 17573 17574 recoverFinalize(p, pStmt); 17575 17576 pStmt = recoverPreparePrintf(p, p->dbOut, "PRAGMA index_xinfo(%Q)", zName); 17577 while( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){ 17578 int iField = sqlite3_column_int(pStmt, 0); 17579 int iCol = sqlite3_column_int(pStmt, 1); 17580 17581 assert( iCol<pNew->nCol ); 17582 pNew->aCol[iCol].iField = iField; 17583 17584 pNew->bIntkey = 0; 17585 iPk = -2; 17586 } 17587 recoverFinalize(p, pStmt); 17588 17589 if( p->errCode==SQLITE_OK ){ 17590 if( iPk>=0 ){ 17591 pNew->aCol[iPk].bIPK = 1; 17592 }else if( pNew->bIntkey ){ 17593 pNew->iRowidBind = iBind++; 17594 } 17595 } 17596 } 17597 } 17598 17599 /* 17600 ** This function is called after recoverCacheSchema() has cached those parts 17601 ** of the input database schema that could be recovered in temporary table 17602 ** "recovery.schema". This function creates in the output database copies 17603 ** of all parts of that schema that must be created before the tables can 17604 ** be populated. Specifically, this means: 17605 ** 17606 ** * all tables that are not VIRTUAL, and 17607 ** * UNIQUE indexes. 17608 ** 17609 ** If the recovery handle uses SQL callbacks, then callbacks containing 17610 ** the associated "CREATE TABLE" and "CREATE INDEX" statements are made. 17611 ** 17612 ** Additionally, records are added to the sqlite_schema table of the 17613 ** output database for any VIRTUAL tables. The CREATE VIRTUAL TABLE 17614 ** records are written directly to sqlite_schema, not actually executed. 17615 ** If the handle is in SQL callback mode, then callbacks are invoked 17616 ** with equivalent SQL statements. 17617 */ 17618 static int recoverWriteSchema1(sqlite3_recover *p){ 17619 sqlite3_stmt *pSelect = 0; 17620 sqlite3_stmt *pTblname = 0; 17621 17622 pSelect = recoverPrepare(p, p->dbOut, 17623 "WITH dbschema(rootpage, name, sql, tbl, isVirtual, isIndex) AS (" 17624 " SELECT rootpage, name, sql, " 17625 " type='table', " 17626 " sql LIKE 'create virtual%'," 17627 " (type='index' AND (sql LIKE '%unique%' OR ?1))" 17628 " FROM recovery.schema" 17629 ")" 17630 "SELECT rootpage, tbl, isVirtual, name, sql" 17631 " FROM dbschema " 17632 " WHERE tbl OR isIndex" 17633 " ORDER BY tbl DESC, name=='sqlite_sequence' DESC" 17634 ); 17635 17636 pTblname = recoverPrepare(p, p->dbOut, 17637 "SELECT name FROM sqlite_schema " 17638 "WHERE type='table' ORDER BY rowid DESC LIMIT 1" 17639 ); 17640 17641 if( pSelect ){ 17642 sqlite3_bind_int(pSelect, 1, p->bSlowIndexes); 17643 while( sqlite3_step(pSelect)==SQLITE_ROW ){ 17644 i64 iRoot = sqlite3_column_int64(pSelect, 0); 17645 int bTable = sqlite3_column_int(pSelect, 1); 17646 int bVirtual = sqlite3_column_int(pSelect, 2); 17647 const char *zName = (const char*)sqlite3_column_text(pSelect, 3); 17648 const char *zSql = (const char*)sqlite3_column_text(pSelect, 4); 17649 char *zFree = 0; 17650 int rc = SQLITE_OK; 17651 17652 if( bVirtual ){ 17653 zSql = (const char*)(zFree = recoverMPrintf(p, 17654 "INSERT INTO sqlite_schema VALUES('table', %Q, %Q, 0, %Q)", 17655 zName, zName, zSql 17656 )); 17657 } 17658 rc = sqlite3_exec(p->dbOut, zSql, 0, 0, 0); 17659 if( rc==SQLITE_OK ){ 17660 recoverSqlCallback(p, zSql); 17661 if( bTable && !bVirtual ){ 17662 if( SQLITE_ROW==sqlite3_step(pTblname) ){ 17663 const char *zTbl = (const char*)sqlite3_column_text(pTblname, 0); 17664 if( zTbl ) recoverAddTable(p, zTbl, iRoot); 17665 } 17666 recoverReset(p, pTblname); 17667 } 17668 }else if( rc!=SQLITE_ERROR ){ 17669 recoverDbError(p, p->dbOut); 17670 } 17671 sqlite3_free(zFree); 17672 } 17673 } 17674 recoverFinalize(p, pSelect); 17675 recoverFinalize(p, pTblname); 17676 17677 return p->errCode; 17678 } 17679 17680 /* 17681 ** This function is called after the output database has been populated. It 17682 ** adds all recovered schema elements that were not created in the output 17683 ** database by recoverWriteSchema1() - everything except for tables and 17684 ** UNIQUE indexes. Specifically: 17685 ** 17686 ** * views, 17687 ** * triggers, 17688 ** * non-UNIQUE indexes. 17689 ** 17690 ** If the recover handle is in SQL callback mode, then equivalent callbacks 17691 ** are issued to create the schema elements. 17692 */ 17693 static int recoverWriteSchema2(sqlite3_recover *p){ 17694 sqlite3_stmt *pSelect = 0; 17695 17696 pSelect = recoverPrepare(p, p->dbOut, 17697 p->bSlowIndexes ? 17698 "SELECT rootpage, sql FROM recovery.schema " 17699 " WHERE type!='table' AND type!='index'" 17700 : 17701 "SELECT rootpage, sql FROM recovery.schema " 17702 " WHERE type!='table' AND (type!='index' OR sql NOT LIKE '%unique%')" 17703 ); 17704 17705 if( pSelect ){ 17706 while( sqlite3_step(pSelect)==SQLITE_ROW ){ 17707 const char *zSql = (const char*)sqlite3_column_text(pSelect, 1); 17708 int rc = sqlite3_exec(p->dbOut, zSql, 0, 0, 0); 17709 if( rc==SQLITE_OK ){ 17710 recoverSqlCallback(p, zSql); 17711 }else if( rc!=SQLITE_ERROR ){ 17712 recoverDbError(p, p->dbOut); 17713 } 17714 } 17715 } 17716 recoverFinalize(p, pSelect); 17717 17718 return p->errCode; 17719 } 17720 17721 /* 17722 ** This function is a no-op if recover handle p already contains an error 17723 ** (if p->errCode!=SQLITE_OK). In this case it returns NULL. 17724 ** 17725 ** Otherwise, if the recover handle is configured to create an output 17726 ** database (was created by sqlite3_recover_init()), then this function 17727 ** prepares and returns an SQL statement to INSERT a new record into table 17728 ** pTab, assuming the first nField fields of a record extracted from disk 17729 ** are valid. 17730 ** 17731 ** For example, if table pTab is: 17732 ** 17733 ** CREATE TABLE name(a, b GENERATED ALWAYS AS (a+1) STORED, c, d, e); 17734 ** 17735 ** And nField is 4, then the SQL statement prepared and returned is: 17736 ** 17737 ** INSERT INTO (a, c, d) VALUES (?1, ?2, ?3); 17738 ** 17739 ** In this case even though 4 values were extracted from the input db, 17740 ** only 3 are written to the output, as the generated STORED column 17741 ** cannot be written. 17742 ** 17743 ** If the recover handle is in SQL callback mode, then the SQL statement 17744 ** prepared is such that evaluating it returns a single row containing 17745 ** a single text value - itself an SQL statement similar to the above, 17746 ** except with SQL literals in place of the variables. For example: 17747 ** 17748 ** SELECT 'INSERT INTO (a, c, d) VALUES (' 17749 ** || quote(?1) || ', ' 17750 ** || quote(?2) || ', ' 17751 ** || quote(?3) || ')'; 17752 ** 17753 ** In either case, it is the responsibility of the caller to eventually 17754 ** free the statement handle using sqlite3_finalize(). 17755 */ 17756 static sqlite3_stmt *recoverInsertStmt( 17757 sqlite3_recover *p, 17758 RecoverTable *pTab, 17759 int nField 17760 ){ 17761 sqlite3_stmt *pRet = 0; 17762 const char *zSep = ""; 17763 const char *zSqlSep = ""; 17764 char *zSql = 0; 17765 char *zFinal = 0; 17766 char *zBind = 0; 17767 int ii; 17768 int bSql = p->xSql ? 1 : 0; 17769 17770 if( nField<=0 ) return 0; 17771 17772 assert( nField<=pTab->nCol ); 17773 17774 zSql = recoverMPrintf(p, "INSERT OR IGNORE INTO %Q(", pTab->zTab); 17775 17776 if( pTab->iRowidBind ){ 17777 assert( pTab->bIntkey ); 17778 zSql = recoverMPrintf(p, "%z_rowid_", zSql); 17779 if( bSql ){ 17780 zBind = recoverMPrintf(p, "%zquote(?%d)", zBind, pTab->iRowidBind); 17781 }else{ 17782 zBind = recoverMPrintf(p, "%z?%d", zBind, pTab->iRowidBind); 17783 } 17784 zSqlSep = "||', '||"; 17785 zSep = ", "; 17786 } 17787 17788 for(ii=0; ii<nField; ii++){ 17789 int eHidden = pTab->aCol[ii].eHidden; 17790 if( eHidden!=RECOVER_EHIDDEN_VIRTUAL 17791 && eHidden!=RECOVER_EHIDDEN_STORED 17792 ){ 17793 assert( pTab->aCol[ii].iField>=0 && pTab->aCol[ii].iBind>=1 ); 17794 zSql = recoverMPrintf(p, "%z%s%Q", zSql, zSep, pTab->aCol[ii].zCol); 17795 17796 if( bSql ){ 17797 zBind = recoverMPrintf(p, 17798 "%z%sescape_crnl(quote(?%d))", zBind, zSqlSep, pTab->aCol[ii].iBind 17799 ); 17800 zSqlSep = "||', '||"; 17801 }else{ 17802 zBind = recoverMPrintf(p, "%z%s?%d", zBind, zSep, pTab->aCol[ii].iBind); 17803 } 17804 zSep = ", "; 17805 } 17806 } 17807 17808 if( bSql ){ 17809 zFinal = recoverMPrintf(p, "SELECT %Q || ') VALUES (' || %s || ')'", 17810 zSql, zBind 17811 ); 17812 }else{ 17813 zFinal = recoverMPrintf(p, "%s) VALUES (%s)", zSql, zBind); 17814 } 17815 17816 pRet = recoverPrepare(p, p->dbOut, zFinal); 17817 sqlite3_free(zSql); 17818 sqlite3_free(zBind); 17819 sqlite3_free(zFinal); 17820 17821 return pRet; 17822 } 17823 17824 17825 /* 17826 ** Search the list of RecoverTable objects at p->pTblList for one that 17827 ** has root page iRoot in the input database. If such an object is found, 17828 ** return a pointer to it. Otherwise, return NULL. 17829 */ 17830 static RecoverTable *recoverFindTable(sqlite3_recover *p, u32 iRoot){ 17831 RecoverTable *pRet = 0; 17832 for(pRet=p->pTblList; pRet && pRet->iRoot!=iRoot; pRet=pRet->pNext); 17833 return pRet; 17834 } 17835 17836 /* 17837 ** This function attempts to create a lost and found table within the 17838 ** output db. If successful, it returns a pointer to a buffer containing 17839 ** the name of the new table. It is the responsibility of the caller to 17840 ** eventually free this buffer using sqlite3_free(). 17841 ** 17842 ** If an error occurs, NULL is returned and an error code and error 17843 ** message left in the recover handle. 17844 */ 17845 static char *recoverLostAndFoundCreate( 17846 sqlite3_recover *p, /* Recover object */ 17847 int nField /* Number of column fields in new table */ 17848 ){ 17849 char *zTbl = 0; 17850 sqlite3_stmt *pProbe = 0; 17851 int ii = 0; 17852 17853 pProbe = recoverPrepare(p, p->dbOut, 17854 "SELECT 1 FROM sqlite_schema WHERE name=?" 17855 ); 17856 for(ii=-1; zTbl==0 && p->errCode==SQLITE_OK && ii<1000; ii++){ 17857 int bFail = 0; 17858 if( ii<0 ){ 17859 zTbl = recoverMPrintf(p, "%s", p->zLostAndFound); 17860 }else{ 17861 zTbl = recoverMPrintf(p, "%s_%d", p->zLostAndFound, ii); 17862 } 17863 17864 if( p->errCode==SQLITE_OK ){ 17865 sqlite3_bind_text(pProbe, 1, zTbl, -1, SQLITE_STATIC); 17866 if( SQLITE_ROW==sqlite3_step(pProbe) ){ 17867 bFail = 1; 17868 } 17869 recoverReset(p, pProbe); 17870 } 17871 17872 if( bFail ){ 17873 sqlite3_clear_bindings(pProbe); 17874 sqlite3_free(zTbl); 17875 zTbl = 0; 17876 } 17877 } 17878 recoverFinalize(p, pProbe); 17879 17880 if( zTbl ){ 17881 const char *zSep = 0; 17882 char *zField = 0; 17883 char *zSql = 0; 17884 17885 zSep = "rootpgno INTEGER, pgno INTEGER, nfield INTEGER, id INTEGER, "; 17886 for(ii=0; p->errCode==SQLITE_OK && ii<nField; ii++){ 17887 zField = recoverMPrintf(p, "%z%sc%d", zField, zSep, ii); 17888 zSep = ", "; 17889 } 17890 17891 zSql = recoverMPrintf(p, "CREATE TABLE %s(%s)", zTbl, zField); 17892 sqlite3_free(zField); 17893 17894 recoverExec(p, p->dbOut, zSql); 17895 recoverSqlCallback(p, zSql); 17896 sqlite3_free(zSql); 17897 }else if( p->errCode==SQLITE_OK ){ 17898 recoverError( 17899 p, SQLITE_ERROR, "failed to create %s output table", p->zLostAndFound 17900 ); 17901 } 17902 17903 return zTbl; 17904 } 17905 17906 /* 17907 ** Synthesize and prepare an INSERT statement to write to the lost_and_found 17908 ** table in the output database. The name of the table is zTab, and it has 17909 ** nField c* fields. 17910 */ 17911 static sqlite3_stmt *recoverLostAndFoundInsert( 17912 sqlite3_recover *p, 17913 const char *zTab, 17914 int nField 17915 ){ 17916 int nTotal = nField + 4; 17917 int ii; 17918 char *zBind = 0; 17919 sqlite3_stmt *pRet = 0; 17920 17921 if( p->xSql==0 ){ 17922 for(ii=0; ii<nTotal; ii++){ 17923 zBind = recoverMPrintf(p, "%z%s?", zBind, zBind?", ":"", ii); 17924 } 17925 pRet = recoverPreparePrintf( 17926 p, p->dbOut, "INSERT INTO %s VALUES(%s)", zTab, zBind 17927 ); 17928 }else{ 17929 const char *zSep = ""; 17930 for(ii=0; ii<nTotal; ii++){ 17931 zBind = recoverMPrintf(p, "%z%squote(?)", zBind, zSep); 17932 zSep = "|| ', ' ||"; 17933 } 17934 pRet = recoverPreparePrintf( 17935 p, p->dbOut, "SELECT 'INSERT INTO %s VALUES(' || %s || ')'", zTab, zBind 17936 ); 17937 } 17938 17939 sqlite3_free(zBind); 17940 return pRet; 17941 } 17942 17943 /* 17944 ** Input database page iPg contains data that will be written to the 17945 ** lost-and-found table of the output database. This function attempts 17946 ** to identify the root page of the tree that page iPg belonged to. 17947 ** If successful, it sets output variable (*piRoot) to the page number 17948 ** of the root page and returns SQLITE_OK. Otherwise, if an error occurs, 17949 ** an SQLite error code is returned and the final value of *piRoot 17950 ** undefined. 17951 */ 17952 static int recoverLostAndFoundFindRoot( 17953 sqlite3_recover *p, 17954 i64 iPg, 17955 i64 *piRoot 17956 ){ 17957 RecoverStateLAF *pLaf = &p->laf; 17958 17959 if( pLaf->pFindRoot==0 ){ 17960 pLaf->pFindRoot = recoverPrepare(p, p->dbOut, 17961 "WITH RECURSIVE p(pgno) AS (" 17962 " SELECT ?" 17963 " UNION" 17964 " SELECT parent FROM recovery.map AS m, p WHERE m.pgno=p.pgno" 17965 ") " 17966 "SELECT p.pgno FROM p, recovery.map m WHERE m.pgno=p.pgno " 17967 " AND m.parent IS NULL" 17968 ); 17969 } 17970 if( p->errCode==SQLITE_OK ){ 17971 sqlite3_bind_int64(pLaf->pFindRoot, 1, iPg); 17972 if( sqlite3_step(pLaf->pFindRoot)==SQLITE_ROW ){ 17973 *piRoot = sqlite3_column_int64(pLaf->pFindRoot, 0); 17974 }else{ 17975 *piRoot = iPg; 17976 } 17977 recoverReset(p, pLaf->pFindRoot); 17978 } 17979 return p->errCode; 17980 } 17981 17982 /* 17983 ** Recover data from page iPage of the input database and write it to 17984 ** the lost-and-found table in the output database. 17985 */ 17986 static void recoverLostAndFoundOnePage(sqlite3_recover *p, i64 iPage){ 17987 RecoverStateLAF *pLaf = &p->laf; 17988 sqlite3_value **apVal = pLaf->apVal; 17989 sqlite3_stmt *pPageData = pLaf->pPageData; 17990 sqlite3_stmt *pInsert = pLaf->pInsert; 17991 17992 int nVal = -1; 17993 int iPrevCell = 0; 17994 i64 iRoot = 0; 17995 int bHaveRowid = 0; 17996 i64 iRowid = 0; 17997 int ii = 0; 17998 17999 if( recoverLostAndFoundFindRoot(p, iPage, &iRoot) ) return; 18000 sqlite3_bind_int64(pPageData, 1, iPage); 18001 while( p->errCode==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPageData) ){ 18002 int iCell = sqlite3_column_int64(pPageData, 0); 18003 int iField = sqlite3_column_int64(pPageData, 1); 18004 18005 if( iPrevCell!=iCell && nVal>=0 ){ 18006 /* Insert the new row */ 18007 sqlite3_bind_int64(pInsert, 1, iRoot); /* rootpgno */ 18008 sqlite3_bind_int64(pInsert, 2, iPage); /* pgno */ 18009 sqlite3_bind_int(pInsert, 3, nVal); /* nfield */ 18010 if( bHaveRowid ){ 18011 sqlite3_bind_int64(pInsert, 4, iRowid); /* id */ 18012 } 18013 for(ii=0; ii<nVal; ii++){ 18014 recoverBindValue(p, pInsert, 5+ii, apVal[ii]); 18015 } 18016 if( sqlite3_step(pInsert)==SQLITE_ROW ){ 18017 recoverSqlCallback(p, (const char*)sqlite3_column_text(pInsert, 0)); 18018 } 18019 recoverReset(p, pInsert); 18020 18021 /* Discard the accumulated row data */ 18022 for(ii=0; ii<nVal; ii++){ 18023 sqlite3_value_free(apVal[ii]); 18024 apVal[ii] = 0; 18025 } 18026 sqlite3_clear_bindings(pInsert); 18027 bHaveRowid = 0; 18028 nVal = -1; 18029 } 18030 18031 if( iCell<0 ) break; 18032 18033 if( iField<0 ){ 18034 assert( nVal==-1 ); 18035 iRowid = sqlite3_column_int64(pPageData, 2); 18036 bHaveRowid = 1; 18037 nVal = 0; 18038 }else if( iField<pLaf->nMaxField ){ 18039 sqlite3_value *pVal = sqlite3_column_value(pPageData, 2); 18040 apVal[iField] = sqlite3_value_dup(pVal); 18041 assert( iField==nVal || (nVal==-1 && iField==0) ); 18042 nVal = iField+1; 18043 if( apVal[iField]==0 ){ 18044 recoverError(p, SQLITE_NOMEM, 0); 18045 } 18046 } 18047 18048 iPrevCell = iCell; 18049 } 18050 recoverReset(p, pPageData); 18051 18052 for(ii=0; ii<nVal; ii++){ 18053 sqlite3_value_free(apVal[ii]); 18054 apVal[ii] = 0; 18055 } 18056 } 18057 18058 /* 18059 ** Perform one step (sqlite3_recover_step()) of work for the connection 18060 ** passed as the only argument, which is guaranteed to be in 18061 ** RECOVER_STATE_LOSTANDFOUND3 state - during which the lost-and-found 18062 ** table of the output database is populated with recovered data that can 18063 ** not be assigned to any recovered schema object. 18064 */ 18065 static int recoverLostAndFound3Step(sqlite3_recover *p){ 18066 RecoverStateLAF *pLaf = &p->laf; 18067 if( p->errCode==SQLITE_OK ){ 18068 if( pLaf->pInsert==0 ){ 18069 return SQLITE_DONE; 18070 }else{ 18071 if( p->errCode==SQLITE_OK ){ 18072 int res = sqlite3_step(pLaf->pAllPage); 18073 if( res==SQLITE_ROW ){ 18074 i64 iPage = sqlite3_column_int64(pLaf->pAllPage, 0); 18075 if( recoverBitmapQuery(pLaf->pUsed, iPage)==0 ){ 18076 recoverLostAndFoundOnePage(p, iPage); 18077 } 18078 }else{ 18079 recoverReset(p, pLaf->pAllPage); 18080 return SQLITE_DONE; 18081 } 18082 } 18083 } 18084 } 18085 return SQLITE_OK; 18086 } 18087 18088 /* 18089 ** Initialize resources required in RECOVER_STATE_LOSTANDFOUND3 18090 ** state - during which the lost-and-found table of the output database 18091 ** is populated with recovered data that can not be assigned to any 18092 ** recovered schema object. 18093 */ 18094 static void recoverLostAndFound3Init(sqlite3_recover *p){ 18095 RecoverStateLAF *pLaf = &p->laf; 18096 18097 if( pLaf->nMaxField>0 ){ 18098 char *zTab = 0; /* Name of lost_and_found table */ 18099 18100 zTab = recoverLostAndFoundCreate(p, pLaf->nMaxField); 18101 pLaf->pInsert = recoverLostAndFoundInsert(p, zTab, pLaf->nMaxField); 18102 sqlite3_free(zTab); 18103 18104 pLaf->pAllPage = recoverPreparePrintf(p, p->dbOut, 18105 "WITH RECURSIVE seq(ii) AS (" 18106 " SELECT 1 UNION ALL SELECT ii+1 FROM seq WHERE ii<%lld" 18107 ")" 18108 "SELECT ii FROM seq" , p->laf.nPg 18109 ); 18110 pLaf->pPageData = recoverPrepare(p, p->dbOut, 18111 "SELECT cell, field, value " 18112 "FROM sqlite_dbdata('getpage()') d WHERE d.pgno=? " 18113 "UNION ALL " 18114 "SELECT -1, -1, -1" 18115 ); 18116 18117 pLaf->apVal = (sqlite3_value**)recoverMalloc(p, 18118 pLaf->nMaxField*sizeof(sqlite3_value*) 18119 ); 18120 } 18121 } 18122 18123 /* 18124 ** Initialize resources required in RECOVER_STATE_WRITING state - during which 18125 ** tables recovered from the schema of the input database are populated with 18126 ** recovered data. 18127 */ 18128 static int recoverWriteDataInit(sqlite3_recover *p){ 18129 RecoverStateW1 *p1 = &p->w1; 18130 RecoverTable *pTbl = 0; 18131 int nByte = 0; 18132 18133 /* Figure out the maximum number of columns for any table in the schema */ 18134 assert( p1->nMax==0 ); 18135 for(pTbl=p->pTblList; pTbl; pTbl=pTbl->pNext){ 18136 if( pTbl->nCol>p1->nMax ) p1->nMax = pTbl->nCol; 18137 } 18138 18139 /* Allocate an array of (sqlite3_value*) in which to accumulate the values 18140 ** that will be written to the output database in a single row. */ 18141 nByte = sizeof(sqlite3_value*) * (p1->nMax+1); 18142 p1->apVal = (sqlite3_value**)recoverMalloc(p, nByte); 18143 if( p1->apVal==0 ) return p->errCode; 18144 18145 /* Prepare the SELECT to loop through schema tables (pTbls) and the SELECT 18146 ** to loop through cells that appear to belong to a single table (pSel). */ 18147 p1->pTbls = recoverPrepare(p, p->dbOut, 18148 "SELECT rootpage FROM recovery.schema " 18149 " WHERE type='table' AND (sql NOT LIKE 'create virtual%')" 18150 " ORDER BY (tbl_name='sqlite_sequence') ASC" 18151 ); 18152 p1->pSel = recoverPrepare(p, p->dbOut, 18153 "WITH RECURSIVE pages(page) AS (" 18154 " SELECT ?1" 18155 " UNION" 18156 " SELECT child FROM sqlite_dbptr('getpage()'), pages " 18157 " WHERE pgno=page" 18158 ") " 18159 "SELECT page, cell, field, value " 18160 "FROM sqlite_dbdata('getpage()') d, pages p WHERE p.page=d.pgno " 18161 "UNION ALL " 18162 "SELECT 0, 0, 0, 0" 18163 ); 18164 18165 return p->errCode; 18166 } 18167 18168 /* 18169 ** Clean up resources allocated by recoverWriteDataInit() (stuff in 18170 ** sqlite3_recover.w1). 18171 */ 18172 static void recoverWriteDataCleanup(sqlite3_recover *p){ 18173 RecoverStateW1 *p1 = &p->w1; 18174 int ii; 18175 for(ii=0; ii<p1->nVal; ii++){ 18176 sqlite3_value_free(p1->apVal[ii]); 18177 } 18178 sqlite3_free(p1->apVal); 18179 recoverFinalize(p, p1->pInsert); 18180 recoverFinalize(p, p1->pTbls); 18181 recoverFinalize(p, p1->pSel); 18182 memset(p1, 0, sizeof(*p1)); 18183 } 18184 18185 /* 18186 ** Perform one step (sqlite3_recover_step()) of work for the connection 18187 ** passed as the only argument, which is guaranteed to be in 18188 ** RECOVER_STATE_WRITING state - during which tables recovered from the 18189 ** schema of the input database are populated with recovered data. 18190 */ 18191 static int recoverWriteDataStep(sqlite3_recover *p){ 18192 RecoverStateW1 *p1 = &p->w1; 18193 sqlite3_stmt *pSel = p1->pSel; 18194 sqlite3_value **apVal = p1->apVal; 18195 18196 if( p->errCode==SQLITE_OK && p1->pTab==0 ){ 18197 if( sqlite3_step(p1->pTbls)==SQLITE_ROW ){ 18198 i64 iRoot = sqlite3_column_int64(p1->pTbls, 0); 18199 p1->pTab = recoverFindTable(p, iRoot); 18200 18201 recoverFinalize(p, p1->pInsert); 18202 p1->pInsert = 0; 18203 18204 /* If this table is unknown, return early. The caller will invoke this 18205 ** function again and it will move on to the next table. */ 18206 if( p1->pTab==0 ) return p->errCode; 18207 18208 /* If this is the sqlite_sequence table, delete any rows added by 18209 ** earlier INSERT statements on tables with AUTOINCREMENT primary 18210 ** keys before recovering its contents. The p1->pTbls SELECT statement 18211 ** is rigged to deliver "sqlite_sequence" last of all, so we don't 18212 ** worry about it being modified after it is recovered. */ 18213 if( sqlite3_stricmp("sqlite_sequence", p1->pTab->zTab)==0 ){ 18214 recoverExec(p, p->dbOut, "DELETE FROM sqlite_sequence"); 18215 recoverSqlCallback(p, "DELETE FROM sqlite_sequence"); 18216 } 18217 18218 /* Bind the root page of this table within the original database to 18219 ** SELECT statement p1->pSel. The SELECT statement will then iterate 18220 ** through cells that look like they belong to table pTab. */ 18221 sqlite3_bind_int64(pSel, 1, iRoot); 18222 18223 p1->nVal = 0; 18224 p1->bHaveRowid = 0; 18225 p1->iPrevPage = -1; 18226 p1->iPrevCell = -1; 18227 }else{ 18228 return SQLITE_DONE; 18229 } 18230 } 18231 assert( p->errCode!=SQLITE_OK || p1->pTab ); 18232 18233 if( p->errCode==SQLITE_OK && sqlite3_step(pSel)==SQLITE_ROW ){ 18234 RecoverTable *pTab = p1->pTab; 18235 18236 i64 iPage = sqlite3_column_int64(pSel, 0); 18237 int iCell = sqlite3_column_int(pSel, 1); 18238 int iField = sqlite3_column_int(pSel, 2); 18239 sqlite3_value *pVal = sqlite3_column_value(pSel, 3); 18240 int bNewCell = (p1->iPrevPage!=iPage || p1->iPrevCell!=iCell); 18241 18242 assert( bNewCell==0 || (iField==-1 || iField==0) ); 18243 assert( bNewCell || iField==p1->nVal || p1->nVal==pTab->nCol ); 18244 18245 if( bNewCell ){ 18246 int ii = 0; 18247 if( p1->nVal>=0 ){ 18248 if( p1->pInsert==0 || p1->nVal!=p1->nInsert ){ 18249 recoverFinalize(p, p1->pInsert); 18250 p1->pInsert = recoverInsertStmt(p, pTab, p1->nVal); 18251 p1->nInsert = p1->nVal; 18252 } 18253 if( p1->nVal>0 ){ 18254 sqlite3_stmt *pInsert = p1->pInsert; 18255 for(ii=0; ii<pTab->nCol; ii++){ 18256 RecoverColumn *pCol = &pTab->aCol[ii]; 18257 int iBind = pCol->iBind; 18258 if( iBind>0 ){ 18259 if( pCol->bIPK ){ 18260 sqlite3_bind_int64(pInsert, iBind, p1->iRowid); 18261 }else if( pCol->iField<p1->nVal ){ 18262 recoverBindValue(p, pInsert, iBind, apVal[pCol->iField]); 18263 } 18264 } 18265 } 18266 if( p->bRecoverRowid && pTab->iRowidBind>0 && p1->bHaveRowid ){ 18267 sqlite3_bind_int64(pInsert, pTab->iRowidBind, p1->iRowid); 18268 } 18269 if( SQLITE_ROW==sqlite3_step(pInsert) ){ 18270 const char *z = (const char*)sqlite3_column_text(pInsert, 0); 18271 recoverSqlCallback(p, z); 18272 } 18273 recoverReset(p, pInsert); 18274 assert( p->errCode || pInsert ); 18275 if( pInsert ) sqlite3_clear_bindings(pInsert); 18276 } 18277 } 18278 18279 for(ii=0; ii<p1->nVal; ii++){ 18280 sqlite3_value_free(apVal[ii]); 18281 apVal[ii] = 0; 18282 } 18283 p1->nVal = -1; 18284 p1->bHaveRowid = 0; 18285 } 18286 18287 if( iPage!=0 ){ 18288 if( iField<0 ){ 18289 p1->iRowid = sqlite3_column_int64(pSel, 3); 18290 assert( p1->nVal==-1 ); 18291 p1->nVal = 0; 18292 p1->bHaveRowid = 1; 18293 }else if( iField<pTab->nCol ){ 18294 assert( apVal[iField]==0 ); 18295 apVal[iField] = sqlite3_value_dup( pVal ); 18296 if( apVal[iField]==0 ){ 18297 recoverError(p, SQLITE_NOMEM, 0); 18298 } 18299 p1->nVal = iField+1; 18300 } 18301 p1->iPrevCell = iCell; 18302 p1->iPrevPage = iPage; 18303 } 18304 }else{ 18305 recoverReset(p, pSel); 18306 p1->pTab = 0; 18307 } 18308 18309 return p->errCode; 18310 } 18311 18312 /* 18313 ** Initialize resources required by sqlite3_recover_step() in 18314 ** RECOVER_STATE_LOSTANDFOUND1 state - during which the set of pages not 18315 ** already allocated to a recovered schema element is determined. 18316 */ 18317 static void recoverLostAndFound1Init(sqlite3_recover *p){ 18318 RecoverStateLAF *pLaf = &p->laf; 18319 sqlite3_stmt *pStmt = 0; 18320 18321 assert( p->laf.pUsed==0 ); 18322 pLaf->nPg = recoverPageCount(p); 18323 pLaf->pUsed = recoverBitmapAlloc(p, pLaf->nPg); 18324 18325 /* Prepare a statement to iterate through all pages that are part of any tree 18326 ** in the recoverable part of the input database schema to the bitmap. And, 18327 ** if !p->bFreelistCorrupt, add all pages that appear to be part of the 18328 ** freelist. */ 18329 pStmt = recoverPrepare( 18330 p, p->dbOut, 18331 "WITH trunk(pgno) AS (" 18332 " SELECT read_i32(getpage(1), 8) AS x WHERE x>0" 18333 " UNION" 18334 " SELECT read_i32(getpage(trunk.pgno), 0) AS x FROM trunk WHERE x>0" 18335 ")," 18336 "trunkdata(pgno, data) AS (" 18337 " SELECT pgno, getpage(pgno) FROM trunk" 18338 ")," 18339 "freelist(data, n, freepgno) AS (" 18340 " SELECT data, min(16384, read_i32(data, 1)-1), pgno FROM trunkdata" 18341 " UNION ALL" 18342 " SELECT data, n-1, read_i32(data, 2+n) FROM freelist WHERE n>=0" 18343 ")," 18344 "" 18345 "roots(r) AS (" 18346 " SELECT 1 UNION ALL" 18347 " SELECT rootpage FROM recovery.schema WHERE rootpage>0" 18348 ")," 18349 "used(page) AS (" 18350 " SELECT r FROM roots" 18351 " UNION" 18352 " SELECT child FROM sqlite_dbptr('getpage()'), used " 18353 " WHERE pgno=page" 18354 ") " 18355 "SELECT page FROM used" 18356 " UNION ALL " 18357 "SELECT freepgno FROM freelist WHERE NOT ?" 18358 ); 18359 if( pStmt ) sqlite3_bind_int(pStmt, 1, p->bFreelistCorrupt); 18360 pLaf->pUsedPages = pStmt; 18361 } 18362 18363 /* 18364 ** Perform one step (sqlite3_recover_step()) of work for the connection 18365 ** passed as the only argument, which is guaranteed to be in 18366 ** RECOVER_STATE_LOSTANDFOUND1 state - during which the set of pages not 18367 ** already allocated to a recovered schema element is determined. 18368 */ 18369 static int recoverLostAndFound1Step(sqlite3_recover *p){ 18370 RecoverStateLAF *pLaf = &p->laf; 18371 int rc = p->errCode; 18372 if( rc==SQLITE_OK ){ 18373 rc = sqlite3_step(pLaf->pUsedPages); 18374 if( rc==SQLITE_ROW ){ 18375 i64 iPg = sqlite3_column_int64(pLaf->pUsedPages, 0); 18376 recoverBitmapSet(pLaf->pUsed, iPg); 18377 rc = SQLITE_OK; 18378 }else{ 18379 recoverFinalize(p, pLaf->pUsedPages); 18380 pLaf->pUsedPages = 0; 18381 } 18382 } 18383 return rc; 18384 } 18385 18386 /* 18387 ** Initialize resources required by RECOVER_STATE_LOSTANDFOUND2 18388 ** state - during which the pages identified in RECOVER_STATE_LOSTANDFOUND1 18389 ** are sorted into sets that likely belonged to the same database tree. 18390 */ 18391 static void recoverLostAndFound2Init(sqlite3_recover *p){ 18392 RecoverStateLAF *pLaf = &p->laf; 18393 18394 assert( p->laf.pAllAndParent==0 ); 18395 assert( p->laf.pMapInsert==0 ); 18396 assert( p->laf.pMaxField==0 ); 18397 assert( p->laf.nMaxField==0 ); 18398 18399 pLaf->pMapInsert = recoverPrepare(p, p->dbOut, 18400 "INSERT OR IGNORE INTO recovery.map(pgno, parent) VALUES(?, ?)" 18401 ); 18402 pLaf->pAllAndParent = recoverPreparePrintf(p, p->dbOut, 18403 "WITH RECURSIVE seq(ii) AS (" 18404 " SELECT 1 UNION ALL SELECT ii+1 FROM seq WHERE ii<%lld" 18405 ")" 18406 "SELECT pgno, child FROM sqlite_dbptr('getpage()') " 18407 " UNION ALL " 18408 "SELECT NULL, ii FROM seq", p->laf.nPg 18409 ); 18410 pLaf->pMaxField = recoverPreparePrintf(p, p->dbOut, 18411 "SELECT max(field)+1 FROM sqlite_dbdata('getpage') WHERE pgno = ?" 18412 ); 18413 } 18414 18415 /* 18416 ** Perform one step (sqlite3_recover_step()) of work for the connection 18417 ** passed as the only argument, which is guaranteed to be in 18418 ** RECOVER_STATE_LOSTANDFOUND2 state - during which the pages identified 18419 ** in RECOVER_STATE_LOSTANDFOUND1 are sorted into sets that likely belonged 18420 ** to the same database tree. 18421 */ 18422 static int recoverLostAndFound2Step(sqlite3_recover *p){ 18423 RecoverStateLAF *pLaf = &p->laf; 18424 if( p->errCode==SQLITE_OK ){ 18425 int res = sqlite3_step(pLaf->pAllAndParent); 18426 if( res==SQLITE_ROW ){ 18427 i64 iChild = sqlite3_column_int(pLaf->pAllAndParent, 1); 18428 if( recoverBitmapQuery(pLaf->pUsed, iChild)==0 ){ 18429 sqlite3_bind_int64(pLaf->pMapInsert, 1, iChild); 18430 sqlite3_bind_value(pLaf->pMapInsert, 2, 18431 sqlite3_column_value(pLaf->pAllAndParent, 0) 18432 ); 18433 sqlite3_step(pLaf->pMapInsert); 18434 recoverReset(p, pLaf->pMapInsert); 18435 sqlite3_bind_int64(pLaf->pMaxField, 1, iChild); 18436 if( SQLITE_ROW==sqlite3_step(pLaf->pMaxField) ){ 18437 int nMax = sqlite3_column_int(pLaf->pMaxField, 0); 18438 if( nMax>pLaf->nMaxField ) pLaf->nMaxField = nMax; 18439 } 18440 recoverReset(p, pLaf->pMaxField); 18441 } 18442 }else{ 18443 recoverFinalize(p, pLaf->pAllAndParent); 18444 pLaf->pAllAndParent =0; 18445 return SQLITE_DONE; 18446 } 18447 } 18448 return p->errCode; 18449 } 18450 18451 /* 18452 ** Free all resources allocated as part of sqlite3_recover_step() calls 18453 ** in one of the RECOVER_STATE_LOSTANDFOUND[123] states. 18454 */ 18455 static void recoverLostAndFoundCleanup(sqlite3_recover *p){ 18456 recoverBitmapFree(p->laf.pUsed); 18457 p->laf.pUsed = 0; 18458 sqlite3_finalize(p->laf.pUsedPages); 18459 sqlite3_finalize(p->laf.pAllAndParent); 18460 sqlite3_finalize(p->laf.pMapInsert); 18461 sqlite3_finalize(p->laf.pMaxField); 18462 sqlite3_finalize(p->laf.pFindRoot); 18463 sqlite3_finalize(p->laf.pInsert); 18464 sqlite3_finalize(p->laf.pAllPage); 18465 sqlite3_finalize(p->laf.pPageData); 18466 p->laf.pUsedPages = 0; 18467 p->laf.pAllAndParent = 0; 18468 p->laf.pMapInsert = 0; 18469 p->laf.pMaxField = 0; 18470 p->laf.pFindRoot = 0; 18471 p->laf.pInsert = 0; 18472 p->laf.pAllPage = 0; 18473 p->laf.pPageData = 0; 18474 sqlite3_free(p->laf.apVal); 18475 p->laf.apVal = 0; 18476 } 18477 18478 /* 18479 ** Free all resources allocated as part of sqlite3_recover_step() calls. 18480 */ 18481 static void recoverFinalCleanup(sqlite3_recover *p){ 18482 RecoverTable *pTab = 0; 18483 RecoverTable *pNext = 0; 18484 18485 recoverWriteDataCleanup(p); 18486 recoverLostAndFoundCleanup(p); 18487 18488 for(pTab=p->pTblList; pTab; pTab=pNext){ 18489 pNext = pTab->pNext; 18490 sqlite3_free(pTab); 18491 } 18492 p->pTblList = 0; 18493 sqlite3_finalize(p->pGetPage); 18494 p->pGetPage = 0; 18495 sqlite3_file_control(p->dbIn, p->zDb, SQLITE_FCNTL_RESET_CACHE, 0); 18496 18497 { 18498 #ifndef NDEBUG 18499 int res = 18500 #endif 18501 sqlite3_close(p->dbOut); 18502 assert( res==SQLITE_OK ); 18503 } 18504 p->dbOut = 0; 18505 } 18506 18507 /* 18508 ** Decode and return an unsigned 16-bit big-endian integer value from 18509 ** buffer a[]. 18510 */ 18511 static u32 recoverGetU16(const u8 *a){ 18512 return (((u32)a[0])<<8) + ((u32)a[1]); 18513 } 18514 18515 /* 18516 ** Decode and return an unsigned 32-bit big-endian integer value from 18517 ** buffer a[]. 18518 */ 18519 static u32 recoverGetU32(const u8 *a){ 18520 return (((u32)a[0])<<24) + (((u32)a[1])<<16) + (((u32)a[2])<<8) + ((u32)a[3]); 18521 } 18522 18523 /* 18524 ** Decode an SQLite varint from buffer a[]. Write the decoded value to (*pVal) 18525 ** and return the number of bytes consumed. 18526 */ 18527 static int recoverGetVarint(const u8 *a, i64 *pVal){ 18528 sqlite3_uint64 u = 0; 18529 int i; 18530 for(i=0; i<8; i++){ 18531 u = (u<<7) + (a[i]&0x7f); 18532 if( (a[i]&0x80)==0 ){ *pVal = (sqlite3_int64)u; return i+1; } 18533 } 18534 u = (u<<8) + (a[i]&0xff); 18535 *pVal = (sqlite3_int64)u; 18536 return 9; 18537 } 18538 18539 /* 18540 ** The second argument points to a buffer n bytes in size. If this buffer 18541 ** or a prefix thereof appears to contain a well-formed SQLite b-tree page, 18542 ** return the page-size in bytes. Otherwise, if the buffer does not 18543 ** appear to contain a well-formed b-tree page, return 0. 18544 */ 18545 static int recoverIsValidPage(u8 *aTmp, const u8 *a, int n){ 18546 u8 *aUsed = aTmp; 18547 int nFrag = 0; 18548 int nActual = 0; 18549 int iFree = 0; 18550 int nCell = 0; /* Number of cells on page */ 18551 int iCellOff = 0; /* Offset of cell array in page */ 18552 int iContent = 0; 18553 int eType = 0; 18554 int ii = 0; 18555 18556 eType = (int)a[0]; 18557 if( eType!=0x02 && eType!=0x05 && eType!=0x0A && eType!=0x0D ) return 0; 18558 18559 iFree = (int)recoverGetU16(&a[1]); 18560 nCell = (int)recoverGetU16(&a[3]); 18561 iContent = (int)recoverGetU16(&a[5]); 18562 if( iContent==0 ) iContent = 65536; 18563 nFrag = (int)a[7]; 18564 18565 if( iContent>n ) return 0; 18566 18567 memset(aUsed, 0, n); 18568 memset(aUsed, 0xFF, iContent); 18569 18570 /* Follow the free-list. This is the same format for all b-tree pages. */ 18571 if( iFree && iFree<=iContent ) return 0; 18572 while( iFree ){ 18573 int iNext = 0; 18574 int nByte = 0; 18575 if( iFree>(n-4) ) return 0; 18576 iNext = recoverGetU16(&a[iFree]); 18577 nByte = recoverGetU16(&a[iFree+2]); 18578 if( iFree+nByte>n || nByte<4 ) return 0; 18579 if( iNext && iNext<iFree+nByte ) return 0; 18580 memset(&aUsed[iFree], 0xFF, nByte); 18581 iFree = iNext; 18582 } 18583 18584 /* Run through the cells */ 18585 if( eType==0x02 || eType==0x05 ){ 18586 iCellOff = 12; 18587 }else{ 18588 iCellOff = 8; 18589 } 18590 if( (iCellOff + 2*nCell)>iContent ) return 0; 18591 for(ii=0; ii<nCell; ii++){ 18592 int iByte; 18593 i64 nPayload = 0; 18594 int nByte = 0; 18595 int iOff = recoverGetU16(&a[iCellOff + 2*ii]); 18596 if( iOff<iContent || iOff>n ){ 18597 return 0; 18598 } 18599 if( eType==0x05 || eType==0x02 ) nByte += 4; 18600 nByte += recoverGetVarint(&a[iOff+nByte], &nPayload); 18601 if( eType==0x0D ){ 18602 i64 dummy = 0; 18603 nByte += recoverGetVarint(&a[iOff+nByte], &dummy); 18604 } 18605 if( eType!=0x05 ){ 18606 int X = (eType==0x0D) ? n-35 : (((n-12)*64/255)-23); 18607 int M = ((n-12)*32/255)-23; 18608 int K = M+((nPayload-M)%(n-4)); 18609 18610 if( nPayload<X ){ 18611 nByte += nPayload; 18612 }else if( K<=X ){ 18613 nByte += K+4; 18614 }else{ 18615 nByte += M+4; 18616 } 18617 } 18618 18619 if( iOff+nByte>n ){ 18620 return 0; 18621 } 18622 for(iByte=iOff; iByte<(iOff+nByte); iByte++){ 18623 if( aUsed[iByte]!=0 ){ 18624 return 0; 18625 } 18626 aUsed[iByte] = 0xFF; 18627 } 18628 } 18629 18630 nActual = 0; 18631 for(ii=0; ii<n; ii++){ 18632 if( aUsed[ii]==0 ) nActual++; 18633 } 18634 return (nActual==nFrag); 18635 } 18636 18637 18638 static int recoverVfsClose(sqlite3_file*); 18639 static int recoverVfsRead(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst); 18640 static int recoverVfsWrite(sqlite3_file*, const void*, int, sqlite3_int64); 18641 static int recoverVfsTruncate(sqlite3_file*, sqlite3_int64 size); 18642 static int recoverVfsSync(sqlite3_file*, int flags); 18643 static int recoverVfsFileSize(sqlite3_file*, sqlite3_int64 *pSize); 18644 static int recoverVfsLock(sqlite3_file*, int); 18645 static int recoverVfsUnlock(sqlite3_file*, int); 18646 static int recoverVfsCheckReservedLock(sqlite3_file*, int *pResOut); 18647 static int recoverVfsFileControl(sqlite3_file*, int op, void *pArg); 18648 static int recoverVfsSectorSize(sqlite3_file*); 18649 static int recoverVfsDeviceCharacteristics(sqlite3_file*); 18650 static int recoverVfsShmMap(sqlite3_file*, int, int, int, void volatile**); 18651 static int recoverVfsShmLock(sqlite3_file*, int offset, int n, int flags); 18652 static void recoverVfsShmBarrier(sqlite3_file*); 18653 static int recoverVfsShmUnmap(sqlite3_file*, int deleteFlag); 18654 static int recoverVfsFetch(sqlite3_file*, sqlite3_int64, int, void**); 18655 static int recoverVfsUnfetch(sqlite3_file *pFd, sqlite3_int64 iOff, void *p); 18656 18657 static sqlite3_io_methods recover_methods = { 18658 2, /* iVersion */ 18659 recoverVfsClose, 18660 recoverVfsRead, 18661 recoverVfsWrite, 18662 recoverVfsTruncate, 18663 recoverVfsSync, 18664 recoverVfsFileSize, 18665 recoverVfsLock, 18666 recoverVfsUnlock, 18667 recoverVfsCheckReservedLock, 18668 recoverVfsFileControl, 18669 recoverVfsSectorSize, 18670 recoverVfsDeviceCharacteristics, 18671 recoverVfsShmMap, 18672 recoverVfsShmLock, 18673 recoverVfsShmBarrier, 18674 recoverVfsShmUnmap, 18675 recoverVfsFetch, 18676 recoverVfsUnfetch 18677 }; 18678 18679 static int recoverVfsClose(sqlite3_file *pFd){ 18680 assert( pFd->pMethods!=&recover_methods ); 18681 return pFd->pMethods->xClose(pFd); 18682 } 18683 18684 /* 18685 ** Write value v to buffer a[] as a 16-bit big-endian unsigned integer. 18686 */ 18687 static void recoverPutU16(u8 *a, u32 v){ 18688 a[0] = (v>>8) & 0x00FF; 18689 a[1] = (v>>0) & 0x00FF; 18690 } 18691 18692 /* 18693 ** Write value v to buffer a[] as a 32-bit big-endian unsigned integer. 18694 */ 18695 static void recoverPutU32(u8 *a, u32 v){ 18696 a[0] = (v>>24) & 0x00FF; 18697 a[1] = (v>>16) & 0x00FF; 18698 a[2] = (v>>8) & 0x00FF; 18699 a[3] = (v>>0) & 0x00FF; 18700 } 18701 18702 /* 18703 ** Detect the page-size of the database opened by file-handle pFd by 18704 ** searching the first part of the file for a well-formed SQLite b-tree 18705 ** page. If parameter nReserve is non-zero, then as well as searching for 18706 ** a b-tree page with zero reserved bytes, this function searches for one 18707 ** with nReserve reserved bytes at the end of it. 18708 ** 18709 ** If successful, set variable p->detected_pgsz to the detected page-size 18710 ** in bytes and return SQLITE_OK. Or, if no error occurs but no valid page 18711 ** can be found, return SQLITE_OK but leave p->detected_pgsz set to 0. Or, 18712 ** if an error occurs (e.g. an IO or OOM error), then an SQLite error code 18713 ** is returned. The final value of p->detected_pgsz is undefined in this 18714 ** case. 18715 */ 18716 static int recoverVfsDetectPagesize( 18717 sqlite3_recover *p, /* Recover handle */ 18718 sqlite3_file *pFd, /* File-handle open on input database */ 18719 u32 nReserve, /* Possible nReserve value */ 18720 i64 nSz /* Size of database file in bytes */ 18721 ){ 18722 int rc = SQLITE_OK; 18723 const int nMin = 512; 18724 const int nMax = 65536; 18725 const int nMaxBlk = 4; 18726 u32 pgsz = 0; 18727 int iBlk = 0; 18728 u8 *aPg = 0; 18729 u8 *aTmp = 0; 18730 int nBlk = 0; 18731 18732 aPg = (u8*)sqlite3_malloc(2*nMax); 18733 if( aPg==0 ) return SQLITE_NOMEM; 18734 aTmp = &aPg[nMax]; 18735 18736 nBlk = (nSz+nMax-1)/nMax; 18737 if( nBlk>nMaxBlk ) nBlk = nMaxBlk; 18738 18739 do { 18740 for(iBlk=0; rc==SQLITE_OK && iBlk<nBlk; iBlk++){ 18741 int nByte = (nSz>=((iBlk+1)*nMax)) ? nMax : (nSz % nMax); 18742 memset(aPg, 0, nMax); 18743 rc = pFd->pMethods->xRead(pFd, aPg, nByte, iBlk*nMax); 18744 if( rc==SQLITE_OK ){ 18745 int pgsz2; 18746 for(pgsz2=(pgsz ? pgsz*2 : nMin); pgsz2<=nMax; pgsz2=pgsz2*2){ 18747 int iOff; 18748 for(iOff=0; iOff<nMax; iOff+=pgsz2){ 18749 if( recoverIsValidPage(aTmp, &aPg[iOff], pgsz2-nReserve) ){ 18750 pgsz = pgsz2; 18751 break; 18752 } 18753 } 18754 } 18755 } 18756 } 18757 if( pgsz>(u32)p->detected_pgsz ){ 18758 p->detected_pgsz = pgsz; 18759 p->nReserve = nReserve; 18760 } 18761 if( nReserve==0 ) break; 18762 nReserve = 0; 18763 }while( 1 ); 18764 18765 p->detected_pgsz = pgsz; 18766 sqlite3_free(aPg); 18767 return rc; 18768 } 18769 18770 /* 18771 ** The xRead() method of the wrapper VFS. This is used to intercept calls 18772 ** to read page 1 of the input database. 18773 */ 18774 static int recoverVfsRead(sqlite3_file *pFd, void *aBuf, int nByte, i64 iOff){ 18775 int rc = SQLITE_OK; 18776 if( pFd->pMethods==&recover_methods ){ 18777 pFd->pMethods = recover_g.pMethods; 18778 rc = pFd->pMethods->xRead(pFd, aBuf, nByte, iOff); 18779 if( nByte==16 ){ 18780 sqlite3_randomness(16, aBuf); 18781 }else 18782 if( rc==SQLITE_OK && iOff==0 && nByte>=108 ){ 18783 /* Ensure that the database has a valid header file. The only fields 18784 ** that really matter to recovery are: 18785 ** 18786 ** + Database page size (16-bits at offset 16) 18787 ** + Size of db in pages (32-bits at offset 28) 18788 ** + Database encoding (32-bits at offset 56) 18789 ** 18790 ** Also preserved are: 18791 ** 18792 ** + first freelist page (32-bits at offset 32) 18793 ** + size of freelist (32-bits at offset 36) 18794 ** + the wal-mode flags (16-bits at offset 18) 18795 ** 18796 ** We also try to preserve the auto-vacuum, incr-value, user-version 18797 ** and application-id fields - all 32 bit quantities at offsets 18798 ** 52, 60, 64 and 68. All other fields are set to known good values. 18799 ** 18800 ** Byte offset 105 should also contain the page-size as a 16-bit 18801 ** integer. 18802 */ 18803 const int aPreserve[] = {32, 36, 52, 60, 64, 68}; 18804 u8 aHdr[108] = { 18805 0x53, 0x51, 0x4c, 0x69, 0x74, 0x65, 0x20, 0x66, 18806 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x33, 0x00, 18807 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x40, 0x20, 0x20, 18808 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 18809 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 18810 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 18811 0x00, 0x00, 0x10, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 18812 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 18813 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 18814 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 18815 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 18816 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 18817 0x00, 0x2e, 0x5b, 0x30, 18818 18819 0x0D, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00 18820 }; 18821 u8 *a = (u8*)aBuf; 18822 18823 u32 pgsz = recoverGetU16(&a[16]); 18824 u32 nReserve = a[20]; 18825 u32 enc = recoverGetU32(&a[56]); 18826 u32 dbsz = 0; 18827 i64 dbFileSize = 0; 18828 int ii; 18829 sqlite3_recover *p = recover_g.p; 18830 18831 if( pgsz==0x01 ) pgsz = 65536; 18832 rc = pFd->pMethods->xFileSize(pFd, &dbFileSize); 18833 18834 if( rc==SQLITE_OK && p->detected_pgsz==0 ){ 18835 rc = recoverVfsDetectPagesize(p, pFd, nReserve, dbFileSize); 18836 } 18837 if( p->detected_pgsz ){ 18838 pgsz = p->detected_pgsz; 18839 nReserve = p->nReserve; 18840 } 18841 18842 if( pgsz ){ 18843 dbsz = dbFileSize / pgsz; 18844 } 18845 if( enc!=SQLITE_UTF8 && enc!=SQLITE_UTF16BE && enc!=SQLITE_UTF16LE ){ 18846 enc = SQLITE_UTF8; 18847 } 18848 18849 sqlite3_free(p->pPage1Cache); 18850 p->pPage1Cache = 0; 18851 p->pPage1Disk = 0; 18852 18853 p->pgsz = nByte; 18854 p->pPage1Cache = (u8*)recoverMalloc(p, nByte*2); 18855 if( p->pPage1Cache ){ 18856 p->pPage1Disk = &p->pPage1Cache[nByte]; 18857 memcpy(p->pPage1Disk, aBuf, nByte); 18858 aHdr[18] = a[18]; 18859 aHdr[19] = a[19]; 18860 recoverPutU32(&aHdr[28], dbsz); 18861 recoverPutU32(&aHdr[56], enc); 18862 recoverPutU16(&aHdr[105], pgsz-nReserve); 18863 if( pgsz==65536 ) pgsz = 1; 18864 recoverPutU16(&aHdr[16], pgsz); 18865 aHdr[20] = nReserve; 18866 for(ii=0; ii<(int)(sizeof(aPreserve)/sizeof(aPreserve[0])); ii++){ 18867 memcpy(&aHdr[aPreserve[ii]], &a[aPreserve[ii]], 4); 18868 } 18869 memcpy(aBuf, aHdr, sizeof(aHdr)); 18870 memset(&((u8*)aBuf)[sizeof(aHdr)], 0, nByte-sizeof(aHdr)); 18871 18872 memcpy(p->pPage1Cache, aBuf, nByte); 18873 }else{ 18874 rc = p->errCode; 18875 } 18876 18877 } 18878 pFd->pMethods = &recover_methods; 18879 }else{ 18880 rc = pFd->pMethods->xRead(pFd, aBuf, nByte, iOff); 18881 } 18882 return rc; 18883 } 18884 18885 /* 18886 ** Used to make sqlite3_io_methods wrapper methods less verbose. 18887 */ 18888 #define RECOVER_VFS_WRAPPER(code) \ 18889 int rc = SQLITE_OK; \ 18890 if( pFd->pMethods==&recover_methods ){ \ 18891 pFd->pMethods = recover_g.pMethods; \ 18892 rc = code; \ 18893 pFd->pMethods = &recover_methods; \ 18894 }else{ \ 18895 rc = code; \ 18896 } \ 18897 return rc; 18898 18899 /* 18900 ** Methods of the wrapper VFS. All methods except for xRead() and xClose() 18901 ** simply uninstall the sqlite3_io_methods wrapper, invoke the equivalent 18902 ** method on the lower level VFS, then reinstall the wrapper before returning. 18903 ** Those that return an integer value use the RECOVER_VFS_WRAPPER macro. 18904 */ 18905 static int recoverVfsWrite( 18906 sqlite3_file *pFd, const void *aBuf, int nByte, i64 iOff 18907 ){ 18908 RECOVER_VFS_WRAPPER ( 18909 pFd->pMethods->xWrite(pFd, aBuf, nByte, iOff) 18910 ); 18911 } 18912 static int recoverVfsTruncate(sqlite3_file *pFd, sqlite3_int64 size){ 18913 RECOVER_VFS_WRAPPER ( 18914 pFd->pMethods->xTruncate(pFd, size) 18915 ); 18916 } 18917 static int recoverVfsSync(sqlite3_file *pFd, int flags){ 18918 RECOVER_VFS_WRAPPER ( 18919 pFd->pMethods->xSync(pFd, flags) 18920 ); 18921 } 18922 static int recoverVfsFileSize(sqlite3_file *pFd, sqlite3_int64 *pSize){ 18923 RECOVER_VFS_WRAPPER ( 18924 pFd->pMethods->xFileSize(pFd, pSize) 18925 ); 18926 } 18927 static int recoverVfsLock(sqlite3_file *pFd, int eLock){ 18928 RECOVER_VFS_WRAPPER ( 18929 pFd->pMethods->xLock(pFd, eLock) 18930 ); 18931 } 18932 static int recoverVfsUnlock(sqlite3_file *pFd, int eLock){ 18933 RECOVER_VFS_WRAPPER ( 18934 pFd->pMethods->xUnlock(pFd, eLock) 18935 ); 18936 } 18937 static int recoverVfsCheckReservedLock(sqlite3_file *pFd, int *pResOut){ 18938 RECOVER_VFS_WRAPPER ( 18939 pFd->pMethods->xCheckReservedLock(pFd, pResOut) 18940 ); 18941 } 18942 static int recoverVfsFileControl(sqlite3_file *pFd, int op, void *pArg){ 18943 RECOVER_VFS_WRAPPER ( 18944 (pFd->pMethods ? pFd->pMethods->xFileControl(pFd, op, pArg) : SQLITE_NOTFOUND) 18945 ); 18946 } 18947 static int recoverVfsSectorSize(sqlite3_file *pFd){ 18948 RECOVER_VFS_WRAPPER ( 18949 pFd->pMethods->xSectorSize(pFd) 18950 ); 18951 } 18952 static int recoverVfsDeviceCharacteristics(sqlite3_file *pFd){ 18953 RECOVER_VFS_WRAPPER ( 18954 pFd->pMethods->xDeviceCharacteristics(pFd) 18955 ); 18956 } 18957 static int recoverVfsShmMap( 18958 sqlite3_file *pFd, int iPg, int pgsz, int bExtend, void volatile **pp 18959 ){ 18960 RECOVER_VFS_WRAPPER ( 18961 pFd->pMethods->xShmMap(pFd, iPg, pgsz, bExtend, pp) 18962 ); 18963 } 18964 static int recoverVfsShmLock(sqlite3_file *pFd, int offset, int n, int flags){ 18965 RECOVER_VFS_WRAPPER ( 18966 pFd->pMethods->xShmLock(pFd, offset, n, flags) 18967 ); 18968 } 18969 static void recoverVfsShmBarrier(sqlite3_file *pFd){ 18970 if( pFd->pMethods==&recover_methods ){ 18971 pFd->pMethods = recover_g.pMethods; 18972 pFd->pMethods->xShmBarrier(pFd); 18973 pFd->pMethods = &recover_methods; 18974 }else{ 18975 pFd->pMethods->xShmBarrier(pFd); 18976 } 18977 } 18978 static int recoverVfsShmUnmap(sqlite3_file *pFd, int deleteFlag){ 18979 RECOVER_VFS_WRAPPER ( 18980 pFd->pMethods->xShmUnmap(pFd, deleteFlag) 18981 ); 18982 } 18983 18984 static int recoverVfsFetch( 18985 sqlite3_file *pFd, 18986 sqlite3_int64 iOff, 18987 int iAmt, 18988 void **pp 18989 ){ 18990 (void)pFd; 18991 (void)iOff; 18992 (void)iAmt; 18993 *pp = 0; 18994 return SQLITE_OK; 18995 } 18996 static int recoverVfsUnfetch(sqlite3_file *pFd, sqlite3_int64 iOff, void *p){ 18997 (void)pFd; 18998 (void)iOff; 18999 (void)p; 19000 return SQLITE_OK; 19001 } 19002 19003 /* 19004 ** Install the VFS wrapper around the file-descriptor open on the input 19005 ** database for recover handle p. Mutex RECOVER_MUTEX_ID must be held 19006 ** when this function is called. 19007 */ 19008 static void recoverInstallWrapper(sqlite3_recover *p){ 19009 sqlite3_file *pFd = 0; 19010 assert( recover_g.pMethods==0 ); 19011 recoverAssertMutexHeld(); 19012 sqlite3_file_control(p->dbIn, p->zDb, SQLITE_FCNTL_FILE_POINTER, (void*)&pFd); 19013 assert( pFd==0 || pFd->pMethods!=&recover_methods ); 19014 if( pFd && pFd->pMethods ){ 19015 int iVersion = 1 + (pFd->pMethods->iVersion>1 && pFd->pMethods->xShmMap!=0); 19016 recover_g.pMethods = pFd->pMethods; 19017 recover_g.p = p; 19018 recover_methods.iVersion = iVersion; 19019 pFd->pMethods = &recover_methods; 19020 } 19021 } 19022 19023 /* 19024 ** Uninstall the VFS wrapper that was installed around the file-descriptor open 19025 ** on the input database for recover handle p. Mutex RECOVER_MUTEX_ID must be 19026 ** held when this function is called. 19027 */ 19028 static void recoverUninstallWrapper(sqlite3_recover *p){ 19029 sqlite3_file *pFd = 0; 19030 recoverAssertMutexHeld(); 19031 sqlite3_file_control(p->dbIn, p->zDb,SQLITE_FCNTL_FILE_POINTER,(void*)&pFd); 19032 if( pFd && pFd->pMethods ){ 19033 pFd->pMethods = recover_g.pMethods; 19034 recover_g.pMethods = 0; 19035 recover_g.p = 0; 19036 } 19037 } 19038 19039 /* 19040 ** This function does the work of a single sqlite3_recover_step() call. It 19041 ** is guaranteed that the handle is not in an error state when this 19042 ** function is called. 19043 */ 19044 static void recoverStep(sqlite3_recover *p){ 19045 assert( p && p->errCode==SQLITE_OK ); 19046 switch( p->eState ){ 19047 case RECOVER_STATE_INIT: 19048 /* This is the very first call to sqlite3_recover_step() on this object. 19049 */ 19050 recoverSqlCallback(p, "BEGIN"); 19051 recoverSqlCallback(p, "PRAGMA writable_schema = on"); 19052 19053 recoverEnterMutex(); 19054 recoverInstallWrapper(p); 19055 19056 /* Open the output database. And register required virtual tables and 19057 ** user functions with the new handle. */ 19058 recoverOpenOutput(p); 19059 19060 /* Open transactions on both the input and output databases. */ 19061 sqlite3_file_control(p->dbIn, p->zDb, SQLITE_FCNTL_RESET_CACHE, 0); 19062 recoverExec(p, p->dbIn, "PRAGMA writable_schema = on"); 19063 recoverExec(p, p->dbIn, "BEGIN"); 19064 if( p->errCode==SQLITE_OK ) p->bCloseTransaction = 1; 19065 recoverExec(p, p->dbIn, "SELECT 1 FROM sqlite_schema"); 19066 recoverTransferSettings(p); 19067 recoverOpenRecovery(p); 19068 recoverCacheSchema(p); 19069 19070 recoverUninstallWrapper(p); 19071 recoverLeaveMutex(); 19072 19073 recoverExec(p, p->dbOut, "BEGIN"); 19074 19075 recoverWriteSchema1(p); 19076 p->eState = RECOVER_STATE_WRITING; 19077 break; 19078 19079 case RECOVER_STATE_WRITING: { 19080 if( p->w1.pTbls==0 ){ 19081 recoverWriteDataInit(p); 19082 } 19083 if( SQLITE_DONE==recoverWriteDataStep(p) ){ 19084 recoverWriteDataCleanup(p); 19085 if( p->zLostAndFound ){ 19086 p->eState = RECOVER_STATE_LOSTANDFOUND1; 19087 }else{ 19088 p->eState = RECOVER_STATE_SCHEMA2; 19089 } 19090 } 19091 break; 19092 } 19093 19094 case RECOVER_STATE_LOSTANDFOUND1: { 19095 if( p->laf.pUsed==0 ){ 19096 recoverLostAndFound1Init(p); 19097 } 19098 if( SQLITE_DONE==recoverLostAndFound1Step(p) ){ 19099 p->eState = RECOVER_STATE_LOSTANDFOUND2; 19100 } 19101 break; 19102 } 19103 case RECOVER_STATE_LOSTANDFOUND2: { 19104 if( p->laf.pAllAndParent==0 ){ 19105 recoverLostAndFound2Init(p); 19106 } 19107 if( SQLITE_DONE==recoverLostAndFound2Step(p) ){ 19108 p->eState = RECOVER_STATE_LOSTANDFOUND3; 19109 } 19110 break; 19111 } 19112 19113 case RECOVER_STATE_LOSTANDFOUND3: { 19114 if( p->laf.pInsert==0 ){ 19115 recoverLostAndFound3Init(p); 19116 } 19117 if( SQLITE_DONE==recoverLostAndFound3Step(p) ){ 19118 p->eState = RECOVER_STATE_SCHEMA2; 19119 } 19120 break; 19121 } 19122 19123 case RECOVER_STATE_SCHEMA2: { 19124 int rc = SQLITE_OK; 19125 19126 recoverWriteSchema2(p); 19127 p->eState = RECOVER_STATE_DONE; 19128 19129 /* If no error has occurred, commit the write transaction on the output 19130 ** database. Regardless of whether or not an error has occurred, make 19131 ** an attempt to end the read transaction on the input database. */ 19132 recoverExec(p, p->dbOut, "COMMIT"); 19133 rc = sqlite3_exec(p->dbIn, "END", 0, 0, 0); 19134 if( p->errCode==SQLITE_OK ) p->errCode = rc; 19135 19136 recoverSqlCallback(p, "PRAGMA writable_schema = off"); 19137 recoverSqlCallback(p, "COMMIT"); 19138 p->eState = RECOVER_STATE_DONE; 19139 recoverFinalCleanup(p); 19140 break; 19141 }; 19142 19143 case RECOVER_STATE_DONE: { 19144 /* no-op */ 19145 break; 19146 }; 19147 } 19148 } 19149 19150 19151 /* 19152 ** This is a worker function that does the heavy lifting for both init 19153 ** functions: 19154 ** 19155 ** sqlite3_recover_init() 19156 ** sqlite3_recover_init_sql() 19157 ** 19158 ** All this function does is allocate space for the recover handle and 19159 ** take copies of the input parameters. All the real work is done within 19160 ** sqlite3_recover_run(). 19161 */ 19162 sqlite3_recover *recoverInit( 19163 sqlite3* db, 19164 const char *zDb, 19165 const char *zUri, /* Output URI for _recover_init() */ 19166 int (*xSql)(void*, const char*),/* SQL callback for _recover_init_sql() */ 19167 void *pSqlCtx /* Context arg for _recover_init_sql() */ 19168 ){ 19169 sqlite3_recover *pRet = 0; 19170 int nDb = 0; 19171 int nUri = 0; 19172 int nByte = 0; 19173 19174 if( zDb==0 ){ zDb = "main"; } 19175 19176 nDb = recoverStrlen(zDb); 19177 nUri = recoverStrlen(zUri); 19178 19179 nByte = sizeof(sqlite3_recover) + nDb+1 + nUri+1; 19180 pRet = (sqlite3_recover*)sqlite3_malloc(nByte); 19181 if( pRet ){ 19182 memset(pRet, 0, nByte); 19183 pRet->dbIn = db; 19184 pRet->zDb = (char*)&pRet[1]; 19185 pRet->zUri = &pRet->zDb[nDb+1]; 19186 memcpy(pRet->zDb, zDb, nDb); 19187 if( nUri>0 && zUri ) memcpy(pRet->zUri, zUri, nUri); 19188 pRet->xSql = xSql; 19189 pRet->pSqlCtx = pSqlCtx; 19190 pRet->bRecoverRowid = RECOVER_ROWID_DEFAULT; 19191 } 19192 19193 return pRet; 19194 } 19195 19196 /* 19197 ** Initialize a recovery handle that creates a new database containing 19198 ** the recovered data. 19199 */ 19200 sqlite3_recover *sqlite3_recover_init( 19201 sqlite3* db, 19202 const char *zDb, 19203 const char *zUri 19204 ){ 19205 return recoverInit(db, zDb, zUri, 0, 0); 19206 } 19207 19208 /* 19209 ** Initialize a recovery handle that returns recovered data in the 19210 ** form of SQL statements via a callback. 19211 */ 19212 sqlite3_recover *sqlite3_recover_init_sql( 19213 sqlite3* db, 19214 const char *zDb, 19215 int (*xSql)(void*, const char*), 19216 void *pSqlCtx 19217 ){ 19218 return recoverInit(db, zDb, 0, xSql, pSqlCtx); 19219 } 19220 19221 /* 19222 ** Return the handle error message, if any. 19223 */ 19224 const char *sqlite3_recover_errmsg(sqlite3_recover *p){ 19225 return (p && p->errCode!=SQLITE_NOMEM) ? p->zErrMsg : "out of memory"; 19226 } 19227 19228 /* 19229 ** Return the handle error code. 19230 */ 19231 int sqlite3_recover_errcode(sqlite3_recover *p){ 19232 return p ? p->errCode : SQLITE_NOMEM; 19233 } 19234 19235 /* 19236 ** Configure the handle. 19237 */ 19238 int sqlite3_recover_config(sqlite3_recover *p, int op, void *pArg){ 19239 int rc = SQLITE_OK; 19240 if( p==0 ){ 19241 rc = SQLITE_NOMEM; 19242 }else if( p->eState!=RECOVER_STATE_INIT ){ 19243 rc = SQLITE_MISUSE; 19244 }else{ 19245 switch( op ){ 19246 case 789: 19247 /* This undocumented magic configuration option is used to set the 19248 ** name of the auxiliary database that is ATTACH-ed to the database 19249 ** connection and used to hold state information during the 19250 ** recovery process. This option is for debugging use only and 19251 ** is subject to change or removal at any time. */ 19252 sqlite3_free(p->zStateDb); 19253 p->zStateDb = recoverMPrintf(p, "%s", (char*)pArg); 19254 break; 19255 19256 case SQLITE_RECOVER_LOST_AND_FOUND: { 19257 const char *zArg = (const char*)pArg; 19258 sqlite3_free(p->zLostAndFound); 19259 if( zArg ){ 19260 p->zLostAndFound = recoverMPrintf(p, "%s", zArg); 19261 }else{ 19262 p->zLostAndFound = 0; 19263 } 19264 break; 19265 } 19266 19267 case SQLITE_RECOVER_FREELIST_CORRUPT: 19268 p->bFreelistCorrupt = *(int*)pArg; 19269 break; 19270 19271 case SQLITE_RECOVER_ROWIDS: 19272 p->bRecoverRowid = *(int*)pArg; 19273 break; 19274 19275 case SQLITE_RECOVER_SLOWINDEXES: 19276 p->bSlowIndexes = *(int*)pArg; 19277 break; 19278 19279 default: 19280 rc = SQLITE_NOTFOUND; 19281 break; 19282 } 19283 } 19284 19285 return rc; 19286 } 19287 19288 /* 19289 ** Do a unit of work towards the recovery job. Return SQLITE_OK if 19290 ** no error has occurred but database recovery is not finished, SQLITE_DONE 19291 ** if database recovery has been successfully completed, or an SQLite 19292 ** error code if an error has occurred. 19293 */ 19294 int sqlite3_recover_step(sqlite3_recover *p){ 19295 if( p==0 ) return SQLITE_NOMEM; 19296 if( p->errCode==SQLITE_OK ) recoverStep(p); 19297 if( p->eState==RECOVER_STATE_DONE && p->errCode==SQLITE_OK ){ 19298 return SQLITE_DONE; 19299 } 19300 return p->errCode; 19301 } 19302 19303 /* 19304 ** Do the configured recovery operation. Return SQLITE_OK if successful, or 19305 ** else an SQLite error code. 19306 */ 19307 int sqlite3_recover_run(sqlite3_recover *p){ 19308 while( SQLITE_OK==sqlite3_recover_step(p) ); 19309 return sqlite3_recover_errcode(p); 19310 } 19311 19312 19313 /* 19314 ** Free all resources associated with the recover handle passed as the only 19315 ** argument. The results of using a handle with any sqlite3_recover_** 19316 ** API function after it has been passed to this function are undefined. 19317 ** 19318 ** A copy of the value returned by the first call made to sqlite3_recover_run() 19319 ** on this handle is returned, or SQLITE_OK if sqlite3_recover_run() has 19320 ** not been called on this handle. 19321 */ 19322 int sqlite3_recover_finish(sqlite3_recover *p){ 19323 int rc; 19324 if( p==0 ){ 19325 rc = SQLITE_NOMEM; 19326 }else{ 19327 recoverFinalCleanup(p); 19328 if( p->bCloseTransaction && sqlite3_get_autocommit(p->dbIn)==0 ){ 19329 rc = sqlite3_exec(p->dbIn, "END", 0, 0, 0); 19330 if( p->errCode==SQLITE_OK ) p->errCode = rc; 19331 } 19332 rc = p->errCode; 19333 sqlite3_free(p->zErrMsg); 19334 sqlite3_free(p->zStateDb); 19335 sqlite3_free(p->zLostAndFound); 19336 sqlite3_free(p->pPage1Cache); 19337 sqlite3_free(p); 19338 } 19339 return rc; 19340 } 19341 19342 #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */ 19343 19344 /************************* End ../ext/recover/sqlite3recover.c ********************/ 19345 # endif /* SQLITE_HAVE_SQLITE3R */ 19346 #endif 19347 #ifdef SQLITE_SHELL_EXTSRC 19348 # include SHELL_STRINGIFY(SQLITE_SHELL_EXTSRC) 19349 #endif 19350 19351 #if defined(SQLITE_ENABLE_SESSION) 19352 /* 19353 ** State information for a single open session 19354 */ 19355 typedef struct OpenSession OpenSession; 19356 struct OpenSession { 19357 char *zName; /* Symbolic name for this session */ 19358 int nFilter; /* Number of xFilter rejection GLOB patterns */ 19359 char **azFilter; /* Array of xFilter rejection GLOB patterns */ 19360 sqlite3_session *p; /* The open session */ 19361 }; 19362 #endif 19363 19364 typedef struct ExpertInfo ExpertInfo; 19365 struct ExpertInfo { 19366 sqlite3expert *pExpert; 19367 int bVerbose; 19368 }; 19369 19370 /* A single line in the EQP output */ 19371 typedef struct EQPGraphRow EQPGraphRow; 19372 struct EQPGraphRow { 19373 int iEqpId; /* ID for this row */ 19374 int iParentId; /* ID of the parent row */ 19375 EQPGraphRow *pNext; /* Next row in sequence */ 19376 char zText[1]; /* Text to display for this row */ 19377 }; 19378 19379 /* All EQP output is collected into an instance of the following */ 19380 typedef struct EQPGraph EQPGraph; 19381 struct EQPGraph { 19382 EQPGraphRow *pRow; /* Linked list of all rows of the EQP output */ 19383 EQPGraphRow *pLast; /* Last element of the pRow list */ 19384 char zPrefix[100]; /* Graph prefix */ 19385 }; 19386 19387 /* Parameters affecting columnar mode result display (defaulting together) */ 19388 typedef struct ColModeOpts { 19389 int iWrap; /* In columnar modes, wrap lines reaching this limit */ 19390 u8 bQuote; /* Quote results for .mode box and table */ 19391 u8 bWordWrap; /* In columnar modes, wrap at word boundaries */ 19392 } ColModeOpts; 19393 #define ColModeOpts_default { 60, 0, 0 } 19394 #define ColModeOpts_default_qbox { 60, 1, 0 } 19395 19396 /* 19397 ** State information about the database connection is contained in an 19398 ** instance of the following structure. 19399 */ 19400 typedef struct ShellState ShellState; 19401 struct ShellState { 19402 sqlite3 *db; /* The database */ 19403 u8 autoExplain; /* Automatically turn on .explain mode */ 19404 u8 autoEQP; /* Run EXPLAIN QUERY PLAN prior to each SQL stmt */ 19405 u8 autoEQPtest; /* autoEQP is in test mode */ 19406 u8 autoEQPtrace; /* autoEQP is in trace mode */ 19407 u8 scanstatsOn; /* True to display scan stats before each finalize */ 19408 u8 openMode; /* SHELL_OPEN_NORMAL, _APPENDVFS, or _ZIPFILE */ 19409 u8 doXdgOpen; /* Invoke start/open/xdg-open in output_reset() */ 19410 u8 nEqpLevel; /* Depth of the EQP output graph */ 19411 u8 eTraceType; /* SHELL_TRACE_* value for type of trace */ 19412 u8 bSafeMode; /* True to prohibit unsafe operations */ 19413 u8 bSafeModePersist; /* The long-term value of bSafeMode */ 19414 u8 eRestoreState; /* See comments above doAutoDetectRestore() */ 19415 ColModeOpts cmOpts; /* Option values affecting columnar mode output */ 19416 unsigned statsOn; /* True to display memory stats before each finalize */ 19417 unsigned mEqpLines; /* Mask of vertical lines in the EQP output graph */ 19418 int inputNesting; /* Track nesting level of .read and other redirects */ 19419 int outCount; /* Revert to stdout when reaching zero */ 19420 int cnt; /* Number of records displayed so far */ 19421 int lineno; /* Line number of last line read from in */ 19422 int openFlags; /* Additional flags to open. (SQLITE_OPEN_NOFOLLOW) */ 19423 FILE *in; /* Read commands from this stream */ 19424 FILE *out; /* Write results here */ 19425 FILE *traceOut; /* Output for sqlite3_trace() */ 19426 int nErr; /* Number of errors seen */ 19427 int mode; /* An output mode setting */ 19428 int modePrior; /* Saved mode */ 19429 int cMode; /* temporary output mode for the current query */ 19430 int normalMode; /* Output mode before ".explain on" */ 19431 int writableSchema; /* True if PRAGMA writable_schema=ON */ 19432 int showHeader; /* True to show column names in List or Column mode */ 19433 int nCheck; /* Number of ".check" commands run */ 19434 unsigned nProgress; /* Number of progress callbacks encountered */ 19435 unsigned mxProgress; /* Maximum progress callbacks before failing */ 19436 unsigned flgProgress; /* Flags for the progress callback */ 19437 unsigned shellFlgs; /* Various flags */ 19438 unsigned priorShFlgs; /* Saved copy of flags */ 19439 sqlite3_int64 szMax; /* --maxsize argument to .open */ 19440 char *zDestTable; /* Name of destination table when MODE_Insert */ 19441 char *zTempFile; /* Temporary file that might need deleting */ 19442 char zTestcase[30]; /* Name of current test case */ 19443 char colSeparator[20]; /* Column separator character for several modes */ 19444 char rowSeparator[20]; /* Row separator character for MODE_Ascii */ 19445 char colSepPrior[20]; /* Saved column separator */ 19446 char rowSepPrior[20]; /* Saved row separator */ 19447 int *colWidth; /* Requested width of each column in columnar modes */ 19448 int *actualWidth; /* Actual width of each column */ 19449 int nWidth; /* Number of slots in colWidth[] and actualWidth[] */ 19450 char nullValue[20]; /* The text to print when a NULL comes back from 19451 ** the database */ 19452 char outfile[FILENAME_MAX]; /* Filename for *out */ 19453 sqlite3_stmt *pStmt; /* Current statement if any. */ 19454 FILE *pLog; /* Write log output here */ 19455 struct AuxDb { /* Storage space for auxiliary database connections */ 19456 sqlite3 *db; /* Connection pointer */ 19457 const char *zDbFilename; /* Filename used to open the connection */ 19458 char *zFreeOnClose; /* Free this memory allocation on close */ 19459 #if defined(SQLITE_ENABLE_SESSION) 19460 int nSession; /* Number of active sessions */ 19461 OpenSession aSession[4]; /* Array of sessions. [0] is in focus. */ 19462 #endif 19463 } aAuxDb[5], /* Array of all database connections */ 19464 *pAuxDb; /* Currently active database connection */ 19465 int *aiIndent; /* Array of indents used in MODE_Explain */ 19466 int nIndent; /* Size of array aiIndent[] */ 19467 int iIndent; /* Index of current op in aiIndent[] */ 19468 char *zNonce; /* Nonce for temporary safe-mode escapes */ 19469 EQPGraph sGraph; /* Information for the graphical EXPLAIN QUERY PLAN */ 19470 ExpertInfo expert; /* Valid if previous command was ".expert OPT..." */ 19471 #ifdef SQLITE_SHELL_FIDDLE 19472 struct { 19473 const char * zInput; /* Input string from wasm/JS proxy */ 19474 const char * zPos; /* Cursor pos into zInput */ 19475 const char * zDefaultDbName; /* Default name for db file */ 19476 } wasm; 19477 #endif 19478 }; 19479 19480 #ifdef SQLITE_SHELL_FIDDLE 19481 static ShellState shellState; 19482 #endif 19483 19484 19485 /* Allowed values for ShellState.autoEQP 19486 */ 19487 #define AUTOEQP_off 0 /* Automatic EXPLAIN QUERY PLAN is off */ 19488 #define AUTOEQP_on 1 /* Automatic EQP is on */ 19489 #define AUTOEQP_trigger 2 /* On and also show plans for triggers */ 19490 #define AUTOEQP_full 3 /* Show full EXPLAIN */ 19491 19492 /* Allowed values for ShellState.openMode 19493 */ 19494 #define SHELL_OPEN_UNSPEC 0 /* No open-mode specified */ 19495 #define SHELL_OPEN_NORMAL 1 /* Normal database file */ 19496 #define SHELL_OPEN_APPENDVFS 2 /* Use appendvfs */ 19497 #define SHELL_OPEN_ZIPFILE 3 /* Use the zipfile virtual table */ 19498 #define SHELL_OPEN_READONLY 4 /* Open a normal database read-only */ 19499 #define SHELL_OPEN_DESERIALIZE 5 /* Open using sqlite3_deserialize() */ 19500 #define SHELL_OPEN_HEXDB 6 /* Use "dbtotxt" output as data source */ 19501 19502 /* Allowed values for ShellState.eTraceType 19503 */ 19504 #define SHELL_TRACE_PLAIN 0 /* Show input SQL text */ 19505 #define SHELL_TRACE_EXPANDED 1 /* Show expanded SQL text */ 19506 #define SHELL_TRACE_NORMALIZED 2 /* Show normalized SQL text */ 19507 19508 /* Bits in the ShellState.flgProgress variable */ 19509 #define SHELL_PROGRESS_QUIET 0x01 /* Omit announcing every progress callback */ 19510 #define SHELL_PROGRESS_RESET 0x02 /* Reset the count when the progress 19511 ** callback limit is reached, and for each 19512 ** top-level SQL statement */ 19513 #define SHELL_PROGRESS_ONCE 0x04 /* Cancel the --limit after firing once */ 19514 19515 /* 19516 ** These are the allowed shellFlgs values 19517 */ 19518 #define SHFLG_Pagecache 0x00000001 /* The --pagecache option is used */ 19519 #define SHFLG_Lookaside 0x00000002 /* Lookaside memory is used */ 19520 #define SHFLG_Backslash 0x00000004 /* The --backslash option is used */ 19521 #define SHFLG_PreserveRowid 0x00000008 /* .dump preserves rowid values */ 19522 #define SHFLG_Newlines 0x00000010 /* .dump --newline flag */ 19523 #define SHFLG_CountChanges 0x00000020 /* .changes setting */ 19524 #define SHFLG_Echo 0x00000040 /* .echo on/off, or --echo setting */ 19525 #define SHFLG_HeaderSet 0x00000080 /* showHeader has been specified */ 19526 #define SHFLG_DumpDataOnly 0x00000100 /* .dump show data only */ 19527 #define SHFLG_DumpNoSys 0x00000200 /* .dump omits system tables */ 19528 #define SHFLG_TestingMode 0x00000400 /* allow unsafe testing features */ 19529 19530 /* 19531 ** Macros for testing and setting shellFlgs 19532 */ 19533 #define ShellHasFlag(P,X) (((P)->shellFlgs & (X))!=0) 19534 #define ShellSetFlag(P,X) ((P)->shellFlgs|=(X)) 19535 #define ShellClearFlag(P,X) ((P)->shellFlgs&=(~(X))) 19536 19537 /* 19538 ** These are the allowed modes. 19539 */ 19540 #define MODE_Line 0 /* One column per line. Blank line between records */ 19541 #define MODE_Column 1 /* One record per line in neat columns */ 19542 #define MODE_List 2 /* One record per line with a separator */ 19543 #define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */ 19544 #define MODE_Html 4 /* Generate an XHTML table */ 19545 #define MODE_Insert 5 /* Generate SQL "insert" statements */ 19546 #define MODE_Quote 6 /* Quote values as for SQL */ 19547 #define MODE_Tcl 7 /* Generate ANSI-C or TCL quoted elements */ 19548 #define MODE_Csv 8 /* Quote strings, numbers are plain */ 19549 #define MODE_Explain 9 /* Like MODE_Column, but do not truncate data */ 19550 #define MODE_Ascii 10 /* Use ASCII unit and record separators (0x1F/0x1E) */ 19551 #define MODE_Pretty 11 /* Pretty-print schemas */ 19552 #define MODE_EQP 12 /* Converts EXPLAIN QUERY PLAN output into a graph */ 19553 #define MODE_Json 13 /* Output JSON */ 19554 #define MODE_Markdown 14 /* Markdown formatting */ 19555 #define MODE_Table 15 /* MySQL-style table formatting */ 19556 #define MODE_Box 16 /* Unicode box-drawing characters */ 19557 #define MODE_Count 17 /* Output only a count of the rows of output */ 19558 #define MODE_Off 18 /* No query output shown */ 19559 #define MODE_ScanExp 19 /* Like MODE_Explain, but for ".scanstats vm" */ 19560 19561 static const char *modeDescr[] = { 19562 "line", 19563 "column", 19564 "list", 19565 "semi", 19566 "html", 19567 "insert", 19568 "quote", 19569 "tcl", 19570 "csv", 19571 "explain", 19572 "ascii", 19573 "prettyprint", 19574 "eqp", 19575 "json", 19576 "markdown", 19577 "table", 19578 "box", 19579 "count", 19580 "off" 19581 }; 19582 19583 /* 19584 ** These are the column/row/line separators used by the various 19585 ** import/export modes. 19586 */ 19587 #define SEP_Column "|" 19588 #define SEP_Row "\n" 19589 #define SEP_Tab "\t" 19590 #define SEP_Space " " 19591 #define SEP_Comma "," 19592 #define SEP_CrLf "\r\n" 19593 #define SEP_Unit "\x1F" 19594 #define SEP_Record "\x1E" 19595 19596 /* 19597 ** Limit input nesting via .read or any other input redirect. 19598 ** It's not too expensive, so a generous allowance can be made. 19599 */ 19600 #define MAX_INPUT_NESTING 25 19601 19602 /* 19603 ** A callback for the sqlite3_log() interface. 19604 */ 19605 static void shellLog(void *pArg, int iErrCode, const char *zMsg){ 19606 ShellState *p = (ShellState*)pArg; 19607 if( p->pLog==0 ) return; 19608 sputf(p->pLog, "(%d) %s\n", iErrCode, zMsg); 19609 fflush(p->pLog); 19610 } 19611 19612 /* 19613 ** SQL function: shell_putsnl(X) 19614 ** 19615 ** Write the text X to the screen (or whatever output is being directed) 19616 ** adding a newline at the end, and then return X. 19617 */ 19618 static void shellPutsFunc( 19619 sqlite3_context *pCtx, 19620 int nVal, 19621 sqlite3_value **apVal 19622 ){ 19623 /* Unused: (ShellState*)sqlite3_user_data(pCtx); */ 19624 (void)nVal; 19625 oputf("%s\n", sqlite3_value_text(apVal[0])); 19626 sqlite3_result_value(pCtx, apVal[0]); 19627 } 19628 19629 /* 19630 ** If in safe mode, print an error message described by the arguments 19631 ** and exit immediately. 19632 */ 19633 static void failIfSafeMode( 19634 ShellState *p, 19635 const char *zErrMsg, 19636 ... 19637 ){ 19638 if( p->bSafeMode ){ 19639 va_list ap; 19640 char *zMsg; 19641 va_start(ap, zErrMsg); 19642 zMsg = sqlite3_vmprintf(zErrMsg, ap); 19643 va_end(ap); 19644 eputf("line %d: %s\n", p->lineno, zMsg); 19645 exit(1); 19646 } 19647 } 19648 19649 /* 19650 ** SQL function: edit(VALUE) 19651 ** edit(VALUE,EDITOR) 19652 ** 19653 ** These steps: 19654 ** 19655 ** (1) Write VALUE into a temporary file. 19656 ** (2) Run program EDITOR on that temporary file. 19657 ** (3) Read the temporary file back and return its content as the result. 19658 ** (4) Delete the temporary file 19659 ** 19660 ** If the EDITOR argument is omitted, use the value in the VISUAL 19661 ** environment variable. If still there is no EDITOR, through an error. 19662 ** 19663 ** Also throw an error if the EDITOR program returns a non-zero exit code. 19664 */ 19665 #ifndef SQLITE_NOHAVE_SYSTEM 19666 static void editFunc( 19667 sqlite3_context *context, 19668 int argc, 19669 sqlite3_value **argv 19670 ){ 19671 const char *zEditor; 19672 char *zTempFile = 0; 19673 sqlite3 *db; 19674 char *zCmd = 0; 19675 int bBin; 19676 int rc; 19677 int hasCRNL = 0; 19678 FILE *f = 0; 19679 sqlite3_int64 sz; 19680 sqlite3_int64 x; 19681 unsigned char *p = 0; 19682 19683 if( argc==2 ){ 19684 zEditor = (const char*)sqlite3_value_text(argv[1]); 19685 }else{ 19686 zEditor = getenv("VISUAL"); 19687 } 19688 if( zEditor==0 ){ 19689 sqlite3_result_error(context, "no editor for edit()", -1); 19690 return; 19691 } 19692 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){ 19693 sqlite3_result_error(context, "NULL input to edit()", -1); 19694 return; 19695 } 19696 db = sqlite3_context_db_handle(context); 19697 zTempFile = 0; 19698 sqlite3_file_control(db, 0, SQLITE_FCNTL_TEMPFILENAME, &zTempFile); 19699 if( zTempFile==0 ){ 19700 sqlite3_uint64 r = 0; 19701 sqlite3_randomness(sizeof(r), &r); 19702 zTempFile = sqlite3_mprintf("temp%llx", r); 19703 if( zTempFile==0 ){ 19704 sqlite3_result_error_nomem(context); 19705 return; 19706 } 19707 } 19708 bBin = sqlite3_value_type(argv[0])==SQLITE_BLOB; 19709 /* When writing the file to be edited, do \n to \r\n conversions on systems 19710 ** that want \r\n line endings */ 19711 f = fopen(zTempFile, bBin ? "wb" : "w"); 19712 if( f==0 ){ 19713 sqlite3_result_error(context, "edit() cannot open temp file", -1); 19714 goto edit_func_end; 19715 } 19716 sz = sqlite3_value_bytes(argv[0]); 19717 if( bBin ){ 19718 x = fwrite(sqlite3_value_blob(argv[0]), 1, (size_t)sz, f); 19719 }else{ 19720 const char *z = (const char*)sqlite3_value_text(argv[0]); 19721 /* Remember whether or not the value originally contained \r\n */ 19722 if( z && strstr(z,"\r\n")!=0 ) hasCRNL = 1; 19723 x = fwrite(sqlite3_value_text(argv[0]), 1, (size_t)sz, f); 19724 } 19725 fclose(f); 19726 f = 0; 19727 if( x!=sz ){ 19728 sqlite3_result_error(context, "edit() could not write the whole file", -1); 19729 goto edit_func_end; 19730 } 19731 zCmd = sqlite3_mprintf("%s \"%s\"", zEditor, zTempFile); 19732 if( zCmd==0 ){ 19733 sqlite3_result_error_nomem(context); 19734 goto edit_func_end; 19735 } 19736 rc = system(zCmd); 19737 sqlite3_free(zCmd); 19738 if( rc ){ 19739 sqlite3_result_error(context, "EDITOR returned non-zero", -1); 19740 goto edit_func_end; 19741 } 19742 f = fopen(zTempFile, "rb"); 19743 if( f==0 ){ 19744 sqlite3_result_error(context, 19745 "edit() cannot reopen temp file after edit", -1); 19746 goto edit_func_end; 19747 } 19748 fseek(f, 0, SEEK_END); 19749 sz = ftell(f); 19750 rewind(f); 19751 p = sqlite3_malloc64( sz+1 ); 19752 if( p==0 ){ 19753 sqlite3_result_error_nomem(context); 19754 goto edit_func_end; 19755 } 19756 x = fread(p, 1, (size_t)sz, f); 19757 fclose(f); 19758 f = 0; 19759 if( x!=sz ){ 19760 sqlite3_result_error(context, "could not read back the whole file", -1); 19761 goto edit_func_end; 19762 } 19763 if( bBin ){ 19764 sqlite3_result_blob64(context, p, sz, sqlite3_free); 19765 }else{ 19766 sqlite3_int64 i, j; 19767 if( hasCRNL ){ 19768 /* If the original contains \r\n then do no conversions back to \n */ 19769 }else{ 19770 /* If the file did not originally contain \r\n then convert any new 19771 ** \r\n back into \n */ 19772 p[sz] = 0; 19773 for(i=j=0; i<sz; i++){ 19774 if( p[i]=='\r' && p[i+1]=='\n' ) i++; 19775 p[j++] = p[i]; 19776 } 19777 sz = j; 19778 p[sz] = 0; 19779 } 19780 sqlite3_result_text64(context, (const char*)p, sz, 19781 sqlite3_free, SQLITE_UTF8); 19782 } 19783 p = 0; 19784 19785 edit_func_end: 19786 if( f ) fclose(f); 19787 unlink(zTempFile); 19788 sqlite3_free(zTempFile); 19789 sqlite3_free(p); 19790 } 19791 #endif /* SQLITE_NOHAVE_SYSTEM */ 19792 19793 /* 19794 ** Save or restore the current output mode 19795 */ 19796 static void outputModePush(ShellState *p){ 19797 p->modePrior = p->mode; 19798 p->priorShFlgs = p->shellFlgs; 19799 memcpy(p->colSepPrior, p->colSeparator, sizeof(p->colSeparator)); 19800 memcpy(p->rowSepPrior, p->rowSeparator, sizeof(p->rowSeparator)); 19801 } 19802 static void outputModePop(ShellState *p){ 19803 p->mode = p->modePrior; 19804 p->shellFlgs = p->priorShFlgs; 19805 memcpy(p->colSeparator, p->colSepPrior, sizeof(p->colSeparator)); 19806 memcpy(p->rowSeparator, p->rowSepPrior, sizeof(p->rowSeparator)); 19807 } 19808 19809 /* 19810 ** Output the given string as a hex-encoded blob (eg. X'1234' ) 19811 */ 19812 static void output_hex_blob(const void *pBlob, int nBlob){ 19813 int i; 19814 unsigned char *aBlob = (unsigned char*)pBlob; 19815 19816 char *zStr = sqlite3_malloc(nBlob*2 + 1); 19817 shell_check_oom(zStr); 19818 19819 for(i=0; i<nBlob; i++){ 19820 static const char aHex[] = { 19821 '0', '1', '2', '3', '4', '5', '6', '7', 19822 '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' 19823 }; 19824 zStr[i*2] = aHex[ (aBlob[i] >> 4) ]; 19825 zStr[i*2+1] = aHex[ (aBlob[i] & 0x0F) ]; 19826 } 19827 zStr[i*2] = '\0'; 19828 19829 oputf("X'%s'", zStr); 19830 sqlite3_free(zStr); 19831 } 19832 19833 /* 19834 ** Find a string that is not found anywhere in z[]. Return a pointer 19835 ** to that string. 19836 ** 19837 ** Try to use zA and zB first. If both of those are already found in z[] 19838 ** then make up some string and store it in the buffer zBuf. 19839 */ 19840 static const char *unused_string( 19841 const char *z, /* Result must not appear anywhere in z */ 19842 const char *zA, const char *zB, /* Try these first */ 19843 char *zBuf /* Space to store a generated string */ 19844 ){ 19845 unsigned i = 0; 19846 if( strstr(z, zA)==0 ) return zA; 19847 if( strstr(z, zB)==0 ) return zB; 19848 do{ 19849 sqlite3_snprintf(20,zBuf,"(%s%u)", zA, i++); 19850 }while( strstr(z,zBuf)!=0 ); 19851 return zBuf; 19852 } 19853 19854 /* 19855 ** Output the given string as a quoted string using SQL quoting conventions. 19856 ** 19857 ** See also: output_quoted_escaped_string() 19858 */ 19859 static void output_quoted_string(const char *z){ 19860 int i; 19861 char c; 19862 #ifndef SQLITE_SHELL_FIDDLE 19863 FILE *pfO = setOutputStream(invalidFileStream); 19864 setBinaryMode(pfO, 1); 19865 #endif 19866 if( z==0 ) return; 19867 for(i=0; (c = z[i])!=0 && c!='\''; i++){} 19868 if( c==0 ){ 19869 oputf("'%s'",z); 19870 }else{ 19871 oputz("'"); 19872 while( *z ){ 19873 for(i=0; (c = z[i])!=0 && c!='\''; i++){} 19874 if( c=='\'' ) i++; 19875 if( i ){ 19876 oputf("%.*s", i, z); 19877 z += i; 19878 } 19879 if( c=='\'' ){ 19880 oputz("'"); 19881 continue; 19882 } 19883 if( c==0 ){ 19884 break; 19885 } 19886 z++; 19887 } 19888 oputz("'"); 19889 } 19890 #ifndef SQLITE_SHELL_FIDDLE 19891 setTextMode(pfO, 1); 19892 #else 19893 setTextMode(stdout, 1); 19894 #endif 19895 } 19896 19897 /* 19898 ** Output the given string as a quoted string using SQL quoting conventions. 19899 ** Additionallly , escape the "\n" and "\r" characters so that they do not 19900 ** get corrupted by end-of-line translation facilities in some operating 19901 ** systems. 19902 ** 19903 ** This is like output_quoted_string() but with the addition of the \r\n 19904 ** escape mechanism. 19905 */ 19906 static void output_quoted_escaped_string(const char *z){ 19907 int i; 19908 char c; 19909 #ifndef SQLITE_SHELL_FIDDLE 19910 FILE *pfO = setOutputStream(invalidFileStream); 19911 setBinaryMode(pfO, 1); 19912 #endif 19913 for(i=0; (c = z[i])!=0 && c!='\'' && c!='\n' && c!='\r'; i++){} 19914 if( c==0 ){ 19915 oputf("'%s'",z); 19916 }else{ 19917 const char *zNL = 0; 19918 const char *zCR = 0; 19919 int nNL = 0; 19920 int nCR = 0; 19921 char zBuf1[20], zBuf2[20]; 19922 for(i=0; z[i]; i++){ 19923 if( z[i]=='\n' ) nNL++; 19924 if( z[i]=='\r' ) nCR++; 19925 } 19926 if( nNL ){ 19927 oputz("replace("); 19928 zNL = unused_string(z, "\\n", "\\012", zBuf1); 19929 } 19930 if( nCR ){ 19931 oputz("replace("); 19932 zCR = unused_string(z, "\\r", "\\015", zBuf2); 19933 } 19934 oputz("'"); 19935 while( *z ){ 19936 for(i=0; (c = z[i])!=0 && c!='\n' && c!='\r' && c!='\''; i++){} 19937 if( c=='\'' ) i++; 19938 if( i ){ 19939 oputf("%.*s", i, z); 19940 z += i; 19941 } 19942 if( c=='\'' ){ 19943 oputz("'"); 19944 continue; 19945 } 19946 if( c==0 ){ 19947 break; 19948 } 19949 z++; 19950 if( c=='\n' ){ 19951 oputz(zNL); 19952 continue; 19953 } 19954 oputz(zCR); 19955 } 19956 oputz("'"); 19957 if( nCR ){ 19958 oputf(",'%s',char(13))", zCR); 19959 } 19960 if( nNL ){ 19961 oputf(",'%s',char(10))", zNL); 19962 } 19963 } 19964 #ifndef SQLITE_SHELL_FIDDLE 19965 setTextMode(pfO, 1); 19966 #else 19967 setTextMode(stdout, 1); 19968 #endif 19969 } 19970 19971 /* 19972 ** Find earliest of chars within s specified in zAny. 19973 ** With ns == ~0, is like strpbrk(s,zAny) and s must be 0-terminated. 19974 */ 19975 static const char *anyOfInStr(const char *s, const char *zAny, size_t ns){ 19976 const char *pcFirst = 0; 19977 if( ns == ~(size_t)0 ) ns = strlen(s); 19978 while(*zAny){ 19979 const char *pc = (const char*)memchr(s, *zAny&0xff, ns); 19980 if( pc ){ 19981 pcFirst = pc; 19982 ns = pcFirst - s; 19983 } 19984 ++zAny; 19985 } 19986 return pcFirst; 19987 } 19988 /* 19989 ** Output the given string as a quoted according to C or TCL quoting rules. 19990 */ 19991 static void output_c_string(const char *z){ 19992 char c; 19993 static const char *zq = "\""; 19994 static long ctrlMask = ~0L; 19995 static const char *zDQBSRO = "\"\\\x7f"; /* double-quote, backslash, rubout */ 19996 char ace[3] = "\\?"; 19997 char cbsSay; 19998 oputz(zq); 19999 while( *z!=0 ){ 20000 const char *pcDQBSRO = anyOfInStr(z, zDQBSRO, ~(size_t)0); 20001 const char *pcPast = zSkipValidUtf8(z, INT_MAX, ctrlMask); 20002 const char *pcEnd = (pcDQBSRO && pcDQBSRO < pcPast)? pcDQBSRO : pcPast; 20003 if( pcEnd > z ) oputb(z, (int)(pcEnd-z)); 20004 if( (c = *pcEnd)==0 ) break; 20005 ++pcEnd; 20006 switch( c ){ 20007 case '\\': case '"': 20008 cbsSay = (char)c; 20009 break; 20010 case '\t': cbsSay = 't'; break; 20011 case '\n': cbsSay = 'n'; break; 20012 case '\r': cbsSay = 'r'; break; 20013 case '\f': cbsSay = 'f'; break; 20014 default: cbsSay = 0; break; 20015 } 20016 if( cbsSay ){ 20017 ace[1] = cbsSay; 20018 oputz(ace); 20019 }else if( !isprint(c&0xff) ){ 20020 oputf("\\%03o", c&0xff); 20021 }else{ 20022 ace[1] = (char)c; 20023 oputz(ace+1); 20024 } 20025 z = pcEnd; 20026 } 20027 oputz(zq); 20028 } 20029 20030 /* 20031 ** Output the given string as a quoted according to JSON quoting rules. 20032 */ 20033 static void output_json_string(const char *z, i64 n){ 20034 char c; 20035 static const char *zq = "\""; 20036 static long ctrlMask = ~0L; 20037 static const char *zDQBS = "\"\\"; 20038 const char *pcLimit; 20039 char ace[3] = "\\?"; 20040 char cbsSay; 20041 20042 if( z==0 ) z = ""; 20043 pcLimit = z + ((n<0)? strlen(z) : (size_t)n); 20044 oputz(zq); 20045 while( z < pcLimit ){ 20046 const char *pcDQBS = anyOfInStr(z, zDQBS, pcLimit-z); 20047 const char *pcPast = zSkipValidUtf8(z, (int)(pcLimit-z), ctrlMask); 20048 const char *pcEnd = (pcDQBS && pcDQBS < pcPast)? pcDQBS : pcPast; 20049 if( pcEnd > z ){ 20050 oputb(z, (int)(pcEnd-z)); 20051 z = pcEnd; 20052 } 20053 if( z >= pcLimit ) break; 20054 c = *(z++); 20055 switch( c ){ 20056 case '"': case '\\': 20057 cbsSay = (char)c; 20058 break; 20059 case '\b': cbsSay = 'b'; break; 20060 case '\f': cbsSay = 'f'; break; 20061 case '\n': cbsSay = 'n'; break; 20062 case '\r': cbsSay = 'r'; break; 20063 case '\t': cbsSay = 't'; break; 20064 default: cbsSay = 0; break; 20065 } 20066 if( cbsSay ){ 20067 ace[1] = cbsSay; 20068 oputz(ace); 20069 }else if( c<=0x1f ){ 20070 oputf("u%04x", c); 20071 }else{ 20072 ace[1] = (char)c; 20073 oputz(ace+1); 20074 } 20075 } 20076 oputz(zq); 20077 } 20078 20079 /* 20080 ** Output the given string with characters that are special to 20081 ** HTML escaped. 20082 */ 20083 static void output_html_string(const char *z){ 20084 int i; 20085 if( z==0 ) z = ""; 20086 while( *z ){ 20087 for(i=0; z[i] 20088 && z[i]!='<' 20089 && z[i]!='&' 20090 && z[i]!='>' 20091 && z[i]!='\"' 20092 && z[i]!='\''; 20093 i++){} 20094 if( i>0 ){ 20095 oputf("%.*s",i,z); 20096 } 20097 if( z[i]=='<' ){ 20098 oputz("<"); 20099 }else if( z[i]=='&' ){ 20100 oputz("&"); 20101 }else if( z[i]=='>' ){ 20102 oputz(">"); 20103 }else if( z[i]=='\"' ){ 20104 oputz("""); 20105 }else if( z[i]=='\'' ){ 20106 oputz("'"); 20107 }else{ 20108 break; 20109 } 20110 z += i + 1; 20111 } 20112 } 20113 20114 /* 20115 ** If a field contains any character identified by a 1 in the following 20116 ** array, then the string must be quoted for CSV. 20117 */ 20118 static const char needCsvQuote[] = { 20119 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20120 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20121 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 20122 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20123 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20124 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20125 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20126 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 20127 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20128 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20129 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20130 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20131 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20132 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20133 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20134 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20135 }; 20136 20137 /* 20138 ** Output a single term of CSV. Actually, p->colSeparator is used for 20139 ** the separator, which may or may not be a comma. p->nullValue is 20140 ** the null value. Strings are quoted if necessary. The separator 20141 ** is only issued if bSep is true. 20142 */ 20143 static void output_csv(ShellState *p, const char *z, int bSep){ 20144 if( z==0 ){ 20145 oputf("%s",p->nullValue); 20146 }else{ 20147 unsigned i; 20148 for(i=0; z[i]; i++){ 20149 if( needCsvQuote[((unsigned char*)z)[i]] ){ 20150 i = 0; 20151 break; 20152 } 20153 } 20154 if( i==0 || strstr(z, p->colSeparator)!=0 ){ 20155 char *zQuoted = sqlite3_mprintf("\"%w\"", z); 20156 shell_check_oom(zQuoted); 20157 oputz(zQuoted); 20158 sqlite3_free(zQuoted); 20159 }else{ 20160 oputz(z); 20161 } 20162 } 20163 if( bSep ){ 20164 oputz(p->colSeparator); 20165 } 20166 } 20167 20168 /* 20169 ** This routine runs when the user presses Ctrl-C 20170 */ 20171 static void interrupt_handler(int NotUsed){ 20172 UNUSED_PARAMETER(NotUsed); 20173 if( ++seenInterrupt>1 ) exit(1); 20174 if( globalDb ) sqlite3_interrupt(globalDb); 20175 } 20176 20177 #if (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE) 20178 /* 20179 ** This routine runs for console events (e.g. Ctrl-C) on Win32 20180 */ 20181 static BOOL WINAPI ConsoleCtrlHandler( 20182 DWORD dwCtrlType /* One of the CTRL_*_EVENT constants */ 20183 ){ 20184 if( dwCtrlType==CTRL_C_EVENT ){ 20185 interrupt_handler(0); 20186 return TRUE; 20187 } 20188 return FALSE; 20189 } 20190 #endif 20191 20192 #ifndef SQLITE_OMIT_AUTHORIZATION 20193 /* 20194 ** This authorizer runs in safe mode. 20195 */ 20196 static int safeModeAuth( 20197 void *pClientData, 20198 int op, 20199 const char *zA1, 20200 const char *zA2, 20201 const char *zA3, 20202 const char *zA4 20203 ){ 20204 ShellState *p = (ShellState*)pClientData; 20205 static const char *azProhibitedFunctions[] = { 20206 "edit", 20207 "fts3_tokenizer", 20208 "load_extension", 20209 "readfile", 20210 "writefile", 20211 "zipfile", 20212 "zipfile_cds", 20213 }; 20214 UNUSED_PARAMETER(zA1); 20215 UNUSED_PARAMETER(zA3); 20216 UNUSED_PARAMETER(zA4); 20217 switch( op ){ 20218 case SQLITE_ATTACH: { 20219 #ifndef SQLITE_SHELL_FIDDLE 20220 /* In WASM builds the filesystem is a virtual sandbox, so 20221 ** there's no harm in using ATTACH. */ 20222 failIfSafeMode(p, "cannot run ATTACH in safe mode"); 20223 #endif 20224 break; 20225 } 20226 case SQLITE_FUNCTION: { 20227 int i; 20228 for(i=0; i<ArraySize(azProhibitedFunctions); i++){ 20229 if( sqlite3_stricmp(zA2, azProhibitedFunctions[i])==0 ){ 20230 failIfSafeMode(p, "cannot use the %s() function in safe mode", 20231 azProhibitedFunctions[i]); 20232 } 20233 } 20234 break; 20235 } 20236 } 20237 return SQLITE_OK; 20238 } 20239 20240 /* 20241 ** When the ".auth ON" is set, the following authorizer callback is 20242 ** invoked. It always returns SQLITE_OK. 20243 */ 20244 static int shellAuth( 20245 void *pClientData, 20246 int op, 20247 const char *zA1, 20248 const char *zA2, 20249 const char *zA3, 20250 const char *zA4 20251 ){ 20252 ShellState *p = (ShellState*)pClientData; 20253 static const char *azAction[] = { 0, 20254 "CREATE_INDEX", "CREATE_TABLE", "CREATE_TEMP_INDEX", 20255 "CREATE_TEMP_TABLE", "CREATE_TEMP_TRIGGER", "CREATE_TEMP_VIEW", 20256 "CREATE_TRIGGER", "CREATE_VIEW", "DELETE", 20257 "DROP_INDEX", "DROP_TABLE", "DROP_TEMP_INDEX", 20258 "DROP_TEMP_TABLE", "DROP_TEMP_TRIGGER", "DROP_TEMP_VIEW", 20259 "DROP_TRIGGER", "DROP_VIEW", "INSERT", 20260 "PRAGMA", "READ", "SELECT", 20261 "TRANSACTION", "UPDATE", "ATTACH", 20262 "DETACH", "ALTER_TABLE", "REINDEX", 20263 "ANALYZE", "CREATE_VTABLE", "DROP_VTABLE", 20264 "FUNCTION", "SAVEPOINT", "RECURSIVE" 20265 }; 20266 int i; 20267 const char *az[4]; 20268 az[0] = zA1; 20269 az[1] = zA2; 20270 az[2] = zA3; 20271 az[3] = zA4; 20272 oputf("authorizer: %s", azAction[op]); 20273 for(i=0; i<4; i++){ 20274 oputz(" "); 20275 if( az[i] ){ 20276 output_c_string(az[i]); 20277 }else{ 20278 oputz("NULL"); 20279 } 20280 } 20281 oputz("\n"); 20282 if( p->bSafeMode ) (void)safeModeAuth(pClientData, op, zA1, zA2, zA3, zA4); 20283 return SQLITE_OK; 20284 } 20285 #endif 20286 20287 /* 20288 ** Print a schema statement. Part of MODE_Semi and MODE_Pretty output. 20289 ** 20290 ** This routine converts some CREATE TABLE statements for shadow tables 20291 ** in FTS3/4/5 into CREATE TABLE IF NOT EXISTS statements. 20292 ** 20293 ** If the schema statement in z[] contains a start-of-comment and if 20294 ** sqlite3_complete() returns false, try to terminate the comment before 20295 ** printing the result. https://sqlite.org/forum/forumpost/d7be961c5c 20296 */ 20297 static void printSchemaLine(const char *z, const char *zTail){ 20298 char *zToFree = 0; 20299 if( z==0 ) return; 20300 if( zTail==0 ) return; 20301 if( zTail[0]==';' && (strstr(z, "/*")!=0 || strstr(z,"--")!=0) ){ 20302 const char *zOrig = z; 20303 static const char *azTerm[] = { "", "*/", "\n" }; 20304 int i; 20305 for(i=0; i<ArraySize(azTerm); i++){ 20306 char *zNew = sqlite3_mprintf("%s%s;", zOrig, azTerm[i]); 20307 shell_check_oom(zNew); 20308 if( sqlite3_complete(zNew) ){ 20309 size_t n = strlen(zNew); 20310 zNew[n-1] = 0; 20311 zToFree = zNew; 20312 z = zNew; 20313 break; 20314 } 20315 sqlite3_free(zNew); 20316 } 20317 } 20318 if( sqlite3_strglob("CREATE TABLE ['\"]*", z)==0 ){ 20319 oputf("CREATE TABLE IF NOT EXISTS %s%s", z+13, zTail); 20320 }else{ 20321 oputf("%s%s", z, zTail); 20322 } 20323 sqlite3_free(zToFree); 20324 } 20325 static void printSchemaLineN(char *z, int n, const char *zTail){ 20326 char c = z[n]; 20327 z[n] = 0; 20328 printSchemaLine(z, zTail); 20329 z[n] = c; 20330 } 20331 20332 /* 20333 ** Return true if string z[] has nothing but whitespace and comments to the 20334 ** end of the first line. 20335 */ 20336 static int wsToEol(const char *z){ 20337 int i; 20338 for(i=0; z[i]; i++){ 20339 if( z[i]=='\n' ) return 1; 20340 if( IsSpace(z[i]) ) continue; 20341 if( z[i]=='-' && z[i+1]=='-' ) return 1; 20342 return 0; 20343 } 20344 return 1; 20345 } 20346 20347 /* 20348 ** Add a new entry to the EXPLAIN QUERY PLAN data 20349 */ 20350 static void eqp_append(ShellState *p, int iEqpId, int p2, const char *zText){ 20351 EQPGraphRow *pNew; 20352 i64 nText; 20353 if( zText==0 ) return; 20354 nText = strlen(zText); 20355 if( p->autoEQPtest ){ 20356 oputf("%d,%d,%s\n", iEqpId, p2, zText); 20357 } 20358 pNew = sqlite3_malloc64( sizeof(*pNew) + nText ); 20359 shell_check_oom(pNew); 20360 pNew->iEqpId = iEqpId; 20361 pNew->iParentId = p2; 20362 memcpy(pNew->zText, zText, nText+1); 20363 pNew->pNext = 0; 20364 if( p->sGraph.pLast ){ 20365 p->sGraph.pLast->pNext = pNew; 20366 }else{ 20367 p->sGraph.pRow = pNew; 20368 } 20369 p->sGraph.pLast = pNew; 20370 } 20371 20372 /* 20373 ** Free and reset the EXPLAIN QUERY PLAN data that has been collected 20374 ** in p->sGraph. 20375 */ 20376 static void eqp_reset(ShellState *p){ 20377 EQPGraphRow *pRow, *pNext; 20378 for(pRow = p->sGraph.pRow; pRow; pRow = pNext){ 20379 pNext = pRow->pNext; 20380 sqlite3_free(pRow); 20381 } 20382 memset(&p->sGraph, 0, sizeof(p->sGraph)); 20383 } 20384 20385 /* Return the next EXPLAIN QUERY PLAN line with iEqpId that occurs after 20386 ** pOld, or return the first such line if pOld is NULL 20387 */ 20388 static EQPGraphRow *eqp_next_row(ShellState *p, int iEqpId, EQPGraphRow *pOld){ 20389 EQPGraphRow *pRow = pOld ? pOld->pNext : p->sGraph.pRow; 20390 while( pRow && pRow->iParentId!=iEqpId ) pRow = pRow->pNext; 20391 return pRow; 20392 } 20393 20394 /* Render a single level of the graph that has iEqpId as its parent. Called 20395 ** recursively to render sublevels. 20396 */ 20397 static void eqp_render_level(ShellState *p, int iEqpId){ 20398 EQPGraphRow *pRow, *pNext; 20399 i64 n = strlen(p->sGraph.zPrefix); 20400 char *z; 20401 for(pRow = eqp_next_row(p, iEqpId, 0); pRow; pRow = pNext){ 20402 pNext = eqp_next_row(p, iEqpId, pRow); 20403 z = pRow->zText; 20404 oputf("%s%s%s\n", p->sGraph.zPrefix, pNext ? "|--" : "`--", z); 20405 if( n<(i64)sizeof(p->sGraph.zPrefix)-7 ){ 20406 memcpy(&p->sGraph.zPrefix[n], pNext ? "| " : " ", 4); 20407 eqp_render_level(p, pRow->iEqpId); 20408 p->sGraph.zPrefix[n] = 0; 20409 } 20410 } 20411 } 20412 20413 /* 20414 ** Display and reset the EXPLAIN QUERY PLAN data 20415 */ 20416 static void eqp_render(ShellState *p, i64 nCycle){ 20417 EQPGraphRow *pRow = p->sGraph.pRow; 20418 if( pRow ){ 20419 if( pRow->zText[0]=='-' ){ 20420 if( pRow->pNext==0 ){ 20421 eqp_reset(p); 20422 return; 20423 } 20424 oputf("%s\n", pRow->zText+3); 20425 p->sGraph.pRow = pRow->pNext; 20426 sqlite3_free(pRow); 20427 }else if( nCycle>0 ){ 20428 oputf("QUERY PLAN (cycles=%lld [100%%])\n", nCycle); 20429 }else{ 20430 oputz("QUERY PLAN\n"); 20431 } 20432 p->sGraph.zPrefix[0] = 0; 20433 eqp_render_level(p, 0); 20434 eqp_reset(p); 20435 } 20436 } 20437 20438 #ifndef SQLITE_OMIT_PROGRESS_CALLBACK 20439 /* 20440 ** Progress handler callback. 20441 */ 20442 static int progress_handler(void *pClientData) { 20443 ShellState *p = (ShellState*)pClientData; 20444 p->nProgress++; 20445 if( p->nProgress>=p->mxProgress && p->mxProgress>0 ){ 20446 oputf("Progress limit reached (%u)\n", p->nProgress); 20447 if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0; 20448 if( p->flgProgress & SHELL_PROGRESS_ONCE ) p->mxProgress = 0; 20449 return 1; 20450 } 20451 if( (p->flgProgress & SHELL_PROGRESS_QUIET)==0 ){ 20452 oputf("Progress %u\n", p->nProgress); 20453 } 20454 return 0; 20455 } 20456 #endif /* SQLITE_OMIT_PROGRESS_CALLBACK */ 20457 20458 /* 20459 ** Print N dashes 20460 */ 20461 static void print_dashes(int N){ 20462 const char zDash[] = "--------------------------------------------------"; 20463 const int nDash = sizeof(zDash) - 1; 20464 while( N>nDash ){ 20465 oputz(zDash); 20466 N -= nDash; 20467 } 20468 oputf("%.*s", N, zDash); 20469 } 20470 20471 /* 20472 ** Print a markdown or table-style row separator using ascii-art 20473 */ 20474 static void print_row_separator( 20475 ShellState *p, 20476 int nArg, 20477 const char *zSep 20478 ){ 20479 int i; 20480 if( nArg>0 ){ 20481 oputz(zSep); 20482 print_dashes(p->actualWidth[0]+2); 20483 for(i=1; i<nArg; i++){ 20484 oputz(zSep); 20485 print_dashes(p->actualWidth[i]+2); 20486 } 20487 oputz(zSep); 20488 } 20489 oputz("\n"); 20490 } 20491 20492 /* 20493 ** This is the callback routine that the shell 20494 ** invokes for each row of a query result. 20495 */ 20496 static int shell_callback( 20497 void *pArg, 20498 int nArg, /* Number of result columns */ 20499 char **azArg, /* Text of each result column */ 20500 char **azCol, /* Column names */ 20501 int *aiType /* Column types. Might be NULL */ 20502 ){ 20503 int i; 20504 ShellState *p = (ShellState*)pArg; 20505 20506 if( azArg==0 ) return 0; 20507 switch( p->cMode ){ 20508 case MODE_Count: 20509 case MODE_Off: { 20510 break; 20511 } 20512 case MODE_Line: { 20513 int w = 5; 20514 if( azArg==0 ) break; 20515 for(i=0; i<nArg; i++){ 20516 int len = strlen30(azCol[i] ? azCol[i] : ""); 20517 if( len>w ) w = len; 20518 } 20519 if( p->cnt++>0 ) oputz(p->rowSeparator); 20520 for(i=0; i<nArg; i++){ 20521 oputf("%*s = %s%s", w, azCol[i], 20522 azArg[i] ? azArg[i] : p->nullValue, p->rowSeparator); 20523 } 20524 break; 20525 } 20526 case MODE_ScanExp: 20527 case MODE_Explain: { 20528 static const int aExplainWidth[] = {4, 13, 4, 4, 4, 13, 2, 13}; 20529 static const int aExplainMap[] = {0, 1, 2, 3, 4, 5, 6, 7 }; 20530 static const int aScanExpWidth[] = {4, 6, 6, 13, 4, 4, 4, 13, 2, 13}; 20531 static const int aScanExpMap[] = {0, 9, 8, 1, 2, 3, 4, 5, 6, 7 }; 20532 20533 const int *aWidth = aExplainWidth; 20534 const int *aMap = aExplainMap; 20535 int nWidth = ArraySize(aExplainWidth); 20536 int iIndent = 1; 20537 20538 if( p->cMode==MODE_ScanExp ){ 20539 aWidth = aScanExpWidth; 20540 aMap = aScanExpMap; 20541 nWidth = ArraySize(aScanExpWidth); 20542 iIndent = 3; 20543 } 20544 if( nArg>nWidth ) nArg = nWidth; 20545 20546 /* If this is the first row seen, print out the headers */ 20547 if( p->cnt++==0 ){ 20548 for(i=0; i<nArg; i++){ 20549 utf8_width_print(aWidth[i], azCol[ aMap[i] ]); 20550 oputz(i==nArg-1 ? "\n" : " "); 20551 } 20552 for(i=0; i<nArg; i++){ 20553 print_dashes(aWidth[i]); 20554 oputz(i==nArg-1 ? "\n" : " "); 20555 } 20556 } 20557 20558 /* If there is no data, exit early. */ 20559 if( azArg==0 ) break; 20560 20561 for(i=0; i<nArg; i++){ 20562 const char *zSep = " "; 20563 int w = aWidth[i]; 20564 const char *zVal = azArg[ aMap[i] ]; 20565 if( i==nArg-1 ) w = 0; 20566 if( zVal && strlenChar(zVal)>w ){ 20567 w = strlenChar(zVal); 20568 zSep = " "; 20569 } 20570 if( i==iIndent && p->aiIndent && p->pStmt ){ 20571 if( p->iIndent<p->nIndent ){ 20572 oputf("%*.s", p->aiIndent[p->iIndent], ""); 20573 } 20574 p->iIndent++; 20575 } 20576 utf8_width_print(w, zVal ? zVal : p->nullValue); 20577 oputz(i==nArg-1 ? "\n" : zSep); 20578 } 20579 break; 20580 } 20581 case MODE_Semi: { /* .schema and .fullschema output */ 20582 printSchemaLine(azArg[0], ";\n"); 20583 break; 20584 } 20585 case MODE_Pretty: { /* .schema and .fullschema with --indent */ 20586 char *z; 20587 int j; 20588 int nParen = 0; 20589 char cEnd = 0; 20590 char c; 20591 int nLine = 0; 20592 assert( nArg==1 ); 20593 if( azArg[0]==0 ) break; 20594 if( sqlite3_strlike("CREATE VIEW%", azArg[0], 0)==0 20595 || sqlite3_strlike("CREATE TRIG%", azArg[0], 0)==0 20596 ){ 20597 oputf("%s;\n", azArg[0]); 20598 break; 20599 } 20600 z = sqlite3_mprintf("%s", azArg[0]); 20601 shell_check_oom(z); 20602 j = 0; 20603 for(i=0; IsSpace(z[i]); i++){} 20604 for(; (c = z[i])!=0; i++){ 20605 if( IsSpace(c) ){ 20606 if( z[j-1]=='\r' ) z[j-1] = '\n'; 20607 if( IsSpace(z[j-1]) || z[j-1]=='(' ) continue; 20608 }else if( (c=='(' || c==')') && j>0 && IsSpace(z[j-1]) ){ 20609 j--; 20610 } 20611 z[j++] = c; 20612 } 20613 while( j>0 && IsSpace(z[j-1]) ){ j--; } 20614 z[j] = 0; 20615 if( strlen30(z)>=79 ){ 20616 for(i=j=0; (c = z[i])!=0; i++){ /* Copy from z[i] back to z[j] */ 20617 if( c==cEnd ){ 20618 cEnd = 0; 20619 }else if( c=='"' || c=='\'' || c=='`' ){ 20620 cEnd = c; 20621 }else if( c=='[' ){ 20622 cEnd = ']'; 20623 }else if( c=='-' && z[i+1]=='-' ){ 20624 cEnd = '\n'; 20625 }else if( c=='(' ){ 20626 nParen++; 20627 }else if( c==')' ){ 20628 nParen--; 20629 if( nLine>0 && nParen==0 && j>0 ){ 20630 printSchemaLineN(z, j, "\n"); 20631 j = 0; 20632 } 20633 } 20634 z[j++] = c; 20635 if( nParen==1 && cEnd==0 20636 && (c=='(' || c=='\n' || (c==',' && !wsToEol(z+i+1))) 20637 ){ 20638 if( c=='\n' ) j--; 20639 printSchemaLineN(z, j, "\n "); 20640 j = 0; 20641 nLine++; 20642 while( IsSpace(z[i+1]) ){ i++; } 20643 } 20644 } 20645 z[j] = 0; 20646 } 20647 printSchemaLine(z, ";\n"); 20648 sqlite3_free(z); 20649 break; 20650 } 20651 case MODE_List: { 20652 if( p->cnt++==0 && p->showHeader ){ 20653 for(i=0; i<nArg; i++){ 20654 oputf("%s%s",azCol[i], i==nArg-1 ? p->rowSeparator : p->colSeparator); 20655 } 20656 } 20657 if( azArg==0 ) break; 20658 for(i=0; i<nArg; i++){ 20659 char *z = azArg[i]; 20660 if( z==0 ) z = p->nullValue; 20661 oputz(z); 20662 oputz((i<nArg-1)? p->colSeparator : p->rowSeparator); 20663 } 20664 break; 20665 } 20666 case MODE_Html: { 20667 if( p->cnt++==0 && p->showHeader ){ 20668 oputz("<TR>"); 20669 for(i=0; i<nArg; i++){ 20670 oputz("<TH>"); 20671 output_html_string(azCol[i]); 20672 oputz("</TH>\n"); 20673 } 20674 oputz("</TR>\n"); 20675 } 20676 if( azArg==0 ) break; 20677 oputz("<TR>"); 20678 for(i=0; i<nArg; i++){ 20679 oputz("<TD>"); 20680 output_html_string(azArg[i] ? azArg[i] : p->nullValue); 20681 oputz("</TD>\n"); 20682 } 20683 oputz("</TR>\n"); 20684 break; 20685 } 20686 case MODE_Tcl: { 20687 if( p->cnt++==0 && p->showHeader ){ 20688 for(i=0; i<nArg; i++){ 20689 output_c_string(azCol[i] ? azCol[i] : ""); 20690 if(i<nArg-1) oputz(p->colSeparator); 20691 } 20692 oputz(p->rowSeparator); 20693 } 20694 if( azArg==0 ) break; 20695 for(i=0; i<nArg; i++){ 20696 output_c_string(azArg[i] ? azArg[i] : p->nullValue); 20697 if(i<nArg-1) oputz(p->colSeparator); 20698 } 20699 oputz(p->rowSeparator); 20700 break; 20701 } 20702 case MODE_Csv: { 20703 setBinaryMode(p->out, 1); 20704 if( p->cnt++==0 && p->showHeader ){ 20705 for(i=0; i<nArg; i++){ 20706 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1); 20707 } 20708 oputz(p->rowSeparator); 20709 } 20710 if( nArg>0 ){ 20711 for(i=0; i<nArg; i++){ 20712 output_csv(p, azArg[i], i<nArg-1); 20713 } 20714 oputz(p->rowSeparator); 20715 } 20716 setTextMode(p->out, 1); 20717 break; 20718 } 20719 case MODE_Insert: { 20720 if( azArg==0 ) break; 20721 oputf("INSERT INTO %s",p->zDestTable); 20722 if( p->showHeader ){ 20723 oputz("("); 20724 for(i=0; i<nArg; i++){ 20725 if( i>0 ) oputz(","); 20726 if( quoteChar(azCol[i]) ){ 20727 char *z = sqlite3_mprintf("\"%w\"", azCol[i]); 20728 shell_check_oom(z); 20729 oputz(z); 20730 sqlite3_free(z); 20731 }else{ 20732 oputf("%s", azCol[i]); 20733 } 20734 } 20735 oputz(")"); 20736 } 20737 p->cnt++; 20738 for(i=0; i<nArg; i++){ 20739 oputz(i>0 ? "," : " VALUES("); 20740 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){ 20741 oputz("NULL"); 20742 }else if( aiType && aiType[i]==SQLITE_TEXT ){ 20743 if( ShellHasFlag(p, SHFLG_Newlines) ){ 20744 output_quoted_string(azArg[i]); 20745 }else{ 20746 output_quoted_escaped_string(azArg[i]); 20747 } 20748 }else if( aiType && aiType[i]==SQLITE_INTEGER ){ 20749 oputz(azArg[i]); 20750 }else if( aiType && aiType[i]==SQLITE_FLOAT ){ 20751 char z[50]; 20752 double r = sqlite3_column_double(p->pStmt, i); 20753 sqlite3_uint64 ur; 20754 memcpy(&ur,&r,sizeof(r)); 20755 if( ur==0x7ff0000000000000LL ){ 20756 oputz("9.0e+999"); 20757 }else if( ur==0xfff0000000000000LL ){ 20758 oputz("-9.0e+999"); 20759 }else{ 20760 sqlite3_int64 ir = (sqlite3_int64)r; 20761 if( r==(double)ir ){ 20762 sqlite3_snprintf(50,z,"%lld.0", ir); 20763 }else{ 20764 sqlite3_snprintf(50,z,"%!.20g", r); 20765 } 20766 oputz(z); 20767 } 20768 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){ 20769 const void *pBlob = sqlite3_column_blob(p->pStmt, i); 20770 int nBlob = sqlite3_column_bytes(p->pStmt, i); 20771 output_hex_blob(pBlob, nBlob); 20772 }else if( isNumber(azArg[i], 0) ){ 20773 oputz(azArg[i]); 20774 }else if( ShellHasFlag(p, SHFLG_Newlines) ){ 20775 output_quoted_string(azArg[i]); 20776 }else{ 20777 output_quoted_escaped_string(azArg[i]); 20778 } 20779 } 20780 oputz(");\n"); 20781 break; 20782 } 20783 case MODE_Json: { 20784 if( azArg==0 ) break; 20785 if( p->cnt==0 ){ 20786 fputs("[{", p->out); 20787 }else{ 20788 fputs(",\n{", p->out); 20789 } 20790 p->cnt++; 20791 for(i=0; i<nArg; i++){ 20792 output_json_string(azCol[i], -1); 20793 oputz(":"); 20794 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){ 20795 oputz("null"); 20796 }else if( aiType && aiType[i]==SQLITE_FLOAT ){ 20797 char z[50]; 20798 double r = sqlite3_column_double(p->pStmt, i); 20799 sqlite3_uint64 ur; 20800 memcpy(&ur,&r,sizeof(r)); 20801 if( ur==0x7ff0000000000000LL ){ 20802 oputz("9.0e+999"); 20803 }else if( ur==0xfff0000000000000LL ){ 20804 oputz("-9.0e+999"); 20805 }else{ 20806 sqlite3_snprintf(50,z,"%!.20g", r); 20807 oputz(z); 20808 } 20809 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){ 20810 const void *pBlob = sqlite3_column_blob(p->pStmt, i); 20811 int nBlob = sqlite3_column_bytes(p->pStmt, i); 20812 output_json_string(pBlob, nBlob); 20813 }else if( aiType && aiType[i]==SQLITE_TEXT ){ 20814 output_json_string(azArg[i], -1); 20815 }else{ 20816 oputz(azArg[i]); 20817 } 20818 if( i<nArg-1 ){ 20819 oputz(","); 20820 } 20821 } 20822 oputz("}"); 20823 break; 20824 } 20825 case MODE_Quote: { 20826 if( azArg==0 ) break; 20827 if( p->cnt==0 && p->showHeader ){ 20828 for(i=0; i<nArg; i++){ 20829 if( i>0 ) fputs(p->colSeparator, p->out); 20830 output_quoted_string(azCol[i]); 20831 } 20832 fputs(p->rowSeparator, p->out); 20833 } 20834 p->cnt++; 20835 for(i=0; i<nArg; i++){ 20836 if( i>0 ) fputs(p->colSeparator, p->out); 20837 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){ 20838 oputz("NULL"); 20839 }else if( aiType && aiType[i]==SQLITE_TEXT ){ 20840 output_quoted_string(azArg[i]); 20841 }else if( aiType && aiType[i]==SQLITE_INTEGER ){ 20842 oputz(azArg[i]); 20843 }else if( aiType && aiType[i]==SQLITE_FLOAT ){ 20844 char z[50]; 20845 double r = sqlite3_column_double(p->pStmt, i); 20846 sqlite3_snprintf(50,z,"%!.20g", r); 20847 oputz(z); 20848 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){ 20849 const void *pBlob = sqlite3_column_blob(p->pStmt, i); 20850 int nBlob = sqlite3_column_bytes(p->pStmt, i); 20851 output_hex_blob(pBlob, nBlob); 20852 }else if( isNumber(azArg[i], 0) ){ 20853 oputz(azArg[i]); 20854 }else{ 20855 output_quoted_string(azArg[i]); 20856 } 20857 } 20858 fputs(p->rowSeparator, p->out); 20859 break; 20860 } 20861 case MODE_Ascii: { 20862 if( p->cnt++==0 && p->showHeader ){ 20863 for(i=0; i<nArg; i++){ 20864 if( i>0 ) oputz(p->colSeparator); 20865 oputz(azCol[i] ? azCol[i] : ""); 20866 } 20867 oputz(p->rowSeparator); 20868 } 20869 if( azArg==0 ) break; 20870 for(i=0; i<nArg; i++){ 20871 if( i>0 ) oputz(p->colSeparator); 20872 oputz(azArg[i] ? azArg[i] : p->nullValue); 20873 } 20874 oputz(p->rowSeparator); 20875 break; 20876 } 20877 case MODE_EQP: { 20878 eqp_append(p, atoi(azArg[0]), atoi(azArg[1]), azArg[3]); 20879 break; 20880 } 20881 } 20882 return 0; 20883 } 20884 20885 /* 20886 ** This is the callback routine that the SQLite library 20887 ** invokes for each row of a query result. 20888 */ 20889 static int callback(void *pArg, int nArg, char **azArg, char **azCol){ 20890 /* since we don't have type info, call the shell_callback with a NULL value */ 20891 return shell_callback(pArg, nArg, azArg, azCol, NULL); 20892 } 20893 20894 /* 20895 ** This is the callback routine from sqlite3_exec() that appends all 20896 ** output onto the end of a ShellText object. 20897 */ 20898 static int captureOutputCallback(void *pArg, int nArg, char **azArg, char **az){ 20899 ShellText *p = (ShellText*)pArg; 20900 int i; 20901 UNUSED_PARAMETER(az); 20902 if( azArg==0 ) return 0; 20903 if( p->n ) appendText(p, "|", 0); 20904 for(i=0; i<nArg; i++){ 20905 if( i ) appendText(p, ",", 0); 20906 if( azArg[i] ) appendText(p, azArg[i], 0); 20907 } 20908 return 0; 20909 } 20910 20911 /* 20912 ** Generate an appropriate SELFTEST table in the main database. 20913 */ 20914 static void createSelftestTable(ShellState *p){ 20915 char *zErrMsg = 0; 20916 sqlite3_exec(p->db, 20917 "SAVEPOINT selftest_init;\n" 20918 "CREATE TABLE IF NOT EXISTS selftest(\n" 20919 " tno INTEGER PRIMARY KEY,\n" /* Test number */ 20920 " op TEXT,\n" /* Operator: memo run */ 20921 " cmd TEXT,\n" /* Command text */ 20922 " ans TEXT\n" /* Desired answer */ 20923 ");" 20924 "CREATE TEMP TABLE [_shell$self](op,cmd,ans);\n" 20925 "INSERT INTO [_shell$self](rowid,op,cmd)\n" 20926 " VALUES(coalesce((SELECT (max(tno)+100)/10 FROM selftest),10),\n" 20927 " 'memo','Tests generated by --init');\n" 20928 "INSERT INTO [_shell$self]\n" 20929 " SELECT 'run',\n" 20930 " 'SELECT hex(sha3_query(''SELECT type,name,tbl_name,sql " 20931 "FROM sqlite_schema ORDER BY 2'',224))',\n" 20932 " hex(sha3_query('SELECT type,name,tbl_name,sql " 20933 "FROM sqlite_schema ORDER BY 2',224));\n" 20934 "INSERT INTO [_shell$self]\n" 20935 " SELECT 'run'," 20936 " 'SELECT hex(sha3_query(''SELECT * FROM \"' ||" 20937 " printf('%w',name) || '\" NOT INDEXED'',224))',\n" 20938 " hex(sha3_query(printf('SELECT * FROM \"%w\" NOT INDEXED',name),224))\n" 20939 " FROM (\n" 20940 " SELECT name FROM sqlite_schema\n" 20941 " WHERE type='table'\n" 20942 " AND name<>'selftest'\n" 20943 " AND coalesce(rootpage,0)>0\n" 20944 " )\n" 20945 " ORDER BY name;\n" 20946 "INSERT INTO [_shell$self]\n" 20947 " VALUES('run','PRAGMA integrity_check','ok');\n" 20948 "INSERT INTO selftest(tno,op,cmd,ans)" 20949 " SELECT rowid*10,op,cmd,ans FROM [_shell$self];\n" 20950 "DROP TABLE [_shell$self];" 20951 ,0,0,&zErrMsg); 20952 if( zErrMsg ){ 20953 eputf("SELFTEST initialization failure: %s\n", zErrMsg); 20954 sqlite3_free(zErrMsg); 20955 } 20956 sqlite3_exec(p->db, "RELEASE selftest_init",0,0,0); 20957 } 20958 20959 20960 /* 20961 ** Set the destination table field of the ShellState structure to 20962 ** the name of the table given. Escape any quote characters in the 20963 ** table name. 20964 */ 20965 static void set_table_name(ShellState *p, const char *zName){ 20966 int i, n; 20967 char cQuote; 20968 char *z; 20969 20970 if( p->zDestTable ){ 20971 free(p->zDestTable); 20972 p->zDestTable = 0; 20973 } 20974 if( zName==0 ) return; 20975 cQuote = quoteChar(zName); 20976 n = strlen30(zName); 20977 if( cQuote ) n += n+2; 20978 z = p->zDestTable = malloc( n+1 ); 20979 shell_check_oom(z); 20980 n = 0; 20981 if( cQuote ) z[n++] = cQuote; 20982 for(i=0; zName[i]; i++){ 20983 z[n++] = zName[i]; 20984 if( zName[i]==cQuote ) z[n++] = cQuote; 20985 } 20986 if( cQuote ) z[n++] = cQuote; 20987 z[n] = 0; 20988 } 20989 20990 /* 20991 ** Maybe construct two lines of text that point out the position of a 20992 ** syntax error. Return a pointer to the text, in memory obtained from 20993 ** sqlite3_malloc(). Or, if the most recent error does not involve a 20994 ** specific token that we can point to, return an empty string. 20995 ** 20996 ** In all cases, the memory returned is obtained from sqlite3_malloc64() 20997 ** and should be released by the caller invoking sqlite3_free(). 20998 */ 20999 static char *shell_error_context(const char *zSql, sqlite3 *db){ 21000 int iOffset; 21001 size_t len; 21002 char *zCode; 21003 char *zMsg; 21004 int i; 21005 if( db==0 21006 || zSql==0 21007 || (iOffset = sqlite3_error_offset(db))<0 21008 || iOffset>=(int)strlen(zSql) 21009 ){ 21010 return sqlite3_mprintf(""); 21011 } 21012 while( iOffset>50 ){ 21013 iOffset--; 21014 zSql++; 21015 while( (zSql[0]&0xc0)==0x80 ){ zSql++; iOffset--; } 21016 } 21017 len = strlen(zSql); 21018 if( len>78 ){ 21019 len = 78; 21020 while( len>0 && (zSql[len]&0xc0)==0x80 ) len--; 21021 } 21022 zCode = sqlite3_mprintf("%.*s", len, zSql); 21023 shell_check_oom(zCode); 21024 for(i=0; zCode[i]; i++){ if( IsSpace(zSql[i]) ) zCode[i] = ' '; } 21025 if( iOffset<25 ){ 21026 zMsg = sqlite3_mprintf("\n %z\n %*s^--- error here", zCode,iOffset,""); 21027 }else{ 21028 zMsg = sqlite3_mprintf("\n %z\n %*serror here ---^", zCode,iOffset-14,""); 21029 } 21030 return zMsg; 21031 } 21032 21033 21034 /* 21035 ** Execute a query statement that will generate SQL output. Print 21036 ** the result columns, comma-separated, on a line and then add a 21037 ** semicolon terminator to the end of that line. 21038 ** 21039 ** If the number of columns is 1 and that column contains text "--" 21040 ** then write the semicolon on a separate line. That way, if a 21041 ** "--" comment occurs at the end of the statement, the comment 21042 ** won't consume the semicolon terminator. 21043 */ 21044 static int run_table_dump_query( 21045 ShellState *p, /* Query context */ 21046 const char *zSelect /* SELECT statement to extract content */ 21047 ){ 21048 sqlite3_stmt *pSelect; 21049 int rc; 21050 int nResult; 21051 int i; 21052 const char *z; 21053 rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0); 21054 if( rc!=SQLITE_OK || !pSelect ){ 21055 char *zContext = shell_error_context(zSelect, p->db); 21056 oputf("/**** ERROR: (%d) %s *****/\n%s", 21057 rc, sqlite3_errmsg(p->db), zContext); 21058 sqlite3_free(zContext); 21059 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++; 21060 return rc; 21061 } 21062 rc = sqlite3_step(pSelect); 21063 nResult = sqlite3_column_count(pSelect); 21064 while( rc==SQLITE_ROW ){ 21065 z = (const char*)sqlite3_column_text(pSelect, 0); 21066 oputf("%s", z); 21067 for(i=1; i<nResult; i++){ 21068 oputf(",%s", sqlite3_column_text(pSelect, i)); 21069 } 21070 if( z==0 ) z = ""; 21071 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++; 21072 if( z[0] ){ 21073 oputz("\n;\n"); 21074 }else{ 21075 oputz(";\n"); 21076 } 21077 rc = sqlite3_step(pSelect); 21078 } 21079 rc = sqlite3_finalize(pSelect); 21080 if( rc!=SQLITE_OK ){ 21081 oputf("/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db)); 21082 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++; 21083 } 21084 return rc; 21085 } 21086 21087 /* 21088 ** Allocate space and save off string indicating current error. 21089 */ 21090 static char *save_err_msg( 21091 sqlite3 *db, /* Database to query */ 21092 const char *zPhase, /* When the error occurs */ 21093 int rc, /* Error code returned from API */ 21094 const char *zSql /* SQL string, or NULL */ 21095 ){ 21096 char *zErr; 21097 char *zContext; 21098 sqlite3_str *pStr = sqlite3_str_new(0); 21099 sqlite3_str_appendf(pStr, "%s, %s", zPhase, sqlite3_errmsg(db)); 21100 if( rc>1 ){ 21101 sqlite3_str_appendf(pStr, " (%d)", rc); 21102 } 21103 zContext = shell_error_context(zSql, db); 21104 if( zContext ){ 21105 sqlite3_str_appendall(pStr, zContext); 21106 sqlite3_free(zContext); 21107 } 21108 zErr = sqlite3_str_finish(pStr); 21109 shell_check_oom(zErr); 21110 return zErr; 21111 } 21112 21113 #ifdef __linux__ 21114 /* 21115 ** Attempt to display I/O stats on Linux using /proc/PID/io 21116 */ 21117 static void displayLinuxIoStats(void){ 21118 FILE *in; 21119 char z[200]; 21120 sqlite3_snprintf(sizeof(z), z, "/proc/%d/io", getpid()); 21121 in = fopen(z, "rb"); 21122 if( in==0 ) return; 21123 while( fgets(z, sizeof(z), in)!=0 ){ 21124 static const struct { 21125 const char *zPattern; 21126 const char *zDesc; 21127 } aTrans[] = { 21128 { "rchar: ", "Bytes received by read():" }, 21129 { "wchar: ", "Bytes sent to write():" }, 21130 { "syscr: ", "Read() system calls:" }, 21131 { "syscw: ", "Write() system calls:" }, 21132 { "read_bytes: ", "Bytes read from storage:" }, 21133 { "write_bytes: ", "Bytes written to storage:" }, 21134 { "cancelled_write_bytes: ", "Cancelled write bytes:" }, 21135 }; 21136 int i; 21137 for(i=0; i<ArraySize(aTrans); i++){ 21138 int n = strlen30(aTrans[i].zPattern); 21139 if( cli_strncmp(aTrans[i].zPattern, z, n)==0 ){ 21140 oputf("%-36s %s", aTrans[i].zDesc, &z[n]); 21141 break; 21142 } 21143 } 21144 } 21145 fclose(in); 21146 } 21147 #endif 21148 21149 /* 21150 ** Display a single line of status using 64-bit values. 21151 */ 21152 static void displayStatLine( 21153 char *zLabel, /* Label for this one line */ 21154 char *zFormat, /* Format for the result */ 21155 int iStatusCtrl, /* Which status to display */ 21156 int bReset /* True to reset the stats */ 21157 ){ 21158 sqlite3_int64 iCur = -1; 21159 sqlite3_int64 iHiwtr = -1; 21160 int i, nPercent; 21161 char zLine[200]; 21162 sqlite3_status64(iStatusCtrl, &iCur, &iHiwtr, bReset); 21163 for(i=0, nPercent=0; zFormat[i]; i++){ 21164 if( zFormat[i]=='%' ) nPercent++; 21165 } 21166 if( nPercent>1 ){ 21167 sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iCur, iHiwtr); 21168 }else{ 21169 sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iHiwtr); 21170 } 21171 oputf("%-36s %s\n", zLabel, zLine); 21172 } 21173 21174 /* 21175 ** Display memory stats. 21176 */ 21177 static int display_stats( 21178 sqlite3 *db, /* Database to query */ 21179 ShellState *pArg, /* Pointer to ShellState */ 21180 int bReset /* True to reset the stats */ 21181 ){ 21182 int iCur; 21183 int iHiwtr; 21184 if( pArg==0 || pArg->out==0 ) return 0; 21185 21186 if( pArg->pStmt && pArg->statsOn==2 ){ 21187 int nCol, i, x; 21188 sqlite3_stmt *pStmt = pArg->pStmt; 21189 char z[100]; 21190 nCol = sqlite3_column_count(pStmt); 21191 oputf("%-36s %d\n", "Number of output columns:", nCol); 21192 for(i=0; i<nCol; i++){ 21193 sqlite3_snprintf(sizeof(z),z,"Column %d %nname:", i, &x); 21194 oputf("%-36s %s\n", z, sqlite3_column_name(pStmt,i)); 21195 #ifndef SQLITE_OMIT_DECLTYPE 21196 sqlite3_snprintf(30, z+x, "declared type:"); 21197 oputf("%-36s %s\n", z, sqlite3_column_decltype(pStmt, i)); 21198 #endif 21199 #ifdef SQLITE_ENABLE_COLUMN_METADATA 21200 sqlite3_snprintf(30, z+x, "database name:"); 21201 oputf("%-36s %s\n", z, sqlite3_column_database_name(pStmt,i)); 21202 sqlite3_snprintf(30, z+x, "table name:"); 21203 oputf("%-36s %s\n", z, sqlite3_column_table_name(pStmt,i)); 21204 sqlite3_snprintf(30, z+x, "origin name:"); 21205 oputf("%-36s %s\n", z, sqlite3_column_origin_name(pStmt,i)); 21206 #endif 21207 } 21208 } 21209 21210 if( pArg->statsOn==3 ){ 21211 if( pArg->pStmt ){ 21212 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP,bReset); 21213 oputf("VM-steps: %d\n", iCur); 21214 } 21215 return 0; 21216 } 21217 21218 displayStatLine("Memory Used:", 21219 "%lld (max %lld) bytes", SQLITE_STATUS_MEMORY_USED, bReset); 21220 displayStatLine("Number of Outstanding Allocations:", 21221 "%lld (max %lld)", SQLITE_STATUS_MALLOC_COUNT, bReset); 21222 if( pArg->shellFlgs & SHFLG_Pagecache ){ 21223 displayStatLine("Number of Pcache Pages Used:", 21224 "%lld (max %lld) pages", SQLITE_STATUS_PAGECACHE_USED, bReset); 21225 } 21226 displayStatLine("Number of Pcache Overflow Bytes:", 21227 "%lld (max %lld) bytes", SQLITE_STATUS_PAGECACHE_OVERFLOW, bReset); 21228 displayStatLine("Largest Allocation:", 21229 "%lld bytes", SQLITE_STATUS_MALLOC_SIZE, bReset); 21230 displayStatLine("Largest Pcache Allocation:", 21231 "%lld bytes", SQLITE_STATUS_PAGECACHE_SIZE, bReset); 21232 #ifdef YYTRACKMAXSTACKDEPTH 21233 displayStatLine("Deepest Parser Stack:", 21234 "%lld (max %lld)", SQLITE_STATUS_PARSER_STACK, bReset); 21235 #endif 21236 21237 if( db ){ 21238 if( pArg->shellFlgs & SHFLG_Lookaside ){ 21239 iHiwtr = iCur = -1; 21240 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED, 21241 &iCur, &iHiwtr, bReset); 21242 oputf("Lookaside Slots Used: %d (max %d)\n", iCur, iHiwtr); 21243 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT, 21244 &iCur, &iHiwtr, bReset); 21245 oputf("Successful lookaside attempts: %d\n", iHiwtr); 21246 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE, 21247 &iCur, &iHiwtr, bReset); 21248 oputf("Lookaside failures due to size: %d\n", iHiwtr); 21249 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL, 21250 &iCur, &iHiwtr, bReset); 21251 oputf("Lookaside failures due to OOM: %d\n", iHiwtr); 21252 } 21253 iHiwtr = iCur = -1; 21254 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset); 21255 oputf("Pager Heap Usage: %d bytes\n", iCur); 21256 iHiwtr = iCur = -1; 21257 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1); 21258 oputf("Page cache hits: %d\n", iCur); 21259 iHiwtr = iCur = -1; 21260 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1); 21261 oputf("Page cache misses: %d\n", iCur); 21262 iHiwtr = iCur = -1; 21263 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1); 21264 oputf("Page cache writes: %d\n", iCur); 21265 iHiwtr = iCur = -1; 21266 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_SPILL, &iCur, &iHiwtr, 1); 21267 oputf("Page cache spills: %d\n", iCur); 21268 iHiwtr = iCur = -1; 21269 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset); 21270 oputf("Schema Heap Usage: %d bytes\n", iCur); 21271 iHiwtr = iCur = -1; 21272 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset); 21273 oputf("Statement Heap/Lookaside Usage: %d bytes\n", iCur); 21274 } 21275 21276 if( pArg->pStmt ){ 21277 int iHit, iMiss; 21278 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP, 21279 bReset); 21280 oputf("Fullscan Steps: %d\n", iCur); 21281 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset); 21282 oputf("Sort Operations: %d\n", iCur); 21283 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset); 21284 oputf("Autoindex Inserts: %d\n", iCur); 21285 iHit = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FILTER_HIT, 21286 bReset); 21287 iMiss = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FILTER_MISS, 21288 bReset); 21289 if( iHit || iMiss ){ 21290 oputf("Bloom filter bypass taken: %d/%d\n", iHit, iHit+iMiss); 21291 } 21292 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset); 21293 oputf("Virtual Machine Steps: %d\n", iCur); 21294 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_REPREPARE,bReset); 21295 oputf("Reprepare operations: %d\n", iCur); 21296 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_RUN, bReset); 21297 oputf("Number of times run: %d\n", iCur); 21298 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_MEMUSED, bReset); 21299 oputf("Memory used by prepared stmt: %d\n", iCur); 21300 } 21301 21302 #ifdef __linux__ 21303 displayLinuxIoStats(); 21304 #endif 21305 21306 /* Do not remove this machine readable comment: extra-stats-output-here */ 21307 21308 return 0; 21309 } 21310 21311 21312 #ifdef SQLITE_ENABLE_STMT_SCANSTATUS 21313 static int scanStatsHeight(sqlite3_stmt *p, int iEntry){ 21314 int iPid = 0; 21315 int ret = 1; 21316 sqlite3_stmt_scanstatus_v2(p, iEntry, 21317 SQLITE_SCANSTAT_SELECTID, SQLITE_SCANSTAT_COMPLEX, (void*)&iPid 21318 ); 21319 while( iPid!=0 ){ 21320 int ii; 21321 for(ii=0; 1; ii++){ 21322 int iId; 21323 int res; 21324 res = sqlite3_stmt_scanstatus_v2(p, ii, 21325 SQLITE_SCANSTAT_SELECTID, SQLITE_SCANSTAT_COMPLEX, (void*)&iId 21326 ); 21327 if( res ) break; 21328 if( iId==iPid ){ 21329 sqlite3_stmt_scanstatus_v2(p, ii, 21330 SQLITE_SCANSTAT_PARENTID, SQLITE_SCANSTAT_COMPLEX, (void*)&iPid 21331 ); 21332 } 21333 } 21334 ret++; 21335 } 21336 return ret; 21337 } 21338 #endif 21339 21340 #ifdef SQLITE_ENABLE_STMT_SCANSTATUS 21341 static void display_explain_scanstats( 21342 sqlite3 *db, /* Database to query */ 21343 ShellState *pArg /* Pointer to ShellState */ 21344 ){ 21345 static const int f = SQLITE_SCANSTAT_COMPLEX; 21346 sqlite3_stmt *p = pArg->pStmt; 21347 int ii = 0; 21348 i64 nTotal = 0; 21349 int nWidth = 0; 21350 eqp_reset(pArg); 21351 21352 for(ii=0; 1; ii++){ 21353 const char *z = 0; 21354 int n = 0; 21355 if( sqlite3_stmt_scanstatus_v2(p,ii,SQLITE_SCANSTAT_EXPLAIN,f,(void*)&z) ){ 21356 break; 21357 } 21358 n = (int)strlen(z) + scanStatsHeight(p, ii)*3; 21359 if( n>nWidth ) nWidth = n; 21360 } 21361 nWidth += 4; 21362 21363 sqlite3_stmt_scanstatus_v2(p, -1, SQLITE_SCANSTAT_NCYCLE, f, (void*)&nTotal); 21364 for(ii=0; 1; ii++){ 21365 i64 nLoop = 0; 21366 i64 nRow = 0; 21367 i64 nCycle = 0; 21368 int iId = 0; 21369 int iPid = 0; 21370 const char *zo = 0; 21371 const char *zName = 0; 21372 char *zText = 0; 21373 double rEst = 0.0; 21374 21375 if( sqlite3_stmt_scanstatus_v2(p,ii,SQLITE_SCANSTAT_EXPLAIN,f,(void*)&zo) ){ 21376 break; 21377 } 21378 sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_EST,f,(void*)&rEst); 21379 sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_NLOOP,f,(void*)&nLoop); 21380 sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_NVISIT,f,(void*)&nRow); 21381 sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_NCYCLE,f,(void*)&nCycle); 21382 sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_SELECTID,f,(void*)&iId); 21383 sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_PARENTID,f,(void*)&iPid); 21384 sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_NAME,f,(void*)&zName); 21385 21386 zText = sqlite3_mprintf("%s", zo); 21387 if( nCycle>=0 || nLoop>=0 || nRow>=0 ){ 21388 char *z = 0; 21389 if( nCycle>=0 && nTotal>0 ){ 21390 z = sqlite3_mprintf("%zcycles=%lld [%d%%]", z, 21391 nCycle, ((nCycle*100)+nTotal/2) / nTotal 21392 ); 21393 } 21394 if( nLoop>=0 ){ 21395 z = sqlite3_mprintf("%z%sloops=%lld", z, z ? " " : "", nLoop); 21396 } 21397 if( nRow>=0 ){ 21398 z = sqlite3_mprintf("%z%srows=%lld", z, z ? " " : "", nRow); 21399 } 21400 21401 if( zName && pArg->scanstatsOn>1 ){ 21402 double rpl = (double)nRow / (double)nLoop; 21403 z = sqlite3_mprintf("%z rpl=%.1f est=%.1f", z, rpl, rEst); 21404 } 21405 21406 zText = sqlite3_mprintf( 21407 "% *z (%z)", -1*(nWidth-scanStatsHeight(p, ii)*3), zText, z 21408 ); 21409 } 21410 21411 eqp_append(pArg, iId, iPid, zText); 21412 sqlite3_free(zText); 21413 } 21414 21415 eqp_render(pArg, nTotal); 21416 } 21417 #endif 21418 21419 21420 /* 21421 ** Parameter azArray points to a zero-terminated array of strings. zStr 21422 ** points to a single nul-terminated string. Return non-zero if zStr 21423 ** is equal, according to strcmp(), to any of the strings in the array. 21424 ** Otherwise, return zero. 21425 */ 21426 static int str_in_array(const char *zStr, const char **azArray){ 21427 int i; 21428 for(i=0; azArray[i]; i++){ 21429 if( 0==cli_strcmp(zStr, azArray[i]) ) return 1; 21430 } 21431 return 0; 21432 } 21433 21434 /* 21435 ** If compiled statement pSql appears to be an EXPLAIN statement, allocate 21436 ** and populate the ShellState.aiIndent[] array with the number of 21437 ** spaces each opcode should be indented before it is output. 21438 ** 21439 ** The indenting rules are: 21440 ** 21441 ** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent 21442 ** all opcodes that occur between the p2 jump destination and the opcode 21443 ** itself by 2 spaces. 21444 ** 21445 ** * Do the previous for "Return" instructions for when P2 is positive. 21446 ** See tag-20220407a in wherecode.c and vdbe.c. 21447 ** 21448 ** * For each "Goto", if the jump destination is earlier in the program 21449 ** and ends on one of: 21450 ** Yield SeekGt SeekLt RowSetRead Rewind 21451 ** or if the P1 parameter is one instead of zero, 21452 ** then indent all opcodes between the earlier instruction 21453 ** and "Goto" by 2 spaces. 21454 */ 21455 static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){ 21456 int *abYield = 0; /* True if op is an OP_Yield */ 21457 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */ 21458 int iOp; /* Index of operation in p->aiIndent[] */ 21459 21460 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext", 21461 "Return", 0 }; 21462 const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead", 21463 "Rewind", 0 }; 21464 const char *azGoto[] = { "Goto", 0 }; 21465 21466 /* The caller guarantees that the leftmost 4 columns of the statement 21467 ** passed to this function are equivalent to the leftmost 4 columns 21468 ** of EXPLAIN statement output. In practice the statement may be 21469 ** an EXPLAIN, or it may be a query on the bytecode() virtual table. */ 21470 assert( sqlite3_column_count(pSql)>=4 ); 21471 assert( 0==sqlite3_stricmp( sqlite3_column_name(pSql, 0), "addr" ) ); 21472 assert( 0==sqlite3_stricmp( sqlite3_column_name(pSql, 1), "opcode" ) ); 21473 assert( 0==sqlite3_stricmp( sqlite3_column_name(pSql, 2), "p1" ) ); 21474 assert( 0==sqlite3_stricmp( sqlite3_column_name(pSql, 3), "p2" ) ); 21475 21476 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){ 21477 int i; 21478 int iAddr = sqlite3_column_int(pSql, 0); 21479 const char *zOp = (const char*)sqlite3_column_text(pSql, 1); 21480 int p1 = sqlite3_column_int(pSql, 2); 21481 int p2 = sqlite3_column_int(pSql, 3); 21482 21483 /* Assuming that p2 is an instruction address, set variable p2op to the 21484 ** index of that instruction in the aiIndent[] array. p2 and p2op may be 21485 ** different if the current instruction is part of a sub-program generated 21486 ** by an SQL trigger or foreign key. */ 21487 int p2op = (p2 + (iOp-iAddr)); 21488 21489 /* Grow the p->aiIndent array as required */ 21490 if( iOp>=nAlloc ){ 21491 nAlloc += 100; 21492 p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int)); 21493 shell_check_oom(p->aiIndent); 21494 abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int)); 21495 shell_check_oom(abYield); 21496 } 21497 21498 abYield[iOp] = str_in_array(zOp, azYield); 21499 p->aiIndent[iOp] = 0; 21500 p->nIndent = iOp+1; 21501 if( str_in_array(zOp, azNext) && p2op>0 ){ 21502 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2; 21503 } 21504 if( str_in_array(zOp, azGoto) && p2op<iOp && (abYield[p2op] || p1) ){ 21505 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2; 21506 } 21507 } 21508 21509 p->iIndent = 0; 21510 sqlite3_free(abYield); 21511 sqlite3_reset(pSql); 21512 } 21513 21514 /* 21515 ** Free the array allocated by explain_data_prepare(). 21516 */ 21517 static void explain_data_delete(ShellState *p){ 21518 sqlite3_free(p->aiIndent); 21519 p->aiIndent = 0; 21520 p->nIndent = 0; 21521 p->iIndent = 0; 21522 } 21523 21524 static void exec_prepared_stmt(ShellState*, sqlite3_stmt*); 21525 21526 /* 21527 ** Display scan stats. 21528 */ 21529 static void display_scanstats( 21530 sqlite3 *db, /* Database to query */ 21531 ShellState *pArg /* Pointer to ShellState */ 21532 ){ 21533 #ifndef SQLITE_ENABLE_STMT_SCANSTATUS 21534 UNUSED_PARAMETER(db); 21535 UNUSED_PARAMETER(pArg); 21536 #else 21537 if( pArg->scanstatsOn==3 ){ 21538 const char *zSql = 21539 " SELECT addr, opcode, p1, p2, p3, p4, p5, comment, nexec," 21540 " round(ncycle*100.0 / (sum(ncycle) OVER ()), 2)||'%' AS cycles" 21541 " FROM bytecode(?)"; 21542 21543 int rc = SQLITE_OK; 21544 sqlite3_stmt *pStmt = 0; 21545 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); 21546 if( rc==SQLITE_OK ){ 21547 sqlite3_stmt *pSave = pArg->pStmt; 21548 pArg->pStmt = pStmt; 21549 sqlite3_bind_pointer(pStmt, 1, pSave, "stmt-pointer", 0); 21550 21551 pArg->cnt = 0; 21552 pArg->cMode = MODE_ScanExp; 21553 explain_data_prepare(pArg, pStmt); 21554 exec_prepared_stmt(pArg, pStmt); 21555 explain_data_delete(pArg); 21556 21557 sqlite3_finalize(pStmt); 21558 pArg->pStmt = pSave; 21559 } 21560 }else{ 21561 display_explain_scanstats(db, pArg); 21562 } 21563 #endif 21564 } 21565 21566 /* 21567 ** Disable and restore .wheretrace and .treetrace/.selecttrace settings. 21568 */ 21569 static unsigned int savedSelectTrace; 21570 static unsigned int savedWhereTrace; 21571 static void disable_debug_trace_modes(void){ 21572 unsigned int zero = 0; 21573 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 0, &savedSelectTrace); 21574 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &zero); 21575 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 2, &savedWhereTrace); 21576 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &zero); 21577 } 21578 static void restore_debug_trace_modes(void){ 21579 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &savedSelectTrace); 21580 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &savedWhereTrace); 21581 } 21582 21583 /* Create the TEMP table used to store parameter bindings */ 21584 static void bind_table_init(ShellState *p){ 21585 int wrSchema = 0; 21586 int defensiveMode = 0; 21587 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, -1, &defensiveMode); 21588 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, 0, 0); 21589 sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, -1, &wrSchema); 21590 sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, 1, 0); 21591 sqlite3_exec(p->db, 21592 "CREATE TABLE IF NOT EXISTS temp.sqlite_parameters(\n" 21593 " key TEXT PRIMARY KEY,\n" 21594 " value\n" 21595 ") WITHOUT ROWID;", 21596 0, 0, 0); 21597 sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, wrSchema, 0); 21598 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, defensiveMode, 0); 21599 } 21600 21601 /* 21602 ** Bind parameters on a prepared statement. 21603 ** 21604 ** Parameter bindings are taken from a TEMP table of the form: 21605 ** 21606 ** CREATE TEMP TABLE sqlite_parameters(key TEXT PRIMARY KEY, value) 21607 ** WITHOUT ROWID; 21608 ** 21609 ** No bindings occur if this table does not exist. The name of the table 21610 ** begins with "sqlite_" so that it will not collide with ordinary application 21611 ** tables. The table must be in the TEMP schema. 21612 */ 21613 static void bind_prepared_stmt(ShellState *pArg, sqlite3_stmt *pStmt){ 21614 int nVar; 21615 int i; 21616 int rc; 21617 sqlite3_stmt *pQ = 0; 21618 21619 nVar = sqlite3_bind_parameter_count(pStmt); 21620 if( nVar==0 ) return; /* Nothing to do */ 21621 if( sqlite3_table_column_metadata(pArg->db, "TEMP", "sqlite_parameters", 21622 "key", 0, 0, 0, 0, 0)!=SQLITE_OK ){ 21623 rc = SQLITE_NOTFOUND; 21624 pQ = 0; 21625 }else{ 21626 rc = sqlite3_prepare_v2(pArg->db, 21627 "SELECT value FROM temp.sqlite_parameters" 21628 " WHERE key=?1", -1, &pQ, 0); 21629 } 21630 for(i=1; i<=nVar; i++){ 21631 char zNum[30]; 21632 const char *zVar = sqlite3_bind_parameter_name(pStmt, i); 21633 if( zVar==0 ){ 21634 sqlite3_snprintf(sizeof(zNum),zNum,"?%d",i); 21635 zVar = zNum; 21636 } 21637 sqlite3_bind_text(pQ, 1, zVar, -1, SQLITE_STATIC); 21638 if( rc==SQLITE_OK && pQ && sqlite3_step(pQ)==SQLITE_ROW ){ 21639 sqlite3_bind_value(pStmt, i, sqlite3_column_value(pQ, 0)); 21640 #ifdef NAN 21641 }else if( sqlite3_strlike("_NAN", zVar, 0)==0 ){ 21642 sqlite3_bind_double(pStmt, i, NAN); 21643 #endif 21644 #ifdef INFINITY 21645 }else if( sqlite3_strlike("_INF", zVar, 0)==0 ){ 21646 sqlite3_bind_double(pStmt, i, INFINITY); 21647 #endif 21648 }else{ 21649 sqlite3_bind_null(pStmt, i); 21650 } 21651 sqlite3_reset(pQ); 21652 } 21653 sqlite3_finalize(pQ); 21654 } 21655 21656 /* 21657 ** UTF8 box-drawing characters. Imagine box lines like this: 21658 ** 21659 ** 1 21660 ** | 21661 ** 4 --+-- 2 21662 ** | 21663 ** 3 21664 ** 21665 ** Each box characters has between 2 and 4 of the lines leading from 21666 ** the center. The characters are here identified by the numbers of 21667 ** their corresponding lines. 21668 */ 21669 #define BOX_24 "\342\224\200" /* U+2500 --- */ 21670 #define BOX_13 "\342\224\202" /* U+2502 | */ 21671 #define BOX_23 "\342\224\214" /* U+250c ,- */ 21672 #define BOX_34 "\342\224\220" /* U+2510 -, */ 21673 #define BOX_12 "\342\224\224" /* U+2514 '- */ 21674 #define BOX_14 "\342\224\230" /* U+2518 -' */ 21675 #define BOX_123 "\342\224\234" /* U+251c |- */ 21676 #define BOX_134 "\342\224\244" /* U+2524 -| */ 21677 #define BOX_234 "\342\224\254" /* U+252c -,- */ 21678 #define BOX_124 "\342\224\264" /* U+2534 -'- */ 21679 #define BOX_1234 "\342\224\274" /* U+253c -|- */ 21680 21681 /* Draw horizontal line N characters long using unicode box 21682 ** characters 21683 */ 21684 static void print_box_line(int N){ 21685 const char zDash[] = 21686 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 21687 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24; 21688 const int nDash = sizeof(zDash) - 1; 21689 N *= 3; 21690 while( N>nDash ){ 21691 oputz(zDash); 21692 N -= nDash; 21693 } 21694 oputf("%.*s", N, zDash); 21695 } 21696 21697 /* 21698 ** Draw a horizontal separator for a MODE_Box table. 21699 */ 21700 static void print_box_row_separator( 21701 ShellState *p, 21702 int nArg, 21703 const char *zSep1, 21704 const char *zSep2, 21705 const char *zSep3 21706 ){ 21707 int i; 21708 if( nArg>0 ){ 21709 oputz(zSep1); 21710 print_box_line(p->actualWidth[0]+2); 21711 for(i=1; i<nArg; i++){ 21712 oputz(zSep2); 21713 print_box_line(p->actualWidth[i]+2); 21714 } 21715 oputz(zSep3); 21716 } 21717 oputz("\n"); 21718 } 21719 21720 /* 21721 ** z[] is a line of text that is to be displayed the .mode box or table or 21722 ** similar tabular formats. z[] might contain control characters such 21723 ** as \n, \t, \f, or \r. 21724 ** 21725 ** Compute characters to display on the first line of z[]. Stop at the 21726 ** first \r, \n, or \f. Expand \t into spaces. Return a copy (obtained 21727 ** from malloc()) of that first line, which caller should free sometime. 21728 ** Write anything to display on the next line into *pzTail. If this is 21729 ** the last line, write a NULL into *pzTail. (*pzTail is not allocated.) 21730 */ 21731 static char *translateForDisplayAndDup( 21732 const unsigned char *z, /* Input text to be transformed */ 21733 const unsigned char **pzTail, /* OUT: Tail of the input for next line */ 21734 int mxWidth, /* Max width. 0 means no limit */ 21735 u8 bWordWrap /* If true, avoid breaking mid-word */ 21736 ){ 21737 int i; /* Input bytes consumed */ 21738 int j; /* Output bytes generated */ 21739 int k; /* Input bytes to be displayed */ 21740 int n; /* Output column number */ 21741 unsigned char *zOut; /* Output text */ 21742 21743 if( z==0 ){ 21744 *pzTail = 0; 21745 return 0; 21746 } 21747 if( mxWidth<0 ) mxWidth = -mxWidth; 21748 if( mxWidth==0 ) mxWidth = 1000000; 21749 i = j = n = 0; 21750 while( n<mxWidth ){ 21751 if( z[i]>=' ' ){ 21752 n++; 21753 do{ i++; j++; }while( (z[i]&0xc0)==0x80 ); 21754 continue; 21755 } 21756 if( z[i]=='\t' ){ 21757 do{ 21758 n++; 21759 j++; 21760 }while( (n&7)!=0 && n<mxWidth ); 21761 i++; 21762 continue; 21763 } 21764 break; 21765 } 21766 if( n>=mxWidth && bWordWrap ){ 21767 /* Perhaps try to back up to a better place to break the line */ 21768 for(k=i; k>i/2; k--){ 21769 if( isspace(z[k-1]) ) break; 21770 } 21771 if( k<=i/2 ){ 21772 for(k=i; k>i/2; k--){ 21773 if( isalnum(z[k-1])!=isalnum(z[k]) && (z[k]&0xc0)!=0x80 ) break; 21774 } 21775 } 21776 if( k<=i/2 ){ 21777 k = i; 21778 }else{ 21779 i = k; 21780 while( z[i]==' ' ) i++; 21781 } 21782 }else{ 21783 k = i; 21784 } 21785 if( n>=mxWidth && z[i]>=' ' ){ 21786 *pzTail = &z[i]; 21787 }else if( z[i]=='\r' && z[i+1]=='\n' ){ 21788 *pzTail = z[i+2] ? &z[i+2] : 0; 21789 }else if( z[i]==0 || z[i+1]==0 ){ 21790 *pzTail = 0; 21791 }else{ 21792 *pzTail = &z[i+1]; 21793 } 21794 zOut = malloc( j+1 ); 21795 shell_check_oom(zOut); 21796 i = j = n = 0; 21797 while( i<k ){ 21798 if( z[i]>=' ' ){ 21799 n++; 21800 do{ zOut[j++] = z[i++]; }while( (z[i]&0xc0)==0x80 ); 21801 continue; 21802 } 21803 if( z[i]=='\t' ){ 21804 do{ 21805 n++; 21806 zOut[j++] = ' '; 21807 }while( (n&7)!=0 && n<mxWidth ); 21808 i++; 21809 continue; 21810 } 21811 break; 21812 } 21813 zOut[j] = 0; 21814 return (char*)zOut; 21815 } 21816 21817 /* Extract the value of the i-th current column for pStmt as an SQL literal 21818 ** value. Memory is obtained from sqlite3_malloc64() and must be freed by 21819 ** the caller. 21820 */ 21821 static char *quoted_column(sqlite3_stmt *pStmt, int i){ 21822 switch( sqlite3_column_type(pStmt, i) ){ 21823 case SQLITE_NULL: { 21824 return sqlite3_mprintf("NULL"); 21825 } 21826 case SQLITE_INTEGER: 21827 case SQLITE_FLOAT: { 21828 return sqlite3_mprintf("%s",sqlite3_column_text(pStmt,i)); 21829 } 21830 case SQLITE_TEXT: { 21831 return sqlite3_mprintf("%Q",sqlite3_column_text(pStmt,i)); 21832 } 21833 case SQLITE_BLOB: { 21834 int j; 21835 sqlite3_str *pStr = sqlite3_str_new(0); 21836 const unsigned char *a = sqlite3_column_blob(pStmt,i); 21837 int n = sqlite3_column_bytes(pStmt,i); 21838 sqlite3_str_append(pStr, "x'", 2); 21839 for(j=0; j<n; j++){ 21840 sqlite3_str_appendf(pStr, "%02x", a[j]); 21841 } 21842 sqlite3_str_append(pStr, "'", 1); 21843 return sqlite3_str_finish(pStr); 21844 } 21845 } 21846 return 0; /* Not reached */ 21847 } 21848 21849 /* 21850 ** Run a prepared statement and output the result in one of the 21851 ** table-oriented formats: MODE_Column, MODE_Markdown, MODE_Table, 21852 ** or MODE_Box. 21853 ** 21854 ** This is different from ordinary exec_prepared_stmt() in that 21855 ** it has to run the entire query and gather the results into memory 21856 ** first, in order to determine column widths, before providing 21857 ** any output. 21858 */ 21859 static void exec_prepared_stmt_columnar( 21860 ShellState *p, /* Pointer to ShellState */ 21861 sqlite3_stmt *pStmt /* Statement to run */ 21862 ){ 21863 sqlite3_int64 nRow = 0; 21864 int nColumn = 0; 21865 char **azData = 0; 21866 sqlite3_int64 nAlloc = 0; 21867 char *abRowDiv = 0; 21868 const unsigned char *uz; 21869 const char *z; 21870 char **azQuoted = 0; 21871 int rc; 21872 sqlite3_int64 i, nData; 21873 int j, nTotal, w, n; 21874 const char *colSep = 0; 21875 const char *rowSep = 0; 21876 const unsigned char **azNextLine = 0; 21877 int bNextLine = 0; 21878 int bMultiLineRowExists = 0; 21879 int bw = p->cmOpts.bWordWrap; 21880 const char *zEmpty = ""; 21881 const char *zShowNull = p->nullValue; 21882 21883 rc = sqlite3_step(pStmt); 21884 if( rc!=SQLITE_ROW ) return; 21885 nColumn = sqlite3_column_count(pStmt); 21886 if( nColumn==0 ) goto columnar_end; 21887 nAlloc = nColumn*4; 21888 if( nAlloc<=0 ) nAlloc = 1; 21889 azData = sqlite3_malloc64( nAlloc*sizeof(char*) ); 21890 shell_check_oom(azData); 21891 azNextLine = sqlite3_malloc64( nColumn*sizeof(char*) ); 21892 shell_check_oom(azNextLine); 21893 memset((void*)azNextLine, 0, nColumn*sizeof(char*) ); 21894 if( p->cmOpts.bQuote ){ 21895 azQuoted = sqlite3_malloc64( nColumn*sizeof(char*) ); 21896 shell_check_oom(azQuoted); 21897 memset(azQuoted, 0, nColumn*sizeof(char*) ); 21898 } 21899 abRowDiv = sqlite3_malloc64( nAlloc/nColumn ); 21900 shell_check_oom(abRowDiv); 21901 if( nColumn>p->nWidth ){ 21902 p->colWidth = realloc(p->colWidth, (nColumn+1)*2*sizeof(int)); 21903 shell_check_oom(p->colWidth); 21904 for(i=p->nWidth; i<nColumn; i++) p->colWidth[i] = 0; 21905 p->nWidth = nColumn; 21906 p->actualWidth = &p->colWidth[nColumn]; 21907 } 21908 memset(p->actualWidth, 0, nColumn*sizeof(int)); 21909 for(i=0; i<nColumn; i++){ 21910 w = p->colWidth[i]; 21911 if( w<0 ) w = -w; 21912 p->actualWidth[i] = w; 21913 } 21914 for(i=0; i<nColumn; i++){ 21915 const unsigned char *zNotUsed; 21916 int wx = p->colWidth[i]; 21917 if( wx==0 ){ 21918 wx = p->cmOpts.iWrap; 21919 } 21920 if( wx<0 ) wx = -wx; 21921 uz = (const unsigned char*)sqlite3_column_name(pStmt,i); 21922 if( uz==0 ) uz = (u8*)""; 21923 azData[i] = translateForDisplayAndDup(uz, &zNotUsed, wx, bw); 21924 } 21925 do{ 21926 int useNextLine = bNextLine; 21927 bNextLine = 0; 21928 if( (nRow+2)*nColumn >= nAlloc ){ 21929 nAlloc *= 2; 21930 azData = sqlite3_realloc64(azData, nAlloc*sizeof(char*)); 21931 shell_check_oom(azData); 21932 abRowDiv = sqlite3_realloc64(abRowDiv, nAlloc/nColumn); 21933 shell_check_oom(abRowDiv); 21934 } 21935 abRowDiv[nRow] = 1; 21936 nRow++; 21937 for(i=0; i<nColumn; i++){ 21938 int wx = p->colWidth[i]; 21939 if( wx==0 ){ 21940 wx = p->cmOpts.iWrap; 21941 } 21942 if( wx<0 ) wx = -wx; 21943 if( useNextLine ){ 21944 uz = azNextLine[i]; 21945 if( uz==0 ) uz = (u8*)zEmpty; 21946 }else if( p->cmOpts.bQuote ){ 21947 sqlite3_free(azQuoted[i]); 21948 azQuoted[i] = quoted_column(pStmt,i); 21949 uz = (const unsigned char*)azQuoted[i]; 21950 }else{ 21951 uz = (const unsigned char*)sqlite3_column_text(pStmt,i); 21952 if( uz==0 ) uz = (u8*)zShowNull; 21953 } 21954 azData[nRow*nColumn + i] 21955 = translateForDisplayAndDup(uz, &azNextLine[i], wx, bw); 21956 if( azNextLine[i] ){ 21957 bNextLine = 1; 21958 abRowDiv[nRow-1] = 0; 21959 bMultiLineRowExists = 1; 21960 } 21961 } 21962 }while( bNextLine || sqlite3_step(pStmt)==SQLITE_ROW ); 21963 nTotal = nColumn*(nRow+1); 21964 for(i=0; i<nTotal; i++){ 21965 z = azData[i]; 21966 if( z==0 ) z = (char*)zEmpty; 21967 n = strlenChar(z); 21968 j = i%nColumn; 21969 if( n>p->actualWidth[j] ) p->actualWidth[j] = n; 21970 } 21971 if( seenInterrupt ) goto columnar_end; 21972 switch( p->cMode ){ 21973 case MODE_Column: { 21974 colSep = " "; 21975 rowSep = "\n"; 21976 if( p->showHeader ){ 21977 for(i=0; i<nColumn; i++){ 21978 w = p->actualWidth[i]; 21979 if( p->colWidth[i]<0 ) w = -w; 21980 utf8_width_print(w, azData[i]); 21981 fputs(i==nColumn-1?"\n":" ", p->out); 21982 } 21983 for(i=0; i<nColumn; i++){ 21984 print_dashes(p->actualWidth[i]); 21985 fputs(i==nColumn-1?"\n":" ", p->out); 21986 } 21987 } 21988 break; 21989 } 21990 case MODE_Table: { 21991 colSep = " | "; 21992 rowSep = " |\n"; 21993 print_row_separator(p, nColumn, "+"); 21994 fputs("| ", p->out); 21995 for(i=0; i<nColumn; i++){ 21996 w = p->actualWidth[i]; 21997 n = strlenChar(azData[i]); 21998 oputf("%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, ""); 21999 oputz(i==nColumn-1?" |\n":" | "); 22000 } 22001 print_row_separator(p, nColumn, "+"); 22002 break; 22003 } 22004 case MODE_Markdown: { 22005 colSep = " | "; 22006 rowSep = " |\n"; 22007 fputs("| ", p->out); 22008 for(i=0; i<nColumn; i++){ 22009 w = p->actualWidth[i]; 22010 n = strlenChar(azData[i]); 22011 oputf("%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, ""); 22012 oputz(i==nColumn-1?" |\n":" | "); 22013 } 22014 print_row_separator(p, nColumn, "|"); 22015 break; 22016 } 22017 case MODE_Box: { 22018 colSep = " " BOX_13 " "; 22019 rowSep = " " BOX_13 "\n"; 22020 print_box_row_separator(p, nColumn, BOX_23, BOX_234, BOX_34); 22021 oputz(BOX_13 " "); 22022 for(i=0; i<nColumn; i++){ 22023 w = p->actualWidth[i]; 22024 n = strlenChar(azData[i]); 22025 oputf("%*s%s%*s%s", 22026 (w-n)/2, "", azData[i], (w-n+1)/2, "", 22027 i==nColumn-1?" "BOX_13"\n":" "BOX_13" "); 22028 } 22029 print_box_row_separator(p, nColumn, BOX_123, BOX_1234, BOX_134); 22030 break; 22031 } 22032 } 22033 for(i=nColumn, j=0; i<nTotal; i++, j++){ 22034 if( j==0 && p->cMode!=MODE_Column ){ 22035 oputz(p->cMode==MODE_Box?BOX_13" ":"| "); 22036 } 22037 z = azData[i]; 22038 if( z==0 ) z = p->nullValue; 22039 w = p->actualWidth[j]; 22040 if( p->colWidth[j]<0 ) w = -w; 22041 utf8_width_print(w, z); 22042 if( j==nColumn-1 ){ 22043 oputz(rowSep); 22044 if( bMultiLineRowExists && abRowDiv[i/nColumn-1] && i+1<nTotal ){ 22045 if( p->cMode==MODE_Table ){ 22046 print_row_separator(p, nColumn, "+"); 22047 }else if( p->cMode==MODE_Box ){ 22048 print_box_row_separator(p, nColumn, BOX_123, BOX_1234, BOX_134); 22049 }else if( p->cMode==MODE_Column ){ 22050 oputz("\n"); 22051 } 22052 } 22053 j = -1; 22054 if( seenInterrupt ) goto columnar_end; 22055 }else{ 22056 oputz(colSep); 22057 } 22058 } 22059 if( p->cMode==MODE_Table ){ 22060 print_row_separator(p, nColumn, "+"); 22061 }else if( p->cMode==MODE_Box ){ 22062 print_box_row_separator(p, nColumn, BOX_12, BOX_124, BOX_14); 22063 } 22064 columnar_end: 22065 if( seenInterrupt ){ 22066 oputz("Interrupt\n"); 22067 } 22068 nData = (nRow+1)*nColumn; 22069 for(i=0; i<nData; i++){ 22070 z = azData[i]; 22071 if( z!=zEmpty && z!=zShowNull ) free(azData[i]); 22072 } 22073 sqlite3_free(azData); 22074 sqlite3_free((void*)azNextLine); 22075 sqlite3_free(abRowDiv); 22076 if( azQuoted ){ 22077 for(i=0; i<nColumn; i++) sqlite3_free(azQuoted[i]); 22078 sqlite3_free(azQuoted); 22079 } 22080 } 22081 22082 /* 22083 ** Run a prepared statement 22084 */ 22085 static void exec_prepared_stmt( 22086 ShellState *pArg, /* Pointer to ShellState */ 22087 sqlite3_stmt *pStmt /* Statement to run */ 22088 ){ 22089 int rc; 22090 sqlite3_uint64 nRow = 0; 22091 22092 if( pArg->cMode==MODE_Column 22093 || pArg->cMode==MODE_Table 22094 || pArg->cMode==MODE_Box 22095 || pArg->cMode==MODE_Markdown 22096 ){ 22097 exec_prepared_stmt_columnar(pArg, pStmt); 22098 return; 22099 } 22100 22101 /* perform the first step. this will tell us if we 22102 ** have a result set or not and how wide it is. 22103 */ 22104 rc = sqlite3_step(pStmt); 22105 /* if we have a result set... */ 22106 if( SQLITE_ROW == rc ){ 22107 /* allocate space for col name ptr, value ptr, and type */ 22108 int nCol = sqlite3_column_count(pStmt); 22109 void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1); 22110 if( !pData ){ 22111 shell_out_of_memory(); 22112 }else{ 22113 char **azCols = (char **)pData; /* Names of result columns */ 22114 char **azVals = &azCols[nCol]; /* Results */ 22115 int *aiTypes = (int *)&azVals[nCol]; /* Result types */ 22116 int i, x; 22117 assert(sizeof(int) <= sizeof(char *)); 22118 /* save off ptrs to column names */ 22119 for(i=0; i<nCol; i++){ 22120 azCols[i] = (char *)sqlite3_column_name(pStmt, i); 22121 } 22122 do{ 22123 nRow++; 22124 /* extract the data and data types */ 22125 for(i=0; i<nCol; i++){ 22126 aiTypes[i] = x = sqlite3_column_type(pStmt, i); 22127 if( x==SQLITE_BLOB 22128 && pArg 22129 && (pArg->cMode==MODE_Insert || pArg->cMode==MODE_Quote) 22130 ){ 22131 azVals[i] = ""; 22132 }else{ 22133 azVals[i] = (char*)sqlite3_column_text(pStmt, i); 22134 } 22135 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){ 22136 rc = SQLITE_NOMEM; 22137 break; /* from for */ 22138 } 22139 } /* end for */ 22140 22141 /* if data and types extracted successfully... */ 22142 if( SQLITE_ROW == rc ){ 22143 /* call the supplied callback with the result row data */ 22144 if( shell_callback(pArg, nCol, azVals, azCols, aiTypes) ){ 22145 rc = SQLITE_ABORT; 22146 }else{ 22147 rc = sqlite3_step(pStmt); 22148 } 22149 } 22150 } while( SQLITE_ROW == rc ); 22151 sqlite3_free(pData); 22152 if( pArg->cMode==MODE_Json ){ 22153 fputs("]\n", pArg->out); 22154 }else if( pArg->cMode==MODE_Count ){ 22155 char zBuf[200]; 22156 sqlite3_snprintf(sizeof(zBuf), zBuf, "%llu row%s\n", 22157 nRow, nRow!=1 ? "s" : ""); 22158 printf("%s", zBuf); 22159 } 22160 } 22161 } 22162 } 22163 22164 #ifndef SQLITE_OMIT_VIRTUALTABLE 22165 /* 22166 ** This function is called to process SQL if the previous shell command 22167 ** was ".expert". It passes the SQL in the second argument directly to 22168 ** the sqlite3expert object. 22169 ** 22170 ** If successful, SQLITE_OK is returned. Otherwise, an SQLite error 22171 ** code. In this case, (*pzErr) may be set to point to a buffer containing 22172 ** an English language error message. It is the responsibility of the 22173 ** caller to eventually free this buffer using sqlite3_free(). 22174 */ 22175 static int expertHandleSQL( 22176 ShellState *pState, 22177 const char *zSql, 22178 char **pzErr 22179 ){ 22180 assert( pState->expert.pExpert ); 22181 assert( pzErr==0 || *pzErr==0 ); 22182 return sqlite3_expert_sql(pState->expert.pExpert, zSql, pzErr); 22183 } 22184 22185 /* 22186 ** This function is called either to silently clean up the object 22187 ** created by the ".expert" command (if bCancel==1), or to generate a 22188 ** report from it and then clean it up (if bCancel==0). 22189 ** 22190 ** If successful, SQLITE_OK is returned. Otherwise, an SQLite error 22191 ** code. In this case, (*pzErr) may be set to point to a buffer containing 22192 ** an English language error message. It is the responsibility of the 22193 ** caller to eventually free this buffer using sqlite3_free(). 22194 */ 22195 static int expertFinish( 22196 ShellState *pState, 22197 int bCancel, 22198 char **pzErr 22199 ){ 22200 int rc = SQLITE_OK; 22201 sqlite3expert *p = pState->expert.pExpert; 22202 assert( p ); 22203 assert( bCancel || pzErr==0 || *pzErr==0 ); 22204 if( bCancel==0 ){ 22205 int bVerbose = pState->expert.bVerbose; 22206 22207 rc = sqlite3_expert_analyze(p, pzErr); 22208 if( rc==SQLITE_OK ){ 22209 int nQuery = sqlite3_expert_count(p); 22210 int i; 22211 22212 if( bVerbose ){ 22213 const char *zCand = sqlite3_expert_report(p,0,EXPERT_REPORT_CANDIDATES); 22214 oputz("-- Candidates -----------------------------\n"); 22215 oputf("%s\n", zCand); 22216 } 22217 for(i=0; i<nQuery; i++){ 22218 const char *zSql = sqlite3_expert_report(p, i, EXPERT_REPORT_SQL); 22219 const char *zIdx = sqlite3_expert_report(p, i, EXPERT_REPORT_INDEXES); 22220 const char *zEQP = sqlite3_expert_report(p, i, EXPERT_REPORT_PLAN); 22221 if( zIdx==0 ) zIdx = "(no new indexes)\n"; 22222 if( bVerbose ){ 22223 oputf("-- Query %d --------------------------------\n",i+1); 22224 oputf("%s\n\n", zSql); 22225 } 22226 oputf("%s\n", zIdx); 22227 oputf("%s\n", zEQP); 22228 } 22229 } 22230 } 22231 sqlite3_expert_destroy(p); 22232 pState->expert.pExpert = 0; 22233 return rc; 22234 } 22235 22236 /* 22237 ** Implementation of ".expert" dot command. 22238 */ 22239 static int expertDotCommand( 22240 ShellState *pState, /* Current shell tool state */ 22241 char **azArg, /* Array of arguments passed to dot command */ 22242 int nArg /* Number of entries in azArg[] */ 22243 ){ 22244 int rc = SQLITE_OK; 22245 char *zErr = 0; 22246 int i; 22247 int iSample = 0; 22248 22249 assert( pState->expert.pExpert==0 ); 22250 memset(&pState->expert, 0, sizeof(ExpertInfo)); 22251 22252 for(i=1; rc==SQLITE_OK && i<nArg; i++){ 22253 char *z = azArg[i]; 22254 int n; 22255 if( z[0]=='-' && z[1]=='-' ) z++; 22256 n = strlen30(z); 22257 if( n>=2 && 0==cli_strncmp(z, "-verbose", n) ){ 22258 pState->expert.bVerbose = 1; 22259 } 22260 else if( n>=2 && 0==cli_strncmp(z, "-sample", n) ){ 22261 if( i==(nArg-1) ){ 22262 eputf("option requires an argument: %s\n", z); 22263 rc = SQLITE_ERROR; 22264 }else{ 22265 iSample = (int)integerValue(azArg[++i]); 22266 if( iSample<0 || iSample>100 ){ 22267 eputf("value out of range: %s\n", azArg[i]); 22268 rc = SQLITE_ERROR; 22269 } 22270 } 22271 } 22272 else{ 22273 eputf("unknown option: %s\n", z); 22274 rc = SQLITE_ERROR; 22275 } 22276 } 22277 22278 if( rc==SQLITE_OK ){ 22279 pState->expert.pExpert = sqlite3_expert_new(pState->db, &zErr); 22280 if( pState->expert.pExpert==0 ){ 22281 eputf("sqlite3_expert_new: %s\n", zErr ? zErr : "out of memory"); 22282 rc = SQLITE_ERROR; 22283 }else{ 22284 sqlite3_expert_config( 22285 pState->expert.pExpert, EXPERT_CONFIG_SAMPLE, iSample 22286 ); 22287 } 22288 } 22289 sqlite3_free(zErr); 22290 22291 return rc; 22292 } 22293 #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */ 22294 22295 /* 22296 ** Execute a statement or set of statements. Print 22297 ** any result rows/columns depending on the current mode 22298 ** set via the supplied callback. 22299 ** 22300 ** This is very similar to SQLite's built-in sqlite3_exec() 22301 ** function except it takes a slightly different callback 22302 ** and callback data argument. 22303 */ 22304 static int shell_exec( 22305 ShellState *pArg, /* Pointer to ShellState */ 22306 const char *zSql, /* SQL to be evaluated */ 22307 char **pzErrMsg /* Error msg written here */ 22308 ){ 22309 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */ 22310 int rc = SQLITE_OK; /* Return Code */ 22311 int rc2; 22312 const char *zLeftover; /* Tail of unprocessed SQL */ 22313 sqlite3 *db = pArg->db; 22314 22315 if( pzErrMsg ){ 22316 *pzErrMsg = NULL; 22317 } 22318 22319 #ifndef SQLITE_OMIT_VIRTUALTABLE 22320 if( pArg->expert.pExpert ){ 22321 rc = expertHandleSQL(pArg, zSql, pzErrMsg); 22322 return expertFinish(pArg, (rc!=SQLITE_OK), pzErrMsg); 22323 } 22324 #endif 22325 22326 while( zSql[0] && (SQLITE_OK == rc) ){ 22327 static const char *zStmtSql; 22328 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover); 22329 if( SQLITE_OK != rc ){ 22330 if( pzErrMsg ){ 22331 *pzErrMsg = save_err_msg(db, "in prepare", rc, zSql); 22332 } 22333 }else{ 22334 if( !pStmt ){ 22335 /* this happens for a comment or white-space */ 22336 zSql = zLeftover; 22337 while( IsSpace(zSql[0]) ) zSql++; 22338 continue; 22339 } 22340 zStmtSql = sqlite3_sql(pStmt); 22341 if( zStmtSql==0 ) zStmtSql = ""; 22342 while( IsSpace(zStmtSql[0]) ) zStmtSql++; 22343 22344 /* save off the prepared statement handle and reset row count */ 22345 if( pArg ){ 22346 pArg->pStmt = pStmt; 22347 pArg->cnt = 0; 22348 } 22349 22350 /* Show the EXPLAIN QUERY PLAN if .eqp is on */ 22351 if( pArg && pArg->autoEQP && sqlite3_stmt_isexplain(pStmt)==0 ){ 22352 sqlite3_stmt *pExplain; 22353 int triggerEQP = 0; 22354 disable_debug_trace_modes(); 22355 sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, -1, &triggerEQP); 22356 if( pArg->autoEQP>=AUTOEQP_trigger ){ 22357 sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 1, 0); 22358 } 22359 pExplain = pStmt; 22360 sqlite3_reset(pExplain); 22361 rc = sqlite3_stmt_explain(pExplain, 2); 22362 if( rc==SQLITE_OK ){ 22363 while( sqlite3_step(pExplain)==SQLITE_ROW ){ 22364 const char *zEQPLine = (const char*)sqlite3_column_text(pExplain,3); 22365 int iEqpId = sqlite3_column_int(pExplain, 0); 22366 int iParentId = sqlite3_column_int(pExplain, 1); 22367 if( zEQPLine==0 ) zEQPLine = ""; 22368 if( zEQPLine[0]=='-' ) eqp_render(pArg, 0); 22369 eqp_append(pArg, iEqpId, iParentId, zEQPLine); 22370 } 22371 eqp_render(pArg, 0); 22372 } 22373 if( pArg->autoEQP>=AUTOEQP_full ){ 22374 /* Also do an EXPLAIN for ".eqp full" mode */ 22375 sqlite3_reset(pExplain); 22376 rc = sqlite3_stmt_explain(pExplain, 1); 22377 if( rc==SQLITE_OK ){ 22378 pArg->cMode = MODE_Explain; 22379 assert( sqlite3_stmt_isexplain(pExplain)==1 ); 22380 explain_data_prepare(pArg, pExplain); 22381 exec_prepared_stmt(pArg, pExplain); 22382 explain_data_delete(pArg); 22383 } 22384 } 22385 if( pArg->autoEQP>=AUTOEQP_trigger && triggerEQP==0 ){ 22386 sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 0, 0); 22387 } 22388 sqlite3_reset(pStmt); 22389 sqlite3_stmt_explain(pStmt, 0); 22390 restore_debug_trace_modes(); 22391 } 22392 22393 if( pArg ){ 22394 int bIsExplain = (sqlite3_stmt_isexplain(pStmt)==1); 22395 pArg->cMode = pArg->mode; 22396 if( pArg->autoExplain ){ 22397 if( bIsExplain ){ 22398 pArg->cMode = MODE_Explain; 22399 } 22400 if( sqlite3_stmt_isexplain(pStmt)==2 ){ 22401 pArg->cMode = MODE_EQP; 22402 } 22403 } 22404 22405 /* If the shell is currently in ".explain" mode, gather the extra 22406 ** data required to add indents to the output.*/ 22407 if( pArg->cMode==MODE_Explain && bIsExplain ){ 22408 explain_data_prepare(pArg, pStmt); 22409 } 22410 } 22411 22412 bind_prepared_stmt(pArg, pStmt); 22413 exec_prepared_stmt(pArg, pStmt); 22414 explain_data_delete(pArg); 22415 eqp_render(pArg, 0); 22416 22417 /* print usage stats if stats on */ 22418 if( pArg && pArg->statsOn ){ 22419 display_stats(db, pArg, 0); 22420 } 22421 22422 /* print loop-counters if required */ 22423 if( pArg && pArg->scanstatsOn ){ 22424 display_scanstats(db, pArg); 22425 } 22426 22427 /* Finalize the statement just executed. If this fails, save a 22428 ** copy of the error message. Otherwise, set zSql to point to the 22429 ** next statement to execute. */ 22430 rc2 = sqlite3_finalize(pStmt); 22431 if( rc!=SQLITE_NOMEM ) rc = rc2; 22432 if( rc==SQLITE_OK ){ 22433 zSql = zLeftover; 22434 while( IsSpace(zSql[0]) ) zSql++; 22435 }else if( pzErrMsg ){ 22436 *pzErrMsg = save_err_msg(db, "stepping", rc, 0); 22437 } 22438 22439 /* clear saved stmt handle */ 22440 if( pArg ){ 22441 pArg->pStmt = NULL; 22442 } 22443 } 22444 } /* end while */ 22445 22446 return rc; 22447 } 22448 22449 /* 22450 ** Release memory previously allocated by tableColumnList(). 22451 */ 22452 static void freeColumnList(char **azCol){ 22453 int i; 22454 for(i=1; azCol[i]; i++){ 22455 sqlite3_free(azCol[i]); 22456 } 22457 /* azCol[0] is a static string */ 22458 sqlite3_free(azCol); 22459 } 22460 22461 /* 22462 ** Return a list of pointers to strings which are the names of all 22463 ** columns in table zTab. The memory to hold the names is dynamically 22464 ** allocated and must be released by the caller using a subsequent call 22465 ** to freeColumnList(). 22466 ** 22467 ** The azCol[0] entry is usually NULL. However, if zTab contains a rowid 22468 ** value that needs to be preserved, then azCol[0] is filled in with the 22469 ** name of the rowid column. 22470 ** 22471 ** The first regular column in the table is azCol[1]. The list is terminated 22472 ** by an entry with azCol[i]==0. 22473 */ 22474 static char **tableColumnList(ShellState *p, const char *zTab){ 22475 char **azCol = 0; 22476 sqlite3_stmt *pStmt; 22477 char *zSql; 22478 int nCol = 0; 22479 int nAlloc = 0; 22480 int nPK = 0; /* Number of PRIMARY KEY columns seen */ 22481 int isIPK = 0; /* True if one PRIMARY KEY column of type INTEGER */ 22482 int preserveRowid = ShellHasFlag(p, SHFLG_PreserveRowid); 22483 int rc; 22484 22485 zSql = sqlite3_mprintf("PRAGMA table_info=%Q", zTab); 22486 shell_check_oom(zSql); 22487 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 22488 sqlite3_free(zSql); 22489 if( rc ) return 0; 22490 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 22491 if( nCol>=nAlloc-2 ){ 22492 nAlloc = nAlloc*2 + nCol + 10; 22493 azCol = sqlite3_realloc(azCol, nAlloc*sizeof(azCol[0])); 22494 shell_check_oom(azCol); 22495 } 22496 azCol[++nCol] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 1)); 22497 shell_check_oom(azCol[nCol]); 22498 if( sqlite3_column_int(pStmt, 5) ){ 22499 nPK++; 22500 if( nPK==1 22501 && sqlite3_stricmp((const char*)sqlite3_column_text(pStmt,2), 22502 "INTEGER")==0 22503 ){ 22504 isIPK = 1; 22505 }else{ 22506 isIPK = 0; 22507 } 22508 } 22509 } 22510 sqlite3_finalize(pStmt); 22511 if( azCol==0 ) return 0; 22512 azCol[0] = 0; 22513 azCol[nCol+1] = 0; 22514 22515 /* The decision of whether or not a rowid really needs to be preserved 22516 ** is tricky. We never need to preserve a rowid for a WITHOUT ROWID table 22517 ** or a table with an INTEGER PRIMARY KEY. We are unable to preserve 22518 ** rowids on tables where the rowid is inaccessible because there are other 22519 ** columns in the table named "rowid", "_rowid_", and "oid". 22520 */ 22521 if( preserveRowid && isIPK ){ 22522 /* If a single PRIMARY KEY column with type INTEGER was seen, then it 22523 ** might be an alias for the ROWID. But it might also be a WITHOUT ROWID 22524 ** table or a INTEGER PRIMARY KEY DESC column, neither of which are 22525 ** ROWID aliases. To distinguish these cases, check to see if 22526 ** there is a "pk" entry in "PRAGMA index_list". There will be 22527 ** no "pk" index if the PRIMARY KEY really is an alias for the ROWID. 22528 */ 22529 zSql = sqlite3_mprintf("SELECT 1 FROM pragma_index_list(%Q)" 22530 " WHERE origin='pk'", zTab); 22531 shell_check_oom(zSql); 22532 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 22533 sqlite3_free(zSql); 22534 if( rc ){ 22535 freeColumnList(azCol); 22536 return 0; 22537 } 22538 rc = sqlite3_step(pStmt); 22539 sqlite3_finalize(pStmt); 22540 preserveRowid = rc==SQLITE_ROW; 22541 } 22542 if( preserveRowid ){ 22543 /* Only preserve the rowid if we can find a name to use for the 22544 ** rowid */ 22545 static char *azRowid[] = { "rowid", "_rowid_", "oid" }; 22546 int i, j; 22547 for(j=0; j<3; j++){ 22548 for(i=1; i<=nCol; i++){ 22549 if( sqlite3_stricmp(azRowid[j],azCol[i])==0 ) break; 22550 } 22551 if( i>nCol ){ 22552 /* At this point, we know that azRowid[j] is not the name of any 22553 ** ordinary column in the table. Verify that azRowid[j] is a valid 22554 ** name for the rowid before adding it to azCol[0]. WITHOUT ROWID 22555 ** tables will fail this last check */ 22556 rc = sqlite3_table_column_metadata(p->db,0,zTab,azRowid[j],0,0,0,0,0); 22557 if( rc==SQLITE_OK ) azCol[0] = azRowid[j]; 22558 break; 22559 } 22560 } 22561 } 22562 return azCol; 22563 } 22564 22565 /* 22566 ** Toggle the reverse_unordered_selects setting. 22567 */ 22568 static void toggleSelectOrder(sqlite3 *db){ 22569 sqlite3_stmt *pStmt = 0; 22570 int iSetting = 0; 22571 char zStmt[100]; 22572 sqlite3_prepare_v2(db, "PRAGMA reverse_unordered_selects", -1, &pStmt, 0); 22573 if( sqlite3_step(pStmt)==SQLITE_ROW ){ 22574 iSetting = sqlite3_column_int(pStmt, 0); 22575 } 22576 sqlite3_finalize(pStmt); 22577 sqlite3_snprintf(sizeof(zStmt), zStmt, 22578 "PRAGMA reverse_unordered_selects(%d)", !iSetting); 22579 sqlite3_exec(db, zStmt, 0, 0, 0); 22580 } 22581 22582 /* 22583 ** This is a different callback routine used for dumping the database. 22584 ** Each row received by this callback consists of a table name, 22585 ** the table type ("index" or "table") and SQL to create the table. 22586 ** This routine should print text sufficient to recreate the table. 22587 */ 22588 static int dump_callback(void *pArg, int nArg, char **azArg, char **azNotUsed){ 22589 int rc; 22590 const char *zTable; 22591 const char *zType; 22592 const char *zSql; 22593 ShellState *p = (ShellState *)pArg; 22594 int dataOnly; 22595 int noSys; 22596 22597 UNUSED_PARAMETER(azNotUsed); 22598 if( nArg!=3 || azArg==0 ) return 0; 22599 zTable = azArg[0]; 22600 zType = azArg[1]; 22601 zSql = azArg[2]; 22602 if( zTable==0 ) return 0; 22603 if( zType==0 ) return 0; 22604 dataOnly = (p->shellFlgs & SHFLG_DumpDataOnly)!=0; 22605 noSys = (p->shellFlgs & SHFLG_DumpNoSys)!=0; 22606 22607 if( cli_strcmp(zTable, "sqlite_sequence")==0 && !noSys ){ 22608 if( !dataOnly ) oputz("DELETE FROM sqlite_sequence;\n"); 22609 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 && !noSys ){ 22610 if( !dataOnly ) oputz("ANALYZE sqlite_schema;\n"); 22611 }else if( cli_strncmp(zTable, "sqlite_", 7)==0 ){ 22612 return 0; 22613 }else if( dataOnly ){ 22614 /* no-op */ 22615 }else if( cli_strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){ 22616 char *zIns; 22617 if( !p->writableSchema ){ 22618 oputz("PRAGMA writable_schema=ON;\n"); 22619 p->writableSchema = 1; 22620 } 22621 zIns = sqlite3_mprintf( 22622 "INSERT INTO sqlite_schema(type,name,tbl_name,rootpage,sql)" 22623 "VALUES('table','%q','%q',0,'%q');", 22624 zTable, zTable, zSql); 22625 shell_check_oom(zIns); 22626 oputf("%s\n", zIns); 22627 sqlite3_free(zIns); 22628 return 0; 22629 }else{ 22630 printSchemaLine(zSql, ";\n"); 22631 } 22632 22633 if( cli_strcmp(zType, "table")==0 ){ 22634 ShellText sSelect; 22635 ShellText sTable; 22636 char **azCol; 22637 int i; 22638 char *savedDestTable; 22639 int savedMode; 22640 22641 azCol = tableColumnList(p, zTable); 22642 if( azCol==0 ){ 22643 p->nErr++; 22644 return 0; 22645 } 22646 22647 /* Always quote the table name, even if it appears to be pure ascii, 22648 ** in case it is a keyword. Ex: INSERT INTO "table" ... */ 22649 initText(&sTable); 22650 appendText(&sTable, zTable, quoteChar(zTable)); 22651 /* If preserving the rowid, add a column list after the table name. 22652 ** In other words: "INSERT INTO tab(rowid,a,b,c,...) VALUES(...)" 22653 ** instead of the usual "INSERT INTO tab VALUES(...)". 22654 */ 22655 if( azCol[0] ){ 22656 appendText(&sTable, "(", 0); 22657 appendText(&sTable, azCol[0], 0); 22658 for(i=1; azCol[i]; i++){ 22659 appendText(&sTable, ",", 0); 22660 appendText(&sTable, azCol[i], quoteChar(azCol[i])); 22661 } 22662 appendText(&sTable, ")", 0); 22663 } 22664 22665 /* Build an appropriate SELECT statement */ 22666 initText(&sSelect); 22667 appendText(&sSelect, "SELECT ", 0); 22668 if( azCol[0] ){ 22669 appendText(&sSelect, azCol[0], 0); 22670 appendText(&sSelect, ",", 0); 22671 } 22672 for(i=1; azCol[i]; i++){ 22673 appendText(&sSelect, azCol[i], quoteChar(azCol[i])); 22674 if( azCol[i+1] ){ 22675 appendText(&sSelect, ",", 0); 22676 } 22677 } 22678 freeColumnList(azCol); 22679 appendText(&sSelect, " FROM ", 0); 22680 appendText(&sSelect, zTable, quoteChar(zTable)); 22681 22682 savedDestTable = p->zDestTable; 22683 savedMode = p->mode; 22684 p->zDestTable = sTable.z; 22685 p->mode = p->cMode = MODE_Insert; 22686 rc = shell_exec(p, sSelect.z, 0); 22687 if( (rc&0xff)==SQLITE_CORRUPT ){ 22688 oputz("/****** CORRUPTION ERROR *******/\n"); 22689 toggleSelectOrder(p->db); 22690 shell_exec(p, sSelect.z, 0); 22691 toggleSelectOrder(p->db); 22692 } 22693 p->zDestTable = savedDestTable; 22694 p->mode = savedMode; 22695 freeText(&sTable); 22696 freeText(&sSelect); 22697 if( rc ) p->nErr++; 22698 } 22699 return 0; 22700 } 22701 22702 /* 22703 ** Run zQuery. Use dump_callback() as the callback routine so that 22704 ** the contents of the query are output as SQL statements. 22705 ** 22706 ** If we get a SQLITE_CORRUPT error, rerun the query after appending 22707 ** "ORDER BY rowid DESC" to the end. 22708 */ 22709 static int run_schema_dump_query( 22710 ShellState *p, 22711 const char *zQuery 22712 ){ 22713 int rc; 22714 char *zErr = 0; 22715 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr); 22716 if( rc==SQLITE_CORRUPT ){ 22717 char *zQ2; 22718 int len = strlen30(zQuery); 22719 oputz("/****** CORRUPTION ERROR *******/\n"); 22720 if( zErr ){ 22721 oputf("/****** %s ******/\n", zErr); 22722 sqlite3_free(zErr); 22723 zErr = 0; 22724 } 22725 zQ2 = malloc( len+100 ); 22726 if( zQ2==0 ) return rc; 22727 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery); 22728 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr); 22729 if( rc ){ 22730 oputf("/****** ERROR: %s ******/\n", zErr); 22731 }else{ 22732 rc = SQLITE_CORRUPT; 22733 } 22734 sqlite3_free(zErr); 22735 free(zQ2); 22736 } 22737 return rc; 22738 } 22739 22740 /* 22741 ** Text of help messages. 22742 ** 22743 ** The help text for each individual command begins with a line that starts 22744 ** with ".". Subsequent lines are supplemental information. 22745 ** 22746 ** There must be two or more spaces between the end of the command and the 22747 ** start of the description of what that command does. 22748 */ 22749 static const char *(azHelp[]) = { 22750 #if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE) \ 22751 && !defined(SQLITE_SHELL_FIDDLE) 22752 ".archive ... Manage SQL archives", 22753 " Each command must have exactly one of the following options:", 22754 " -c, --create Create a new archive", 22755 " -u, --update Add or update files with changed mtime", 22756 " -i, --insert Like -u but always add even if unchanged", 22757 " -r, --remove Remove files from archive", 22758 " -t, --list List contents of archive", 22759 " -x, --extract Extract files from archive", 22760 " Optional arguments:", 22761 " -v, --verbose Print each filename as it is processed", 22762 " -f FILE, --file FILE Use archive FILE (default is current db)", 22763 " -a FILE, --append FILE Open FILE using the apndvfs VFS", 22764 " -C DIR, --directory DIR Read/extract files from directory DIR", 22765 " -g, --glob Use glob matching for names in archive", 22766 " -n, --dryrun Show the SQL that would have occurred", 22767 " Examples:", 22768 " .ar -cf ARCHIVE foo bar # Create ARCHIVE from files foo and bar", 22769 " .ar -tf ARCHIVE # List members of ARCHIVE", 22770 " .ar -xvf ARCHIVE # Verbosely extract files from ARCHIVE", 22771 " See also:", 22772 " http://sqlite.org/cli.html#sqlite_archive_support", 22773 #endif 22774 #ifndef SQLITE_OMIT_AUTHORIZATION 22775 ".auth ON|OFF Show authorizer callbacks", 22776 #endif 22777 #ifndef SQLITE_SHELL_FIDDLE 22778 ".backup ?DB? FILE Backup DB (default \"main\") to FILE", 22779 " Options:", 22780 " --append Use the appendvfs", 22781 " --async Write to FILE without journal and fsync()", 22782 #endif 22783 ".bail on|off Stop after hitting an error. Default OFF", 22784 #ifndef SQLITE_SHELL_FIDDLE 22785 ".cd DIRECTORY Change the working directory to DIRECTORY", 22786 #endif 22787 ".changes on|off Show number of rows changed by SQL", 22788 #ifndef SQLITE_SHELL_FIDDLE 22789 ".check GLOB Fail if output since .testcase does not match", 22790 ".clone NEWDB Clone data into NEWDB from the existing database", 22791 #endif 22792 ".connection [close] [#] Open or close an auxiliary database connection", 22793 #if defined(_WIN32) || defined(WIN32) 22794 ".crnl on|off Translate \\n to \\r\\n. Default ON", 22795 #endif 22796 ".databases List names and files of attached databases", 22797 ".dbconfig ?op? ?val? List or change sqlite3_db_config() options", 22798 #if SQLITE_SHELL_HAVE_RECOVER 22799 ".dbinfo ?DB? Show status information about the database", 22800 #endif 22801 ".dump ?OBJECTS? Render database content as SQL", 22802 " Options:", 22803 " --data-only Output only INSERT statements", 22804 " --newlines Allow unescaped newline characters in output", 22805 " --nosys Omit system tables (ex: \"sqlite_stat1\")", 22806 " --preserve-rowids Include ROWID values in the output", 22807 " OBJECTS is a LIKE pattern for tables, indexes, triggers or views to dump", 22808 " Additional LIKE patterns can be given in subsequent arguments", 22809 ".echo on|off Turn command echo on or off", 22810 ".eqp on|off|full|... Enable or disable automatic EXPLAIN QUERY PLAN", 22811 " Other Modes:", 22812 #ifdef SQLITE_DEBUG 22813 " test Show raw EXPLAIN QUERY PLAN output", 22814 " trace Like \"full\" but enable \"PRAGMA vdbe_trace\"", 22815 #endif 22816 " trigger Like \"full\" but also show trigger bytecode", 22817 #ifndef SQLITE_SHELL_FIDDLE 22818 ".excel Display the output of next command in spreadsheet", 22819 " --bom Put a UTF8 byte-order mark on intermediate file", 22820 #endif 22821 #ifndef SQLITE_SHELL_FIDDLE 22822 ".exit ?CODE? Exit this program with return-code CODE", 22823 #endif 22824 ".expert EXPERIMENTAL. Suggest indexes for queries", 22825 ".explain ?on|off|auto? Change the EXPLAIN formatting mode. Default: auto", 22826 ".filectrl CMD ... Run various sqlite3_file_control() operations", 22827 " --schema SCHEMA Use SCHEMA instead of \"main\"", 22828 " --help Show CMD details", 22829 ".fullschema ?--indent? Show schema and the content of sqlite_stat tables", 22830 ".headers on|off Turn display of headers on or off", 22831 ".help ?-all? ?PATTERN? Show help text for PATTERN", 22832 #ifndef SQLITE_SHELL_FIDDLE 22833 ".import FILE TABLE Import data from FILE into TABLE", 22834 " Options:", 22835 " --ascii Use \\037 and \\036 as column and row separators", 22836 " --csv Use , and \\n as column and row separators", 22837 " --skip N Skip the first N rows of input", 22838 " --schema S Target table to be S.TABLE", 22839 " -v \"Verbose\" - increase auxiliary output", 22840 " Notes:", 22841 " * If TABLE does not exist, it is created. The first row of input", 22842 " determines the column names.", 22843 " * If neither --csv or --ascii are used, the input mode is derived", 22844 " from the \".mode\" output mode", 22845 " * If FILE begins with \"|\" then it is a command that generates the", 22846 " input text.", 22847 #endif 22848 #ifndef SQLITE_OMIT_TEST_CONTROL 22849 ",imposter INDEX TABLE Create imposter table TABLE on index INDEX", 22850 #endif 22851 ".indexes ?TABLE? Show names of indexes", 22852 " If TABLE is specified, only show indexes for", 22853 " tables matching TABLE using the LIKE operator.", 22854 ".intck ?STEPS_PER_UNLOCK? Run an incremental integrity check on the db", 22855 #ifdef SQLITE_ENABLE_IOTRACE 22856 ",iotrace FILE Enable I/O diagnostic logging to FILE", 22857 #endif 22858 ".limit ?LIMIT? ?VAL? Display or change the value of an SQLITE_LIMIT", 22859 ".lint OPTIONS Report potential schema issues.", 22860 " Options:", 22861 " fkey-indexes Find missing foreign key indexes", 22862 #if !defined(SQLITE_OMIT_LOAD_EXTENSION) && !defined(SQLITE_SHELL_FIDDLE) 22863 ".load FILE ?ENTRY? Load an extension library", 22864 #endif 22865 #if !defined(SQLITE_SHELL_FIDDLE) 22866 ".log FILE|on|off Turn logging on or off. FILE can be stderr/stdout", 22867 #else 22868 ".log on|off Turn logging on or off.", 22869 #endif 22870 ".mode MODE ?OPTIONS? Set output mode", 22871 " MODE is one of:", 22872 " ascii Columns/rows delimited by 0x1F and 0x1E", 22873 " box Tables using unicode box-drawing characters", 22874 " csv Comma-separated values", 22875 " column Output in columns. (See .width)", 22876 " html HTML <table> code", 22877 " insert SQL insert statements for TABLE", 22878 " json Results in a JSON array", 22879 " line One value per line", 22880 " list Values delimited by \"|\"", 22881 " markdown Markdown table format", 22882 " qbox Shorthand for \"box --wrap 60 --quote\"", 22883 " quote Escape answers as for SQL", 22884 " table ASCII-art table", 22885 " tabs Tab-separated values", 22886 " tcl TCL list elements", 22887 " OPTIONS: (for columnar modes or insert mode):", 22888 " --wrap N Wrap output lines to no longer than N characters", 22889 " --wordwrap B Wrap or not at word boundaries per B (on/off)", 22890 " --ww Shorthand for \"--wordwrap 1\"", 22891 " --quote Quote output text as SQL literals", 22892 " --noquote Do not quote output text", 22893 " TABLE The name of SQL table used for \"insert\" mode", 22894 #ifndef SQLITE_SHELL_FIDDLE 22895 ".nonce STRING Suspend safe mode for one command if nonce matches", 22896 #endif 22897 ".nullvalue STRING Use STRING in place of NULL values", 22898 #ifndef SQLITE_SHELL_FIDDLE 22899 ".once ?OPTIONS? ?FILE? Output for the next SQL command only to FILE", 22900 " If FILE begins with '|' then open as a pipe", 22901 " --bom Put a UTF8 byte-order mark at the beginning", 22902 " -e Send output to the system text editor", 22903 " -x Send output as CSV to a spreadsheet (same as \".excel\")", 22904 /* Note that .open is (partially) available in WASM builds but is 22905 ** currently only intended to be used by the fiddle tool, not 22906 ** end users, so is "undocumented." */ 22907 ".open ?OPTIONS? ?FILE? Close existing database and reopen FILE", 22908 " Options:", 22909 " --append Use appendvfs to append database to the end of FILE", 22910 #endif 22911 #ifndef SQLITE_OMIT_DESERIALIZE 22912 " --deserialize Load into memory using sqlite3_deserialize()", 22913 " --hexdb Load the output of \"dbtotxt\" as an in-memory db", 22914 " --maxsize N Maximum size for --hexdb or --deserialized database", 22915 #endif 22916 " --new Initialize FILE to an empty database", 22917 " --nofollow Do not follow symbolic links", 22918 " --readonly Open FILE readonly", 22919 " --zip FILE is a ZIP archive", 22920 #ifndef SQLITE_SHELL_FIDDLE 22921 ".output ?FILE? Send output to FILE or stdout if FILE is omitted", 22922 " If FILE begins with '|' then open it as a pipe.", 22923 " Options:", 22924 " --bom Prefix output with a UTF8 byte-order mark", 22925 " -e Send output to the system text editor", 22926 " -x Send output as CSV to a spreadsheet", 22927 #endif 22928 ".parameter CMD ... Manage SQL parameter bindings", 22929 " clear Erase all bindings", 22930 " init Initialize the TEMP table that holds bindings", 22931 " list List the current parameter bindings", 22932 " set PARAMETER VALUE Given SQL parameter PARAMETER a value of VALUE", 22933 " PARAMETER should start with one of: $ : @ ?", 22934 " unset PARAMETER Remove PARAMETER from the binding table", 22935 ".print STRING... Print literal STRING", 22936 #ifndef SQLITE_OMIT_PROGRESS_CALLBACK 22937 ".progress N Invoke progress handler after every N opcodes", 22938 " --limit N Interrupt after N progress callbacks", 22939 " --once Do no more than one progress interrupt", 22940 " --quiet|-q No output except at interrupts", 22941 " --reset Reset the count for each input and interrupt", 22942 #endif 22943 ".prompt MAIN CONTINUE Replace the standard prompts", 22944 #ifndef SQLITE_SHELL_FIDDLE 22945 ".quit Stop interpreting input stream, exit if primary.", 22946 ".read FILE Read input from FILE or command output", 22947 " If FILE begins with \"|\", it is a command that generates the input.", 22948 #endif 22949 #if SQLITE_SHELL_HAVE_RECOVER 22950 ".recover Recover as much data as possible from corrupt db.", 22951 " --ignore-freelist Ignore pages that appear to be on db freelist", 22952 " --lost-and-found TABLE Alternative name for the lost-and-found table", 22953 " --no-rowids Do not attempt to recover rowid values", 22954 " that are not also INTEGER PRIMARY KEYs", 22955 #endif 22956 #ifndef SQLITE_SHELL_FIDDLE 22957 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE", 22958 ".save ?OPTIONS? FILE Write database to FILE (an alias for .backup ...)", 22959 #endif 22960 ".scanstats on|off|est Turn sqlite3_stmt_scanstatus() metrics on or off", 22961 ".schema ?PATTERN? Show the CREATE statements matching PATTERN", 22962 " Options:", 22963 " --indent Try to pretty-print the schema", 22964 " --nosys Omit objects whose names start with \"sqlite_\"", 22965 ",selftest ?OPTIONS? Run tests defined in the SELFTEST table", 22966 " Options:", 22967 " --init Create a new SELFTEST table", 22968 " -v Verbose output", 22969 ".separator COL ?ROW? Change the column and row separators", 22970 #if defined(SQLITE_ENABLE_SESSION) 22971 ".session ?NAME? CMD ... Create or control sessions", 22972 " Subcommands:", 22973 " attach TABLE Attach TABLE", 22974 " changeset FILE Write a changeset into FILE", 22975 " close Close one session", 22976 " enable ?BOOLEAN? Set or query the enable bit", 22977 " filter GLOB... Reject tables matching GLOBs", 22978 " indirect ?BOOLEAN? Mark or query the indirect status", 22979 " isempty Query whether the session is empty", 22980 " list List currently open session names", 22981 " open DB NAME Open a new session on DB", 22982 " patchset FILE Write a patchset into FILE", 22983 " If ?NAME? is omitted, the first defined session is used.", 22984 #endif 22985 ".sha3sum ... Compute a SHA3 hash of database content", 22986 " Options:", 22987 " --schema Also hash the sqlite_schema table", 22988 " --sha3-224 Use the sha3-224 algorithm", 22989 " --sha3-256 Use the sha3-256 algorithm (default)", 22990 " --sha3-384 Use the sha3-384 algorithm", 22991 " --sha3-512 Use the sha3-512 algorithm", 22992 " Any other argument is a LIKE pattern for tables to hash", 22993 #if !defined(SQLITE_NOHAVE_SYSTEM) && !defined(SQLITE_SHELL_FIDDLE) 22994 ".shell CMD ARGS... Run CMD ARGS... in a system shell", 22995 #endif 22996 ".show Show the current values for various settings", 22997 ".stats ?ARG? Show stats or turn stats on or off", 22998 " off Turn off automatic stat display", 22999 " on Turn on automatic stat display", 23000 " stmt Show statement stats", 23001 " vmstep Show the virtual machine step count only", 23002 #if !defined(SQLITE_NOHAVE_SYSTEM) && !defined(SQLITE_SHELL_FIDDLE) 23003 ".system CMD ARGS... Run CMD ARGS... in a system shell", 23004 #endif 23005 ".tables ?TABLE? List names of tables matching LIKE pattern TABLE", 23006 #ifndef SQLITE_SHELL_FIDDLE 23007 ",testcase NAME Begin redirecting output to 'testcase-out.txt'", 23008 #endif 23009 ",testctrl CMD ... Run various sqlite3_test_control() operations", 23010 " Run \".testctrl\" with no arguments for details", 23011 ".timeout MS Try opening locked tables for MS milliseconds", 23012 ".timer on|off Turn SQL timer on or off", 23013 #ifndef SQLITE_OMIT_TRACE 23014 ".trace ?OPTIONS? Output each SQL statement as it is run", 23015 " FILE Send output to FILE", 23016 " stdout Send output to stdout", 23017 " stderr Send output to stderr", 23018 " off Disable tracing", 23019 " --expanded Expand query parameters", 23020 #ifdef SQLITE_ENABLE_NORMALIZE 23021 " --normalized Normal the SQL statements", 23022 #endif 23023 " --plain Show SQL as it is input", 23024 " --stmt Trace statement execution (SQLITE_TRACE_STMT)", 23025 " --profile Profile statements (SQLITE_TRACE_PROFILE)", 23026 " --row Trace each row (SQLITE_TRACE_ROW)", 23027 " --close Trace connection close (SQLITE_TRACE_CLOSE)", 23028 #endif /* SQLITE_OMIT_TRACE */ 23029 #ifdef SQLITE_DEBUG 23030 ".unmodule NAME ... Unregister virtual table modules", 23031 " --allexcept Unregister everything except those named", 23032 #endif 23033 ".version Show source, library and compiler versions", 23034 ".vfsinfo ?AUX? Information about the top-level VFS", 23035 ".vfslist List all available VFSes", 23036 ".vfsname ?AUX? Print the name of the VFS stack", 23037 ".width NUM1 NUM2 ... Set minimum column widths for columnar output", 23038 " Negative values right-justify", 23039 }; 23040 23041 /* 23042 ** Output help text. 23043 ** 23044 ** zPattern describes the set of commands for which help text is provided. 23045 ** If zPattern is NULL, then show all commands, but only give a one-line 23046 ** description of each. 23047 ** 23048 ** Return the number of matches. 23049 */ 23050 static int showHelp(FILE *out, const char *zPattern){ 23051 int i = 0; 23052 int j = 0; 23053 int n = 0; 23054 char *zPat; 23055 if( zPattern==0 23056 || zPattern[0]=='0' 23057 || cli_strcmp(zPattern,"-a")==0 23058 || cli_strcmp(zPattern,"-all")==0 23059 || cli_strcmp(zPattern,"--all")==0 23060 ){ 23061 enum HelpWanted { HW_NoCull = 0, HW_SummaryOnly = 1, HW_Undoc = 2 }; 23062 enum HelpHave { HH_Undoc = 2, HH_Summary = 1, HH_More = 0 }; 23063 /* Show all or most commands 23064 ** *zPattern==0 => summary of documented commands only 23065 ** *zPattern=='0' => whole help for undocumented commands 23066 ** Otherwise => whole help for documented commands 23067 */ 23068 enum HelpWanted hw = HW_SummaryOnly; 23069 enum HelpHave hh = HH_More; 23070 if( zPattern!=0 ){ 23071 hw = (*zPattern=='0')? HW_NoCull|HW_Undoc : HW_NoCull; 23072 } 23073 for(i=0; i<ArraySize(azHelp); i++){ 23074 switch( azHelp[i][0] ){ 23075 case ',': 23076 hh = HH_Summary|HH_Undoc; 23077 break; 23078 case '.': 23079 hh = HH_Summary; 23080 break; 23081 default: 23082 hh &= ~HH_Summary; 23083 break; 23084 } 23085 if( ((hw^hh)&HH_Undoc)==0 ){ 23086 if( (hh&HH_Summary)!=0 ){ 23087 sputf(out, ".%s\n", azHelp[i]+1); 23088 ++n; 23089 }else if( (hw&HW_SummaryOnly)==0 ){ 23090 sputf(out, "%s\n", azHelp[i]); 23091 } 23092 } 23093 } 23094 }else{ 23095 /* Seek documented commands for which zPattern is an exact prefix */ 23096 zPat = sqlite3_mprintf(".%s*", zPattern); 23097 shell_check_oom(zPat); 23098 for(i=0; i<ArraySize(azHelp); i++){ 23099 if( sqlite3_strglob(zPat, azHelp[i])==0 ){ 23100 sputf(out, "%s\n", azHelp[i]); 23101 j = i+1; 23102 n++; 23103 } 23104 } 23105 sqlite3_free(zPat); 23106 if( n ){ 23107 if( n==1 ){ 23108 /* when zPattern is a prefix of exactly one command, then include 23109 ** the details of that command, which should begin at offset j */ 23110 while( j<ArraySize(azHelp)-1 && azHelp[j][0]==' ' ){ 23111 sputf(out, "%s\n", azHelp[j]); 23112 j++; 23113 } 23114 } 23115 return n; 23116 } 23117 /* Look for documented commands that contain zPattern anywhere. 23118 ** Show complete text of all documented commands that match. */ 23119 zPat = sqlite3_mprintf("%%%s%%", zPattern); 23120 shell_check_oom(zPat); 23121 for(i=0; i<ArraySize(azHelp); i++){ 23122 if( azHelp[i][0]==',' ){ 23123 while( i<ArraySize(azHelp)-1 && azHelp[i+1][0]==' ' ) ++i; 23124 continue; 23125 } 23126 if( azHelp[i][0]=='.' ) j = i; 23127 if( sqlite3_strlike(zPat, azHelp[i], 0)==0 ){ 23128 sputf(out, "%s\n", azHelp[j]); 23129 while( j<ArraySize(azHelp)-1 && azHelp[j+1][0]==' ' ){ 23130 j++; 23131 sputf(out, "%s\n", azHelp[j]); 23132 } 23133 i = j; 23134 n++; 23135 } 23136 } 23137 sqlite3_free(zPat); 23138 } 23139 return n; 23140 } 23141 23142 /* Forward reference */ 23143 static int process_input(ShellState *p); 23144 23145 /* 23146 ** Read the content of file zName into memory obtained from sqlite3_malloc64() 23147 ** and return a pointer to the buffer. The caller is responsible for freeing 23148 ** the memory. 23149 ** 23150 ** If parameter pnByte is not NULL, (*pnByte) is set to the number of bytes 23151 ** read. 23152 ** 23153 ** For convenience, a nul-terminator byte is always appended to the data read 23154 ** from the file before the buffer is returned. This byte is not included in 23155 ** the final value of (*pnByte), if applicable. 23156 ** 23157 ** NULL is returned if any error is encountered. The final value of *pnByte 23158 ** is undefined in this case. 23159 */ 23160 static char *readFile(const char *zName, int *pnByte){ 23161 FILE *in = fopen(zName, "rb"); 23162 long nIn; 23163 size_t nRead; 23164 char *pBuf; 23165 int rc; 23166 if( in==0 ) return 0; 23167 rc = fseek(in, 0, SEEK_END); 23168 if( rc!=0 ){ 23169 eputf("Error: '%s' not seekable\n", zName); 23170 fclose(in); 23171 return 0; 23172 } 23173 nIn = ftell(in); 23174 rewind(in); 23175 pBuf = sqlite3_malloc64( nIn+1 ); 23176 if( pBuf==0 ){ 23177 eputz("Error: out of memory\n"); 23178 fclose(in); 23179 return 0; 23180 } 23181 nRead = fread(pBuf, nIn, 1, in); 23182 fclose(in); 23183 if( nRead!=1 ){ 23184 sqlite3_free(pBuf); 23185 eputf("Error: cannot read '%s'\n", zName); 23186 return 0; 23187 } 23188 pBuf[nIn] = 0; 23189 if( pnByte ) *pnByte = nIn; 23190 return pBuf; 23191 } 23192 23193 #if defined(SQLITE_ENABLE_SESSION) 23194 /* 23195 ** Close a single OpenSession object and release all of its associated 23196 ** resources. 23197 */ 23198 static void session_close(OpenSession *pSession){ 23199 int i; 23200 sqlite3session_delete(pSession->p); 23201 sqlite3_free(pSession->zName); 23202 for(i=0; i<pSession->nFilter; i++){ 23203 sqlite3_free(pSession->azFilter[i]); 23204 } 23205 sqlite3_free(pSession->azFilter); 23206 memset(pSession, 0, sizeof(OpenSession)); 23207 } 23208 #endif 23209 23210 /* 23211 ** Close all OpenSession objects and release all associated resources. 23212 */ 23213 #if defined(SQLITE_ENABLE_SESSION) 23214 static void session_close_all(ShellState *p, int i){ 23215 int j; 23216 struct AuxDb *pAuxDb = i<0 ? p->pAuxDb : &p->aAuxDb[i]; 23217 for(j=0; j<pAuxDb->nSession; j++){ 23218 session_close(&pAuxDb->aSession[j]); 23219 } 23220 pAuxDb->nSession = 0; 23221 } 23222 #else 23223 # define session_close_all(X,Y) 23224 #endif 23225 23226 /* 23227 ** Implementation of the xFilter function for an open session. Omit 23228 ** any tables named by ".session filter" but let all other table through. 23229 */ 23230 #if defined(SQLITE_ENABLE_SESSION) 23231 static int session_filter(void *pCtx, const char *zTab){ 23232 OpenSession *pSession = (OpenSession*)pCtx; 23233 int i; 23234 for(i=0; i<pSession->nFilter; i++){ 23235 if( sqlite3_strglob(pSession->azFilter[i], zTab)==0 ) return 0; 23236 } 23237 return 1; 23238 } 23239 #endif 23240 23241 /* 23242 ** Try to deduce the type of file for zName based on its content. Return 23243 ** one of the SHELL_OPEN_* constants. 23244 ** 23245 ** If the file does not exist or is empty but its name looks like a ZIP 23246 ** archive and the dfltZip flag is true, then assume it is a ZIP archive. 23247 ** Otherwise, assume an ordinary database regardless of the filename if 23248 ** the type cannot be determined from content. 23249 */ 23250 int deduceDatabaseType(const char *zName, int dfltZip){ 23251 FILE *f = fopen(zName, "rb"); 23252 size_t n; 23253 int rc = SHELL_OPEN_UNSPEC; 23254 char zBuf[100]; 23255 if( f==0 ){ 23256 if( dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){ 23257 return SHELL_OPEN_ZIPFILE; 23258 }else{ 23259 return SHELL_OPEN_NORMAL; 23260 } 23261 } 23262 n = fread(zBuf, 16, 1, f); 23263 if( n==1 && memcmp(zBuf, "SQLite format 3", 16)==0 ){ 23264 fclose(f); 23265 return SHELL_OPEN_NORMAL; 23266 } 23267 fseek(f, -25, SEEK_END); 23268 n = fread(zBuf, 25, 1, f); 23269 if( n==1 && memcmp(zBuf, "Start-Of-SQLite3-", 17)==0 ){ 23270 rc = SHELL_OPEN_APPENDVFS; 23271 }else{ 23272 fseek(f, -22, SEEK_END); 23273 n = fread(zBuf, 22, 1, f); 23274 if( n==1 && zBuf[0]==0x50 && zBuf[1]==0x4b && zBuf[2]==0x05 23275 && zBuf[3]==0x06 ){ 23276 rc = SHELL_OPEN_ZIPFILE; 23277 }else if( n==0 && dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){ 23278 rc = SHELL_OPEN_ZIPFILE; 23279 } 23280 } 23281 fclose(f); 23282 return rc; 23283 } 23284 23285 #ifndef SQLITE_OMIT_DESERIALIZE 23286 /* 23287 ** Reconstruct an in-memory database using the output from the "dbtotxt" 23288 ** program. Read content from the file in p->aAuxDb[].zDbFilename. 23289 ** If p->aAuxDb[].zDbFilename is 0, then read from standard input. 23290 */ 23291 static unsigned char *readHexDb(ShellState *p, int *pnData){ 23292 unsigned char *a = 0; 23293 int nLine; 23294 int n = 0; 23295 int pgsz = 0; 23296 int iOffset = 0; 23297 int j, k; 23298 int rc; 23299 FILE *in; 23300 const char *zDbFilename = p->pAuxDb->zDbFilename; 23301 unsigned int x[16]; 23302 char zLine[1000]; 23303 if( zDbFilename ){ 23304 in = fopen(zDbFilename, "r"); 23305 if( in==0 ){ 23306 eputf("cannot open \"%s\" for reading\n", zDbFilename); 23307 return 0; 23308 } 23309 nLine = 0; 23310 }else{ 23311 in = p->in; 23312 nLine = p->lineno; 23313 if( in==0 ) in = stdin; 23314 } 23315 *pnData = 0; 23316 nLine++; 23317 if( fgets(zLine, sizeof(zLine), in)==0 ) goto readHexDb_error; 23318 rc = sscanf(zLine, "| size %d pagesize %d", &n, &pgsz); 23319 if( rc!=2 ) goto readHexDb_error; 23320 if( n<0 ) goto readHexDb_error; 23321 if( pgsz<512 || pgsz>65536 || (pgsz&(pgsz-1))!=0 ) goto readHexDb_error; 23322 n = (n+pgsz-1)&~(pgsz-1); /* Round n up to the next multiple of pgsz */ 23323 a = sqlite3_malloc( n ? n : 1 ); 23324 shell_check_oom(a); 23325 memset(a, 0, n); 23326 if( pgsz<512 || pgsz>65536 || (pgsz & (pgsz-1))!=0 ){ 23327 eputz("invalid pagesize\n"); 23328 goto readHexDb_error; 23329 } 23330 for(nLine++; fgets(zLine, sizeof(zLine), in)!=0; nLine++){ 23331 rc = sscanf(zLine, "| page %d offset %d", &j, &k); 23332 if( rc==2 ){ 23333 iOffset = k; 23334 continue; 23335 } 23336 if( cli_strncmp(zLine, "| end ", 6)==0 ){ 23337 break; 23338 } 23339 rc = sscanf(zLine,"| %d: %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x", 23340 &j, &x[0], &x[1], &x[2], &x[3], &x[4], &x[5], &x[6], &x[7], 23341 &x[8], &x[9], &x[10], &x[11], &x[12], &x[13], &x[14], &x[15]); 23342 if( rc==17 ){ 23343 k = iOffset+j; 23344 if( k+16<=n && k>=0 ){ 23345 int ii; 23346 for(ii=0; ii<16; ii++) a[k+ii] = x[ii]&0xff; 23347 } 23348 } 23349 } 23350 *pnData = n; 23351 if( in!=p->in ){ 23352 fclose(in); 23353 }else{ 23354 p->lineno = nLine; 23355 } 23356 return a; 23357 23358 readHexDb_error: 23359 if( in!=p->in ){ 23360 fclose(in); 23361 }else{ 23362 while( fgets(zLine, sizeof(zLine), p->in)!=0 ){ 23363 nLine++; 23364 if(cli_strncmp(zLine, "| end ", 6)==0 ) break; 23365 } 23366 p->lineno = nLine; 23367 } 23368 sqlite3_free(a); 23369 eputf("Error on line %d of --hexdb input\n", nLine); 23370 return 0; 23371 } 23372 #endif /* SQLITE_OMIT_DESERIALIZE */ 23373 23374 /* 23375 ** Scalar function "usleep(X)" invokes sqlite3_sleep(X) and returns X. 23376 */ 23377 static void shellUSleepFunc( 23378 sqlite3_context *context, 23379 int argcUnused, 23380 sqlite3_value **argv 23381 ){ 23382 int sleep = sqlite3_value_int(argv[0]); 23383 (void)argcUnused; 23384 sqlite3_sleep(sleep/1000); 23385 sqlite3_result_int(context, sleep); 23386 } 23387 23388 /* Flags for open_db(). 23389 ** 23390 ** The default behavior of open_db() is to exit(1) if the database fails to 23391 ** open. The OPEN_DB_KEEPALIVE flag changes that so that it prints an error 23392 ** but still returns without calling exit. 23393 ** 23394 ** The OPEN_DB_ZIPFILE flag causes open_db() to prefer to open files as a 23395 ** ZIP archive if the file does not exist or is empty and its name matches 23396 ** the *.zip pattern. 23397 */ 23398 #define OPEN_DB_KEEPALIVE 0x001 /* Return after error if true */ 23399 #define OPEN_DB_ZIPFILE 0x002 /* Open as ZIP if name matches *.zip */ 23400 23401 /* 23402 ** Make sure the database is open. If it is not, then open it. If 23403 ** the database fails to open, print an error message and exit. 23404 */ 23405 static void open_db(ShellState *p, int openFlags){ 23406 if( p->db==0 ){ 23407 const char *zDbFilename = p->pAuxDb->zDbFilename; 23408 if( p->openMode==SHELL_OPEN_UNSPEC ){ 23409 if( zDbFilename==0 || zDbFilename[0]==0 ){ 23410 p->openMode = SHELL_OPEN_NORMAL; 23411 }else{ 23412 p->openMode = (u8)deduceDatabaseType(zDbFilename, 23413 (openFlags & OPEN_DB_ZIPFILE)!=0); 23414 } 23415 } 23416 switch( p->openMode ){ 23417 case SHELL_OPEN_APPENDVFS: { 23418 sqlite3_open_v2(zDbFilename, &p->db, 23419 SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, "apndvfs"); 23420 break; 23421 } 23422 case SHELL_OPEN_HEXDB: 23423 case SHELL_OPEN_DESERIALIZE: { 23424 sqlite3_open(0, &p->db); 23425 break; 23426 } 23427 case SHELL_OPEN_ZIPFILE: { 23428 sqlite3_open(":memory:", &p->db); 23429 break; 23430 } 23431 case SHELL_OPEN_READONLY: { 23432 sqlite3_open_v2(zDbFilename, &p->db, 23433 SQLITE_OPEN_READONLY|p->openFlags, 0); 23434 break; 23435 } 23436 case SHELL_OPEN_UNSPEC: 23437 case SHELL_OPEN_NORMAL: { 23438 sqlite3_open_v2(zDbFilename, &p->db, 23439 SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, 0); 23440 break; 23441 } 23442 } 23443 if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){ 23444 eputf("Error: unable to open database \"%s\": %s\n", 23445 zDbFilename, sqlite3_errmsg(p->db)); 23446 if( (openFlags & OPEN_DB_KEEPALIVE)==0 ){ 23447 exit(1); 23448 } 23449 sqlite3_close(p->db); 23450 sqlite3_open(":memory:", &p->db); 23451 if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){ 23452 eputz("Also: unable to open substitute in-memory database.\n"); 23453 exit(1); 23454 }else{ 23455 eputf("Notice: using substitute in-memory database instead of \"%s\"\n", 23456 zDbFilename); 23457 } 23458 } 23459 globalDb = p->db; 23460 sqlite3_db_config(p->db, SQLITE_DBCONFIG_STMT_SCANSTATUS, (int)0, (int*)0); 23461 23462 /* Reflect the use or absence of --unsafe-testing invocation. */ 23463 { 23464 int testmode_on = ShellHasFlag(p,SHFLG_TestingMode); 23465 sqlite3_db_config(p->db, SQLITE_DBCONFIG_TRUSTED_SCHEMA, testmode_on,0); 23466 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, !testmode_on,0); 23467 } 23468 23469 #ifndef SQLITE_OMIT_LOAD_EXTENSION 23470 sqlite3_enable_load_extension(p->db, 1); 23471 #endif 23472 sqlite3_shathree_init(p->db, 0, 0); 23473 sqlite3_uint_init(p->db, 0, 0); 23474 sqlite3_decimal_init(p->db, 0, 0); 23475 sqlite3_base64_init(p->db, 0, 0); 23476 sqlite3_base85_init(p->db, 0, 0); 23477 sqlite3_regexp_init(p->db, 0, 0); 23478 sqlite3_ieee_init(p->db, 0, 0); 23479 sqlite3_series_init(p->db, 0, 0); 23480 #ifndef SQLITE_SHELL_FIDDLE 23481 sqlite3_fileio_init(p->db, 0, 0); 23482 sqlite3_completion_init(p->db, 0, 0); 23483 #endif 23484 #ifdef SQLITE_HAVE_ZLIB 23485 if( !p->bSafeModePersist ){ 23486 sqlite3_zipfile_init(p->db, 0, 0); 23487 sqlite3_sqlar_init(p->db, 0, 0); 23488 } 23489 #endif 23490 #ifdef SQLITE_SHELL_EXTFUNCS 23491 /* Create a preprocessing mechanism for extensions to make 23492 * their own provisions for being built into the shell. 23493 * This is a short-span macro. See further below for usage. 23494 */ 23495 #define SHELL_SUB_MACRO(base, variant) base ## _ ## variant 23496 #define SHELL_SUBMACRO(base, variant) SHELL_SUB_MACRO(base, variant) 23497 /* Let custom-included extensions get their ..._init() called. 23498 * The WHATEVER_INIT( db, pzErrorMsg, pApi ) macro should cause 23499 * the extension's sqlite3_*_init( db, pzErrorMsg, pApi ) 23500 * initialization routine to be called. 23501 */ 23502 { 23503 int irc = SHELL_SUBMACRO(SQLITE_SHELL_EXTFUNCS, INIT)(p->db); 23504 /* Let custom-included extensions expose their functionality. 23505 * The WHATEVER_EXPOSE( db, pzErrorMsg ) macro should cause 23506 * the SQL functions, virtual tables, collating sequences or 23507 * VFS's implemented by the extension to be registered. 23508 */ 23509 if( irc==SQLITE_OK 23510 || irc==SQLITE_OK_LOAD_PERMANENTLY ){ 23511 SHELL_SUBMACRO(SQLITE_SHELL_EXTFUNCS, EXPOSE)(p->db, 0); 23512 } 23513 #undef SHELL_SUB_MACRO 23514 #undef SHELL_SUBMACRO 23515 } 23516 #endif 23517 23518 sqlite3_create_function(p->db, "strtod", 1, SQLITE_UTF8, 0, 23519 shellStrtod, 0, 0); 23520 sqlite3_create_function(p->db, "dtostr", 1, SQLITE_UTF8, 0, 23521 shellDtostr, 0, 0); 23522 sqlite3_create_function(p->db, "dtostr", 2, SQLITE_UTF8, 0, 23523 shellDtostr, 0, 0); 23524 sqlite3_create_function(p->db, "shell_add_schema", 3, SQLITE_UTF8, 0, 23525 shellAddSchemaName, 0, 0); 23526 sqlite3_create_function(p->db, "shell_module_schema", 1, SQLITE_UTF8, 0, 23527 shellModuleSchema, 0, 0); 23528 sqlite3_create_function(p->db, "shell_putsnl", 1, SQLITE_UTF8, p, 23529 shellPutsFunc, 0, 0); 23530 sqlite3_create_function(p->db, "usleep",1,SQLITE_UTF8,0, 23531 shellUSleepFunc, 0, 0); 23532 #ifndef SQLITE_NOHAVE_SYSTEM 23533 sqlite3_create_function(p->db, "edit", 1, SQLITE_UTF8, 0, 23534 editFunc, 0, 0); 23535 sqlite3_create_function(p->db, "edit", 2, SQLITE_UTF8, 0, 23536 editFunc, 0, 0); 23537 #endif 23538 23539 if( p->openMode==SHELL_OPEN_ZIPFILE ){ 23540 char *zSql = sqlite3_mprintf( 23541 "CREATE VIRTUAL TABLE zip USING zipfile(%Q);", zDbFilename); 23542 shell_check_oom(zSql); 23543 sqlite3_exec(p->db, zSql, 0, 0, 0); 23544 sqlite3_free(zSql); 23545 } 23546 #ifndef SQLITE_OMIT_DESERIALIZE 23547 else 23548 if( p->openMode==SHELL_OPEN_DESERIALIZE || p->openMode==SHELL_OPEN_HEXDB ){ 23549 int rc; 23550 int nData = 0; 23551 unsigned char *aData; 23552 if( p->openMode==SHELL_OPEN_DESERIALIZE ){ 23553 aData = (unsigned char*)readFile(zDbFilename, &nData); 23554 }else{ 23555 aData = readHexDb(p, &nData); 23556 } 23557 if( aData==0 ){ 23558 return; 23559 } 23560 rc = sqlite3_deserialize(p->db, "main", aData, nData, nData, 23561 SQLITE_DESERIALIZE_RESIZEABLE | 23562 SQLITE_DESERIALIZE_FREEONCLOSE); 23563 if( rc ){ 23564 eputf("Error: sqlite3_deserialize() returns %d\n", rc); 23565 } 23566 if( p->szMax>0 ){ 23567 sqlite3_file_control(p->db, "main", SQLITE_FCNTL_SIZE_LIMIT, &p->szMax); 23568 } 23569 } 23570 #endif 23571 } 23572 if( p->db!=0 ){ 23573 if( p->bSafeModePersist ){ 23574 sqlite3_set_authorizer(p->db, safeModeAuth, p); 23575 } 23576 sqlite3_db_config( 23577 p->db, SQLITE_DBCONFIG_STMT_SCANSTATUS, p->scanstatsOn, (int*)0 23578 ); 23579 } 23580 } 23581 23582 /* 23583 ** Attempt to close the database connection. Report errors. 23584 */ 23585 void close_db(sqlite3 *db){ 23586 int rc = sqlite3_close(db); 23587 if( rc ){ 23588 eputf("Error: sqlite3_close() returns %d: %s\n", rc, sqlite3_errmsg(db)); 23589 } 23590 } 23591 23592 #if HAVE_READLINE || HAVE_EDITLINE 23593 /* 23594 ** Readline completion callbacks 23595 */ 23596 static char *readline_completion_generator(const char *text, int state){ 23597 static sqlite3_stmt *pStmt = 0; 23598 char *zRet; 23599 if( state==0 ){ 23600 char *zSql; 23601 sqlite3_finalize(pStmt); 23602 zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase" 23603 " FROM completion(%Q) ORDER BY 1", text); 23604 shell_check_oom(zSql); 23605 sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0); 23606 sqlite3_free(zSql); 23607 } 23608 if( sqlite3_step(pStmt)==SQLITE_ROW ){ 23609 const char *z = (const char*)sqlite3_column_text(pStmt,0); 23610 zRet = z ? strdup(z) : 0; 23611 }else{ 23612 sqlite3_finalize(pStmt); 23613 pStmt = 0; 23614 zRet = 0; 23615 } 23616 return zRet; 23617 } 23618 static char **readline_completion(const char *zText, int iStart, int iEnd){ 23619 (void)iStart; 23620 (void)iEnd; 23621 rl_attempted_completion_over = 1; 23622 return rl_completion_matches(zText, readline_completion_generator); 23623 } 23624 23625 #elif HAVE_LINENOISE 23626 /* 23627 ** Linenoise completion callback 23628 */ 23629 static void linenoise_completion(const char *zLine, linenoiseCompletions *lc){ 23630 i64 nLine = strlen(zLine); 23631 i64 i, iStart; 23632 sqlite3_stmt *pStmt = 0; 23633 char *zSql; 23634 char zBuf[1000]; 23635 23636 if( nLine>(i64)sizeof(zBuf)-30 ) return; 23637 if( zLine[0]=='.' || zLine[0]=='#') return; 23638 for(i=nLine-1; i>=0 && (isalnum(zLine[i]) || zLine[i]=='_'); i--){} 23639 if( i==nLine-1 ) return; 23640 iStart = i+1; 23641 memcpy(zBuf, zLine, iStart); 23642 zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase" 23643 " FROM completion(%Q,%Q) ORDER BY 1", 23644 &zLine[iStart], zLine); 23645 shell_check_oom(zSql); 23646 sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0); 23647 sqlite3_free(zSql); 23648 sqlite3_exec(globalDb, "PRAGMA page_count", 0, 0, 0); /* Load the schema */ 23649 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 23650 const char *zCompletion = (const char*)sqlite3_column_text(pStmt, 0); 23651 int nCompletion = sqlite3_column_bytes(pStmt, 0); 23652 if( iStart+nCompletion < (i64)sizeof(zBuf)-1 && zCompletion ){ 23653 memcpy(zBuf+iStart, zCompletion, nCompletion+1); 23654 linenoiseAddCompletion(lc, zBuf); 23655 } 23656 } 23657 sqlite3_finalize(pStmt); 23658 } 23659 #endif 23660 23661 /* 23662 ** Do C-language style dequoting. 23663 ** 23664 ** \a -> alarm 23665 ** \b -> backspace 23666 ** \t -> tab 23667 ** \n -> newline 23668 ** \v -> vertical tab 23669 ** \f -> form feed 23670 ** \r -> carriage return 23671 ** \s -> space 23672 ** \" -> " 23673 ** \' -> ' 23674 ** \\ -> backslash 23675 ** \NNN -> ascii character NNN in octal 23676 ** \xHH -> ascii character HH in hexadecimal 23677 */ 23678 static void resolve_backslashes(char *z){ 23679 int i, j; 23680 char c; 23681 while( *z && *z!='\\' ) z++; 23682 for(i=j=0; (c = z[i])!=0; i++, j++){ 23683 if( c=='\\' && z[i+1]!=0 ){ 23684 c = z[++i]; 23685 if( c=='a' ){ 23686 c = '\a'; 23687 }else if( c=='b' ){ 23688 c = '\b'; 23689 }else if( c=='t' ){ 23690 c = '\t'; 23691 }else if( c=='n' ){ 23692 c = '\n'; 23693 }else if( c=='v' ){ 23694 c = '\v'; 23695 }else if( c=='f' ){ 23696 c = '\f'; 23697 }else if( c=='r' ){ 23698 c = '\r'; 23699 }else if( c=='"' ){ 23700 c = '"'; 23701 }else if( c=='\'' ){ 23702 c = '\''; 23703 }else if( c=='\\' ){ 23704 c = '\\'; 23705 }else if( c=='x' ){ 23706 int nhd = 0, hdv; 23707 u8 hv = 0; 23708 while( nhd<2 && (c=z[i+1+nhd])!=0 && (hdv=hexDigitValue(c))>=0 ){ 23709 hv = (u8)((hv<<4)|hdv); 23710 ++nhd; 23711 } 23712 i += nhd; 23713 c = (u8)hv; 23714 }else if( c>='0' && c<='7' ){ 23715 c -= '0'; 23716 if( z[i+1]>='0' && z[i+1]<='7' ){ 23717 i++; 23718 c = (c<<3) + z[i] - '0'; 23719 if( z[i+1]>='0' && z[i+1]<='7' ){ 23720 i++; 23721 c = (c<<3) + z[i] - '0'; 23722 } 23723 } 23724 } 23725 } 23726 z[j] = c; 23727 } 23728 if( j<i ) z[j] = 0; 23729 } 23730 23731 /* 23732 ** Interpret zArg as either an integer or a boolean value. Return 1 or 0 23733 ** for TRUE and FALSE. Return the integer value if appropriate. 23734 */ 23735 static int booleanValue(const char *zArg){ 23736 int i; 23737 if( zArg[0]=='0' && zArg[1]=='x' ){ 23738 for(i=2; hexDigitValue(zArg[i])>=0; i++){} 23739 }else{ 23740 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){} 23741 } 23742 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff); 23743 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){ 23744 return 1; 23745 } 23746 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){ 23747 return 0; 23748 } 23749 eputf("ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n", zArg); 23750 return 0; 23751 } 23752 23753 /* 23754 ** Set or clear a shell flag according to a boolean value. 23755 */ 23756 static void setOrClearFlag(ShellState *p, unsigned mFlag, const char *zArg){ 23757 if( booleanValue(zArg) ){ 23758 ShellSetFlag(p, mFlag); 23759 }else{ 23760 ShellClearFlag(p, mFlag); 23761 } 23762 } 23763 23764 /* 23765 ** Close an output file, assuming it is not stderr or stdout 23766 */ 23767 static void output_file_close(FILE *f){ 23768 if( f && f!=stdout && f!=stderr ) fclose(f); 23769 } 23770 23771 /* 23772 ** Try to open an output file. The names "stdout" and "stderr" are 23773 ** recognized and do the right thing. NULL is returned if the output 23774 ** filename is "off". 23775 */ 23776 static FILE *output_file_open(const char *zFile, int bTextMode){ 23777 FILE *f; 23778 if( cli_strcmp(zFile,"stdout")==0 ){ 23779 f = stdout; 23780 }else if( cli_strcmp(zFile, "stderr")==0 ){ 23781 f = stderr; 23782 }else if( cli_strcmp(zFile, "off")==0 ){ 23783 f = 0; 23784 }else{ 23785 f = fopen(zFile, bTextMode ? "w" : "wb"); 23786 if( f==0 ){ 23787 eputf("Error: cannot open \"%s\"\n", zFile); 23788 } 23789 } 23790 return f; 23791 } 23792 23793 #ifndef SQLITE_OMIT_TRACE 23794 /* 23795 ** A routine for handling output from sqlite3_trace(). 23796 */ 23797 static int sql_trace_callback( 23798 unsigned mType, /* The trace type */ 23799 void *pArg, /* The ShellState pointer */ 23800 void *pP, /* Usually a pointer to sqlite_stmt */ 23801 void *pX /* Auxiliary output */ 23802 ){ 23803 ShellState *p = (ShellState*)pArg; 23804 sqlite3_stmt *pStmt; 23805 const char *zSql; 23806 i64 nSql; 23807 if( p->traceOut==0 ) return 0; 23808 if( mType==SQLITE_TRACE_CLOSE ){ 23809 sputz(p->traceOut, "-- closing database connection\n"); 23810 return 0; 23811 } 23812 if( mType!=SQLITE_TRACE_ROW && pX!=0 && ((const char*)pX)[0]=='-' ){ 23813 zSql = (const char*)pX; 23814 }else{ 23815 pStmt = (sqlite3_stmt*)pP; 23816 switch( p->eTraceType ){ 23817 case SHELL_TRACE_EXPANDED: { 23818 zSql = sqlite3_expanded_sql(pStmt); 23819 break; 23820 } 23821 #ifdef SQLITE_ENABLE_NORMALIZE 23822 case SHELL_TRACE_NORMALIZED: { 23823 zSql = sqlite3_normalized_sql(pStmt); 23824 break; 23825 } 23826 #endif 23827 default: { 23828 zSql = sqlite3_sql(pStmt); 23829 break; 23830 } 23831 } 23832 } 23833 if( zSql==0 ) return 0; 23834 nSql = strlen(zSql); 23835 if( nSql>1000000000 ) nSql = 1000000000; 23836 while( nSql>0 && zSql[nSql-1]==';' ){ nSql--; } 23837 switch( mType ){ 23838 case SQLITE_TRACE_ROW: 23839 case SQLITE_TRACE_STMT: { 23840 sputf(p->traceOut, "%.*s;\n", (int)nSql, zSql); 23841 break; 23842 } 23843 case SQLITE_TRACE_PROFILE: { 23844 sqlite3_int64 nNanosec = pX ? *(sqlite3_int64*)pX : 0; 23845 sputf(p->traceOut, "%.*s; -- %lld ns\n", (int)nSql, zSql, nNanosec); 23846 break; 23847 } 23848 } 23849 return 0; 23850 } 23851 #endif 23852 23853 /* 23854 ** A no-op routine that runs with the ".breakpoint" doc-command. This is 23855 ** a useful spot to set a debugger breakpoint. 23856 ** 23857 ** This routine does not do anything practical. The code are there simply 23858 ** to prevent the compiler from optimizing this routine out. 23859 */ 23860 static void test_breakpoint(void){ 23861 static unsigned int nCall = 0; 23862 if( (nCall++)==0xffffffff ) printf("Many .breakpoints have run\n"); 23863 } 23864 23865 /* 23866 ** An object used to read a CSV and other files for import. 23867 */ 23868 typedef struct ImportCtx ImportCtx; 23869 struct ImportCtx { 23870 const char *zFile; /* Name of the input file */ 23871 FILE *in; /* Read the CSV text from this input stream */ 23872 int (SQLITE_CDECL *xCloser)(FILE*); /* Func to close in */ 23873 char *z; /* Accumulated text for a field */ 23874 int n; /* Number of bytes in z */ 23875 int nAlloc; /* Space allocated for z[] */ 23876 int nLine; /* Current line number */ 23877 int nRow; /* Number of rows imported */ 23878 int nErr; /* Number of errors encountered */ 23879 int bNotFirst; /* True if one or more bytes already read */ 23880 int cTerm; /* Character that terminated the most recent field */ 23881 int cColSep; /* The column separator character. (Usually ",") */ 23882 int cRowSep; /* The row separator character. (Usually "\n") */ 23883 }; 23884 23885 /* Clean up resourced used by an ImportCtx */ 23886 static void import_cleanup(ImportCtx *p){ 23887 if( p->in!=0 && p->xCloser!=0 ){ 23888 p->xCloser(p->in); 23889 p->in = 0; 23890 } 23891 sqlite3_free(p->z); 23892 p->z = 0; 23893 } 23894 23895 /* Append a single byte to z[] */ 23896 static void import_append_char(ImportCtx *p, int c){ 23897 if( p->n+1>=p->nAlloc ){ 23898 p->nAlloc += p->nAlloc + 100; 23899 p->z = sqlite3_realloc64(p->z, p->nAlloc); 23900 shell_check_oom(p->z); 23901 } 23902 p->z[p->n++] = (char)c; 23903 } 23904 23905 /* Read a single field of CSV text. Compatible with rfc4180 and extended 23906 ** with the option of having a separator other than ",". 23907 ** 23908 ** + Input comes from p->in. 23909 ** + Store results in p->z of length p->n. Space to hold p->z comes 23910 ** from sqlite3_malloc64(). 23911 ** + Use p->cSep as the column separator. The default is ",". 23912 ** + Use p->rSep as the row separator. The default is "\n". 23913 ** + Keep track of the line number in p->nLine. 23914 ** + Store the character that terminates the field in p->cTerm. Store 23915 ** EOF on end-of-file. 23916 ** + Report syntax errors on stderr 23917 */ 23918 static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){ 23919 int c; 23920 int cSep = (u8)p->cColSep; 23921 int rSep = (u8)p->cRowSep; 23922 p->n = 0; 23923 c = fgetc(p->in); 23924 if( c==EOF || seenInterrupt ){ 23925 p->cTerm = EOF; 23926 return 0; 23927 } 23928 if( c=='"' ){ 23929 int pc, ppc; 23930 int startLine = p->nLine; 23931 int cQuote = c; 23932 pc = ppc = 0; 23933 while( 1 ){ 23934 c = fgetc(p->in); 23935 if( c==rSep ) p->nLine++; 23936 if( c==cQuote ){ 23937 if( pc==cQuote ){ 23938 pc = 0; 23939 continue; 23940 } 23941 } 23942 if( (c==cSep && pc==cQuote) 23943 || (c==rSep && pc==cQuote) 23944 || (c==rSep && pc=='\r' && ppc==cQuote) 23945 || (c==EOF && pc==cQuote) 23946 ){ 23947 do{ p->n--; }while( p->z[p->n]!=cQuote ); 23948 p->cTerm = c; 23949 break; 23950 } 23951 if( pc==cQuote && c!='\r' ){ 23952 eputf("%s:%d: unescaped %c character\n", p->zFile, p->nLine, cQuote); 23953 } 23954 if( c==EOF ){ 23955 eputf("%s:%d: unterminated %c-quoted field\n", 23956 p->zFile, startLine, cQuote); 23957 p->cTerm = c; 23958 break; 23959 } 23960 import_append_char(p, c); 23961 ppc = pc; 23962 pc = c; 23963 } 23964 }else{ 23965 /* If this is the first field being parsed and it begins with the 23966 ** UTF-8 BOM (0xEF BB BF) then skip the BOM */ 23967 if( (c&0xff)==0xef && p->bNotFirst==0 ){ 23968 import_append_char(p, c); 23969 c = fgetc(p->in); 23970 if( (c&0xff)==0xbb ){ 23971 import_append_char(p, c); 23972 c = fgetc(p->in); 23973 if( (c&0xff)==0xbf ){ 23974 p->bNotFirst = 1; 23975 p->n = 0; 23976 return csv_read_one_field(p); 23977 } 23978 } 23979 } 23980 while( c!=EOF && c!=cSep && c!=rSep ){ 23981 import_append_char(p, c); 23982 c = fgetc(p->in); 23983 } 23984 if( c==rSep ){ 23985 p->nLine++; 23986 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--; 23987 } 23988 p->cTerm = c; 23989 } 23990 if( p->z ) p->z[p->n] = 0; 23991 p->bNotFirst = 1; 23992 return p->z; 23993 } 23994 23995 /* Read a single field of ASCII delimited text. 23996 ** 23997 ** + Input comes from p->in. 23998 ** + Store results in p->z of length p->n. Space to hold p->z comes 23999 ** from sqlite3_malloc64(). 24000 ** + Use p->cSep as the column separator. The default is "\x1F". 24001 ** + Use p->rSep as the row separator. The default is "\x1E". 24002 ** + Keep track of the row number in p->nLine. 24003 ** + Store the character that terminates the field in p->cTerm. Store 24004 ** EOF on end-of-file. 24005 ** + Report syntax errors on stderr 24006 */ 24007 static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){ 24008 int c; 24009 int cSep = (u8)p->cColSep; 24010 int rSep = (u8)p->cRowSep; 24011 p->n = 0; 24012 c = fgetc(p->in); 24013 if( c==EOF || seenInterrupt ){ 24014 p->cTerm = EOF; 24015 return 0; 24016 } 24017 while( c!=EOF && c!=cSep && c!=rSep ){ 24018 import_append_char(p, c); 24019 c = fgetc(p->in); 24020 } 24021 if( c==rSep ){ 24022 p->nLine++; 24023 } 24024 p->cTerm = c; 24025 if( p->z ) p->z[p->n] = 0; 24026 return p->z; 24027 } 24028 24029 /* 24030 ** Try to transfer data for table zTable. If an error is seen while 24031 ** moving forward, try to go backwards. The backwards movement won't 24032 ** work for WITHOUT ROWID tables. 24033 */ 24034 static void tryToCloneData( 24035 ShellState *p, 24036 sqlite3 *newDb, 24037 const char *zTable 24038 ){ 24039 sqlite3_stmt *pQuery = 0; 24040 sqlite3_stmt *pInsert = 0; 24041 char *zQuery = 0; 24042 char *zInsert = 0; 24043 int rc; 24044 int i, j, n; 24045 int nTable = strlen30(zTable); 24046 int k = 0; 24047 int cnt = 0; 24048 const int spinRate = 10000; 24049 24050 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable); 24051 shell_check_oom(zQuery); 24052 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0); 24053 if( rc ){ 24054 eputf("Error %d: %s on [%s]\n", 24055 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db), zQuery); 24056 goto end_data_xfer; 24057 } 24058 n = sqlite3_column_count(pQuery); 24059 zInsert = sqlite3_malloc64(200 + nTable + n*3); 24060 shell_check_oom(zInsert); 24061 sqlite3_snprintf(200+nTable,zInsert, 24062 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable); 24063 i = strlen30(zInsert); 24064 for(j=1; j<n; j++){ 24065 memcpy(zInsert+i, ",?", 2); 24066 i += 2; 24067 } 24068 memcpy(zInsert+i, ");", 3); 24069 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0); 24070 if( rc ){ 24071 eputf("Error %d: %s on [%s]\n", 24072 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb), zInsert); 24073 goto end_data_xfer; 24074 } 24075 for(k=0; k<2; k++){ 24076 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){ 24077 for(i=0; i<n; i++){ 24078 switch( sqlite3_column_type(pQuery, i) ){ 24079 case SQLITE_NULL: { 24080 sqlite3_bind_null(pInsert, i+1); 24081 break; 24082 } 24083 case SQLITE_INTEGER: { 24084 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i)); 24085 break; 24086 } 24087 case SQLITE_FLOAT: { 24088 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i)); 24089 break; 24090 } 24091 case SQLITE_TEXT: { 24092 sqlite3_bind_text(pInsert, i+1, 24093 (const char*)sqlite3_column_text(pQuery,i), 24094 -1, SQLITE_STATIC); 24095 break; 24096 } 24097 case SQLITE_BLOB: { 24098 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i), 24099 sqlite3_column_bytes(pQuery,i), 24100 SQLITE_STATIC); 24101 break; 24102 } 24103 } 24104 } /* End for */ 24105 rc = sqlite3_step(pInsert); 24106 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){ 24107 eputf("Error %d: %s\n", 24108 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb)); 24109 } 24110 sqlite3_reset(pInsert); 24111 cnt++; 24112 if( (cnt%spinRate)==0 ){ 24113 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]); 24114 fflush(stdout); 24115 } 24116 } /* End while */ 24117 if( rc==SQLITE_DONE ) break; 24118 sqlite3_finalize(pQuery); 24119 sqlite3_free(zQuery); 24120 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;", 24121 zTable); 24122 shell_check_oom(zQuery); 24123 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0); 24124 if( rc ){ 24125 eputf("Warning: cannot step \"%s\" backwards", zTable); 24126 break; 24127 } 24128 } /* End for(k=0...) */ 24129 24130 end_data_xfer: 24131 sqlite3_finalize(pQuery); 24132 sqlite3_finalize(pInsert); 24133 sqlite3_free(zQuery); 24134 sqlite3_free(zInsert); 24135 } 24136 24137 24138 /* 24139 ** Try to transfer all rows of the schema that match zWhere. For 24140 ** each row, invoke xForEach() on the object defined by that row. 24141 ** If an error is encountered while moving forward through the 24142 ** sqlite_schema table, try again moving backwards. 24143 */ 24144 static void tryToCloneSchema( 24145 ShellState *p, 24146 sqlite3 *newDb, 24147 const char *zWhere, 24148 void (*xForEach)(ShellState*,sqlite3*,const char*) 24149 ){ 24150 sqlite3_stmt *pQuery = 0; 24151 char *zQuery = 0; 24152 int rc; 24153 const unsigned char *zName; 24154 const unsigned char *zSql; 24155 char *zErrMsg = 0; 24156 24157 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema" 24158 " WHERE %s ORDER BY rowid ASC", zWhere); 24159 shell_check_oom(zQuery); 24160 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0); 24161 if( rc ){ 24162 eputf("Error: (%d) %s on [%s]\n", sqlite3_extended_errcode(p->db), 24163 sqlite3_errmsg(p->db), zQuery); 24164 goto end_schema_xfer; 24165 } 24166 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){ 24167 zName = sqlite3_column_text(pQuery, 0); 24168 zSql = sqlite3_column_text(pQuery, 1); 24169 if( zName==0 || zSql==0 ) continue; 24170 if( sqlite3_stricmp((char*)zName, "sqlite_sequence")!=0 ){ 24171 sputf(stdout, "%s... ", zName); fflush(stdout); 24172 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg); 24173 if( zErrMsg ){ 24174 eputf("Error: %s\nSQL: [%s]\n", zErrMsg, zSql); 24175 sqlite3_free(zErrMsg); 24176 zErrMsg = 0; 24177 } 24178 } 24179 if( xForEach ){ 24180 xForEach(p, newDb, (const char*)zName); 24181 } 24182 sputz(stdout, "done\n"); 24183 } 24184 if( rc!=SQLITE_DONE ){ 24185 sqlite3_finalize(pQuery); 24186 sqlite3_free(zQuery); 24187 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema" 24188 " WHERE %s ORDER BY rowid DESC", zWhere); 24189 shell_check_oom(zQuery); 24190 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0); 24191 if( rc ){ 24192 eputf("Error: (%d) %s on [%s]\n", 24193 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db), zQuery); 24194 goto end_schema_xfer; 24195 } 24196 while( sqlite3_step(pQuery)==SQLITE_ROW ){ 24197 zName = sqlite3_column_text(pQuery, 0); 24198 zSql = sqlite3_column_text(pQuery, 1); 24199 if( zName==0 || zSql==0 ) continue; 24200 if( sqlite3_stricmp((char*)zName, "sqlite_sequence")==0 ) continue; 24201 sputf(stdout, "%s... ", zName); fflush(stdout); 24202 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg); 24203 if( zErrMsg ){ 24204 eputf("Error: %s\nSQL: [%s]\n", zErrMsg, zSql); 24205 sqlite3_free(zErrMsg); 24206 zErrMsg = 0; 24207 } 24208 if( xForEach ){ 24209 xForEach(p, newDb, (const char*)zName); 24210 } 24211 sputz(stdout, "done\n"); 24212 } 24213 } 24214 end_schema_xfer: 24215 sqlite3_finalize(pQuery); 24216 sqlite3_free(zQuery); 24217 } 24218 24219 /* 24220 ** Open a new database file named "zNewDb". Try to recover as much information 24221 ** as possible out of the main database (which might be corrupt) and write it 24222 ** into zNewDb. 24223 */ 24224 static void tryToClone(ShellState *p, const char *zNewDb){ 24225 int rc; 24226 sqlite3 *newDb = 0; 24227 if( access(zNewDb,0)==0 ){ 24228 eputf("File \"%s\" already exists.\n", zNewDb); 24229 return; 24230 } 24231 rc = sqlite3_open(zNewDb, &newDb); 24232 if( rc ){ 24233 eputf("Cannot create output database: %s\n", sqlite3_errmsg(newDb)); 24234 }else{ 24235 sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0); 24236 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0); 24237 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData); 24238 tryToCloneSchema(p, newDb, "type!='table'", 0); 24239 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0); 24240 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0); 24241 } 24242 close_db(newDb); 24243 } 24244 24245 #ifndef SQLITE_SHELL_FIDDLE 24246 /* 24247 ** Change the output stream (file or pipe or console) to something else. 24248 */ 24249 static void output_redir(ShellState *p, FILE *pfNew){ 24250 if( p->out != stdout ) eputz("Output already redirected.\n"); 24251 else{ 24252 p->out = pfNew; 24253 setOutputStream(pfNew); 24254 } 24255 } 24256 24257 /* 24258 ** Change the output file back to stdout. 24259 ** 24260 ** If the p->doXdgOpen flag is set, that means the output was being 24261 ** redirected to a temporary file named by p->zTempFile. In that case, 24262 ** launch start/open/xdg-open on that temporary file. 24263 */ 24264 static void output_reset(ShellState *p){ 24265 if( p->outfile[0]=='|' ){ 24266 #ifndef SQLITE_OMIT_POPEN 24267 pclose(p->out); 24268 #endif 24269 }else{ 24270 output_file_close(p->out); 24271 #ifndef SQLITE_NOHAVE_SYSTEM 24272 if( p->doXdgOpen ){ 24273 const char *zXdgOpenCmd = 24274 #if defined(_WIN32) 24275 "start"; 24276 #elif defined(__APPLE__) 24277 "open"; 24278 #else 24279 "xdg-open"; 24280 #endif 24281 char *zCmd; 24282 zCmd = sqlite3_mprintf("%s %s", zXdgOpenCmd, p->zTempFile); 24283 if( system(zCmd) ){ 24284 eputf("Failed: [%s]\n", zCmd); 24285 }else{ 24286 /* Give the start/open/xdg-open command some time to get 24287 ** going before we continue, and potential delete the 24288 ** p->zTempFile data file out from under it */ 24289 sqlite3_sleep(2000); 24290 } 24291 sqlite3_free(zCmd); 24292 outputModePop(p); 24293 p->doXdgOpen = 0; 24294 } 24295 #endif /* !defined(SQLITE_NOHAVE_SYSTEM) */ 24296 } 24297 p->outfile[0] = 0; 24298 p->out = stdout; 24299 setOutputStream(stdout); 24300 } 24301 #else 24302 # define output_redir(SS,pfO) 24303 # define output_reset(SS) 24304 #endif 24305 24306 /* 24307 ** Run an SQL command and return the single integer result. 24308 */ 24309 static int db_int(sqlite3 *db, const char *zSql){ 24310 sqlite3_stmt *pStmt; 24311 int res = 0; 24312 sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); 24313 if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){ 24314 res = sqlite3_column_int(pStmt,0); 24315 } 24316 sqlite3_finalize(pStmt); 24317 return res; 24318 } 24319 24320 #if SQLITE_SHELL_HAVE_RECOVER 24321 /* 24322 ** Convert a 2-byte or 4-byte big-endian integer into a native integer 24323 */ 24324 static unsigned int get2byteInt(unsigned char *a){ 24325 return (a[0]<<8) + a[1]; 24326 } 24327 static unsigned int get4byteInt(unsigned char *a){ 24328 return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3]; 24329 } 24330 24331 /* 24332 ** Implementation of the ".dbinfo" command. 24333 ** 24334 ** Return 1 on error, 2 to exit, and 0 otherwise. 24335 */ 24336 static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){ 24337 static const struct { const char *zName; int ofst; } aField[] = { 24338 { "file change counter:", 24 }, 24339 { "database page count:", 28 }, 24340 { "freelist page count:", 36 }, 24341 { "schema cookie:", 40 }, 24342 { "schema format:", 44 }, 24343 { "default cache size:", 48 }, 24344 { "autovacuum top root:", 52 }, 24345 { "incremental vacuum:", 64 }, 24346 { "text encoding:", 56 }, 24347 { "user version:", 60 }, 24348 { "application id:", 68 }, 24349 { "software version:", 96 }, 24350 }; 24351 static const struct { const char *zName; const char *zSql; } aQuery[] = { 24352 { "number of tables:", 24353 "SELECT count(*) FROM %s WHERE type='table'" }, 24354 { "number of indexes:", 24355 "SELECT count(*) FROM %s WHERE type='index'" }, 24356 { "number of triggers:", 24357 "SELECT count(*) FROM %s WHERE type='trigger'" }, 24358 { "number of views:", 24359 "SELECT count(*) FROM %s WHERE type='view'" }, 24360 { "schema size:", 24361 "SELECT total(length(sql)) FROM %s" }, 24362 }; 24363 int i, rc; 24364 unsigned iDataVersion; 24365 char *zSchemaTab; 24366 char *zDb = nArg>=2 ? azArg[1] : "main"; 24367 sqlite3_stmt *pStmt = 0; 24368 unsigned char aHdr[100]; 24369 open_db(p, 0); 24370 if( p->db==0 ) return 1; 24371 rc = sqlite3_prepare_v2(p->db, 24372 "SELECT data FROM sqlite_dbpage(?1) WHERE pgno=1", 24373 -1, &pStmt, 0); 24374 if( rc ){ 24375 eputf("error: %s\n", sqlite3_errmsg(p->db)); 24376 sqlite3_finalize(pStmt); 24377 return 1; 24378 } 24379 sqlite3_bind_text(pStmt, 1, zDb, -1, SQLITE_STATIC); 24380 if( sqlite3_step(pStmt)==SQLITE_ROW 24381 && sqlite3_column_bytes(pStmt,0)>100 24382 ){ 24383 const u8 *pb = sqlite3_column_blob(pStmt,0); 24384 shell_check_oom(pb); 24385 memcpy(aHdr, pb, 100); 24386 sqlite3_finalize(pStmt); 24387 }else{ 24388 eputz("unable to read database header\n"); 24389 sqlite3_finalize(pStmt); 24390 return 1; 24391 } 24392 i = get2byteInt(aHdr+16); 24393 if( i==1 ) i = 65536; 24394 oputf("%-20s %d\n", "database page size:", i); 24395 oputf("%-20s %d\n", "write format:", aHdr[18]); 24396 oputf("%-20s %d\n", "read format:", aHdr[19]); 24397 oputf("%-20s %d\n", "reserved bytes:", aHdr[20]); 24398 for(i=0; i<ArraySize(aField); i++){ 24399 int ofst = aField[i].ofst; 24400 unsigned int val = get4byteInt(aHdr + ofst); 24401 oputf("%-20s %u", aField[i].zName, val); 24402 switch( ofst ){ 24403 case 56: { 24404 if( val==1 ) oputz(" (utf8)"); 24405 if( val==2 ) oputz(" (utf16le)"); 24406 if( val==3 ) oputz(" (utf16be)"); 24407 } 24408 } 24409 oputz("\n"); 24410 } 24411 if( zDb==0 ){ 24412 zSchemaTab = sqlite3_mprintf("main.sqlite_schema"); 24413 }else if( cli_strcmp(zDb,"temp")==0 ){ 24414 zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_schema"); 24415 }else{ 24416 zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_schema", zDb); 24417 } 24418 for(i=0; i<ArraySize(aQuery); i++){ 24419 char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab); 24420 int val = db_int(p->db, zSql); 24421 sqlite3_free(zSql); 24422 oputf("%-20s %d\n", aQuery[i].zName, val); 24423 } 24424 sqlite3_free(zSchemaTab); 24425 sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_DATA_VERSION, &iDataVersion); 24426 oputf("%-20s %u\n", "data version", iDataVersion); 24427 return 0; 24428 } 24429 #endif /* SQLITE_SHELL_HAVE_RECOVER */ 24430 24431 /* 24432 ** Print the current sqlite3_errmsg() value to stderr and return 1. 24433 */ 24434 static int shellDatabaseError(sqlite3 *db){ 24435 const char *zErr = sqlite3_errmsg(db); 24436 eputf("Error: %s\n", zErr); 24437 return 1; 24438 } 24439 24440 /* 24441 ** Compare the pattern in zGlob[] against the text in z[]. Return TRUE 24442 ** if they match and FALSE (0) if they do not match. 24443 ** 24444 ** Globbing rules: 24445 ** 24446 ** '*' Matches any sequence of zero or more characters. 24447 ** 24448 ** '?' Matches exactly one character. 24449 ** 24450 ** [...] Matches one character from the enclosed list of 24451 ** characters. 24452 ** 24453 ** [^...] Matches one character not in the enclosed list. 24454 ** 24455 ** '#' Matches any sequence of one or more digits with an 24456 ** optional + or - sign in front 24457 ** 24458 ** ' ' Any span of whitespace matches any other span of 24459 ** whitespace. 24460 ** 24461 ** Extra whitespace at the end of z[] is ignored. 24462 */ 24463 static int testcase_glob(const char *zGlob, const char *z){ 24464 int c, c2; 24465 int invert; 24466 int seen; 24467 24468 while( (c = (*(zGlob++)))!=0 ){ 24469 if( IsSpace(c) ){ 24470 if( !IsSpace(*z) ) return 0; 24471 while( IsSpace(*zGlob) ) zGlob++; 24472 while( IsSpace(*z) ) z++; 24473 }else if( c=='*' ){ 24474 while( (c=(*(zGlob++))) == '*' || c=='?' ){ 24475 if( c=='?' && (*(z++))==0 ) return 0; 24476 } 24477 if( c==0 ){ 24478 return 1; 24479 }else if( c=='[' ){ 24480 while( *z && testcase_glob(zGlob-1,z)==0 ){ 24481 z++; 24482 } 24483 return (*z)!=0; 24484 } 24485 while( (c2 = (*(z++)))!=0 ){ 24486 while( c2!=c ){ 24487 c2 = *(z++); 24488 if( c2==0 ) return 0; 24489 } 24490 if( testcase_glob(zGlob,z) ) return 1; 24491 } 24492 return 0; 24493 }else if( c=='?' ){ 24494 if( (*(z++))==0 ) return 0; 24495 }else if( c=='[' ){ 24496 int prior_c = 0; 24497 seen = 0; 24498 invert = 0; 24499 c = *(z++); 24500 if( c==0 ) return 0; 24501 c2 = *(zGlob++); 24502 if( c2=='^' ){ 24503 invert = 1; 24504 c2 = *(zGlob++); 24505 } 24506 if( c2==']' ){ 24507 if( c==']' ) seen = 1; 24508 c2 = *(zGlob++); 24509 } 24510 while( c2 && c2!=']' ){ 24511 if( c2=='-' && zGlob[0]!=']' && zGlob[0]!=0 && prior_c>0 ){ 24512 c2 = *(zGlob++); 24513 if( c>=prior_c && c<=c2 ) seen = 1; 24514 prior_c = 0; 24515 }else{ 24516 if( c==c2 ){ 24517 seen = 1; 24518 } 24519 prior_c = c2; 24520 } 24521 c2 = *(zGlob++); 24522 } 24523 if( c2==0 || (seen ^ invert)==0 ) return 0; 24524 }else if( c=='#' ){ 24525 if( (z[0]=='-' || z[0]=='+') && IsDigit(z[1]) ) z++; 24526 if( !IsDigit(z[0]) ) return 0; 24527 z++; 24528 while( IsDigit(z[0]) ){ z++; } 24529 }else{ 24530 if( c!=(*(z++)) ) return 0; 24531 } 24532 } 24533 while( IsSpace(*z) ){ z++; } 24534 return *z==0; 24535 } 24536 24537 24538 /* 24539 ** Compare the string as a command-line option with either one or two 24540 ** initial "-" characters. 24541 */ 24542 static int optionMatch(const char *zStr, const char *zOpt){ 24543 if( zStr[0]!='-' ) return 0; 24544 zStr++; 24545 if( zStr[0]=='-' ) zStr++; 24546 return cli_strcmp(zStr, zOpt)==0; 24547 } 24548 24549 /* 24550 ** Delete a file. 24551 */ 24552 int shellDeleteFile(const char *zFilename){ 24553 int rc; 24554 #ifdef _WIN32 24555 wchar_t *z = sqlite3_win32_utf8_to_unicode(zFilename); 24556 rc = _wunlink(z); 24557 sqlite3_free(z); 24558 #else 24559 rc = unlink(zFilename); 24560 #endif 24561 return rc; 24562 } 24563 24564 /* 24565 ** Try to delete the temporary file (if there is one) and free the 24566 ** memory used to hold the name of the temp file. 24567 */ 24568 static void clearTempFile(ShellState *p){ 24569 if( p->zTempFile==0 ) return; 24570 if( p->doXdgOpen ) return; 24571 if( shellDeleteFile(p->zTempFile) ) return; 24572 sqlite3_free(p->zTempFile); 24573 p->zTempFile = 0; 24574 } 24575 24576 /* 24577 ** Create a new temp file name with the given suffix. 24578 */ 24579 static void newTempFile(ShellState *p, const char *zSuffix){ 24580 clearTempFile(p); 24581 sqlite3_free(p->zTempFile); 24582 p->zTempFile = 0; 24583 if( p->db ){ 24584 sqlite3_file_control(p->db, 0, SQLITE_FCNTL_TEMPFILENAME, &p->zTempFile); 24585 } 24586 if( p->zTempFile==0 ){ 24587 /* If p->db is an in-memory database then the TEMPFILENAME file-control 24588 ** will not work and we will need to fallback to guessing */ 24589 char *zTemp; 24590 sqlite3_uint64 r; 24591 sqlite3_randomness(sizeof(r), &r); 24592 zTemp = getenv("TEMP"); 24593 if( zTemp==0 ) zTemp = getenv("TMP"); 24594 if( zTemp==0 ){ 24595 #ifdef _WIN32 24596 zTemp = "\\tmp"; 24597 #else 24598 zTemp = "/tmp"; 24599 #endif 24600 } 24601 p->zTempFile = sqlite3_mprintf("%s/temp%llx.%s", zTemp, r, zSuffix); 24602 }else{ 24603 p->zTempFile = sqlite3_mprintf("%z.%s", p->zTempFile, zSuffix); 24604 } 24605 shell_check_oom(p->zTempFile); 24606 } 24607 24608 24609 /* 24610 ** The implementation of SQL scalar function fkey_collate_clause(), used 24611 ** by the ".lint fkey-indexes" command. This scalar function is always 24612 ** called with four arguments - the parent table name, the parent column name, 24613 ** the child table name and the child column name. 24614 ** 24615 ** fkey_collate_clause('parent-tab', 'parent-col', 'child-tab', 'child-col') 24616 ** 24617 ** If either of the named tables or columns do not exist, this function 24618 ** returns an empty string. An empty string is also returned if both tables 24619 ** and columns exist but have the same default collation sequence. Or, 24620 ** if both exist but the default collation sequences are different, this 24621 ** function returns the string " COLLATE <parent-collation>", where 24622 ** <parent-collation> is the default collation sequence of the parent column. 24623 */ 24624 static void shellFkeyCollateClause( 24625 sqlite3_context *pCtx, 24626 int nVal, 24627 sqlite3_value **apVal 24628 ){ 24629 sqlite3 *db = sqlite3_context_db_handle(pCtx); 24630 const char *zParent; 24631 const char *zParentCol; 24632 const char *zParentSeq; 24633 const char *zChild; 24634 const char *zChildCol; 24635 const char *zChildSeq = 0; /* Initialize to avoid false-positive warning */ 24636 int rc; 24637 24638 assert( nVal==4 ); 24639 zParent = (const char*)sqlite3_value_text(apVal[0]); 24640 zParentCol = (const char*)sqlite3_value_text(apVal[1]); 24641 zChild = (const char*)sqlite3_value_text(apVal[2]); 24642 zChildCol = (const char*)sqlite3_value_text(apVal[3]); 24643 24644 sqlite3_result_text(pCtx, "", -1, SQLITE_STATIC); 24645 rc = sqlite3_table_column_metadata( 24646 db, "main", zParent, zParentCol, 0, &zParentSeq, 0, 0, 0 24647 ); 24648 if( rc==SQLITE_OK ){ 24649 rc = sqlite3_table_column_metadata( 24650 db, "main", zChild, zChildCol, 0, &zChildSeq, 0, 0, 0 24651 ); 24652 } 24653 24654 if( rc==SQLITE_OK && sqlite3_stricmp(zParentSeq, zChildSeq) ){ 24655 char *z = sqlite3_mprintf(" COLLATE %s", zParentSeq); 24656 sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT); 24657 sqlite3_free(z); 24658 } 24659 } 24660 24661 24662 /* 24663 ** The implementation of dot-command ".lint fkey-indexes". 24664 */ 24665 static int lintFkeyIndexes( 24666 ShellState *pState, /* Current shell tool state */ 24667 char **azArg, /* Array of arguments passed to dot command */ 24668 int nArg /* Number of entries in azArg[] */ 24669 ){ 24670 sqlite3 *db = pState->db; /* Database handle to query "main" db of */ 24671 int bVerbose = 0; /* If -verbose is present */ 24672 int bGroupByParent = 0; /* If -groupbyparent is present */ 24673 int i; /* To iterate through azArg[] */ 24674 const char *zIndent = ""; /* How much to indent CREATE INDEX by */ 24675 int rc; /* Return code */ 24676 sqlite3_stmt *pSql = 0; /* Compiled version of SQL statement below */ 24677 24678 /* 24679 ** This SELECT statement returns one row for each foreign key constraint 24680 ** in the schema of the main database. The column values are: 24681 ** 24682 ** 0. The text of an SQL statement similar to: 24683 ** 24684 ** "EXPLAIN QUERY PLAN SELECT 1 FROM child_table WHERE child_key=?" 24685 ** 24686 ** This SELECT is similar to the one that the foreign keys implementation 24687 ** needs to run internally on child tables. If there is an index that can 24688 ** be used to optimize this query, then it can also be used by the FK 24689 ** implementation to optimize DELETE or UPDATE statements on the parent 24690 ** table. 24691 ** 24692 ** 1. A GLOB pattern suitable for sqlite3_strglob(). If the plan output by 24693 ** the EXPLAIN QUERY PLAN command matches this pattern, then the schema 24694 ** contains an index that can be used to optimize the query. 24695 ** 24696 ** 2. Human readable text that describes the child table and columns. e.g. 24697 ** 24698 ** "child_table(child_key1, child_key2)" 24699 ** 24700 ** 3. Human readable text that describes the parent table and columns. e.g. 24701 ** 24702 ** "parent_table(parent_key1, parent_key2)" 24703 ** 24704 ** 4. A full CREATE INDEX statement for an index that could be used to 24705 ** optimize DELETE or UPDATE statements on the parent table. e.g. 24706 ** 24707 ** "CREATE INDEX child_table_child_key ON child_table(child_key)" 24708 ** 24709 ** 5. The name of the parent table. 24710 ** 24711 ** These six values are used by the C logic below to generate the report. 24712 */ 24713 const char *zSql = 24714 "SELECT " 24715 " 'EXPLAIN QUERY PLAN SELECT 1 FROM ' || quote(s.name) || ' WHERE '" 24716 " || group_concat(quote(s.name) || '.' || quote(f.[from]) || '=?' " 24717 " || fkey_collate_clause(" 24718 " f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]),' AND ')" 24719 ", " 24720 " 'SEARCH ' || s.name || ' USING COVERING INDEX*('" 24721 " || group_concat('*=?', ' AND ') || ')'" 24722 ", " 24723 " s.name || '(' || group_concat(f.[from], ', ') || ')'" 24724 ", " 24725 " f.[table] || '(' || group_concat(COALESCE(f.[to], p.[name])) || ')'" 24726 ", " 24727 " 'CREATE INDEX ' || quote(s.name ||'_'|| group_concat(f.[from], '_'))" 24728 " || ' ON ' || quote(s.name) || '('" 24729 " || group_concat(quote(f.[from]) ||" 24730 " fkey_collate_clause(" 24731 " f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]), ', ')" 24732 " || ');'" 24733 ", " 24734 " f.[table] " 24735 "FROM sqlite_schema AS s, pragma_foreign_key_list(s.name) AS f " 24736 "LEFT JOIN pragma_table_info AS p ON (pk-1=seq AND p.arg=f.[table]) " 24737 "GROUP BY s.name, f.id " 24738 "ORDER BY (CASE WHEN ? THEN f.[table] ELSE s.name END)" 24739 ; 24740 const char *zGlobIPK = "SEARCH * USING INTEGER PRIMARY KEY (rowid=?)"; 24741 24742 for(i=2; i<nArg; i++){ 24743 int n = strlen30(azArg[i]); 24744 if( n>1 && sqlite3_strnicmp("-verbose", azArg[i], n)==0 ){ 24745 bVerbose = 1; 24746 } 24747 else if( n>1 && sqlite3_strnicmp("-groupbyparent", azArg[i], n)==0 ){ 24748 bGroupByParent = 1; 24749 zIndent = " "; 24750 } 24751 else{ 24752 eputf("Usage: %s %s ?-verbose? ?-groupbyparent?\n", azArg[0], azArg[1]); 24753 return SQLITE_ERROR; 24754 } 24755 } 24756 24757 /* Register the fkey_collate_clause() SQL function */ 24758 rc = sqlite3_create_function(db, "fkey_collate_clause", 4, SQLITE_UTF8, 24759 0, shellFkeyCollateClause, 0, 0 24760 ); 24761 24762 24763 if( rc==SQLITE_OK ){ 24764 rc = sqlite3_prepare_v2(db, zSql, -1, &pSql, 0); 24765 } 24766 if( rc==SQLITE_OK ){ 24767 sqlite3_bind_int(pSql, 1, bGroupByParent); 24768 } 24769 24770 if( rc==SQLITE_OK ){ 24771 int rc2; 24772 char *zPrev = 0; 24773 while( SQLITE_ROW==sqlite3_step(pSql) ){ 24774 int res = -1; 24775 sqlite3_stmt *pExplain = 0; 24776 const char *zEQP = (const char*)sqlite3_column_text(pSql, 0); 24777 const char *zGlob = (const char*)sqlite3_column_text(pSql, 1); 24778 const char *zFrom = (const char*)sqlite3_column_text(pSql, 2); 24779 const char *zTarget = (const char*)sqlite3_column_text(pSql, 3); 24780 const char *zCI = (const char*)sqlite3_column_text(pSql, 4); 24781 const char *zParent = (const char*)sqlite3_column_text(pSql, 5); 24782 24783 if( zEQP==0 ) continue; 24784 if( zGlob==0 ) continue; 24785 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0); 24786 if( rc!=SQLITE_OK ) break; 24787 if( SQLITE_ROW==sqlite3_step(pExplain) ){ 24788 const char *zPlan = (const char*)sqlite3_column_text(pExplain, 3); 24789 res = zPlan!=0 && ( 0==sqlite3_strglob(zGlob, zPlan) 24790 || 0==sqlite3_strglob(zGlobIPK, zPlan)); 24791 } 24792 rc = sqlite3_finalize(pExplain); 24793 if( rc!=SQLITE_OK ) break; 24794 24795 if( res<0 ){ 24796 eputz("Error: internal error"); 24797 break; 24798 }else{ 24799 if( bGroupByParent 24800 && (bVerbose || res==0) 24801 && (zPrev==0 || sqlite3_stricmp(zParent, zPrev)) 24802 ){ 24803 oputf("-- Parent table %s\n", zParent); 24804 sqlite3_free(zPrev); 24805 zPrev = sqlite3_mprintf("%s", zParent); 24806 } 24807 24808 if( res==0 ){ 24809 oputf("%s%s --> %s\n", zIndent, zCI, zTarget); 24810 }else if( bVerbose ){ 24811 oputf("%s/* no extra indexes required for %s -> %s */\n", 24812 zIndent, zFrom, zTarget 24813 ); 24814 } 24815 } 24816 } 24817 sqlite3_free(zPrev); 24818 24819 if( rc!=SQLITE_OK ){ 24820 eputf("%s\n", sqlite3_errmsg(db)); 24821 } 24822 24823 rc2 = sqlite3_finalize(pSql); 24824 if( rc==SQLITE_OK && rc2!=SQLITE_OK ){ 24825 rc = rc2; 24826 eputf("%s\n", sqlite3_errmsg(db)); 24827 } 24828 }else{ 24829 eputf("%s\n", sqlite3_errmsg(db)); 24830 } 24831 24832 return rc; 24833 } 24834 24835 /* 24836 ** Implementation of ".lint" dot command. 24837 */ 24838 static int lintDotCommand( 24839 ShellState *pState, /* Current shell tool state */ 24840 char **azArg, /* Array of arguments passed to dot command */ 24841 int nArg /* Number of entries in azArg[] */ 24842 ){ 24843 int n; 24844 n = (nArg>=2 ? strlen30(azArg[1]) : 0); 24845 if( n<1 || sqlite3_strnicmp(azArg[1], "fkey-indexes", n) ) goto usage; 24846 return lintFkeyIndexes(pState, azArg, nArg); 24847 24848 usage: 24849 eputf("Usage %s sub-command ?switches...?\n", azArg[0]); 24850 eputz("Where sub-commands are:\n"); 24851 eputz(" fkey-indexes\n"); 24852 return SQLITE_ERROR; 24853 } 24854 24855 static void shellPrepare( 24856 sqlite3 *db, 24857 int *pRc, 24858 const char *zSql, 24859 sqlite3_stmt **ppStmt 24860 ){ 24861 *ppStmt = 0; 24862 if( *pRc==SQLITE_OK ){ 24863 int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0); 24864 if( rc!=SQLITE_OK ){ 24865 eputf("sql error: %s (%d)\n", sqlite3_errmsg(db), sqlite3_errcode(db)); 24866 *pRc = rc; 24867 } 24868 } 24869 } 24870 24871 /* 24872 ** Create a prepared statement using printf-style arguments for the SQL. 24873 */ 24874 static void shellPreparePrintf( 24875 sqlite3 *db, 24876 int *pRc, 24877 sqlite3_stmt **ppStmt, 24878 const char *zFmt, 24879 ... 24880 ){ 24881 *ppStmt = 0; 24882 if( *pRc==SQLITE_OK ){ 24883 va_list ap; 24884 char *z; 24885 va_start(ap, zFmt); 24886 z = sqlite3_vmprintf(zFmt, ap); 24887 va_end(ap); 24888 if( z==0 ){ 24889 *pRc = SQLITE_NOMEM; 24890 }else{ 24891 shellPrepare(db, pRc, z, ppStmt); 24892 sqlite3_free(z); 24893 } 24894 } 24895 } 24896 24897 /* 24898 ** Finalize the prepared statement created using shellPreparePrintf(). 24899 */ 24900 static void shellFinalize( 24901 int *pRc, 24902 sqlite3_stmt *pStmt 24903 ){ 24904 if( pStmt ){ 24905 sqlite3 *db = sqlite3_db_handle(pStmt); 24906 int rc = sqlite3_finalize(pStmt); 24907 if( *pRc==SQLITE_OK ){ 24908 if( rc!=SQLITE_OK ){ 24909 eputf("SQL error: %s\n", sqlite3_errmsg(db)); 24910 } 24911 *pRc = rc; 24912 } 24913 } 24914 } 24915 24916 #if !defined SQLITE_OMIT_VIRTUALTABLE 24917 /* Reset the prepared statement created using shellPreparePrintf(). 24918 ** 24919 ** This routine is could be marked "static". But it is not always used, 24920 ** depending on compile-time options. By omitting the "static", we avoid 24921 ** nuisance compiler warnings about "defined but not used". 24922 */ 24923 void shellReset( 24924 int *pRc, 24925 sqlite3_stmt *pStmt 24926 ){ 24927 int rc = sqlite3_reset(pStmt); 24928 if( *pRc==SQLITE_OK ){ 24929 if( rc!=SQLITE_OK ){ 24930 sqlite3 *db = sqlite3_db_handle(pStmt); 24931 eputf("SQL error: %s\n", sqlite3_errmsg(db)); 24932 } 24933 *pRc = rc; 24934 } 24935 } 24936 #endif /* !defined SQLITE_OMIT_VIRTUALTABLE */ 24937 24938 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) 24939 /****************************************************************************** 24940 ** The ".archive" or ".ar" command. 24941 */ 24942 /* 24943 ** Structure representing a single ".ar" command. 24944 */ 24945 typedef struct ArCommand ArCommand; 24946 struct ArCommand { 24947 u8 eCmd; /* An AR_CMD_* value */ 24948 u8 bVerbose; /* True if --verbose */ 24949 u8 bZip; /* True if the archive is a ZIP */ 24950 u8 bDryRun; /* True if --dry-run */ 24951 u8 bAppend; /* True if --append */ 24952 u8 bGlob; /* True if --glob */ 24953 u8 fromCmdLine; /* Run from -A instead of .archive */ 24954 int nArg; /* Number of command arguments */ 24955 char *zSrcTable; /* "sqlar", "zipfile($file)" or "zip" */ 24956 const char *zFile; /* --file argument, or NULL */ 24957 const char *zDir; /* --directory argument, or NULL */ 24958 char **azArg; /* Array of command arguments */ 24959 ShellState *p; /* Shell state */ 24960 sqlite3 *db; /* Database containing the archive */ 24961 }; 24962 24963 /* 24964 ** Print a usage message for the .ar command to stderr and return SQLITE_ERROR. 24965 */ 24966 static int arUsage(FILE *f){ 24967 showHelp(f,"archive"); 24968 return SQLITE_ERROR; 24969 } 24970 24971 /* 24972 ** Print an error message for the .ar command to stderr and return 24973 ** SQLITE_ERROR. 24974 */ 24975 static int arErrorMsg(ArCommand *pAr, const char *zFmt, ...){ 24976 va_list ap; 24977 char *z; 24978 va_start(ap, zFmt); 24979 z = sqlite3_vmprintf(zFmt, ap); 24980 va_end(ap); 24981 eputf("Error: %s\n", z); 24982 if( pAr->fromCmdLine ){ 24983 eputz("Use \"-A\" for more help\n"); 24984 }else{ 24985 eputz("Use \".archive --help\" for more help\n"); 24986 } 24987 sqlite3_free(z); 24988 return SQLITE_ERROR; 24989 } 24990 24991 /* 24992 ** Values for ArCommand.eCmd. 24993 */ 24994 #define AR_CMD_CREATE 1 24995 #define AR_CMD_UPDATE 2 24996 #define AR_CMD_INSERT 3 24997 #define AR_CMD_EXTRACT 4 24998 #define AR_CMD_LIST 5 24999 #define AR_CMD_HELP 6 25000 #define AR_CMD_REMOVE 7 25001 25002 /* 25003 ** Other (non-command) switches. 25004 */ 25005 #define AR_SWITCH_VERBOSE 8 25006 #define AR_SWITCH_FILE 9 25007 #define AR_SWITCH_DIRECTORY 10 25008 #define AR_SWITCH_APPEND 11 25009 #define AR_SWITCH_DRYRUN 12 25010 #define AR_SWITCH_GLOB 13 25011 25012 static int arProcessSwitch(ArCommand *pAr, int eSwitch, const char *zArg){ 25013 switch( eSwitch ){ 25014 case AR_CMD_CREATE: 25015 case AR_CMD_EXTRACT: 25016 case AR_CMD_LIST: 25017 case AR_CMD_REMOVE: 25018 case AR_CMD_UPDATE: 25019 case AR_CMD_INSERT: 25020 case AR_CMD_HELP: 25021 if( pAr->eCmd ){ 25022 return arErrorMsg(pAr, "multiple command options"); 25023 } 25024 pAr->eCmd = eSwitch; 25025 break; 25026 25027 case AR_SWITCH_DRYRUN: 25028 pAr->bDryRun = 1; 25029 break; 25030 case AR_SWITCH_GLOB: 25031 pAr->bGlob = 1; 25032 break; 25033 case AR_SWITCH_VERBOSE: 25034 pAr->bVerbose = 1; 25035 break; 25036 case AR_SWITCH_APPEND: 25037 pAr->bAppend = 1; 25038 deliberate_fall_through; 25039 case AR_SWITCH_FILE: 25040 pAr->zFile = zArg; 25041 break; 25042 case AR_SWITCH_DIRECTORY: 25043 pAr->zDir = zArg; 25044 break; 25045 } 25046 25047 return SQLITE_OK; 25048 } 25049 25050 /* 25051 ** Parse the command line for an ".ar" command. The results are written into 25052 ** structure (*pAr). SQLITE_OK is returned if the command line is parsed 25053 ** successfully, otherwise an error message is written to stderr and 25054 ** SQLITE_ERROR returned. 25055 */ 25056 static int arParseCommand( 25057 char **azArg, /* Array of arguments passed to dot command */ 25058 int nArg, /* Number of entries in azArg[] */ 25059 ArCommand *pAr /* Populate this object */ 25060 ){ 25061 struct ArSwitch { 25062 const char *zLong; 25063 char cShort; 25064 u8 eSwitch; 25065 u8 bArg; 25066 } aSwitch[] = { 25067 { "create", 'c', AR_CMD_CREATE, 0 }, 25068 { "extract", 'x', AR_CMD_EXTRACT, 0 }, 25069 { "insert", 'i', AR_CMD_INSERT, 0 }, 25070 { "list", 't', AR_CMD_LIST, 0 }, 25071 { "remove", 'r', AR_CMD_REMOVE, 0 }, 25072 { "update", 'u', AR_CMD_UPDATE, 0 }, 25073 { "help", 'h', AR_CMD_HELP, 0 }, 25074 { "verbose", 'v', AR_SWITCH_VERBOSE, 0 }, 25075 { "file", 'f', AR_SWITCH_FILE, 1 }, 25076 { "append", 'a', AR_SWITCH_APPEND, 1 }, 25077 { "directory", 'C', AR_SWITCH_DIRECTORY, 1 }, 25078 { "dryrun", 'n', AR_SWITCH_DRYRUN, 0 }, 25079 { "glob", 'g', AR_SWITCH_GLOB, 0 }, 25080 }; 25081 int nSwitch = sizeof(aSwitch) / sizeof(struct ArSwitch); 25082 struct ArSwitch *pEnd = &aSwitch[nSwitch]; 25083 25084 if( nArg<=1 ){ 25085 eputz("Wrong number of arguments. Usage:\n"); 25086 return arUsage(stderr); 25087 }else{ 25088 char *z = azArg[1]; 25089 if( z[0]!='-' ){ 25090 /* Traditional style [tar] invocation */ 25091 int i; 25092 int iArg = 2; 25093 for(i=0; z[i]; i++){ 25094 const char *zArg = 0; 25095 struct ArSwitch *pOpt; 25096 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){ 25097 if( z[i]==pOpt->cShort ) break; 25098 } 25099 if( pOpt==pEnd ){ 25100 return arErrorMsg(pAr, "unrecognized option: %c", z[i]); 25101 } 25102 if( pOpt->bArg ){ 25103 if( iArg>=nArg ){ 25104 return arErrorMsg(pAr, "option requires an argument: %c",z[i]); 25105 } 25106 zArg = azArg[iArg++]; 25107 } 25108 if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR; 25109 } 25110 pAr->nArg = nArg-iArg; 25111 if( pAr->nArg>0 ){ 25112 pAr->azArg = &azArg[iArg]; 25113 } 25114 }else{ 25115 /* Non-traditional invocation */ 25116 int iArg; 25117 for(iArg=1; iArg<nArg; iArg++){ 25118 int n; 25119 z = azArg[iArg]; 25120 if( z[0]!='-' ){ 25121 /* All remaining command line words are command arguments. */ 25122 pAr->azArg = &azArg[iArg]; 25123 pAr->nArg = nArg-iArg; 25124 break; 25125 } 25126 n = strlen30(z); 25127 25128 if( z[1]!='-' ){ 25129 int i; 25130 /* One or more short options */ 25131 for(i=1; i<n; i++){ 25132 const char *zArg = 0; 25133 struct ArSwitch *pOpt; 25134 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){ 25135 if( z[i]==pOpt->cShort ) break; 25136 } 25137 if( pOpt==pEnd ){ 25138 return arErrorMsg(pAr, "unrecognized option: %c", z[i]); 25139 } 25140 if( pOpt->bArg ){ 25141 if( i<(n-1) ){ 25142 zArg = &z[i+1]; 25143 i = n; 25144 }else{ 25145 if( iArg>=(nArg-1) ){ 25146 return arErrorMsg(pAr, "option requires an argument: %c", 25147 z[i]); 25148 } 25149 zArg = azArg[++iArg]; 25150 } 25151 } 25152 if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR; 25153 } 25154 }else if( z[2]=='\0' ){ 25155 /* A -- option, indicating that all remaining command line words 25156 ** are command arguments. */ 25157 pAr->azArg = &azArg[iArg+1]; 25158 pAr->nArg = nArg-iArg-1; 25159 break; 25160 }else{ 25161 /* A long option */ 25162 const char *zArg = 0; /* Argument for option, if any */ 25163 struct ArSwitch *pMatch = 0; /* Matching option */ 25164 struct ArSwitch *pOpt; /* Iterator */ 25165 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){ 25166 const char *zLong = pOpt->zLong; 25167 if( (n-2)<=strlen30(zLong) && 0==memcmp(&z[2], zLong, n-2) ){ 25168 if( pMatch ){ 25169 return arErrorMsg(pAr, "ambiguous option: %s",z); 25170 }else{ 25171 pMatch = pOpt; 25172 } 25173 } 25174 } 25175 25176 if( pMatch==0 ){ 25177 return arErrorMsg(pAr, "unrecognized option: %s", z); 25178 } 25179 if( pMatch->bArg ){ 25180 if( iArg>=(nArg-1) ){ 25181 return arErrorMsg(pAr, "option requires an argument: %s", z); 25182 } 25183 zArg = azArg[++iArg]; 25184 } 25185 if( arProcessSwitch(pAr, pMatch->eSwitch, zArg) ) return SQLITE_ERROR; 25186 } 25187 } 25188 } 25189 } 25190 if( pAr->eCmd==0 ){ 25191 eputz("Required argument missing. Usage:\n"); 25192 return arUsage(stderr); 25193 } 25194 return SQLITE_OK; 25195 } 25196 25197 /* 25198 ** This function assumes that all arguments within the ArCommand.azArg[] 25199 ** array refer to archive members, as for the --extract, --list or --remove 25200 ** commands. It checks that each of them are "present". If any specified 25201 ** file is not present in the archive, an error is printed to stderr and an 25202 ** error code returned. Otherwise, if all specified arguments are present 25203 ** in the archive, SQLITE_OK is returned. Here, "present" means either an 25204 ** exact equality when pAr->bGlob is false or a "name GLOB pattern" match 25205 ** when pAr->bGlob is true. 25206 ** 25207 ** This function strips any trailing '/' characters from each argument. 25208 ** This is consistent with the way the [tar] command seems to work on 25209 ** Linux. 25210 */ 25211 static int arCheckEntries(ArCommand *pAr){ 25212 int rc = SQLITE_OK; 25213 if( pAr->nArg ){ 25214 int i, j; 25215 sqlite3_stmt *pTest = 0; 25216 const char *zSel = (pAr->bGlob) 25217 ? "SELECT name FROM %s WHERE glob($name,name)" 25218 : "SELECT name FROM %s WHERE name=$name"; 25219 25220 shellPreparePrintf(pAr->db, &rc, &pTest, zSel, pAr->zSrcTable); 25221 j = sqlite3_bind_parameter_index(pTest, "$name"); 25222 for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){ 25223 char *z = pAr->azArg[i]; 25224 int n = strlen30(z); 25225 int bOk = 0; 25226 while( n>0 && z[n-1]=='/' ) n--; 25227 z[n] = '\0'; 25228 sqlite3_bind_text(pTest, j, z, -1, SQLITE_STATIC); 25229 if( SQLITE_ROW==sqlite3_step(pTest) ){ 25230 bOk = 1; 25231 } 25232 shellReset(&rc, pTest); 25233 if( rc==SQLITE_OK && bOk==0 ){ 25234 eputf("not found in archive: %s\n", z); 25235 rc = SQLITE_ERROR; 25236 } 25237 } 25238 shellFinalize(&rc, pTest); 25239 } 25240 return rc; 25241 } 25242 25243 /* 25244 ** Format a WHERE clause that can be used against the "sqlar" table to 25245 ** identify all archive members that match the command arguments held 25246 ** in (*pAr). Leave this WHERE clause in (*pzWhere) before returning. 25247 ** The caller is responsible for eventually calling sqlite3_free() on 25248 ** any non-NULL (*pzWhere) value. Here, "match" means strict equality 25249 ** when pAr->bGlob is false and GLOB match when pAr->bGlob is true. 25250 */ 25251 static void arWhereClause( 25252 int *pRc, 25253 ArCommand *pAr, 25254 char **pzWhere /* OUT: New WHERE clause */ 25255 ){ 25256 char *zWhere = 0; 25257 const char *zSameOp = (pAr->bGlob)? "GLOB" : "="; 25258 if( *pRc==SQLITE_OK ){ 25259 if( pAr->nArg==0 ){ 25260 zWhere = sqlite3_mprintf("1"); 25261 }else{ 25262 int i; 25263 const char *zSep = ""; 25264 for(i=0; i<pAr->nArg; i++){ 25265 const char *z = pAr->azArg[i]; 25266 zWhere = sqlite3_mprintf( 25267 "%z%s name %s '%q' OR substr(name,1,%d) %s '%q/'", 25268 zWhere, zSep, zSameOp, z, strlen30(z)+1, zSameOp, z 25269 ); 25270 if( zWhere==0 ){ 25271 *pRc = SQLITE_NOMEM; 25272 break; 25273 } 25274 zSep = " OR "; 25275 } 25276 } 25277 } 25278 *pzWhere = zWhere; 25279 } 25280 25281 /* 25282 ** Implementation of .ar "lisT" command. 25283 */ 25284 static int arListCommand(ArCommand *pAr){ 25285 const char *zSql = "SELECT %s FROM %s WHERE %s"; 25286 const char *azCols[] = { 25287 "name", 25288 "lsmode(mode), sz, datetime(mtime, 'unixepoch'), name" 25289 }; 25290 25291 char *zWhere = 0; 25292 sqlite3_stmt *pSql = 0; 25293 int rc; 25294 25295 rc = arCheckEntries(pAr); 25296 arWhereClause(&rc, pAr, &zWhere); 25297 25298 shellPreparePrintf(pAr->db, &rc, &pSql, zSql, azCols[pAr->bVerbose], 25299 pAr->zSrcTable, zWhere); 25300 if( pAr->bDryRun ){ 25301 oputf("%s\n", sqlite3_sql(pSql)); 25302 }else{ 25303 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){ 25304 if( pAr->bVerbose ){ 25305 oputf("%s % 10d %s %s\n", 25306 sqlite3_column_text(pSql, 0), sqlite3_column_int(pSql, 1), 25307 sqlite3_column_text(pSql, 2),sqlite3_column_text(pSql, 3)); 25308 }else{ 25309 oputf("%s\n", sqlite3_column_text(pSql, 0)); 25310 } 25311 } 25312 } 25313 shellFinalize(&rc, pSql); 25314 sqlite3_free(zWhere); 25315 return rc; 25316 } 25317 25318 /* 25319 ** Implementation of .ar "Remove" command. 25320 */ 25321 static int arRemoveCommand(ArCommand *pAr){ 25322 int rc = 0; 25323 char *zSql = 0; 25324 char *zWhere = 0; 25325 25326 if( pAr->nArg ){ 25327 /* Verify that args actually exist within the archive before proceeding. 25328 ** And formulate a WHERE clause to match them. */ 25329 rc = arCheckEntries(pAr); 25330 arWhereClause(&rc, pAr, &zWhere); 25331 } 25332 if( rc==SQLITE_OK ){ 25333 zSql = sqlite3_mprintf("DELETE FROM %s WHERE %s;", 25334 pAr->zSrcTable, zWhere); 25335 if( pAr->bDryRun ){ 25336 oputf("%s\n", zSql); 25337 }else{ 25338 char *zErr = 0; 25339 rc = sqlite3_exec(pAr->db, "SAVEPOINT ar;", 0, 0, 0); 25340 if( rc==SQLITE_OK ){ 25341 rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr); 25342 if( rc!=SQLITE_OK ){ 25343 sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0); 25344 }else{ 25345 rc = sqlite3_exec(pAr->db, "RELEASE ar;", 0, 0, 0); 25346 } 25347 } 25348 if( zErr ){ 25349 sputf(stdout, "ERROR: %s\n", zErr); /* stdout? */ 25350 sqlite3_free(zErr); 25351 } 25352 } 25353 } 25354 sqlite3_free(zWhere); 25355 sqlite3_free(zSql); 25356 return rc; 25357 } 25358 25359 /* 25360 ** Implementation of .ar "eXtract" command. 25361 */ 25362 static int arExtractCommand(ArCommand *pAr){ 25363 const char *zSql1 = 25364 "SELECT " 25365 " ($dir || name)," 25366 " writefile(($dir || name), %s, mode, mtime) " 25367 "FROM %s WHERE (%s) AND (data IS NULL OR $dirOnly = 0)" 25368 " AND name NOT GLOB '*..[/\\]*'"; 25369 25370 const char *azExtraArg[] = { 25371 "sqlar_uncompress(data, sz)", 25372 "data" 25373 }; 25374 25375 sqlite3_stmt *pSql = 0; 25376 int rc = SQLITE_OK; 25377 char *zDir = 0; 25378 char *zWhere = 0; 25379 int i, j; 25380 25381 /* If arguments are specified, check that they actually exist within 25382 ** the archive before proceeding. And formulate a WHERE clause to 25383 ** match them. */ 25384 rc = arCheckEntries(pAr); 25385 arWhereClause(&rc, pAr, &zWhere); 25386 25387 if( rc==SQLITE_OK ){ 25388 if( pAr->zDir ){ 25389 zDir = sqlite3_mprintf("%s/", pAr->zDir); 25390 }else{ 25391 zDir = sqlite3_mprintf(""); 25392 } 25393 if( zDir==0 ) rc = SQLITE_NOMEM; 25394 } 25395 25396 shellPreparePrintf(pAr->db, &rc, &pSql, zSql1, 25397 azExtraArg[pAr->bZip], pAr->zSrcTable, zWhere 25398 ); 25399 25400 if( rc==SQLITE_OK ){ 25401 j = sqlite3_bind_parameter_index(pSql, "$dir"); 25402 sqlite3_bind_text(pSql, j, zDir, -1, SQLITE_STATIC); 25403 25404 /* Run the SELECT statement twice. The first time, writefile() is called 25405 ** for all archive members that should be extracted. The second time, 25406 ** only for the directories. This is because the timestamps for 25407 ** extracted directories must be reset after they are populated (as 25408 ** populating them changes the timestamp). */ 25409 for(i=0; i<2; i++){ 25410 j = sqlite3_bind_parameter_index(pSql, "$dirOnly"); 25411 sqlite3_bind_int(pSql, j, i); 25412 if( pAr->bDryRun ){ 25413 oputf("%s\n", sqlite3_sql(pSql)); 25414 }else{ 25415 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){ 25416 if( i==0 && pAr->bVerbose ){ 25417 oputf("%s\n", sqlite3_column_text(pSql, 0)); 25418 } 25419 } 25420 } 25421 shellReset(&rc, pSql); 25422 } 25423 shellFinalize(&rc, pSql); 25424 } 25425 25426 sqlite3_free(zDir); 25427 sqlite3_free(zWhere); 25428 return rc; 25429 } 25430 25431 /* 25432 ** Run the SQL statement in zSql. Or if doing a --dryrun, merely print it out. 25433 */ 25434 static int arExecSql(ArCommand *pAr, const char *zSql){ 25435 int rc; 25436 if( pAr->bDryRun ){ 25437 oputf("%s\n", zSql); 25438 rc = SQLITE_OK; 25439 }else{ 25440 char *zErr = 0; 25441 rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr); 25442 if( zErr ){ 25443 sputf(stdout, "ERROR: %s\n", zErr); 25444 sqlite3_free(zErr); 25445 } 25446 } 25447 return rc; 25448 } 25449 25450 25451 /* 25452 ** Implementation of .ar "create", "insert", and "update" commands. 25453 ** 25454 ** create -> Create a new SQL archive 25455 ** insert -> Insert or reinsert all files listed 25456 ** update -> Insert files that have changed or that were not 25457 ** previously in the archive 25458 ** 25459 ** Create the "sqlar" table in the database if it does not already exist. 25460 ** Then add each file in the azFile[] array to the archive. Directories 25461 ** are added recursively. If argument bVerbose is non-zero, a message is 25462 ** printed on stdout for each file archived. 25463 ** 25464 ** The create command is the same as update, except that it drops 25465 ** any existing "sqlar" table before beginning. The "insert" command 25466 ** always overwrites every file named on the command-line, where as 25467 ** "update" only overwrites if the size or mtime or mode has changed. 25468 */ 25469 static int arCreateOrUpdateCommand( 25470 ArCommand *pAr, /* Command arguments and options */ 25471 int bUpdate, /* true for a --create. */ 25472 int bOnlyIfChanged /* Only update if file has changed */ 25473 ){ 25474 const char *zCreate = 25475 "CREATE TABLE IF NOT EXISTS sqlar(\n" 25476 " name TEXT PRIMARY KEY, -- name of the file\n" 25477 " mode INT, -- access permissions\n" 25478 " mtime INT, -- last modification time\n" 25479 " sz INT, -- original file size\n" 25480 " data BLOB -- compressed content\n" 25481 ")"; 25482 const char *zDrop = "DROP TABLE IF EXISTS sqlar"; 25483 const char *zInsertFmt[2] = { 25484 "REPLACE INTO %s(name,mode,mtime,sz,data)\n" 25485 " SELECT\n" 25486 " %s,\n" 25487 " mode,\n" 25488 " mtime,\n" 25489 " CASE substr(lsmode(mode),1,1)\n" 25490 " WHEN '-' THEN length(data)\n" 25491 " WHEN 'd' THEN 0\n" 25492 " ELSE -1 END,\n" 25493 " sqlar_compress(data)\n" 25494 " FROM fsdir(%Q,%Q) AS disk\n" 25495 " WHERE lsmode(mode) NOT LIKE '?%%'%s;" 25496 , 25497 "REPLACE INTO %s(name,mode,mtime,data)\n" 25498 " SELECT\n" 25499 " %s,\n" 25500 " mode,\n" 25501 " mtime,\n" 25502 " data\n" 25503 " FROM fsdir(%Q,%Q) AS disk\n" 25504 " WHERE lsmode(mode) NOT LIKE '?%%'%s;" 25505 }; 25506 int i; /* For iterating through azFile[] */ 25507 int rc; /* Return code */ 25508 const char *zTab = 0; /* SQL table into which to insert */ 25509 char *zSql; 25510 char zTemp[50]; 25511 char *zExists = 0; 25512 25513 arExecSql(pAr, "PRAGMA page_size=512"); 25514 rc = arExecSql(pAr, "SAVEPOINT ar;"); 25515 if( rc!=SQLITE_OK ) return rc; 25516 zTemp[0] = 0; 25517 if( pAr->bZip ){ 25518 /* Initialize the zipfile virtual table, if necessary */ 25519 if( pAr->zFile ){ 25520 sqlite3_uint64 r; 25521 sqlite3_randomness(sizeof(r),&r); 25522 sqlite3_snprintf(sizeof(zTemp),zTemp,"zip%016llx",r); 25523 zTab = zTemp; 25524 zSql = sqlite3_mprintf( 25525 "CREATE VIRTUAL TABLE temp.%s USING zipfile(%Q)", 25526 zTab, pAr->zFile 25527 ); 25528 rc = arExecSql(pAr, zSql); 25529 sqlite3_free(zSql); 25530 }else{ 25531 zTab = "zip"; 25532 } 25533 }else{ 25534 /* Initialize the table for an SQLAR */ 25535 zTab = "sqlar"; 25536 if( bUpdate==0 ){ 25537 rc = arExecSql(pAr, zDrop); 25538 if( rc!=SQLITE_OK ) goto end_ar_transaction; 25539 } 25540 rc = arExecSql(pAr, zCreate); 25541 } 25542 if( bOnlyIfChanged ){ 25543 zExists = sqlite3_mprintf( 25544 " AND NOT EXISTS(" 25545 "SELECT 1 FROM %s AS mem" 25546 " WHERE mem.name=disk.name" 25547 " AND mem.mtime=disk.mtime" 25548 " AND mem.mode=disk.mode)", zTab); 25549 }else{ 25550 zExists = sqlite3_mprintf(""); 25551 } 25552 if( zExists==0 ) rc = SQLITE_NOMEM; 25553 for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){ 25554 char *zSql2 = sqlite3_mprintf(zInsertFmt[pAr->bZip], zTab, 25555 pAr->bVerbose ? "shell_putsnl(name)" : "name", 25556 pAr->azArg[i], pAr->zDir, zExists); 25557 rc = arExecSql(pAr, zSql2); 25558 sqlite3_free(zSql2); 25559 } 25560 end_ar_transaction: 25561 if( rc!=SQLITE_OK ){ 25562 sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0); 25563 }else{ 25564 rc = arExecSql(pAr, "RELEASE ar;"); 25565 if( pAr->bZip && pAr->zFile ){ 25566 zSql = sqlite3_mprintf("DROP TABLE %s", zTemp); 25567 arExecSql(pAr, zSql); 25568 sqlite3_free(zSql); 25569 } 25570 } 25571 sqlite3_free(zExists); 25572 return rc; 25573 } 25574 25575 /* 25576 ** Implementation of ".ar" dot command. 25577 */ 25578 static int arDotCommand( 25579 ShellState *pState, /* Current shell tool state */ 25580 int fromCmdLine, /* True if -A command-line option, not .ar cmd */ 25581 char **azArg, /* Array of arguments passed to dot command */ 25582 int nArg /* Number of entries in azArg[] */ 25583 ){ 25584 ArCommand cmd; 25585 int rc; 25586 memset(&cmd, 0, sizeof(cmd)); 25587 cmd.fromCmdLine = fromCmdLine; 25588 rc = arParseCommand(azArg, nArg, &cmd); 25589 if( rc==SQLITE_OK ){ 25590 int eDbType = SHELL_OPEN_UNSPEC; 25591 cmd.p = pState; 25592 cmd.db = pState->db; 25593 if( cmd.zFile ){ 25594 eDbType = deduceDatabaseType(cmd.zFile, 1); 25595 }else{ 25596 eDbType = pState->openMode; 25597 } 25598 if( eDbType==SHELL_OPEN_ZIPFILE ){ 25599 if( cmd.eCmd==AR_CMD_EXTRACT || cmd.eCmd==AR_CMD_LIST ){ 25600 if( cmd.zFile==0 ){ 25601 cmd.zSrcTable = sqlite3_mprintf("zip"); 25602 }else{ 25603 cmd.zSrcTable = sqlite3_mprintf("zipfile(%Q)", cmd.zFile); 25604 } 25605 } 25606 cmd.bZip = 1; 25607 }else if( cmd.zFile ){ 25608 int flags; 25609 if( cmd.bAppend ) eDbType = SHELL_OPEN_APPENDVFS; 25610 if( cmd.eCmd==AR_CMD_CREATE || cmd.eCmd==AR_CMD_INSERT 25611 || cmd.eCmd==AR_CMD_REMOVE || cmd.eCmd==AR_CMD_UPDATE ){ 25612 flags = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE; 25613 }else{ 25614 flags = SQLITE_OPEN_READONLY; 25615 } 25616 cmd.db = 0; 25617 if( cmd.bDryRun ){ 25618 oputf("-- open database '%s'%s\n", cmd.zFile, 25619 eDbType==SHELL_OPEN_APPENDVFS ? " using 'apndvfs'" : ""); 25620 } 25621 rc = sqlite3_open_v2(cmd.zFile, &cmd.db, flags, 25622 eDbType==SHELL_OPEN_APPENDVFS ? "apndvfs" : 0); 25623 if( rc!=SQLITE_OK ){ 25624 eputf("cannot open file: %s (%s)\n", cmd.zFile, sqlite3_errmsg(cmd.db)); 25625 goto end_ar_command; 25626 } 25627 sqlite3_fileio_init(cmd.db, 0, 0); 25628 sqlite3_sqlar_init(cmd.db, 0, 0); 25629 sqlite3_create_function(cmd.db, "shell_putsnl", 1, SQLITE_UTF8, cmd.p, 25630 shellPutsFunc, 0, 0); 25631 25632 } 25633 if( cmd.zSrcTable==0 && cmd.bZip==0 && cmd.eCmd!=AR_CMD_HELP ){ 25634 if( cmd.eCmd!=AR_CMD_CREATE 25635 && sqlite3_table_column_metadata(cmd.db,0,"sqlar","name",0,0,0,0,0) 25636 ){ 25637 eputz("database does not contain an 'sqlar' table\n"); 25638 rc = SQLITE_ERROR; 25639 goto end_ar_command; 25640 } 25641 cmd.zSrcTable = sqlite3_mprintf("sqlar"); 25642 } 25643 25644 switch( cmd.eCmd ){ 25645 case AR_CMD_CREATE: 25646 rc = arCreateOrUpdateCommand(&cmd, 0, 0); 25647 break; 25648 25649 case AR_CMD_EXTRACT: 25650 rc = arExtractCommand(&cmd); 25651 break; 25652 25653 case AR_CMD_LIST: 25654 rc = arListCommand(&cmd); 25655 break; 25656 25657 case AR_CMD_HELP: 25658 arUsage(pState->out); 25659 break; 25660 25661 case AR_CMD_INSERT: 25662 rc = arCreateOrUpdateCommand(&cmd, 1, 0); 25663 break; 25664 25665 case AR_CMD_REMOVE: 25666 rc = arRemoveCommand(&cmd); 25667 break; 25668 25669 default: 25670 assert( cmd.eCmd==AR_CMD_UPDATE ); 25671 rc = arCreateOrUpdateCommand(&cmd, 1, 1); 25672 break; 25673 } 25674 } 25675 end_ar_command: 25676 if( cmd.db!=pState->db ){ 25677 close_db(cmd.db); 25678 } 25679 sqlite3_free(cmd.zSrcTable); 25680 25681 return rc; 25682 } 25683 /* End of the ".archive" or ".ar" command logic 25684 *******************************************************************************/ 25685 #endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) */ 25686 25687 #if SQLITE_SHELL_HAVE_RECOVER 25688 25689 /* 25690 ** This function is used as a callback by the recover extension. Simply 25691 ** print the supplied SQL statement to stdout. 25692 */ 25693 static int recoverSqlCb(void *pCtx, const char *zSql){ 25694 ShellState *pState = (ShellState*)pCtx; 25695 sputf(pState->out, "%s;\n", zSql); 25696 return SQLITE_OK; 25697 } 25698 25699 /* 25700 ** This function is called to recover data from the database. A script 25701 ** to construct a new database containing all recovered data is output 25702 ** on stream pState->out. 25703 */ 25704 static int recoverDatabaseCmd(ShellState *pState, int nArg, char **azArg){ 25705 int rc = SQLITE_OK; 25706 const char *zRecoveryDb = ""; /* Name of "recovery" database. Debug only */ 25707 const char *zLAF = "lost_and_found"; 25708 int bFreelist = 1; /* 0 if --ignore-freelist is specified */ 25709 int bRowids = 1; /* 0 if --no-rowids */ 25710 sqlite3_recover *p = 0; 25711 int i = 0; 25712 25713 for(i=1; i<nArg; i++){ 25714 char *z = azArg[i]; 25715 int n; 25716 if( z[0]=='-' && z[1]=='-' ) z++; 25717 n = strlen30(z); 25718 if( n<=17 && memcmp("-ignore-freelist", z, n)==0 ){ 25719 bFreelist = 0; 25720 }else 25721 if( n<=12 && memcmp("-recovery-db", z, n)==0 && i<(nArg-1) ){ 25722 /* This option determines the name of the ATTACH-ed database used 25723 ** internally by the recovery extension. The default is "" which 25724 ** means to use a temporary database that is automatically deleted 25725 ** when closed. This option is undocumented and might disappear at 25726 ** any moment. */ 25727 i++; 25728 zRecoveryDb = azArg[i]; 25729 }else 25730 if( n<=15 && memcmp("-lost-and-found", z, n)==0 && i<(nArg-1) ){ 25731 i++; 25732 zLAF = azArg[i]; 25733 }else 25734 if( n<=10 && memcmp("-no-rowids", z, n)==0 ){ 25735 bRowids = 0; 25736 } 25737 else{ 25738 eputf("unexpected option: %s\n", azArg[i]); 25739 showHelp(pState->out, azArg[0]); 25740 return 1; 25741 } 25742 } 25743 25744 p = sqlite3_recover_init_sql( 25745 pState->db, "main", recoverSqlCb, (void*)pState 25746 ); 25747 25748 sqlite3_recover_config(p, 789, (void*)zRecoveryDb); /* Debug use only */ 25749 sqlite3_recover_config(p, SQLITE_RECOVER_LOST_AND_FOUND, (void*)zLAF); 25750 sqlite3_recover_config(p, SQLITE_RECOVER_ROWIDS, (void*)&bRowids); 25751 sqlite3_recover_config(p, SQLITE_RECOVER_FREELIST_CORRUPT,(void*)&bFreelist); 25752 25753 sqlite3_recover_run(p); 25754 if( sqlite3_recover_errcode(p)!=SQLITE_OK ){ 25755 const char *zErr = sqlite3_recover_errmsg(p); 25756 int errCode = sqlite3_recover_errcode(p); 25757 eputf("sql error: %s (%d)\n", zErr, errCode); 25758 } 25759 rc = sqlite3_recover_finish(p); 25760 return rc; 25761 } 25762 #endif /* SQLITE_SHELL_HAVE_RECOVER */ 25763 25764 /* 25765 ** Implementation of ".intck STEPS_PER_UNLOCK" command. 25766 */ 25767 static int intckDatabaseCmd(ShellState *pState, i64 nStepPerUnlock){ 25768 sqlite3_intck *p = 0; 25769 int rc = SQLITE_OK; 25770 25771 rc = sqlite3_intck_open(pState->db, "main", &p); 25772 if( rc==SQLITE_OK ){ 25773 i64 nStep = 0; 25774 i64 nError = 0; 25775 const char *zErr = 0; 25776 while( SQLITE_OK==sqlite3_intck_step(p) ){ 25777 const char *zMsg = sqlite3_intck_message(p); 25778 if( zMsg ){ 25779 oputf("%s\n", zMsg); 25780 nError++; 25781 } 25782 nStep++; 25783 if( nStepPerUnlock && (nStep % nStepPerUnlock)==0 ){ 25784 sqlite3_intck_unlock(p); 25785 } 25786 } 25787 rc = sqlite3_intck_error(p, &zErr); 25788 if( zErr ){ 25789 eputf("%s\n", zErr); 25790 } 25791 sqlite3_intck_close(p); 25792 25793 oputf("%lld steps, %lld errors\n", nStep, nError); 25794 } 25795 25796 return rc; 25797 } 25798 25799 /* 25800 * zAutoColumn(zCol, &db, ?) => Maybe init db, add column zCol to it. 25801 * zAutoColumn(0, &db, ?) => (db!=0) Form columns spec for CREATE TABLE, 25802 * close db and set it to 0, and return the columns spec, to later 25803 * be sqlite3_free()'ed by the caller. 25804 * The return is 0 when either: 25805 * (a) The db was not initialized and zCol==0 (There are no columns.) 25806 * (b) zCol!=0 (Column was added, db initialized as needed.) 25807 * The 3rd argument, pRenamed, references an out parameter. If the 25808 * pointer is non-zero, its referent will be set to a summary of renames 25809 * done if renaming was necessary, or set to 0 if none was done. The out 25810 * string (if any) must be sqlite3_free()'ed by the caller. 25811 */ 25812 #ifdef SHELL_DEBUG 25813 #define rc_err_oom_die(rc) \ 25814 if( rc==SQLITE_NOMEM ) shell_check_oom(0); \ 25815 else if(!(rc==SQLITE_OK||rc==SQLITE_DONE)) \ 25816 eputf("E:%d\n",rc), assert(0) 25817 #else 25818 static void rc_err_oom_die(int rc){ 25819 if( rc==SQLITE_NOMEM ) shell_check_oom(0); 25820 assert(rc==SQLITE_OK||rc==SQLITE_DONE); 25821 } 25822 #endif 25823 25824 #ifdef SHELL_COLFIX_DB /* If this is set, the DB can be in a file. */ 25825 static char zCOL_DB[] = SHELL_STRINGIFY(SHELL_COLFIX_DB); 25826 #else /* Otherwise, memory is faster/better for the transient DB. */ 25827 static const char *zCOL_DB = ":memory:"; 25828 #endif 25829 25830 /* Define character (as C string) to separate generated column ordinal 25831 * from protected part of incoming column names. This defaults to "_" 25832 * so that incoming column identifiers that did not need not be quoted 25833 * remain usable without being quoted. It must be one character. 25834 */ 25835 #ifndef SHELL_AUTOCOLUMN_SEP 25836 # define AUTOCOLUMN_SEP "_" 25837 #else 25838 # define AUTOCOLUMN_SEP SHELL_STRINGIFY(SHELL_AUTOCOLUMN_SEP) 25839 #endif 25840 25841 static char *zAutoColumn(const char *zColNew, sqlite3 **pDb, char **pzRenamed){ 25842 /* Queries and D{D,M}L used here */ 25843 static const char * const zTabMake = "\ 25844 CREATE TABLE ColNames(\ 25845 cpos INTEGER PRIMARY KEY,\ 25846 name TEXT, nlen INT, chop INT, reps INT, suff TEXT);\ 25847 CREATE VIEW RepeatedNames AS \ 25848 SELECT DISTINCT t.name FROM ColNames t \ 25849 WHERE t.name COLLATE NOCASE IN (\ 25850 SELECT o.name FROM ColNames o WHERE o.cpos<>t.cpos\ 25851 );\ 25852 "; 25853 static const char * const zTabFill = "\ 25854 INSERT INTO ColNames(name,nlen,chop,reps,suff)\ 25855 VALUES(iif(length(?1)>0,?1,'?'),max(length(?1),1),0,0,'')\ 25856 "; 25857 static const char * const zHasDupes = "\ 25858 SELECT count(DISTINCT (substring(name,1,nlen-chop)||suff) COLLATE NOCASE)\ 25859 <count(name) FROM ColNames\ 25860 "; 25861 #ifdef SHELL_COLUMN_RENAME_CLEAN 25862 static const char * const zDedoctor = "\ 25863 UPDATE ColNames SET chop=iif(\ 25864 (substring(name,nlen,1) BETWEEN '0' AND '9')\ 25865 AND (rtrim(name,'0123456790') glob '*"AUTOCOLUMN_SEP"'),\ 25866 nlen-length(rtrim(name, '"AUTOCOLUMN_SEP"0123456789')),\ 25867 0\ 25868 )\ 25869 "; 25870 #endif 25871 static const char * const zSetReps = "\ 25872 UPDATE ColNames AS t SET reps=\ 25873 (SELECT count(*) FROM ColNames d \ 25874 WHERE substring(t.name,1,t.nlen-t.chop)=substring(d.name,1,d.nlen-d.chop)\ 25875 COLLATE NOCASE\ 25876 )\ 25877 "; 25878 #ifdef SQLITE_ENABLE_MATH_FUNCTIONS 25879 static const char * const zColDigits = "\ 25880 SELECT CAST(ceil(log(count(*)+0.5)) AS INT) FROM ColNames \ 25881 "; 25882 #else 25883 /* Counting on SQLITE_MAX_COLUMN < 100,000 here. (32767 is the hard limit.) */ 25884 static const char * const zColDigits = "\ 25885 SELECT CASE WHEN (nc < 10) THEN 1 WHEN (nc < 100) THEN 2 \ 25886 WHEN (nc < 1000) THEN 3 WHEN (nc < 10000) THEN 4 \ 25887 ELSE 5 FROM (SELECT count(*) AS nc FROM ColNames) \ 25888 "; 25889 #endif 25890 static const char * const zRenameRank = 25891 #ifdef SHELL_COLUMN_RENAME_CLEAN 25892 "UPDATE ColNames AS t SET suff=" 25893 "iif(reps>1, printf('%c%0*d', '"AUTOCOLUMN_SEP"', $1, cpos), '')" 25894 #else /* ...RENAME_MINIMAL_ONE_PASS */ 25895 "WITH Lzn(nlz) AS (" /* Find minimum extraneous leading 0's for uniqueness */ 25896 " SELECT 0 AS nlz" 25897 " UNION" 25898 " SELECT nlz+1 AS nlz FROM Lzn" 25899 " WHERE EXISTS(" 25900 " SELECT 1" 25901 " FROM ColNames t, ColNames o" 25902 " WHERE" 25903 " iif(t.name IN (SELECT * FROM RepeatedNames)," 25904 " printf('%s"AUTOCOLUMN_SEP"%s'," 25905 " t.name, substring(printf('%.*c%0.*d',nlz+1,'0',$1,t.cpos),2))," 25906 " t.name" 25907 " )" 25908 " =" 25909 " iif(o.name IN (SELECT * FROM RepeatedNames)," 25910 " printf('%s"AUTOCOLUMN_SEP"%s'," 25911 " o.name, substring(printf('%.*c%0.*d',nlz+1,'0',$1,o.cpos),2))," 25912 " o.name" 25913 " )" 25914 " COLLATE NOCASE" 25915 " AND o.cpos<>t.cpos" 25916 " GROUP BY t.cpos" 25917 " )" 25918 ") UPDATE Colnames AS t SET" 25919 " chop = 0," /* No chopping, never touch incoming names. */ 25920 " suff = iif(name IN (SELECT * FROM RepeatedNames)," 25921 " printf('"AUTOCOLUMN_SEP"%s', substring(" 25922 " printf('%.*c%0.*d',(SELECT max(nlz) FROM Lzn)+1,'0',1,t.cpos),2))," 25923 " ''" 25924 " )" 25925 #endif 25926 ; 25927 static const char * const zCollectVar = "\ 25928 SELECT\ 25929 '('||x'0a'\ 25930 || group_concat(\ 25931 cname||' TEXT',\ 25932 ','||iif((cpos-1)%4>0, ' ', x'0a'||' '))\ 25933 ||')' AS ColsSpec \ 25934 FROM (\ 25935 SELECT cpos, printf('\"%w\"',printf('%!.*s%s', nlen-chop,name,suff)) AS cname \ 25936 FROM ColNames ORDER BY cpos\ 25937 )"; 25938 static const char * const zRenamesDone = 25939 "SELECT group_concat(" 25940 " printf('\"%w\" to \"%w\"',name,printf('%!.*s%s', nlen-chop, name, suff))," 25941 " ','||x'0a')" 25942 "FROM ColNames WHERE suff<>'' OR chop!=0" 25943 ; 25944 int rc; 25945 sqlite3_stmt *pStmt = 0; 25946 assert(pDb!=0); 25947 if( zColNew ){ 25948 /* Add initial or additional column. Init db if necessary. */ 25949 if( *pDb==0 ){ 25950 if( SQLITE_OK!=sqlite3_open(zCOL_DB, pDb) ) return 0; 25951 #ifdef SHELL_COLFIX_DB 25952 if(*zCOL_DB!=':') 25953 sqlite3_exec(*pDb,"drop table if exists ColNames;" 25954 "drop view if exists RepeatedNames;",0,0,0); 25955 #endif 25956 #undef SHELL_COLFIX_DB 25957 rc = sqlite3_exec(*pDb, zTabMake, 0, 0, 0); 25958 rc_err_oom_die(rc); 25959 } 25960 assert(*pDb!=0); 25961 rc = sqlite3_prepare_v2(*pDb, zTabFill, -1, &pStmt, 0); 25962 rc_err_oom_die(rc); 25963 rc = sqlite3_bind_text(pStmt, 1, zColNew, -1, 0); 25964 rc_err_oom_die(rc); 25965 rc = sqlite3_step(pStmt); 25966 rc_err_oom_die(rc); 25967 sqlite3_finalize(pStmt); 25968 return 0; 25969 }else if( *pDb==0 ){ 25970 return 0; 25971 }else{ 25972 /* Formulate the columns spec, close the DB, zero *pDb. */ 25973 char *zColsSpec = 0; 25974 int hasDupes = db_int(*pDb, zHasDupes); 25975 int nDigits = (hasDupes)? db_int(*pDb, zColDigits) : 0; 25976 if( hasDupes ){ 25977 #ifdef SHELL_COLUMN_RENAME_CLEAN 25978 rc = sqlite3_exec(*pDb, zDedoctor, 0, 0, 0); 25979 rc_err_oom_die(rc); 25980 #endif 25981 rc = sqlite3_exec(*pDb, zSetReps, 0, 0, 0); 25982 rc_err_oom_die(rc); 25983 rc = sqlite3_prepare_v2(*pDb, zRenameRank, -1, &pStmt, 0); 25984 rc_err_oom_die(rc); 25985 sqlite3_bind_int(pStmt, 1, nDigits); 25986 rc = sqlite3_step(pStmt); 25987 sqlite3_finalize(pStmt); 25988 if( rc!=SQLITE_DONE ) rc_err_oom_die(SQLITE_NOMEM); 25989 } 25990 assert(db_int(*pDb, zHasDupes)==0); /* Consider: remove this */ 25991 rc = sqlite3_prepare_v2(*pDb, zCollectVar, -1, &pStmt, 0); 25992 rc_err_oom_die(rc); 25993 rc = sqlite3_step(pStmt); 25994 if( rc==SQLITE_ROW ){ 25995 zColsSpec = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0)); 25996 }else{ 25997 zColsSpec = 0; 25998 } 25999 if( pzRenamed!=0 ){ 26000 if( !hasDupes ) *pzRenamed = 0; 26001 else{ 26002 sqlite3_finalize(pStmt); 26003 if( SQLITE_OK==sqlite3_prepare_v2(*pDb, zRenamesDone, -1, &pStmt, 0) 26004 && SQLITE_ROW==sqlite3_step(pStmt) ){ 26005 *pzRenamed = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0)); 26006 }else 26007 *pzRenamed = 0; 26008 } 26009 } 26010 sqlite3_finalize(pStmt); 26011 sqlite3_close(*pDb); 26012 *pDb = 0; 26013 return zColsSpec; 26014 } 26015 } 26016 26017 /* 26018 ** Check if the sqlite_schema table contains one or more virtual tables. If 26019 ** parameter zLike is not NULL, then it is an SQL expression that the 26020 ** sqlite_schema row must also match. If one or more such rows are found, 26021 ** print the following warning to the output: 26022 ** 26023 ** WARNING: Script requires that SQLITE_DBCONFIG_DEFENSIVE be disabled 26024 */ 26025 static int outputDumpWarning(ShellState *p, const char *zLike){ 26026 int rc = SQLITE_OK; 26027 sqlite3_stmt *pStmt = 0; 26028 shellPreparePrintf(p->db, &rc, &pStmt, 26029 "SELECT 1 FROM sqlite_schema o WHERE " 26030 "sql LIKE 'CREATE VIRTUAL TABLE%%' AND %s", zLike ? zLike : "true" 26031 ); 26032 if( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){ 26033 oputz("/* WARNING: " 26034 "Script requires that SQLITE_DBCONFIG_DEFENSIVE be disabled */\n" 26035 ); 26036 } 26037 shellFinalize(&rc, pStmt); 26038 return rc; 26039 } 26040 26041 /* 26042 ** Fault-Simulator state and logic. 26043 */ 26044 static struct { 26045 int iId; /* ID that triggers a simulated fault. -1 means "any" */ 26046 int iErr; /* The error code to return on a fault */ 26047 int iCnt; /* Trigger the fault only if iCnt is already zero */ 26048 int iInterval; /* Reset iCnt to this value after each fault */ 26049 int eVerbose; /* When to print output */ 26050 int nHit; /* Number of hits seen so far */ 26051 int nRepeat; /* Turn off after this many hits. 0 for never */ 26052 int nSkip; /* Skip this many before first fault */ 26053 } faultsim_state = {-1, 0, 0, 0, 0, 0, 0, 0}; 26054 26055 /* 26056 ** This is the fault-sim callback 26057 */ 26058 static int faultsim_callback(int iArg){ 26059 if( faultsim_state.iId>0 && faultsim_state.iId!=iArg ){ 26060 return SQLITE_OK; 26061 } 26062 if( faultsim_state.iCnt ){ 26063 if( faultsim_state.iCnt>0 ) faultsim_state.iCnt--; 26064 if( faultsim_state.eVerbose>=2 ){ 26065 oputf("FAULT-SIM id=%d no-fault (cnt=%d)\n", iArg, faultsim_state.iCnt); 26066 } 26067 return SQLITE_OK; 26068 } 26069 if( faultsim_state.eVerbose>=1 ){ 26070 oputf("FAULT-SIM id=%d returns %d\n", iArg, faultsim_state.iErr); 26071 } 26072 faultsim_state.iCnt = faultsim_state.iInterval; 26073 faultsim_state.nHit++; 26074 if( faultsim_state.nRepeat>0 && faultsim_state.nRepeat<=faultsim_state.nHit ){ 26075 faultsim_state.iCnt = -1; 26076 } 26077 return faultsim_state.iErr; 26078 } 26079 26080 /* 26081 ** If an input line begins with "." then invoke this routine to 26082 ** process that line. 26083 ** 26084 ** Return 1 on error, 2 to exit, and 0 otherwise. 26085 */ 26086 static int do_meta_command(char *zLine, ShellState *p){ 26087 int h = 1; 26088 int nArg = 0; 26089 int n, c; 26090 int rc = 0; 26091 char *azArg[52]; 26092 26093 #ifndef SQLITE_OMIT_VIRTUALTABLE 26094 if( p->expert.pExpert ){ 26095 expertFinish(p, 1, 0); 26096 } 26097 #endif 26098 26099 /* Parse the input line into tokens. 26100 */ 26101 while( zLine[h] && nArg<ArraySize(azArg)-1 ){ 26102 while( IsSpace(zLine[h]) ){ h++; } 26103 if( zLine[h]==0 ) break; 26104 if( zLine[h]=='\'' || zLine[h]=='"' ){ 26105 int delim = zLine[h++]; 26106 azArg[nArg++] = &zLine[h]; 26107 while( zLine[h] && zLine[h]!=delim ){ 26108 if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++; 26109 h++; 26110 } 26111 if( zLine[h]==delim ){ 26112 zLine[h++] = 0; 26113 } 26114 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]); 26115 }else{ 26116 azArg[nArg++] = &zLine[h]; 26117 while( zLine[h] && !IsSpace(zLine[h]) ){ h++; } 26118 if( zLine[h] ) zLine[h++] = 0; 26119 } 26120 } 26121 azArg[nArg] = 0; 26122 26123 /* Process the input line. 26124 */ 26125 if( nArg==0 ) return 0; /* no tokens, no error */ 26126 n = strlen30(azArg[0]); 26127 c = azArg[0][0]; 26128 clearTempFile(p); 26129 26130 #ifndef SQLITE_OMIT_AUTHORIZATION 26131 if( c=='a' && cli_strncmp(azArg[0], "auth", n)==0 ){ 26132 if( nArg!=2 ){ 26133 eputz("Usage: .auth ON|OFF\n"); 26134 rc = 1; 26135 goto meta_command_exit; 26136 } 26137 open_db(p, 0); 26138 if( booleanValue(azArg[1]) ){ 26139 sqlite3_set_authorizer(p->db, shellAuth, p); 26140 }else if( p->bSafeModePersist ){ 26141 sqlite3_set_authorizer(p->db, safeModeAuth, p); 26142 }else{ 26143 sqlite3_set_authorizer(p->db, 0, 0); 26144 } 26145 }else 26146 #endif 26147 26148 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) \ 26149 && !defined(SQLITE_SHELL_FIDDLE) 26150 if( c=='a' && cli_strncmp(azArg[0], "archive", n)==0 ){ 26151 open_db(p, 0); 26152 failIfSafeMode(p, "cannot run .archive in safe mode"); 26153 rc = arDotCommand(p, 0, azArg, nArg); 26154 }else 26155 #endif 26156 26157 #ifndef SQLITE_SHELL_FIDDLE 26158 if( (c=='b' && n>=3 && cli_strncmp(azArg[0], "backup", n)==0) 26159 || (c=='s' && n>=3 && cli_strncmp(azArg[0], "save", n)==0) 26160 ){ 26161 const char *zDestFile = 0; 26162 const char *zDb = 0; 26163 sqlite3 *pDest; 26164 sqlite3_backup *pBackup; 26165 int j; 26166 int bAsync = 0; 26167 const char *zVfs = 0; 26168 failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]); 26169 for(j=1; j<nArg; j++){ 26170 const char *z = azArg[j]; 26171 if( z[0]=='-' ){ 26172 if( z[1]=='-' ) z++; 26173 if( cli_strcmp(z, "-append")==0 ){ 26174 zVfs = "apndvfs"; 26175 }else 26176 if( cli_strcmp(z, "-async")==0 ){ 26177 bAsync = 1; 26178 }else 26179 { 26180 eputf("unknown option: %s\n", azArg[j]); 26181 return 1; 26182 } 26183 }else if( zDestFile==0 ){ 26184 zDestFile = azArg[j]; 26185 }else if( zDb==0 ){ 26186 zDb = zDestFile; 26187 zDestFile = azArg[j]; 26188 }else{ 26189 eputz("Usage: .backup ?DB? ?OPTIONS? FILENAME\n"); 26190 return 1; 26191 } 26192 } 26193 if( zDestFile==0 ){ 26194 eputz("missing FILENAME argument on .backup\n"); 26195 return 1; 26196 } 26197 if( zDb==0 ) zDb = "main"; 26198 rc = sqlite3_open_v2(zDestFile, &pDest, 26199 SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, zVfs); 26200 if( rc!=SQLITE_OK ){ 26201 eputf("Error: cannot open \"%s\"\n", zDestFile); 26202 close_db(pDest); 26203 return 1; 26204 } 26205 if( bAsync ){ 26206 sqlite3_exec(pDest, "PRAGMA synchronous=OFF; PRAGMA journal_mode=OFF;", 26207 0, 0, 0); 26208 } 26209 open_db(p, 0); 26210 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb); 26211 if( pBackup==0 ){ 26212 eputf("Error: %s\n", sqlite3_errmsg(pDest)); 26213 close_db(pDest); 26214 return 1; 26215 } 26216 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){} 26217 sqlite3_backup_finish(pBackup); 26218 if( rc==SQLITE_DONE ){ 26219 rc = 0; 26220 }else{ 26221 eputf("Error: %s\n", sqlite3_errmsg(pDest)); 26222 rc = 1; 26223 } 26224 close_db(pDest); 26225 }else 26226 #endif /* !defined(SQLITE_SHELL_FIDDLE) */ 26227 26228 if( c=='b' && n>=3 && cli_strncmp(azArg[0], "bail", n)==0 ){ 26229 if( nArg==2 ){ 26230 bail_on_error = booleanValue(azArg[1]); 26231 }else{ 26232 eputz("Usage: .bail on|off\n"); 26233 rc = 1; 26234 } 26235 }else 26236 26237 /* Undocumented. Legacy only. See "crnl" below */ 26238 if( c=='b' && n>=3 && cli_strncmp(azArg[0], "binary", n)==0 ){ 26239 if( nArg==2 ){ 26240 if( booleanValue(azArg[1]) ){ 26241 setBinaryMode(p->out, 1); 26242 }else{ 26243 setTextMode(p->out, 1); 26244 } 26245 }else{ 26246 eputz("The \".binary\" command is deprecated. Use \".crnl\" instead.\n" 26247 "Usage: .binary on|off\n"); 26248 rc = 1; 26249 } 26250 }else 26251 26252 /* The undocumented ".breakpoint" command causes a call to the no-op 26253 ** routine named test_breakpoint(). 26254 */ 26255 if( c=='b' && n>=3 && cli_strncmp(azArg[0], "breakpoint", n)==0 ){ 26256 test_breakpoint(); 26257 }else 26258 26259 #ifndef SQLITE_SHELL_FIDDLE 26260 if( c=='c' && cli_strcmp(azArg[0],"cd")==0 ){ 26261 failIfSafeMode(p, "cannot run .cd in safe mode"); 26262 if( nArg==2 ){ 26263 #if defined(_WIN32) || defined(WIN32) 26264 wchar_t *z = sqlite3_win32_utf8_to_unicode(azArg[1]); 26265 rc = !SetCurrentDirectoryW(z); 26266 sqlite3_free(z); 26267 #else 26268 rc = chdir(azArg[1]); 26269 #endif 26270 if( rc ){ 26271 eputf("Cannot change to directory \"%s\"\n", azArg[1]); 26272 rc = 1; 26273 } 26274 }else{ 26275 eputz("Usage: .cd DIRECTORY\n"); 26276 rc = 1; 26277 } 26278 }else 26279 #endif /* !defined(SQLITE_SHELL_FIDDLE) */ 26280 26281 if( c=='c' && n>=3 && cli_strncmp(azArg[0], "changes", n)==0 ){ 26282 if( nArg==2 ){ 26283 setOrClearFlag(p, SHFLG_CountChanges, azArg[1]); 26284 }else{ 26285 eputz("Usage: .changes on|off\n"); 26286 rc = 1; 26287 } 26288 }else 26289 26290 #ifndef SQLITE_SHELL_FIDDLE 26291 /* Cancel output redirection, if it is currently set (by .testcase) 26292 ** Then read the content of the testcase-out.txt file and compare against 26293 ** azArg[1]. If there are differences, report an error and exit. 26294 */ 26295 if( c=='c' && n>=3 && cli_strncmp(azArg[0], "check", n)==0 ){ 26296 char *zRes = 0; 26297 output_reset(p); 26298 if( nArg!=2 ){ 26299 eputz("Usage: .check GLOB-PATTERN\n"); 26300 rc = 2; 26301 }else if( (zRes = readFile("testcase-out.txt", 0))==0 ){ 26302 rc = 2; 26303 }else if( testcase_glob(azArg[1],zRes)==0 ){ 26304 eputf("testcase-%s FAILED\n Expected: [%s]\n Got: [%s]\n", 26305 p->zTestcase, azArg[1], zRes); 26306 rc = 1; 26307 }else{ 26308 oputf("testcase-%s ok\n", p->zTestcase); 26309 p->nCheck++; 26310 } 26311 sqlite3_free(zRes); 26312 }else 26313 #endif /* !defined(SQLITE_SHELL_FIDDLE) */ 26314 26315 #ifndef SQLITE_SHELL_FIDDLE 26316 if( c=='c' && cli_strncmp(azArg[0], "clone", n)==0 ){ 26317 failIfSafeMode(p, "cannot run .clone in safe mode"); 26318 if( nArg==2 ){ 26319 tryToClone(p, azArg[1]); 26320 }else{ 26321 eputz("Usage: .clone FILENAME\n"); 26322 rc = 1; 26323 } 26324 }else 26325 #endif /* !defined(SQLITE_SHELL_FIDDLE) */ 26326 26327 if( c=='c' && cli_strncmp(azArg[0], "connection", n)==0 ){ 26328 if( nArg==1 ){ 26329 /* List available connections */ 26330 int i; 26331 for(i=0; i<ArraySize(p->aAuxDb); i++){ 26332 const char *zFile = p->aAuxDb[i].zDbFilename; 26333 if( p->aAuxDb[i].db==0 && p->pAuxDb!=&p->aAuxDb[i] ){ 26334 zFile = "(not open)"; 26335 }else if( zFile==0 ){ 26336 zFile = "(memory)"; 26337 }else if( zFile[0]==0 ){ 26338 zFile = "(temporary-file)"; 26339 } 26340 if( p->pAuxDb == &p->aAuxDb[i] ){ 26341 sputf(stdout, "ACTIVE %d: %s\n", i, zFile); 26342 }else if( p->aAuxDb[i].db!=0 ){ 26343 sputf(stdout, " %d: %s\n", i, zFile); 26344 } 26345 } 26346 }else if( nArg==2 && IsDigit(azArg[1][0]) && azArg[1][1]==0 ){ 26347 int i = azArg[1][0] - '0'; 26348 if( p->pAuxDb != &p->aAuxDb[i] && i>=0 && i<ArraySize(p->aAuxDb) ){ 26349 p->pAuxDb->db = p->db; 26350 p->pAuxDb = &p->aAuxDb[i]; 26351 globalDb = p->db = p->pAuxDb->db; 26352 p->pAuxDb->db = 0; 26353 } 26354 }else if( nArg==3 && cli_strcmp(azArg[1], "close")==0 26355 && IsDigit(azArg[2][0]) && azArg[2][1]==0 ){ 26356 int i = azArg[2][0] - '0'; 26357 if( i<0 || i>=ArraySize(p->aAuxDb) ){ 26358 /* No-op */ 26359 }else if( p->pAuxDb == &p->aAuxDb[i] ){ 26360 eputz("cannot close the active database connection\n"); 26361 rc = 1; 26362 }else if( p->aAuxDb[i].db ){ 26363 session_close_all(p, i); 26364 close_db(p->aAuxDb[i].db); 26365 p->aAuxDb[i].db = 0; 26366 } 26367 }else{ 26368 eputz("Usage: .connection [close] [CONNECTION-NUMBER]\n"); 26369 rc = 1; 26370 } 26371 }else 26372 26373 if( c=='c' && n==4 && cli_strncmp(azArg[0], "crnl", n)==0 ){ 26374 if( nArg==2 ){ 26375 if( booleanValue(azArg[1]) ){ 26376 setTextMode(p->out, 1); 26377 }else{ 26378 setBinaryMode(p->out, 1); 26379 } 26380 }else{ 26381 #if !defined(_WIN32) && !defined(WIN32) 26382 eputz("The \".crnl\" is a no-op on non-Windows machines.\n"); 26383 #endif 26384 eputz("Usage: .crnl on|off\n"); 26385 rc = 1; 26386 } 26387 }else 26388 26389 if( c=='d' && n>1 && cli_strncmp(azArg[0], "databases", n)==0 ){ 26390 char **azName = 0; 26391 int nName = 0; 26392 sqlite3_stmt *pStmt; 26393 int i; 26394 open_db(p, 0); 26395 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0); 26396 if( rc ){ 26397 eputf("Error: %s\n", sqlite3_errmsg(p->db)); 26398 rc = 1; 26399 }else{ 26400 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 26401 const char *zSchema = (const char *)sqlite3_column_text(pStmt,1); 26402 const char *zFile = (const char*)sqlite3_column_text(pStmt,2); 26403 if( zSchema==0 || zFile==0 ) continue; 26404 azName = sqlite3_realloc(azName, (nName+1)*2*sizeof(char*)); 26405 shell_check_oom(azName); 26406 azName[nName*2] = strdup(zSchema); 26407 azName[nName*2+1] = strdup(zFile); 26408 nName++; 26409 } 26410 } 26411 sqlite3_finalize(pStmt); 26412 for(i=0; i<nName; i++){ 26413 int eTxn = sqlite3_txn_state(p->db, azName[i*2]); 26414 int bRdonly = sqlite3_db_readonly(p->db, azName[i*2]); 26415 const char *z = azName[i*2+1]; 26416 oputf("%s: %s %s%s\n", 26417 azName[i*2], z && z[0] ? z : "\"\"", bRdonly ? "r/o" : "r/w", 26418 eTxn==SQLITE_TXN_NONE ? "" : 26419 eTxn==SQLITE_TXN_READ ? " read-txn" : " write-txn"); 26420 free(azName[i*2]); 26421 free(azName[i*2+1]); 26422 } 26423 sqlite3_free(azName); 26424 }else 26425 26426 if( c=='d' && n>=3 && cli_strncmp(azArg[0], "dbconfig", n)==0 ){ 26427 static const struct DbConfigChoices { 26428 const char *zName; 26429 int op; 26430 } aDbConfig[] = { 26431 { "defensive", SQLITE_DBCONFIG_DEFENSIVE }, 26432 { "dqs_ddl", SQLITE_DBCONFIG_DQS_DDL }, 26433 { "dqs_dml", SQLITE_DBCONFIG_DQS_DML }, 26434 { "enable_fkey", SQLITE_DBCONFIG_ENABLE_FKEY }, 26435 { "enable_qpsg", SQLITE_DBCONFIG_ENABLE_QPSG }, 26436 { "enable_trigger", SQLITE_DBCONFIG_ENABLE_TRIGGER }, 26437 { "enable_view", SQLITE_DBCONFIG_ENABLE_VIEW }, 26438 { "fts3_tokenizer", SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER }, 26439 { "legacy_alter_table", SQLITE_DBCONFIG_LEGACY_ALTER_TABLE }, 26440 { "legacy_file_format", SQLITE_DBCONFIG_LEGACY_FILE_FORMAT }, 26441 { "load_extension", SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION }, 26442 { "no_ckpt_on_close", SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE }, 26443 { "reset_database", SQLITE_DBCONFIG_RESET_DATABASE }, 26444 { "reverse_scanorder", SQLITE_DBCONFIG_REVERSE_SCANORDER }, 26445 { "stmt_scanstatus", SQLITE_DBCONFIG_STMT_SCANSTATUS }, 26446 { "trigger_eqp", SQLITE_DBCONFIG_TRIGGER_EQP }, 26447 { "trusted_schema", SQLITE_DBCONFIG_TRUSTED_SCHEMA }, 26448 { "writable_schema", SQLITE_DBCONFIG_WRITABLE_SCHEMA }, 26449 }; 26450 int ii, v; 26451 open_db(p, 0); 26452 for(ii=0; ii<ArraySize(aDbConfig); ii++){ 26453 if( nArg>1 && cli_strcmp(azArg[1], aDbConfig[ii].zName)!=0 ) continue; 26454 if( nArg>=3 ){ 26455 sqlite3_db_config(p->db, aDbConfig[ii].op, booleanValue(azArg[2]), 0); 26456 } 26457 sqlite3_db_config(p->db, aDbConfig[ii].op, -1, &v); 26458 oputf("%19s %s\n", aDbConfig[ii].zName, v ? "on" : "off"); 26459 if( nArg>1 ) break; 26460 } 26461 if( nArg>1 && ii==ArraySize(aDbConfig) ){ 26462 eputf("Error: unknown dbconfig \"%s\"\n", azArg[1]); 26463 eputz("Enter \".dbconfig\" with no arguments for a list\n"); 26464 } 26465 }else 26466 26467 #if SQLITE_SHELL_HAVE_RECOVER 26468 if( c=='d' && n>=3 && cli_strncmp(azArg[0], "dbinfo", n)==0 ){ 26469 rc = shell_dbinfo_command(p, nArg, azArg); 26470 }else 26471 26472 if( c=='r' && cli_strncmp(azArg[0], "recover", n)==0 ){ 26473 open_db(p, 0); 26474 rc = recoverDatabaseCmd(p, nArg, azArg); 26475 }else 26476 #endif /* SQLITE_SHELL_HAVE_RECOVER */ 26477 26478 if( c=='d' && cli_strncmp(azArg[0], "dump", n)==0 ){ 26479 char *zLike = 0; 26480 char *zSql; 26481 int i; 26482 int savedShowHeader = p->showHeader; 26483 int savedShellFlags = p->shellFlgs; 26484 ShellClearFlag(p, 26485 SHFLG_PreserveRowid|SHFLG_Newlines|SHFLG_Echo 26486 |SHFLG_DumpDataOnly|SHFLG_DumpNoSys); 26487 for(i=1; i<nArg; i++){ 26488 if( azArg[i][0]=='-' ){ 26489 const char *z = azArg[i]+1; 26490 if( z[0]=='-' ) z++; 26491 if( cli_strcmp(z,"preserve-rowids")==0 ){ 26492 #ifdef SQLITE_OMIT_VIRTUALTABLE 26493 eputz("The --preserve-rowids option is not compatible" 26494 " with SQLITE_OMIT_VIRTUALTABLE\n"); 26495 rc = 1; 26496 sqlite3_free(zLike); 26497 goto meta_command_exit; 26498 #else 26499 ShellSetFlag(p, SHFLG_PreserveRowid); 26500 #endif 26501 }else 26502 if( cli_strcmp(z,"newlines")==0 ){ 26503 ShellSetFlag(p, SHFLG_Newlines); 26504 }else 26505 if( cli_strcmp(z,"data-only")==0 ){ 26506 ShellSetFlag(p, SHFLG_DumpDataOnly); 26507 }else 26508 if( cli_strcmp(z,"nosys")==0 ){ 26509 ShellSetFlag(p, SHFLG_DumpNoSys); 26510 }else 26511 { 26512 eputf("Unknown option \"%s\" on \".dump\"\n", azArg[i]); 26513 rc = 1; 26514 sqlite3_free(zLike); 26515 goto meta_command_exit; 26516 } 26517 }else{ 26518 /* azArg[i] contains a LIKE pattern. This ".dump" request should 26519 ** only dump data for tables for which either the table name matches 26520 ** the LIKE pattern, or the table appears to be a shadow table of 26521 ** a virtual table for which the name matches the LIKE pattern. 26522 */ 26523 char *zExpr = sqlite3_mprintf( 26524 "name LIKE %Q ESCAPE '\\' OR EXISTS (" 26525 " SELECT 1 FROM sqlite_schema WHERE " 26526 " name LIKE %Q ESCAPE '\\' AND" 26527 " sql LIKE 'CREATE VIRTUAL TABLE%%' AND" 26528 " substr(o.name, 1, length(name)+1) == (name||'_')" 26529 ")", azArg[i], azArg[i] 26530 ); 26531 26532 if( zLike ){ 26533 zLike = sqlite3_mprintf("%z OR %z", zLike, zExpr); 26534 }else{ 26535 zLike = zExpr; 26536 } 26537 } 26538 } 26539 26540 open_db(p, 0); 26541 26542 outputDumpWarning(p, zLike); 26543 if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){ 26544 /* When playing back a "dump", the content might appear in an order 26545 ** which causes immediate foreign key constraints to be violated. 26546 ** So disable foreign-key constraint enforcement to prevent problems. */ 26547 oputz("PRAGMA foreign_keys=OFF;\n"); 26548 oputz("BEGIN TRANSACTION;\n"); 26549 } 26550 p->writableSchema = 0; 26551 p->showHeader = 0; 26552 /* Set writable_schema=ON since doing so forces SQLite to initialize 26553 ** as much of the schema as it can even if the sqlite_schema table is 26554 ** corrupt. */ 26555 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0); 26556 p->nErr = 0; 26557 if( zLike==0 ) zLike = sqlite3_mprintf("true"); 26558 zSql = sqlite3_mprintf( 26559 "SELECT name, type, sql FROM sqlite_schema AS o " 26560 "WHERE (%s) AND type=='table'" 26561 " AND sql NOT NULL" 26562 " ORDER BY tbl_name='sqlite_sequence', rowid", 26563 zLike 26564 ); 26565 run_schema_dump_query(p,zSql); 26566 sqlite3_free(zSql); 26567 if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){ 26568 zSql = sqlite3_mprintf( 26569 "SELECT sql FROM sqlite_schema AS o " 26570 "WHERE (%s) AND sql NOT NULL" 26571 " AND type IN ('index','trigger','view') " 26572 "ORDER BY type COLLATE NOCASE DESC", 26573 zLike 26574 ); 26575 run_table_dump_query(p, zSql); 26576 sqlite3_free(zSql); 26577 } 26578 sqlite3_free(zLike); 26579 if( p->writableSchema ){ 26580 oputz("PRAGMA writable_schema=OFF;\n"); 26581 p->writableSchema = 0; 26582 } 26583 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0); 26584 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0); 26585 if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){ 26586 oputz(p->nErr?"ROLLBACK; -- due to errors\n":"COMMIT;\n"); 26587 } 26588 p->showHeader = savedShowHeader; 26589 p->shellFlgs = savedShellFlags; 26590 }else 26591 26592 if( c=='e' && cli_strncmp(azArg[0], "echo", n)==0 ){ 26593 if( nArg==2 ){ 26594 setOrClearFlag(p, SHFLG_Echo, azArg[1]); 26595 }else{ 26596 eputz("Usage: .echo on|off\n"); 26597 rc = 1; 26598 } 26599 }else 26600 26601 if( c=='e' && cli_strncmp(azArg[0], "eqp", n)==0 ){ 26602 if( nArg==2 ){ 26603 p->autoEQPtest = 0; 26604 if( p->autoEQPtrace ){ 26605 if( p->db ) sqlite3_exec(p->db, "PRAGMA vdbe_trace=OFF;", 0, 0, 0); 26606 p->autoEQPtrace = 0; 26607 } 26608 if( cli_strcmp(azArg[1],"full")==0 ){ 26609 p->autoEQP = AUTOEQP_full; 26610 }else if( cli_strcmp(azArg[1],"trigger")==0 ){ 26611 p->autoEQP = AUTOEQP_trigger; 26612 #ifdef SQLITE_DEBUG 26613 }else if( cli_strcmp(azArg[1],"test")==0 ){ 26614 p->autoEQP = AUTOEQP_on; 26615 p->autoEQPtest = 1; 26616 }else if( cli_strcmp(azArg[1],"trace")==0 ){ 26617 p->autoEQP = AUTOEQP_full; 26618 p->autoEQPtrace = 1; 26619 open_db(p, 0); 26620 sqlite3_exec(p->db, "SELECT name FROM sqlite_schema LIMIT 1", 0, 0, 0); 26621 sqlite3_exec(p->db, "PRAGMA vdbe_trace=ON;", 0, 0, 0); 26622 #endif 26623 }else{ 26624 p->autoEQP = (u8)booleanValue(azArg[1]); 26625 } 26626 }else{ 26627 eputz("Usage: .eqp off|on|trace|trigger|full\n"); 26628 rc = 1; 26629 } 26630 }else 26631 26632 #ifndef SQLITE_SHELL_FIDDLE 26633 if( c=='e' && cli_strncmp(azArg[0], "exit", n)==0 ){ 26634 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc); 26635 rc = 2; 26636 }else 26637 #endif 26638 26639 /* The ".explain" command is automatic now. It is largely pointless. It 26640 ** retained purely for backwards compatibility */ 26641 if( c=='e' && cli_strncmp(azArg[0], "explain", n)==0 ){ 26642 int val = 1; 26643 if( nArg>=2 ){ 26644 if( cli_strcmp(azArg[1],"auto")==0 ){ 26645 val = 99; 26646 }else{ 26647 val = booleanValue(azArg[1]); 26648 } 26649 } 26650 if( val==1 && p->mode!=MODE_Explain ){ 26651 p->normalMode = p->mode; 26652 p->mode = MODE_Explain; 26653 p->autoExplain = 0; 26654 }else if( val==0 ){ 26655 if( p->mode==MODE_Explain ) p->mode = p->normalMode; 26656 p->autoExplain = 0; 26657 }else if( val==99 ){ 26658 if( p->mode==MODE_Explain ) p->mode = p->normalMode; 26659 p->autoExplain = 1; 26660 } 26661 }else 26662 26663 #ifndef SQLITE_OMIT_VIRTUALTABLE 26664 if( c=='e' && cli_strncmp(azArg[0], "expert", n)==0 ){ 26665 if( p->bSafeMode ){ 26666 eputf("Cannot run experimental commands such as \"%s\" in safe mode\n", 26667 azArg[0]); 26668 rc = 1; 26669 }else{ 26670 open_db(p, 0); 26671 expertDotCommand(p, azArg, nArg); 26672 } 26673 }else 26674 #endif 26675 26676 if( c=='f' && cli_strncmp(azArg[0], "filectrl", n)==0 ){ 26677 static const struct { 26678 const char *zCtrlName; /* Name of a test-control option */ 26679 int ctrlCode; /* Integer code for that option */ 26680 const char *zUsage; /* Usage notes */ 26681 } aCtrl[] = { 26682 { "chunk_size", SQLITE_FCNTL_CHUNK_SIZE, "SIZE" }, 26683 { "data_version", SQLITE_FCNTL_DATA_VERSION, "" }, 26684 { "has_moved", SQLITE_FCNTL_HAS_MOVED, "" }, 26685 { "lock_timeout", SQLITE_FCNTL_LOCK_TIMEOUT, "MILLISEC" }, 26686 { "persist_wal", SQLITE_FCNTL_PERSIST_WAL, "[BOOLEAN]" }, 26687 /* { "pragma", SQLITE_FCNTL_PRAGMA, "NAME ARG" },*/ 26688 { "psow", SQLITE_FCNTL_POWERSAFE_OVERWRITE, "[BOOLEAN]" }, 26689 { "reserve_bytes", SQLITE_FCNTL_RESERVE_BYTES, "[N]" }, 26690 { "size_limit", SQLITE_FCNTL_SIZE_LIMIT, "[LIMIT]" }, 26691 { "tempfilename", SQLITE_FCNTL_TEMPFILENAME, "" }, 26692 /* { "win32_av_retry", SQLITE_FCNTL_WIN32_AV_RETRY, "COUNT DELAY" },*/ 26693 }; 26694 int filectrl = -1; 26695 int iCtrl = -1; 26696 sqlite3_int64 iRes = 0; /* Integer result to display if rc2==1 */ 26697 int isOk = 0; /* 0: usage 1: %lld 2: no-result */ 26698 int n2, i; 26699 const char *zCmd = 0; 26700 const char *zSchema = 0; 26701 26702 open_db(p, 0); 26703 zCmd = nArg>=2 ? azArg[1] : "help"; 26704 26705 if( zCmd[0]=='-' 26706 && (cli_strcmp(zCmd,"--schema")==0 || cli_strcmp(zCmd,"-schema")==0) 26707 && nArg>=4 26708 ){ 26709 zSchema = azArg[2]; 26710 for(i=3; i<nArg; i++) azArg[i-2] = azArg[i]; 26711 nArg -= 2; 26712 zCmd = azArg[1]; 26713 } 26714 26715 /* The argument can optionally begin with "-" or "--" */ 26716 if( zCmd[0]=='-' && zCmd[1] ){ 26717 zCmd++; 26718 if( zCmd[0]=='-' && zCmd[1] ) zCmd++; 26719 } 26720 26721 /* --help lists all file-controls */ 26722 if( cli_strcmp(zCmd,"help")==0 ){ 26723 oputz("Available file-controls:\n"); 26724 for(i=0; i<ArraySize(aCtrl); i++){ 26725 oputf(" .filectrl %s %s\n", aCtrl[i].zCtrlName, aCtrl[i].zUsage); 26726 } 26727 rc = 1; 26728 goto meta_command_exit; 26729 } 26730 26731 /* convert filectrl text option to value. allow any unique prefix 26732 ** of the option name, or a numerical value. */ 26733 n2 = strlen30(zCmd); 26734 for(i=0; i<ArraySize(aCtrl); i++){ 26735 if( cli_strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){ 26736 if( filectrl<0 ){ 26737 filectrl = aCtrl[i].ctrlCode; 26738 iCtrl = i; 26739 }else{ 26740 eputf("Error: ambiguous file-control: \"%s\"\n" 26741 "Use \".filectrl --help\" for help\n", zCmd); 26742 rc = 1; 26743 goto meta_command_exit; 26744 } 26745 } 26746 } 26747 if( filectrl<0 ){ 26748 eputf("Error: unknown file-control: %s\n" 26749 "Use \".filectrl --help\" for help\n", zCmd); 26750 }else{ 26751 switch(filectrl){ 26752 case SQLITE_FCNTL_SIZE_LIMIT: { 26753 if( nArg!=2 && nArg!=3 ) break; 26754 iRes = nArg==3 ? integerValue(azArg[2]) : -1; 26755 sqlite3_file_control(p->db, zSchema, SQLITE_FCNTL_SIZE_LIMIT, &iRes); 26756 isOk = 1; 26757 break; 26758 } 26759 case SQLITE_FCNTL_LOCK_TIMEOUT: 26760 case SQLITE_FCNTL_CHUNK_SIZE: { 26761 int x; 26762 if( nArg!=3 ) break; 26763 x = (int)integerValue(azArg[2]); 26764 sqlite3_file_control(p->db, zSchema, filectrl, &x); 26765 isOk = 2; 26766 break; 26767 } 26768 case SQLITE_FCNTL_PERSIST_WAL: 26769 case SQLITE_FCNTL_POWERSAFE_OVERWRITE: { 26770 int x; 26771 if( nArg!=2 && nArg!=3 ) break; 26772 x = nArg==3 ? booleanValue(azArg[2]) : -1; 26773 sqlite3_file_control(p->db, zSchema, filectrl, &x); 26774 iRes = x; 26775 isOk = 1; 26776 break; 26777 } 26778 case SQLITE_FCNTL_DATA_VERSION: 26779 case SQLITE_FCNTL_HAS_MOVED: { 26780 int x; 26781 if( nArg!=2 ) break; 26782 sqlite3_file_control(p->db, zSchema, filectrl, &x); 26783 iRes = x; 26784 isOk = 1; 26785 break; 26786 } 26787 case SQLITE_FCNTL_TEMPFILENAME: { 26788 char *z = 0; 26789 if( nArg!=2 ) break; 26790 sqlite3_file_control(p->db, zSchema, filectrl, &z); 26791 if( z ){ 26792 oputf("%s\n", z); 26793 sqlite3_free(z); 26794 } 26795 isOk = 2; 26796 break; 26797 } 26798 case SQLITE_FCNTL_RESERVE_BYTES: { 26799 int x; 26800 if( nArg>=3 ){ 26801 x = atoi(azArg[2]); 26802 sqlite3_file_control(p->db, zSchema, filectrl, &x); 26803 } 26804 x = -1; 26805 sqlite3_file_control(p->db, zSchema, filectrl, &x); 26806 oputf("%d\n", x); 26807 isOk = 2; 26808 break; 26809 } 26810 } 26811 } 26812 if( isOk==0 && iCtrl>=0 ){ 26813 oputf("Usage: .filectrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage); 26814 rc = 1; 26815 }else if( isOk==1 ){ 26816 char zBuf[100]; 26817 sqlite3_snprintf(sizeof(zBuf), zBuf, "%lld", iRes); 26818 oputf("%s\n", zBuf); 26819 } 26820 }else 26821 26822 if( c=='f' && cli_strncmp(azArg[0], "fullschema", n)==0 ){ 26823 ShellState data; 26824 int doStats = 0; 26825 memcpy(&data, p, sizeof(data)); 26826 data.showHeader = 0; 26827 data.cMode = data.mode = MODE_Semi; 26828 if( nArg==2 && optionMatch(azArg[1], "indent") ){ 26829 data.cMode = data.mode = MODE_Pretty; 26830 nArg = 1; 26831 } 26832 if( nArg!=1 ){ 26833 eputz("Usage: .fullschema ?--indent?\n"); 26834 rc = 1; 26835 goto meta_command_exit; 26836 } 26837 open_db(p, 0); 26838 rc = sqlite3_exec(p->db, 26839 "SELECT sql FROM" 26840 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x" 26841 " FROM sqlite_schema UNION ALL" 26842 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_schema) " 26843 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' " 26844 "ORDER BY x", 26845 callback, &data, 0 26846 ); 26847 if( rc==SQLITE_OK ){ 26848 sqlite3_stmt *pStmt; 26849 rc = sqlite3_prepare_v2(p->db, 26850 "SELECT rowid FROM sqlite_schema" 26851 " WHERE name GLOB 'sqlite_stat[134]'", 26852 -1, &pStmt, 0); 26853 if( rc==SQLITE_OK ){ 26854 doStats = sqlite3_step(pStmt)==SQLITE_ROW; 26855 sqlite3_finalize(pStmt); 26856 } 26857 } 26858 if( doStats==0 ){ 26859 oputz("/* No STAT tables available */\n"); 26860 }else{ 26861 oputz("ANALYZE sqlite_schema;\n"); 26862 data.cMode = data.mode = MODE_Insert; 26863 data.zDestTable = "sqlite_stat1"; 26864 shell_exec(&data, "SELECT * FROM sqlite_stat1", 0); 26865 data.zDestTable = "sqlite_stat4"; 26866 shell_exec(&data, "SELECT * FROM sqlite_stat4", 0); 26867 oputz("ANALYZE sqlite_schema;\n"); 26868 } 26869 }else 26870 26871 if( c=='h' && cli_strncmp(azArg[0], "headers", n)==0 ){ 26872 if( nArg==2 ){ 26873 p->showHeader = booleanValue(azArg[1]); 26874 p->shellFlgs |= SHFLG_HeaderSet; 26875 }else{ 26876 eputz("Usage: .headers on|off\n"); 26877 rc = 1; 26878 } 26879 }else 26880 26881 if( c=='h' && cli_strncmp(azArg[0], "help", n)==0 ){ 26882 if( nArg>=2 ){ 26883 n = showHelp(p->out, azArg[1]); 26884 if( n==0 ){ 26885 oputf("Nothing matches '%s'\n", azArg[1]); 26886 } 26887 }else{ 26888 showHelp(p->out, 0); 26889 } 26890 }else 26891 26892 #ifndef SQLITE_SHELL_FIDDLE 26893 if( c=='i' && cli_strncmp(azArg[0], "import", n)==0 ){ 26894 char *zTable = 0; /* Insert data into this table */ 26895 char *zSchema = 0; /* Schema of zTable */ 26896 char *zFile = 0; /* Name of file to extra content from */ 26897 sqlite3_stmt *pStmt = NULL; /* A statement */ 26898 int nCol; /* Number of columns in the table */ 26899 i64 nByte; /* Number of bytes in an SQL string */ 26900 int i, j; /* Loop counters */ 26901 int needCommit; /* True to COMMIT or ROLLBACK at end */ 26902 int nSep; /* Number of bytes in p->colSeparator[] */ 26903 char *zSql = 0; /* An SQL statement */ 26904 ImportCtx sCtx; /* Reader context */ 26905 char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */ 26906 int eVerbose = 0; /* Larger for more console output */ 26907 int nSkip = 0; /* Initial lines to skip */ 26908 int useOutputMode = 1; /* Use output mode to determine separators */ 26909 char *zCreate = 0; /* CREATE TABLE statement text */ 26910 26911 failIfSafeMode(p, "cannot run .import in safe mode"); 26912 memset(&sCtx, 0, sizeof(sCtx)); 26913 if( p->mode==MODE_Ascii ){ 26914 xRead = ascii_read_one_field; 26915 }else{ 26916 xRead = csv_read_one_field; 26917 } 26918 rc = 1; 26919 for(i=1; i<nArg; i++){ 26920 char *z = azArg[i]; 26921 if( z[0]=='-' && z[1]=='-' ) z++; 26922 if( z[0]!='-' ){ 26923 if( zFile==0 ){ 26924 zFile = z; 26925 }else if( zTable==0 ){ 26926 zTable = z; 26927 }else{ 26928 oputf("ERROR: extra argument: \"%s\". Usage:\n", z); 26929 showHelp(p->out, "import"); 26930 goto meta_command_exit; 26931 } 26932 }else if( cli_strcmp(z,"-v")==0 ){ 26933 eVerbose++; 26934 }else if( cli_strcmp(z,"-schema")==0 && i<nArg-1 ){ 26935 zSchema = azArg[++i]; 26936 }else if( cli_strcmp(z,"-skip")==0 && i<nArg-1 ){ 26937 nSkip = integerValue(azArg[++i]); 26938 }else if( cli_strcmp(z,"-ascii")==0 ){ 26939 sCtx.cColSep = SEP_Unit[0]; 26940 sCtx.cRowSep = SEP_Record[0]; 26941 xRead = ascii_read_one_field; 26942 useOutputMode = 0; 26943 }else if( cli_strcmp(z,"-csv")==0 ){ 26944 sCtx.cColSep = ','; 26945 sCtx.cRowSep = '\n'; 26946 xRead = csv_read_one_field; 26947 useOutputMode = 0; 26948 }else{ 26949 oputf("ERROR: unknown option: \"%s\". Usage:\n", z); 26950 showHelp(p->out, "import"); 26951 goto meta_command_exit; 26952 } 26953 } 26954 if( zTable==0 ){ 26955 oputf("ERROR: missing %s argument. Usage:\n", 26956 zFile==0 ? "FILE" : "TABLE"); 26957 showHelp(p->out, "import"); 26958 goto meta_command_exit; 26959 } 26960 seenInterrupt = 0; 26961 open_db(p, 0); 26962 if( useOutputMode ){ 26963 /* If neither the --csv or --ascii options are specified, then set 26964 ** the column and row separator characters from the output mode. */ 26965 nSep = strlen30(p->colSeparator); 26966 if( nSep==0 ){ 26967 eputz("Error: non-null column separator required for import\n"); 26968 goto meta_command_exit; 26969 } 26970 if( nSep>1 ){ 26971 eputz("Error: multi-character column separators not allowed" 26972 " for import\n"); 26973 goto meta_command_exit; 26974 } 26975 nSep = strlen30(p->rowSeparator); 26976 if( nSep==0 ){ 26977 eputz("Error: non-null row separator required for import\n"); 26978 goto meta_command_exit; 26979 } 26980 if( nSep==2 && p->mode==MODE_Csv 26981 && cli_strcmp(p->rowSeparator,SEP_CrLf)==0 26982 ){ 26983 /* When importing CSV (only), if the row separator is set to the 26984 ** default output row separator, change it to the default input 26985 ** row separator. This avoids having to maintain different input 26986 ** and output row separators. */ 26987 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 26988 nSep = strlen30(p->rowSeparator); 26989 } 26990 if( nSep>1 ){ 26991 eputz("Error: multi-character row separators not allowed" 26992 " for import\n"); 26993 goto meta_command_exit; 26994 } 26995 sCtx.cColSep = (u8)p->colSeparator[0]; 26996 sCtx.cRowSep = (u8)p->rowSeparator[0]; 26997 } 26998 sCtx.zFile = zFile; 26999 sCtx.nLine = 1; 27000 if( sCtx.zFile[0]=='|' ){ 27001 #ifdef SQLITE_OMIT_POPEN 27002 eputz("Error: pipes are not supported in this OS\n"); 27003 goto meta_command_exit; 27004 #else 27005 sCtx.in = popen(sCtx.zFile+1, "r"); 27006 sCtx.zFile = "<pipe>"; 27007 sCtx.xCloser = pclose; 27008 #endif 27009 }else{ 27010 sCtx.in = fopen(sCtx.zFile, "rb"); 27011 sCtx.xCloser = fclose; 27012 } 27013 if( sCtx.in==0 ){ 27014 eputf("Error: cannot open \"%s\"\n", zFile); 27015 goto meta_command_exit; 27016 } 27017 if( eVerbose>=2 || (eVerbose>=1 && useOutputMode) ){ 27018 char zSep[2]; 27019 zSep[1] = 0; 27020 zSep[0] = sCtx.cColSep; 27021 oputz("Column separator "); 27022 output_c_string(zSep); 27023 oputz(", row separator "); 27024 zSep[0] = sCtx.cRowSep; 27025 output_c_string(zSep); 27026 oputz("\n"); 27027 } 27028 sCtx.z = sqlite3_malloc64(120); 27029 if( sCtx.z==0 ){ 27030 import_cleanup(&sCtx); 27031 shell_out_of_memory(); 27032 } 27033 /* Below, resources must be freed before exit. */ 27034 while( (nSkip--)>0 ){ 27035 while( xRead(&sCtx) && sCtx.cTerm==sCtx.cColSep ){} 27036 } 27037 import_append_char(&sCtx, 0); /* To ensure sCtx.z is allocated */ 27038 if( sqlite3_table_column_metadata(p->db, zSchema, zTable,0,0,0,0,0,0) ){ 27039 /* Table does not exist. Create it. */ 27040 sqlite3 *dbCols = 0; 27041 char *zRenames = 0; 27042 char *zColDefs; 27043 zCreate = sqlite3_mprintf("CREATE TABLE \"%w\".\"%w\"", 27044 zSchema ? zSchema : "main", zTable); 27045 while( xRead(&sCtx) ){ 27046 zAutoColumn(sCtx.z, &dbCols, 0); 27047 if( sCtx.cTerm!=sCtx.cColSep ) break; 27048 } 27049 zColDefs = zAutoColumn(0, &dbCols, &zRenames); 27050 if( zRenames!=0 ){ 27051 sputf((stdin_is_interactive && p->in==stdin)? p->out : stderr, 27052 "Columns renamed during .import %s due to duplicates:\n" 27053 "%s\n", sCtx.zFile, zRenames); 27054 sqlite3_free(zRenames); 27055 } 27056 assert(dbCols==0); 27057 if( zColDefs==0 ){ 27058 eputf("%s: empty file\n", sCtx.zFile); 27059 import_cleanup(&sCtx); 27060 rc = 1; 27061 goto meta_command_exit; 27062 } 27063 zCreate = sqlite3_mprintf("%z%z\n", zCreate, zColDefs); 27064 if( zCreate==0 ){ 27065 import_cleanup(&sCtx); 27066 shell_out_of_memory(); 27067 } 27068 if( eVerbose>=1 ){ 27069 oputf("%s\n", zCreate); 27070 } 27071 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0); 27072 sqlite3_free(zCreate); 27073 zCreate = 0; 27074 if( rc ){ 27075 eputf("%s failed:\n%s\n", zCreate, sqlite3_errmsg(p->db)); 27076 import_cleanup(&sCtx); 27077 rc = 1; 27078 goto meta_command_exit; 27079 } 27080 } 27081 zSql = sqlite3_mprintf("SELECT count(*) FROM pragma_table_info(%Q,%Q);", 27082 zTable, zSchema); 27083 if( zSql==0 ){ 27084 import_cleanup(&sCtx); 27085 shell_out_of_memory(); 27086 } 27087 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 27088 sqlite3_free(zSql); 27089 zSql = 0; 27090 if( rc ){ 27091 if (pStmt) sqlite3_finalize(pStmt); 27092 eputf("Error: %s\n", sqlite3_errmsg(p->db)); 27093 import_cleanup(&sCtx); 27094 rc = 1; 27095 goto meta_command_exit; 27096 } 27097 if( sqlite3_step(pStmt)==SQLITE_ROW ){ 27098 nCol = sqlite3_column_int(pStmt, 0); 27099 }else{ 27100 nCol = 0; 27101 } 27102 sqlite3_finalize(pStmt); 27103 pStmt = 0; 27104 if( nCol==0 ) return 0; /* no columns, no error */ 27105 27106 nByte = 64 /* space for "INSERT INTO", "VALUES(", ")\0" */ 27107 + (zSchema ? strlen(zSchema)*2 + 2: 0) /* Quoted schema name */ 27108 + strlen(zTable)*2 + 2 /* Quoted table name */ 27109 + nCol*2; /* Space for ",?" for each column */ 27110 zSql = sqlite3_malloc64( nByte ); 27111 if( zSql==0 ){ 27112 import_cleanup(&sCtx); 27113 shell_out_of_memory(); 27114 } 27115 if( zSchema ){ 27116 sqlite3_snprintf(nByte, zSql, "INSERT INTO \"%w\".\"%w\" VALUES(?", 27117 zSchema, zTable); 27118 }else{ 27119 sqlite3_snprintf(nByte, zSql, "INSERT INTO \"%w\" VALUES(?", zTable); 27120 } 27121 j = strlen30(zSql); 27122 for(i=1; i<nCol; i++){ 27123 zSql[j++] = ','; 27124 zSql[j++] = '?'; 27125 } 27126 zSql[j++] = ')'; 27127 zSql[j] = 0; 27128 assert( j<nByte ); 27129 if( eVerbose>=2 ){ 27130 oputf("Insert using: %s\n", zSql); 27131 } 27132 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 27133 sqlite3_free(zSql); 27134 zSql = 0; 27135 if( rc ){ 27136 eputf("Error: %s\n", sqlite3_errmsg(p->db)); 27137 if (pStmt) sqlite3_finalize(pStmt); 27138 import_cleanup(&sCtx); 27139 rc = 1; 27140 goto meta_command_exit; 27141 } 27142 needCommit = sqlite3_get_autocommit(p->db); 27143 if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0); 27144 do{ 27145 int startLine = sCtx.nLine; 27146 for(i=0; i<nCol; i++){ 27147 char *z = xRead(&sCtx); 27148 /* 27149 ** Did we reach end-of-file before finding any columns? 27150 ** If so, stop instead of NULL filling the remaining columns. 27151 */ 27152 if( z==0 && i==0 ) break; 27153 /* 27154 ** Did we reach end-of-file OR end-of-line before finding any 27155 ** columns in ASCII mode? If so, stop instead of NULL filling 27156 ** the remaining columns. 27157 */ 27158 if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break; 27159 /* 27160 ** For CSV mode, per RFC 4180, accept EOF in lieu of final 27161 ** record terminator but only for last field of multi-field row. 27162 ** (If there are too few fields, it's not valid CSV anyway.) 27163 */ 27164 if( z==0 && (xRead==csv_read_one_field) && i==nCol-1 && i>0 ){ 27165 z = ""; 27166 } 27167 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT); 27168 if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){ 27169 eputf("%s:%d: expected %d columns but found %d" 27170 " - filling the rest with NULL\n", 27171 sCtx.zFile, startLine, nCol, i+1); 27172 i += 2; 27173 while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; } 27174 } 27175 } 27176 if( sCtx.cTerm==sCtx.cColSep ){ 27177 do{ 27178 xRead(&sCtx); 27179 i++; 27180 }while( sCtx.cTerm==sCtx.cColSep ); 27181 eputf("%s:%d: expected %d columns but found %d - extras ignored\n", 27182 sCtx.zFile, startLine, nCol, i); 27183 } 27184 if( i>=nCol ){ 27185 sqlite3_step(pStmt); 27186 rc = sqlite3_reset(pStmt); 27187 if( rc!=SQLITE_OK ){ 27188 eputf("%s:%d: INSERT failed: %s\n", 27189 sCtx.zFile, startLine, sqlite3_errmsg(p->db)); 27190 sCtx.nErr++; 27191 }else{ 27192 sCtx.nRow++; 27193 } 27194 } 27195 }while( sCtx.cTerm!=EOF ); 27196 27197 import_cleanup(&sCtx); 27198 sqlite3_finalize(pStmt); 27199 if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0); 27200 if( eVerbose>0 ){ 27201 oputf("Added %d rows with %d errors using %d lines of input\n", 27202 sCtx.nRow, sCtx.nErr, sCtx.nLine-1); 27203 } 27204 }else 27205 #endif /* !defined(SQLITE_SHELL_FIDDLE) */ 27206 27207 #ifndef SQLITE_UNTESTABLE 27208 if( c=='i' && cli_strncmp(azArg[0], "imposter", n)==0 ){ 27209 char *zSql; 27210 char *zCollist = 0; 27211 sqlite3_stmt *pStmt; 27212 int tnum = 0; 27213 int isWO = 0; /* True if making an imposter of a WITHOUT ROWID table */ 27214 int lenPK = 0; /* Length of the PRIMARY KEY string for isWO tables */ 27215 int i; 27216 if( !ShellHasFlag(p,SHFLG_TestingMode) ){ 27217 eputf(".%s unavailable without --unsafe-testing\n", 27218 "imposter"); 27219 rc = 1; 27220 goto meta_command_exit; 27221 } 27222 if( !(nArg==3 || (nArg==2 && sqlite3_stricmp(azArg[1],"off")==0)) ){ 27223 eputz("Usage: .imposter INDEX IMPOSTER\n" 27224 " .imposter off\n"); 27225 /* Also allowed, but not documented: 27226 ** 27227 ** .imposter TABLE IMPOSTER 27228 ** 27229 ** where TABLE is a WITHOUT ROWID table. In that case, the 27230 ** imposter is another WITHOUT ROWID table with the columns in 27231 ** storage order. */ 27232 rc = 1; 27233 goto meta_command_exit; 27234 } 27235 open_db(p, 0); 27236 if( nArg==2 ){ 27237 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 1); 27238 goto meta_command_exit; 27239 } 27240 zSql = sqlite3_mprintf( 27241 "SELECT rootpage, 0 FROM sqlite_schema" 27242 " WHERE name='%q' AND type='index'" 27243 "UNION ALL " 27244 "SELECT rootpage, 1 FROM sqlite_schema" 27245 " WHERE name='%q' AND type='table'" 27246 " AND sql LIKE '%%without%%rowid%%'", 27247 azArg[1], azArg[1] 27248 ); 27249 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 27250 sqlite3_free(zSql); 27251 if( sqlite3_step(pStmt)==SQLITE_ROW ){ 27252 tnum = sqlite3_column_int(pStmt, 0); 27253 isWO = sqlite3_column_int(pStmt, 1); 27254 } 27255 sqlite3_finalize(pStmt); 27256 zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]); 27257 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 27258 sqlite3_free(zSql); 27259 i = 0; 27260 while( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){ 27261 char zLabel[20]; 27262 const char *zCol = (const char*)sqlite3_column_text(pStmt,2); 27263 i++; 27264 if( zCol==0 ){ 27265 if( sqlite3_column_int(pStmt,1)==-1 ){ 27266 zCol = "_ROWID_"; 27267 }else{ 27268 sqlite3_snprintf(sizeof(zLabel),zLabel,"expr%d",i); 27269 zCol = zLabel; 27270 } 27271 } 27272 if( isWO && lenPK==0 && sqlite3_column_int(pStmt,5)==0 && zCollist ){ 27273 lenPK = (int)strlen(zCollist); 27274 } 27275 if( zCollist==0 ){ 27276 zCollist = sqlite3_mprintf("\"%w\"", zCol); 27277 }else{ 27278 zCollist = sqlite3_mprintf("%z,\"%w\"", zCollist, zCol); 27279 } 27280 } 27281 sqlite3_finalize(pStmt); 27282 if( i==0 || tnum==0 ){ 27283 eputf("no such index: \"%s\"\n", azArg[1]); 27284 rc = 1; 27285 sqlite3_free(zCollist); 27286 goto meta_command_exit; 27287 } 27288 if( lenPK==0 ) lenPK = 100000; 27289 zSql = sqlite3_mprintf( 27290 "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%.*s))WITHOUT ROWID", 27291 azArg[2], zCollist, lenPK, zCollist); 27292 sqlite3_free(zCollist); 27293 rc = sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 1, tnum); 27294 if( rc==SQLITE_OK ){ 27295 rc = sqlite3_exec(p->db, zSql, 0, 0, 0); 27296 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 0); 27297 if( rc ){ 27298 eputf("Error in [%s]: %s\n", zSql, sqlite3_errmsg(p->db)); 27299 }else{ 27300 sputf(stdout, "%s;\n", zSql); 27301 sputf(stdout, "WARNING: writing to an imposter table will corrupt" 27302 " the \"%s\" %s!\n", azArg[1], isWO ? "table" : "index"); 27303 } 27304 }else{ 27305 eputf("SQLITE_TESTCTRL_IMPOSTER returns %d\n", rc); 27306 rc = 1; 27307 } 27308 sqlite3_free(zSql); 27309 }else 27310 #endif /* !defined(SQLITE_OMIT_TEST_CONTROL) */ 27311 27312 if( c=='i' && cli_strncmp(azArg[0], "intck", n)==0 ){ 27313 i64 iArg = 0; 27314 if( nArg==2 ){ 27315 iArg = integerValue(azArg[1]); 27316 if( iArg==0 ) iArg = -1; 27317 } 27318 if( (nArg!=1 && nArg!=2) || iArg<0 ){ 27319 eputf("%s","Usage: .intck STEPS_PER_UNLOCK\n"); 27320 rc = 1; 27321 goto meta_command_exit; 27322 } 27323 open_db(p, 0); 27324 rc = intckDatabaseCmd(p, iArg); 27325 }else 27326 27327 #ifdef SQLITE_ENABLE_IOTRACE 27328 if( c=='i' && cli_strncmp(azArg[0], "iotrace", n)==0 ){ 27329 SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...); 27330 if( iotrace && iotrace!=stdout ) fclose(iotrace); 27331 iotrace = 0; 27332 if( nArg<2 ){ 27333 sqlite3IoTrace = 0; 27334 }else if( cli_strcmp(azArg[1], "-")==0 ){ 27335 sqlite3IoTrace = iotracePrintf; 27336 iotrace = stdout; 27337 }else{ 27338 iotrace = fopen(azArg[1], "w"); 27339 if( iotrace==0 ){ 27340 eputf("Error: cannot open \"%s\"\n", azArg[1]); 27341 sqlite3IoTrace = 0; 27342 rc = 1; 27343 }else{ 27344 sqlite3IoTrace = iotracePrintf; 27345 } 27346 } 27347 }else 27348 #endif 27349 27350 if( c=='l' && n>=5 && cli_strncmp(azArg[0], "limits", n)==0 ){ 27351 static const struct { 27352 const char *zLimitName; /* Name of a limit */ 27353 int limitCode; /* Integer code for that limit */ 27354 } aLimit[] = { 27355 { "length", SQLITE_LIMIT_LENGTH }, 27356 { "sql_length", SQLITE_LIMIT_SQL_LENGTH }, 27357 { "column", SQLITE_LIMIT_COLUMN }, 27358 { "expr_depth", SQLITE_LIMIT_EXPR_DEPTH }, 27359 { "compound_select", SQLITE_LIMIT_COMPOUND_SELECT }, 27360 { "vdbe_op", SQLITE_LIMIT_VDBE_OP }, 27361 { "function_arg", SQLITE_LIMIT_FUNCTION_ARG }, 27362 { "attached", SQLITE_LIMIT_ATTACHED }, 27363 { "like_pattern_length", SQLITE_LIMIT_LIKE_PATTERN_LENGTH }, 27364 { "variable_number", SQLITE_LIMIT_VARIABLE_NUMBER }, 27365 { "trigger_depth", SQLITE_LIMIT_TRIGGER_DEPTH }, 27366 { "worker_threads", SQLITE_LIMIT_WORKER_THREADS }, 27367 }; 27368 int i, n2; 27369 open_db(p, 0); 27370 if( nArg==1 ){ 27371 for(i=0; i<ArraySize(aLimit); i++){ 27372 sputf(stdout, "%20s %d\n", aLimit[i].zLimitName, 27373 sqlite3_limit(p->db, aLimit[i].limitCode, -1)); 27374 } 27375 }else if( nArg>3 ){ 27376 eputz("Usage: .limit NAME ?NEW-VALUE?\n"); 27377 rc = 1; 27378 goto meta_command_exit; 27379 }else{ 27380 int iLimit = -1; 27381 n2 = strlen30(azArg[1]); 27382 for(i=0; i<ArraySize(aLimit); i++){ 27383 if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){ 27384 if( iLimit<0 ){ 27385 iLimit = i; 27386 }else{ 27387 eputf("ambiguous limit: \"%s\"\n", azArg[1]); 27388 rc = 1; 27389 goto meta_command_exit; 27390 } 27391 } 27392 } 27393 if( iLimit<0 ){ 27394 eputf("unknown limit: \"%s\"\n" 27395 "enter \".limits\" with no arguments for a list.\n", 27396 azArg[1]); 27397 rc = 1; 27398 goto meta_command_exit; 27399 } 27400 if( nArg==3 ){ 27401 sqlite3_limit(p->db, aLimit[iLimit].limitCode, 27402 (int)integerValue(azArg[2])); 27403 } 27404 sputf(stdout, "%20s %d\n", aLimit[iLimit].zLimitName, 27405 sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1)); 27406 } 27407 }else 27408 27409 if( c=='l' && n>2 && cli_strncmp(azArg[0], "lint", n)==0 ){ 27410 open_db(p, 0); 27411 lintDotCommand(p, azArg, nArg); 27412 }else 27413 27414 #if !defined(SQLITE_OMIT_LOAD_EXTENSION) && !defined(SQLITE_SHELL_FIDDLE) 27415 if( c=='l' && cli_strncmp(azArg[0], "load", n)==0 ){ 27416 const char *zFile, *zProc; 27417 char *zErrMsg = 0; 27418 failIfSafeMode(p, "cannot run .load in safe mode"); 27419 if( nArg<2 || azArg[1][0]==0 ){ 27420 /* Must have a non-empty FILE. (Will not load self.) */ 27421 eputz("Usage: .load FILE ?ENTRYPOINT?\n"); 27422 rc = 1; 27423 goto meta_command_exit; 27424 } 27425 zFile = azArg[1]; 27426 zProc = nArg>=3 ? azArg[2] : 0; 27427 open_db(p, 0); 27428 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg); 27429 if( rc!=SQLITE_OK ){ 27430 eputf("Error: %s\n", zErrMsg); 27431 sqlite3_free(zErrMsg); 27432 rc = 1; 27433 } 27434 }else 27435 #endif 27436 27437 if( c=='l' && cli_strncmp(azArg[0], "log", n)==0 ){ 27438 if( nArg!=2 ){ 27439 eputz("Usage: .log FILENAME\n"); 27440 rc = 1; 27441 }else{ 27442 const char *zFile = azArg[1]; 27443 if( p->bSafeMode 27444 && cli_strcmp(zFile,"on")!=0 27445 && cli_strcmp(zFile,"off")!=0 27446 ){ 27447 sputz(stdout, "cannot set .log to anything other" 27448 " than \"on\" or \"off\"\n"); 27449 zFile = "off"; 27450 } 27451 output_file_close(p->pLog); 27452 if( cli_strcmp(zFile,"on")==0 ) zFile = "stdout"; 27453 p->pLog = output_file_open(zFile, 0); 27454 } 27455 }else 27456 27457 if( c=='m' && cli_strncmp(azArg[0], "mode", n)==0 ){ 27458 const char *zMode = 0; 27459 const char *zTabname = 0; 27460 int i, n2; 27461 ColModeOpts cmOpts = ColModeOpts_default; 27462 for(i=1; i<nArg; i++){ 27463 const char *z = azArg[i]; 27464 if( optionMatch(z,"wrap") && i+1<nArg ){ 27465 cmOpts.iWrap = integerValue(azArg[++i]); 27466 }else if( optionMatch(z,"ww") ){ 27467 cmOpts.bWordWrap = 1; 27468 }else if( optionMatch(z,"wordwrap") && i+1<nArg ){ 27469 cmOpts.bWordWrap = (u8)booleanValue(azArg[++i]); 27470 }else if( optionMatch(z,"quote") ){ 27471 cmOpts.bQuote = 1; 27472 }else if( optionMatch(z,"noquote") ){ 27473 cmOpts.bQuote = 0; 27474 }else if( zMode==0 ){ 27475 zMode = z; 27476 /* Apply defaults for qbox pseudo-mode. If that 27477 * overwrites already-set values, user was informed of this. 27478 */ 27479 if( cli_strcmp(z, "qbox")==0 ){ 27480 ColModeOpts cmo = ColModeOpts_default_qbox; 27481 zMode = "box"; 27482 cmOpts = cmo; 27483 } 27484 }else if( zTabname==0 ){ 27485 zTabname = z; 27486 }else if( z[0]=='-' ){ 27487 eputf("unknown option: %s\n", z); 27488 eputz("options:\n" 27489 " --noquote\n" 27490 " --quote\n" 27491 " --wordwrap on/off\n" 27492 " --wrap N\n" 27493 " --ww\n"); 27494 rc = 1; 27495 goto meta_command_exit; 27496 }else{ 27497 eputf("extra argument: \"%s\"\n", z); 27498 rc = 1; 27499 goto meta_command_exit; 27500 } 27501 } 27502 if( zMode==0 ){ 27503 if( p->mode==MODE_Column 27504 || (p->mode>=MODE_Markdown && p->mode<=MODE_Box) 27505 ){ 27506 oputf("current output mode: %s --wrap %d --wordwrap %s --%squote\n", 27507 modeDescr[p->mode], p->cmOpts.iWrap, 27508 p->cmOpts.bWordWrap ? "on" : "off", 27509 p->cmOpts.bQuote ? "" : "no"); 27510 }else{ 27511 oputf("current output mode: %s\n", modeDescr[p->mode]); 27512 } 27513 zMode = modeDescr[p->mode]; 27514 } 27515 n2 = strlen30(zMode); 27516 if( cli_strncmp(zMode,"lines",n2)==0 ){ 27517 p->mode = MODE_Line; 27518 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 27519 }else if( cli_strncmp(zMode,"columns",n2)==0 ){ 27520 p->mode = MODE_Column; 27521 if( (p->shellFlgs & SHFLG_HeaderSet)==0 ){ 27522 p->showHeader = 1; 27523 } 27524 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 27525 p->cmOpts = cmOpts; 27526 }else if( cli_strncmp(zMode,"list",n2)==0 ){ 27527 p->mode = MODE_List; 27528 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Column); 27529 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 27530 }else if( cli_strncmp(zMode,"html",n2)==0 ){ 27531 p->mode = MODE_Html; 27532 }else if( cli_strncmp(zMode,"tcl",n2)==0 ){ 27533 p->mode = MODE_Tcl; 27534 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space); 27535 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 27536 }else if( cli_strncmp(zMode,"csv",n2)==0 ){ 27537 p->mode = MODE_Csv; 27538 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma); 27539 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf); 27540 }else if( cli_strncmp(zMode,"tabs",n2)==0 ){ 27541 p->mode = MODE_List; 27542 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab); 27543 }else if( cli_strncmp(zMode,"insert",n2)==0 ){ 27544 p->mode = MODE_Insert; 27545 set_table_name(p, zTabname ? zTabname : "table"); 27546 }else if( cli_strncmp(zMode,"quote",n2)==0 ){ 27547 p->mode = MODE_Quote; 27548 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma); 27549 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); 27550 }else if( cli_strncmp(zMode,"ascii",n2)==0 ){ 27551 p->mode = MODE_Ascii; 27552 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit); 27553 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record); 27554 }else if( cli_strncmp(zMode,"markdown",n2)==0 ){ 27555 p->mode = MODE_Markdown; 27556 p->cmOpts = cmOpts; 27557 }else if( cli_strncmp(zMode,"table",n2)==0 ){ 27558 p->mode = MODE_Table; 27559 p->cmOpts = cmOpts; 27560 }else if( cli_strncmp(zMode,"box",n2)==0 ){ 27561 p->mode = MODE_Box; 27562 p->cmOpts = cmOpts; 27563 }else if( cli_strncmp(zMode,"count",n2)==0 ){ 27564 p->mode = MODE_Count; 27565 }else if( cli_strncmp(zMode,"off",n2)==0 ){ 27566 p->mode = MODE_Off; 27567 }else if( cli_strncmp(zMode,"json",n2)==0 ){ 27568 p->mode = MODE_Json; 27569 }else{ 27570 eputz("Error: mode should be one of: " 27571 "ascii box column csv html insert json line list markdown " 27572 "qbox quote table tabs tcl\n"); 27573 rc = 1; 27574 } 27575 p->cMode = p->mode; 27576 }else 27577 27578 #ifndef SQLITE_SHELL_FIDDLE 27579 if( c=='n' && cli_strcmp(azArg[0], "nonce")==0 ){ 27580 if( nArg!=2 ){ 27581 eputz("Usage: .nonce NONCE\n"); 27582 rc = 1; 27583 }else if( p->zNonce==0 || cli_strcmp(azArg[1],p->zNonce)!=0 ){ 27584 eputf("line %d: incorrect nonce: \"%s\"\n", 27585 p->lineno, azArg[1]); 27586 exit(1); 27587 }else{ 27588 p->bSafeMode = 0; 27589 return 0; /* Return immediately to bypass the safe mode reset 27590 ** at the end of this procedure */ 27591 } 27592 }else 27593 #endif /* !defined(SQLITE_SHELL_FIDDLE) */ 27594 27595 if( c=='n' && cli_strncmp(azArg[0], "nullvalue", n)==0 ){ 27596 if( nArg==2 ){ 27597 sqlite3_snprintf(sizeof(p->nullValue), p->nullValue, 27598 "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]); 27599 }else{ 27600 eputz("Usage: .nullvalue STRING\n"); 27601 rc = 1; 27602 } 27603 }else 27604 27605 if( c=='o' && cli_strncmp(azArg[0], "open", n)==0 && n>=2 ){ 27606 const char *zFN = 0; /* Pointer to constant filename */ 27607 char *zNewFilename = 0; /* Name of the database file to open */ 27608 int iName = 1; /* Index in azArg[] of the filename */ 27609 int newFlag = 0; /* True to delete file before opening */ 27610 int openMode = SHELL_OPEN_UNSPEC; 27611 27612 /* Check for command-line arguments */ 27613 for(iName=1; iName<nArg; iName++){ 27614 const char *z = azArg[iName]; 27615 #ifndef SQLITE_SHELL_FIDDLE 27616 if( optionMatch(z,"new") ){ 27617 newFlag = 1; 27618 #ifdef SQLITE_HAVE_ZLIB 27619 }else if( optionMatch(z, "zip") ){ 27620 openMode = SHELL_OPEN_ZIPFILE; 27621 #endif 27622 }else if( optionMatch(z, "append") ){ 27623 openMode = SHELL_OPEN_APPENDVFS; 27624 }else if( optionMatch(z, "readonly") ){ 27625 openMode = SHELL_OPEN_READONLY; 27626 }else if( optionMatch(z, "nofollow") ){ 27627 p->openFlags |= SQLITE_OPEN_NOFOLLOW; 27628 #ifndef SQLITE_OMIT_DESERIALIZE 27629 }else if( optionMatch(z, "deserialize") ){ 27630 openMode = SHELL_OPEN_DESERIALIZE; 27631 }else if( optionMatch(z, "hexdb") ){ 27632 openMode = SHELL_OPEN_HEXDB; 27633 }else if( optionMatch(z, "maxsize") && iName+1<nArg ){ 27634 p->szMax = integerValue(azArg[++iName]); 27635 #endif /* SQLITE_OMIT_DESERIALIZE */ 27636 }else 27637 #endif /* !SQLITE_SHELL_FIDDLE */ 27638 if( z[0]=='-' ){ 27639 eputf("unknown option: %s\n", z); 27640 rc = 1; 27641 goto meta_command_exit; 27642 }else if( zFN ){ 27643 eputf("extra argument: \"%s\"\n", z); 27644 rc = 1; 27645 goto meta_command_exit; 27646 }else{ 27647 zFN = z; 27648 } 27649 } 27650 27651 /* Close the existing database */ 27652 session_close_all(p, -1); 27653 close_db(p->db); 27654 p->db = 0; 27655 p->pAuxDb->zDbFilename = 0; 27656 sqlite3_free(p->pAuxDb->zFreeOnClose); 27657 p->pAuxDb->zFreeOnClose = 0; 27658 p->openMode = openMode; 27659 p->openFlags = 0; 27660 p->szMax = 0; 27661 27662 /* If a filename is specified, try to open it first */ 27663 if( zFN || p->openMode==SHELL_OPEN_HEXDB ){ 27664 if( newFlag && zFN && !p->bSafeMode ) shellDeleteFile(zFN); 27665 #ifndef SQLITE_SHELL_FIDDLE 27666 if( p->bSafeMode 27667 && p->openMode!=SHELL_OPEN_HEXDB 27668 && zFN 27669 && cli_strcmp(zFN,":memory:")!=0 27670 ){ 27671 failIfSafeMode(p, "cannot open disk-based database files in safe mode"); 27672 } 27673 #else 27674 /* WASM mode has its own sandboxed pseudo-filesystem. */ 27675 #endif 27676 if( zFN ){ 27677 zNewFilename = sqlite3_mprintf("%s", zFN); 27678 shell_check_oom(zNewFilename); 27679 }else{ 27680 zNewFilename = 0; 27681 } 27682 p->pAuxDb->zDbFilename = zNewFilename; 27683 open_db(p, OPEN_DB_KEEPALIVE); 27684 if( p->db==0 ){ 27685 eputf("Error: cannot open '%s'\n", zNewFilename); 27686 sqlite3_free(zNewFilename); 27687 }else{ 27688 p->pAuxDb->zFreeOnClose = zNewFilename; 27689 } 27690 } 27691 if( p->db==0 ){ 27692 /* As a fall-back open a TEMP database */ 27693 p->pAuxDb->zDbFilename = 0; 27694 open_db(p, 0); 27695 } 27696 }else 27697 27698 #ifndef SQLITE_SHELL_FIDDLE 27699 if( (c=='o' 27700 && (cli_strncmp(azArg[0], "output", n)==0 27701 || cli_strncmp(azArg[0], "once", n)==0)) 27702 || (c=='e' && n==5 && cli_strcmp(azArg[0],"excel")==0) 27703 ){ 27704 char *zFile = 0; 27705 int bTxtMode = 0; 27706 int i; 27707 int eMode = 0; 27708 int bOnce = 0; /* 0: .output, 1: .once, 2: .excel */ 27709 static const char *zBomUtf8 = "\xef\xbb\xbf"; 27710 const char *zBom = 0; 27711 27712 failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]); 27713 if( c=='e' ){ 27714 eMode = 'x'; 27715 bOnce = 2; 27716 }else if( cli_strncmp(azArg[0],"once",n)==0 ){ 27717 bOnce = 1; 27718 } 27719 for(i=1; i<nArg; i++){ 27720 char *z = azArg[i]; 27721 if( z[0]=='-' ){ 27722 if( z[1]=='-' ) z++; 27723 if( cli_strcmp(z,"-bom")==0 ){ 27724 zBom = zBomUtf8; 27725 }else if( c!='e' && cli_strcmp(z,"-x")==0 ){ 27726 eMode = 'x'; /* spreadsheet */ 27727 }else if( c!='e' && cli_strcmp(z,"-e")==0 ){ 27728 eMode = 'e'; /* text editor */ 27729 }else{ 27730 oputf("ERROR: unknown option: \"%s\". Usage:\n", azArg[i]); 27731 showHelp(p->out, azArg[0]); 27732 rc = 1; 27733 goto meta_command_exit; 27734 } 27735 }else if( zFile==0 && eMode!='e' && eMode!='x' ){ 27736 zFile = sqlite3_mprintf("%s", z); 27737 if( zFile && zFile[0]=='|' ){ 27738 while( i+1<nArg ) zFile = sqlite3_mprintf("%z %s", zFile, azArg[++i]); 27739 break; 27740 } 27741 }else{ 27742 oputf("ERROR: extra parameter: \"%s\". Usage:\n", azArg[i]); 27743 showHelp(p->out, azArg[0]); 27744 rc = 1; 27745 sqlite3_free(zFile); 27746 goto meta_command_exit; 27747 } 27748 } 27749 if( zFile==0 ){ 27750 zFile = sqlite3_mprintf("stdout"); 27751 } 27752 if( bOnce ){ 27753 p->outCount = 2; 27754 }else{ 27755 p->outCount = 0; 27756 } 27757 output_reset(p); 27758 #ifndef SQLITE_NOHAVE_SYSTEM 27759 if( eMode=='e' || eMode=='x' ){ 27760 p->doXdgOpen = 1; 27761 outputModePush(p); 27762 if( eMode=='x' ){ 27763 /* spreadsheet mode. Output as CSV. */ 27764 newTempFile(p, "csv"); 27765 ShellClearFlag(p, SHFLG_Echo); 27766 p->mode = MODE_Csv; 27767 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma); 27768 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf); 27769 }else{ 27770 /* text editor mode */ 27771 newTempFile(p, "txt"); 27772 bTxtMode = 1; 27773 } 27774 sqlite3_free(zFile); 27775 zFile = sqlite3_mprintf("%s", p->zTempFile); 27776 } 27777 #endif /* SQLITE_NOHAVE_SYSTEM */ 27778 shell_check_oom(zFile); 27779 if( zFile[0]=='|' ){ 27780 #ifdef SQLITE_OMIT_POPEN 27781 eputz("Error: pipes are not supported in this OS\n"); 27782 rc = 1; 27783 output_redir(p, stdout); 27784 #else 27785 FILE *pfPipe = popen(zFile + 1, "w"); 27786 if( pfPipe==0 ){ 27787 eputf("Error: cannot open pipe \"%s\"\n", zFile + 1); 27788 rc = 1; 27789 }else{ 27790 output_redir(p, pfPipe); 27791 if( zBom ) oputz(zBom); 27792 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile); 27793 } 27794 #endif 27795 }else{ 27796 FILE *pfFile = output_file_open(zFile, bTxtMode); 27797 if( pfFile==0 ){ 27798 if( cli_strcmp(zFile,"off")!=0 ){ 27799 eputf("Error: cannot write to \"%s\"\n", zFile); 27800 } 27801 rc = 1; 27802 } else { 27803 output_redir(p, pfFile); 27804 if( zBom ) oputz(zBom); 27805 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile); 27806 } 27807 } 27808 sqlite3_free(zFile); 27809 }else 27810 #endif /* !defined(SQLITE_SHELL_FIDDLE) */ 27811 27812 if( c=='p' && n>=3 && cli_strncmp(azArg[0], "parameter", n)==0 ){ 27813 open_db(p,0); 27814 if( nArg<=1 ) goto parameter_syntax_error; 27815 27816 /* .parameter clear 27817 ** Clear all bind parameters by dropping the TEMP table that holds them. 27818 */ 27819 if( nArg==2 && cli_strcmp(azArg[1],"clear")==0 ){ 27820 sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp.sqlite_parameters;", 27821 0, 0, 0); 27822 }else 27823 27824 /* .parameter list 27825 ** List all bind parameters. 27826 */ 27827 if( nArg==2 && cli_strcmp(azArg[1],"list")==0 ){ 27828 sqlite3_stmt *pStmt = 0; 27829 int rx; 27830 int len = 0; 27831 rx = sqlite3_prepare_v2(p->db, 27832 "SELECT max(length(key)) " 27833 "FROM temp.sqlite_parameters;", -1, &pStmt, 0); 27834 if( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){ 27835 len = sqlite3_column_int(pStmt, 0); 27836 if( len>40 ) len = 40; 27837 } 27838 sqlite3_finalize(pStmt); 27839 pStmt = 0; 27840 if( len ){ 27841 rx = sqlite3_prepare_v2(p->db, 27842 "SELECT key, quote(value) " 27843 "FROM temp.sqlite_parameters;", -1, &pStmt, 0); 27844 while( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){ 27845 oputf("%-*s %s\n", len, sqlite3_column_text(pStmt,0), 27846 sqlite3_column_text(pStmt,1)); 27847 } 27848 sqlite3_finalize(pStmt); 27849 } 27850 }else 27851 27852 /* .parameter init 27853 ** Make sure the TEMP table used to hold bind parameters exists. 27854 ** Create it if necessary. 27855 */ 27856 if( nArg==2 && cli_strcmp(azArg[1],"init")==0 ){ 27857 bind_table_init(p); 27858 }else 27859 27860 /* .parameter set NAME VALUE 27861 ** Set or reset a bind parameter. NAME should be the full parameter 27862 ** name exactly as it appears in the query. (ex: $abc, @def). The 27863 ** VALUE can be in either SQL literal notation, or if not it will be 27864 ** understood to be a text string. 27865 */ 27866 if( nArg==4 && cli_strcmp(azArg[1],"set")==0 ){ 27867 int rx; 27868 char *zSql; 27869 sqlite3_stmt *pStmt; 27870 const char *zKey = azArg[2]; 27871 const char *zValue = azArg[3]; 27872 bind_table_init(p); 27873 zSql = sqlite3_mprintf( 27874 "REPLACE INTO temp.sqlite_parameters(key,value)" 27875 "VALUES(%Q,%s);", zKey, zValue); 27876 shell_check_oom(zSql); 27877 pStmt = 0; 27878 rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 27879 sqlite3_free(zSql); 27880 if( rx!=SQLITE_OK ){ 27881 sqlite3_finalize(pStmt); 27882 pStmt = 0; 27883 zSql = sqlite3_mprintf( 27884 "REPLACE INTO temp.sqlite_parameters(key,value)" 27885 "VALUES(%Q,%Q);", zKey, zValue); 27886 shell_check_oom(zSql); 27887 rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 27888 sqlite3_free(zSql); 27889 if( rx!=SQLITE_OK ){ 27890 oputf("Error: %s\n", sqlite3_errmsg(p->db)); 27891 sqlite3_finalize(pStmt); 27892 pStmt = 0; 27893 rc = 1; 27894 } 27895 } 27896 sqlite3_step(pStmt); 27897 sqlite3_finalize(pStmt); 27898 }else 27899 27900 /* .parameter unset NAME 27901 ** Remove the NAME binding from the parameter binding table, if it 27902 ** exists. 27903 */ 27904 if( nArg==3 && cli_strcmp(azArg[1],"unset")==0 ){ 27905 char *zSql = sqlite3_mprintf( 27906 "DELETE FROM temp.sqlite_parameters WHERE key=%Q", azArg[2]); 27907 shell_check_oom(zSql); 27908 sqlite3_exec(p->db, zSql, 0, 0, 0); 27909 sqlite3_free(zSql); 27910 }else 27911 /* If no command name matches, show a syntax error */ 27912 parameter_syntax_error: 27913 showHelp(p->out, "parameter"); 27914 }else 27915 27916 if( c=='p' && n>=3 && cli_strncmp(azArg[0], "print", n)==0 ){ 27917 int i; 27918 for(i=1; i<nArg; i++){ 27919 if( i>1 ) oputz(" "); 27920 oputz(azArg[i]); 27921 } 27922 oputz("\n"); 27923 }else 27924 27925 #ifndef SQLITE_OMIT_PROGRESS_CALLBACK 27926 if( c=='p' && n>=3 && cli_strncmp(azArg[0], "progress", n)==0 ){ 27927 int i; 27928 int nn = 0; 27929 p->flgProgress = 0; 27930 p->mxProgress = 0; 27931 p->nProgress = 0; 27932 for(i=1; i<nArg; i++){ 27933 const char *z = azArg[i]; 27934 if( z[0]=='-' ){ 27935 z++; 27936 if( z[0]=='-' ) z++; 27937 if( cli_strcmp(z,"quiet")==0 || cli_strcmp(z,"q")==0 ){ 27938 p->flgProgress |= SHELL_PROGRESS_QUIET; 27939 continue; 27940 } 27941 if( cli_strcmp(z,"reset")==0 ){ 27942 p->flgProgress |= SHELL_PROGRESS_RESET; 27943 continue; 27944 } 27945 if( cli_strcmp(z,"once")==0 ){ 27946 p->flgProgress |= SHELL_PROGRESS_ONCE; 27947 continue; 27948 } 27949 if( cli_strcmp(z,"limit")==0 ){ 27950 if( i+1>=nArg ){ 27951 eputz("Error: missing argument on --limit\n"); 27952 rc = 1; 27953 goto meta_command_exit; 27954 }else{ 27955 p->mxProgress = (int)integerValue(azArg[++i]); 27956 } 27957 continue; 27958 } 27959 eputf("Error: unknown option: \"%s\"\n", azArg[i]); 27960 rc = 1; 27961 goto meta_command_exit; 27962 }else{ 27963 nn = (int)integerValue(z); 27964 } 27965 } 27966 open_db(p, 0); 27967 sqlite3_progress_handler(p->db, nn, progress_handler, p); 27968 }else 27969 #endif /* SQLITE_OMIT_PROGRESS_CALLBACK */ 27970 27971 if( c=='p' && cli_strncmp(azArg[0], "prompt", n)==0 ){ 27972 if( nArg >= 2) { 27973 shell_strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1); 27974 } 27975 if( nArg >= 3) { 27976 shell_strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1); 27977 } 27978 }else 27979 27980 #ifndef SQLITE_SHELL_FIDDLE 27981 if( c=='q' && cli_strncmp(azArg[0], "quit", n)==0 ){ 27982 rc = 2; 27983 }else 27984 #endif 27985 27986 #ifndef SQLITE_SHELL_FIDDLE 27987 if( c=='r' && n>=3 && cli_strncmp(azArg[0], "read", n)==0 ){ 27988 FILE *inSaved = p->in; 27989 int savedLineno = p->lineno; 27990 failIfSafeMode(p, "cannot run .read in safe mode"); 27991 if( nArg!=2 ){ 27992 eputz("Usage: .read FILE\n"); 27993 rc = 1; 27994 goto meta_command_exit; 27995 } 27996 if( azArg[1][0]=='|' ){ 27997 #ifdef SQLITE_OMIT_POPEN 27998 eputz("Error: pipes are not supported in this OS\n"); 27999 rc = 1; 28000 p->out = stdout; 28001 #else 28002 p->in = popen(azArg[1]+1, "r"); 28003 if( p->in==0 ){ 28004 eputf("Error: cannot open \"%s\"\n", azArg[1]); 28005 rc = 1; 28006 }else{ 28007 rc = process_input(p); 28008 pclose(p->in); 28009 } 28010 #endif 28011 }else if( (p->in = openChrSource(azArg[1]))==0 ){ 28012 eputf("Error: cannot open \"%s\"\n", azArg[1]); 28013 rc = 1; 28014 }else{ 28015 rc = process_input(p); 28016 fclose(p->in); 28017 } 28018 p->in = inSaved; 28019 p->lineno = savedLineno; 28020 }else 28021 #endif /* !defined(SQLITE_SHELL_FIDDLE) */ 28022 28023 #ifndef SQLITE_SHELL_FIDDLE 28024 if( c=='r' && n>=3 && cli_strncmp(azArg[0], "restore", n)==0 ){ 28025 const char *zSrcFile; 28026 const char *zDb; 28027 sqlite3 *pSrc; 28028 sqlite3_backup *pBackup; 28029 int nTimeout = 0; 28030 28031 failIfSafeMode(p, "cannot run .restore in safe mode"); 28032 if( nArg==2 ){ 28033 zSrcFile = azArg[1]; 28034 zDb = "main"; 28035 }else if( nArg==3 ){ 28036 zSrcFile = azArg[2]; 28037 zDb = azArg[1]; 28038 }else{ 28039 eputz("Usage: .restore ?DB? FILE\n"); 28040 rc = 1; 28041 goto meta_command_exit; 28042 } 28043 rc = sqlite3_open(zSrcFile, &pSrc); 28044 if( rc!=SQLITE_OK ){ 28045 eputf("Error: cannot open \"%s\"\n", zSrcFile); 28046 close_db(pSrc); 28047 return 1; 28048 } 28049 open_db(p, 0); 28050 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main"); 28051 if( pBackup==0 ){ 28052 eputf("Error: %s\n", sqlite3_errmsg(p->db)); 28053 close_db(pSrc); 28054 return 1; 28055 } 28056 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK 28057 || rc==SQLITE_BUSY ){ 28058 if( rc==SQLITE_BUSY ){ 28059 if( nTimeout++ >= 3 ) break; 28060 sqlite3_sleep(100); 28061 } 28062 } 28063 sqlite3_backup_finish(pBackup); 28064 if( rc==SQLITE_DONE ){ 28065 rc = 0; 28066 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){ 28067 eputz("Error: source database is busy\n"); 28068 rc = 1; 28069 }else{ 28070 eputf("Error: %s\n", sqlite3_errmsg(p->db)); 28071 rc = 1; 28072 } 28073 close_db(pSrc); 28074 }else 28075 #endif /* !defined(SQLITE_SHELL_FIDDLE) */ 28076 28077 if( c=='s' && cli_strncmp(azArg[0], "scanstats", n)==0 ){ 28078 if( nArg==2 ){ 28079 if( cli_strcmp(azArg[1], "vm")==0 ){ 28080 p->scanstatsOn = 3; 28081 }else 28082 if( cli_strcmp(azArg[1], "est")==0 ){ 28083 p->scanstatsOn = 2; 28084 }else{ 28085 p->scanstatsOn = (u8)booleanValue(azArg[1]); 28086 } 28087 open_db(p, 0); 28088 sqlite3_db_config( 28089 p->db, SQLITE_DBCONFIG_STMT_SCANSTATUS, p->scanstatsOn, (int*)0 28090 ); 28091 #if !defined(SQLITE_ENABLE_STMT_SCANSTATUS) 28092 eputz("Warning: .scanstats not available in this build.\n"); 28093 #elif !defined(SQLITE_ENABLE_BYTECODE_VTAB) 28094 if( p->scanstatsOn==3 ){ 28095 eputz("Warning: \".scanstats vm\" not available in this build.\n"); 28096 } 28097 #endif 28098 }else{ 28099 eputz("Usage: .scanstats on|off|est\n"); 28100 rc = 1; 28101 } 28102 }else 28103 28104 if( c=='s' && cli_strncmp(azArg[0], "schema", n)==0 ){ 28105 ShellText sSelect; 28106 ShellState data; 28107 char *zErrMsg = 0; 28108 const char *zDiv = "("; 28109 const char *zName = 0; 28110 int iSchema = 0; 28111 int bDebug = 0; 28112 int bNoSystemTabs = 0; 28113 int ii; 28114 28115 open_db(p, 0); 28116 memcpy(&data, p, sizeof(data)); 28117 data.showHeader = 0; 28118 data.cMode = data.mode = MODE_Semi; 28119 initText(&sSelect); 28120 for(ii=1; ii<nArg; ii++){ 28121 if( optionMatch(azArg[ii],"indent") ){ 28122 data.cMode = data.mode = MODE_Pretty; 28123 }else if( optionMatch(azArg[ii],"debug") ){ 28124 bDebug = 1; 28125 }else if( optionMatch(azArg[ii],"nosys") ){ 28126 bNoSystemTabs = 1; 28127 }else if( azArg[ii][0]=='-' ){ 28128 eputf("Unknown option: \"%s\"\n", azArg[ii]); 28129 rc = 1; 28130 goto meta_command_exit; 28131 }else if( zName==0 ){ 28132 zName = azArg[ii]; 28133 }else{ 28134 eputz("Usage: .schema ?--indent? ?--nosys? ?LIKE-PATTERN?\n"); 28135 rc = 1; 28136 goto meta_command_exit; 28137 } 28138 } 28139 if( zName!=0 ){ 28140 int isSchema = sqlite3_strlike(zName, "sqlite_master", '\\')==0 28141 || sqlite3_strlike(zName, "sqlite_schema", '\\')==0 28142 || sqlite3_strlike(zName,"sqlite_temp_master", '\\')==0 28143 || sqlite3_strlike(zName,"sqlite_temp_schema", '\\')==0; 28144 if( isSchema ){ 28145 char *new_argv[2], *new_colv[2]; 28146 new_argv[0] = sqlite3_mprintf( 28147 "CREATE TABLE %s (\n" 28148 " type text,\n" 28149 " name text,\n" 28150 " tbl_name text,\n" 28151 " rootpage integer,\n" 28152 " sql text\n" 28153 ")", zName); 28154 shell_check_oom(new_argv[0]); 28155 new_argv[1] = 0; 28156 new_colv[0] = "sql"; 28157 new_colv[1] = 0; 28158 callback(&data, 1, new_argv, new_colv); 28159 sqlite3_free(new_argv[0]); 28160 } 28161 } 28162 if( zDiv ){ 28163 sqlite3_stmt *pStmt = 0; 28164 rc = sqlite3_prepare_v2(p->db, "SELECT name FROM pragma_database_list", 28165 -1, &pStmt, 0); 28166 if( rc ){ 28167 eputf("Error: %s\n", sqlite3_errmsg(p->db)); 28168 sqlite3_finalize(pStmt); 28169 rc = 1; 28170 goto meta_command_exit; 28171 } 28172 appendText(&sSelect, "SELECT sql FROM", 0); 28173 iSchema = 0; 28174 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 28175 const char *zDb = (const char*)sqlite3_column_text(pStmt, 0); 28176 char zScNum[30]; 28177 sqlite3_snprintf(sizeof(zScNum), zScNum, "%d", ++iSchema); 28178 appendText(&sSelect, zDiv, 0); 28179 zDiv = " UNION ALL "; 28180 appendText(&sSelect, "SELECT shell_add_schema(sql,", 0); 28181 if( sqlite3_stricmp(zDb, "main")!=0 ){ 28182 appendText(&sSelect, zDb, '\''); 28183 }else{ 28184 appendText(&sSelect, "NULL", 0); 28185 } 28186 appendText(&sSelect, ",name) AS sql, type, tbl_name, name, rowid,", 0); 28187 appendText(&sSelect, zScNum, 0); 28188 appendText(&sSelect, " AS snum, ", 0); 28189 appendText(&sSelect, zDb, '\''); 28190 appendText(&sSelect, " AS sname FROM ", 0); 28191 appendText(&sSelect, zDb, quoteChar(zDb)); 28192 appendText(&sSelect, ".sqlite_schema", 0); 28193 } 28194 sqlite3_finalize(pStmt); 28195 #ifndef SQLITE_OMIT_INTROSPECTION_PRAGMAS 28196 if( zName ){ 28197 appendText(&sSelect, 28198 " UNION ALL SELECT shell_module_schema(name)," 28199 " 'table', name, name, name, 9e+99, 'main' FROM pragma_module_list", 28200 0); 28201 } 28202 #endif 28203 appendText(&sSelect, ") WHERE ", 0); 28204 if( zName ){ 28205 char *zQarg = sqlite3_mprintf("%Q", zName); 28206 int bGlob; 28207 shell_check_oom(zQarg); 28208 bGlob = strchr(zName, '*') != 0 || strchr(zName, '?') != 0 || 28209 strchr(zName, '[') != 0; 28210 if( strchr(zName, '.') ){ 28211 appendText(&sSelect, "lower(printf('%s.%s',sname,tbl_name))", 0); 28212 }else{ 28213 appendText(&sSelect, "lower(tbl_name)", 0); 28214 } 28215 appendText(&sSelect, bGlob ? " GLOB " : " LIKE ", 0); 28216 appendText(&sSelect, zQarg, 0); 28217 if( !bGlob ){ 28218 appendText(&sSelect, " ESCAPE '\\' ", 0); 28219 } 28220 appendText(&sSelect, " AND ", 0); 28221 sqlite3_free(zQarg); 28222 } 28223 if( bNoSystemTabs ){ 28224 appendText(&sSelect, "name NOT LIKE 'sqlite_%%' AND ", 0); 28225 } 28226 appendText(&sSelect, "sql IS NOT NULL" 28227 " ORDER BY snum, rowid", 0); 28228 if( bDebug ){ 28229 oputf("SQL: %s;\n", sSelect.z); 28230 }else{ 28231 rc = sqlite3_exec(p->db, sSelect.z, callback, &data, &zErrMsg); 28232 } 28233 freeText(&sSelect); 28234 } 28235 if( zErrMsg ){ 28236 eputf("Error: %s\n", zErrMsg); 28237 sqlite3_free(zErrMsg); 28238 rc = 1; 28239 }else if( rc != SQLITE_OK ){ 28240 eputz("Error: querying schema information\n"); 28241 rc = 1; 28242 }else{ 28243 rc = 0; 28244 } 28245 }else 28246 28247 if( (c=='s' && n==11 && cli_strncmp(azArg[0], "selecttrace", n)==0) 28248 || (c=='t' && n==9 && cli_strncmp(azArg[0], "treetrace", n)==0) 28249 ){ 28250 unsigned int x = nArg>=2? (unsigned int)integerValue(azArg[1]) : 0xffffffff; 28251 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &x); 28252 }else 28253 28254 #if defined(SQLITE_ENABLE_SESSION) 28255 if( c=='s' && cli_strncmp(azArg[0],"session",n)==0 && n>=3 ){ 28256 struct AuxDb *pAuxDb = p->pAuxDb; 28257 OpenSession *pSession = &pAuxDb->aSession[0]; 28258 char **azCmd = &azArg[1]; 28259 int iSes = 0; 28260 int nCmd = nArg - 1; 28261 int i; 28262 if( nArg<=1 ) goto session_syntax_error; 28263 open_db(p, 0); 28264 if( nArg>=3 ){ 28265 for(iSes=0; iSes<pAuxDb->nSession; iSes++){ 28266 if( cli_strcmp(pAuxDb->aSession[iSes].zName, azArg[1])==0 ) break; 28267 } 28268 if( iSes<pAuxDb->nSession ){ 28269 pSession = &pAuxDb->aSession[iSes]; 28270 azCmd++; 28271 nCmd--; 28272 }else{ 28273 pSession = &pAuxDb->aSession[0]; 28274 iSes = 0; 28275 } 28276 } 28277 28278 /* .session attach TABLE 28279 ** Invoke the sqlite3session_attach() interface to attach a particular 28280 ** table so that it is never filtered. 28281 */ 28282 if( cli_strcmp(azCmd[0],"attach")==0 ){ 28283 if( nCmd!=2 ) goto session_syntax_error; 28284 if( pSession->p==0 ){ 28285 session_not_open: 28286 eputz("ERROR: No sessions are open\n"); 28287 }else{ 28288 rc = sqlite3session_attach(pSession->p, azCmd[1]); 28289 if( rc ){ 28290 eputf("ERROR: sqlite3session_attach() returns %d\n",rc); 28291 rc = 0; 28292 } 28293 } 28294 }else 28295 28296 /* .session changeset FILE 28297 ** .session patchset FILE 28298 ** Write a changeset or patchset into a file. The file is overwritten. 28299 */ 28300 if( cli_strcmp(azCmd[0],"changeset")==0 28301 || cli_strcmp(azCmd[0],"patchset")==0 28302 ){ 28303 FILE *out = 0; 28304 failIfSafeMode(p, "cannot run \".session %s\" in safe mode", azCmd[0]); 28305 if( nCmd!=2 ) goto session_syntax_error; 28306 if( pSession->p==0 ) goto session_not_open; 28307 out = fopen(azCmd[1], "wb"); 28308 if( out==0 ){ 28309 eputf("ERROR: cannot open \"%s\" for writing\n", 28310 azCmd[1]); 28311 }else{ 28312 int szChng; 28313 void *pChng; 28314 if( azCmd[0][0]=='c' ){ 28315 rc = sqlite3session_changeset(pSession->p, &szChng, &pChng); 28316 }else{ 28317 rc = sqlite3session_patchset(pSession->p, &szChng, &pChng); 28318 } 28319 if( rc ){ 28320 sputf(stdout, "Error: error code %d\n", rc); 28321 rc = 0; 28322 } 28323 if( pChng 28324 && fwrite(pChng, szChng, 1, out)!=1 ){ 28325 eputf("ERROR: Failed to write entire %d-byte output\n", szChng); 28326 } 28327 sqlite3_free(pChng); 28328 fclose(out); 28329 } 28330 }else 28331 28332 /* .session close 28333 ** Close the identified session 28334 */ 28335 if( cli_strcmp(azCmd[0], "close")==0 ){ 28336 if( nCmd!=1 ) goto session_syntax_error; 28337 if( pAuxDb->nSession ){ 28338 session_close(pSession); 28339 pAuxDb->aSession[iSes] = pAuxDb->aSession[--pAuxDb->nSession]; 28340 } 28341 }else 28342 28343 /* .session enable ?BOOLEAN? 28344 ** Query or set the enable flag 28345 */ 28346 if( cli_strcmp(azCmd[0], "enable")==0 ){ 28347 int ii; 28348 if( nCmd>2 ) goto session_syntax_error; 28349 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]); 28350 if( pAuxDb->nSession ){ 28351 ii = sqlite3session_enable(pSession->p, ii); 28352 oputf("session %s enable flag = %d\n", pSession->zName, ii); 28353 } 28354 }else 28355 28356 /* .session filter GLOB .... 28357 ** Set a list of GLOB patterns of table names to be excluded. 28358 */ 28359 if( cli_strcmp(azCmd[0], "filter")==0 ){ 28360 int ii, nByte; 28361 if( nCmd<2 ) goto session_syntax_error; 28362 if( pAuxDb->nSession ){ 28363 for(ii=0; ii<pSession->nFilter; ii++){ 28364 sqlite3_free(pSession->azFilter[ii]); 28365 } 28366 sqlite3_free(pSession->azFilter); 28367 nByte = sizeof(pSession->azFilter[0])*(nCmd-1); 28368 pSession->azFilter = sqlite3_malloc( nByte ); 28369 shell_check_oom( pSession->azFilter ); 28370 for(ii=1; ii<nCmd; ii++){ 28371 char *x = pSession->azFilter[ii-1] = sqlite3_mprintf("%s", azCmd[ii]); 28372 shell_check_oom(x); 28373 } 28374 pSession->nFilter = ii-1; 28375 } 28376 }else 28377 28378 /* .session indirect ?BOOLEAN? 28379 ** Query or set the indirect flag 28380 */ 28381 if( cli_strcmp(azCmd[0], "indirect")==0 ){ 28382 int ii; 28383 if( nCmd>2 ) goto session_syntax_error; 28384 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]); 28385 if( pAuxDb->nSession ){ 28386 ii = sqlite3session_indirect(pSession->p, ii); 28387 oputf("session %s indirect flag = %d\n", pSession->zName, ii); 28388 } 28389 }else 28390 28391 /* .session isempty 28392 ** Determine if the session is empty 28393 */ 28394 if( cli_strcmp(azCmd[0], "isempty")==0 ){ 28395 int ii; 28396 if( nCmd!=1 ) goto session_syntax_error; 28397 if( pAuxDb->nSession ){ 28398 ii = sqlite3session_isempty(pSession->p); 28399 oputf("session %s isempty flag = %d\n", pSession->zName, ii); 28400 } 28401 }else 28402 28403 /* .session list 28404 ** List all currently open sessions 28405 */ 28406 if( cli_strcmp(azCmd[0],"list")==0 ){ 28407 for(i=0; i<pAuxDb->nSession; i++){ 28408 oputf("%d %s\n", i, pAuxDb->aSession[i].zName); 28409 } 28410 }else 28411 28412 /* .session open DB NAME 28413 ** Open a new session called NAME on the attached database DB. 28414 ** DB is normally "main". 28415 */ 28416 if( cli_strcmp(azCmd[0],"open")==0 ){ 28417 char *zName; 28418 if( nCmd!=3 ) goto session_syntax_error; 28419 zName = azCmd[2]; 28420 if( zName[0]==0 ) goto session_syntax_error; 28421 for(i=0; i<pAuxDb->nSession; i++){ 28422 if( cli_strcmp(pAuxDb->aSession[i].zName,zName)==0 ){ 28423 eputf("Session \"%s\" already exists\n", zName); 28424 goto meta_command_exit; 28425 } 28426 } 28427 if( pAuxDb->nSession>=ArraySize(pAuxDb->aSession) ){ 28428 eputf("Maximum of %d sessions\n", ArraySize(pAuxDb->aSession)); 28429 goto meta_command_exit; 28430 } 28431 pSession = &pAuxDb->aSession[pAuxDb->nSession]; 28432 rc = sqlite3session_create(p->db, azCmd[1], &pSession->p); 28433 if( rc ){ 28434 eputf("Cannot open session: error code=%d\n", rc); 28435 rc = 0; 28436 goto meta_command_exit; 28437 } 28438 pSession->nFilter = 0; 28439 sqlite3session_table_filter(pSession->p, session_filter, pSession); 28440 pAuxDb->nSession++; 28441 pSession->zName = sqlite3_mprintf("%s", zName); 28442 shell_check_oom(pSession->zName); 28443 }else 28444 /* If no command name matches, show a syntax error */ 28445 session_syntax_error: 28446 showHelp(p->out, "session"); 28447 }else 28448 #endif 28449 28450 #ifdef SQLITE_DEBUG 28451 /* Undocumented commands for internal testing. Subject to change 28452 ** without notice. */ 28453 if( c=='s' && n>=10 && cli_strncmp(azArg[0], "selftest-", 9)==0 ){ 28454 if( cli_strncmp(azArg[0]+9, "boolean", n-9)==0 ){ 28455 int i, v; 28456 for(i=1; i<nArg; i++){ 28457 v = booleanValue(azArg[i]); 28458 oputf("%s: %d 0x%x\n", azArg[i], v, v); 28459 } 28460 } 28461 if( cli_strncmp(azArg[0]+9, "integer", n-9)==0 ){ 28462 int i; sqlite3_int64 v; 28463 for(i=1; i<nArg; i++){ 28464 char zBuf[200]; 28465 v = integerValue(azArg[i]); 28466 sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v); 28467 oputz(zBuf); 28468 } 28469 } 28470 }else 28471 #endif 28472 28473 if( c=='s' && n>=4 && cli_strncmp(azArg[0],"selftest",n)==0 ){ 28474 int bIsInit = 0; /* True to initialize the SELFTEST table */ 28475 int bVerbose = 0; /* Verbose output */ 28476 int bSelftestExists; /* True if SELFTEST already exists */ 28477 int i, k; /* Loop counters */ 28478 int nTest = 0; /* Number of tests runs */ 28479 int nErr = 0; /* Number of errors seen */ 28480 ShellText str; /* Answer for a query */ 28481 sqlite3_stmt *pStmt = 0; /* Query against the SELFTEST table */ 28482 28483 open_db(p,0); 28484 for(i=1; i<nArg; i++){ 28485 const char *z = azArg[i]; 28486 if( z[0]=='-' && z[1]=='-' ) z++; 28487 if( cli_strcmp(z,"-init")==0 ){ 28488 bIsInit = 1; 28489 }else 28490 if( cli_strcmp(z,"-v")==0 ){ 28491 bVerbose++; 28492 }else 28493 { 28494 eputf("Unknown option \"%s\" on \"%s\"\n", azArg[i], azArg[0]); 28495 eputz("Should be one of: --init -v\n"); 28496 rc = 1; 28497 goto meta_command_exit; 28498 } 28499 } 28500 if( sqlite3_table_column_metadata(p->db,"main","selftest",0,0,0,0,0,0) 28501 != SQLITE_OK ){ 28502 bSelftestExists = 0; 28503 }else{ 28504 bSelftestExists = 1; 28505 } 28506 if( bIsInit ){ 28507 createSelftestTable(p); 28508 bSelftestExists = 1; 28509 } 28510 initText(&str); 28511 appendText(&str, "x", 0); 28512 for(k=bSelftestExists; k>=0; k--){ 28513 if( k==1 ){ 28514 rc = sqlite3_prepare_v2(p->db, 28515 "SELECT tno,op,cmd,ans FROM selftest ORDER BY tno", 28516 -1, &pStmt, 0); 28517 }else{ 28518 rc = sqlite3_prepare_v2(p->db, 28519 "VALUES(0,'memo','Missing SELFTEST table - default checks only','')," 28520 " (1,'run','PRAGMA integrity_check','ok')", 28521 -1, &pStmt, 0); 28522 } 28523 if( rc ){ 28524 eputz("Error querying the selftest table\n"); 28525 rc = 1; 28526 sqlite3_finalize(pStmt); 28527 goto meta_command_exit; 28528 } 28529 for(i=1; sqlite3_step(pStmt)==SQLITE_ROW; i++){ 28530 int tno = sqlite3_column_int(pStmt, 0); 28531 const char *zOp = (const char*)sqlite3_column_text(pStmt, 1); 28532 const char *zSql = (const char*)sqlite3_column_text(pStmt, 2); 28533 const char *zAns = (const char*)sqlite3_column_text(pStmt, 3); 28534 28535 if( zOp==0 ) continue; 28536 if( zSql==0 ) continue; 28537 if( zAns==0 ) continue; 28538 k = 0; 28539 if( bVerbose>0 ){ 28540 sputf(stdout, "%d: %s %s\n", tno, zOp, zSql); 28541 } 28542 if( cli_strcmp(zOp,"memo")==0 ){ 28543 oputf("%s\n", zSql); 28544 }else 28545 if( cli_strcmp(zOp,"run")==0 ){ 28546 char *zErrMsg = 0; 28547 str.n = 0; 28548 str.z[0] = 0; 28549 rc = sqlite3_exec(p->db, zSql, captureOutputCallback, &str, &zErrMsg); 28550 nTest++; 28551 if( bVerbose ){ 28552 oputf("Result: %s\n", str.z); 28553 } 28554 if( rc || zErrMsg ){ 28555 nErr++; 28556 rc = 1; 28557 oputf("%d: error-code-%d: %s\n", tno, rc, zErrMsg); 28558 sqlite3_free(zErrMsg); 28559 }else if( cli_strcmp(zAns,str.z)!=0 ){ 28560 nErr++; 28561 rc = 1; 28562 oputf("%d: Expected: [%s]\n", tno, zAns); 28563 oputf("%d: Got: [%s]\n", tno, str.z); 28564 } 28565 } 28566 else{ 28567 eputf("Unknown operation \"%s\" on selftest line %d\n", zOp, tno); 28568 rc = 1; 28569 break; 28570 } 28571 } /* End loop over rows of content from SELFTEST */ 28572 sqlite3_finalize(pStmt); 28573 } /* End loop over k */ 28574 freeText(&str); 28575 oputf("%d errors out of %d tests\n", nErr, nTest); 28576 }else 28577 28578 if( c=='s' && cli_strncmp(azArg[0], "separator", n)==0 ){ 28579 if( nArg<2 || nArg>3 ){ 28580 eputz("Usage: .separator COL ?ROW?\n"); 28581 rc = 1; 28582 } 28583 if( nArg>=2 ){ 28584 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, 28585 "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]); 28586 } 28587 if( nArg>=3 ){ 28588 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, 28589 "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]); 28590 } 28591 }else 28592 28593 if( c=='s' && n>=4 && cli_strncmp(azArg[0],"sha3sum",n)==0 ){ 28594 const char *zLike = 0; /* Which table to checksum. 0 means everything */ 28595 int i; /* Loop counter */ 28596 int bSchema = 0; /* Also hash the schema */ 28597 int bSeparate = 0; /* Hash each table separately */ 28598 int iSize = 224; /* Hash algorithm to use */ 28599 int bDebug = 0; /* Only show the query that would have run */ 28600 sqlite3_stmt *pStmt; /* For querying tables names */ 28601 char *zSql; /* SQL to be run */ 28602 char *zSep; /* Separator */ 28603 ShellText sSql; /* Complete SQL for the query to run the hash */ 28604 ShellText sQuery; /* Set of queries used to read all content */ 28605 open_db(p, 0); 28606 for(i=1; i<nArg; i++){ 28607 const char *z = azArg[i]; 28608 if( z[0]=='-' ){ 28609 z++; 28610 if( z[0]=='-' ) z++; 28611 if( cli_strcmp(z,"schema")==0 ){ 28612 bSchema = 1; 28613 }else 28614 if( cli_strcmp(z,"sha3-224")==0 || cli_strcmp(z,"sha3-256")==0 28615 || cli_strcmp(z,"sha3-384")==0 || cli_strcmp(z,"sha3-512")==0 28616 ){ 28617 iSize = atoi(&z[5]); 28618 }else 28619 if( cli_strcmp(z,"debug")==0 ){ 28620 bDebug = 1; 28621 }else 28622 { 28623 eputf("Unknown option \"%s\" on \"%s\"\n", azArg[i], azArg[0]); 28624 showHelp(p->out, azArg[0]); 28625 rc = 1; 28626 goto meta_command_exit; 28627 } 28628 }else if( zLike ){ 28629 eputz("Usage: .sha3sum ?OPTIONS? ?LIKE-PATTERN?\n"); 28630 rc = 1; 28631 goto meta_command_exit; 28632 }else{ 28633 zLike = z; 28634 bSeparate = 1; 28635 if( sqlite3_strlike("sqlite\\_%", zLike, '\\')==0 ) bSchema = 1; 28636 } 28637 } 28638 if( bSchema ){ 28639 zSql = "SELECT lower(name) as tname FROM sqlite_schema" 28640 " WHERE type='table' AND coalesce(rootpage,0)>1" 28641 " UNION ALL SELECT 'sqlite_schema'" 28642 " ORDER BY 1 collate nocase"; 28643 }else{ 28644 zSql = "SELECT lower(name) as tname FROM sqlite_schema" 28645 " WHERE type='table' AND coalesce(rootpage,0)>1" 28646 " AND name NOT LIKE 'sqlite_%'" 28647 " ORDER BY 1 collate nocase"; 28648 } 28649 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); 28650 initText(&sQuery); 28651 initText(&sSql); 28652 appendText(&sSql, "WITH [sha3sum$query](a,b) AS(",0); 28653 zSep = "VALUES("; 28654 while( SQLITE_ROW==sqlite3_step(pStmt) ){ 28655 const char *zTab = (const char*)sqlite3_column_text(pStmt,0); 28656 if( zTab==0 ) continue; 28657 if( zLike && sqlite3_strlike(zLike, zTab, 0)!=0 ) continue; 28658 if( cli_strncmp(zTab, "sqlite_",7)!=0 ){ 28659 appendText(&sQuery,"SELECT * FROM ", 0); 28660 appendText(&sQuery,zTab,'"'); 28661 appendText(&sQuery," NOT INDEXED;", 0); 28662 }else if( cli_strcmp(zTab, "sqlite_schema")==0 ){ 28663 appendText(&sQuery,"SELECT type,name,tbl_name,sql FROM sqlite_schema" 28664 " ORDER BY name;", 0); 28665 }else if( cli_strcmp(zTab, "sqlite_sequence")==0 ){ 28666 appendText(&sQuery,"SELECT name,seq FROM sqlite_sequence" 28667 " ORDER BY name;", 0); 28668 }else if( cli_strcmp(zTab, "sqlite_stat1")==0 ){ 28669 appendText(&sQuery,"SELECT tbl,idx,stat FROM sqlite_stat1" 28670 " ORDER BY tbl,idx;", 0); 28671 }else if( cli_strcmp(zTab, "sqlite_stat4")==0 ){ 28672 appendText(&sQuery, "SELECT * FROM ", 0); 28673 appendText(&sQuery, zTab, 0); 28674 appendText(&sQuery, " ORDER BY tbl, idx, rowid;\n", 0); 28675 } 28676 appendText(&sSql, zSep, 0); 28677 appendText(&sSql, sQuery.z, '\''); 28678 sQuery.n = 0; 28679 appendText(&sSql, ",", 0); 28680 appendText(&sSql, zTab, '\''); 28681 zSep = "),("; 28682 } 28683 sqlite3_finalize(pStmt); 28684 if( bSeparate ){ 28685 zSql = sqlite3_mprintf( 28686 "%s))" 28687 " SELECT lower(hex(sha3_query(a,%d))) AS hash, b AS label" 28688 " FROM [sha3sum$query]", 28689 sSql.z, iSize); 28690 }else{ 28691 zSql = sqlite3_mprintf( 28692 "%s))" 28693 " SELECT lower(hex(sha3_query(group_concat(a,''),%d))) AS hash" 28694 " FROM [sha3sum$query]", 28695 sSql.z, iSize); 28696 } 28697 shell_check_oom(zSql); 28698 freeText(&sQuery); 28699 freeText(&sSql); 28700 if( bDebug ){ 28701 oputf("%s\n", zSql); 28702 }else{ 28703 shell_exec(p, zSql, 0); 28704 } 28705 #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) && !defined(SQLITE_OMIT_VIRTUALTABLE) 28706 { 28707 int lrc; 28708 char *zRevText = /* Query for reversible to-blob-to-text check */ 28709 "SELECT lower(name) as tname FROM sqlite_schema\n" 28710 "WHERE type='table' AND coalesce(rootpage,0)>1\n" 28711 "AND name NOT LIKE 'sqlite_%%'%s\n" 28712 "ORDER BY 1 collate nocase"; 28713 zRevText = sqlite3_mprintf(zRevText, zLike? " AND name LIKE $tspec" : ""); 28714 zRevText = sqlite3_mprintf( 28715 /* lower-case query is first run, producing upper-case query. */ 28716 "with tabcols as materialized(\n" 28717 "select tname, cname\n" 28718 "from (" 28719 " select printf('\"%%w\"',ss.tname) as tname," 28720 " printf('\"%%w\"',ti.name) as cname\n" 28721 " from (%z) ss\n inner join pragma_table_info(tname) ti))\n" 28722 "select 'SELECT total(bad_text_count) AS bad_text_count\n" 28723 "FROM ('||group_concat(query, ' UNION ALL ')||')' as btc_query\n" 28724 " from (select 'SELECT COUNT(*) AS bad_text_count\n" 28725 "FROM '||tname||' WHERE '\n" 28726 "||group_concat('CAST(CAST('||cname||' AS BLOB) AS TEXT)<>'||cname\n" 28727 "|| ' AND typeof('||cname||')=''text'' ',\n" 28728 "' OR ') as query, tname from tabcols group by tname)" 28729 , zRevText); 28730 shell_check_oom(zRevText); 28731 if( bDebug ) oputf("%s\n", zRevText); 28732 lrc = sqlite3_prepare_v2(p->db, zRevText, -1, &pStmt, 0); 28733 if( lrc!=SQLITE_OK ){ 28734 /* assert(lrc==SQLITE_NOMEM); // might also be SQLITE_ERROR if the 28735 ** user does cruel and unnatural things like ".limit expr_depth 0". */ 28736 rc = 1; 28737 }else{ 28738 if( zLike ) sqlite3_bind_text(pStmt,1,zLike,-1,SQLITE_STATIC); 28739 lrc = SQLITE_ROW==sqlite3_step(pStmt); 28740 if( lrc ){ 28741 const char *zGenQuery = (char*)sqlite3_column_text(pStmt,0); 28742 sqlite3_stmt *pCheckStmt; 28743 lrc = sqlite3_prepare_v2(p->db, zGenQuery, -1, &pCheckStmt, 0); 28744 if( bDebug ) oputf("%s\n", zGenQuery); 28745 if( lrc!=SQLITE_OK ){ 28746 rc = 1; 28747 }else{ 28748 if( SQLITE_ROW==sqlite3_step(pCheckStmt) ){ 28749 double countIrreversible = sqlite3_column_double(pCheckStmt, 0); 28750 if( countIrreversible>0 ){ 28751 int sz = (int)(countIrreversible + 0.5); 28752 eputf("Digest includes %d invalidly encoded text field%s.\n", 28753 sz, (sz>1)? "s": ""); 28754 } 28755 } 28756 sqlite3_finalize(pCheckStmt); 28757 } 28758 sqlite3_finalize(pStmt); 28759 } 28760 } 28761 if( rc ) eputz(".sha3sum failed.\n"); 28762 sqlite3_free(zRevText); 28763 } 28764 #endif /* !defined(*_OMIT_SCHEMA_PRAGMAS) && !defined(*_OMIT_VIRTUALTABLE) */ 28765 sqlite3_free(zSql); 28766 }else 28767 28768 #if !defined(SQLITE_NOHAVE_SYSTEM) && !defined(SQLITE_SHELL_FIDDLE) 28769 if( c=='s' 28770 && (cli_strncmp(azArg[0], "shell", n)==0 28771 || cli_strncmp(azArg[0],"system",n)==0) 28772 ){ 28773 char *zCmd; 28774 int i, x; 28775 failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]); 28776 if( nArg<2 ){ 28777 eputz("Usage: .system COMMAND\n"); 28778 rc = 1; 28779 goto meta_command_exit; 28780 } 28781 zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]); 28782 for(i=2; i<nArg && zCmd!=0; i++){ 28783 zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"", 28784 zCmd, azArg[i]); 28785 } 28786 consoleRestore(); 28787 x = zCmd!=0 ? system(zCmd) : 1; 28788 consoleRenewSetup(); 28789 sqlite3_free(zCmd); 28790 if( x ) eputf("System command returns %d\n", x); 28791 }else 28792 #endif /* !defined(SQLITE_NOHAVE_SYSTEM) && !defined(SQLITE_SHELL_FIDDLE) */ 28793 28794 if( c=='s' && cli_strncmp(azArg[0], "show", n)==0 ){ 28795 static const char *azBool[] = { "off", "on", "trigger", "full"}; 28796 const char *zOut; 28797 int i; 28798 if( nArg!=1 ){ 28799 eputz("Usage: .show\n"); 28800 rc = 1; 28801 goto meta_command_exit; 28802 } 28803 oputf("%12.12s: %s\n","echo", 28804 azBool[ShellHasFlag(p, SHFLG_Echo)]); 28805 oputf("%12.12s: %s\n","eqp", azBool[p->autoEQP&3]); 28806 oputf("%12.12s: %s\n","explain", 28807 p->mode==MODE_Explain ? "on" : p->autoExplain ? "auto" : "off"); 28808 oputf("%12.12s: %s\n","headers", azBool[p->showHeader!=0]); 28809 if( p->mode==MODE_Column 28810 || (p->mode>=MODE_Markdown && p->mode<=MODE_Box) 28811 ){ 28812 oputf("%12.12s: %s --wrap %d --wordwrap %s --%squote\n", "mode", 28813 modeDescr[p->mode], p->cmOpts.iWrap, 28814 p->cmOpts.bWordWrap ? "on" : "off", 28815 p->cmOpts.bQuote ? "" : "no"); 28816 }else{ 28817 oputf("%12.12s: %s\n","mode", modeDescr[p->mode]); 28818 } 28819 oputf("%12.12s: ", "nullvalue"); 28820 output_c_string(p->nullValue); 28821 oputz("\n"); 28822 oputf("%12.12s: %s\n","output", 28823 strlen30(p->outfile) ? p->outfile : "stdout"); 28824 oputf("%12.12s: ", "colseparator"); 28825 output_c_string(p->colSeparator); 28826 oputz("\n"); 28827 oputf("%12.12s: ", "rowseparator"); 28828 output_c_string(p->rowSeparator); 28829 oputz("\n"); 28830 switch( p->statsOn ){ 28831 case 0: zOut = "off"; break; 28832 default: zOut = "on"; break; 28833 case 2: zOut = "stmt"; break; 28834 case 3: zOut = "vmstep"; break; 28835 } 28836 oputf("%12.12s: %s\n","stats", zOut); 28837 oputf("%12.12s: ", "width"); 28838 for (i=0;i<p->nWidth;i++) { 28839 oputf("%d ", p->colWidth[i]); 28840 } 28841 oputz("\n"); 28842 oputf("%12.12s: %s\n", "filename", 28843 p->pAuxDb->zDbFilename ? p->pAuxDb->zDbFilename : ""); 28844 }else 28845 28846 if( c=='s' && cli_strncmp(azArg[0], "stats", n)==0 ){ 28847 if( nArg==2 ){ 28848 if( cli_strcmp(azArg[1],"stmt")==0 ){ 28849 p->statsOn = 2; 28850 }else if( cli_strcmp(azArg[1],"vmstep")==0 ){ 28851 p->statsOn = 3; 28852 }else{ 28853 p->statsOn = (u8)booleanValue(azArg[1]); 28854 } 28855 }else if( nArg==1 ){ 28856 display_stats(p->db, p, 0); 28857 }else{ 28858 eputz("Usage: .stats ?on|off|stmt|vmstep?\n"); 28859 rc = 1; 28860 } 28861 }else 28862 28863 if( (c=='t' && n>1 && cli_strncmp(azArg[0], "tables", n)==0) 28864 || (c=='i' && (cli_strncmp(azArg[0], "indices", n)==0 28865 || cli_strncmp(azArg[0], "indexes", n)==0) ) 28866 ){ 28867 sqlite3_stmt *pStmt; 28868 char **azResult; 28869 int nRow, nAlloc; 28870 int ii; 28871 ShellText s; 28872 initText(&s); 28873 open_db(p, 0); 28874 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0); 28875 if( rc ){ 28876 sqlite3_finalize(pStmt); 28877 return shellDatabaseError(p->db); 28878 } 28879 28880 if( nArg>2 && c=='i' ){ 28881 /* It is an historical accident that the .indexes command shows an error 28882 ** when called with the wrong number of arguments whereas the .tables 28883 ** command does not. */ 28884 eputz("Usage: .indexes ?LIKE-PATTERN?\n"); 28885 rc = 1; 28886 sqlite3_finalize(pStmt); 28887 goto meta_command_exit; 28888 } 28889 for(ii=0; sqlite3_step(pStmt)==SQLITE_ROW; ii++){ 28890 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1); 28891 if( zDbName==0 ) continue; 28892 if( s.z && s.z[0] ) appendText(&s, " UNION ALL ", 0); 28893 if( sqlite3_stricmp(zDbName, "main")==0 ){ 28894 appendText(&s, "SELECT name FROM ", 0); 28895 }else{ 28896 appendText(&s, "SELECT ", 0); 28897 appendText(&s, zDbName, '\''); 28898 appendText(&s, "||'.'||name FROM ", 0); 28899 } 28900 appendText(&s, zDbName, '"'); 28901 appendText(&s, ".sqlite_schema ", 0); 28902 if( c=='t' ){ 28903 appendText(&s," WHERE type IN ('table','view')" 28904 " AND name NOT LIKE 'sqlite_%'" 28905 " AND name LIKE ?1", 0); 28906 }else{ 28907 appendText(&s," WHERE type='index'" 28908 " AND tbl_name LIKE ?1", 0); 28909 } 28910 } 28911 rc = sqlite3_finalize(pStmt); 28912 if( rc==SQLITE_OK ){ 28913 appendText(&s, " ORDER BY 1", 0); 28914 rc = sqlite3_prepare_v2(p->db, s.z, -1, &pStmt, 0); 28915 } 28916 freeText(&s); 28917 if( rc ) return shellDatabaseError(p->db); 28918 28919 /* Run the SQL statement prepared by the above block. Store the results 28920 ** as an array of nul-terminated strings in azResult[]. */ 28921 nRow = nAlloc = 0; 28922 azResult = 0; 28923 if( nArg>1 ){ 28924 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT); 28925 }else{ 28926 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC); 28927 } 28928 while( sqlite3_step(pStmt)==SQLITE_ROW ){ 28929 if( nRow>=nAlloc ){ 28930 char **azNew; 28931 int n2 = nAlloc*2 + 10; 28932 azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2); 28933 shell_check_oom(azNew); 28934 nAlloc = n2; 28935 azResult = azNew; 28936 } 28937 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0)); 28938 shell_check_oom(azResult[nRow]); 28939 nRow++; 28940 } 28941 if( sqlite3_finalize(pStmt)!=SQLITE_OK ){ 28942 rc = shellDatabaseError(p->db); 28943 } 28944 28945 /* Pretty-print the contents of array azResult[] to the output */ 28946 if( rc==0 && nRow>0 ){ 28947 int len, maxlen = 0; 28948 int i, j; 28949 int nPrintCol, nPrintRow; 28950 for(i=0; i<nRow; i++){ 28951 len = strlen30(azResult[i]); 28952 if( len>maxlen ) maxlen = len; 28953 } 28954 nPrintCol = 80/(maxlen+2); 28955 if( nPrintCol<1 ) nPrintCol = 1; 28956 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol; 28957 for(i=0; i<nPrintRow; i++){ 28958 for(j=i; j<nRow; j+=nPrintRow){ 28959 char *zSp = j<nPrintRow ? "" : " "; 28960 oputf("%s%-*s", zSp, maxlen, azResult[j] ? azResult[j]:""); 28961 } 28962 oputz("\n"); 28963 } 28964 } 28965 28966 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]); 28967 sqlite3_free(azResult); 28968 }else 28969 28970 #ifndef SQLITE_SHELL_FIDDLE 28971 /* Begin redirecting output to the file "testcase-out.txt" */ 28972 if( c=='t' && cli_strcmp(azArg[0],"testcase")==0 ){ 28973 output_reset(p); 28974 p->out = output_file_open("testcase-out.txt", 0); 28975 if( p->out==0 ){ 28976 eputz("Error: cannot open 'testcase-out.txt'\n"); 28977 } 28978 if( nArg>=2 ){ 28979 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "%s", azArg[1]); 28980 }else{ 28981 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "?"); 28982 } 28983 }else 28984 #endif /* !defined(SQLITE_SHELL_FIDDLE) */ 28985 28986 #ifndef SQLITE_UNTESTABLE 28987 if( c=='t' && n>=8 && cli_strncmp(azArg[0], "testctrl", n)==0 ){ 28988 static const struct { 28989 const char *zCtrlName; /* Name of a test-control option */ 28990 int ctrlCode; /* Integer code for that option */ 28991 int unSafe; /* Not valid unless --unsafe-testing */ 28992 const char *zUsage; /* Usage notes */ 28993 } aCtrl[] = { 28994 {"always", SQLITE_TESTCTRL_ALWAYS, 1, "BOOLEAN" }, 28995 {"assert", SQLITE_TESTCTRL_ASSERT, 1, "BOOLEAN" }, 28996 /*{"benign_malloc_hooks",SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS,1, "" },*/ 28997 /*{"bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST, 1, "" },*/ 28998 {"byteorder", SQLITE_TESTCTRL_BYTEORDER, 0, "" }, 28999 {"extra_schema_checks",SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS,0,"BOOLEAN" }, 29000 {"fault_install", SQLITE_TESTCTRL_FAULT_INSTALL, 1,"args..." }, 29001 {"fk_no_action", SQLITE_TESTCTRL_FK_NO_ACTION, 0, "BOOLEAN" }, 29002 {"imposter", SQLITE_TESTCTRL_IMPOSTER,1,"SCHEMA ON/OFF ROOTPAGE"}, 29003 {"internal_functions", SQLITE_TESTCTRL_INTERNAL_FUNCTIONS,0,"" }, 29004 {"json_selfcheck", SQLITE_TESTCTRL_JSON_SELFCHECK ,0,"BOOLEAN" }, 29005 {"localtime_fault", SQLITE_TESTCTRL_LOCALTIME_FAULT,0,"BOOLEAN" }, 29006 {"never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT,1, "BOOLEAN" }, 29007 {"optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS,0,"DISABLE-MASK" }, 29008 #ifdef YYCOVERAGE 29009 {"parser_coverage", SQLITE_TESTCTRL_PARSER_COVERAGE,0,"" }, 29010 #endif 29011 {"pending_byte", SQLITE_TESTCTRL_PENDING_BYTE,0, "OFFSET " }, 29012 {"prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE,0, "" }, 29013 {"prng_save", SQLITE_TESTCTRL_PRNG_SAVE, 0, "" }, 29014 {"prng_seed", SQLITE_TESTCTRL_PRNG_SEED, 0, "SEED ?db?" }, 29015 {"seek_count", SQLITE_TESTCTRL_SEEK_COUNT, 0, "" }, 29016 {"sorter_mmap", SQLITE_TESTCTRL_SORTER_MMAP, 0, "NMAX" }, 29017 {"tune", SQLITE_TESTCTRL_TUNE, 1, "ID VALUE" }, 29018 {"uselongdouble", SQLITE_TESTCTRL_USELONGDOUBLE,0,"?BOOLEAN|\"default\"?"}, 29019 }; 29020 int testctrl = -1; 29021 int iCtrl = -1; 29022 int rc2 = 0; /* 0: usage. 1: %d 2: %x 3: no-output */ 29023 int isOk = 0; 29024 int i, n2; 29025 const char *zCmd = 0; 29026 29027 open_db(p, 0); 29028 zCmd = nArg>=2 ? azArg[1] : "help"; 29029 29030 /* The argument can optionally begin with "-" or "--" */ 29031 if( zCmd[0]=='-' && zCmd[1] ){ 29032 zCmd++; 29033 if( zCmd[0]=='-' && zCmd[1] ) zCmd++; 29034 } 29035 29036 /* --help lists all test-controls */ 29037 if( cli_strcmp(zCmd,"help")==0 ){ 29038 oputz("Available test-controls:\n"); 29039 for(i=0; i<ArraySize(aCtrl); i++){ 29040 if( aCtrl[i].unSafe && !ShellHasFlag(p,SHFLG_TestingMode) ) continue; 29041 oputf(" .testctrl %s %s\n", 29042 aCtrl[i].zCtrlName, aCtrl[i].zUsage); 29043 } 29044 rc = 1; 29045 goto meta_command_exit; 29046 } 29047 29048 /* convert testctrl text option to value. allow any unique prefix 29049 ** of the option name, or a numerical value. */ 29050 n2 = strlen30(zCmd); 29051 for(i=0; i<ArraySize(aCtrl); i++){ 29052 if( aCtrl[i].unSafe && !ShellHasFlag(p,SHFLG_TestingMode) ) continue; 29053 if( cli_strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){ 29054 if( testctrl<0 ){ 29055 testctrl = aCtrl[i].ctrlCode; 29056 iCtrl = i; 29057 }else{ 29058 eputf("Error: ambiguous test-control: \"%s\"\n" 29059 "Use \".testctrl --help\" for help\n", zCmd); 29060 rc = 1; 29061 goto meta_command_exit; 29062 } 29063 } 29064 } 29065 if( testctrl<0 ){ 29066 eputf("Error: unknown test-control: %s\n" 29067 "Use \".testctrl --help\" for help\n", zCmd); 29068 }else{ 29069 switch(testctrl){ 29070 29071 /* sqlite3_test_control(int, db, int) */ 29072 case SQLITE_TESTCTRL_OPTIMIZATIONS: 29073 case SQLITE_TESTCTRL_FK_NO_ACTION: 29074 if( nArg==3 ){ 29075 unsigned int opt = (unsigned int)strtol(azArg[2], 0, 0); 29076 rc2 = sqlite3_test_control(testctrl, p->db, opt); 29077 isOk = 3; 29078 } 29079 break; 29080 29081 /* sqlite3_test_control(int) */ 29082 case SQLITE_TESTCTRL_PRNG_SAVE: 29083 case SQLITE_TESTCTRL_PRNG_RESTORE: 29084 case SQLITE_TESTCTRL_BYTEORDER: 29085 if( nArg==2 ){ 29086 rc2 = sqlite3_test_control(testctrl); 29087 isOk = testctrl==SQLITE_TESTCTRL_BYTEORDER ? 1 : 3; 29088 } 29089 break; 29090 29091 /* sqlite3_test_control(int, uint) */ 29092 case SQLITE_TESTCTRL_PENDING_BYTE: 29093 if( nArg==3 ){ 29094 unsigned int opt = (unsigned int)integerValue(azArg[2]); 29095 rc2 = sqlite3_test_control(testctrl, opt); 29096 isOk = 3; 29097 } 29098 break; 29099 29100 /* sqlite3_test_control(int, int, sqlite3*) */ 29101 case SQLITE_TESTCTRL_PRNG_SEED: 29102 if( nArg==3 || nArg==4 ){ 29103 int ii = (int)integerValue(azArg[2]); 29104 sqlite3 *db; 29105 if( ii==0 && cli_strcmp(azArg[2],"random")==0 ){ 29106 sqlite3_randomness(sizeof(ii),&ii); 29107 sputf(stdout, "-- random seed: %d\n", ii); 29108 } 29109 if( nArg==3 ){ 29110 db = 0; 29111 }else{ 29112 db = p->db; 29113 /* Make sure the schema has been loaded */ 29114 sqlite3_table_column_metadata(db, 0, "x", 0, 0, 0, 0, 0, 0); 29115 } 29116 rc2 = sqlite3_test_control(testctrl, ii, db); 29117 isOk = 3; 29118 } 29119 break; 29120 29121 /* sqlite3_test_control(int, int) */ 29122 case SQLITE_TESTCTRL_ASSERT: 29123 case SQLITE_TESTCTRL_ALWAYS: 29124 if( nArg==3 ){ 29125 int opt = booleanValue(azArg[2]); 29126 rc2 = sqlite3_test_control(testctrl, opt); 29127 isOk = 1; 29128 } 29129 break; 29130 29131 /* sqlite3_test_control(int, int) */ 29132 case SQLITE_TESTCTRL_LOCALTIME_FAULT: 29133 case SQLITE_TESTCTRL_NEVER_CORRUPT: 29134 if( nArg==3 ){ 29135 int opt = booleanValue(azArg[2]); 29136 rc2 = sqlite3_test_control(testctrl, opt); 29137 isOk = 3; 29138 } 29139 break; 29140 29141 /* sqlite3_test_control(int, int) */ 29142 case SQLITE_TESTCTRL_USELONGDOUBLE: { 29143 int opt = -1; 29144 if( nArg==3 ){ 29145 if( cli_strcmp(azArg[2],"default")==0 ){ 29146 opt = 2; 29147 }else{ 29148 opt = booleanValue(azArg[2]); 29149 } 29150 } 29151 rc2 = sqlite3_test_control(testctrl, opt); 29152 isOk = 1; 29153 break; 29154 } 29155 29156 /* sqlite3_test_control(sqlite3*) */ 29157 case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS: 29158 rc2 = sqlite3_test_control(testctrl, p->db); 29159 isOk = 3; 29160 break; 29161 29162 case SQLITE_TESTCTRL_IMPOSTER: 29163 if( nArg==5 ){ 29164 rc2 = sqlite3_test_control(testctrl, p->db, 29165 azArg[2], 29166 integerValue(azArg[3]), 29167 integerValue(azArg[4])); 29168 isOk = 3; 29169 } 29170 break; 29171 29172 case SQLITE_TESTCTRL_SEEK_COUNT: { 29173 u64 x = 0; 29174 rc2 = sqlite3_test_control(testctrl, p->db, &x); 29175 oputf("%llu\n", x); 29176 isOk = 3; 29177 break; 29178 } 29179 29180 #ifdef YYCOVERAGE 29181 case SQLITE_TESTCTRL_PARSER_COVERAGE: { 29182 if( nArg==2 ){ 29183 sqlite3_test_control(testctrl, p->out); 29184 isOk = 3; 29185 } 29186 break; 29187 } 29188 #endif 29189 #ifdef SQLITE_DEBUG 29190 case SQLITE_TESTCTRL_TUNE: { 29191 if( nArg==4 ){ 29192 int id = (int)integerValue(azArg[2]); 29193 int val = (int)integerValue(azArg[3]); 29194 sqlite3_test_control(testctrl, id, &val); 29195 isOk = 3; 29196 }else if( nArg==3 ){ 29197 int id = (int)integerValue(azArg[2]); 29198 sqlite3_test_control(testctrl, -id, &rc2); 29199 isOk = 1; 29200 }else if( nArg==2 ){ 29201 int id = 1; 29202 while(1){ 29203 int val = 0; 29204 rc2 = sqlite3_test_control(testctrl, -id, &val); 29205 if( rc2!=SQLITE_OK ) break; 29206 if( id>1 ) oputz(" "); 29207 oputf("%d: %d", id, val); 29208 id++; 29209 } 29210 if( id>1 ) oputz("\n"); 29211 isOk = 3; 29212 } 29213 break; 29214 } 29215 #endif 29216 case SQLITE_TESTCTRL_SORTER_MMAP: 29217 if( nArg==3 ){ 29218 int opt = (unsigned int)integerValue(azArg[2]); 29219 rc2 = sqlite3_test_control(testctrl, p->db, opt); 29220 isOk = 3; 29221 } 29222 break; 29223 case SQLITE_TESTCTRL_JSON_SELFCHECK: 29224 if( nArg==2 ){ 29225 rc2 = -1; 29226 isOk = 1; 29227 }else{ 29228 rc2 = booleanValue(azArg[2]); 29229 isOk = 3; 29230 } 29231 sqlite3_test_control(testctrl, &rc2); 29232 break; 29233 case SQLITE_TESTCTRL_FAULT_INSTALL: { 29234 int kk; 29235 int bShowHelp = nArg<=2; 29236 isOk = 3; 29237 for(kk=2; kk<nArg; kk++){ 29238 const char *z = azArg[kk]; 29239 if( z[0]=='-' && z[1]=='-' ) z++; 29240 if( cli_strcmp(z,"off")==0 ){ 29241 sqlite3_test_control(testctrl, 0); 29242 }else if( cli_strcmp(z,"on")==0 ){ 29243 faultsim_state.iCnt = faultsim_state.nSkip; 29244 if( faultsim_state.iErr==0 ) faultsim_state.iErr = 1; 29245 faultsim_state.nHit = 0; 29246 sqlite3_test_control(testctrl, faultsim_callback); 29247 }else if( cli_strcmp(z,"reset")==0 ){ 29248 faultsim_state.iCnt = faultsim_state.nSkip; 29249 faultsim_state.nHit = 0; 29250 sqlite3_test_control(testctrl, faultsim_callback); 29251 }else if( cli_strcmp(z,"status")==0 ){ 29252 oputf("faultsim.iId: %d\n", faultsim_state.iId); 29253 oputf("faultsim.iErr: %d\n", faultsim_state.iErr); 29254 oputf("faultsim.iCnt: %d\n", faultsim_state.iCnt); 29255 oputf("faultsim.nHit: %d\n", faultsim_state.nHit); 29256 oputf("faultsim.iInterval: %d\n", faultsim_state.iInterval); 29257 oputf("faultsim.eVerbose: %d\n", faultsim_state.eVerbose); 29258 oputf("faultsim.nRepeat: %d\n", faultsim_state.nRepeat); 29259 oputf("faultsim.nSkip: %d\n", faultsim_state.nSkip); 29260 }else if( cli_strcmp(z,"-v")==0 ){ 29261 if( faultsim_state.eVerbose<2 ) faultsim_state.eVerbose++; 29262 }else if( cli_strcmp(z,"-q")==0 ){ 29263 if( faultsim_state.eVerbose>0 ) faultsim_state.eVerbose--; 29264 }else if( cli_strcmp(z,"-id")==0 && kk+1<nArg ){ 29265 faultsim_state.iId = atoi(azArg[++kk]); 29266 }else if( cli_strcmp(z,"-errcode")==0 && kk+1<nArg ){ 29267 faultsim_state.iErr = atoi(azArg[++kk]); 29268 }else if( cli_strcmp(z,"-interval")==0 && kk+1<nArg ){ 29269 faultsim_state.iInterval = atoi(azArg[++kk]); 29270 }else if( cli_strcmp(z,"-repeat")==0 && kk+1<nArg ){ 29271 faultsim_state.nRepeat = atoi(azArg[++kk]); 29272 }else if( cli_strcmp(z,"-skip")==0 && kk+1<nArg ){ 29273 faultsim_state.nSkip = atoi(azArg[++kk]); 29274 }else if( cli_strcmp(z,"-?")==0 || sqlite3_strglob("*help*",z)==0){ 29275 bShowHelp = 1; 29276 }else{ 29277 eputf("Unrecognized fault_install argument: \"%s\"\n", 29278 azArg[kk]); 29279 rc = 1; 29280 bShowHelp = 1; 29281 break; 29282 } 29283 } 29284 if( bShowHelp ){ 29285 oputz( 29286 "Usage: .testctrl fault_install ARGS\n" 29287 "Possible arguments:\n" 29288 " off Disable faultsim\n" 29289 " on Activate faultsim\n" 29290 " reset Reset the trigger counter\n" 29291 " status Show current status\n" 29292 " -v Increase verbosity\n" 29293 " -q Decrease verbosity\n" 29294 " --errcode N When triggered, return N as error code\n" 29295 " --id ID Trigger only for the ID specified\n" 29296 " --interval N Trigger only after every N-th call\n" 29297 " --repeat N Turn off after N hits. 0 means never\n" 29298 " --skip N Skip the first N encounters\n" 29299 ); 29300 } 29301 break; 29302 } 29303 } 29304 } 29305 if( isOk==0 && iCtrl>=0 ){ 29306 oputf("Usage: .testctrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage); 29307 rc = 1; 29308 }else if( isOk==1 ){ 29309 oputf("%d\n", rc2); 29310 }else if( isOk==2 ){ 29311 oputf("0x%08x\n", rc2); 29312 } 29313 }else 29314 #endif /* !defined(SQLITE_UNTESTABLE) */ 29315 29316 if( c=='t' && n>4 && cli_strncmp(azArg[0], "timeout", n)==0 ){ 29317 open_db(p, 0); 29318 sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0); 29319 }else 29320 29321 if( c=='t' && n>=5 && cli_strncmp(azArg[0], "timer", n)==0 ){ 29322 if( nArg==2 ){ 29323 enableTimer = booleanValue(azArg[1]); 29324 if( enableTimer && !HAS_TIMER ){ 29325 eputz("Error: timer not available on this system.\n"); 29326 enableTimer = 0; 29327 } 29328 }else{ 29329 eputz("Usage: .timer on|off\n"); 29330 rc = 1; 29331 } 29332 }else 29333 29334 #ifndef SQLITE_OMIT_TRACE 29335 if( c=='t' && cli_strncmp(azArg[0], "trace", n)==0 ){ 29336 int mType = 0; 29337 int jj; 29338 open_db(p, 0); 29339 for(jj=1; jj<nArg; jj++){ 29340 const char *z = azArg[jj]; 29341 if( z[0]=='-' ){ 29342 if( optionMatch(z, "expanded") ){ 29343 p->eTraceType = SHELL_TRACE_EXPANDED; 29344 } 29345 #ifdef SQLITE_ENABLE_NORMALIZE 29346 else if( optionMatch(z, "normalized") ){ 29347 p->eTraceType = SHELL_TRACE_NORMALIZED; 29348 } 29349 #endif 29350 else if( optionMatch(z, "plain") ){ 29351 p->eTraceType = SHELL_TRACE_PLAIN; 29352 } 29353 else if( optionMatch(z, "profile") ){ 29354 mType |= SQLITE_TRACE_PROFILE; 29355 } 29356 else if( optionMatch(z, "row") ){ 29357 mType |= SQLITE_TRACE_ROW; 29358 } 29359 else if( optionMatch(z, "stmt") ){ 29360 mType |= SQLITE_TRACE_STMT; 29361 } 29362 else if( optionMatch(z, "close") ){ 29363 mType |= SQLITE_TRACE_CLOSE; 29364 } 29365 else { 29366 eputf("Unknown option \"%s\" on \".trace\"\n", z); 29367 rc = 1; 29368 goto meta_command_exit; 29369 } 29370 }else{ 29371 output_file_close(p->traceOut); 29372 p->traceOut = output_file_open(z, 0); 29373 } 29374 } 29375 if( p->traceOut==0 ){ 29376 sqlite3_trace_v2(p->db, 0, 0, 0); 29377 }else{ 29378 if( mType==0 ) mType = SQLITE_TRACE_STMT; 29379 sqlite3_trace_v2(p->db, mType, sql_trace_callback, p); 29380 } 29381 }else 29382 #endif /* !defined(SQLITE_OMIT_TRACE) */ 29383 29384 #if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_VIRTUALTABLE) 29385 if( c=='u' && cli_strncmp(azArg[0], "unmodule", n)==0 ){ 29386 int ii; 29387 int lenOpt; 29388 char *zOpt; 29389 if( nArg<2 ){ 29390 eputz("Usage: .unmodule [--allexcept] NAME ...\n"); 29391 rc = 1; 29392 goto meta_command_exit; 29393 } 29394 open_db(p, 0); 29395 zOpt = azArg[1]; 29396 if( zOpt[0]=='-' && zOpt[1]=='-' && zOpt[2]!=0 ) zOpt++; 29397 lenOpt = (int)strlen(zOpt); 29398 if( lenOpt>=3 && cli_strncmp(zOpt, "-allexcept",lenOpt)==0 ){ 29399 assert( azArg[nArg]==0 ); 29400 sqlite3_drop_modules(p->db, nArg>2 ? (const char**)(azArg+2) : 0); 29401 }else{ 29402 for(ii=1; ii<nArg; ii++){ 29403 sqlite3_create_module(p->db, azArg[ii], 0, 0); 29404 } 29405 } 29406 }else 29407 #endif 29408 29409 #if SQLITE_USER_AUTHENTICATION 29410 if( c=='u' && cli_strncmp(azArg[0], "user", n)==0 ){ 29411 if( nArg<2 ){ 29412 eputz("Usage: .user SUBCOMMAND ...\n"); 29413 rc = 1; 29414 goto meta_command_exit; 29415 } 29416 open_db(p, 0); 29417 if( cli_strcmp(azArg[1],"login")==0 ){ 29418 if( nArg!=4 ){ 29419 eputz("Usage: .user login USER PASSWORD\n"); 29420 rc = 1; 29421 goto meta_command_exit; 29422 } 29423 rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3], 29424 strlen30(azArg[3])); 29425 if( rc ){ 29426 eputf("Authentication failed for user %s\n", azArg[2]); 29427 rc = 1; 29428 } 29429 }else if( cli_strcmp(azArg[1],"add")==0 ){ 29430 if( nArg!=5 ){ 29431 eputz("Usage: .user add USER PASSWORD ISADMIN\n"); 29432 rc = 1; 29433 goto meta_command_exit; 29434 } 29435 rc = sqlite3_user_add(p->db, azArg[2], azArg[3], strlen30(azArg[3]), 29436 booleanValue(azArg[4])); 29437 if( rc ){ 29438 eputf("User-Add failed: %d\n", rc); 29439 rc = 1; 29440 } 29441 }else if( cli_strcmp(azArg[1],"edit")==0 ){ 29442 if( nArg!=5 ){ 29443 eputz("Usage: .user edit USER PASSWORD ISADMIN\n"); 29444 rc = 1; 29445 goto meta_command_exit; 29446 } 29447 rc = sqlite3_user_change(p->db, azArg[2], azArg[3], strlen30(azArg[3]), 29448 booleanValue(azArg[4])); 29449 if( rc ){ 29450 eputf("User-Edit failed: %d\n", rc); 29451 rc = 1; 29452 } 29453 }else if( cli_strcmp(azArg[1],"delete")==0 ){ 29454 if( nArg!=3 ){ 29455 eputz("Usage: .user delete USER\n"); 29456 rc = 1; 29457 goto meta_command_exit; 29458 } 29459 rc = sqlite3_user_delete(p->db, azArg[2]); 29460 if( rc ){ 29461 eputf("User-Delete failed: %d\n", rc); 29462 rc = 1; 29463 } 29464 }else{ 29465 eputz("Usage: .user login|add|edit|delete ...\n"); 29466 rc = 1; 29467 goto meta_command_exit; 29468 } 29469 }else 29470 #endif /* SQLITE_USER_AUTHENTICATION */ 29471 29472 if( c=='v' && cli_strncmp(azArg[0], "version", n)==0 ){ 29473 char *zPtrSz = sizeof(void*)==8 ? "64-bit" : "32-bit"; 29474 oputf("SQLite %s %s\n" /*extra-version-info*/, 29475 sqlite3_libversion(), sqlite3_sourceid()); 29476 #if SQLITE_HAVE_ZLIB 29477 oputf("zlib version %s\n", zlibVersion()); 29478 #endif 29479 #define CTIMEOPT_VAL_(opt) #opt 29480 #define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt) 29481 #if defined(__clang__) && defined(__clang_major__) 29482 oputf("clang-" CTIMEOPT_VAL(__clang_major__) "." 29483 CTIMEOPT_VAL(__clang_minor__) "." 29484 CTIMEOPT_VAL(__clang_patchlevel__) " (%s)\n", zPtrSz); 29485 #elif defined(_MSC_VER) 29486 oputf("msvc-" CTIMEOPT_VAL(_MSC_VER) " (%s)\n", zPtrSz); 29487 #elif defined(__GNUC__) && defined(__VERSION__) 29488 oputf("gcc-" __VERSION__ " (%s)\n", zPtrSz); 29489 #endif 29490 }else 29491 29492 if( c=='v' && cli_strncmp(azArg[0], "vfsinfo", n)==0 ){ 29493 const char *zDbName = nArg==2 ? azArg[1] : "main"; 29494 sqlite3_vfs *pVfs = 0; 29495 if( p->db ){ 29496 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFS_POINTER, &pVfs); 29497 if( pVfs ){ 29498 oputf("vfs.zName = \"%s\"\n", pVfs->zName); 29499 oputf("vfs.iVersion = %d\n", pVfs->iVersion); 29500 oputf("vfs.szOsFile = %d\n", pVfs->szOsFile); 29501 oputf("vfs.mxPathname = %d\n", pVfs->mxPathname); 29502 } 29503 } 29504 }else 29505 29506 if( c=='v' && cli_strncmp(azArg[0], "vfslist", n)==0 ){ 29507 sqlite3_vfs *pVfs; 29508 sqlite3_vfs *pCurrent = 0; 29509 if( p->db ){ 29510 sqlite3_file_control(p->db, "main", SQLITE_FCNTL_VFS_POINTER, &pCurrent); 29511 } 29512 for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){ 29513 oputf("vfs.zName = \"%s\"%s\n", pVfs->zName, 29514 pVfs==pCurrent ? " <--- CURRENT" : ""); 29515 oputf("vfs.iVersion = %d\n", pVfs->iVersion); 29516 oputf("vfs.szOsFile = %d\n", pVfs->szOsFile); 29517 oputf("vfs.mxPathname = %d\n", pVfs->mxPathname); 29518 if( pVfs->pNext ){ 29519 oputz("-----------------------------------\n"); 29520 } 29521 } 29522 }else 29523 29524 if( c=='v' && cli_strncmp(azArg[0], "vfsname", n)==0 ){ 29525 const char *zDbName = nArg==2 ? azArg[1] : "main"; 29526 char *zVfsName = 0; 29527 if( p->db ){ 29528 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName); 29529 if( zVfsName ){ 29530 oputf("%s\n", zVfsName); 29531 sqlite3_free(zVfsName); 29532 } 29533 } 29534 }else 29535 29536 if( c=='w' && cli_strncmp(azArg[0], "wheretrace", n)==0 ){ 29537 unsigned int x = nArg>=2? (unsigned int)integerValue(azArg[1]) : 0xffffffff; 29538 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &x); 29539 }else 29540 29541 if( c=='w' && cli_strncmp(azArg[0], "width", n)==0 ){ 29542 int j; 29543 assert( nArg<=ArraySize(azArg) ); 29544 p->nWidth = nArg-1; 29545 p->colWidth = realloc(p->colWidth, (p->nWidth+1)*sizeof(int)*2); 29546 if( p->colWidth==0 && p->nWidth>0 ) shell_out_of_memory(); 29547 if( p->nWidth ) p->actualWidth = &p->colWidth[p->nWidth]; 29548 for(j=1; j<nArg; j++){ 29549 p->colWidth[j-1] = (int)integerValue(azArg[j]); 29550 } 29551 }else 29552 29553 { 29554 eputf("Error: unknown command or invalid arguments: " 29555 " \"%s\". Enter \".help\" for help\n", azArg[0]); 29556 rc = 1; 29557 } 29558 29559 meta_command_exit: 29560 if( p->outCount ){ 29561 p->outCount--; 29562 if( p->outCount==0 ) output_reset(p); 29563 } 29564 p->bSafeMode = p->bSafeModePersist; 29565 return rc; 29566 } 29567 29568 /* Line scan result and intermediate states (supporting scan resumption) 29569 */ 29570 #ifndef CHAR_BIT 29571 # define CHAR_BIT 8 29572 #endif 29573 typedef enum { 29574 QSS_HasDark = 1<<CHAR_BIT, QSS_EndingSemi = 2<<CHAR_BIT, 29575 QSS_CharMask = (1<<CHAR_BIT)-1, QSS_ScanMask = 3<<CHAR_BIT, 29576 QSS_Start = 0 29577 } QuickScanState; 29578 #define QSS_SETV(qss, newst) ((newst) | ((qss) & QSS_ScanMask)) 29579 #define QSS_INPLAIN(qss) (((qss)&QSS_CharMask)==QSS_Start) 29580 #define QSS_PLAINWHITE(qss) (((qss)&~QSS_EndingSemi)==QSS_Start) 29581 #define QSS_PLAINDARK(qss) (((qss)&~QSS_EndingSemi)==QSS_HasDark) 29582 #define QSS_SEMITERM(qss) (((qss)&~QSS_HasDark)==QSS_EndingSemi) 29583 29584 /* 29585 ** Scan line for classification to guide shell's handling. 29586 ** The scan is resumable for subsequent lines when prior 29587 ** return values are passed as the 2nd argument. 29588 */ 29589 static QuickScanState quickscan(char *zLine, QuickScanState qss, 29590 SCAN_TRACKER_REFTYPE pst){ 29591 char cin; 29592 char cWait = (char)qss; /* intentional narrowing loss */ 29593 if( cWait==0 ){ 29594 PlainScan: 29595 assert( cWait==0 ); 29596 while( (cin = *zLine++)!=0 ){ 29597 if( IsSpace(cin) ) 29598 continue; 29599 switch (cin){ 29600 case '-': 29601 if( *zLine!='-' ) 29602 break; 29603 while((cin = *++zLine)!=0 ) 29604 if( cin=='\n') 29605 goto PlainScan; 29606 return qss; 29607 case ';': 29608 qss |= QSS_EndingSemi; 29609 continue; 29610 case '/': 29611 if( *zLine=='*' ){ 29612 ++zLine; 29613 cWait = '*'; 29614 CONTINUE_PROMPT_AWAITS(pst, "/*"); 29615 qss = QSS_SETV(qss, cWait); 29616 goto TermScan; 29617 } 29618 break; 29619 case '[': 29620 cin = ']'; 29621 deliberate_fall_through; 29622 case '`': case '\'': case '"': 29623 cWait = cin; 29624 qss = QSS_HasDark | cWait; 29625 CONTINUE_PROMPT_AWAITC(pst, cin); 29626 goto TermScan; 29627 case '(': 29628 CONTINUE_PAREN_INCR(pst, 1); 29629 break; 29630 case ')': 29631 CONTINUE_PAREN_INCR(pst, -1); 29632 break; 29633 default: 29634 break; 29635 } 29636 qss = (qss & ~QSS_EndingSemi) | QSS_HasDark; 29637 } 29638 }else{ 29639 TermScan: 29640 while( (cin = *zLine++)!=0 ){ 29641 if( cin==cWait ){ 29642 switch( cWait ){ 29643 case '*': 29644 if( *zLine != '/' ) 29645 continue; 29646 ++zLine; 29647 cWait = 0; 29648 CONTINUE_PROMPT_AWAITC(pst, 0); 29649 qss = QSS_SETV(qss, 0); 29650 goto PlainScan; 29651 case '`': case '\'': case '"': 29652 if(*zLine==cWait){ 29653 /* Swallow doubled end-delimiter.*/ 29654 ++zLine; 29655 continue; 29656 } 29657 deliberate_fall_through; 29658 case ']': 29659 cWait = 0; 29660 CONTINUE_PROMPT_AWAITC(pst, 0); 29661 qss = QSS_SETV(qss, 0); 29662 goto PlainScan; 29663 default: assert(0); 29664 } 29665 } 29666 } 29667 } 29668 return qss; 29669 } 29670 29671 /* 29672 ** Return TRUE if the line typed in is an SQL command terminator other 29673 ** than a semi-colon. The SQL Server style "go" command is understood 29674 ** as is the Oracle "/". 29675 */ 29676 static int line_is_command_terminator(char *zLine){ 29677 while( IsSpace(zLine[0]) ){ zLine++; }; 29678 if( zLine[0]=='/' ) 29679 zLine += 1; /* Oracle */ 29680 else if ( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o' ) 29681 zLine += 2; /* SQL Server */ 29682 else 29683 return 0; 29684 return quickscan(zLine, QSS_Start, 0)==QSS_Start; 29685 } 29686 29687 /* 29688 ** The CLI needs a working sqlite3_complete() to work properly. So error 29689 ** out of the build if compiling with SQLITE_OMIT_COMPLETE. 29690 */ 29691 #ifdef SQLITE_OMIT_COMPLETE 29692 # error the CLI application is imcompatable with SQLITE_OMIT_COMPLETE. 29693 #endif 29694 29695 /* 29696 ** Return true if zSql is a complete SQL statement. Return false if it 29697 ** ends in the middle of a string literal or C-style comment. 29698 */ 29699 static int line_is_complete(char *zSql, int nSql){ 29700 int rc; 29701 if( zSql==0 ) return 1; 29702 zSql[nSql] = ';'; 29703 zSql[nSql+1] = 0; 29704 rc = sqlite3_complete(zSql); 29705 zSql[nSql] = 0; 29706 return rc; 29707 } 29708 29709 /* 29710 ** This function is called after processing each line of SQL in the 29711 ** runOneSqlLine() function. Its purpose is to detect scenarios where 29712 ** defensive mode should be automatically turned off. Specifically, when 29713 ** 29714 ** 1. The first line of input is "PRAGMA foreign_keys=OFF;", 29715 ** 2. The second line of input is "BEGIN TRANSACTION;", 29716 ** 3. The database is empty, and 29717 ** 4. The shell is not running in --safe mode. 29718 ** 29719 ** The implementation uses the ShellState.eRestoreState to maintain state: 29720 ** 29721 ** 0: Have not seen any SQL. 29722 ** 1: Have seen "PRAGMA foreign_keys=OFF;". 29723 ** 2-6: Currently running .dump transaction. If the "2" bit is set, 29724 ** disable DEFENSIVE when done. If "4" is set, disable DQS_DDL. 29725 ** 7: Nothing left to do. This function becomes a no-op. 29726 */ 29727 static int doAutoDetectRestore(ShellState *p, const char *zSql){ 29728 int rc = SQLITE_OK; 29729 29730 if( p->eRestoreState<7 ){ 29731 switch( p->eRestoreState ){ 29732 case 0: { 29733 const char *zExpect = "PRAGMA foreign_keys=OFF;"; 29734 assert( strlen(zExpect)==24 ); 29735 if( p->bSafeMode==0 && memcmp(zSql, zExpect, 25)==0 ){ 29736 p->eRestoreState = 1; 29737 }else{ 29738 p->eRestoreState = 7; 29739 } 29740 break; 29741 }; 29742 29743 case 1: { 29744 int bIsDump = 0; 29745 const char *zExpect = "BEGIN TRANSACTION;"; 29746 assert( strlen(zExpect)==18 ); 29747 if( memcmp(zSql, zExpect, 19)==0 ){ 29748 /* Now check if the database is empty. */ 29749 const char *zQuery = "SELECT 1 FROM sqlite_schema LIMIT 1"; 29750 sqlite3_stmt *pStmt = 0; 29751 29752 bIsDump = 1; 29753 shellPrepare(p->db, &rc, zQuery, &pStmt); 29754 if( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){ 29755 bIsDump = 0; 29756 } 29757 shellFinalize(&rc, pStmt); 29758 } 29759 if( bIsDump && rc==SQLITE_OK ){ 29760 int bDefense = 0; 29761 int bDqsDdl = 0; 29762 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, -1, &bDefense); 29763 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DQS_DDL, -1, &bDqsDdl); 29764 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, 0, 0); 29765 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DQS_DDL, 1, 0); 29766 p->eRestoreState = (bDefense ? 2 : 0) + (bDqsDdl ? 4 : 0); 29767 }else{ 29768 p->eRestoreState = 7; 29769 } 29770 break; 29771 } 29772 29773 default: { 29774 if( sqlite3_get_autocommit(p->db) ){ 29775 if( (p->eRestoreState & 2) ){ 29776 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, 1, 0); 29777 } 29778 if( (p->eRestoreState & 4) ){ 29779 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DQS_DDL, 0, 0); 29780 } 29781 p->eRestoreState = 7; 29782 } 29783 break; 29784 } 29785 } 29786 } 29787 29788 return rc; 29789 } 29790 29791 /* 29792 ** Run a single line of SQL. Return the number of errors. 29793 */ 29794 static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){ 29795 int rc; 29796 char *zErrMsg = 0; 29797 29798 open_db(p, 0); 29799 if( ShellHasFlag(p,SHFLG_Backslash) ) resolve_backslashes(zSql); 29800 if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0; 29801 BEGIN_TIMER; 29802 rc = shell_exec(p, zSql, &zErrMsg); 29803 END_TIMER; 29804 if( rc || zErrMsg ){ 29805 char zPrefix[100]; 29806 const char *zErrorTail; 29807 const char *zErrorType; 29808 if( zErrMsg==0 ){ 29809 zErrorType = "Error"; 29810 zErrorTail = sqlite3_errmsg(p->db); 29811 }else if( cli_strncmp(zErrMsg, "in prepare, ",12)==0 ){ 29812 zErrorType = "Parse error"; 29813 zErrorTail = &zErrMsg[12]; 29814 }else if( cli_strncmp(zErrMsg, "stepping, ", 10)==0 ){ 29815 zErrorType = "Runtime error"; 29816 zErrorTail = &zErrMsg[10]; 29817 }else{ 29818 zErrorType = "Error"; 29819 zErrorTail = zErrMsg; 29820 } 29821 if( in!=0 || !stdin_is_interactive ){ 29822 sqlite3_snprintf(sizeof(zPrefix), zPrefix, 29823 "%s near line %d:", zErrorType, startline); 29824 }else{ 29825 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "%s:", zErrorType); 29826 } 29827 eputf("%s %s\n", zPrefix, zErrorTail); 29828 sqlite3_free(zErrMsg); 29829 zErrMsg = 0; 29830 return 1; 29831 }else if( ShellHasFlag(p, SHFLG_CountChanges) ){ 29832 char zLineBuf[2000]; 29833 sqlite3_snprintf(sizeof(zLineBuf), zLineBuf, 29834 "changes: %lld total_changes: %lld", 29835 sqlite3_changes64(p->db), sqlite3_total_changes64(p->db)); 29836 oputf("%s\n", zLineBuf); 29837 } 29838 29839 if( doAutoDetectRestore(p, zSql) ) return 1; 29840 return 0; 29841 } 29842 29843 static void echo_group_input(ShellState *p, const char *zDo){ 29844 if( ShellHasFlag(p, SHFLG_Echo) ) oputf("%s\n", zDo); 29845 } 29846 29847 #ifdef SQLITE_SHELL_FIDDLE 29848 /* 29849 ** Alternate one_input_line() impl for wasm mode. This is not in the primary 29850 ** impl because we need the global shellState and cannot access it from that 29851 ** function without moving lots of code around (creating a larger/messier diff). 29852 */ 29853 static char *one_input_line(FILE *in, char *zPrior, int isContinuation){ 29854 /* Parse the next line from shellState.wasm.zInput. */ 29855 const char *zBegin = shellState.wasm.zPos; 29856 const char *z = zBegin; 29857 char *zLine = 0; 29858 i64 nZ = 0; 29859 29860 UNUSED_PARAMETER(in); 29861 UNUSED_PARAMETER(isContinuation); 29862 if(!z || !*z){ 29863 return 0; 29864 } 29865 while(*z && isspace(*z)) ++z; 29866 zBegin = z; 29867 for(; *z && '\n'!=*z; ++nZ, ++z){} 29868 if(nZ>0 && '\r'==zBegin[nZ-1]){ 29869 --nZ; 29870 } 29871 shellState.wasm.zPos = z; 29872 zLine = realloc(zPrior, nZ+1); 29873 shell_check_oom(zLine); 29874 memcpy(zLine, zBegin, nZ); 29875 zLine[nZ] = 0; 29876 return zLine; 29877 } 29878 #endif /* SQLITE_SHELL_FIDDLE */ 29879 29880 /* 29881 ** Read input from *in and process it. If *in==0 then input 29882 ** is interactive - the user is typing it it. Otherwise, input 29883 ** is coming from a file or device. A prompt is issued and history 29884 ** is saved only if input is interactive. An interrupt signal will 29885 ** cause this routine to exit immediately, unless input is interactive. 29886 ** 29887 ** Return the number of errors. 29888 */ 29889 static int process_input(ShellState *p){ 29890 char *zLine = 0; /* A single input line */ 29891 char *zSql = 0; /* Accumulated SQL text */ 29892 i64 nLine; /* Length of current line */ 29893 i64 nSql = 0; /* Bytes of zSql[] used */ 29894 i64 nAlloc = 0; /* Allocated zSql[] space */ 29895 int rc; /* Error code */ 29896 int errCnt = 0; /* Number of errors seen */ 29897 i64 startline = 0; /* Line number for start of current input */ 29898 QuickScanState qss = QSS_Start; /* Accumulated line status (so far) */ 29899 29900 if( p->inputNesting==MAX_INPUT_NESTING ){ 29901 /* This will be more informative in a later version. */ 29902 eputf("Input nesting limit (%d) reached at line %d." 29903 " Check recursion.\n", MAX_INPUT_NESTING, p->lineno); 29904 return 1; 29905 } 29906 ++p->inputNesting; 29907 p->lineno = 0; 29908 CONTINUE_PROMPT_RESET; 29909 while( errCnt==0 || !bail_on_error || (p->in==0 && stdin_is_interactive) ){ 29910 fflush(p->out); 29911 zLine = one_input_line(p->in, zLine, nSql>0); 29912 if( zLine==0 ){ 29913 /* End of input */ 29914 if( p->in==0 && stdin_is_interactive ) oputz("\n"); 29915 break; 29916 } 29917 if( seenInterrupt ){ 29918 if( p->in!=0 ) break; 29919 seenInterrupt = 0; 29920 } 29921 p->lineno++; 29922 if( QSS_INPLAIN(qss) 29923 && line_is_command_terminator(zLine) 29924 && line_is_complete(zSql, nSql) ){ 29925 memcpy(zLine,";",2); 29926 } 29927 qss = quickscan(zLine, qss, CONTINUE_PROMPT_PSTATE); 29928 if( QSS_PLAINWHITE(qss) && nSql==0 ){ 29929 /* Just swallow single-line whitespace */ 29930 echo_group_input(p, zLine); 29931 qss = QSS_Start; 29932 continue; 29933 } 29934 if( zLine && (zLine[0]=='.' || zLine[0]=='#') && nSql==0 ){ 29935 CONTINUE_PROMPT_RESET; 29936 echo_group_input(p, zLine); 29937 if( zLine[0]=='.' ){ 29938 rc = do_meta_command(zLine, p); 29939 if( rc==2 ){ /* exit requested */ 29940 break; 29941 }else if( rc ){ 29942 errCnt++; 29943 } 29944 } 29945 qss = QSS_Start; 29946 continue; 29947 } 29948 /* No single-line dispositions remain; accumulate line(s). */ 29949 nLine = strlen(zLine); 29950 if( nSql+nLine+2>=nAlloc ){ 29951 /* Grow buffer by half-again increments when big. */ 29952 nAlloc = nSql+(nSql>>1)+nLine+100; 29953 zSql = realloc(zSql, nAlloc); 29954 shell_check_oom(zSql); 29955 } 29956 if( nSql==0 ){ 29957 i64 i; 29958 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){} 29959 assert( nAlloc>0 && zSql!=0 ); 29960 memcpy(zSql, zLine+i, nLine+1-i); 29961 startline = p->lineno; 29962 nSql = nLine-i; 29963 }else{ 29964 zSql[nSql++] = '\n'; 29965 memcpy(zSql+nSql, zLine, nLine+1); 29966 nSql += nLine; 29967 } 29968 if( nSql && QSS_SEMITERM(qss) && sqlite3_complete(zSql) ){ 29969 echo_group_input(p, zSql); 29970 errCnt += runOneSqlLine(p, zSql, p->in, startline); 29971 CONTINUE_PROMPT_RESET; 29972 nSql = 0; 29973 if( p->outCount ){ 29974 output_reset(p); 29975 p->outCount = 0; 29976 }else{ 29977 clearTempFile(p); 29978 } 29979 p->bSafeMode = p->bSafeModePersist; 29980 qss = QSS_Start; 29981 }else if( nSql && QSS_PLAINWHITE(qss) ){ 29982 echo_group_input(p, zSql); 29983 nSql = 0; 29984 qss = QSS_Start; 29985 } 29986 } 29987 if( nSql ){ 29988 /* This may be incomplete. Let the SQL parser deal with that. */ 29989 echo_group_input(p, zSql); 29990 errCnt += runOneSqlLine(p, zSql, p->in, startline); 29991 CONTINUE_PROMPT_RESET; 29992 } 29993 free(zSql); 29994 free(zLine); 29995 --p->inputNesting; 29996 return errCnt>0; 29997 } 29998 29999 /* 30000 ** Return a pathname which is the user's home directory. A 30001 ** 0 return indicates an error of some kind. 30002 */ 30003 static char *find_home_dir(int clearFlag){ 30004 static char *home_dir = NULL; 30005 if( clearFlag ){ 30006 free(home_dir); 30007 home_dir = 0; 30008 return 0; 30009 } 30010 if( home_dir ) return home_dir; 30011 30012 #if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \ 30013 && !defined(__RTP__) && !defined(_WRS_KERNEL) && !defined(SQLITE_WASI) 30014 { 30015 struct passwd *pwent; 30016 uid_t uid = getuid(); 30017 if( (pwent=getpwuid(uid)) != NULL) { 30018 home_dir = pwent->pw_dir; 30019 } 30020 } 30021 #endif 30022 30023 #if defined(_WIN32_WCE) 30024 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv() 30025 */ 30026 home_dir = "/"; 30027 #else 30028 30029 #if defined(_WIN32) || defined(WIN32) 30030 if (!home_dir) { 30031 home_dir = getenv("USERPROFILE"); 30032 } 30033 #endif 30034 30035 if (!home_dir) { 30036 home_dir = getenv("HOME"); 30037 } 30038 30039 #if defined(_WIN32) || defined(WIN32) 30040 if (!home_dir) { 30041 char *zDrive, *zPath; 30042 int n; 30043 zDrive = getenv("HOMEDRIVE"); 30044 zPath = getenv("HOMEPATH"); 30045 if( zDrive && zPath ){ 30046 n = strlen30(zDrive) + strlen30(zPath) + 1; 30047 home_dir = malloc( n ); 30048 if( home_dir==0 ) return 0; 30049 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath); 30050 return home_dir; 30051 } 30052 home_dir = "c:\\"; 30053 } 30054 #endif 30055 30056 #endif /* !_WIN32_WCE */ 30057 30058 if( home_dir ){ 30059 i64 n = strlen(home_dir) + 1; 30060 char *z = malloc( n ); 30061 if( z ) memcpy(z, home_dir, n); 30062 home_dir = z; 30063 } 30064 30065 return home_dir; 30066 } 30067 30068 /* 30069 ** On non-Windows platforms, look for $XDG_CONFIG_HOME. 30070 ** If ${XDG_CONFIG_HOME}/sqlite3/sqliterc is found, return 30071 ** the path to it, else return 0. The result is cached for 30072 ** subsequent calls. 30073 */ 30074 static const char *find_xdg_config(void){ 30075 #if defined(_WIN32) || defined(WIN32) || defined(_WIN32_WCE) \ 30076 || defined(__RTP__) || defined(_WRS_KERNEL) 30077 return 0; 30078 #else 30079 static int alreadyTried = 0; 30080 static char *zConfig = 0; 30081 const char *zXdgHome; 30082 30083 if( alreadyTried!=0 ){ 30084 return zConfig; 30085 } 30086 alreadyTried = 1; 30087 zXdgHome = getenv("XDG_CONFIG_HOME"); 30088 if( zXdgHome==0 ){ 30089 return 0; 30090 } 30091 zConfig = sqlite3_mprintf("%s/sqlite3/sqliterc", zXdgHome); 30092 shell_check_oom(zConfig); 30093 if( access(zConfig,0)!=0 ){ 30094 sqlite3_free(zConfig); 30095 zConfig = 0; 30096 } 30097 return zConfig; 30098 #endif 30099 } 30100 30101 /* 30102 ** Read input from the file given by sqliterc_override. Or if that 30103 ** parameter is NULL, take input from the first of find_xdg_config() 30104 ** or ~/.sqliterc which is found. 30105 ** 30106 ** Returns the number of errors. 30107 */ 30108 static void process_sqliterc( 30109 ShellState *p, /* Configuration data */ 30110 const char *sqliterc_override /* Name of config file. NULL to use default */ 30111 ){ 30112 char *home_dir = NULL; 30113 const char *sqliterc = sqliterc_override; 30114 char *zBuf = 0; 30115 FILE *inSaved = p->in; 30116 int savedLineno = p->lineno; 30117 30118 if( sqliterc == NULL ){ 30119 sqliterc = find_xdg_config(); 30120 } 30121 if( sqliterc == NULL ){ 30122 home_dir = find_home_dir(0); 30123 if( home_dir==0 ){ 30124 eputz("-- warning: cannot find home directory;" 30125 " cannot read ~/.sqliterc\n"); 30126 return; 30127 } 30128 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir); 30129 shell_check_oom(zBuf); 30130 sqliterc = zBuf; 30131 } 30132 p->in = fopen(sqliterc,"rb"); 30133 if( p->in ){ 30134 if( stdin_is_interactive ){ 30135 eputf("-- Loading resources from %s\n", sqliterc); 30136 } 30137 if( process_input(p) && bail_on_error ) exit(1); 30138 fclose(p->in); 30139 }else if( sqliterc_override!=0 ){ 30140 eputf("cannot open: \"%s\"\n", sqliterc); 30141 if( bail_on_error ) exit(1); 30142 } 30143 p->in = inSaved; 30144 p->lineno = savedLineno; 30145 sqlite3_free(zBuf); 30146 } 30147 30148 /* 30149 ** Show available command line options 30150 */ 30151 static const char zOptions[] = 30152 " -- treat no subsequent arguments as options\n" 30153 #if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE) 30154 " -A ARGS... run \".archive ARGS\" and exit\n" 30155 #endif 30156 " -append append the database to the end of the file\n" 30157 " -ascii set output mode to 'ascii'\n" 30158 " -bail stop after hitting an error\n" 30159 " -batch force batch I/O\n" 30160 " -box set output mode to 'box'\n" 30161 " -column set output mode to 'column'\n" 30162 " -cmd COMMAND run \"COMMAND\" before reading stdin\n" 30163 " -csv set output mode to 'csv'\n" 30164 #if !defined(SQLITE_OMIT_DESERIALIZE) 30165 " -deserialize open the database using sqlite3_deserialize()\n" 30166 #endif 30167 " -echo print inputs before execution\n" 30168 " -init FILENAME read/process named file\n" 30169 " -[no]header turn headers on or off\n" 30170 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5) 30171 " -heap SIZE Size of heap for memsys3 or memsys5\n" 30172 #endif 30173 " -help show this message\n" 30174 " -html set output mode to HTML\n" 30175 " -interactive force interactive I/O\n" 30176 " -json set output mode to 'json'\n" 30177 " -line set output mode to 'line'\n" 30178 " -list set output mode to 'list'\n" 30179 " -lookaside SIZE N use N entries of SZ bytes for lookaside memory\n" 30180 " -markdown set output mode to 'markdown'\n" 30181 #if !defined(SQLITE_OMIT_DESERIALIZE) 30182 " -maxsize N maximum size for a --deserialize database\n" 30183 #endif 30184 " -memtrace trace all memory allocations and deallocations\n" 30185 " -mmap N default mmap size set to N\n" 30186 #ifdef SQLITE_ENABLE_MULTIPLEX 30187 " -multiplex enable the multiplexor VFS\n" 30188 #endif 30189 " -newline SEP set output row separator. Default: '\\n'\n" 30190 " -nofollow refuse to open symbolic links to database files\n" 30191 " -nonce STRING set the safe-mode escape nonce\n" 30192 " -no-rowid-in-view Disable rowid-in-view using sqlite3_config()\n" 30193 " -nullvalue TEXT set text string for NULL values. Default ''\n" 30194 " -pagecache SIZE N use N slots of SZ bytes each for page cache memory\n" 30195 " -pcachetrace trace all page cache operations\n" 30196 " -quote set output mode to 'quote'\n" 30197 " -readonly open the database read-only\n" 30198 " -safe enable safe-mode\n" 30199 " -separator SEP set output column separator. Default: '|'\n" 30200 #ifdef SQLITE_ENABLE_SORTER_REFERENCES 30201 " -sorterref SIZE sorter references threshold size\n" 30202 #endif 30203 " -stats print memory stats before each finalize\n" 30204 " -table set output mode to 'table'\n" 30205 " -tabs set output mode to 'tabs'\n" 30206 " -unsafe-testing allow unsafe commands and modes for testing\n" 30207 " -version show SQLite version\n" 30208 " -vfs NAME use NAME as the default VFS\n" 30209 #ifdef SQLITE_ENABLE_VFSTRACE 30210 " -vfstrace enable tracing of all VFS calls\n" 30211 #endif 30212 #ifdef SQLITE_HAVE_ZLIB 30213 " -zip open the file as a ZIP Archive\n" 30214 #endif 30215 ; 30216 static void usage(int showDetail){ 30217 eputf("Usage: %s [OPTIONS] [FILENAME [SQL]]\n" 30218 "FILENAME is the name of an SQLite database. A new database is created\n" 30219 "if the file does not previously exist. Defaults to :memory:.\n", Argv0); 30220 if( showDetail ){ 30221 eputf("OPTIONS include:\n%s", zOptions); 30222 }else{ 30223 eputz("Use the -help option for additional information\n"); 30224 } 30225 exit(0); 30226 } 30227 30228 /* 30229 ** Internal check: Verify that the SQLite is uninitialized. Print a 30230 ** error message if it is initialized. 30231 */ 30232 static void verify_uninitialized(void){ 30233 if( sqlite3_config(-1)==SQLITE_MISUSE ){ 30234 sputz(stdout, "WARNING: attempt to configure SQLite after" 30235 " initialization.\n"); 30236 } 30237 } 30238 30239 /* 30240 ** Initialize the state information in data 30241 */ 30242 static void main_init(ShellState *data) { 30243 memset(data, 0, sizeof(*data)); 30244 data->normalMode = data->cMode = data->mode = MODE_List; 30245 data->autoExplain = 1; 30246 data->pAuxDb = &data->aAuxDb[0]; 30247 memcpy(data->colSeparator,SEP_Column, 2); 30248 memcpy(data->rowSeparator,SEP_Row, 2); 30249 data->showHeader = 0; 30250 data->shellFlgs = SHFLG_Lookaside; 30251 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data); 30252 #if !defined(SQLITE_SHELL_FIDDLE) 30253 verify_uninitialized(); 30254 #endif 30255 sqlite3_config(SQLITE_CONFIG_URI, 1); 30256 sqlite3_config(SQLITE_CONFIG_MULTITHREAD); 30257 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> "); 30258 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> "); 30259 } 30260 30261 /* 30262 ** Output text to the console in a font that attracts extra attention. 30263 */ 30264 #if defined(_WIN32) || defined(WIN32) 30265 static void printBold(const char *zText){ 30266 #if !SQLITE_OS_WINRT 30267 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE); 30268 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo; 30269 GetConsoleScreenBufferInfo(out, &defaultScreenInfo); 30270 SetConsoleTextAttribute(out, 30271 FOREGROUND_RED|FOREGROUND_INTENSITY 30272 ); 30273 #endif 30274 sputz(stdout, zText); 30275 #if !SQLITE_OS_WINRT 30276 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes); 30277 #endif 30278 } 30279 #else 30280 static void printBold(const char *zText){ 30281 sputf(stdout, "\033[1m%s\033[0m", zText); 30282 } 30283 #endif 30284 30285 /* 30286 ** Get the argument to an --option. Throw an error and die if no argument 30287 ** is available. 30288 */ 30289 static char *cmdline_option_value(int argc, char **argv, int i){ 30290 if( i==argc ){ 30291 eputf("%s: Error: missing argument to %s\n", argv[0], argv[argc-1]); 30292 exit(1); 30293 } 30294 return argv[i]; 30295 } 30296 30297 static void sayAbnormalExit(void){ 30298 if( seenInterrupt ) eputz("Program interrupted.\n"); 30299 } 30300 30301 #ifndef SQLITE_SHELL_IS_UTF8 30302 # if (defined(_WIN32) || defined(WIN32)) \ 30303 && (defined(_MSC_VER) || (defined(UNICODE) && defined(__GNUC__))) 30304 # define SQLITE_SHELL_IS_UTF8 (0) 30305 # else 30306 # define SQLITE_SHELL_IS_UTF8 (1) 30307 # endif 30308 #endif 30309 30310 #ifdef SQLITE_SHELL_FIDDLE 30311 # define main fiddle_main 30312 #endif 30313 30314 #if SQLITE_SHELL_IS_UTF8 30315 int SQLITE_CDECL main(int argc, char **argv){ 30316 #else 30317 int SQLITE_CDECL wmain(int argc, wchar_t **wargv){ 30318 char **argv; 30319 #endif 30320 #ifdef SQLITE_DEBUG 30321 sqlite3_int64 mem_main_enter = 0; 30322 #endif 30323 char *zErrMsg = 0; 30324 #ifdef SQLITE_SHELL_FIDDLE 30325 # define data shellState 30326 #else 30327 ShellState data; 30328 StreamsAreConsole consStreams = SAC_NoConsole; 30329 #endif 30330 const char *zInitFile = 0; 30331 int i; 30332 int rc = 0; 30333 int warnInmemoryDb = 0; 30334 int readStdin = 1; 30335 int nCmd = 0; 30336 int nOptsEnd = argc; 30337 char **azCmd = 0; 30338 const char *zVfs = 0; /* Value of -vfs command-line option */ 30339 #if !SQLITE_SHELL_IS_UTF8 30340 char **argvToFree = 0; 30341 int argcToFree = 0; 30342 #endif 30343 setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */ 30344 30345 #ifdef SQLITE_SHELL_FIDDLE 30346 stdin_is_interactive = 0; 30347 stdout_is_console = 1; 30348 data.wasm.zDefaultDbName = "/fiddle.sqlite3"; 30349 #else 30350 consStreams = consoleClassifySetup(stdin, stdout, stderr); 30351 stdin_is_interactive = (consStreams & SAC_InConsole)!=0; 30352 stdout_is_console = (consStreams & SAC_OutConsole)!=0; 30353 atexit(consoleRestore); 30354 #endif 30355 atexit(sayAbnormalExit); 30356 #ifdef SQLITE_DEBUG 30357 mem_main_enter = sqlite3_memory_used(); 30358 #endif 30359 #if !defined(_WIN32_WCE) 30360 if( getenv("SQLITE_DEBUG_BREAK") ){ 30361 if( isatty(0) && isatty(2) ){ 30362 eputf("attach debugger to process %d and press any key to continue.\n", 30363 GETPID()); 30364 fgetc(stdin); 30365 }else{ 30366 #if defined(_WIN32) || defined(WIN32) 30367 #if SQLITE_OS_WINRT 30368 __debugbreak(); 30369 #else 30370 DebugBreak(); 30371 #endif 30372 #elif defined(SIGTRAP) 30373 raise(SIGTRAP); 30374 #endif 30375 } 30376 } 30377 #endif 30378 /* Register a valid signal handler early, before much else is done. */ 30379 #ifdef SIGINT 30380 signal(SIGINT, interrupt_handler); 30381 #elif (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE) 30382 if( !SetConsoleCtrlHandler(ConsoleCtrlHandler, TRUE) ){ 30383 eputz("No ^C handler.\n"); 30384 } 30385 #endif 30386 30387 #if USE_SYSTEM_SQLITE+0!=1 30388 if( cli_strncmp(sqlite3_sourceid(),SQLITE_SOURCE_ID,60)!=0 ){ 30389 eputf("SQLite header and source version mismatch\n%s\n%s\n", 30390 sqlite3_sourceid(), SQLITE_SOURCE_ID); 30391 exit(1); 30392 } 30393 #endif 30394 main_init(&data); 30395 30396 /* On Windows, we must translate command-line arguments into UTF-8. 30397 ** The SQLite memory allocator subsystem has to be enabled in order to 30398 ** do this. But we want to run an sqlite3_shutdown() afterwards so that 30399 ** subsequent sqlite3_config() calls will work. So copy all results into 30400 ** memory that does not come from the SQLite memory allocator. 30401 */ 30402 #if !SQLITE_SHELL_IS_UTF8 30403 sqlite3_initialize(); 30404 argvToFree = malloc(sizeof(argv[0])*argc*2); 30405 shell_check_oom(argvToFree); 30406 argcToFree = argc; 30407 argv = argvToFree + argc; 30408 for(i=0; i<argc; i++){ 30409 char *z = sqlite3_win32_unicode_to_utf8(wargv[i]); 30410 i64 n; 30411 shell_check_oom(z); 30412 n = strlen(z); 30413 argv[i] = malloc( n+1 ); 30414 shell_check_oom(argv[i]); 30415 memcpy(argv[i], z, n+1); 30416 argvToFree[i] = argv[i]; 30417 sqlite3_free(z); 30418 } 30419 sqlite3_shutdown(); 30420 #endif 30421 30422 assert( argc>=1 && argv && argv[0] ); 30423 Argv0 = argv[0]; 30424 30425 #ifdef SQLITE_SHELL_DBNAME_PROC 30426 { 30427 /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name 30428 ** of a C-function that will provide the name of the database file. Use 30429 ** this compile-time option to embed this shell program in larger 30430 ** applications. */ 30431 extern void SQLITE_SHELL_DBNAME_PROC(const char**); 30432 SQLITE_SHELL_DBNAME_PROC(&data.pAuxDb->zDbFilename); 30433 warnInmemoryDb = 0; 30434 } 30435 #endif 30436 30437 /* Do an initial pass through the command-line argument to locate 30438 ** the name of the database file, the name of the initialization file, 30439 ** the size of the alternative malloc heap, options affecting commands 30440 ** or SQL run from the command line, and the first command to execute. 30441 */ 30442 #ifndef SQLITE_SHELL_FIDDLE 30443 verify_uninitialized(); 30444 #endif 30445 for(i=1; i<argc; i++){ 30446 char *z; 30447 z = argv[i]; 30448 if( z[0]!='-' || i>nOptsEnd ){ 30449 if( data.aAuxDb->zDbFilename==0 ){ 30450 data.aAuxDb->zDbFilename = z; 30451 }else{ 30452 /* Excess arguments are interpreted as SQL (or dot-commands) and 30453 ** mean that nothing is read from stdin */ 30454 readStdin = 0; 30455 nCmd++; 30456 azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd); 30457 shell_check_oom(azCmd); 30458 azCmd[nCmd-1] = z; 30459 } 30460 continue; 30461 } 30462 if( z[1]=='-' ) z++; 30463 if( cli_strcmp(z, "-")==0 ){ 30464 nOptsEnd = i; 30465 continue; 30466 }else if( cli_strcmp(z,"-separator")==0 30467 || cli_strcmp(z,"-nullvalue")==0 30468 || cli_strcmp(z,"-newline")==0 30469 || cli_strcmp(z,"-cmd")==0 30470 ){ 30471 (void)cmdline_option_value(argc, argv, ++i); 30472 }else if( cli_strcmp(z,"-init")==0 ){ 30473 zInitFile = cmdline_option_value(argc, argv, ++i); 30474 }else if( cli_strcmp(z,"-interactive")==0 ){ 30475 }else if( cli_strcmp(z,"-batch")==0 ){ 30476 /* Need to check for batch mode here to so we can avoid printing 30477 ** informational messages (like from process_sqliterc) before 30478 ** we do the actual processing of arguments later in a second pass. 30479 */ 30480 stdin_is_interactive = 0; 30481 }else if( cli_strcmp(z,"-utf8")==0 ){ 30482 }else if( cli_strcmp(z,"-no-utf8")==0 ){ 30483 }else if( cli_strcmp(z,"-no-rowid-in-view")==0 ){ 30484 int val = 0; 30485 sqlite3_config(SQLITE_CONFIG_ROWID_IN_VIEW, &val); 30486 assert( val==0 ); 30487 }else if( cli_strcmp(z,"-heap")==0 ){ 30488 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5) 30489 const char *zSize; 30490 sqlite3_int64 szHeap; 30491 30492 zSize = cmdline_option_value(argc, argv, ++i); 30493 szHeap = integerValue(zSize); 30494 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000; 30495 verify_uninitialized(); 30496 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64); 30497 #else 30498 (void)cmdline_option_value(argc, argv, ++i); 30499 #endif 30500 }else if( cli_strcmp(z,"-pagecache")==0 ){ 30501 sqlite3_int64 n, sz; 30502 sz = integerValue(cmdline_option_value(argc,argv,++i)); 30503 if( sz>70000 ) sz = 70000; 30504 if( sz<0 ) sz = 0; 30505 n = integerValue(cmdline_option_value(argc,argv,++i)); 30506 if( sz>0 && n>0 && 0xffffffffffffLL/sz<n ){ 30507 n = 0xffffffffffffLL/sz; 30508 } 30509 verify_uninitialized(); 30510 sqlite3_config(SQLITE_CONFIG_PAGECACHE, 30511 (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n); 30512 data.shellFlgs |= SHFLG_Pagecache; 30513 }else if( cli_strcmp(z,"-lookaside")==0 ){ 30514 int n, sz; 30515 sz = (int)integerValue(cmdline_option_value(argc,argv,++i)); 30516 if( sz<0 ) sz = 0; 30517 n = (int)integerValue(cmdline_option_value(argc,argv,++i)); 30518 if( n<0 ) n = 0; 30519 verify_uninitialized(); 30520 sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n); 30521 if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside; 30522 }else if( cli_strcmp(z,"-threadsafe")==0 ){ 30523 int n; 30524 n = (int)integerValue(cmdline_option_value(argc,argv,++i)); 30525 verify_uninitialized(); 30526 switch( n ){ 30527 case 0: sqlite3_config(SQLITE_CONFIG_SINGLETHREAD); break; 30528 case 2: sqlite3_config(SQLITE_CONFIG_MULTITHREAD); break; 30529 default: sqlite3_config(SQLITE_CONFIG_SERIALIZED); break; 30530 } 30531 #ifdef SQLITE_ENABLE_VFSTRACE 30532 }else if( cli_strcmp(z,"-vfstrace")==0 ){ 30533 extern int vfstrace_register( 30534 const char *zTraceName, 30535 const char *zOldVfsName, 30536 int (*xOut)(const char*,void*), 30537 void *pOutArg, 30538 int makeDefault 30539 ); 30540 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1); 30541 #endif 30542 #ifdef SQLITE_ENABLE_MULTIPLEX 30543 }else if( cli_strcmp(z,"-multiplex")==0 ){ 30544 extern int sqlite3_multiplex_initialize(const char*,int); 30545 sqlite3_multiplex_initialize(0, 1); 30546 #endif 30547 }else if( cli_strcmp(z,"-mmap")==0 ){ 30548 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i)); 30549 verify_uninitialized(); 30550 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz); 30551 #if defined(SQLITE_ENABLE_SORTER_REFERENCES) 30552 }else if( cli_strcmp(z,"-sorterref")==0 ){ 30553 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i)); 30554 verify_uninitialized(); 30555 sqlite3_config(SQLITE_CONFIG_SORTERREF_SIZE, (int)sz); 30556 #endif 30557 }else if( cli_strcmp(z,"-vfs")==0 ){ 30558 zVfs = cmdline_option_value(argc, argv, ++i); 30559 #ifdef SQLITE_HAVE_ZLIB 30560 }else if( cli_strcmp(z,"-zip")==0 ){ 30561 data.openMode = SHELL_OPEN_ZIPFILE; 30562 #endif 30563 }else if( cli_strcmp(z,"-append")==0 ){ 30564 data.openMode = SHELL_OPEN_APPENDVFS; 30565 #ifndef SQLITE_OMIT_DESERIALIZE 30566 }else if( cli_strcmp(z,"-deserialize")==0 ){ 30567 data.openMode = SHELL_OPEN_DESERIALIZE; 30568 }else if( cli_strcmp(z,"-maxsize")==0 && i+1<argc ){ 30569 data.szMax = integerValue(argv[++i]); 30570 #endif 30571 }else if( cli_strcmp(z,"-readonly")==0 ){ 30572 data.openMode = SHELL_OPEN_READONLY; 30573 }else if( cli_strcmp(z,"-nofollow")==0 ){ 30574 data.openFlags = SQLITE_OPEN_NOFOLLOW; 30575 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) 30576 }else if( cli_strncmp(z, "-A",2)==0 ){ 30577 /* All remaining command-line arguments are passed to the ".archive" 30578 ** command, so ignore them */ 30579 break; 30580 #endif 30581 }else if( cli_strcmp(z, "-memtrace")==0 ){ 30582 sqlite3MemTraceActivate(stderr); 30583 }else if( cli_strcmp(z, "-pcachetrace")==0 ){ 30584 sqlite3PcacheTraceActivate(stderr); 30585 }else if( cli_strcmp(z,"-bail")==0 ){ 30586 bail_on_error = 1; 30587 }else if( cli_strcmp(z,"-nonce")==0 ){ 30588 free(data.zNonce); 30589 data.zNonce = strdup(cmdline_option_value(argc, argv, ++i)); 30590 }else if( cli_strcmp(z,"-unsafe-testing")==0 ){ 30591 ShellSetFlag(&data,SHFLG_TestingMode); 30592 }else if( cli_strcmp(z,"-safe")==0 ){ 30593 /* no-op - catch this on the second pass */ 30594 } 30595 } 30596 #ifndef SQLITE_SHELL_FIDDLE 30597 verify_uninitialized(); 30598 #endif 30599 30600 30601 #ifdef SQLITE_SHELL_INIT_PROC 30602 { 30603 /* If the SQLITE_SHELL_INIT_PROC macro is defined, then it is the name 30604 ** of a C-function that will perform initialization actions on SQLite that 30605 ** occur just before or after sqlite3_initialize(). Use this compile-time 30606 ** option to embed this shell program in larger applications. */ 30607 extern void SQLITE_SHELL_INIT_PROC(void); 30608 SQLITE_SHELL_INIT_PROC(); 30609 } 30610 #else 30611 /* All the sqlite3_config() calls have now been made. So it is safe 30612 ** to call sqlite3_initialize() and process any command line -vfs option. */ 30613 sqlite3_initialize(); 30614 #endif 30615 30616 if( zVfs ){ 30617 sqlite3_vfs *pVfs = sqlite3_vfs_find(zVfs); 30618 if( pVfs ){ 30619 sqlite3_vfs_register(pVfs, 1); 30620 }else{ 30621 eputf("no such VFS: \"%s\"\n", zVfs); 30622 exit(1); 30623 } 30624 } 30625 30626 if( data.pAuxDb->zDbFilename==0 ){ 30627 #ifndef SQLITE_OMIT_MEMORYDB 30628 data.pAuxDb->zDbFilename = ":memory:"; 30629 warnInmemoryDb = argc==1; 30630 #else 30631 eputf("%s: Error: no database filename specified\n", Argv0); 30632 return 1; 30633 #endif 30634 } 30635 data.out = stdout; 30636 #ifndef SQLITE_SHELL_FIDDLE 30637 sqlite3_appendvfs_init(0,0,0); 30638 #endif 30639 30640 /* Go ahead and open the database file if it already exists. If the 30641 ** file does not exist, delay opening it. This prevents empty database 30642 ** files from being created if a user mistypes the database name argument 30643 ** to the sqlite command-line tool. 30644 */ 30645 if( access(data.pAuxDb->zDbFilename, 0)==0 ){ 30646 open_db(&data, 0); 30647 } 30648 30649 /* Process the initialization file if there is one. If no -init option 30650 ** is given on the command line, look for a file named ~/.sqliterc and 30651 ** try to process it. 30652 */ 30653 process_sqliterc(&data,zInitFile); 30654 30655 /* Make a second pass through the command-line argument and set 30656 ** options. This second pass is delayed until after the initialization 30657 ** file is processed so that the command-line arguments will override 30658 ** settings in the initialization file. 30659 */ 30660 for(i=1; i<argc; i++){ 30661 char *z = argv[i]; 30662 if( z[0]!='-' || i>=nOptsEnd ) continue; 30663 if( z[1]=='-' ){ z++; } 30664 if( cli_strcmp(z,"-init")==0 ){ 30665 i++; 30666 }else if( cli_strcmp(z,"-html")==0 ){ 30667 data.mode = MODE_Html; 30668 }else if( cli_strcmp(z,"-list")==0 ){ 30669 data.mode = MODE_List; 30670 }else if( cli_strcmp(z,"-quote")==0 ){ 30671 data.mode = MODE_Quote; 30672 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Comma); 30673 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Row); 30674 }else if( cli_strcmp(z,"-line")==0 ){ 30675 data.mode = MODE_Line; 30676 }else if( cli_strcmp(z,"-column")==0 ){ 30677 data.mode = MODE_Column; 30678 }else if( cli_strcmp(z,"-json")==0 ){ 30679 data.mode = MODE_Json; 30680 }else if( cli_strcmp(z,"-markdown")==0 ){ 30681 data.mode = MODE_Markdown; 30682 }else if( cli_strcmp(z,"-table")==0 ){ 30683 data.mode = MODE_Table; 30684 }else if( cli_strcmp(z,"-box")==0 ){ 30685 data.mode = MODE_Box; 30686 }else if( cli_strcmp(z,"-csv")==0 ){ 30687 data.mode = MODE_Csv; 30688 memcpy(data.colSeparator,",",2); 30689 #ifdef SQLITE_HAVE_ZLIB 30690 }else if( cli_strcmp(z,"-zip")==0 ){ 30691 data.openMode = SHELL_OPEN_ZIPFILE; 30692 #endif 30693 }else if( cli_strcmp(z,"-append")==0 ){ 30694 data.openMode = SHELL_OPEN_APPENDVFS; 30695 #ifndef SQLITE_OMIT_DESERIALIZE 30696 }else if( cli_strcmp(z,"-deserialize")==0 ){ 30697 data.openMode = SHELL_OPEN_DESERIALIZE; 30698 }else if( cli_strcmp(z,"-maxsize")==0 && i+1<argc ){ 30699 data.szMax = integerValue(argv[++i]); 30700 #endif 30701 }else if( cli_strcmp(z,"-readonly")==0 ){ 30702 data.openMode = SHELL_OPEN_READONLY; 30703 }else if( cli_strcmp(z,"-nofollow")==0 ){ 30704 data.openFlags |= SQLITE_OPEN_NOFOLLOW; 30705 }else if( cli_strcmp(z,"-ascii")==0 ){ 30706 data.mode = MODE_Ascii; 30707 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,SEP_Unit); 30708 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,SEP_Record); 30709 }else if( cli_strcmp(z,"-tabs")==0 ){ 30710 data.mode = MODE_List; 30711 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,SEP_Tab); 30712 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,SEP_Row); 30713 }else if( cli_strcmp(z,"-separator")==0 ){ 30714 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, 30715 "%s",cmdline_option_value(argc,argv,++i)); 30716 }else if( cli_strcmp(z,"-newline")==0 ){ 30717 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, 30718 "%s",cmdline_option_value(argc,argv,++i)); 30719 }else if( cli_strcmp(z,"-nullvalue")==0 ){ 30720 sqlite3_snprintf(sizeof(data.nullValue), data.nullValue, 30721 "%s",cmdline_option_value(argc,argv,++i)); 30722 }else if( cli_strcmp(z,"-header")==0 ){ 30723 data.showHeader = 1; 30724 ShellSetFlag(&data, SHFLG_HeaderSet); 30725 }else if( cli_strcmp(z,"-noheader")==0 ){ 30726 data.showHeader = 0; 30727 ShellSetFlag(&data, SHFLG_HeaderSet); 30728 }else if( cli_strcmp(z,"-echo")==0 ){ 30729 ShellSetFlag(&data, SHFLG_Echo); 30730 }else if( cli_strcmp(z,"-eqp")==0 ){ 30731 data.autoEQP = AUTOEQP_on; 30732 }else if( cli_strcmp(z,"-eqpfull")==0 ){ 30733 data.autoEQP = AUTOEQP_full; 30734 }else if( cli_strcmp(z,"-stats")==0 ){ 30735 data.statsOn = 1; 30736 }else if( cli_strcmp(z,"-scanstats")==0 ){ 30737 data.scanstatsOn = 1; 30738 }else if( cli_strcmp(z,"-backslash")==0 ){ 30739 /* Undocumented command-line option: -backslash 30740 ** Causes C-style backslash escapes to be evaluated in SQL statements 30741 ** prior to sending the SQL into SQLite. Useful for injecting 30742 ** crazy bytes in the middle of SQL statements for testing and debugging. 30743 */ 30744 ShellSetFlag(&data, SHFLG_Backslash); 30745 }else if( cli_strcmp(z,"-bail")==0 ){ 30746 /* No-op. The bail_on_error flag should already be set. */ 30747 }else if( cli_strcmp(z,"-version")==0 ){ 30748 sputf(stdout, "%s %s (%d-bit)\n", 30749 sqlite3_libversion(), sqlite3_sourceid(), 8*(int)sizeof(char*)); 30750 return 0; 30751 }else if( cli_strcmp(z,"-interactive")==0 ){ 30752 /* Need to check for interactive override here to so that it can 30753 ** affect console setup (for Windows only) and testing thereof. 30754 */ 30755 stdin_is_interactive = 1; 30756 }else if( cli_strcmp(z,"-batch")==0 ){ 30757 /* already handled */ 30758 }else if( cli_strcmp(z,"-utf8")==0 ){ 30759 /* already handled */ 30760 }else if( cli_strcmp(z,"-no-utf8")==0 ){ 30761 /* already handled */ 30762 }else if( cli_strcmp(z,"-no-rowid-in-view")==0 ){ 30763 /* already handled */ 30764 }else if( cli_strcmp(z,"-heap")==0 ){ 30765 i++; 30766 }else if( cli_strcmp(z,"-pagecache")==0 ){ 30767 i+=2; 30768 }else if( cli_strcmp(z,"-lookaside")==0 ){ 30769 i+=2; 30770 }else if( cli_strcmp(z,"-threadsafe")==0 ){ 30771 i+=2; 30772 }else if( cli_strcmp(z,"-nonce")==0 ){ 30773 i += 2; 30774 }else if( cli_strcmp(z,"-mmap")==0 ){ 30775 i++; 30776 }else if( cli_strcmp(z,"-memtrace")==0 ){ 30777 i++; 30778 }else if( cli_strcmp(z,"-pcachetrace")==0 ){ 30779 i++; 30780 #ifdef SQLITE_ENABLE_SORTER_REFERENCES 30781 }else if( cli_strcmp(z,"-sorterref")==0 ){ 30782 i++; 30783 #endif 30784 }else if( cli_strcmp(z,"-vfs")==0 ){ 30785 i++; 30786 #ifdef SQLITE_ENABLE_VFSTRACE 30787 }else if( cli_strcmp(z,"-vfstrace")==0 ){ 30788 i++; 30789 #endif 30790 #ifdef SQLITE_ENABLE_MULTIPLEX 30791 }else if( cli_strcmp(z,"-multiplex")==0 ){ 30792 i++; 30793 #endif 30794 }else if( cli_strcmp(z,"-help")==0 ){ 30795 usage(1); 30796 }else if( cli_strcmp(z,"-cmd")==0 ){ 30797 /* Run commands that follow -cmd first and separately from commands 30798 ** that simply appear on the command-line. This seems goofy. It would 30799 ** be better if all commands ran in the order that they appear. But 30800 ** we retain the goofy behavior for historical compatibility. */ 30801 if( i==argc-1 ) break; 30802 z = cmdline_option_value(argc,argv,++i); 30803 if( z[0]=='.' ){ 30804 rc = do_meta_command(z, &data); 30805 if( rc && bail_on_error ) return rc==2 ? 0 : rc; 30806 }else{ 30807 open_db(&data, 0); 30808 rc = shell_exec(&data, z, &zErrMsg); 30809 if( zErrMsg!=0 ){ 30810 eputf("Error: %s\n", zErrMsg); 30811 if( bail_on_error ) return rc!=0 ? rc : 1; 30812 }else if( rc!=0 ){ 30813 eputf("Error: unable to process SQL \"%s\"\n", z); 30814 if( bail_on_error ) return rc; 30815 } 30816 } 30817 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) 30818 }else if( cli_strncmp(z, "-A", 2)==0 ){ 30819 if( nCmd>0 ){ 30820 eputf("Error: cannot mix regular SQL or dot-commands" 30821 " with \"%s\"\n", z); 30822 return 1; 30823 } 30824 open_db(&data, OPEN_DB_ZIPFILE); 30825 if( z[2] ){ 30826 argv[i] = &z[2]; 30827 arDotCommand(&data, 1, argv+(i-1), argc-(i-1)); 30828 }else{ 30829 arDotCommand(&data, 1, argv+i, argc-i); 30830 } 30831 readStdin = 0; 30832 break; 30833 #endif 30834 }else if( cli_strcmp(z,"-safe")==0 ){ 30835 data.bSafeMode = data.bSafeModePersist = 1; 30836 }else if( cli_strcmp(z,"-unsafe-testing")==0 ){ 30837 /* Acted upon in first pass. */ 30838 }else{ 30839 eputf("%s: Error: unknown option: %s\n", Argv0, z); 30840 eputz("Use -help for a list of options.\n"); 30841 return 1; 30842 } 30843 data.cMode = data.mode; 30844 } 30845 30846 if( !readStdin ){ 30847 /* Run all arguments that do not begin with '-' as if they were separate 30848 ** command-line inputs, except for the argToSkip argument which contains 30849 ** the database filename. 30850 */ 30851 for(i=0; i<nCmd; i++){ 30852 if( azCmd[i][0]=='.' ){ 30853 rc = do_meta_command(azCmd[i], &data); 30854 if( rc ){ 30855 free(azCmd); 30856 return rc==2 ? 0 : rc; 30857 } 30858 }else{ 30859 open_db(&data, 0); 30860 echo_group_input(&data, azCmd[i]); 30861 rc = shell_exec(&data, azCmd[i], &zErrMsg); 30862 if( zErrMsg || rc ){ 30863 if( zErrMsg!=0 ){ 30864 eputf("Error: %s\n", zErrMsg); 30865 }else{ 30866 eputf("Error: unable to process SQL: %s\n", azCmd[i]); 30867 } 30868 sqlite3_free(zErrMsg); 30869 free(azCmd); 30870 return rc!=0 ? rc : 1; 30871 } 30872 } 30873 } 30874 }else{ 30875 /* Run commands received from standard input 30876 */ 30877 if( stdin_is_interactive ){ 30878 char *zHome; 30879 char *zHistory; 30880 int nHistory; 30881 #if CIO_WIN_WC_XLATE 30882 # define SHELL_CIO_CHAR_SET (stdout_is_console? " (UTF-16 console I/O)" : "") 30883 #else 30884 # define SHELL_CIO_CHAR_SET "" 30885 #endif 30886 sputf(stdout, "SQLite version %s %.19s%s\n" /*extra-version-info*/ 30887 "Enter \".help\" for usage hints.\n", 30888 sqlite3_libversion(), sqlite3_sourceid(), SHELL_CIO_CHAR_SET); 30889 if( warnInmemoryDb ){ 30890 sputz(stdout, "Connected to a "); 30891 printBold("transient in-memory database"); 30892 sputz(stdout, ".\nUse \".open FILENAME\" to reopen on a" 30893 " persistent database.\n"); 30894 } 30895 zHistory = getenv("SQLITE_HISTORY"); 30896 if( zHistory ){ 30897 zHistory = strdup(zHistory); 30898 }else if( (zHome = find_home_dir(0))!=0 ){ 30899 nHistory = strlen30(zHome) + 20; 30900 if( (zHistory = malloc(nHistory))!=0 ){ 30901 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome); 30902 } 30903 } 30904 if( zHistory ){ shell_read_history(zHistory); } 30905 #if HAVE_READLINE || HAVE_EDITLINE 30906 rl_attempted_completion_function = readline_completion; 30907 #elif HAVE_LINENOISE 30908 linenoiseSetCompletionCallback(linenoise_completion); 30909 #endif 30910 data.in = 0; 30911 rc = process_input(&data); 30912 if( zHistory ){ 30913 shell_stifle_history(2000); 30914 shell_write_history(zHistory); 30915 free(zHistory); 30916 } 30917 }else{ 30918 data.in = stdin; 30919 rc = process_input(&data); 30920 } 30921 } 30922 #ifndef SQLITE_SHELL_FIDDLE 30923 /* In WASM mode we have to leave the db state in place so that 30924 ** client code can "push" SQL into it after this call returns. */ 30925 #ifndef SQLITE_OMIT_VIRTUALTABLE 30926 if( data.expert.pExpert ){ 30927 expertFinish(&data, 1, 0); 30928 } 30929 #endif 30930 free(azCmd); 30931 set_table_name(&data, 0); 30932 if( data.db ){ 30933 session_close_all(&data, -1); 30934 close_db(data.db); 30935 } 30936 for(i=0; i<ArraySize(data.aAuxDb); i++){ 30937 sqlite3_free(data.aAuxDb[i].zFreeOnClose); 30938 if( data.aAuxDb[i].db ){ 30939 session_close_all(&data, i); 30940 close_db(data.aAuxDb[i].db); 30941 } 30942 } 30943 find_home_dir(1); 30944 output_reset(&data); 30945 data.doXdgOpen = 0; 30946 clearTempFile(&data); 30947 #if !SQLITE_SHELL_IS_UTF8 30948 for(i=0; i<argcToFree; i++) free(argvToFree[i]); 30949 free(argvToFree); 30950 #endif 30951 free(data.colWidth); 30952 free(data.zNonce); 30953 /* Clear the global data structure so that valgrind will detect memory 30954 ** leaks */ 30955 memset(&data, 0, sizeof(data)); 30956 #ifdef SQLITE_DEBUG 30957 if( sqlite3_memory_used()>mem_main_enter ){ 30958 eputf("Memory leaked: %u bytes\n", 30959 (unsigned int)(sqlite3_memory_used()-mem_main_enter)); 30960 } 30961 #endif 30962 #endif /* !SQLITE_SHELL_FIDDLE */ 30963 return rc; 30964 } 30965 30966 30967 #ifdef SQLITE_SHELL_FIDDLE 30968 /* Only for emcc experimentation purposes. */ 30969 int fiddle_experiment(int a,int b){ 30970 return a + b; 30971 } 30972 30973 /* 30974 ** Returns a pointer to the current DB handle. 30975 */ 30976 sqlite3 * fiddle_db_handle(){ 30977 return globalDb; 30978 } 30979 30980 /* 30981 ** Returns a pointer to the given DB name's VFS. If zDbName is 0 then 30982 ** "main" is assumed. Returns 0 if no db with the given name is 30983 ** open. 30984 */ 30985 sqlite3_vfs * fiddle_db_vfs(const char *zDbName){ 30986 sqlite3_vfs * pVfs = 0; 30987 if(globalDb){ 30988 sqlite3_file_control(globalDb, zDbName ? zDbName : "main", 30989 SQLITE_FCNTL_VFS_POINTER, &pVfs); 30990 } 30991 return pVfs; 30992 } 30993 30994 /* Only for emcc experimentation purposes. */ 30995 sqlite3 * fiddle_db_arg(sqlite3 *arg){ 30996 oputf("fiddle_db_arg(%p)\n", (const void*)arg); 30997 return arg; 30998 } 30999 31000 /* 31001 ** Intended to be called via a SharedWorker() while a separate 31002 ** SharedWorker() (which manages the wasm module) is performing work 31003 ** which should be interrupted. Unfortunately, SharedWorker is not 31004 ** portable enough to make real use of. 31005 */ 31006 void fiddle_interrupt(void){ 31007 if( globalDb ) sqlite3_interrupt(globalDb); 31008 } 31009 31010 /* 31011 ** Returns the filename of the given db name, assuming "main" if 31012 ** zDbName is NULL. Returns NULL if globalDb is not opened. 31013 */ 31014 const char * fiddle_db_filename(const char * zDbName){ 31015 return globalDb 31016 ? sqlite3_db_filename(globalDb, zDbName ? zDbName : "main") 31017 : NULL; 31018 } 31019 31020 /* 31021 ** Completely wipes out the contents of the currently-opened database 31022 ** but leaves its storage intact for reuse. If any transactions are 31023 ** active, they are forcibly rolled back. 31024 */ 31025 void fiddle_reset_db(void){ 31026 if( globalDb ){ 31027 int rc; 31028 while( sqlite3_txn_state(globalDb,0)>0 ){ 31029 /* 31030 ** Resolve problem reported in 31031 ** https://sqlite.org/forum/forumpost/0b41a25d65 31032 */ 31033 oputz("Rolling back in-progress transaction.\n"); 31034 sqlite3_exec(globalDb,"ROLLBACK", 0, 0, 0); 31035 } 31036 rc = sqlite3_db_config(globalDb, SQLITE_DBCONFIG_RESET_DATABASE, 1, 0); 31037 if( 0==rc ) sqlite3_exec(globalDb, "VACUUM", 0, 0, 0); 31038 sqlite3_db_config(globalDb, SQLITE_DBCONFIG_RESET_DATABASE, 0, 0); 31039 } 31040 } 31041 31042 /* 31043 ** Uses the current database's VFS xRead to stream the db file's 31044 ** contents out to the given callback. The callback gets a single 31045 ** chunk of size n (its 2nd argument) on each call and must return 0 31046 ** on success, non-0 on error. This function returns 0 on success, 31047 ** SQLITE_NOTFOUND if no db is open, or propagates any other non-0 31048 ** code from the callback. Note that this is not thread-friendly: it 31049 ** expects that it will be the only thread reading the db file and 31050 ** takes no measures to ensure that is the case. 31051 */ 31052 int fiddle_export_db( int (*xCallback)(unsigned const char *zOut, int n) ){ 31053 sqlite3_int64 nSize = 0; 31054 sqlite3_int64 nPos = 0; 31055 sqlite3_file * pFile = 0; 31056 unsigned char buf[1024 * 8]; 31057 int nBuf = (int)sizeof(buf); 31058 int rc = shellState.db 31059 ? sqlite3_file_control(shellState.db, "main", 31060 SQLITE_FCNTL_FILE_POINTER, &pFile) 31061 : SQLITE_NOTFOUND; 31062 if( rc ) return rc; 31063 rc = pFile->pMethods->xFileSize(pFile, &nSize); 31064 if( rc ) return rc; 31065 if(nSize % nBuf){ 31066 /* DB size is not an even multiple of the buffer size. Reduce 31067 ** buffer size so that we do not unduly inflate the db size when 31068 ** exporting. */ 31069 if(0 == nSize % 4096) nBuf = 4096; 31070 else if(0 == nSize % 2048) nBuf = 2048; 31071 else if(0 == nSize % 1024) nBuf = 1024; 31072 else nBuf = 512; 31073 } 31074 for( ; 0==rc && nPos<nSize; nPos += nBuf ){ 31075 rc = pFile->pMethods->xRead(pFile, buf, nBuf, nPos); 31076 if(SQLITE_IOERR_SHORT_READ == rc){ 31077 rc = (nPos + nBuf) < nSize ? rc : 0/*assume EOF*/; 31078 } 31079 if( 0==rc ) rc = xCallback(buf, nBuf); 31080 } 31081 return rc; 31082 } 31083 31084 /* 31085 ** Trivial exportable function for emscripten. It processes zSql as if 31086 ** it were input to the sqlite3 shell and redirects all output to the 31087 ** wasm binding. fiddle_main() must have been called before this 31088 ** is called, or results are undefined. 31089 */ 31090 void fiddle_exec(const char * zSql){ 31091 if(zSql && *zSql){ 31092 if('.'==*zSql) puts(zSql); 31093 shellState.wasm.zInput = zSql; 31094 shellState.wasm.zPos = zSql; 31095 process_input(&shellState); 31096 shellState.wasm.zInput = shellState.wasm.zPos = 0; 31097 } 31098 } 31099 #endif /* SQLITE_SHELL_FIDDLE */ 31100