quickjs-tart

quickjs-based runtime for wallet-core logic
Log | Files | Refs | README | LICENSE

shell.c (1066685B)


      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 #include <ctype.h>
    126 #include <stdarg.h>
    127 
    128 #if !defined(_WIN32) && !defined(WIN32)
    129 # include <signal.h>
    130 # if !defined(__RTP__) && !defined(_WRS_KERNEL) && !defined(SQLITE_WASI)
    131 #  include <pwd.h>
    132 # endif
    133 #endif
    134 #if (!defined(_WIN32) && !defined(WIN32)) || defined(__MINGW32__)
    135 # include <unistd.h>
    136 # include <dirent.h>
    137 # define GETPID getpid
    138 # if defined(__MINGW32__)
    139 #  define DIRENT dirent
    140 #  ifndef S_ISLNK
    141 #   define S_ISLNK(mode) (0)
    142 #  endif
    143 # endif
    144 #else
    145 # define GETPID (int)GetCurrentProcessId
    146 #endif
    147 #include <sys/types.h>
    148 #include <sys/stat.h>
    149 
    150 #if HAVE_READLINE
    151 # include <readline/readline.h>
    152 # include <readline/history.h>
    153 #endif
    154 
    155 #if HAVE_EDITLINE
    156 # include <editline/readline.h>
    157 #endif
    158 
    159 #if HAVE_EDITLINE || HAVE_READLINE
    160 
    161 # define shell_add_history(X) add_history(X)
    162 # define shell_read_history(X) read_history(X)
    163 # define shell_write_history(X) write_history(X)
    164 # define shell_stifle_history(X) stifle_history(X)
    165 # define shell_readline(X) readline(X)
    166 
    167 #elif HAVE_LINENOISE
    168 
    169 # include "linenoise.h"
    170 # define shell_add_history(X) linenoiseHistoryAdd(X)
    171 # define shell_read_history(X) linenoiseHistoryLoad(X)
    172 # define shell_write_history(X) linenoiseHistorySave(X)
    173 # define shell_stifle_history(X) linenoiseHistorySetMaxLen(X)
    174 # define shell_readline(X) linenoise(X)
    175 
    176 #else
    177 
    178 # define shell_read_history(X)
    179 # define shell_write_history(X)
    180 # define shell_stifle_history(X)
    181 
    182 # define SHELL_USE_LOCAL_GETLINE 1
    183 #endif
    184 
    185 #ifndef deliberate_fall_through
    186 /* Quiet some compilers about some of our intentional code. */
    187 # if defined(GCC_VERSION) && GCC_VERSION>=7000000
    188 #  define deliberate_fall_through __attribute__((fallthrough));
    189 # else
    190 #  define deliberate_fall_through
    191 # endif
    192 #endif
    193 
    194 #if defined(_WIN32) || defined(WIN32)
    195 # if SQLITE_OS_WINRT
    196 #  define SQLITE_OMIT_POPEN 1
    197 # else
    198 #  include <io.h>
    199 #  include <fcntl.h>
    200 #  define isatty(h) _isatty(h)
    201 #  ifndef access
    202 #   define access(f,m) _access((f),(m))
    203 #  endif
    204 #  ifndef unlink
    205 #   define unlink _unlink
    206 #  endif
    207 #  ifndef strdup
    208 #   define strdup _strdup
    209 #  endif
    210 #  undef pclose
    211 #  define pclose _pclose
    212 # endif
    213 #else
    214  /* Make sure isatty() has a prototype. */
    215  extern int isatty(int);
    216 
    217 # if !defined(__RTP__) && !defined(_WRS_KERNEL) && !defined(SQLITE_WASI)
    218   /* popen and pclose are not C89 functions and so are
    219   ** sometimes omitted from the <stdio.h> header */
    220    extern FILE *popen(const char*,const char*);
    221    extern int pclose(FILE*);
    222 # else
    223 #  define SQLITE_OMIT_POPEN 1
    224 # endif
    225 #endif
    226 
    227 #if defined(_WIN32_WCE)
    228 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
    229  * thus we always assume that we have a console. That can be
    230  * overridden with the -batch command line option.
    231  */
    232 #define isatty(x) 1
    233 #endif
    234 
    235 /* ctype macros that work with signed characters */
    236 #define IsSpace(X)  isspace((unsigned char)X)
    237 #define IsDigit(X)  isdigit((unsigned char)X)
    238 #define ToLower(X)  (char)tolower((unsigned char)X)
    239 #define IsAlnum(X)  isalnum((unsigned char)X)
    240 #define IsAlpha(X)  isalpha((unsigned char)X)
    241 
    242 #if defined(_WIN32) || defined(WIN32)
    243 #if SQLITE_OS_WINRT
    244 #include <intrin.h>
    245 #endif
    246 #undef WIN32_LEAN_AND_MEAN
    247 #define WIN32_LEAN_AND_MEAN
    248 #include <windows.h>
    249 
    250 /* string conversion routines only needed on Win32 */
    251 extern char *sqlite3_win32_unicode_to_utf8(LPCWSTR);
    252 extern LPWSTR sqlite3_win32_utf8_to_unicode(const char *zText);
    253 #endif
    254 
    255 /************************* Begin ../ext/misc/sqlite3_stdio.h ******************/
    256 /*
    257 ** 2024-09-24
    258 **
    259 ** The author disclaims copyright to this source code.  In place of
    260 ** a legal notice, here is a blessing:
    261 **
    262 **    May you do good and not evil.
    263 **    May you find forgiveness for yourself and forgive others.
    264 **    May you share freely, never taking more than you give.
    265 **
    266 *************************************************************************
    267 **
    268 ** This header file contains definitions of interfaces that provide 
    269 ** cross-platform I/O for UTF-8 content.
    270 **
    271 ** On most platforms, the interfaces definitions in this file are
    272 ** just #defines.  For example sqlite3_fopen() is a macro that resolves
    273 ** to the standard fopen() in the C-library.
    274 **
    275 ** But Windows does not have a standard C-library, at least not one that
    276 ** can handle UTF-8.  So for windows build, the interfaces resolve to new
    277 ** C-language routines contained in the separate sqlite3_stdio.c source file.
    278 **
    279 ** So on all non-Windows platforms, simply #include this header file and
    280 ** use the interfaces defined herein.  Then to run your application on Windows,
    281 ** also link in the accompanying sqlite3_stdio.c source file when compiling
    282 ** to get compatible interfaces.
    283 */
    284 #ifndef _SQLITE3_STDIO_H_
    285 #define _SQLITE3_STDIO_H_ 1
    286 #ifdef _WIN32
    287 /**** Definitions For Windows ****/
    288 #include <stdio.h>
    289 #include <windows.h>
    290 
    291 FILE *sqlite3_fopen(const char *zFilename, const char *zMode);
    292 FILE *sqlite3_popen(const char *zCommand, const char *type);
    293 char *sqlite3_fgets(char *s, int size, FILE *stream);
    294 int sqlite3_fputs(const char *s, FILE *stream);
    295 int sqlite3_fprintf(FILE *stream, const char *format, ...);
    296 void sqlite3_fsetmode(FILE *stream, int mode);
    297 
    298 
    299 #else
    300 /**** Definitions For All Other Platforms ****/
    301 #include <stdio.h>
    302 #define sqlite3_fopen     fopen
    303 #define sqlite3_popen     popen
    304 #define sqlite3_fgets     fgets
    305 #define sqlite3_fputs     fputs
    306 #define sqlite3_fprintf   fprintf
    307 #define sqlite3_fsetmode(F,X)   /*no-op*/
    308 
    309 #endif
    310 #endif /* _SQLITE3_STDIO_H_ */
    311 
    312 /************************* End ../ext/misc/sqlite3_stdio.h ********************/
    313 /************************* Begin ../ext/misc/sqlite3_stdio.c ******************/
    314 /*
    315 ** 2024-09-24
    316 **
    317 ** The author disclaims copyright to this source code.  In place of
    318 ** a legal notice, here is a blessing:
    319 **
    320 **    May you do good and not evil.
    321 **    May you find forgiveness for yourself and forgive others.
    322 **    May you share freely, never taking more than you give.
    323 **
    324 *************************************************************************
    325 **
    326 ** Implementation of standard I/O interfaces for UTF-8 that are missing
    327 ** on Windows.
    328 */
    329 #ifdef _WIN32  /* This file is a no-op on all platforms except Windows */
    330 #ifndef _SQLITE3_STDIO_H_
    331 /* #include "sqlite3_stdio.h" */
    332 #endif
    333 #undef WIN32_LEAN_AND_MEAN
    334 #define WIN32_LEAN_AND_MEAN
    335 #include <windows.h>
    336 #include <stdlib.h>
    337 #include <string.h>
    338 #include <stdio.h>
    339 #include <assert.h>
    340 /* #include "sqlite3.h" */
    341 #include <ctype.h>
    342 #include <stdarg.h>
    343 #include <io.h>
    344 #include <fcntl.h>
    345 
    346 /*
    347 ** If the SQLITE_U8TEXT_ONLY option is defined, then use O_U8TEXT
    348 ** when appropriate on all output.  (Sometimes use O_BINARY when
    349 ** rendering ASCII text in cases where NL-to-CRLF expansion would
    350 ** not be correct.)
    351 **
    352 ** If the SQLITE_U8TEXT_STDIO option is defined, then use O_U8TEXT
    353 ** when appropriate when writing to stdout or stderr.  Use O_BINARY
    354 ** or O_TEXT (depending on things like the .mode and the .crlf setting
    355 ** in the CLI, or other context clues in other applications) for all
    356 ** other output channels.
    357 **
    358 ** The default behavior, if neither of the above is defined is to
    359 ** use O_U8TEXT when writing to the Windows console (or anything
    360 ** else for which _isatty() returns true) and to use O_BINARY or O_TEXT
    361 ** for all other output channels.
    362 **
    363 ** The SQLITE_USE_W32_FOR_CONSOLE_IO macro is also available.  If
    364 ** defined, it forces the use of Win32 APIs for all console I/O, both
    365 ** input and output.  This is necessary for some non-Microsoft run-times
    366 ** that implement stdio differently from Microsoft/Visual-Studio.
    367 */
    368 #if defined(SQLITE_U8TEXT_ONLY)
    369 # define UseWtextForOutput(fd) 1
    370 # define UseWtextForInput(fd)  1
    371 # define IsConsole(fd)         _isatty(_fileno(fd))
    372 #elif defined(SQLITE_U8TEXT_STDIO)
    373 # define UseWtextForOutput(fd) ((fd)==stdout || (fd)==stderr)
    374 # define UseWtextForInput(fd)  ((fd)==stdin)
    375 # define IsConsole(fd)         _isatty(_fileno(fd))
    376 #else
    377 # define UseWtextForOutput(fd) _isatty(_fileno(fd))
    378 # define UseWtextForInput(fd)  _isatty(_fileno(fd))
    379 # define IsConsole(fd)         1
    380 #endif
    381 
    382 /*
    383 ** Global variables determine if simulated O_BINARY mode is to be
    384 ** used for stdout or other, respectively.  Simulated O_BINARY mode
    385 ** means the mode is usually O_BINARY, but switches to O_U8TEXT for
    386 ** unicode characters U+0080 or greater (any character that has a
    387 ** multi-byte representation in UTF-8).  This is the only way we
    388 ** have found to render Unicode characters on a Windows console while
    389 ** at the same time avoiding undesirable \n to \r\n translation.
    390 */
    391 static int simBinaryStdout = 0;
    392 static int simBinaryOther = 0;
    393 
    394 
    395 /*
    396 ** Determine if simulated binary mode should be used for output to fd
    397 */
    398 static int UseBinaryWText(FILE *fd){
    399   if( fd==stdout || fd==stderr ){
    400     return simBinaryStdout;
    401   }else{
    402     return simBinaryOther;
    403   }
    404 }
    405 
    406 
    407 /*
    408 ** Work-alike for the fopen() routine from the standard C library.
    409 */
    410 FILE *sqlite3_fopen(const char *zFilename, const char *zMode){
    411   FILE *fp = 0;
    412   wchar_t *b1, *b2;
    413   int sz1, sz2;
    414 
    415   sz1 = (int)strlen(zFilename);
    416   sz2 = (int)strlen(zMode);
    417   b1 = sqlite3_malloc( (sz1+1)*sizeof(b1[0]) );
    418   b2 = sqlite3_malloc( (sz2+1)*sizeof(b1[0]) );
    419   if( b1 && b2 ){
    420     sz1 = MultiByteToWideChar(CP_UTF8, 0, zFilename, sz1, b1, sz1);
    421     b1[sz1] = 0;
    422     sz2 = MultiByteToWideChar(CP_UTF8, 0, zMode, sz2, b2, sz2);
    423     b2[sz2] = 0;
    424     fp = _wfopen(b1, b2);
    425   }
    426   sqlite3_free(b1);
    427   sqlite3_free(b2);
    428   simBinaryOther = 0;
    429   return fp;
    430 }
    431 
    432 
    433 /*
    434 ** Work-alike for the popen() routine from the standard C library.
    435 */
    436 FILE *sqlite3_popen(const char *zCommand, const char *zMode){
    437   FILE *fp = 0;
    438   wchar_t *b1, *b2;
    439   int sz1, sz2;
    440 
    441   sz1 = (int)strlen(zCommand);
    442   sz2 = (int)strlen(zMode);
    443   b1 = sqlite3_malloc( (sz1+1)*sizeof(b1[0]) );
    444   b2 = sqlite3_malloc( (sz2+1)*sizeof(b1[0]) );
    445   if( b1 && b2 ){
    446     sz1 = MultiByteToWideChar(CP_UTF8, 0, zCommand, sz1, b1, sz1);
    447     b1[sz1] = 0;
    448     sz2 = MultiByteToWideChar(CP_UTF8, 0, zMode, sz2, b2, sz2);
    449     b2[sz2] = 0;
    450     fp = _wpopen(b1, b2);
    451   }
    452   sqlite3_free(b1);
    453   sqlite3_free(b2);
    454   return fp;
    455 }
    456 
    457 /*
    458 ** Work-alike for fgets() from the standard C library.
    459 */
    460 char *sqlite3_fgets(char *buf, int sz, FILE *in){
    461   if( UseWtextForInput(in) ){
    462     /* When reading from the command-prompt in Windows, it is necessary
    463     ** to use _O_WTEXT input mode to read UTF-16 characters, then translate
    464     ** that into UTF-8.  Otherwise, non-ASCII characters all get translated
    465     ** into '?'.
    466     */
    467     wchar_t *b1 = sqlite3_malloc( sz*sizeof(wchar_t) );
    468     if( b1==0 ) return 0;
    469 #ifdef SQLITE_USE_W32_FOR_CONSOLE_IO
    470     DWORD nRead = 0;
    471     if( IsConsole(in)
    472      && ReadConsoleW(GetStdHandle(STD_INPUT_HANDLE), b1, sz-1, &nRead, 0)
    473     ){
    474       b1[nRead] = 0;
    475     }else
    476 #endif
    477     {
    478       _setmode(_fileno(in), IsConsole(in) ? _O_WTEXT : _O_U8TEXT);
    479       if( fgetws(b1, sz/4, in)==0 ){
    480         sqlite3_free(b1);
    481         return 0;
    482       }
    483     }
    484     WideCharToMultiByte(CP_UTF8, 0, b1, -1, buf, sz, 0, 0);
    485     sqlite3_free(b1);
    486     return buf;
    487   }else{
    488     /* Reading from a file or other input source, just read bytes without
    489     ** any translation. */
    490     return fgets(buf, sz, in);
    491   }
    492 }
    493 
    494 /*
    495 ** Send ASCII text as O_BINARY.  But for Unicode characters U+0080 and
    496 ** greater, switch to O_U8TEXT.
    497 */
    498 static void piecemealOutput(wchar_t *b1, int sz, FILE *out){
    499   int i;
    500   wchar_t c;
    501   while( sz>0 ){
    502     for(i=0; i<sz && b1[i]>=0x80; i++){}
    503     if( i>0 ){
    504       c = b1[i];
    505       b1[i] = 0;
    506       fflush(out);
    507       _setmode(_fileno(out), _O_U8TEXT);
    508       fputws(b1, out);
    509       fflush(out);
    510       b1 += i;
    511       b1[0] = c;
    512       sz -= i;
    513     }else{
    514       fflush(out);
    515       _setmode(_fileno(out), _O_TEXT);
    516       _setmode(_fileno(out), _O_BINARY);
    517       fwrite(&b1[0], 1, 1, out);
    518       for(i=1; i<sz && b1[i]<0x80; i++){
    519         fwrite(&b1[i], 1, 1, out);
    520       }
    521       fflush(out);
    522       _setmode(_fileno(out), _O_U8TEXT);
    523       b1 += i;
    524       sz -= i;
    525     }
    526   }
    527 }
    528 
    529 /*
    530 ** Work-alike for fputs() from the standard C library.
    531 */
    532 int sqlite3_fputs(const char *z, FILE *out){
    533   if( !UseWtextForOutput(out) ){
    534     /* Writing to a file or other destination, just write bytes without
    535     ** any translation. */
    536     return fputs(z, out);
    537   }else{
    538     /* One must use UTF16 in order to get unicode support when writing
    539     ** to the console on Windows. 
    540     */
    541     int sz = (int)strlen(z);
    542     wchar_t *b1 = sqlite3_malloc( (sz+1)*sizeof(wchar_t) );
    543     if( b1==0 ) return 0;
    544     sz = MultiByteToWideChar(CP_UTF8, 0, z, sz, b1, sz);
    545     b1[sz] = 0;
    546 
    547 #ifdef SQLITE_USE_W32_FOR_CONSOLE_IO
    548     DWORD nWr = 0;
    549     if( IsConsole(out)
    550       && WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE),b1,sz,&nWr,0)
    551     ){
    552       /* If writing to the console, then the WriteConsoleW() is all we
    553       ** need to do. */
    554     }else
    555 #endif
    556     {
    557       /* As long as SQLITE_USE_W32_FOR_CONSOLE_IO is not defined, or for
    558       ** non-console I/O even if that macro is defined, write using the
    559       ** standard library. */
    560       _setmode(_fileno(out), _O_U8TEXT);
    561       if( UseBinaryWText(out) ){
    562         piecemealOutput(b1, sz, out);
    563       }else{
    564         fputws(b1, out);
    565       }
    566     }
    567     sqlite3_free(b1);
    568     return 0;
    569   }
    570 }
    571 
    572 
    573 /*
    574 ** Work-alike for fprintf() from the standard C library.
    575 */
    576 int sqlite3_fprintf(FILE *out, const char *zFormat, ...){
    577   int rc;
    578   if( UseWtextForOutput(out) ){
    579     /* When writing to the command-prompt in Windows, it is necessary
    580     ** to use _O_WTEXT input mode and write UTF-16 characters.
    581     */
    582     char *z;
    583     va_list ap;
    584 
    585     va_start(ap, zFormat);
    586     z = sqlite3_vmprintf(zFormat, ap);
    587     va_end(ap);
    588     sqlite3_fputs(z, out);
    589     rc = (int)strlen(z);
    590     sqlite3_free(z);
    591   }else{
    592     /* Writing to a file or other destination, just write bytes without
    593     ** any translation. */
    594     va_list ap;
    595     va_start(ap, zFormat);
    596     rc = vfprintf(out, zFormat, ap);
    597     va_end(ap);
    598   }
    599   return rc;
    600 }
    601 
    602 /*
    603 ** Set the mode for an output stream.  mode argument is typically _O_BINARY or
    604 ** _O_TEXT.
    605 */
    606 void sqlite3_fsetmode(FILE *fp, int mode){
    607   if( !UseWtextForOutput(fp) ){
    608     fflush(fp);
    609     _setmode(_fileno(fp), mode);
    610   }else if( fp==stdout || fp==stderr ){
    611     simBinaryStdout = (mode==_O_BINARY);
    612   }else{
    613     simBinaryOther = (mode==_O_BINARY);
    614   }
    615 }
    616 
    617 #endif /* defined(_WIN32) */
    618 
    619 /************************* End ../ext/misc/sqlite3_stdio.c ********************/
    620 
    621 /* Use console I/O package as a direct INCLUDE. */
    622 #define SQLITE_INTERNAL_LINKAGE static
    623 
    624 #ifdef SQLITE_SHELL_FIDDLE
    625 /* Deselect most features from the console I/O package for Fiddle. */
    626 # define SQLITE_CIO_NO_REDIRECT
    627 # define SQLITE_CIO_NO_CLASSIFY
    628 # define SQLITE_CIO_NO_TRANSLATE
    629 # define SQLITE_CIO_NO_SETMODE
    630 # define SQLITE_CIO_NO_FLUSH
    631 #endif
    632 
    633 #define eputz(z) sqlite3_fputs(z,stderr)
    634 #define sputz(fp,z) sqlite3_fputs(z,fp)
    635 
    636 /* True if the timer is enabled */
    637 static int enableTimer = 0;
    638 
    639 /* A version of strcmp() that works with NULL values */
    640 static int cli_strcmp(const char *a, const char *b){
    641   if( a==0 ) a = "";
    642   if( b==0 ) b = "";
    643   return strcmp(a,b);
    644 }
    645 static int cli_strncmp(const char *a, const char *b, size_t n){
    646   if( a==0 ) a = "";
    647   if( b==0 ) b = "";
    648   return strncmp(a,b,n);
    649 }
    650 
    651 /* Return the current wall-clock time */
    652 static sqlite3_int64 timeOfDay(void){
    653   static sqlite3_vfs *clockVfs = 0;
    654   sqlite3_int64 t;
    655   if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
    656   if( clockVfs==0 ) return 0;  /* Never actually happens */
    657   if( clockVfs->iVersion>=2 && clockVfs->xCurrentTimeInt64!=0 ){
    658     clockVfs->xCurrentTimeInt64(clockVfs, &t);
    659   }else{
    660     double r;
    661     clockVfs->xCurrentTime(clockVfs, &r);
    662     t = (sqlite3_int64)(r*86400000.0);
    663   }
    664   return t;
    665 }
    666 
    667 #if !defined(_WIN32) && !defined(WIN32) && !defined(__minux)
    668 #include <sys/time.h>
    669 #include <sys/resource.h>
    670 
    671 /* VxWorks does not support getrusage() as far as we can determine */
    672 #if defined(_WRS_KERNEL) || defined(__RTP__)
    673 struct rusage {
    674   struct timeval ru_utime; /* user CPU time used */
    675   struct timeval ru_stime; /* system CPU time used */
    676 };
    677 #define getrusage(A,B) memset(B,0,sizeof(*B))
    678 #endif
    679 
    680 
    681 /* Saved resource information for the beginning of an operation */
    682 static struct rusage sBegin;  /* CPU time at start */
    683 static sqlite3_int64 iBegin;  /* Wall-clock time at start */
    684 
    685 /*
    686 ** Begin timing an operation
    687 */
    688 static void beginTimer(void){
    689   if( enableTimer ){
    690     getrusage(RUSAGE_SELF, &sBegin);
    691     iBegin = timeOfDay();
    692   }
    693 }
    694 
    695 /* Return the difference of two time_structs in seconds */
    696 static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
    697   return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
    698          (double)(pEnd->tv_sec - pStart->tv_sec);
    699 }
    700 
    701 /*
    702 ** Print the timing results.
    703 */
    704 static void endTimer(FILE *out){
    705   if( enableTimer ){
    706     sqlite3_int64 iEnd = timeOfDay();
    707     struct rusage sEnd;
    708     getrusage(RUSAGE_SELF, &sEnd);
    709     sqlite3_fprintf(out, "Run Time: real %.3f user %f sys %f\n",
    710           (iEnd - iBegin)*0.001,
    711           timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
    712           timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
    713   }
    714 }
    715 
    716 #define BEGIN_TIMER beginTimer()
    717 #define END_TIMER(X) endTimer(X)
    718 #define HAS_TIMER 1
    719 
    720 #elif (defined(_WIN32) || defined(WIN32))
    721 
    722 /* Saved resource information for the beginning of an operation */
    723 static HANDLE hProcess;
    724 static FILETIME ftKernelBegin;
    725 static FILETIME ftUserBegin;
    726 static sqlite3_int64 ftWallBegin;
    727 typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME,
    728                                     LPFILETIME, LPFILETIME);
    729 static GETPROCTIMES getProcessTimesAddr = NULL;
    730 
    731 /*
    732 ** Check to see if we have timer support.  Return 1 if necessary
    733 ** support found (or found previously).
    734 */
    735 static int hasTimer(void){
    736   if( getProcessTimesAddr ){
    737     return 1;
    738   } else {
    739 #if !SQLITE_OS_WINRT
    740     /* GetProcessTimes() isn't supported in WIN95 and some other Windows
    741     ** versions. See if the version we are running on has it, and if it
    742     ** does, save off a pointer to it and the current process handle.
    743     */
    744     hProcess = GetCurrentProcess();
    745     if( hProcess ){
    746       HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
    747       if( NULL != hinstLib ){
    748         getProcessTimesAddr =
    749             (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
    750         if( NULL != getProcessTimesAddr ){
    751           return 1;
    752         }
    753         FreeLibrary(hinstLib);
    754       }
    755     }
    756 #endif
    757   }
    758   return 0;
    759 }
    760 
    761 /*
    762 ** Begin timing an operation
    763 */
    764 static void beginTimer(void){
    765   if( enableTimer && getProcessTimesAddr ){
    766     FILETIME ftCreation, ftExit;
    767     getProcessTimesAddr(hProcess,&ftCreation,&ftExit,
    768                         &ftKernelBegin,&ftUserBegin);
    769     ftWallBegin = timeOfDay();
    770   }
    771 }
    772 
    773 /* Return the difference of two FILETIME structs in seconds */
    774 static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
    775   sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
    776   sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
    777   return (double) ((i64End - i64Start) / 10000000.0);
    778 }
    779 
    780 /*
    781 ** Print the timing results.
    782 */
    783 static void endTimer(FILE *out){
    784   if( enableTimer && getProcessTimesAddr){
    785     FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
    786     sqlite3_int64 ftWallEnd = timeOfDay();
    787     getProcessTimesAddr(hProcess,&ftCreation,&ftExit,&ftKernelEnd,&ftUserEnd);
    788     sqlite3_fprintf(out, "Run Time: real %.3f user %f sys %f\n",
    789           (ftWallEnd - ftWallBegin)*0.001,
    790           timeDiff(&ftUserBegin, &ftUserEnd),
    791           timeDiff(&ftKernelBegin, &ftKernelEnd));
    792   }
    793 }
    794 
    795 #define BEGIN_TIMER beginTimer()
    796 #define END_TIMER(X) endTimer(X)
    797 #define HAS_TIMER hasTimer()
    798 
    799 #else
    800 #define BEGIN_TIMER
    801 #define END_TIMER(X)  /*no-op*/
    802 #define HAS_TIMER 0
    803 #endif
    804 
    805 /*
    806 ** Used to prevent warnings about unused parameters
    807 */
    808 #define UNUSED_PARAMETER(x) (void)(x)
    809 
    810 /*
    811 ** Number of elements in an array
    812 */
    813 #define ArraySize(X)  (int)(sizeof(X)/sizeof(X[0]))
    814 
    815 /*
    816 ** If the following flag is set, then command execution stops
    817 ** at an error if we are not interactive.
    818 */
    819 static int bail_on_error = 0;
    820 
    821 /*
    822 ** Treat stdin as an interactive input if the following variable
    823 ** is true.  Otherwise, assume stdin is connected to a file or pipe.
    824 */
    825 static int stdin_is_interactive = 1;
    826 
    827 /*
    828 ** On Windows systems we need to know if standard output is a console
    829 ** in order to show that UTF-16 translation is done in the sign-on
    830 ** banner. The following variable is true if it is the console.
    831 */
    832 static int stdout_is_console = 1;
    833 
    834 /*
    835 ** The following is the open SQLite database.  We make a pointer
    836 ** to this database a static variable so that it can be accessed
    837 ** by the SIGINT handler to interrupt database processing.
    838 */
    839 static sqlite3 *globalDb = 0;
    840 
    841 /*
    842 ** True if an interrupt (Control-C) has been received.
    843 */
    844 static volatile int seenInterrupt = 0;
    845 
    846 /*
    847 ** This is the name of our program. It is set in main(), used
    848 ** in a number of other places, mostly for error messages.
    849 */
    850 static char *Argv0;
    851 
    852 /*
    853 ** Prompt strings. Initialized in main. Settable with
    854 **   .prompt main continue
    855 */
    856 #define PROMPT_LEN_MAX 128
    857 /* First line prompt.   default: "sqlite> " */
    858 static char mainPrompt[PROMPT_LEN_MAX];
    859 /* Continuation prompt. default: "   ...> " */
    860 static char continuePrompt[PROMPT_LEN_MAX];
    861 
    862 /* This is variant of the standard-library strncpy() routine with the
    863 ** one change that the destination string is always zero-terminated, even
    864 ** if there is no zero-terminator in the first n-1 characters of the source
    865 ** string.
    866 */
    867 static char *shell_strncpy(char *dest, const char *src, size_t n){
    868   size_t i;
    869   for(i=0; i<n-1 && src[i]!=0; i++) dest[i] = src[i];
    870   dest[i] = 0;
    871   return dest;
    872 }
    873 
    874 /*
    875 ** strcpy() workalike to squelch an unwarranted link-time warning
    876 ** from OpenBSD.
    877 */
    878 static void shell_strcpy(char *dest, const char *src){
    879   while( (*(dest++) = *(src++))!=0 ){}
    880 }
    881 
    882 /*
    883 ** Optionally disable dynamic continuation prompt.
    884 ** Unless disabled, the continuation prompt shows open SQL lexemes if any,
    885 ** or open parentheses level if non-zero, or continuation prompt as set.
    886 ** This facility interacts with the scanner and process_input() where the
    887 ** below 5 macros are used.
    888 */
    889 #ifdef SQLITE_OMIT_DYNAPROMPT
    890 # define CONTINUATION_PROMPT continuePrompt
    891 # define CONTINUE_PROMPT_RESET
    892 # define CONTINUE_PROMPT_AWAITS(p,s)
    893 # define CONTINUE_PROMPT_AWAITC(p,c)
    894 # define CONTINUE_PAREN_INCR(p,n)
    895 # define CONTINUE_PROMPT_PSTATE 0
    896 typedef void *t_NoDynaPrompt;
    897 # define SCAN_TRACKER_REFTYPE t_NoDynaPrompt
    898 #else
    899 # define CONTINUATION_PROMPT dynamicContinuePrompt()
    900 # define CONTINUE_PROMPT_RESET \
    901   do {setLexemeOpen(&dynPrompt,0,0); trackParenLevel(&dynPrompt,0);} while(0)
    902 # define CONTINUE_PROMPT_AWAITS(p,s) \
    903   if(p && stdin_is_interactive) setLexemeOpen(p, s, 0)
    904 # define CONTINUE_PROMPT_AWAITC(p,c) \
    905   if(p && stdin_is_interactive) setLexemeOpen(p, 0, c)
    906 # define CONTINUE_PAREN_INCR(p,n) \
    907   if(p && stdin_is_interactive) (trackParenLevel(p,n))
    908 # define CONTINUE_PROMPT_PSTATE (&dynPrompt)
    909 typedef struct DynaPrompt *t_DynaPromptRef;
    910 # define SCAN_TRACKER_REFTYPE t_DynaPromptRef
    911 
    912 static struct DynaPrompt {
    913   char dynamicPrompt[PROMPT_LEN_MAX];
    914   char acAwait[2];
    915   int inParenLevel;
    916   char *zScannerAwaits;
    917 } dynPrompt = { {0}, {0}, 0, 0 };
    918 
    919 /* Record parenthesis nesting level change, or force level to 0. */
    920 static void trackParenLevel(struct DynaPrompt *p, int ni){
    921   p->inParenLevel += ni;
    922   if( ni==0 ) p->inParenLevel = 0;
    923   p->zScannerAwaits = 0;
    924 }
    925 
    926 /* Record that a lexeme is opened, or closed with args==0. */
    927 static void setLexemeOpen(struct DynaPrompt *p, char *s, char c){
    928   if( s!=0 || c==0 ){
    929     p->zScannerAwaits = s;
    930     p->acAwait[0] = 0;
    931   }else{
    932     p->acAwait[0] = c;
    933     p->zScannerAwaits = p->acAwait;
    934   }
    935 }
    936 
    937 /* Upon demand, derive the continuation prompt to display. */
    938 static char *dynamicContinuePrompt(void){
    939   if( continuePrompt[0]==0
    940       || (dynPrompt.zScannerAwaits==0 && dynPrompt.inParenLevel == 0) ){
    941     return continuePrompt;
    942   }else{
    943     if( dynPrompt.zScannerAwaits ){
    944       size_t ncp = strlen(continuePrompt);
    945       size_t ndp = strlen(dynPrompt.zScannerAwaits);
    946       if( ndp > ncp-3 ) return continuePrompt;
    947       shell_strcpy(dynPrompt.dynamicPrompt, dynPrompt.zScannerAwaits);
    948       while( ndp<3 ) dynPrompt.dynamicPrompt[ndp++] = ' ';
    949       shell_strncpy(dynPrompt.dynamicPrompt+3, continuePrompt+3,
    950               PROMPT_LEN_MAX-4);
    951     }else{
    952       if( dynPrompt.inParenLevel>9 ){
    953         shell_strncpy(dynPrompt.dynamicPrompt, "(..", 4);
    954       }else if( dynPrompt.inParenLevel<0 ){
    955         shell_strncpy(dynPrompt.dynamicPrompt, ")x!", 4);
    956       }else{
    957         shell_strncpy(dynPrompt.dynamicPrompt, "(x.", 4);
    958         dynPrompt.dynamicPrompt[2] = (char)('0'+dynPrompt.inParenLevel);
    959       }
    960       shell_strncpy(dynPrompt.dynamicPrompt+3, continuePrompt+3,
    961                     PROMPT_LEN_MAX-4);
    962     }
    963   }
    964   return dynPrompt.dynamicPrompt;
    965 }
    966 #endif /* !defined(SQLITE_OMIT_DYNAPROMPT) */
    967 
    968 /* Indicate out-of-memory and exit. */
    969 static void shell_out_of_memory(void){
    970   eputz("Error: out of memory\n");
    971   exit(1);
    972 }
    973 
    974 /* Check a pointer to see if it is NULL.  If it is NULL, exit with an
    975 ** out-of-memory error.
    976 */
    977 static void shell_check_oom(const void *p){
    978   if( p==0 ) shell_out_of_memory();
    979 }
    980 
    981 /*
    982 ** Write I/O traces to the following stream.
    983 */
    984 #ifdef SQLITE_ENABLE_IOTRACE
    985 static FILE *iotrace = 0;
    986 #endif
    987 
    988 /*
    989 ** This routine works like printf in that its first argument is a
    990 ** format string and subsequent arguments are values to be substituted
    991 ** in place of % fields.  The result of formatting this string
    992 ** is written to iotrace.
    993 */
    994 #ifdef SQLITE_ENABLE_IOTRACE
    995 static void SQLITE_CDECL iotracePrintf(const char *zFormat, ...){
    996   va_list ap;
    997   char *z;
    998   if( iotrace==0 ) return;
    999   va_start(ap, zFormat);
   1000   z = sqlite3_vmprintf(zFormat, ap);
   1001   va_end(ap);
   1002   sqlite3_fprintf(iotrace, "%s", z);
   1003   sqlite3_free(z);
   1004 }
   1005 #endif
   1006 
   1007 /* Lookup table to estimate the number of columns consumed by a Unicode
   1008 ** character.
   1009 */
   1010 static const struct {
   1011   unsigned char w;    /* Width of the character in columns */
   1012   int iFirst;         /* First character in a span having this width */
   1013 } aUWidth[] = {
   1014    /* {1, 0x00000}, */
   1015   {0, 0x00300},  {1, 0x00370},  {0, 0x00483},  {1, 0x00487},  {0, 0x00488},
   1016   {1, 0x0048a},  {0, 0x00591},  {1, 0x005be},  {0, 0x005bf},  {1, 0x005c0},
   1017   {0, 0x005c1},  {1, 0x005c3},  {0, 0x005c4},  {1, 0x005c6},  {0, 0x005c7},
   1018   {1, 0x005c8},  {0, 0x00600},  {1, 0x00604},  {0, 0x00610},  {1, 0x00616},
   1019   {0, 0x0064b},  {1, 0x0065f},  {0, 0x00670},  {1, 0x00671},  {0, 0x006d6},
   1020   {1, 0x006e5},  {0, 0x006e7},  {1, 0x006e9},  {0, 0x006ea},  {1, 0x006ee},
   1021   {0, 0x0070f},  {1, 0x00710},  {0, 0x00711},  {1, 0x00712},  {0, 0x00730},
   1022   {1, 0x0074b},  {0, 0x007a6},  {1, 0x007b1},  {0, 0x007eb},  {1, 0x007f4},
   1023   {0, 0x00901},  {1, 0x00903},  {0, 0x0093c},  {1, 0x0093d},  {0, 0x00941},
   1024   {1, 0x00949},  {0, 0x0094d},  {1, 0x0094e},  {0, 0x00951},  {1, 0x00955},
   1025   {0, 0x00962},  {1, 0x00964},  {0, 0x00981},  {1, 0x00982},  {0, 0x009bc},
   1026   {1, 0x009bd},  {0, 0x009c1},  {1, 0x009c5},  {0, 0x009cd},  {1, 0x009ce},
   1027   {0, 0x009e2},  {1, 0x009e4},  {0, 0x00a01},  {1, 0x00a03},  {0, 0x00a3c},
   1028   {1, 0x00a3d},  {0, 0x00a41},  {1, 0x00a43},  {0, 0x00a47},  {1, 0x00a49},
   1029   {0, 0x00a4b},  {1, 0x00a4e},  {0, 0x00a70},  {1, 0x00a72},  {0, 0x00a81},
   1030   {1, 0x00a83},  {0, 0x00abc},  {1, 0x00abd},  {0, 0x00ac1},  {1, 0x00ac6},
   1031   {0, 0x00ac7},  {1, 0x00ac9},  {0, 0x00acd},  {1, 0x00ace},  {0, 0x00ae2},
   1032   {1, 0x00ae4},  {0, 0x00b01},  {1, 0x00b02},  {0, 0x00b3c},  {1, 0x00b3d},
   1033   {0, 0x00b3f},  {1, 0x00b40},  {0, 0x00b41},  {1, 0x00b44},  {0, 0x00b4d},
   1034   {1, 0x00b4e},  {0, 0x00b56},  {1, 0x00b57},  {0, 0x00b82},  {1, 0x00b83},
   1035   {0, 0x00bc0},  {1, 0x00bc1},  {0, 0x00bcd},  {1, 0x00bce},  {0, 0x00c3e},
   1036   {1, 0x00c41},  {0, 0x00c46},  {1, 0x00c49},  {0, 0x00c4a},  {1, 0x00c4e},
   1037   {0, 0x00c55},  {1, 0x00c57},  {0, 0x00cbc},  {1, 0x00cbd},  {0, 0x00cbf},
   1038   {1, 0x00cc0},  {0, 0x00cc6},  {1, 0x00cc7},  {0, 0x00ccc},  {1, 0x00cce},
   1039   {0, 0x00ce2},  {1, 0x00ce4},  {0, 0x00d41},  {1, 0x00d44},  {0, 0x00d4d},
   1040   {1, 0x00d4e},  {0, 0x00dca},  {1, 0x00dcb},  {0, 0x00dd2},  {1, 0x00dd5},
   1041   {0, 0x00dd6},  {1, 0x00dd7},  {0, 0x00e31},  {1, 0x00e32},  {0, 0x00e34},
   1042   {1, 0x00e3b},  {0, 0x00e47},  {1, 0x00e4f},  {0, 0x00eb1},  {1, 0x00eb2},
   1043   {0, 0x00eb4},  {1, 0x00eba},  {0, 0x00ebb},  {1, 0x00ebd},  {0, 0x00ec8},
   1044   {1, 0x00ece},  {0, 0x00f18},  {1, 0x00f1a},  {0, 0x00f35},  {1, 0x00f36},
   1045   {0, 0x00f37},  {1, 0x00f38},  {0, 0x00f39},  {1, 0x00f3a},  {0, 0x00f71},
   1046   {1, 0x00f7f},  {0, 0x00f80},  {1, 0x00f85},  {0, 0x00f86},  {1, 0x00f88},
   1047   {0, 0x00f90},  {1, 0x00f98},  {0, 0x00f99},  {1, 0x00fbd},  {0, 0x00fc6},
   1048   {1, 0x00fc7},  {0, 0x0102d},  {1, 0x01031},  {0, 0x01032},  {1, 0x01033},
   1049   {0, 0x01036},  {1, 0x01038},  {0, 0x01039},  {1, 0x0103a},  {0, 0x01058},
   1050   {1, 0x0105a},  {2, 0x01100},  {0, 0x01160},  {1, 0x01200},  {0, 0x0135f},
   1051   {1, 0x01360},  {0, 0x01712},  {1, 0x01715},  {0, 0x01732},  {1, 0x01735},
   1052   {0, 0x01752},  {1, 0x01754},  {0, 0x01772},  {1, 0x01774},  {0, 0x017b4},
   1053   {1, 0x017b6},  {0, 0x017b7},  {1, 0x017be},  {0, 0x017c6},  {1, 0x017c7},
   1054   {0, 0x017c9},  {1, 0x017d4},  {0, 0x017dd},  {1, 0x017de},  {0, 0x0180b},
   1055   {1, 0x0180e},  {0, 0x018a9},  {1, 0x018aa},  {0, 0x01920},  {1, 0x01923},
   1056   {0, 0x01927},  {1, 0x01929},  {0, 0x01932},  {1, 0x01933},  {0, 0x01939},
   1057   {1, 0x0193c},  {0, 0x01a17},  {1, 0x01a19},  {0, 0x01b00},  {1, 0x01b04},
   1058   {0, 0x01b34},  {1, 0x01b35},  {0, 0x01b36},  {1, 0x01b3b},  {0, 0x01b3c},
   1059   {1, 0x01b3d},  {0, 0x01b42},  {1, 0x01b43},  {0, 0x01b6b},  {1, 0x01b74},
   1060   {0, 0x01dc0},  {1, 0x01dcb},  {0, 0x01dfe},  {1, 0x01e00},  {0, 0x0200b},
   1061   {1, 0x02010},  {0, 0x0202a},  {1, 0x0202f},  {0, 0x02060},  {1, 0x02064},
   1062   {0, 0x0206a},  {1, 0x02070},  {0, 0x020d0},  {1, 0x020f0},  {2, 0x02329},
   1063   {1, 0x0232b},  {2, 0x02e80},  {0, 0x0302a},  {2, 0x03030},  {1, 0x0303f},
   1064   {2, 0x03040},  {0, 0x03099},  {2, 0x0309b},  {1, 0x0a4d0},  {0, 0x0a806},
   1065   {1, 0x0a807},  {0, 0x0a80b},  {1, 0x0a80c},  {0, 0x0a825},  {1, 0x0a827},
   1066   {2, 0x0ac00},  {1, 0x0d7a4},  {2, 0x0f900},  {1, 0x0fb00},  {0, 0x0fb1e},
   1067   {1, 0x0fb1f},  {0, 0x0fe00},  {2, 0x0fe10},  {1, 0x0fe1a},  {0, 0x0fe20},
   1068   {1, 0x0fe24},  {2, 0x0fe30},  {1, 0x0fe70},  {0, 0x0feff},  {2, 0x0ff00},
   1069   {1, 0x0ff61},  {2, 0x0ffe0},  {1, 0x0ffe7},  {0, 0x0fff9},  {1, 0x0fffc},
   1070   {0, 0x10a01},  {1, 0x10a04},  {0, 0x10a05},  {1, 0x10a07},  {0, 0x10a0c},
   1071   {1, 0x10a10},  {0, 0x10a38},  {1, 0x10a3b},  {0, 0x10a3f},  {1, 0x10a40},
   1072   {0, 0x1d167},  {1, 0x1d16a},  {0, 0x1d173},  {1, 0x1d183},  {0, 0x1d185},
   1073   {1, 0x1d18c},  {0, 0x1d1aa},  {1, 0x1d1ae},  {0, 0x1d242},  {1, 0x1d245},
   1074   {2, 0x20000},  {1, 0x2fffe},  {2, 0x30000},  {1, 0x3fffe},  {0, 0xe0001},
   1075   {1, 0xe0002},  {0, 0xe0020},  {1, 0xe0080},  {0, 0xe0100},  {1, 0xe01f0}
   1076 };
   1077 
   1078 /*
   1079 ** Return an estimate of the width, in columns, for the single Unicode
   1080 ** character c.  For normal characters, the answer is always 1.  But the
   1081 ** estimate might be 0 or 2 for zero-width and double-width characters.
   1082 **
   1083 ** Different display devices display unicode using different widths.  So
   1084 ** it is impossible to know that true display width with 100% accuracy.
   1085 ** Inaccuracies in the width estimates might cause columns to be misaligned.
   1086 ** Unfortunately, there is nothing we can do about that.
   1087 */
   1088 int cli_wcwidth(int c){
   1089   int iFirst, iLast;
   1090 
   1091   /* Fast path for common characters */
   1092   if( c<=0x300 ) return 1;
   1093 
   1094   /* The general case */
   1095   iFirst = 0;
   1096   iLast = sizeof(aUWidth)/sizeof(aUWidth[0]) - 1;
   1097   while( iFirst<iLast-1 ){
   1098     int iMid = (iFirst+iLast)/2;
   1099     int cMid = aUWidth[iMid].iFirst;
   1100     if( cMid < c ){
   1101       iFirst = iMid;
   1102     }else if( cMid > c ){
   1103       iLast = iMid - 1;
   1104     }else{
   1105       return aUWidth[iMid].w;
   1106     }
   1107   }
   1108   if( aUWidth[iLast].iFirst > c ) return aUWidth[iFirst].w;
   1109   return aUWidth[iLast].w;
   1110 }
   1111 
   1112 /*
   1113 ** Compute the value and length of a multi-byte UTF-8 character that
   1114 ** begins at z[0].   Return the length.  Write the Unicode value into *pU.
   1115 **
   1116 ** This routine only works for *multi-byte* UTF-8 characters.
   1117 */
   1118 static int decodeUtf8(const unsigned char *z, int *pU){
   1119   if( (z[0] & 0xe0)==0xc0 && (z[1] & 0xc0)==0x80 ){
   1120     *pU = ((z[0] & 0x1f)<<6) | (z[1] & 0x3f);
   1121     return 2;
   1122   }
   1123   if( (z[0] & 0xf0)==0xe0 && (z[1] & 0xc0)==0x80 && (z[2] & 0xc0)==0x80 ){
   1124     *pU = ((z[0] & 0x0f)<<12) | ((z[1] & 0x3f)<<6) | (z[2] & 0x3f);
   1125     return 3;
   1126   }
   1127   if( (z[0] & 0xf8)==0xf0 && (z[1] & 0xc0)==0x80 && (z[2] & 0xc0)==0x80
   1128    && (z[3] & 0xc0)==0x80
   1129   ){
   1130     *pU = ((z[0] & 0x0f)<<18) | ((z[1] & 0x3f)<<12) | ((z[2] & 0x3f))<<6
   1131                               | (z[4] & 0x3f);
   1132     return 4;
   1133   }
   1134   *pU = 0;
   1135   return 1;
   1136 }
   1137 
   1138 
   1139 #if 0 /* NOT USED */
   1140 /*
   1141 ** Return the width, in display columns, of a UTF-8 string.
   1142 **
   1143 ** Each normal character counts as 1.  Zero-width characters count
   1144 ** as zero, and double-width characters count as 2.
   1145 */
   1146 int cli_wcswidth(const char *z){
   1147   const unsigned char *a = (const unsigned char*)z;
   1148   int n = 0;
   1149   int i = 0;
   1150   unsigned char c;
   1151   while( (c = a[i])!=0 ){
   1152     if( c>=0xc0 ){
   1153       int u;
   1154       int len = decodeUtf8(&a[i], &u);
   1155       i += len;
   1156       n += cli_wcwidth(u);
   1157     }else if( c>=' ' ){
   1158       n++;
   1159       i++;
   1160     }else{
   1161       i++;
   1162     }
   1163   }
   1164   return n;
   1165 }
   1166 #endif
   1167 
   1168 /*
   1169 ** Check to see if z[] is a valid VT100 escape.  If it is, then
   1170 ** return the number of bytes in the escape sequence.  Return 0 if
   1171 ** z[] is not a VT100 escape.
   1172 **
   1173 ** This routine assumes that z[0] is \033 (ESC).
   1174 */
   1175 static int isVt100(const unsigned char *z){
   1176   int i;
   1177   if( z[1]!='[' ) return 0;
   1178   i = 2;
   1179   while( z[i]>=0x30 && z[i]<=0x3f ){ i++; }
   1180   while( z[i]>=0x20 && z[i]<=0x2f ){ i++; }
   1181   if( z[i]<0x40 || z[i]>0x7e ) return 0;
   1182   return i+1;
   1183 }
   1184 
   1185 /*
   1186 ** Output string zUtf to stdout as w characters.  If w is negative,
   1187 ** then right-justify the text.  W is the width in UTF-8 characters, not
   1188 ** in bytes.  This is different from the %*.*s specification in printf
   1189 ** since with %*.*s the width is measured in bytes, not characters.
   1190 **
   1191 ** Take into account zero-width and double-width Unicode characters.
   1192 ** In other words, a zero-width character does not count toward the
   1193 ** the w limit.  A double-width character counts as two.
   1194 */
   1195 static void utf8_width_print(FILE *out, int w, const char *zUtf){
   1196   const unsigned char *a = (const unsigned char*)zUtf;
   1197   unsigned char c;
   1198   int i = 0;
   1199   int n = 0;
   1200   int k;
   1201   int aw = w<0 ? -w : w;
   1202   if( zUtf==0 ) zUtf = "";
   1203   while( (c = a[i])!=0 ){
   1204     if( (c&0xc0)==0xc0 ){
   1205       int u;
   1206       int len = decodeUtf8(a+i, &u);
   1207       int x = cli_wcwidth(u);
   1208       if( x+n>aw ){
   1209         break;
   1210       }
   1211       i += len;
   1212       n += x;
   1213     }else if( c==0x1b && (k = isVt100(&a[i]))>0 ){
   1214       i += k;       
   1215     }else if( n>=aw ){
   1216       break;
   1217     }else{
   1218       n++;
   1219       i++;
   1220     }
   1221   }
   1222   if( n>=aw ){
   1223     sqlite3_fprintf(out, "%.*s", i, zUtf);
   1224   }else if( w<0 ){
   1225     sqlite3_fprintf(out, "%*s%s", aw-n, "", zUtf);
   1226   }else{
   1227     sqlite3_fprintf(out, "%s%*s", zUtf, aw-n, "");
   1228   }
   1229 }
   1230 
   1231 
   1232 /*
   1233 ** Determines if a string is a number of not.
   1234 */
   1235 static int isNumber(const char *z, int *realnum){
   1236   if( *z=='-' || *z=='+' ) z++;
   1237   if( !IsDigit(*z) ){
   1238     return 0;
   1239   }
   1240   z++;
   1241   if( realnum ) *realnum = 0;
   1242   while( IsDigit(*z) ){ z++; }
   1243   if( *z=='.' ){
   1244     z++;
   1245     if( !IsDigit(*z) ) return 0;
   1246     while( IsDigit(*z) ){ z++; }
   1247     if( realnum ) *realnum = 1;
   1248   }
   1249   if( *z=='e' || *z=='E' ){
   1250     z++;
   1251     if( *z=='+' || *z=='-' ) z++;
   1252     if( !IsDigit(*z) ) return 0;
   1253     while( IsDigit(*z) ){ z++; }
   1254     if( realnum ) *realnum = 1;
   1255   }
   1256   return *z==0;
   1257 }
   1258 
   1259 /*
   1260 ** Compute a string length that is limited to what can be stored in
   1261 ** lower 30 bits of a 32-bit signed integer.
   1262 */
   1263 static int strlen30(const char *z){
   1264   const char *z2 = z;
   1265   while( *z2 ){ z2++; }
   1266   return 0x3fffffff & (int)(z2 - z);
   1267 }
   1268 
   1269 /*
   1270 ** Return the length of a string in characters.  Multibyte UTF8 characters
   1271 ** count as a single character.
   1272 */
   1273 static int strlenChar(const char *z){
   1274   int n = 0;
   1275   while( *z ){
   1276     if( (0xc0&*(z++))!=0x80 ) n++;
   1277   }
   1278   return n;
   1279 }
   1280 
   1281 /*
   1282 ** Return open FILE * if zFile exists, can be opened for read
   1283 ** and is an ordinary file or a character stream source.
   1284 ** Otherwise return 0.
   1285 */
   1286 static FILE * openChrSource(const char *zFile){
   1287 #if defined(_WIN32) || defined(WIN32)
   1288   struct __stat64 x = {0};
   1289 # define STAT_CHR_SRC(mode) ((mode & (_S_IFCHR|_S_IFIFO|_S_IFREG))!=0)
   1290   /* On Windows, open first, then check the stream nature. This order
   1291   ** is necessary because _stat() and sibs, when checking a named pipe,
   1292   ** effectively break the pipe as its supplier sees it. */
   1293   FILE *rv = sqlite3_fopen(zFile, "rb");
   1294   if( rv==0 ) return 0;
   1295   if( _fstat64(_fileno(rv), &x) != 0
   1296       || !STAT_CHR_SRC(x.st_mode)){
   1297     fclose(rv);
   1298     rv = 0;
   1299   }
   1300   return rv;
   1301 #else
   1302   struct stat x = {0};
   1303   int rc = stat(zFile, &x);
   1304 # define STAT_CHR_SRC(mode) (S_ISREG(mode)||S_ISFIFO(mode)||S_ISCHR(mode))
   1305   if( rc!=0 ) return 0;
   1306   if( STAT_CHR_SRC(x.st_mode) ){
   1307     return sqlite3_fopen(zFile, "rb");
   1308   }else{
   1309     return 0;
   1310   }
   1311 #endif
   1312 #undef STAT_CHR_SRC
   1313 }
   1314 
   1315 /*
   1316 ** This routine reads a line of text from FILE in, stores
   1317 ** the text in memory obtained from malloc() and returns a pointer
   1318 ** to the text.  NULL is returned at end of file, or if malloc()
   1319 ** fails.
   1320 **
   1321 ** If zLine is not NULL then it is a malloced buffer returned from
   1322 ** a previous call to this routine that may be reused.
   1323 */
   1324 static char *local_getline(char *zLine, FILE *in){
   1325   int nLine = zLine==0 ? 0 : 100;
   1326   int n = 0;
   1327 
   1328   while( 1 ){
   1329     if( n+100>nLine ){
   1330       nLine = nLine*2 + 100;
   1331       zLine = realloc(zLine, nLine);
   1332       shell_check_oom(zLine);
   1333     }
   1334     if( sqlite3_fgets(&zLine[n], nLine - n, in)==0 ){
   1335       if( n==0 ){
   1336         free(zLine);
   1337         return 0;
   1338       }
   1339       zLine[n] = 0;
   1340       break;
   1341     }
   1342     while( zLine[n] ) n++;
   1343     if( n>0 && zLine[n-1]=='\n' ){
   1344       n--;
   1345       if( n>0 && zLine[n-1]=='\r' ) n--;
   1346       zLine[n] = 0;
   1347       break;
   1348     }
   1349   }
   1350   return zLine;
   1351 }
   1352 
   1353 /*
   1354 ** Retrieve a single line of input text.
   1355 **
   1356 ** If in==0 then read from standard input and prompt before each line.
   1357 ** If isContinuation is true, then a continuation prompt is appropriate.
   1358 ** If isContinuation is zero, then the main prompt should be used.
   1359 **
   1360 ** If zPrior is not NULL then it is a buffer from a prior call to this
   1361 ** routine that can be reused.
   1362 **
   1363 ** The result is stored in space obtained from malloc() and must either
   1364 ** be freed by the caller or else passed back into this routine via the
   1365 ** zPrior argument for reuse.
   1366 */
   1367 #ifndef SQLITE_SHELL_FIDDLE
   1368 static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
   1369   char *zPrompt;
   1370   char *zResult;
   1371   if( in!=0 ){
   1372     zResult = local_getline(zPrior, in);
   1373   }else{
   1374     zPrompt = isContinuation ? CONTINUATION_PROMPT : mainPrompt;
   1375 #if SHELL_USE_LOCAL_GETLINE
   1376     sputz(stdout, zPrompt);
   1377     fflush(stdout);
   1378     do{
   1379       zResult = local_getline(zPrior, stdin);
   1380       zPrior = 0;
   1381       /* ^C trap creates a false EOF, so let "interrupt" thread catch up. */
   1382       if( zResult==0 ) sqlite3_sleep(50);
   1383     }while( zResult==0 && seenInterrupt>0 );
   1384 #else
   1385     free(zPrior);
   1386     zResult = shell_readline(zPrompt);
   1387     while( zResult==0 ){
   1388       /* ^C trap creates a false EOF, so let "interrupt" thread catch up. */
   1389       sqlite3_sleep(50);
   1390       if( seenInterrupt==0 ) break;
   1391       zResult = shell_readline("");
   1392     }
   1393     if( zResult && *zResult ) shell_add_history(zResult);
   1394 #endif
   1395   }
   1396   return zResult;
   1397 }
   1398 #endif /* !SQLITE_SHELL_FIDDLE */
   1399 
   1400 /*
   1401 ** Return the value of a hexadecimal digit.  Return -1 if the input
   1402 ** is not a hex digit.
   1403 */
   1404 static int hexDigitValue(char c){
   1405   if( c>='0' && c<='9' ) return c - '0';
   1406   if( c>='a' && c<='f' ) return c - 'a' + 10;
   1407   if( c>='A' && c<='F' ) return c - 'A' + 10;
   1408   return -1;
   1409 }
   1410 
   1411 /*
   1412 ** Interpret zArg as an integer value, possibly with suffixes.
   1413 */
   1414 static sqlite3_int64 integerValue(const char *zArg){
   1415   sqlite3_int64 v = 0;
   1416   static const struct { char *zSuffix; int iMult; } aMult[] = {
   1417     { "KiB", 1024 },
   1418     { "MiB", 1024*1024 },
   1419     { "GiB", 1024*1024*1024 },
   1420     { "KB",  1000 },
   1421     { "MB",  1000000 },
   1422     { "GB",  1000000000 },
   1423     { "K",   1000 },
   1424     { "M",   1000000 },
   1425     { "G",   1000000000 },
   1426   };
   1427   int i;
   1428   int isNeg = 0;
   1429   if( zArg[0]=='-' ){
   1430     isNeg = 1;
   1431     zArg++;
   1432   }else if( zArg[0]=='+' ){
   1433     zArg++;
   1434   }
   1435   if( zArg[0]=='0' && zArg[1]=='x' ){
   1436     int x;
   1437     zArg += 2;
   1438     while( (x = hexDigitValue(zArg[0]))>=0 ){
   1439       v = (v<<4) + x;
   1440       zArg++;
   1441     }
   1442   }else{
   1443     while( IsDigit(zArg[0]) ){
   1444       v = v*10 + zArg[0] - '0';
   1445       zArg++;
   1446     }
   1447   }
   1448   for(i=0; i<ArraySize(aMult); i++){
   1449     if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
   1450       v *= aMult[i].iMult;
   1451       break;
   1452     }
   1453   }
   1454   return isNeg? -v : v;
   1455 }
   1456 
   1457 /*
   1458 ** A variable length string to which one can append text.
   1459 */
   1460 typedef struct ShellText ShellText;
   1461 struct ShellText {
   1462   char *z;
   1463   int n;
   1464   int nAlloc;
   1465 };
   1466 
   1467 /*
   1468 ** Initialize and destroy a ShellText object
   1469 */
   1470 static void initText(ShellText *p){
   1471   memset(p, 0, sizeof(*p));
   1472 }
   1473 static void freeText(ShellText *p){
   1474   free(p->z);
   1475   initText(p);
   1476 }
   1477 
   1478 /* zIn is either a pointer to a NULL-terminated string in memory obtained
   1479 ** from malloc(), or a NULL pointer. The string pointed to by zAppend is
   1480 ** added to zIn, and the result returned in memory obtained from malloc().
   1481 ** zIn, if it was not NULL, is freed.
   1482 **
   1483 ** If the third argument, quote, is not '\0', then it is used as a
   1484 ** quote character for zAppend.
   1485 */
   1486 static void appendText(ShellText *p, const char *zAppend, char quote){
   1487   i64 len;
   1488   i64 i;
   1489   i64 nAppend = strlen30(zAppend);
   1490 
   1491   len = nAppend+p->n+1;
   1492   if( quote ){
   1493     len += 2;
   1494     for(i=0; i<nAppend; i++){
   1495       if( zAppend[i]==quote ) len++;
   1496     }
   1497   }
   1498 
   1499   if( p->z==0 || p->n+len>=p->nAlloc ){
   1500     p->nAlloc = p->nAlloc*2 + len + 20;
   1501     p->z = realloc(p->z, p->nAlloc);
   1502     shell_check_oom(p->z);
   1503   }
   1504 
   1505   if( quote ){
   1506     char *zCsr = p->z+p->n;
   1507     *zCsr++ = quote;
   1508     for(i=0; i<nAppend; i++){
   1509       *zCsr++ = zAppend[i];
   1510       if( zAppend[i]==quote ) *zCsr++ = quote;
   1511     }
   1512     *zCsr++ = quote;
   1513     p->n = (int)(zCsr - p->z);
   1514     *zCsr = '\0';
   1515   }else{
   1516     memcpy(p->z+p->n, zAppend, nAppend);
   1517     p->n += nAppend;
   1518     p->z[p->n] = '\0';
   1519   }
   1520 }
   1521 
   1522 /*
   1523 ** Attempt to determine if identifier zName needs to be quoted, either
   1524 ** because it contains non-alphanumeric characters, or because it is an
   1525 ** SQLite keyword.  Be conservative in this estimate:  When in doubt assume
   1526 ** that quoting is required.
   1527 **
   1528 ** Return '"' if quoting is required.  Return 0 if no quoting is required.
   1529 */
   1530 static char quoteChar(const char *zName){
   1531   int i;
   1532   if( zName==0 ) return '"';
   1533   if( !IsAlpha(zName[0]) && zName[0]!='_' ) return '"';
   1534   for(i=0; zName[i]; i++){
   1535     if( !IsAlnum(zName[i]) && zName[i]!='_' ) return '"';
   1536   }
   1537   return sqlite3_keyword_check(zName, i) ? '"' : 0;
   1538 }
   1539 
   1540 /*
   1541 ** Construct a fake object name and column list to describe the structure
   1542 ** of the view, virtual table, or table valued function zSchema.zName.
   1543 */
   1544 static char *shellFakeSchema(
   1545   sqlite3 *db,            /* The database connection containing the vtab */
   1546   const char *zSchema,    /* Schema of the database holding the vtab */
   1547   const char *zName       /* The name of the virtual table */
   1548 ){
   1549   sqlite3_stmt *pStmt = 0;
   1550   char *zSql;
   1551   ShellText s;
   1552   char cQuote;
   1553   char *zDiv = "(";
   1554   int nRow = 0;
   1555 
   1556   zSql = sqlite3_mprintf("PRAGMA \"%w\".table_info=%Q;",
   1557                          zSchema ? zSchema : "main", zName);
   1558   shell_check_oom(zSql);
   1559   sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
   1560   sqlite3_free(zSql);
   1561   initText(&s);
   1562   if( zSchema ){
   1563     cQuote = quoteChar(zSchema);
   1564     if( cQuote && sqlite3_stricmp(zSchema,"temp")==0 ) cQuote = 0;
   1565     appendText(&s, zSchema, cQuote);
   1566     appendText(&s, ".", 0);
   1567   }
   1568   cQuote = quoteChar(zName);
   1569   appendText(&s, zName, cQuote);
   1570   while( sqlite3_step(pStmt)==SQLITE_ROW ){
   1571     const char *zCol = (const char*)sqlite3_column_text(pStmt, 1);
   1572     nRow++;
   1573     appendText(&s, zDiv, 0);
   1574     zDiv = ",";
   1575     if( zCol==0 ) zCol = "";
   1576     cQuote = quoteChar(zCol);
   1577     appendText(&s, zCol, cQuote);
   1578   }
   1579   appendText(&s, ")", 0);
   1580   sqlite3_finalize(pStmt);
   1581   if( nRow==0 ){
   1582     freeText(&s);
   1583     s.z = 0;
   1584   }
   1585   return s.z;
   1586 }
   1587 
   1588 /*
   1589 ** SQL function:  strtod(X)
   1590 **
   1591 ** Use the C-library strtod() function to convert string X into a double.
   1592 ** Used for comparing the accuracy of SQLite's internal text-to-float conversion
   1593 ** routines against the C-library.
   1594 */
   1595 static void shellStrtod(
   1596   sqlite3_context *pCtx,
   1597   int nVal,
   1598   sqlite3_value **apVal
   1599 ){
   1600   char *z = (char*)sqlite3_value_text(apVal[0]);
   1601   UNUSED_PARAMETER(nVal);
   1602   if( z==0 ) return;
   1603   sqlite3_result_double(pCtx, strtod(z,0));
   1604 }
   1605 
   1606 /*
   1607 ** SQL function:  dtostr(X)
   1608 **
   1609 ** Use the C-library printf() function to convert real value X into a string.
   1610 ** Used for comparing the accuracy of SQLite's internal float-to-text conversion
   1611 ** routines against the C-library.
   1612 */
   1613 static void shellDtostr(
   1614   sqlite3_context *pCtx,
   1615   int nVal,
   1616   sqlite3_value **apVal
   1617 ){
   1618   double r = sqlite3_value_double(apVal[0]);
   1619   int n = nVal>=2 ? sqlite3_value_int(apVal[1]) : 26;
   1620   char z[400];
   1621   if( n<1 ) n = 1;
   1622   if( n>350 ) n = 350;
   1623   sqlite3_snprintf(sizeof(z), z, "%#+.*e", n, r);
   1624   sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT);
   1625 }
   1626 
   1627 /*
   1628 ** SQL function:  shell_add_schema(S,X)
   1629 **
   1630 ** Add the schema name X to the CREATE statement in S and return the result.
   1631 ** Examples:
   1632 **
   1633 **    CREATE TABLE t1(x)   ->   CREATE TABLE xyz.t1(x);
   1634 **
   1635 ** Also works on
   1636 **
   1637 **    CREATE INDEX
   1638 **    CREATE UNIQUE INDEX
   1639 **    CREATE VIEW
   1640 **    CREATE TRIGGER
   1641 **    CREATE VIRTUAL TABLE
   1642 **
   1643 ** This UDF is used by the .schema command to insert the schema name of
   1644 ** attached databases into the middle of the sqlite_schema.sql field.
   1645 */
   1646 static void shellAddSchemaName(
   1647   sqlite3_context *pCtx,
   1648   int nVal,
   1649   sqlite3_value **apVal
   1650 ){
   1651   static const char *aPrefix[] = {
   1652      "TABLE",
   1653      "INDEX",
   1654      "UNIQUE INDEX",
   1655      "VIEW",
   1656      "TRIGGER",
   1657      "VIRTUAL TABLE"
   1658   };
   1659   int i = 0;
   1660   const char *zIn = (const char*)sqlite3_value_text(apVal[0]);
   1661   const char *zSchema = (const char*)sqlite3_value_text(apVal[1]);
   1662   const char *zName = (const char*)sqlite3_value_text(apVal[2]);
   1663   sqlite3 *db = sqlite3_context_db_handle(pCtx);
   1664   UNUSED_PARAMETER(nVal);
   1665   if( zIn!=0 && cli_strncmp(zIn, "CREATE ", 7)==0 ){
   1666     for(i=0; i<ArraySize(aPrefix); i++){
   1667       int n = strlen30(aPrefix[i]);
   1668       if( cli_strncmp(zIn+7, aPrefix[i], n)==0 && zIn[n+7]==' ' ){
   1669         char *z = 0;
   1670         char *zFake = 0;
   1671         if( zSchema ){
   1672           char cQuote = quoteChar(zSchema);
   1673           if( cQuote && sqlite3_stricmp(zSchema,"temp")!=0 ){
   1674             z = sqlite3_mprintf("%.*s \"%w\".%s", n+7, zIn, zSchema, zIn+n+8);
   1675           }else{
   1676             z = sqlite3_mprintf("%.*s %s.%s", n+7, zIn, zSchema, zIn+n+8);
   1677           }
   1678         }
   1679         if( zName
   1680          && aPrefix[i][0]=='V'
   1681          && (zFake = shellFakeSchema(db, zSchema, zName))!=0
   1682         ){
   1683           if( z==0 ){
   1684             z = sqlite3_mprintf("%s\n/* %s */", zIn, zFake);
   1685           }else{
   1686             z = sqlite3_mprintf("%z\n/* %s */", z, zFake);
   1687           }
   1688           free(zFake);
   1689         }
   1690         if( z ){
   1691           sqlite3_result_text(pCtx, z, -1, sqlite3_free);
   1692           return;
   1693         }
   1694       }
   1695     }
   1696   }
   1697   sqlite3_result_value(pCtx, apVal[0]);
   1698 }
   1699 
   1700 /*
   1701 ** The source code for several run-time loadable extensions is inserted
   1702 ** below by the ../tool/mkshellc.tcl script.  Before processing that included
   1703 ** code, we need to override some macros to make the included program code
   1704 ** work here in the middle of this regular program.
   1705 */
   1706 #define SQLITE_EXTENSION_INIT1
   1707 #define SQLITE_EXTENSION_INIT2(X) (void)(X)
   1708 
   1709 #if defined(_WIN32) && defined(_MSC_VER)
   1710 /************************* Begin test_windirent.h ******************/
   1711 /*
   1712 ** 2015 November 30
   1713 **
   1714 ** The author disclaims copyright to this source code.  In place of
   1715 ** a legal notice, here is a blessing:
   1716 **
   1717 **    May you do good and not evil.
   1718 **    May you find forgiveness for yourself and forgive others.
   1719 **    May you share freely, never taking more than you give.
   1720 **
   1721 *************************************************************************
   1722 ** This file contains declarations for most of the opendir() family of
   1723 ** POSIX functions on Win32 using the MSVCRT.
   1724 */
   1725 
   1726 #if defined(_WIN32) && defined(_MSC_VER) && !defined(SQLITE_WINDIRENT_H)
   1727 #define SQLITE_WINDIRENT_H
   1728 
   1729 /*
   1730 ** We need several data types from the Windows SDK header.
   1731 */
   1732 
   1733 #ifndef WIN32_LEAN_AND_MEAN
   1734 #define WIN32_LEAN_AND_MEAN
   1735 #endif
   1736 
   1737 #include "windows.h"
   1738 
   1739 /*
   1740 ** We need several support functions from the SQLite core.
   1741 */
   1742 
   1743 /* #include "sqlite3.h" */
   1744 
   1745 /*
   1746 ** We need several things from the ANSI and MSVCRT headers.
   1747 */
   1748 
   1749 #include <stdio.h>
   1750 #include <stdlib.h>
   1751 #include <errno.h>
   1752 #include <io.h>
   1753 #include <limits.h>
   1754 #include <sys/types.h>
   1755 #include <sys/stat.h>
   1756 
   1757 /*
   1758 ** We may need several defines that should have been in "sys/stat.h".
   1759 */
   1760 
   1761 #ifndef S_ISREG
   1762 #define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG)
   1763 #endif
   1764 
   1765 #ifndef S_ISDIR
   1766 #define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
   1767 #endif
   1768 
   1769 #ifndef S_ISLNK
   1770 #define S_ISLNK(mode) (0)
   1771 #endif
   1772 
   1773 /*
   1774 ** We may need to provide the "mode_t" type.
   1775 */
   1776 
   1777 #ifndef MODE_T_DEFINED
   1778   #define MODE_T_DEFINED
   1779   typedef unsigned short mode_t;
   1780 #endif
   1781 
   1782 /*
   1783 ** We may need to provide the "ino_t" type.
   1784 */
   1785 
   1786 #ifndef INO_T_DEFINED
   1787   #define INO_T_DEFINED
   1788   typedef unsigned short ino_t;
   1789 #endif
   1790 
   1791 /*
   1792 ** We need to define "NAME_MAX" if it was not present in "limits.h".
   1793 */
   1794 
   1795 #ifndef NAME_MAX
   1796 #  ifdef FILENAME_MAX
   1797 #    define NAME_MAX (FILENAME_MAX)
   1798 #  else
   1799 #    define NAME_MAX (260)
   1800 #  endif
   1801 #  define DIRENT_NAME_MAX (NAME_MAX)
   1802 #endif
   1803 
   1804 /*
   1805 ** We need to define "NULL_INTPTR_T" and "BAD_INTPTR_T".
   1806 */
   1807 
   1808 #ifndef NULL_INTPTR_T
   1809 #  define NULL_INTPTR_T ((intptr_t)(0))
   1810 #endif
   1811 
   1812 #ifndef BAD_INTPTR_T
   1813 #  define BAD_INTPTR_T ((intptr_t)(-1))
   1814 #endif
   1815 
   1816 /*
   1817 ** We need to provide the necessary structures and related types.
   1818 */
   1819 
   1820 #ifndef DIRENT_DEFINED
   1821 #define DIRENT_DEFINED
   1822 typedef struct DIRENT DIRENT;
   1823 typedef DIRENT *LPDIRENT;
   1824 struct DIRENT {
   1825   ino_t d_ino;               /* Sequence number, do not use. */
   1826   unsigned d_attributes;     /* Win32 file attributes. */
   1827   char d_name[NAME_MAX + 1]; /* Name within the directory. */
   1828 };
   1829 #endif
   1830 
   1831 #ifndef DIR_DEFINED
   1832 #define DIR_DEFINED
   1833 typedef struct DIR DIR;
   1834 typedef DIR *LPDIR;
   1835 struct DIR {
   1836   intptr_t d_handle; /* Value returned by "_findfirst". */
   1837   DIRENT d_first;    /* DIRENT constructed based on "_findfirst". */
   1838   DIRENT d_next;     /* DIRENT constructed based on "_findnext". */
   1839 };
   1840 #endif
   1841 
   1842 /*
   1843 ** Provide a macro, for use by the implementation, to determine if a
   1844 ** particular directory entry should be skipped over when searching for
   1845 ** the next directory entry that should be returned by the readdir().
   1846 */
   1847 
   1848 #ifndef is_filtered
   1849 #  define is_filtered(a) ((((a).attrib)&_A_HIDDEN) || (((a).attrib)&_A_SYSTEM))
   1850 #endif
   1851 
   1852 /*
   1853 ** Provide the function prototype for the POSIX compatible getenv()
   1854 ** function.  This function is not thread-safe.
   1855 */
   1856 
   1857 extern const char *windirent_getenv(const char *name);
   1858 
   1859 /*
   1860 ** Finally, we can provide the function prototypes for the opendir(),
   1861 ** readdir(), and closedir() POSIX functions.
   1862 */
   1863 
   1864 extern LPDIR opendir(const char *dirname);
   1865 extern LPDIRENT readdir(LPDIR dirp);
   1866 extern INT closedir(LPDIR dirp);
   1867 
   1868 #endif /* defined(WIN32) && defined(_MSC_VER) */
   1869 
   1870 /************************* End test_windirent.h ********************/
   1871 /************************* Begin test_windirent.c ******************/
   1872 /*
   1873 ** 2015 November 30
   1874 **
   1875 ** The author disclaims copyright to this source code.  In place of
   1876 ** a legal notice, here is a blessing:
   1877 **
   1878 **    May you do good and not evil.
   1879 **    May you find forgiveness for yourself and forgive others.
   1880 **    May you share freely, never taking more than you give.
   1881 **
   1882 *************************************************************************
   1883 ** This file contains code to implement most of the opendir() family of
   1884 ** POSIX functions on Win32 using the MSVCRT.
   1885 */
   1886 
   1887 #if defined(_WIN32) && defined(_MSC_VER)
   1888 /* #include "test_windirent.h" */
   1889 
   1890 /*
   1891 ** Implementation of the POSIX getenv() function using the Win32 API.
   1892 ** This function is not thread-safe.
   1893 */
   1894 const char *windirent_getenv(
   1895   const char *name
   1896 ){
   1897   static char value[32768]; /* Maximum length, per MSDN */
   1898   DWORD dwSize = sizeof(value) / sizeof(char); /* Size in chars */
   1899   DWORD dwRet; /* Value returned by GetEnvironmentVariableA() */
   1900 
   1901   memset(value, 0, sizeof(value));
   1902   dwRet = GetEnvironmentVariableA(name, value, dwSize);
   1903   if( dwRet==0 || dwRet>dwSize ){
   1904     /*
   1905     ** The function call to GetEnvironmentVariableA() failed -OR-
   1906     ** the buffer is not large enough.  Either way, return NULL.
   1907     */
   1908     return 0;
   1909   }else{
   1910     /*
   1911     ** The function call to GetEnvironmentVariableA() succeeded
   1912     ** -AND- the buffer contains the entire value.
   1913     */
   1914     return value;
   1915   }
   1916 }
   1917 
   1918 /*
   1919 ** Implementation of the POSIX opendir() function using the MSVCRT.
   1920 */
   1921 LPDIR opendir(
   1922   const char *dirname  /* Directory name, UTF8 encoding */
   1923 ){
   1924   struct _wfinddata_t data;
   1925   LPDIR dirp = (LPDIR)sqlite3_malloc(sizeof(DIR));
   1926   SIZE_T namesize = sizeof(data.name) / sizeof(data.name[0]);
   1927   wchar_t *b1;
   1928   sqlite3_int64 sz;
   1929 
   1930   if( dirp==NULL ) return NULL;
   1931   memset(dirp, 0, sizeof(DIR));
   1932 
   1933   /* TODO: Remove this if Unix-style root paths are not used. */
   1934   if( sqlite3_stricmp(dirname, "/")==0 ){
   1935     dirname = windirent_getenv("SystemDrive");
   1936   }
   1937 
   1938   memset(&data, 0, sizeof(data));
   1939   sz = strlen(dirname);
   1940   b1 = sqlite3_malloc64( (sz+3)*sizeof(b1[0]) );
   1941   if( b1==0 ){
   1942     closedir(dirp);
   1943     return NULL;
   1944   }
   1945   sz = MultiByteToWideChar(CP_UTF8, 0, dirname, sz, b1, sz);
   1946   b1[sz++] = '\\';
   1947   b1[sz++] = '*';
   1948   b1[sz] = 0;
   1949   if( sz+1>(sqlite3_int64)namesize ){
   1950     closedir(dirp);
   1951     sqlite3_free(b1);
   1952     return NULL;
   1953   }
   1954   memcpy(data.name, b1, (sz+1)*sizeof(b1[0]));
   1955   sqlite3_free(b1);
   1956   dirp->d_handle = _wfindfirst(data.name, &data);
   1957 
   1958   if( dirp->d_handle==BAD_INTPTR_T ){
   1959     closedir(dirp);
   1960     return NULL;
   1961   }
   1962 
   1963   /* TODO: Remove this block to allow hidden and/or system files. */
   1964   if( is_filtered(data) ){
   1965 next:
   1966 
   1967     memset(&data, 0, sizeof(data));
   1968     if( _wfindnext(dirp->d_handle, &data)==-1 ){
   1969       closedir(dirp);
   1970       return NULL;
   1971     }
   1972 
   1973     /* TODO: Remove this block to allow hidden and/or system files. */
   1974     if( is_filtered(data) ) goto next;
   1975   }
   1976 
   1977   dirp->d_first.d_attributes = data.attrib;
   1978   WideCharToMultiByte(CP_UTF8, 0, data.name, -1,
   1979                       dirp->d_first.d_name, DIRENT_NAME_MAX, 0, 0);
   1980   return dirp;
   1981 }
   1982 
   1983 /*
   1984 ** Implementation of the POSIX readdir() function using the MSVCRT.
   1985 */
   1986 LPDIRENT readdir(
   1987   LPDIR dirp
   1988 ){
   1989   struct _wfinddata_t data;
   1990 
   1991   if( dirp==NULL ) return NULL;
   1992 
   1993   if( dirp->d_first.d_ino==0 ){
   1994     dirp->d_first.d_ino++;
   1995     dirp->d_next.d_ino++;
   1996 
   1997     return &dirp->d_first;
   1998   }
   1999 
   2000 next:
   2001 
   2002   memset(&data, 0, sizeof(data));
   2003   if( _wfindnext(dirp->d_handle, &data)==-1 ) return NULL;
   2004 
   2005   /* TODO: Remove this block to allow hidden and/or system files. */
   2006   if( is_filtered(data) ) goto next;
   2007 
   2008   dirp->d_next.d_ino++;
   2009   dirp->d_next.d_attributes = data.attrib;
   2010   WideCharToMultiByte(CP_UTF8, 0, data.name, -1,
   2011                       dirp->d_next.d_name, DIRENT_NAME_MAX, 0, 0);
   2012   return &dirp->d_next;
   2013 }
   2014 
   2015 /*
   2016 ** Implementation of the POSIX closedir() function using the MSVCRT.
   2017 */
   2018 INT closedir(
   2019   LPDIR dirp
   2020 ){
   2021   INT result = 0;
   2022 
   2023   if( dirp==NULL ) return EINVAL;
   2024 
   2025   if( dirp->d_handle!=NULL_INTPTR_T && dirp->d_handle!=BAD_INTPTR_T ){
   2026     result = _findclose(dirp->d_handle);
   2027   }
   2028 
   2029   sqlite3_free(dirp);
   2030   return result;
   2031 }
   2032 
   2033 #endif /* defined(WIN32) && defined(_MSC_VER) */
   2034 
   2035 /************************* End test_windirent.c ********************/
   2036 #define dirent DIRENT
   2037 #endif
   2038 /************************* Begin ../ext/misc/memtrace.c ******************/
   2039 /*
   2040 ** 2019-01-21
   2041 **
   2042 ** The author disclaims copyright to this source code.  In place of
   2043 ** a legal notice, here is a blessing:
   2044 **
   2045 **    May you do good and not evil.
   2046 **    May you find forgiveness for yourself and forgive others.
   2047 **    May you share freely, never taking more than you give.
   2048 **
   2049 *************************************************************************
   2050 **
   2051 ** This file implements an extension that uses the SQLITE_CONFIG_MALLOC
   2052 ** mechanism to add a tracing layer on top of SQLite.  If this extension
   2053 ** is registered prior to sqlite3_initialize(), it will cause all memory
   2054 ** allocation activities to be logged on standard output, or to some other
   2055 ** FILE specified by the initializer.
   2056 **
   2057 ** This file needs to be compiled into the application that uses it.
   2058 **
   2059 ** This extension is used to implement the --memtrace option of the
   2060 ** command-line shell.
   2061 */
   2062 #include <assert.h>
   2063 #include <string.h>
   2064 #include <stdio.h>
   2065 
   2066 /* The original memory allocation routines */
   2067 static sqlite3_mem_methods memtraceBase;
   2068 static FILE *memtraceOut;
   2069 
   2070 /* Methods that trace memory allocations */
   2071 static void *memtraceMalloc(int n){
   2072   if( memtraceOut ){
   2073     fprintf(memtraceOut, "MEMTRACE: allocate %d bytes\n", 
   2074             memtraceBase.xRoundup(n));
   2075   }
   2076   return memtraceBase.xMalloc(n);
   2077 }
   2078 static void memtraceFree(void *p){
   2079   if( p==0 ) return;
   2080   if( memtraceOut ){
   2081     fprintf(memtraceOut, "MEMTRACE: free %d bytes\n", memtraceBase.xSize(p));
   2082   }
   2083   memtraceBase.xFree(p);
   2084 }
   2085 static void *memtraceRealloc(void *p, int n){
   2086   if( p==0 ) return memtraceMalloc(n);
   2087   if( n==0 ){
   2088     memtraceFree(p);
   2089     return 0;
   2090   }
   2091   if( memtraceOut ){
   2092     fprintf(memtraceOut, "MEMTRACE: resize %d -> %d bytes\n",
   2093             memtraceBase.xSize(p), memtraceBase.xRoundup(n));
   2094   }
   2095   return memtraceBase.xRealloc(p, n);
   2096 }
   2097 static int memtraceSize(void *p){
   2098   return memtraceBase.xSize(p);
   2099 }
   2100 static int memtraceRoundup(int n){
   2101   return memtraceBase.xRoundup(n);
   2102 }
   2103 static int memtraceInit(void *p){
   2104   return memtraceBase.xInit(p);
   2105 }
   2106 static void memtraceShutdown(void *p){
   2107   memtraceBase.xShutdown(p);
   2108 }
   2109 
   2110 /* The substitute memory allocator */
   2111 static sqlite3_mem_methods ersaztMethods = {
   2112   memtraceMalloc,
   2113   memtraceFree,
   2114   memtraceRealloc,
   2115   memtraceSize,
   2116   memtraceRoundup,
   2117   memtraceInit,
   2118   memtraceShutdown,
   2119   0
   2120 };
   2121 
   2122 /* Begin tracing memory allocations to out. */
   2123 int sqlite3MemTraceActivate(FILE *out){
   2124   int rc = SQLITE_OK;
   2125   if( memtraceBase.xMalloc==0 ){
   2126     rc = sqlite3_config(SQLITE_CONFIG_GETMALLOC, &memtraceBase);
   2127     if( rc==SQLITE_OK ){
   2128       rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &ersaztMethods);
   2129     }
   2130   }
   2131   memtraceOut = out;
   2132   return rc;
   2133 }
   2134 
   2135 /* Deactivate memory tracing */
   2136 int sqlite3MemTraceDeactivate(void){
   2137   int rc = SQLITE_OK;
   2138   if( memtraceBase.xMalloc!=0 ){
   2139     rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &memtraceBase);
   2140     if( rc==SQLITE_OK ){
   2141       memset(&memtraceBase, 0, sizeof(memtraceBase));
   2142     }
   2143   }
   2144   memtraceOut = 0;
   2145   return rc;
   2146 }
   2147 
   2148 /************************* End ../ext/misc/memtrace.c ********************/
   2149 /************************* Begin ../ext/misc/pcachetrace.c ******************/
   2150 /*
   2151 ** 2023-06-21
   2152 **
   2153 ** The author disclaims copyright to this source code.  In place of
   2154 ** a legal notice, here is a blessing:
   2155 **
   2156 **    May you do good and not evil.
   2157 **    May you find forgiveness for yourself and forgive others.
   2158 **    May you share freely, never taking more than you give.
   2159 **
   2160 *************************************************************************
   2161 **
   2162 ** This file implements an extension that uses the SQLITE_CONFIG_PCACHE2
   2163 ** mechanism to add a tracing layer on top of pluggable page cache of
   2164 ** SQLite.  If this extension is registered prior to sqlite3_initialize(),
   2165 ** it will cause all page cache activities to be logged on standard output,
   2166 ** or to some other FILE specified by the initializer.
   2167 **
   2168 ** This file needs to be compiled into the application that uses it.
   2169 **
   2170 ** This extension is used to implement the --pcachetrace option of the
   2171 ** command-line shell.
   2172 */
   2173 #include <assert.h>
   2174 #include <string.h>
   2175 #include <stdio.h>
   2176 
   2177 /* The original page cache routines */
   2178 static sqlite3_pcache_methods2 pcacheBase;
   2179 static FILE *pcachetraceOut;
   2180 
   2181 /* Methods that trace pcache activity */
   2182 static int pcachetraceInit(void *pArg){
   2183   int nRes;
   2184   if( pcachetraceOut ){
   2185     fprintf(pcachetraceOut, "PCACHETRACE: xInit(%p)\n", pArg);
   2186   }
   2187   nRes = pcacheBase.xInit(pArg);
   2188   if( pcachetraceOut ){
   2189     fprintf(pcachetraceOut, "PCACHETRACE: xInit(%p) -> %d\n", pArg, nRes);
   2190   }
   2191   return nRes;
   2192 }
   2193 static void pcachetraceShutdown(void *pArg){
   2194   if( pcachetraceOut ){
   2195     fprintf(pcachetraceOut, "PCACHETRACE: xShutdown(%p)\n", pArg);
   2196   }
   2197   pcacheBase.xShutdown(pArg);
   2198 }
   2199 static sqlite3_pcache *pcachetraceCreate(int szPage, int szExtra, int bPurge){
   2200   sqlite3_pcache *pRes;
   2201   if( pcachetraceOut ){
   2202     fprintf(pcachetraceOut, "PCACHETRACE: xCreate(%d,%d,%d)\n",
   2203             szPage, szExtra, bPurge);
   2204   }
   2205   pRes = pcacheBase.xCreate(szPage, szExtra, bPurge);
   2206   if( pcachetraceOut ){
   2207     fprintf(pcachetraceOut, "PCACHETRACE: xCreate(%d,%d,%d) -> %p\n",
   2208             szPage, szExtra, bPurge, pRes);
   2209   }
   2210   return pRes;
   2211 }
   2212 static void pcachetraceCachesize(sqlite3_pcache *p, int nCachesize){
   2213   if( pcachetraceOut ){
   2214     fprintf(pcachetraceOut, "PCACHETRACE: xCachesize(%p, %d)\n", p, nCachesize);
   2215   }
   2216   pcacheBase.xCachesize(p, nCachesize);
   2217 }
   2218 static int pcachetracePagecount(sqlite3_pcache *p){
   2219   int nRes;
   2220   if( pcachetraceOut ){
   2221     fprintf(pcachetraceOut, "PCACHETRACE: xPagecount(%p)\n", p);
   2222   }
   2223   nRes = pcacheBase.xPagecount(p);
   2224   if( pcachetraceOut ){
   2225     fprintf(pcachetraceOut, "PCACHETRACE: xPagecount(%p) -> %d\n", p, nRes);
   2226   }
   2227   return nRes;
   2228 }
   2229 static sqlite3_pcache_page *pcachetraceFetch(
   2230   sqlite3_pcache *p,
   2231   unsigned key,
   2232   int crFg
   2233 ){
   2234   sqlite3_pcache_page *pRes;
   2235   if( pcachetraceOut ){
   2236     fprintf(pcachetraceOut, "PCACHETRACE: xFetch(%p,%u,%d)\n", p, key, crFg);
   2237   }
   2238   pRes = pcacheBase.xFetch(p, key, crFg);
   2239   if( pcachetraceOut ){
   2240     fprintf(pcachetraceOut, "PCACHETRACE: xFetch(%p,%u,%d) -> %p\n",
   2241             p, key, crFg, pRes);
   2242   }
   2243   return pRes;
   2244 }
   2245 static void pcachetraceUnpin(
   2246   sqlite3_pcache *p,
   2247   sqlite3_pcache_page *pPg,
   2248   int bDiscard
   2249 ){
   2250   if( pcachetraceOut ){
   2251     fprintf(pcachetraceOut, "PCACHETRACE: xUnpin(%p, %p, %d)\n",
   2252             p, pPg, bDiscard);
   2253   }
   2254   pcacheBase.xUnpin(p, pPg, bDiscard);
   2255 }
   2256 static void pcachetraceRekey(
   2257   sqlite3_pcache *p,
   2258   sqlite3_pcache_page *pPg,
   2259   unsigned oldKey,
   2260   unsigned newKey
   2261 ){
   2262   if( pcachetraceOut ){
   2263     fprintf(pcachetraceOut, "PCACHETRACE: xRekey(%p, %p, %u, %u)\n",
   2264         p, pPg, oldKey, newKey);
   2265   }
   2266   pcacheBase.xRekey(p, pPg, oldKey, newKey);
   2267 }
   2268 static void pcachetraceTruncate(sqlite3_pcache *p, unsigned n){
   2269   if( pcachetraceOut ){
   2270     fprintf(pcachetraceOut, "PCACHETRACE: xTruncate(%p, %u)\n", p, n);
   2271   }
   2272   pcacheBase.xTruncate(p, n);
   2273 }
   2274 static void pcachetraceDestroy(sqlite3_pcache *p){
   2275   if( pcachetraceOut ){
   2276     fprintf(pcachetraceOut, "PCACHETRACE: xDestroy(%p)\n", p);
   2277   }
   2278   pcacheBase.xDestroy(p);
   2279 }
   2280 static void pcachetraceShrink(sqlite3_pcache *p){
   2281   if( pcachetraceOut ){
   2282     fprintf(pcachetraceOut, "PCACHETRACE: xShrink(%p)\n", p);
   2283   }
   2284   pcacheBase.xShrink(p);
   2285 }
   2286 
   2287 /* The substitute pcache methods */
   2288 static sqlite3_pcache_methods2 ersaztPcacheMethods = {
   2289   0,
   2290   0,
   2291   pcachetraceInit,
   2292   pcachetraceShutdown,
   2293   pcachetraceCreate,
   2294   pcachetraceCachesize,
   2295   pcachetracePagecount,
   2296   pcachetraceFetch,
   2297   pcachetraceUnpin,
   2298   pcachetraceRekey,
   2299   pcachetraceTruncate,
   2300   pcachetraceDestroy,
   2301   pcachetraceShrink
   2302 };
   2303 
   2304 /* Begin tracing memory allocations to out. */
   2305 int sqlite3PcacheTraceActivate(FILE *out){
   2306   int rc = SQLITE_OK;
   2307   if( pcacheBase.xFetch==0 ){
   2308     rc = sqlite3_config(SQLITE_CONFIG_GETPCACHE2, &pcacheBase);
   2309     if( rc==SQLITE_OK ){
   2310       rc = sqlite3_config(SQLITE_CONFIG_PCACHE2, &ersaztPcacheMethods);
   2311     }
   2312   }
   2313   pcachetraceOut = out;
   2314   return rc;
   2315 }
   2316 
   2317 /* Deactivate memory tracing */
   2318 int sqlite3PcacheTraceDeactivate(void){
   2319   int rc = SQLITE_OK;
   2320   if( pcacheBase.xFetch!=0 ){
   2321     rc = sqlite3_config(SQLITE_CONFIG_PCACHE2, &pcacheBase);
   2322     if( rc==SQLITE_OK ){
   2323       memset(&pcacheBase, 0, sizeof(pcacheBase));
   2324     }
   2325   }
   2326   pcachetraceOut = 0;
   2327   return rc;
   2328 }
   2329 
   2330 /************************* End ../ext/misc/pcachetrace.c ********************/
   2331 /************************* Begin ../ext/misc/shathree.c ******************/
   2332 /*
   2333 ** 2017-03-08
   2334 **
   2335 ** The author disclaims copyright to this source code.  In place of
   2336 ** a legal notice, here is a blessing:
   2337 **
   2338 **    May you do good and not evil.
   2339 **    May you find forgiveness for yourself and forgive others.
   2340 **    May you share freely, never taking more than you give.
   2341 **
   2342 ******************************************************************************
   2343 **
   2344 ** This SQLite extension implements functions that compute SHA3 hashes
   2345 ** in the way described by the (U.S.) NIST FIPS 202 SHA-3 Standard.
   2346 ** Three SQL functions are implemented:
   2347 **
   2348 **     sha3(X,SIZE)
   2349 **     sha3_agg(Y,SIZE)
   2350 **     sha3_query(Z,SIZE)
   2351 **
   2352 ** The sha3(X) function computes the SHA3 hash of the input X, or NULL if
   2353 ** X is NULL.  If inputs X is text, the UTF-8 rendering of that text is
   2354 ** used to compute the hash.  If X is a BLOB, then the binary data of the
   2355 ** blob is used to compute the hash.  If X is an integer or real number,
   2356 ** then that number if converted into UTF-8 text and the hash is computed
   2357 ** over the text.
   2358 **
   2359 ** The sha3_agg(Y) function computes the SHA3 hash of all Y inputs.  Since
   2360 ** order is important for the hash, it is recommended that the Y expression
   2361 ** by followed by an ORDER BY clause to guarantee that the inputs occur
   2362 ** in the desired order.
   2363 **
   2364 ** The sha3_query(Y) function evaluates all queries in the SQL statements of Y
   2365 ** and returns a hash of their results.
   2366 **
   2367 ** The SIZE argument is optional.  If omitted, the SHA3-256 hash algorithm
   2368 ** is used.  If SIZE is included it must be one of the integers 224, 256,
   2369 ** 384, or 512, to determine SHA3 hash variant that is computed.
   2370 **
   2371 ** Because the sha3_agg() and sha3_query() functions compute a hash over
   2372 ** multiple values, the values are encode to use include type information.
   2373 **
   2374 ** In sha3_agg(), the sequence of bytes that gets hashed for each input
   2375 ** Y depends on the datatype of Y:
   2376 **
   2377 **    typeof(Y)='null'         A single "N" is hashed.  (One byte)
   2378 **
   2379 **    typeof(Y)='integer'      The data hash is the character "I" followed
   2380 **                             by an 8-byte big-endian binary of the
   2381 **                             64-bit signed integer.  (Nine bytes total.)
   2382 **
   2383 **    typeof(Y)='real'         The character "F" followed by an 8-byte
   2384 **                             big-ending binary of the double.  (Nine
   2385 **                             bytes total.)
   2386 **
   2387 **    typeof(Y)='text'         The hash is over prefix "Tnnn:" followed
   2388 **                             by the UTF8 encoding of the text.  The "nnn"
   2389 **                             in the prefix is the minimum-length decimal
   2390 **                             representation of the octet_length of the text.
   2391 **                             Notice the ":" at the end of the prefix, which
   2392 **                             is needed to separate the prefix from the
   2393 **                             content in cases where the content starts
   2394 **                             with a digit.
   2395 **
   2396 **    typeof(Y)='blob'         The hash is taken over prefix "Bnnn:" followed
   2397 **                             by the binary content of the blob.  The "nnn"
   2398 **                             in the prefix is the minimum-length decimal
   2399 **                             representation of the byte-length of the blob.
   2400 **
   2401 ** According to the rules above, all of the following SELECT statements
   2402 ** should return TRUE:
   2403 **
   2404 **    SELECT sha3(1) = sha3('1');
   2405 **
   2406 **    SELECT sha3('hello') = sha3(x'68656c6c6f');
   2407 **
   2408 **    WITH a(x) AS (VALUES('xyzzy'))
   2409 **      SELECT sha3_agg(x) = sha3('T5:xyzzy')            FROM a;
   2410 **
   2411 **    WITH a(x) AS (VALUES(x'010203'))
   2412 **      SELECT sha3_agg(x) = sha3(x'42333a010203')       FROM a;
   2413 **
   2414 **    WITH a(x) AS (VALUES(0x123456))
   2415 **      SELECT sha3_agg(x) = sha3(x'490000000000123456') FROM a;
   2416 **
   2417 **    WITH a(x) AS (VALUES(100.015625))
   2418 **      SELECT sha3_agg(x) = sha3(x'464059010000000000') FROM a;
   2419 **
   2420 **    WITH a(x) AS (VALUES(NULL))
   2421 **      SELECT sha3_agg(x) = sha3('N') FROM a;
   2422 **
   2423 **
   2424 ** In sha3_query(), individual column values are encoded as with
   2425 ** sha3_agg(), but with the addition that a single "R" character is
   2426 ** inserted at the start of each row.
   2427 **
   2428 ** Note that sha3_agg() hashes rows for which Y is NULL.  Add a FILTER
   2429 ** clause if NULL rows should be excluded:
   2430 **
   2431 **    SELECT sha3_agg(x ORDER BY rowid) FILTER(WHERE x NOT NULL) FROM t1;
   2432 */
   2433 /* #include "sqlite3ext.h" */
   2434 SQLITE_EXTENSION_INIT1
   2435 #include <assert.h>
   2436 #include <string.h>
   2437 #include <stdarg.h>
   2438 
   2439 #ifndef SQLITE_AMALGAMATION
   2440 /* typedef sqlite3_uint64 u64; */
   2441 #endif /* SQLITE_AMALGAMATION */
   2442 
   2443 /******************************************************************************
   2444 ** The Hash Engine
   2445 */
   2446 /*
   2447 ** Macros to determine whether the machine is big or little endian,
   2448 ** and whether or not that determination is run-time or compile-time.
   2449 **
   2450 ** For best performance, an attempt is made to guess at the byte-order
   2451 ** using C-preprocessor macros.  If that is unsuccessful, or if
   2452 ** -DSHA3_BYTEORDER=0 is set, then byte-order is determined
   2453 ** at run-time.
   2454 */
   2455 #ifndef SHA3_BYTEORDER
   2456 # if defined(i386)     || defined(__i386__)   || defined(_M_IX86) ||    \
   2457      defined(__x86_64) || defined(__x86_64__) || defined(_M_X64)  ||    \
   2458      defined(_M_AMD64) || defined(_M_ARM)     || defined(__x86)   ||    \
   2459      defined(__arm__)
   2460 #   define SHA3_BYTEORDER    1234
   2461 # elif defined(sparc)    || defined(__ppc__)
   2462 #   define SHA3_BYTEORDER    4321
   2463 # else
   2464 #   define SHA3_BYTEORDER 0
   2465 # endif
   2466 #endif
   2467 
   2468 
   2469 /*
   2470 ** State structure for a SHA3 hash in progress
   2471 */
   2472 typedef struct SHA3Context SHA3Context;
   2473 struct SHA3Context {
   2474   union {
   2475     u64 s[25];                /* Keccak state. 5x5 lines of 64 bits each */
   2476     unsigned char x[1600];    /* ... or 1600 bytes */
   2477   } u;
   2478   unsigned nRate;        /* Bytes of input accepted per Keccak iteration */
   2479   unsigned nLoaded;      /* Input bytes loaded into u.x[] so far this cycle */
   2480   unsigned ixMask;       /* Insert next input into u.x[nLoaded^ixMask]. */
   2481   unsigned iSize;        /* 224, 256, 358, or 512 */
   2482 };
   2483 
   2484 /*
   2485 ** A single step of the Keccak mixing function for a 1600-bit state
   2486 */
   2487 static void KeccakF1600Step(SHA3Context *p){
   2488   int i;
   2489   u64 b0, b1, b2, b3, b4;
   2490   u64 c0, c1, c2, c3, c4;
   2491   u64 d0, d1, d2, d3, d4;
   2492   static const u64 RC[] = {
   2493     0x0000000000000001ULL,  0x0000000000008082ULL,
   2494     0x800000000000808aULL,  0x8000000080008000ULL,
   2495     0x000000000000808bULL,  0x0000000080000001ULL,
   2496     0x8000000080008081ULL,  0x8000000000008009ULL,
   2497     0x000000000000008aULL,  0x0000000000000088ULL,
   2498     0x0000000080008009ULL,  0x000000008000000aULL,
   2499     0x000000008000808bULL,  0x800000000000008bULL,
   2500     0x8000000000008089ULL,  0x8000000000008003ULL,
   2501     0x8000000000008002ULL,  0x8000000000000080ULL,
   2502     0x000000000000800aULL,  0x800000008000000aULL,
   2503     0x8000000080008081ULL,  0x8000000000008080ULL,
   2504     0x0000000080000001ULL,  0x8000000080008008ULL
   2505   };
   2506 # define a00 (p->u.s[0])
   2507 # define a01 (p->u.s[1])
   2508 # define a02 (p->u.s[2])
   2509 # define a03 (p->u.s[3])
   2510 # define a04 (p->u.s[4])
   2511 # define a10 (p->u.s[5])
   2512 # define a11 (p->u.s[6])
   2513 # define a12 (p->u.s[7])
   2514 # define a13 (p->u.s[8])
   2515 # define a14 (p->u.s[9])
   2516 # define a20 (p->u.s[10])
   2517 # define a21 (p->u.s[11])
   2518 # define a22 (p->u.s[12])
   2519 # define a23 (p->u.s[13])
   2520 # define a24 (p->u.s[14])
   2521 # define a30 (p->u.s[15])
   2522 # define a31 (p->u.s[16])
   2523 # define a32 (p->u.s[17])
   2524 # define a33 (p->u.s[18])
   2525 # define a34 (p->u.s[19])
   2526 # define a40 (p->u.s[20])
   2527 # define a41 (p->u.s[21])
   2528 # define a42 (p->u.s[22])
   2529 # define a43 (p->u.s[23])
   2530 # define a44 (p->u.s[24])
   2531 # define ROL64(a,x) ((a<<x)|(a>>(64-x)))
   2532 
   2533   for(i=0; i<24; i+=4){
   2534     c0 = a00^a10^a20^a30^a40;
   2535     c1 = a01^a11^a21^a31^a41;
   2536     c2 = a02^a12^a22^a32^a42;
   2537     c3 = a03^a13^a23^a33^a43;
   2538     c4 = a04^a14^a24^a34^a44;
   2539     d0 = c4^ROL64(c1, 1);
   2540     d1 = c0^ROL64(c2, 1);
   2541     d2 = c1^ROL64(c3, 1);
   2542     d3 = c2^ROL64(c4, 1);
   2543     d4 = c3^ROL64(c0, 1);
   2544 
   2545     b0 = (a00^d0);
   2546     b1 = ROL64((a11^d1), 44);
   2547     b2 = ROL64((a22^d2), 43);
   2548     b3 = ROL64((a33^d3), 21);
   2549     b4 = ROL64((a44^d4), 14);
   2550     a00 =   b0 ^((~b1)&  b2 );
   2551     a00 ^= RC[i];
   2552     a11 =   b1 ^((~b2)&  b3 );
   2553     a22 =   b2 ^((~b3)&  b4 );
   2554     a33 =   b3 ^((~b4)&  b0 );
   2555     a44 =   b4 ^((~b0)&  b1 );
   2556 
   2557     b2 = ROL64((a20^d0), 3);
   2558     b3 = ROL64((a31^d1), 45);
   2559     b4 = ROL64((a42^d2), 61);
   2560     b0 = ROL64((a03^d3), 28);
   2561     b1 = ROL64((a14^d4), 20);
   2562     a20 =   b0 ^((~b1)&  b2 );
   2563     a31 =   b1 ^((~b2)&  b3 );
   2564     a42 =   b2 ^((~b3)&  b4 );
   2565     a03 =   b3 ^((~b4)&  b0 );
   2566     a14 =   b4 ^((~b0)&  b1 );
   2567 
   2568     b4 = ROL64((a40^d0), 18);
   2569     b0 = ROL64((a01^d1), 1);
   2570     b1 = ROL64((a12^d2), 6);
   2571     b2 = ROL64((a23^d3), 25);
   2572     b3 = ROL64((a34^d4), 8);
   2573     a40 =   b0 ^((~b1)&  b2 );
   2574     a01 =   b1 ^((~b2)&  b3 );
   2575     a12 =   b2 ^((~b3)&  b4 );
   2576     a23 =   b3 ^((~b4)&  b0 );
   2577     a34 =   b4 ^((~b0)&  b1 );
   2578 
   2579     b1 = ROL64((a10^d0), 36);
   2580     b2 = ROL64((a21^d1), 10);
   2581     b3 = ROL64((a32^d2), 15);
   2582     b4 = ROL64((a43^d3), 56);
   2583     b0 = ROL64((a04^d4), 27);
   2584     a10 =   b0 ^((~b1)&  b2 );
   2585     a21 =   b1 ^((~b2)&  b3 );
   2586     a32 =   b2 ^((~b3)&  b4 );
   2587     a43 =   b3 ^((~b4)&  b0 );
   2588     a04 =   b4 ^((~b0)&  b1 );
   2589 
   2590     b3 = ROL64((a30^d0), 41);
   2591     b4 = ROL64((a41^d1), 2);
   2592     b0 = ROL64((a02^d2), 62);
   2593     b1 = ROL64((a13^d3), 55);
   2594     b2 = ROL64((a24^d4), 39);
   2595     a30 =   b0 ^((~b1)&  b2 );
   2596     a41 =   b1 ^((~b2)&  b3 );
   2597     a02 =   b2 ^((~b3)&  b4 );
   2598     a13 =   b3 ^((~b4)&  b0 );
   2599     a24 =   b4 ^((~b0)&  b1 );
   2600 
   2601     c0 = a00^a20^a40^a10^a30;
   2602     c1 = a11^a31^a01^a21^a41;
   2603     c2 = a22^a42^a12^a32^a02;
   2604     c3 = a33^a03^a23^a43^a13;
   2605     c4 = a44^a14^a34^a04^a24;
   2606     d0 = c4^ROL64(c1, 1);
   2607     d1 = c0^ROL64(c2, 1);
   2608     d2 = c1^ROL64(c3, 1);
   2609     d3 = c2^ROL64(c4, 1);
   2610     d4 = c3^ROL64(c0, 1);
   2611 
   2612     b0 = (a00^d0);
   2613     b1 = ROL64((a31^d1), 44);
   2614     b2 = ROL64((a12^d2), 43);
   2615     b3 = ROL64((a43^d3), 21);
   2616     b4 = ROL64((a24^d4), 14);
   2617     a00 =   b0 ^((~b1)&  b2 );
   2618     a00 ^= RC[i+1];
   2619     a31 =   b1 ^((~b2)&  b3 );
   2620     a12 =   b2 ^((~b3)&  b4 );
   2621     a43 =   b3 ^((~b4)&  b0 );
   2622     a24 =   b4 ^((~b0)&  b1 );
   2623 
   2624     b2 = ROL64((a40^d0), 3);
   2625     b3 = ROL64((a21^d1), 45);
   2626     b4 = ROL64((a02^d2), 61);
   2627     b0 = ROL64((a33^d3), 28);
   2628     b1 = ROL64((a14^d4), 20);
   2629     a40 =   b0 ^((~b1)&  b2 );
   2630     a21 =   b1 ^((~b2)&  b3 );
   2631     a02 =   b2 ^((~b3)&  b4 );
   2632     a33 =   b3 ^((~b4)&  b0 );
   2633     a14 =   b4 ^((~b0)&  b1 );
   2634 
   2635     b4 = ROL64((a30^d0), 18);
   2636     b0 = ROL64((a11^d1), 1);
   2637     b1 = ROL64((a42^d2), 6);
   2638     b2 = ROL64((a23^d3), 25);
   2639     b3 = ROL64((a04^d4), 8);
   2640     a30 =   b0 ^((~b1)&  b2 );
   2641     a11 =   b1 ^((~b2)&  b3 );
   2642     a42 =   b2 ^((~b3)&  b4 );
   2643     a23 =   b3 ^((~b4)&  b0 );
   2644     a04 =   b4 ^((~b0)&  b1 );
   2645 
   2646     b1 = ROL64((a20^d0), 36);
   2647     b2 = ROL64((a01^d1), 10);
   2648     b3 = ROL64((a32^d2), 15);
   2649     b4 = ROL64((a13^d3), 56);
   2650     b0 = ROL64((a44^d4), 27);
   2651     a20 =   b0 ^((~b1)&  b2 );
   2652     a01 =   b1 ^((~b2)&  b3 );
   2653     a32 =   b2 ^((~b3)&  b4 );
   2654     a13 =   b3 ^((~b4)&  b0 );
   2655     a44 =   b4 ^((~b0)&  b1 );
   2656 
   2657     b3 = ROL64((a10^d0), 41);
   2658     b4 = ROL64((a41^d1), 2);
   2659     b0 = ROL64((a22^d2), 62);
   2660     b1 = ROL64((a03^d3), 55);
   2661     b2 = ROL64((a34^d4), 39);
   2662     a10 =   b0 ^((~b1)&  b2 );
   2663     a41 =   b1 ^((~b2)&  b3 );
   2664     a22 =   b2 ^((~b3)&  b4 );
   2665     a03 =   b3 ^((~b4)&  b0 );
   2666     a34 =   b4 ^((~b0)&  b1 );
   2667 
   2668     c0 = a00^a40^a30^a20^a10;
   2669     c1 = a31^a21^a11^a01^a41;
   2670     c2 = a12^a02^a42^a32^a22;
   2671     c3 = a43^a33^a23^a13^a03;
   2672     c4 = a24^a14^a04^a44^a34;
   2673     d0 = c4^ROL64(c1, 1);
   2674     d1 = c0^ROL64(c2, 1);
   2675     d2 = c1^ROL64(c3, 1);
   2676     d3 = c2^ROL64(c4, 1);
   2677     d4 = c3^ROL64(c0, 1);
   2678 
   2679     b0 = (a00^d0);
   2680     b1 = ROL64((a21^d1), 44);
   2681     b2 = ROL64((a42^d2), 43);
   2682     b3 = ROL64((a13^d3), 21);
   2683     b4 = ROL64((a34^d4), 14);
   2684     a00 =   b0 ^((~b1)&  b2 );
   2685     a00 ^= RC[i+2];
   2686     a21 =   b1 ^((~b2)&  b3 );
   2687     a42 =   b2 ^((~b3)&  b4 );
   2688     a13 =   b3 ^((~b4)&  b0 );
   2689     a34 =   b4 ^((~b0)&  b1 );
   2690 
   2691     b2 = ROL64((a30^d0), 3);
   2692     b3 = ROL64((a01^d1), 45);
   2693     b4 = ROL64((a22^d2), 61);
   2694     b0 = ROL64((a43^d3), 28);
   2695     b1 = ROL64((a14^d4), 20);
   2696     a30 =   b0 ^((~b1)&  b2 );
   2697     a01 =   b1 ^((~b2)&  b3 );
   2698     a22 =   b2 ^((~b3)&  b4 );
   2699     a43 =   b3 ^((~b4)&  b0 );
   2700     a14 =   b4 ^((~b0)&  b1 );
   2701 
   2702     b4 = ROL64((a10^d0), 18);
   2703     b0 = ROL64((a31^d1), 1);
   2704     b1 = ROL64((a02^d2), 6);
   2705     b2 = ROL64((a23^d3), 25);
   2706     b3 = ROL64((a44^d4), 8);
   2707     a10 =   b0 ^((~b1)&  b2 );
   2708     a31 =   b1 ^((~b2)&  b3 );
   2709     a02 =   b2 ^((~b3)&  b4 );
   2710     a23 =   b3 ^((~b4)&  b0 );
   2711     a44 =   b4 ^((~b0)&  b1 );
   2712 
   2713     b1 = ROL64((a40^d0), 36);
   2714     b2 = ROL64((a11^d1), 10);
   2715     b3 = ROL64((a32^d2), 15);
   2716     b4 = ROL64((a03^d3), 56);
   2717     b0 = ROL64((a24^d4), 27);
   2718     a40 =   b0 ^((~b1)&  b2 );
   2719     a11 =   b1 ^((~b2)&  b3 );
   2720     a32 =   b2 ^((~b3)&  b4 );
   2721     a03 =   b3 ^((~b4)&  b0 );
   2722     a24 =   b4 ^((~b0)&  b1 );
   2723 
   2724     b3 = ROL64((a20^d0), 41);
   2725     b4 = ROL64((a41^d1), 2);
   2726     b0 = ROL64((a12^d2), 62);
   2727     b1 = ROL64((a33^d3), 55);
   2728     b2 = ROL64((a04^d4), 39);
   2729     a20 =   b0 ^((~b1)&  b2 );
   2730     a41 =   b1 ^((~b2)&  b3 );
   2731     a12 =   b2 ^((~b3)&  b4 );
   2732     a33 =   b3 ^((~b4)&  b0 );
   2733     a04 =   b4 ^((~b0)&  b1 );
   2734 
   2735     c0 = a00^a30^a10^a40^a20;
   2736     c1 = a21^a01^a31^a11^a41;
   2737     c2 = a42^a22^a02^a32^a12;
   2738     c3 = a13^a43^a23^a03^a33;
   2739     c4 = a34^a14^a44^a24^a04;
   2740     d0 = c4^ROL64(c1, 1);
   2741     d1 = c0^ROL64(c2, 1);
   2742     d2 = c1^ROL64(c3, 1);
   2743     d3 = c2^ROL64(c4, 1);
   2744     d4 = c3^ROL64(c0, 1);
   2745 
   2746     b0 = (a00^d0);
   2747     b1 = ROL64((a01^d1), 44);
   2748     b2 = ROL64((a02^d2), 43);
   2749     b3 = ROL64((a03^d3), 21);
   2750     b4 = ROL64((a04^d4), 14);
   2751     a00 =   b0 ^((~b1)&  b2 );
   2752     a00 ^= RC[i+3];
   2753     a01 =   b1 ^((~b2)&  b3 );
   2754     a02 =   b2 ^((~b3)&  b4 );
   2755     a03 =   b3 ^((~b4)&  b0 );
   2756     a04 =   b4 ^((~b0)&  b1 );
   2757 
   2758     b2 = ROL64((a10^d0), 3);
   2759     b3 = ROL64((a11^d1), 45);
   2760     b4 = ROL64((a12^d2), 61);
   2761     b0 = ROL64((a13^d3), 28);
   2762     b1 = ROL64((a14^d4), 20);
   2763     a10 =   b0 ^((~b1)&  b2 );
   2764     a11 =   b1 ^((~b2)&  b3 );
   2765     a12 =   b2 ^((~b3)&  b4 );
   2766     a13 =   b3 ^((~b4)&  b0 );
   2767     a14 =   b4 ^((~b0)&  b1 );
   2768 
   2769     b4 = ROL64((a20^d0), 18);
   2770     b0 = ROL64((a21^d1), 1);
   2771     b1 = ROL64((a22^d2), 6);
   2772     b2 = ROL64((a23^d3), 25);
   2773     b3 = ROL64((a24^d4), 8);
   2774     a20 =   b0 ^((~b1)&  b2 );
   2775     a21 =   b1 ^((~b2)&  b3 );
   2776     a22 =   b2 ^((~b3)&  b4 );
   2777     a23 =   b3 ^((~b4)&  b0 );
   2778     a24 =   b4 ^((~b0)&  b1 );
   2779 
   2780     b1 = ROL64((a30^d0), 36);
   2781     b2 = ROL64((a31^d1), 10);
   2782     b3 = ROL64((a32^d2), 15);
   2783     b4 = ROL64((a33^d3), 56);
   2784     b0 = ROL64((a34^d4), 27);
   2785     a30 =   b0 ^((~b1)&  b2 );
   2786     a31 =   b1 ^((~b2)&  b3 );
   2787     a32 =   b2 ^((~b3)&  b4 );
   2788     a33 =   b3 ^((~b4)&  b0 );
   2789     a34 =   b4 ^((~b0)&  b1 );
   2790 
   2791     b3 = ROL64((a40^d0), 41);
   2792     b4 = ROL64((a41^d1), 2);
   2793     b0 = ROL64((a42^d2), 62);
   2794     b1 = ROL64((a43^d3), 55);
   2795     b2 = ROL64((a44^d4), 39);
   2796     a40 =   b0 ^((~b1)&  b2 );
   2797     a41 =   b1 ^((~b2)&  b3 );
   2798     a42 =   b2 ^((~b3)&  b4 );
   2799     a43 =   b3 ^((~b4)&  b0 );
   2800     a44 =   b4 ^((~b0)&  b1 );
   2801   }
   2802 }
   2803 
   2804 /*
   2805 ** Initialize a new hash.  iSize determines the size of the hash
   2806 ** in bits and should be one of 224, 256, 384, or 512.  Or iSize
   2807 ** can be zero to use the default hash size of 256 bits.
   2808 */
   2809 static void SHA3Init(SHA3Context *p, int iSize){
   2810   memset(p, 0, sizeof(*p));
   2811   p->iSize = iSize;
   2812   if( iSize>=128 && iSize<=512 ){
   2813     p->nRate = (1600 - ((iSize + 31)&~31)*2)/8;
   2814   }else{
   2815     p->nRate = (1600 - 2*256)/8;
   2816   }
   2817 #if SHA3_BYTEORDER==1234
   2818   /* Known to be little-endian at compile-time. No-op */
   2819 #elif SHA3_BYTEORDER==4321
   2820   p->ixMask = 7;  /* Big-endian */
   2821 #else
   2822   {
   2823     static unsigned int one = 1;
   2824     if( 1==*(unsigned char*)&one ){
   2825       /* Little endian.  No byte swapping. */
   2826       p->ixMask = 0;
   2827     }else{
   2828       /* Big endian.  Byte swap. */
   2829       p->ixMask = 7;
   2830     }
   2831   }
   2832 #endif
   2833 }
   2834 
   2835 /*
   2836 ** Make consecutive calls to the SHA3Update function to add new content
   2837 ** to the hash
   2838 */
   2839 static void SHA3Update(
   2840   SHA3Context *p,
   2841   const unsigned char *aData,
   2842   unsigned int nData
   2843 ){
   2844   unsigned int i = 0;
   2845   if( aData==0 ) return;
   2846 #if SHA3_BYTEORDER==1234
   2847   if( (p->nLoaded % 8)==0 && ((aData - (const unsigned char*)0)&7)==0 ){
   2848     for(; i+7<nData; i+=8){
   2849       p->u.s[p->nLoaded/8] ^= *(u64*)&aData[i];
   2850       p->nLoaded += 8;
   2851       if( p->nLoaded>=p->nRate ){
   2852         KeccakF1600Step(p);
   2853         p->nLoaded = 0;
   2854       }
   2855     }
   2856   }
   2857 #endif
   2858   for(; i<nData; i++){
   2859 #if SHA3_BYTEORDER==1234
   2860     p->u.x[p->nLoaded] ^= aData[i];
   2861 #elif SHA3_BYTEORDER==4321
   2862     p->u.x[p->nLoaded^0x07] ^= aData[i];
   2863 #else
   2864     p->u.x[p->nLoaded^p->ixMask] ^= aData[i];
   2865 #endif
   2866     p->nLoaded++;
   2867     if( p->nLoaded==p->nRate ){
   2868       KeccakF1600Step(p);
   2869       p->nLoaded = 0;
   2870     }
   2871   }
   2872 }
   2873 
   2874 /*
   2875 ** After all content has been added, invoke SHA3Final() to compute
   2876 ** the final hash.  The function returns a pointer to the binary
   2877 ** hash value.
   2878 */
   2879 static unsigned char *SHA3Final(SHA3Context *p){
   2880   unsigned int i;
   2881   if( p->nLoaded==p->nRate-1 ){
   2882     const unsigned char c1 = 0x86;
   2883     SHA3Update(p, &c1, 1);
   2884   }else{
   2885     const unsigned char c2 = 0x06;
   2886     const unsigned char c3 = 0x80;
   2887     SHA3Update(p, &c2, 1);
   2888     p->nLoaded = p->nRate - 1;
   2889     SHA3Update(p, &c3, 1);
   2890   }
   2891   for(i=0; i<p->nRate; i++){
   2892     p->u.x[i+p->nRate] = p->u.x[i^p->ixMask];
   2893   }
   2894   return &p->u.x[p->nRate];
   2895 }
   2896 /* End of the hashing logic
   2897 *****************************************************************************/
   2898 
   2899 /*
   2900 ** Implementation of the sha3(X,SIZE) function.
   2901 **
   2902 ** Return a BLOB which is the SIZE-bit SHA3 hash of X.  The default
   2903 ** size is 256.  If X is a BLOB, it is hashed as is.  
   2904 ** For all other non-NULL types of input, X is converted into a UTF-8 string
   2905 ** and the string is hashed without the trailing 0x00 terminator.  The hash
   2906 ** of a NULL value is NULL.
   2907 */
   2908 static void sha3Func(
   2909   sqlite3_context *context,
   2910   int argc,
   2911   sqlite3_value **argv
   2912 ){
   2913   SHA3Context cx;
   2914   int eType = sqlite3_value_type(argv[0]);
   2915   int nByte = sqlite3_value_bytes(argv[0]);
   2916   int iSize;
   2917   if( argc==1 ){
   2918     iSize = 256;
   2919   }else{
   2920     iSize = sqlite3_value_int(argv[1]);
   2921     if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){
   2922       sqlite3_result_error(context, "SHA3 size should be one of: 224 256 "
   2923                                     "384 512", -1);
   2924       return;
   2925     }
   2926   }
   2927   if( eType==SQLITE_NULL ) return;
   2928   SHA3Init(&cx, iSize);
   2929   if( eType==SQLITE_BLOB ){
   2930     SHA3Update(&cx, sqlite3_value_blob(argv[0]), nByte);
   2931   }else{
   2932     SHA3Update(&cx, sqlite3_value_text(argv[0]), nByte);
   2933   }
   2934   sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT);
   2935 }
   2936 
   2937 /* Compute a string using sqlite3_vsnprintf() with a maximum length
   2938 ** of 50 bytes and add it to the hash.
   2939 */
   2940 static void sha3_step_vformat(
   2941   SHA3Context *p,                 /* Add content to this context */
   2942   const char *zFormat,
   2943   ...
   2944 ){
   2945   va_list ap;
   2946   int n;
   2947   char zBuf[50];
   2948   va_start(ap, zFormat);
   2949   sqlite3_vsnprintf(sizeof(zBuf),zBuf,zFormat,ap);
   2950   va_end(ap);
   2951   n = (int)strlen(zBuf);
   2952   SHA3Update(p, (unsigned char*)zBuf, n);
   2953 }
   2954 
   2955 /*
   2956 ** Update a SHA3Context using a single sqlite3_value.
   2957 */
   2958 static void sha3UpdateFromValue(SHA3Context *p, sqlite3_value *pVal){
   2959   switch( sqlite3_value_type(pVal) ){
   2960     case SQLITE_NULL: {
   2961       SHA3Update(p, (const unsigned char*)"N",1);
   2962       break;
   2963     }
   2964     case SQLITE_INTEGER: {
   2965       sqlite3_uint64 u;
   2966       int j;
   2967       unsigned char x[9];
   2968       sqlite3_int64 v = sqlite3_value_int64(pVal);
   2969       memcpy(&u, &v, 8);
   2970       for(j=8; j>=1; j--){
   2971         x[j] = u & 0xff;
   2972         u >>= 8;
   2973       }
   2974       x[0] = 'I';
   2975       SHA3Update(p, x, 9);
   2976       break;
   2977     }
   2978     case SQLITE_FLOAT: {
   2979       sqlite3_uint64 u;
   2980       int j;
   2981       unsigned char x[9];
   2982       double r = sqlite3_value_double(pVal);
   2983       memcpy(&u, &r, 8);
   2984       for(j=8; j>=1; j--){
   2985         x[j] = u & 0xff;
   2986         u >>= 8;
   2987       }
   2988       x[0] = 'F';
   2989       SHA3Update(p,x,9);
   2990       break;
   2991     }
   2992     case SQLITE_TEXT: {
   2993       int n2 = sqlite3_value_bytes(pVal);
   2994       const unsigned char *z2 = sqlite3_value_text(pVal);
   2995       sha3_step_vformat(p,"T%d:",n2);
   2996       SHA3Update(p, z2, n2);
   2997       break;
   2998     }
   2999     case SQLITE_BLOB: {
   3000       int n2 = sqlite3_value_bytes(pVal);
   3001       const unsigned char *z2 = sqlite3_value_blob(pVal);
   3002       sha3_step_vformat(p,"B%d:",n2);
   3003       SHA3Update(p, z2, n2);
   3004       break;
   3005     }
   3006   }
   3007 }
   3008 
   3009 /*
   3010 ** Implementation of the sha3_query(SQL,SIZE) function.
   3011 **
   3012 ** This function compiles and runs the SQL statement(s) given in the
   3013 ** argument. The results are hashed using a SIZE-bit SHA3.  The default
   3014 ** size is 256.
   3015 **
   3016 ** The format of the byte stream that is hashed is summarized as follows:
   3017 **
   3018 **       S<n>:<sql>
   3019 **       R
   3020 **       N
   3021 **       I<int>
   3022 **       F<ieee-float>
   3023 **       B<size>:<bytes>
   3024 **       T<size>:<text>
   3025 **
   3026 ** <sql> is the original SQL text for each statement run and <n> is
   3027 ** the size of that text.  The SQL text is UTF-8.  A single R character
   3028 ** occurs before the start of each row.  N means a NULL value.
   3029 ** I mean an 8-byte little-endian integer <int>.  F is a floating point
   3030 ** number with an 8-byte little-endian IEEE floating point value <ieee-float>.
   3031 ** B means blobs of <size> bytes.  T means text rendered as <size>
   3032 ** bytes of UTF-8.  The <n> and <size> values are expressed as an ASCII
   3033 ** text integers.
   3034 **
   3035 ** For each SQL statement in the X input, there is one S segment.  Each
   3036 ** S segment is followed by zero or more R segments, one for each row in the
   3037 ** result set.  After each R, there are one or more N, I, F, B, or T segments,
   3038 ** one for each column in the result set.  Segments are concatentated directly
   3039 ** with no delimiters of any kind.
   3040 */
   3041 static void sha3QueryFunc(
   3042   sqlite3_context *context,
   3043   int argc,
   3044   sqlite3_value **argv
   3045 ){
   3046   sqlite3 *db = sqlite3_context_db_handle(context);
   3047   const char *zSql = (const char*)sqlite3_value_text(argv[0]);
   3048   sqlite3_stmt *pStmt = 0;
   3049   int nCol;                   /* Number of columns in the result set */
   3050   int i;                      /* Loop counter */
   3051   int rc;
   3052   int n;
   3053   const char *z;
   3054   SHA3Context cx;
   3055   int iSize;
   3056 
   3057   if( argc==1 ){
   3058     iSize = 256;
   3059   }else{
   3060     iSize = sqlite3_value_int(argv[1]);
   3061     if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){
   3062       sqlite3_result_error(context, "SHA3 size should be one of: 224 256 "
   3063                                     "384 512", -1);
   3064       return;
   3065     }
   3066   }
   3067   if( zSql==0 ) return;
   3068   SHA3Init(&cx, iSize);
   3069   while( zSql[0] ){
   3070     rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zSql);
   3071     if( rc ){
   3072       char *zMsg = sqlite3_mprintf("error SQL statement [%s]: %s",
   3073                                    zSql, sqlite3_errmsg(db));
   3074       sqlite3_finalize(pStmt);
   3075       sqlite3_result_error(context, zMsg, -1);
   3076       sqlite3_free(zMsg);
   3077       return;
   3078     }
   3079     if( !sqlite3_stmt_readonly(pStmt) ){
   3080       char *zMsg = sqlite3_mprintf("non-query: [%s]", sqlite3_sql(pStmt));
   3081       sqlite3_finalize(pStmt);
   3082       sqlite3_result_error(context, zMsg, -1);
   3083       sqlite3_free(zMsg);
   3084       return;
   3085     }
   3086     nCol = sqlite3_column_count(pStmt);
   3087     z = sqlite3_sql(pStmt);
   3088     if( z ){
   3089       n = (int)strlen(z);
   3090       sha3_step_vformat(&cx,"S%d:",n);
   3091       SHA3Update(&cx,(unsigned char*)z,n);
   3092     }
   3093 
   3094     /* Compute a hash over the result of the query */
   3095     while( SQLITE_ROW==sqlite3_step(pStmt) ){
   3096       SHA3Update(&cx,(const unsigned char*)"R",1);
   3097       for(i=0; i<nCol; i++){
   3098         sha3UpdateFromValue(&cx, sqlite3_column_value(pStmt,i));
   3099       }
   3100     }
   3101     sqlite3_finalize(pStmt);
   3102   }
   3103   sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT);
   3104 }
   3105 
   3106 /*
   3107 ** xStep function for sha3_agg().
   3108 */
   3109 static void sha3AggStep(
   3110   sqlite3_context *context,
   3111   int argc,
   3112   sqlite3_value **argv
   3113 ){
   3114   SHA3Context *p;
   3115   p = (SHA3Context*)sqlite3_aggregate_context(context, sizeof(*p));
   3116   if( p==0 ) return;
   3117   if( p->nRate==0 ){
   3118     int sz = 256;
   3119     if( argc==2 ){
   3120       sz = sqlite3_value_int(argv[1]);
   3121       if( sz!=224 && sz!=384 && sz!=512 ){
   3122         sz = 256;
   3123       }
   3124     }
   3125     SHA3Init(p, sz);
   3126   }
   3127   sha3UpdateFromValue(p, argv[0]);
   3128 }
   3129 
   3130 
   3131 /*
   3132 ** xFinal function for sha3_agg().
   3133 */
   3134 static void sha3AggFinal(sqlite3_context *context){
   3135   SHA3Context *p;
   3136   p = (SHA3Context*)sqlite3_aggregate_context(context, sizeof(*p));
   3137   if( p==0 ) return;
   3138   if( p->iSize ){
   3139     sqlite3_result_blob(context, SHA3Final(p), p->iSize/8, SQLITE_TRANSIENT);
   3140   }
   3141 }
   3142 
   3143 
   3144 
   3145 #ifdef _WIN32
   3146 
   3147 #endif
   3148 int sqlite3_shathree_init(
   3149   sqlite3 *db,
   3150   char **pzErrMsg,
   3151   const sqlite3_api_routines *pApi
   3152 ){
   3153   int rc = SQLITE_OK;
   3154   SQLITE_EXTENSION_INIT2(pApi);
   3155   (void)pzErrMsg;  /* Unused parameter */
   3156   rc = sqlite3_create_function(db, "sha3", 1,
   3157                       SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC,
   3158                       0, sha3Func, 0, 0);
   3159   if( rc==SQLITE_OK ){
   3160     rc = sqlite3_create_function(db, "sha3", 2,
   3161                       SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC,
   3162                       0, sha3Func, 0, 0);
   3163   }
   3164   if( rc==SQLITE_OK ){
   3165     rc = sqlite3_create_function(db, "sha3_agg", 1,
   3166                       SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC,
   3167                       0, 0, sha3AggStep, sha3AggFinal);
   3168   }
   3169   if( rc==SQLITE_OK ){
   3170     rc = sqlite3_create_function(db, "sha3_agg", 2,
   3171                       SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC,
   3172                       0, 0, sha3AggStep, sha3AggFinal);
   3173   }
   3174   if( rc==SQLITE_OK ){
   3175     rc = sqlite3_create_function(db, "sha3_query", 1,
   3176                       SQLITE_UTF8 | SQLITE_DIRECTONLY,
   3177                       0, sha3QueryFunc, 0, 0);
   3178   }
   3179   if( rc==SQLITE_OK ){
   3180     rc = sqlite3_create_function(db, "sha3_query", 2,
   3181                       SQLITE_UTF8 | SQLITE_DIRECTONLY,
   3182                       0, sha3QueryFunc, 0, 0);
   3183   }
   3184   return rc;
   3185 }
   3186 
   3187 /************************* End ../ext/misc/shathree.c ********************/
   3188 /************************* Begin ../ext/misc/sha1.c ******************/
   3189 /*
   3190 ** 2017-01-27
   3191 **
   3192 ** The author disclaims copyright to this source code.  In place of
   3193 ** a legal notice, here is a blessing:
   3194 **
   3195 **    May you do good and not evil.
   3196 **    May you find forgiveness for yourself and forgive others.
   3197 **    May you share freely, never taking more than you give.
   3198 **
   3199 ******************************************************************************
   3200 **
   3201 ** This SQLite extension implements functions that compute SHA1 hashes.
   3202 ** Two SQL functions are implemented:
   3203 **
   3204 **     sha1(X)
   3205 **     sha1_query(Y)
   3206 **
   3207 ** The sha1(X) function computes the SHA1 hash of the input X, or NULL if
   3208 ** X is NULL.
   3209 **
   3210 ** The sha1_query(Y) function evalutes all queries in the SQL statements of Y
   3211 ** and returns a hash of their results.
   3212 */
   3213 /* #include "sqlite3ext.h" */
   3214 SQLITE_EXTENSION_INIT1
   3215 #include <assert.h>
   3216 #include <string.h>
   3217 #include <stdarg.h>
   3218 
   3219 /******************************************************************************
   3220 ** The Hash Engine
   3221 */
   3222 /* Context for the SHA1 hash */
   3223 typedef struct SHA1Context SHA1Context;
   3224 struct SHA1Context {
   3225   unsigned int state[5];
   3226   unsigned int count[2];
   3227   unsigned char buffer[64];
   3228 };
   3229 
   3230 #define SHA_ROT(x,l,r) ((x) << (l) | (x) >> (r))
   3231 #define rol(x,k) SHA_ROT(x,k,32-(k))
   3232 #define ror(x,k) SHA_ROT(x,32-(k),k)
   3233 
   3234 #define blk0le(i) (block[i] = (ror(block[i],8)&0xFF00FF00) \
   3235     |(rol(block[i],8)&0x00FF00FF))
   3236 #define blk0be(i) block[i]
   3237 #define blk(i) (block[i&15] = rol(block[(i+13)&15]^block[(i+8)&15] \
   3238     ^block[(i+2)&15]^block[i&15],1))
   3239 
   3240 /*
   3241  * (R0+R1), R2, R3, R4 are the different operations (rounds) used in SHA1
   3242  *
   3243  * Rl0() for little-endian and Rb0() for big-endian.  Endianness is
   3244  * determined at run-time.
   3245  */
   3246 #define Rl0(v,w,x,y,z,i) \
   3247     z+=((w&(x^y))^y)+blk0le(i)+0x5A827999+rol(v,5);w=ror(w,2);
   3248 #define Rb0(v,w,x,y,z,i) \
   3249     z+=((w&(x^y))^y)+blk0be(i)+0x5A827999+rol(v,5);w=ror(w,2);
   3250 #define R1(v,w,x,y,z,i) \
   3251     z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=ror(w,2);
   3252 #define R2(v,w,x,y,z,i) \
   3253     z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=ror(w,2);
   3254 #define R3(v,w,x,y,z,i) \
   3255     z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=ror(w,2);
   3256 #define R4(v,w,x,y,z,i) \
   3257     z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=ror(w,2);
   3258 
   3259 /*
   3260  * Hash a single 512-bit block. This is the core of the algorithm.
   3261  */
   3262 static void SHA1Transform(unsigned int state[5], const unsigned char buffer[64]){
   3263   unsigned int qq[5]; /* a, b, c, d, e; */
   3264   static int one = 1;
   3265   unsigned int block[16];
   3266   memcpy(block, buffer, 64);
   3267   memcpy(qq,state,5*sizeof(unsigned int));
   3268 
   3269 #define a qq[0]
   3270 #define b qq[1]
   3271 #define c qq[2]
   3272 #define d qq[3]
   3273 #define e qq[4]
   3274 
   3275   /* Copy p->state[] to working vars */
   3276   /*
   3277   a = state[0];
   3278   b = state[1];
   3279   c = state[2];
   3280   d = state[3];
   3281   e = state[4];
   3282   */
   3283 
   3284   /* 4 rounds of 20 operations each. Loop unrolled. */
   3285   if( 1 == *(unsigned char*)&one ){
   3286     Rl0(a,b,c,d,e, 0); Rl0(e,a,b,c,d, 1); Rl0(d,e,a,b,c, 2); Rl0(c,d,e,a,b, 3);
   3287     Rl0(b,c,d,e,a, 4); Rl0(a,b,c,d,e, 5); Rl0(e,a,b,c,d, 6); Rl0(d,e,a,b,c, 7);
   3288     Rl0(c,d,e,a,b, 8); Rl0(b,c,d,e,a, 9); Rl0(a,b,c,d,e,10); Rl0(e,a,b,c,d,11);
   3289     Rl0(d,e,a,b,c,12); Rl0(c,d,e,a,b,13); Rl0(b,c,d,e,a,14); Rl0(a,b,c,d,e,15);
   3290   }else{
   3291     Rb0(a,b,c,d,e, 0); Rb0(e,a,b,c,d, 1); Rb0(d,e,a,b,c, 2); Rb0(c,d,e,a,b, 3);
   3292     Rb0(b,c,d,e,a, 4); Rb0(a,b,c,d,e, 5); Rb0(e,a,b,c,d, 6); Rb0(d,e,a,b,c, 7);
   3293     Rb0(c,d,e,a,b, 8); Rb0(b,c,d,e,a, 9); Rb0(a,b,c,d,e,10); Rb0(e,a,b,c,d,11);
   3294     Rb0(d,e,a,b,c,12); Rb0(c,d,e,a,b,13); Rb0(b,c,d,e,a,14); Rb0(a,b,c,d,e,15);
   3295   }
   3296   R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19);
   3297   R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23);
   3298   R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27);
   3299   R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31);
   3300   R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35);
   3301   R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39);
   3302   R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43);
   3303   R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47);
   3304   R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51);
   3305   R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55);
   3306   R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59);
   3307   R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63);
   3308   R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67);
   3309   R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71);
   3310   R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75);
   3311   R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79);
   3312 
   3313   /* Add the working vars back into context.state[] */
   3314   state[0] += a;
   3315   state[1] += b;
   3316   state[2] += c;
   3317   state[3] += d;
   3318   state[4] += e;
   3319 
   3320 #undef a
   3321 #undef b
   3322 #undef c
   3323 #undef d
   3324 #undef e
   3325 }
   3326 
   3327 
   3328 /* Initialize a SHA1 context */
   3329 static void hash_init(SHA1Context *p){
   3330   /* SHA1 initialization constants */
   3331   p->state[0] = 0x67452301;
   3332   p->state[1] = 0xEFCDAB89;
   3333   p->state[2] = 0x98BADCFE;
   3334   p->state[3] = 0x10325476;
   3335   p->state[4] = 0xC3D2E1F0;
   3336   p->count[0] = p->count[1] = 0;
   3337 }
   3338 
   3339 /* Add new content to the SHA1 hash */
   3340 static void hash_step(
   3341   SHA1Context *p,                 /* Add content to this context */
   3342   const unsigned char *data,      /* Data to be added */
   3343   unsigned int len                /* Number of bytes in data */
   3344 ){
   3345   unsigned int i, j;
   3346 
   3347   j = p->count[0];
   3348   if( (p->count[0] += len << 3) < j ){
   3349     p->count[1] += (len>>29)+1;
   3350   }
   3351   j = (j >> 3) & 63;
   3352   if( (j + len) > 63 ){
   3353     (void)memcpy(&p->buffer[j], data, (i = 64-j));
   3354     SHA1Transform(p->state, p->buffer);
   3355     for(; i + 63 < len; i += 64){
   3356       SHA1Transform(p->state, &data[i]);
   3357     }
   3358     j = 0;
   3359   }else{
   3360     i = 0;
   3361   }
   3362   (void)memcpy(&p->buffer[j], &data[i], len - i);
   3363 }
   3364 
   3365 /* Compute a string using sqlite3_vsnprintf() and hash it */
   3366 static void hash_step_vformat(
   3367   SHA1Context *p,                 /* Add content to this context */
   3368   const char *zFormat,
   3369   ...
   3370 ){
   3371   va_list ap;
   3372   int n;
   3373   char zBuf[50];
   3374   va_start(ap, zFormat);
   3375   sqlite3_vsnprintf(sizeof(zBuf),zBuf,zFormat,ap);
   3376   va_end(ap);
   3377   n = (int)strlen(zBuf);
   3378   hash_step(p, (unsigned char*)zBuf, n);
   3379 }
   3380 
   3381 
   3382 /* Add padding and compute the message digest.  Render the
   3383 ** message digest as lower-case hexadecimal and put it into
   3384 ** zOut[].  zOut[] must be at least 41 bytes long. */
   3385 static void hash_finish(
   3386   SHA1Context *p,           /* The SHA1 context to finish and render */
   3387   char *zOut,               /* Store hex or binary hash here */
   3388   int bAsBinary             /* 1 for binary hash, 0 for hex hash */
   3389 ){
   3390   unsigned int i;
   3391   unsigned char finalcount[8];
   3392   unsigned char digest[20];
   3393   static const char zEncode[] = "0123456789abcdef";
   3394 
   3395   for (i = 0; i < 8; i++){
   3396     finalcount[i] = (unsigned char)((p->count[(i >= 4 ? 0 : 1)]
   3397        >> ((3-(i & 3)) * 8) ) & 255); /* Endian independent */
   3398   }
   3399   hash_step(p, (const unsigned char *)"\200", 1);
   3400   while ((p->count[0] & 504) != 448){
   3401     hash_step(p, (const unsigned char *)"\0", 1);
   3402   }
   3403   hash_step(p, finalcount, 8);  /* Should cause a SHA1Transform() */
   3404   for (i = 0; i < 20; i++){
   3405     digest[i] = (unsigned char)((p->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255);
   3406   }
   3407   if( bAsBinary ){
   3408     memcpy(zOut, digest, 20);
   3409   }else{
   3410     for(i=0; i<20; i++){
   3411       zOut[i*2] = zEncode[(digest[i]>>4)&0xf];
   3412       zOut[i*2+1] = zEncode[digest[i] & 0xf];
   3413     }
   3414     zOut[i*2]= 0;
   3415   }
   3416 }
   3417 /* End of the hashing logic
   3418 *****************************************************************************/
   3419 
   3420 /*
   3421 ** Implementation of the sha1(X) function.
   3422 **
   3423 ** Return a lower-case hexadecimal rendering of the SHA1 hash of the
   3424 ** argument X.  If X is a BLOB, it is hashed as is.  For all other
   3425 ** types of input, X is converted into a UTF-8 string and the string
   3426 ** is hash without the trailing 0x00 terminator.  The hash of a NULL
   3427 ** value is NULL.
   3428 */
   3429 static void sha1Func(
   3430   sqlite3_context *context,
   3431   int argc,
   3432   sqlite3_value **argv
   3433 ){
   3434   SHA1Context cx;
   3435   int eType = sqlite3_value_type(argv[0]);
   3436   int nByte = sqlite3_value_bytes(argv[0]);
   3437   char zOut[44];
   3438 
   3439   assert( argc==1 );
   3440   if( eType==SQLITE_NULL ) return;
   3441   hash_init(&cx);
   3442   if( eType==SQLITE_BLOB ){
   3443     hash_step(&cx, sqlite3_value_blob(argv[0]), nByte);
   3444   }else{
   3445     hash_step(&cx, sqlite3_value_text(argv[0]), nByte);
   3446   }
   3447   if( sqlite3_user_data(context)!=0 ){
   3448     hash_finish(&cx, zOut, 1);
   3449     sqlite3_result_blob(context, zOut, 20, SQLITE_TRANSIENT);
   3450   }else{
   3451     hash_finish(&cx, zOut, 0);
   3452     sqlite3_result_blob(context, zOut, 40, SQLITE_TRANSIENT);
   3453   }
   3454 }
   3455 
   3456 /*
   3457 ** Implementation of the sha1_query(SQL) function.
   3458 **
   3459 ** This function compiles and runs the SQL statement(s) given in the
   3460 ** argument. The results are hashed using SHA1 and that hash is returned.
   3461 **
   3462 ** The original SQL text is included as part of the hash.
   3463 **
   3464 ** The hash is not just a concatenation of the outputs.  Each query
   3465 ** is delimited and each row and value within the query is delimited,
   3466 ** with all values being marked with their datatypes.
   3467 */
   3468 static void sha1QueryFunc(
   3469   sqlite3_context *context,
   3470   int argc,
   3471   sqlite3_value **argv
   3472 ){
   3473   sqlite3 *db = sqlite3_context_db_handle(context);
   3474   const char *zSql = (const char*)sqlite3_value_text(argv[0]);
   3475   sqlite3_stmt *pStmt = 0;
   3476   int nCol;                   /* Number of columns in the result set */
   3477   int i;                      /* Loop counter */
   3478   int rc;
   3479   int n;
   3480   const char *z;
   3481   SHA1Context cx;
   3482   char zOut[44];
   3483 
   3484   assert( argc==1 );
   3485   if( zSql==0 ) return;
   3486   hash_init(&cx);
   3487   while( zSql[0] ){
   3488     rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zSql);
   3489     if( rc ){
   3490       char *zMsg = sqlite3_mprintf("error SQL statement [%s]: %s",
   3491                                    zSql, sqlite3_errmsg(db));
   3492       sqlite3_finalize(pStmt);
   3493       sqlite3_result_error(context, zMsg, -1);
   3494       sqlite3_free(zMsg);
   3495       return;
   3496     }
   3497     if( !sqlite3_stmt_readonly(pStmt) ){
   3498       char *zMsg = sqlite3_mprintf("non-query: [%s]", sqlite3_sql(pStmt));
   3499       sqlite3_finalize(pStmt);
   3500       sqlite3_result_error(context, zMsg, -1);
   3501       sqlite3_free(zMsg);
   3502       return;
   3503     }
   3504     nCol = sqlite3_column_count(pStmt);
   3505     z = sqlite3_sql(pStmt);
   3506     n = (int)strlen(z);
   3507     hash_step_vformat(&cx,"S%d:",n);
   3508     hash_step(&cx,(unsigned char*)z,n);
   3509 
   3510     /* Compute a hash over the result of the query */
   3511     while( SQLITE_ROW==sqlite3_step(pStmt) ){
   3512       hash_step(&cx,(const unsigned char*)"R",1);
   3513       for(i=0; i<nCol; i++){
   3514         switch( sqlite3_column_type(pStmt,i) ){
   3515           case SQLITE_NULL: {
   3516             hash_step(&cx, (const unsigned char*)"N",1);
   3517             break;
   3518           }
   3519           case SQLITE_INTEGER: {
   3520             sqlite3_uint64 u;
   3521             int j;
   3522             unsigned char x[9];
   3523             sqlite3_int64 v = sqlite3_column_int64(pStmt,i);
   3524             memcpy(&u, &v, 8);
   3525             for(j=8; j>=1; j--){
   3526               x[j] = u & 0xff;
   3527               u >>= 8;
   3528             }
   3529             x[0] = 'I';
   3530             hash_step(&cx, x, 9);
   3531             break;
   3532           }
   3533           case SQLITE_FLOAT: {
   3534             sqlite3_uint64 u;
   3535             int j;
   3536             unsigned char x[9];
   3537             double r = sqlite3_column_double(pStmt,i);
   3538             memcpy(&u, &r, 8);
   3539             for(j=8; j>=1; j--){
   3540               x[j] = u & 0xff;
   3541               u >>= 8;
   3542             }
   3543             x[0] = 'F';
   3544             hash_step(&cx,x,9);
   3545             break;
   3546           }
   3547           case SQLITE_TEXT: {
   3548             int n2 = sqlite3_column_bytes(pStmt, i);
   3549             const unsigned char *z2 = sqlite3_column_text(pStmt, i);
   3550             hash_step_vformat(&cx,"T%d:",n2);
   3551             hash_step(&cx, z2, n2);
   3552             break;
   3553           }
   3554           case SQLITE_BLOB: {
   3555             int n2 = sqlite3_column_bytes(pStmt, i);
   3556             const unsigned char *z2 = sqlite3_column_blob(pStmt, i);
   3557             hash_step_vformat(&cx,"B%d:",n2);
   3558             hash_step(&cx, z2, n2);
   3559             break;
   3560           }
   3561         }
   3562       }
   3563     }
   3564     sqlite3_finalize(pStmt);
   3565   }
   3566   hash_finish(&cx, zOut, 0);
   3567   sqlite3_result_text(context, zOut, 40, SQLITE_TRANSIENT);
   3568 }
   3569 
   3570 
   3571 #ifdef _WIN32
   3572 
   3573 #endif
   3574 int sqlite3_sha_init(
   3575   sqlite3 *db,
   3576   char **pzErrMsg,
   3577   const sqlite3_api_routines *pApi
   3578 ){
   3579   int rc = SQLITE_OK;
   3580   static int one = 1;
   3581   SQLITE_EXTENSION_INIT2(pApi);
   3582   (void)pzErrMsg;  /* Unused parameter */
   3583   rc = sqlite3_create_function(db, "sha1", 1, 
   3584                        SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC,
   3585                                 0, sha1Func, 0, 0);
   3586   if( rc==SQLITE_OK ){
   3587     rc = sqlite3_create_function(db, "sha1b", 1, 
   3588                        SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC,
   3589                           (void*)&one, sha1Func, 0, 0);
   3590   }
   3591   if( rc==SQLITE_OK ){
   3592     rc = sqlite3_create_function(db, "sha1_query", 1, 
   3593                                  SQLITE_UTF8|SQLITE_DIRECTONLY, 0,
   3594                                  sha1QueryFunc, 0, 0);
   3595   }
   3596   return rc;
   3597 }
   3598 
   3599 /************************* End ../ext/misc/sha1.c ********************/
   3600 /************************* Begin ../ext/misc/uint.c ******************/
   3601 /*
   3602 ** 2020-04-14
   3603 **
   3604 ** The author disclaims copyright to this source code.  In place of
   3605 ** a legal notice, here is a blessing:
   3606 **
   3607 **    May you do good and not evil.
   3608 **    May you find forgiveness for yourself and forgive others.
   3609 **    May you share freely, never taking more than you give.
   3610 **
   3611 ******************************************************************************
   3612 **
   3613 ** This SQLite extension implements the UINT collating sequence.
   3614 **
   3615 ** UINT works like BINARY for text, except that embedded strings
   3616 ** of digits compare in numeric order.
   3617 **
   3618 **     *   Leading zeros are handled properly, in the sense that
   3619 **         they do not mess of the magnitude comparison of embedded
   3620 **         strings of digits.  "x00123y" is equal to "x123y".
   3621 **
   3622 **     *   Only unsigned integers are recognized.  Plus and minus
   3623 **         signs are ignored.  Decimal points and exponential notation
   3624 **         are ignored.
   3625 **
   3626 **     *   Embedded integers can be of arbitrary length.  Comparison
   3627 **         is *not* limited integers that can be expressed as a
   3628 **         64-bit machine integer.
   3629 */
   3630 /* #include "sqlite3ext.h" */
   3631 SQLITE_EXTENSION_INIT1
   3632 #include <assert.h>
   3633 #include <string.h>
   3634 #include <ctype.h>
   3635 
   3636 /*
   3637 ** Compare text in lexicographic order, except strings of digits
   3638 ** compare in numeric order.
   3639 */
   3640 static int uintCollFunc(
   3641   void *notUsed,
   3642   int nKey1, const void *pKey1,
   3643   int nKey2, const void *pKey2
   3644 ){
   3645   const unsigned char *zA = (const unsigned char*)pKey1;
   3646   const unsigned char *zB = (const unsigned char*)pKey2;
   3647   int i=0, j=0, x;
   3648   (void)notUsed;
   3649   while( i<nKey1 && j<nKey2 ){
   3650     x = zA[i] - zB[j];
   3651     if( isdigit(zA[i]) ){
   3652       int k;
   3653       if( !isdigit(zB[j]) ) return x;
   3654       while( i<nKey1 && zA[i]=='0' ){ i++; }
   3655       while( j<nKey2 && zB[j]=='0' ){ j++; }
   3656       k = 0;
   3657       while( i+k<nKey1 && isdigit(zA[i+k])
   3658              && j+k<nKey2 && isdigit(zB[j+k]) ){
   3659         k++;
   3660       }
   3661       if( i+k<nKey1 && isdigit(zA[i+k]) ){
   3662         return +1;
   3663       }else if( j+k<nKey2 && isdigit(zB[j+k]) ){
   3664         return -1;
   3665       }else{
   3666         x = memcmp(zA+i, zB+j, k);
   3667         if( x ) return x;
   3668         i += k;
   3669         j += k;
   3670       }
   3671     }else if( x ){
   3672       return x;
   3673     }else{
   3674       i++;
   3675       j++;
   3676     }
   3677   }
   3678   return (nKey1 - i) - (nKey2 - j);
   3679 }
   3680 
   3681 #ifdef _WIN32
   3682 
   3683 #endif
   3684 int sqlite3_uint_init(
   3685   sqlite3 *db, 
   3686   char **pzErrMsg, 
   3687   const sqlite3_api_routines *pApi
   3688 ){
   3689   SQLITE_EXTENSION_INIT2(pApi);
   3690   (void)pzErrMsg;  /* Unused parameter */
   3691   return sqlite3_create_collation(db, "uint", SQLITE_UTF8, 0, uintCollFunc);
   3692 }
   3693 
   3694 /************************* End ../ext/misc/uint.c ********************/
   3695 /************************* Begin ../ext/misc/decimal.c ******************/
   3696 /*
   3697 ** 2020-06-22
   3698 **
   3699 ** The author disclaims copyright to this source code.  In place of
   3700 ** a legal notice, here is a blessing:
   3701 **
   3702 **    May you do good and not evil.
   3703 **    May you find forgiveness for yourself and forgive others.
   3704 **    May you share freely, never taking more than you give.
   3705 **
   3706 ******************************************************************************
   3707 **
   3708 ** Routines to implement arbitrary-precision decimal math.
   3709 **
   3710 ** The focus here is on simplicity and correctness, not performance.
   3711 */
   3712 /* #include "sqlite3ext.h" */
   3713 SQLITE_EXTENSION_INIT1
   3714 #include <assert.h>
   3715 #include <string.h>
   3716 #include <ctype.h>
   3717 #include <stdlib.h>
   3718 
   3719 /* Mark a function parameter as unused, to suppress nuisance compiler
   3720 ** warnings. */
   3721 #ifndef UNUSED_PARAMETER
   3722 # define UNUSED_PARAMETER(X)  (void)(X)
   3723 #endif
   3724 
   3725 #ifndef IsSpace
   3726 #define IsSpace(X)  isspace((unsigned char)X)
   3727 #endif
   3728 
   3729 /* A decimal object */
   3730 typedef struct Decimal Decimal;
   3731 struct Decimal {
   3732   char sign;        /* 0 for positive, 1 for negative */
   3733   char oom;         /* True if an OOM is encountered */
   3734   char isNull;      /* True if holds a NULL rather than a number */
   3735   char isInit;      /* True upon initialization */
   3736   int nDigit;       /* Total number of digits */
   3737   int nFrac;        /* Number of digits to the right of the decimal point */
   3738   signed char *a;   /* Array of digits.  Most significant first. */
   3739 };
   3740 
   3741 /*
   3742 ** Release memory held by a Decimal, but do not free the object itself.
   3743 */
   3744 static void decimal_clear(Decimal *p){
   3745   sqlite3_free(p->a);
   3746 }
   3747 
   3748 /*
   3749 ** Destroy a Decimal object
   3750 */
   3751 static void decimal_free(Decimal *p){
   3752   if( p ){
   3753     decimal_clear(p);
   3754     sqlite3_free(p);
   3755   }
   3756 }
   3757 
   3758 /*
   3759 ** Allocate a new Decimal object initialized to the text in zIn[].
   3760 ** Return NULL if any kind of error occurs.
   3761 */
   3762 static Decimal *decimalNewFromText(const char *zIn, int n){
   3763   Decimal *p = 0;
   3764   int i;
   3765   int iExp = 0;
   3766 
   3767   p = sqlite3_malloc( sizeof(*p) );
   3768   if( p==0 ) goto new_from_text_failed;
   3769   p->sign = 0;
   3770   p->oom = 0;
   3771   p->isInit = 1;
   3772   p->isNull = 0;
   3773   p->nDigit = 0;
   3774   p->nFrac = 0;
   3775   p->a = sqlite3_malloc64( n+1 );
   3776   if( p->a==0 ) goto new_from_text_failed;
   3777   for(i=0; IsSpace(zIn[i]); i++){}
   3778   if( zIn[i]=='-' ){
   3779     p->sign = 1;
   3780     i++;
   3781   }else if( zIn[i]=='+' ){
   3782     i++;
   3783   }
   3784   while( i<n && zIn[i]=='0' ) i++;
   3785   while( i<n ){
   3786     char c = zIn[i];
   3787     if( c>='0' && c<='9' ){
   3788       p->a[p->nDigit++] = c - '0';
   3789     }else if( c=='.' ){
   3790       p->nFrac = p->nDigit + 1;
   3791     }else if( c=='e' || c=='E' ){
   3792       int j = i+1;
   3793       int neg = 0;
   3794       if( j>=n ) break;
   3795       if( zIn[j]=='-' ){
   3796         neg = 1;
   3797         j++;
   3798       }else if( zIn[j]=='+' ){
   3799         j++;
   3800       }
   3801       while( j<n && iExp<1000000 ){
   3802         if( zIn[j]>='0' && zIn[j]<='9' ){
   3803           iExp = iExp*10 + zIn[j] - '0';
   3804         }
   3805         j++;
   3806       }
   3807       if( neg ) iExp = -iExp;
   3808       break;
   3809     }
   3810     i++;
   3811   }
   3812   if( p->nFrac ){
   3813     p->nFrac = p->nDigit - (p->nFrac - 1);
   3814   }
   3815   if( iExp>0 ){
   3816     if( p->nFrac>0 ){
   3817       if( iExp<=p->nFrac ){
   3818         p->nFrac -= iExp;
   3819         iExp = 0;
   3820       }else{
   3821         iExp -= p->nFrac;
   3822         p->nFrac = 0;
   3823       }
   3824     }
   3825     if( iExp>0 ){   
   3826       p->a = sqlite3_realloc64(p->a, p->nDigit + iExp + 1 );
   3827       if( p->a==0 ) goto new_from_text_failed;
   3828       memset(p->a+p->nDigit, 0, iExp);
   3829       p->nDigit += iExp;
   3830     }
   3831   }else if( iExp<0 ){
   3832     int nExtra;
   3833     iExp = -iExp;
   3834     nExtra = p->nDigit - p->nFrac - 1;
   3835     if( nExtra ){
   3836       if( nExtra>=iExp ){
   3837         p->nFrac += iExp;
   3838         iExp  = 0;
   3839       }else{
   3840         iExp -= nExtra;
   3841         p->nFrac = p->nDigit - 1;
   3842       }
   3843     }
   3844     if( iExp>0 ){
   3845       p->a = sqlite3_realloc64(p->a, p->nDigit + iExp + 1 );
   3846       if( p->a==0 ) goto new_from_text_failed;
   3847       memmove(p->a+iExp, p->a, p->nDigit);
   3848       memset(p->a, 0, iExp);
   3849       p->nDigit += iExp;
   3850       p->nFrac += iExp;
   3851     }
   3852   }
   3853   return p;
   3854 
   3855 new_from_text_failed:
   3856   if( p ){
   3857     if( p->a ) sqlite3_free(p->a);
   3858     sqlite3_free(p);
   3859   }
   3860   return 0;
   3861 }
   3862 
   3863 /* Forward reference */
   3864 static Decimal *decimalFromDouble(double);
   3865 
   3866 /*
   3867 ** Allocate a new Decimal object from an sqlite3_value.  Return a pointer
   3868 ** to the new object, or NULL if there is an error.  If the pCtx argument
   3869 ** is not NULL, then errors are reported on it as well.
   3870 **
   3871 ** If the pIn argument is SQLITE_TEXT or SQLITE_INTEGER, it is converted
   3872 ** directly into a Decimal.  For SQLITE_FLOAT or for SQLITE_BLOB of length
   3873 ** 8 bytes, the resulting double value is expanded into its decimal equivalent.
   3874 ** If pIn is NULL or if it is a BLOB that is not exactly 8 bytes in length,
   3875 ** then NULL is returned.
   3876 */
   3877 static Decimal *decimal_new(
   3878   sqlite3_context *pCtx,       /* Report error here, if not null */
   3879   sqlite3_value *pIn,          /* Construct the decimal object from this */
   3880   int bTextOnly                /* Always interpret pIn as text if true */
   3881 ){
   3882   Decimal *p = 0;
   3883   int eType = sqlite3_value_type(pIn);
   3884   if( bTextOnly && (eType==SQLITE_FLOAT || eType==SQLITE_BLOB) ){
   3885     eType = SQLITE_TEXT;
   3886   }
   3887   switch( eType ){
   3888     case SQLITE_TEXT:
   3889     case SQLITE_INTEGER: {
   3890       const char *zIn = (const char*)sqlite3_value_text(pIn);
   3891       int n = sqlite3_value_bytes(pIn);
   3892       p = decimalNewFromText(zIn, n);
   3893       if( p==0 ) goto new_failed;
   3894       break;
   3895     }
   3896 
   3897     case SQLITE_FLOAT: {
   3898       p = decimalFromDouble(sqlite3_value_double(pIn));
   3899       break;
   3900     }
   3901 
   3902     case SQLITE_BLOB: {
   3903       const unsigned char *x;
   3904       unsigned int i;
   3905       sqlite3_uint64 v = 0;
   3906       double r;
   3907 
   3908       if( sqlite3_value_bytes(pIn)!=sizeof(r) ) break;
   3909       x = sqlite3_value_blob(pIn);
   3910       for(i=0; i<sizeof(r); i++){
   3911         v = (v<<8) | x[i];
   3912       }
   3913       memcpy(&r, &v, sizeof(r));
   3914       p = decimalFromDouble(r);
   3915       break;
   3916     }
   3917 
   3918     case SQLITE_NULL: {
   3919       break;
   3920     }
   3921   }
   3922   return p;
   3923 
   3924 new_failed:
   3925   if( pCtx ) sqlite3_result_error_nomem(pCtx);
   3926   sqlite3_free(p);
   3927   return 0;
   3928 }
   3929 
   3930 /*
   3931 ** Make the given Decimal the result.
   3932 */
   3933 static void decimal_result(sqlite3_context *pCtx, Decimal *p){
   3934   char *z;
   3935   int i, j;
   3936   int n;
   3937   if( p==0 || p->oom ){
   3938     sqlite3_result_error_nomem(pCtx);
   3939     return;
   3940   }
   3941   if( p->isNull ){
   3942     sqlite3_result_null(pCtx);
   3943     return;
   3944   }
   3945   z = sqlite3_malloc( p->nDigit+4 );
   3946   if( z==0 ){
   3947     sqlite3_result_error_nomem(pCtx);
   3948     return;
   3949   }
   3950   i = 0;
   3951   if( p->nDigit==0 || (p->nDigit==1 && p->a[0]==0) ){
   3952     p->sign = 0;
   3953   }
   3954   if( p->sign ){
   3955     z[0] = '-';
   3956     i = 1;
   3957   }
   3958   n = p->nDigit - p->nFrac;
   3959   if( n<=0 ){
   3960     z[i++] = '0';
   3961   }
   3962   j = 0;
   3963   while( n>1 && p->a[j]==0 ){
   3964     j++;
   3965     n--;
   3966   }
   3967   while( n>0  ){
   3968     z[i++] = p->a[j] + '0';
   3969     j++;
   3970     n--;
   3971   }
   3972   if( p->nFrac ){
   3973     z[i++] = '.';
   3974     do{
   3975       z[i++] = p->a[j] + '0';
   3976       j++;
   3977     }while( j<p->nDigit );
   3978   }
   3979   z[i] = 0;
   3980   sqlite3_result_text(pCtx, z, i, sqlite3_free);
   3981 }
   3982 
   3983 /*
   3984 ** Make the given Decimal the result in an format similar to  '%+#e'.
   3985 ** In other words, show exponential notation with leading and trailing
   3986 ** zeros omitted.
   3987 */
   3988 static void decimal_result_sci(sqlite3_context *pCtx, Decimal *p){
   3989   char *z;       /* The output buffer */
   3990   int i;         /* Loop counter */
   3991   int nZero;     /* Number of leading zeros */
   3992   int nDigit;    /* Number of digits not counting trailing zeros */
   3993   int nFrac;     /* Digits to the right of the decimal point */
   3994   int exp;       /* Exponent value */
   3995   signed char zero;     /* Zero value */
   3996   signed char *a;       /* Array of digits */
   3997 
   3998   if( p==0 || p->oom ){
   3999     sqlite3_result_error_nomem(pCtx);
   4000     return;
   4001   }
   4002   if( p->isNull ){
   4003     sqlite3_result_null(pCtx);
   4004     return;
   4005   }
   4006   for(nDigit=p->nDigit; nDigit>0 && p->a[nDigit-1]==0; nDigit--){}
   4007   for(nZero=0; nZero<nDigit && p->a[nZero]==0; nZero++){}
   4008   nFrac = p->nFrac + (nDigit - p->nDigit);
   4009   nDigit -= nZero;
   4010   z = sqlite3_malloc( nDigit+20 );
   4011   if( z==0 ){
   4012     sqlite3_result_error_nomem(pCtx);
   4013     return;
   4014   }
   4015   if( nDigit==0 ){
   4016     zero = 0;
   4017     a = &zero;
   4018     nDigit = 1;
   4019     nFrac = 0;
   4020   }else{
   4021     a = &p->a[nZero];
   4022   }
   4023   if( p->sign && nDigit>0 ){
   4024     z[0] = '-';
   4025   }else{
   4026     z[0] = '+';
   4027   }
   4028   z[1] = a[0]+'0';
   4029   z[2] = '.';
   4030   if( nDigit==1 ){
   4031     z[3] = '0';
   4032     i = 4;
   4033   }else{
   4034     for(i=1; i<nDigit; i++){
   4035       z[2+i] = a[i]+'0';
   4036     }
   4037     i = nDigit+2;
   4038   }
   4039   exp = nDigit - nFrac - 1;
   4040   sqlite3_snprintf(nDigit+20-i, &z[i], "e%+03d", exp);
   4041   sqlite3_result_text(pCtx, z, -1, sqlite3_free);
   4042 }
   4043 
   4044 /*
   4045 ** Compare to Decimal objects.  Return negative, 0, or positive if the
   4046 ** first object is less than, equal to, or greater than the second.
   4047 **
   4048 ** Preconditions for this routine:
   4049 **
   4050 **    pA!=0
   4051 **    pA->isNull==0
   4052 **    pB!=0
   4053 **    pB->isNull==0
   4054 */
   4055 static int decimal_cmp(const Decimal *pA, const Decimal *pB){
   4056   int nASig, nBSig, rc, n;
   4057   if( pA->sign!=pB->sign ){
   4058     return pA->sign ? -1 : +1;
   4059   }
   4060   if( pA->sign ){
   4061     const Decimal *pTemp = pA;
   4062     pA = pB;
   4063     pB = pTemp;
   4064   }
   4065   nASig = pA->nDigit - pA->nFrac;
   4066   nBSig = pB->nDigit - pB->nFrac;
   4067   if( nASig!=nBSig ){
   4068     return nASig - nBSig;
   4069   }
   4070   n = pA->nDigit;
   4071   if( n>pB->nDigit ) n = pB->nDigit;
   4072   rc = memcmp(pA->a, pB->a, n);
   4073   if( rc==0 ){
   4074     rc = pA->nDigit - pB->nDigit;
   4075   }
   4076   return rc;
   4077 }
   4078 
   4079 /*
   4080 ** SQL Function:   decimal_cmp(X, Y)
   4081 **
   4082 ** Return negative, zero, or positive if X is less then, equal to, or
   4083 ** greater than Y.
   4084 */
   4085 static void decimalCmpFunc(
   4086   sqlite3_context *context,
   4087   int argc,
   4088   sqlite3_value **argv
   4089 ){
   4090   Decimal *pA = 0, *pB = 0;
   4091   int rc;
   4092 
   4093   UNUSED_PARAMETER(argc);
   4094   pA = decimal_new(context, argv[0], 1);
   4095   if( pA==0 || pA->isNull ) goto cmp_done;
   4096   pB = decimal_new(context, argv[1], 1);
   4097   if( pB==0 || pB->isNull ) goto cmp_done;
   4098   rc = decimal_cmp(pA, pB);
   4099   if( rc<0 ) rc = -1;
   4100   else if( rc>0 ) rc = +1;
   4101   sqlite3_result_int(context, rc);
   4102 cmp_done:
   4103   decimal_free(pA);
   4104   decimal_free(pB);
   4105 }
   4106 
   4107 /*
   4108 ** Expand the Decimal so that it has a least nDigit digits and nFrac
   4109 ** digits to the right of the decimal point.
   4110 */
   4111 static void decimal_expand(Decimal *p, int nDigit, int nFrac){
   4112   int nAddSig;
   4113   int nAddFrac;
   4114   if( p==0 ) return;
   4115   nAddFrac = nFrac - p->nFrac;
   4116   nAddSig = (nDigit - p->nDigit) - nAddFrac;
   4117   if( nAddFrac==0 && nAddSig==0 ) return;
   4118   p->a = sqlite3_realloc64(p->a, nDigit+1);
   4119   if( p->a==0 ){
   4120     p->oom = 1;
   4121     return;
   4122   }
   4123   if( nAddSig ){
   4124     memmove(p->a+nAddSig, p->a, p->nDigit);
   4125     memset(p->a, 0, nAddSig);
   4126     p->nDigit += nAddSig;
   4127   }
   4128   if( nAddFrac ){
   4129     memset(p->a+p->nDigit, 0, nAddFrac);
   4130     p->nDigit += nAddFrac;
   4131     p->nFrac += nAddFrac;
   4132   }
   4133 }
   4134 
   4135 /*
   4136 ** Add the value pB into pA.   A := A + B.
   4137 **
   4138 ** Both pA and pB might become denormalized by this routine.
   4139 */
   4140 static void decimal_add(Decimal *pA, Decimal *pB){
   4141   int nSig, nFrac, nDigit;
   4142   int i, rc;
   4143   if( pA==0 ){
   4144     return;
   4145   }
   4146   if( pA->oom || pB==0 || pB->oom ){
   4147     pA->oom = 1;
   4148     return;
   4149   }
   4150   if( pA->isNull || pB->isNull ){
   4151     pA->isNull = 1;
   4152     return;
   4153   }
   4154   nSig = pA->nDigit - pA->nFrac;
   4155   if( nSig && pA->a[0]==0 ) nSig--;
   4156   if( nSig<pB->nDigit-pB->nFrac ){
   4157     nSig = pB->nDigit - pB->nFrac;
   4158   }
   4159   nFrac = pA->nFrac;
   4160   if( nFrac<pB->nFrac ) nFrac = pB->nFrac;
   4161   nDigit = nSig + nFrac + 1;
   4162   decimal_expand(pA, nDigit, nFrac);
   4163   decimal_expand(pB, nDigit, nFrac);
   4164   if( pA->oom || pB->oom ){
   4165     pA->oom = 1;
   4166   }else{
   4167     if( pA->sign==pB->sign ){
   4168       int carry = 0;
   4169       for(i=nDigit-1; i>=0; i--){
   4170         int x = pA->a[i] + pB->a[i] + carry;
   4171         if( x>=10 ){
   4172           carry = 1;
   4173           pA->a[i] = x - 10;
   4174         }else{
   4175           carry = 0;
   4176           pA->a[i] = x;
   4177         }
   4178       }
   4179     }else{
   4180       signed char *aA, *aB;
   4181       int borrow = 0;
   4182       rc = memcmp(pA->a, pB->a, nDigit);
   4183       if( rc<0 ){
   4184         aA = pB->a;
   4185         aB = pA->a;
   4186         pA->sign = !pA->sign;
   4187       }else{
   4188         aA = pA->a;
   4189         aB = pB->a;
   4190       }
   4191       for(i=nDigit-1; i>=0; i--){
   4192         int x = aA[i] - aB[i] - borrow;
   4193         if( x<0 ){
   4194           pA->a[i] = x+10;
   4195           borrow = 1;
   4196         }else{
   4197           pA->a[i] = x;
   4198           borrow = 0;
   4199         }
   4200       }
   4201     }
   4202   }
   4203 }
   4204 
   4205 /*
   4206 ** Multiply A by B.   A := A * B
   4207 **
   4208 ** All significant digits after the decimal point are retained.
   4209 ** Trailing zeros after the decimal point are omitted as long as
   4210 ** the number of digits after the decimal point is no less than
   4211 ** either the number of digits in either input.
   4212 */
   4213 static void decimalMul(Decimal *pA, Decimal *pB){
   4214   signed char *acc = 0;
   4215   int i, j, k;
   4216   int minFrac;
   4217 
   4218   if( pA==0 || pA->oom || pA->isNull
   4219    || pB==0 || pB->oom || pB->isNull 
   4220   ){
   4221     goto mul_end;
   4222   }
   4223   acc = sqlite3_malloc64( pA->nDigit + pB->nDigit + 2 );
   4224   if( acc==0 ){
   4225     pA->oom = 1;
   4226     goto mul_end;
   4227   }
   4228   memset(acc, 0, pA->nDigit + pB->nDigit + 2);
   4229   minFrac = pA->nFrac;
   4230   if( pB->nFrac<minFrac ) minFrac = pB->nFrac;
   4231   for(i=pA->nDigit-1; i>=0; i--){
   4232     signed char f = pA->a[i];
   4233     int carry = 0, x;
   4234     for(j=pB->nDigit-1, k=i+j+3; j>=0; j--, k--){
   4235       x = acc[k] + f*pB->a[j] + carry;
   4236       acc[k] = x%10;
   4237       carry = x/10;
   4238     }
   4239     x = acc[k] + carry;
   4240     acc[k] = x%10;
   4241     acc[k-1] += x/10;
   4242   }
   4243   sqlite3_free(pA->a);
   4244   pA->a = acc;
   4245   acc = 0;
   4246   pA->nDigit += pB->nDigit + 2;
   4247   pA->nFrac += pB->nFrac;
   4248   pA->sign ^= pB->sign;
   4249   while( pA->nFrac>minFrac && pA->a[pA->nDigit-1]==0 ){
   4250     pA->nFrac--;
   4251     pA->nDigit--;
   4252   }
   4253 
   4254 mul_end:
   4255   sqlite3_free(acc);
   4256 }
   4257 
   4258 /*
   4259 ** Create a new Decimal object that contains an integer power of 2.
   4260 */
   4261 static Decimal *decimalPow2(int N){
   4262   Decimal *pA = 0;      /* The result to be returned */
   4263   Decimal *pX = 0;      /* Multiplier */
   4264   if( N<-20000 || N>20000 ) goto pow2_fault;
   4265   pA = decimalNewFromText("1.0", 3);
   4266   if( pA==0 || pA->oom ) goto pow2_fault;
   4267   if( N==0 ) return pA;
   4268   if( N>0 ){
   4269     pX = decimalNewFromText("2.0", 3);
   4270   }else{
   4271     N = -N;
   4272     pX = decimalNewFromText("0.5", 3);
   4273   }
   4274   if( pX==0 || pX->oom ) goto pow2_fault;
   4275   while( 1 /* Exit by break */ ){
   4276     if( N & 1 ){
   4277       decimalMul(pA, pX);
   4278       if( pA->oom ) goto pow2_fault;
   4279     }
   4280     N >>= 1;
   4281     if( N==0 ) break;
   4282     decimalMul(pX, pX);
   4283   }
   4284   decimal_free(pX);
   4285   return pA;
   4286 
   4287 pow2_fault:
   4288   decimal_free(pA);
   4289   decimal_free(pX);
   4290   return 0;
   4291 }
   4292 
   4293 /*
   4294 ** Use an IEEE754 binary64 ("double") to generate a new Decimal object.
   4295 */
   4296 static Decimal *decimalFromDouble(double r){
   4297   sqlite3_int64 m, a;
   4298   int e;
   4299   int isNeg;
   4300   Decimal *pA;
   4301   Decimal *pX;
   4302   char zNum[100];
   4303   if( r<0.0 ){
   4304     isNeg = 1;
   4305     r = -r;
   4306   }else{
   4307     isNeg = 0;
   4308   }
   4309   memcpy(&a,&r,sizeof(a));
   4310   if( a==0 ){
   4311     e = 0;
   4312     m = 0;
   4313   }else{
   4314     e = a>>52;
   4315     m = a & ((((sqlite3_int64)1)<<52)-1);
   4316     if( e==0 ){
   4317       m <<= 1;
   4318     }else{
   4319       m |= ((sqlite3_int64)1)<<52;
   4320     }
   4321     while( e<1075 && m>0 && (m&1)==0 ){
   4322       m >>= 1;
   4323       e++;
   4324     }
   4325     if( isNeg ) m = -m;
   4326     e = e - 1075;
   4327     if( e>971 ){
   4328       return 0;  /* A NaN or an Infinity */
   4329     }
   4330   }
   4331 
   4332   /* At this point m is the integer significand and e is the exponent */
   4333   sqlite3_snprintf(sizeof(zNum), zNum, "%lld", m);
   4334   pA = decimalNewFromText(zNum, (int)strlen(zNum));
   4335   pX = decimalPow2(e);
   4336   decimalMul(pA, pX);
   4337   decimal_free(pX);
   4338   return pA;
   4339 }
   4340 
   4341 /*
   4342 ** SQL Function:   decimal(X)
   4343 ** OR:             decimal_exp(X)
   4344 **
   4345 ** Convert input X into decimal and then back into text.
   4346 **
   4347 ** If X is originally a float, then a full decimal expansion of that floating
   4348 ** point value is done.  Or if X is an 8-byte blob, it is interpreted
   4349 ** as a float and similarly expanded.
   4350 **
   4351 ** The decimal_exp(X) function returns the result in exponential notation.
   4352 ** decimal(X) returns a complete decimal, without the e+NNN at the end.
   4353 */
   4354 static void decimalFunc(
   4355   sqlite3_context *context,
   4356   int argc,
   4357   sqlite3_value **argv
   4358 ){
   4359   Decimal *p =  decimal_new(context, argv[0], 0);
   4360   UNUSED_PARAMETER(argc);
   4361   if( p ){
   4362     if( sqlite3_user_data(context)!=0 ){
   4363       decimal_result_sci(context, p);
   4364     }else{
   4365       decimal_result(context, p);
   4366     }
   4367     decimal_free(p);
   4368   }
   4369 }
   4370 
   4371 /*
   4372 ** Compare text in decimal order.
   4373 */
   4374 static int decimalCollFunc(
   4375   void *notUsed,
   4376   int nKey1, const void *pKey1,
   4377   int nKey2, const void *pKey2
   4378 ){
   4379   const unsigned char *zA = (const unsigned char*)pKey1;
   4380   const unsigned char *zB = (const unsigned char*)pKey2;
   4381   Decimal *pA = decimalNewFromText((const char*)zA, nKey1);
   4382   Decimal *pB = decimalNewFromText((const char*)zB, nKey2);
   4383   int rc;
   4384   UNUSED_PARAMETER(notUsed);
   4385   if( pA==0 || pB==0 ){
   4386     rc = 0;
   4387   }else{
   4388     rc = decimal_cmp(pA, pB);
   4389   }
   4390   decimal_free(pA);
   4391   decimal_free(pB);
   4392   return rc;
   4393 }
   4394 
   4395 
   4396 /*
   4397 ** SQL Function:   decimal_add(X, Y)
   4398 **                 decimal_sub(X, Y)
   4399 **
   4400 ** Return the sum or difference of X and Y.
   4401 */
   4402 static void decimalAddFunc(
   4403   sqlite3_context *context,
   4404   int argc,
   4405   sqlite3_value **argv
   4406 ){
   4407   Decimal *pA = decimal_new(context, argv[0], 1);
   4408   Decimal *pB = decimal_new(context, argv[1], 1);
   4409   UNUSED_PARAMETER(argc);
   4410   decimal_add(pA, pB);
   4411   decimal_result(context, pA);
   4412   decimal_free(pA);
   4413   decimal_free(pB);
   4414 }
   4415 static void decimalSubFunc(
   4416   sqlite3_context *context,
   4417   int argc,
   4418   sqlite3_value **argv
   4419 ){
   4420   Decimal *pA = decimal_new(context, argv[0], 1);
   4421   Decimal *pB = decimal_new(context, argv[1], 1);
   4422   UNUSED_PARAMETER(argc);
   4423   if( pB ){
   4424     pB->sign = !pB->sign;
   4425     decimal_add(pA, pB);
   4426     decimal_result(context, pA);
   4427   }
   4428   decimal_free(pA);
   4429   decimal_free(pB);
   4430 }
   4431 
   4432 /* Aggregate function:   decimal_sum(X)
   4433 **
   4434 ** Works like sum() except that it uses decimal arithmetic for unlimited
   4435 ** precision.
   4436 */
   4437 static void decimalSumStep(
   4438   sqlite3_context *context,
   4439   int argc,
   4440   sqlite3_value **argv
   4441 ){
   4442   Decimal *p;
   4443   Decimal *pArg;
   4444   UNUSED_PARAMETER(argc);
   4445   p = sqlite3_aggregate_context(context, sizeof(*p));
   4446   if( p==0 ) return;
   4447   if( !p->isInit ){
   4448     p->isInit = 1;
   4449     p->a = sqlite3_malloc(2);
   4450     if( p->a==0 ){
   4451       p->oom = 1;
   4452     }else{
   4453       p->a[0] = 0;
   4454     }
   4455     p->nDigit = 1;
   4456     p->nFrac = 0;
   4457   }
   4458   if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
   4459   pArg = decimal_new(context, argv[0], 1);
   4460   decimal_add(p, pArg);
   4461   decimal_free(pArg);
   4462 }
   4463 static void decimalSumInverse(
   4464   sqlite3_context *context,
   4465   int argc,
   4466   sqlite3_value **argv
   4467 ){
   4468   Decimal *p;
   4469   Decimal *pArg;
   4470   UNUSED_PARAMETER(argc);
   4471   p = sqlite3_aggregate_context(context, sizeof(*p));
   4472   if( p==0 ) return;
   4473   if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
   4474   pArg = decimal_new(context, argv[0], 1);
   4475   if( pArg ) pArg->sign = !pArg->sign;
   4476   decimal_add(p, pArg);
   4477   decimal_free(pArg);
   4478 }
   4479 static void decimalSumValue(sqlite3_context *context){
   4480   Decimal *p = sqlite3_aggregate_context(context, 0);
   4481   if( p==0 ) return;
   4482   decimal_result(context, p);
   4483 }
   4484 static void decimalSumFinalize(sqlite3_context *context){
   4485   Decimal *p = sqlite3_aggregate_context(context, 0);
   4486   if( p==0 ) return;
   4487   decimal_result(context, p);
   4488   decimal_clear(p);
   4489 }
   4490 
   4491 /*
   4492 ** SQL Function:   decimal_mul(X, Y)
   4493 **
   4494 ** Return the product of X and Y.
   4495 */
   4496 static void decimalMulFunc(
   4497   sqlite3_context *context,
   4498   int argc,
   4499   sqlite3_value **argv
   4500 ){
   4501   Decimal *pA = decimal_new(context, argv[0], 1);
   4502   Decimal *pB = decimal_new(context, argv[1], 1);
   4503   UNUSED_PARAMETER(argc);
   4504   if( pA==0 || pA->oom || pA->isNull
   4505    || pB==0 || pB->oom || pB->isNull 
   4506   ){
   4507     goto mul_end;
   4508   }
   4509   decimalMul(pA, pB);
   4510   if( pA->oom ){
   4511     goto mul_end;
   4512   }
   4513   decimal_result(context, pA);
   4514 
   4515 mul_end:
   4516   decimal_free(pA);
   4517   decimal_free(pB);
   4518 }
   4519 
   4520 /*
   4521 ** SQL Function:   decimal_pow2(N)
   4522 **
   4523 ** Return the N-th power of 2.  N must be an integer.
   4524 */
   4525 static void decimalPow2Func(
   4526   sqlite3_context *context,
   4527   int argc,
   4528   sqlite3_value **argv
   4529 ){
   4530   UNUSED_PARAMETER(argc);
   4531   if( sqlite3_value_type(argv[0])==SQLITE_INTEGER ){
   4532     Decimal *pA = decimalPow2(sqlite3_value_int(argv[0]));
   4533     decimal_result_sci(context, pA);
   4534     decimal_free(pA);
   4535   }
   4536 }
   4537 
   4538 #ifdef _WIN32
   4539 
   4540 #endif
   4541 int sqlite3_decimal_init(
   4542   sqlite3 *db, 
   4543   char **pzErrMsg, 
   4544   const sqlite3_api_routines *pApi
   4545 ){
   4546   int rc = SQLITE_OK;
   4547   static const struct {
   4548     const char *zFuncName;
   4549     int nArg;
   4550     int iArg;
   4551     void (*xFunc)(sqlite3_context*,int,sqlite3_value**);
   4552   } aFunc[] = {
   4553     { "decimal",       1, 0,  decimalFunc        },
   4554     { "decimal_exp",   1, 1,  decimalFunc        },
   4555     { "decimal_cmp",   2, 0,  decimalCmpFunc     },
   4556     { "decimal_add",   2, 0,  decimalAddFunc     },
   4557     { "decimal_sub",   2, 0,  decimalSubFunc     },
   4558     { "decimal_mul",   2, 0,  decimalMulFunc     },
   4559     { "decimal_pow2",  1, 0,  decimalPow2Func    },
   4560   };
   4561   unsigned int i;
   4562   (void)pzErrMsg;  /* Unused parameter */
   4563 
   4564   SQLITE_EXTENSION_INIT2(pApi);
   4565 
   4566   for(i=0; i<(int)(sizeof(aFunc)/sizeof(aFunc[0])) && rc==SQLITE_OK; i++){
   4567     rc = sqlite3_create_function(db, aFunc[i].zFuncName, aFunc[i].nArg,
   4568                    SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC,
   4569                    aFunc[i].iArg ? db : 0, aFunc[i].xFunc, 0, 0);
   4570   }
   4571   if( rc==SQLITE_OK ){
   4572     rc = sqlite3_create_window_function(db, "decimal_sum", 1,
   4573                    SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC, 0,
   4574                    decimalSumStep, decimalSumFinalize,
   4575                    decimalSumValue, decimalSumInverse, 0);
   4576   }
   4577   if( rc==SQLITE_OK ){
   4578     rc = sqlite3_create_collation(db, "decimal", SQLITE_UTF8,
   4579                                   0, decimalCollFunc);
   4580   }
   4581   return rc;
   4582 }
   4583 
   4584 /************************* End ../ext/misc/decimal.c ********************/
   4585 /************************* Begin ../ext/misc/percentile.c ******************/
   4586 /*
   4587 ** 2013-05-28
   4588 **
   4589 ** The author disclaims copyright to this source code.  In place of
   4590 ** a legal notice, here is a blessing:
   4591 **
   4592 **    May you do good and not evil.
   4593 **    May you find forgiveness for yourself and forgive others.
   4594 **    May you share freely, never taking more than you give.
   4595 **
   4596 ******************************************************************************
   4597 **
   4598 ** This file contains code to implement the percentile(Y,P) SQL function
   4599 ** and similar as described below:
   4600 **
   4601 **   (1)  The percentile(Y,P) function is an aggregate function taking
   4602 **        exactly two arguments.
   4603 **
   4604 **   (2)  If the P argument to percentile(Y,P) is not the same for every
   4605 **        row in the aggregate then an error is thrown.  The word "same"
   4606 **        in the previous sentence means that the value differ by less
   4607 **        than 0.001.
   4608 **
   4609 **   (3)  If the P argument to percentile(Y,P) evaluates to anything other
   4610 **        than a number in the range of 0.0 to 100.0 inclusive then an
   4611 **        error is thrown.
   4612 **
   4613 **   (4)  If any Y argument to percentile(Y,P) evaluates to a value that
   4614 **        is not NULL and is not numeric then an error is thrown.
   4615 **
   4616 **   (5)  If any Y argument to percentile(Y,P) evaluates to plus or minus
   4617 **        infinity then an error is thrown.  (SQLite always interprets NaN
   4618 **        values as NULL.)
   4619 **
   4620 **   (6)  Both Y and P in percentile(Y,P) can be arbitrary expressions,
   4621 **        including CASE WHEN expressions.
   4622 **
   4623 **   (7)  The percentile(Y,P) aggregate is able to handle inputs of at least
   4624 **        one million (1,000,000) rows.
   4625 **
   4626 **   (8)  If there are no non-NULL values for Y, then percentile(Y,P)
   4627 **        returns NULL.
   4628 **
   4629 **   (9)  If there is exactly one non-NULL value for Y, the percentile(Y,P)
   4630 **        returns the one Y value.
   4631 **
   4632 **  (10)  If there N non-NULL values of Y where N is two or more and
   4633 **        the Y values are ordered from least to greatest and a graph is
   4634 **        drawn from 0 to N-1 such that the height of the graph at J is
   4635 **        the J-th Y value and such that straight lines are drawn between
   4636 **        adjacent Y values, then the percentile(Y,P) function returns
   4637 **        the height of the graph at P*(N-1)/100.
   4638 **
   4639 **  (11)  The percentile(Y,P) function always returns either a floating
   4640 **        point number or NULL.
   4641 **
   4642 **  (12)  The percentile(Y,P) is implemented as a single C99 source-code
   4643 **        file that compiles into a shared-library or DLL that can be loaded
   4644 **        into SQLite using the sqlite3_load_extension() interface.
   4645 **
   4646 **  (13)  A separate median(Y) function is the equivalent percentile(Y,50).
   4647 **
   4648 **  (14)  A separate percentile_cont(Y,P) function is equivalent to
   4649 **        percentile(Y,P/100.0).  In other words, the fraction value in
   4650 **        the second argument is in the range of 0 to 1 instead of 0 to 100.
   4651 **
   4652 **  (15)  A separate percentile_disc(Y,P) function is like
   4653 **        percentile_cont(Y,P) except that instead of returning the weighted
   4654 **        average of the nearest two input values, it returns the next lower
   4655 **        value.  So the percentile_disc(Y,P) will always return a value
   4656 **        that was one of the inputs.
   4657 **
   4658 **  (16)  All of median(), percentile(Y,P), percentile_cont(Y,P) and
   4659 **        percentile_disc(Y,P) can be used as window functions.
   4660 **
   4661 ** Differences from standard SQL:
   4662 **
   4663 **  *  The percentile_cont(X,P) function is equivalent to the following in
   4664 **     standard SQL:
   4665 **
   4666 **         (percentile_cont(P) WITHIN GROUP (ORDER BY X))
   4667 **
   4668 **     The SQLite syntax is much more compact.  The standard SQL syntax
   4669 **     is also supported if SQLite is compiled with the
   4670 **     -DSQLITE_ENABLE_ORDERED_SET_AGGREGATES option.
   4671 **
   4672 **  *  No median(X) function exists in the SQL standard.  App developers
   4673 **     are expected to write "percentile_cont(0.5)WITHIN GROUP(ORDER BY X)".
   4674 **
   4675 **  *  No percentile(Y,P) function exists in the SQL standard.  Instead of
   4676 **     percential(Y,P), developers must write this:
   4677 **     "percentile_cont(P/100.0) WITHIN GROUP (ORDER BY Y)".  Note that
   4678 **     the fraction parameter to percentile() goes from 0 to 100 whereas
   4679 **     the fraction parameter in SQL standard percentile_cont() goes from
   4680 **     0 to 1.
   4681 **
   4682 ** Implementation notes as of 2024-08-31:
   4683 **
   4684 **  *  The regular aggregate-function versions of these routines work
   4685 **     by accumulating all values in an array of doubles, then sorting
   4686 **     that array using quicksort before computing the answer. Thus
   4687 **     the runtime is O(NlogN) where N is the number of rows of input.
   4688 **
   4689 **  *  For the window-function versions of these routines, the array of
   4690 **     inputs is sorted as soon as the first value is computed.  Thereafter,
   4691 **     the array is kept in sorted order using an insert-sort.  This
   4692 **     results in O(N*K) performance where K is the size of the window.
   4693 **     One can imagine alternative implementations that give O(N*logN*logK)
   4694 **     performance, but they require more complex logic and data structures.
   4695 **     The developers have elected to keep the asymptotically slower
   4696 **     algorithm for now, for simplicity, under the theory that window
   4697 **     functions are seldom used and when they are, the window size K is
   4698 **     often small.  The developers might revisit that decision later,
   4699 **     should the need arise.
   4700 */
   4701 #if defined(SQLITE3_H)
   4702   /* no-op */
   4703 #elif defined(SQLITE_STATIC_PERCENTILE)
   4704 /* #  include "sqlite3.h" */
   4705 #else
   4706 /* #  include "sqlite3ext.h" */
   4707    SQLITE_EXTENSION_INIT1
   4708 #endif
   4709 #include <assert.h>
   4710 #include <string.h>
   4711 #include <stdlib.h>
   4712 
   4713 /* The following object is the group context for a single percentile()
   4714 ** aggregate.  Remember all input Y values until the very end.
   4715 ** Those values are accumulated in the Percentile.a[] array.
   4716 */
   4717 typedef struct Percentile Percentile;
   4718 struct Percentile {
   4719   unsigned nAlloc;     /* Number of slots allocated for a[] */
   4720   unsigned nUsed;      /* Number of slots actually used in a[] */
   4721   char bSorted;        /* True if a[] is already in sorted order */
   4722   char bKeepSorted;    /* True if advantageous to keep a[] sorted */
   4723   char bPctValid;      /* True if rPct is valid */
   4724   double rPct;         /* Fraction.  0.0 to 1.0 */
   4725   double *a;           /* Array of Y values */
   4726 };
   4727 
   4728 /* Details of each function in the percentile family */
   4729 typedef struct PercentileFunc PercentileFunc;
   4730 struct PercentileFunc {
   4731   const char *zName;   /* Function name */
   4732   char nArg;           /* Number of arguments */
   4733   char mxFrac;         /* Maximum value of the "fraction" input */
   4734   char bDiscrete;      /* True for percentile_disc() */
   4735 };
   4736 static const PercentileFunc aPercentFunc[] = {
   4737   { "median",           1,   1, 0 },
   4738   { "percentile",       2, 100, 0 },
   4739   { "percentile_cont",  2,   1, 0 },
   4740   { "percentile_disc",  2,   1, 1 },
   4741 };
   4742 
   4743 /*
   4744 ** Return TRUE if the input floating-point number is an infinity.
   4745 */
   4746 static int percentIsInfinity(double r){
   4747   sqlite3_uint64 u;
   4748   assert( sizeof(u)==sizeof(r) );
   4749   memcpy(&u, &r, sizeof(u));
   4750   return ((u>>52)&0x7ff)==0x7ff;
   4751 }
   4752 
   4753 /*
   4754 ** Return TRUE if two doubles differ by 0.001 or less.
   4755 */
   4756 static int percentSameValue(double a, double b){
   4757   a -= b;
   4758   return a>=-0.001 && a<=0.001;
   4759 }
   4760 
   4761 /*
   4762 ** Search p (which must have p->bSorted) looking for an entry with
   4763 ** value y.  Return the index of that entry.
   4764 **
   4765 ** If bExact is true, return -1 if the entry is not found.
   4766 **
   4767 ** If bExact is false, return the index at which a new entry with
   4768 ** value y should be insert in order to keep the values in sorted
   4769 ** order.  The smallest return value in this case will be 0, and
   4770 ** the largest return value will be p->nUsed.
   4771 */
   4772 static int percentBinarySearch(Percentile *p, double y, int bExact){
   4773   int iFirst = 0;              /* First element of search range */
   4774   int iLast = p->nUsed - 1;    /* Last element of search range */
   4775   while( iLast>=iFirst ){
   4776     int iMid = (iFirst+iLast)/2;
   4777     double x = p->a[iMid];
   4778     if( x<y ){
   4779       iFirst = iMid + 1;
   4780     }else if( x>y ){
   4781       iLast = iMid - 1;
   4782     }else{
   4783       return iMid;
   4784     }
   4785   }
   4786   if( bExact ) return -1;
   4787   return iFirst;
   4788 }
   4789 
   4790 /*
   4791 ** Generate an error for a percentile function.
   4792 **
   4793 ** The error format string must have exactly one occurrence of "%%s()"
   4794 ** (with two '%' characters).  That substring will be replaced by the name
   4795 ** of the function.
   4796 */
   4797 static void percentError(sqlite3_context *pCtx, const char *zFormat, ...){
   4798   PercentileFunc *pFunc = (PercentileFunc*)sqlite3_user_data(pCtx);
   4799   char *zMsg1;
   4800   char *zMsg2;
   4801   va_list ap;
   4802 
   4803   va_start(ap, zFormat);
   4804   zMsg1 = sqlite3_vmprintf(zFormat, ap);
   4805   va_end(ap);
   4806   zMsg2 = zMsg1 ? sqlite3_mprintf(zMsg1, pFunc->zName) : 0;
   4807   sqlite3_result_error(pCtx, zMsg2, -1);
   4808   sqlite3_free(zMsg1);
   4809   sqlite3_free(zMsg2);
   4810 }
   4811 
   4812 /*
   4813 ** The "step" function for percentile(Y,P) is called once for each
   4814 ** input row.
   4815 */
   4816 static void percentStep(sqlite3_context *pCtx, int argc, sqlite3_value **argv){
   4817   Percentile *p;
   4818   double rPct;
   4819   int eType;
   4820   double y;
   4821   assert( argc==2 || argc==1 );
   4822 
   4823   if( argc==1 ){
   4824     /* Requirement 13:  median(Y) is the same as percentile(Y,50). */
   4825     rPct = 0.5;
   4826   }else{
   4827     /* Requirement 3:  P must be a number between 0 and 100 */
   4828     PercentileFunc *pFunc = (PercentileFunc*)sqlite3_user_data(pCtx);
   4829     eType = sqlite3_value_numeric_type(argv[1]);
   4830     rPct = sqlite3_value_double(argv[1])/(double)pFunc->mxFrac;
   4831     if( (eType!=SQLITE_INTEGER && eType!=SQLITE_FLOAT)
   4832      || rPct<0.0 || rPct>1.0
   4833     ){
   4834       percentError(pCtx, "the fraction argument to %%s()"
   4835                         " is not between 0.0 and %.1f",
   4836                         (double)pFunc->mxFrac);
   4837       return;
   4838     }
   4839   }
   4840 
   4841   /* Allocate the session context. */
   4842   p = (Percentile*)sqlite3_aggregate_context(pCtx, sizeof(*p));
   4843   if( p==0 ) return;
   4844 
   4845   /* Remember the P value.  Throw an error if the P value is different
   4846   ** from any prior row, per Requirement (2). */
   4847   if( !p->bPctValid ){
   4848     p->rPct = rPct;
   4849     p->bPctValid = 1;
   4850   }else if( !percentSameValue(p->rPct,rPct) ){
   4851     percentError(pCtx, "the fraction argument to %%s()"
   4852                       " is not the same for all input rows");
   4853     return;
   4854   }
   4855 
   4856   /* Ignore rows for which Y is NULL */
   4857   eType = sqlite3_value_type(argv[0]);
   4858   if( eType==SQLITE_NULL ) return;
   4859 
   4860   /* If not NULL, then Y must be numeric.  Otherwise throw an error.
   4861   ** Requirement 4 */
   4862   if( eType!=SQLITE_INTEGER && eType!=SQLITE_FLOAT ){
   4863     percentError(pCtx, "input to %%s() is not numeric");
   4864     return;
   4865   }
   4866 
   4867   /* Throw an error if the Y value is infinity or NaN */
   4868   y = sqlite3_value_double(argv[0]);
   4869   if( percentIsInfinity(y) ){
   4870     percentError(pCtx, "Inf input to %%s()");
   4871     return;
   4872   }
   4873 
   4874   /* Allocate and store the Y */
   4875   if( p->nUsed>=p->nAlloc ){
   4876     unsigned n = p->nAlloc*2 + 250;
   4877     double *a = sqlite3_realloc64(p->a, sizeof(double)*n);
   4878     if( a==0 ){
   4879       sqlite3_free(p->a);
   4880       memset(p, 0, sizeof(*p));
   4881       sqlite3_result_error_nomem(pCtx);
   4882       return;
   4883     }
   4884     p->nAlloc = n;
   4885     p->a = a;
   4886   }
   4887   if( p->nUsed==0 ){
   4888     p->a[p->nUsed++] = y;
   4889     p->bSorted = 1;
   4890   }else if( !p->bSorted || y>=p->a[p->nUsed-1] ){
   4891     p->a[p->nUsed++] = y;
   4892   }else if( p->bKeepSorted ){
   4893     int i;
   4894     i = percentBinarySearch(p, y, 0);
   4895     if( i<(int)p->nUsed ){
   4896       memmove(&p->a[i+1], &p->a[i], (p->nUsed-i)*sizeof(p->a[0]));
   4897     }
   4898     p->a[i] = y;
   4899     p->nUsed++;
   4900   }else{
   4901     p->a[p->nUsed++] = y;
   4902     p->bSorted = 0;
   4903   }
   4904 }
   4905 
   4906 /*
   4907 ** Interchange two doubles.
   4908 */
   4909 #define SWAP_DOUBLE(X,Y)  {double ttt=(X);(X)=(Y);(Y)=ttt;}
   4910 
   4911 /*
   4912 ** Sort an array of doubles.
   4913 **
   4914 ** Algorithm: quicksort
   4915 **
   4916 ** This is implemented separately rather than using the qsort() routine
   4917 ** from the standard library because:
   4918 **
   4919 **    (1)  To avoid a dependency on qsort()
   4920 **    (2)  To avoid the function call to the comparison routine for each
   4921 **         comparison.
   4922 */
   4923 static void percentSort(double *a, unsigned int n){
   4924   int iLt;  /* Entries before a[iLt] are less than rPivot */
   4925   int iGt;  /* Entries at or after a[iGt] are greater than rPivot */
   4926   int i;         /* Loop counter */
   4927   double rPivot; /* The pivot value */
   4928   
   4929   assert( n>=2 );
   4930   if( a[0]>a[n-1] ){
   4931     SWAP_DOUBLE(a[0],a[n-1])
   4932   }
   4933   if( n==2 ) return;
   4934   iGt = n-1;
   4935   i = n/2;
   4936   if( a[0]>a[i] ){
   4937     SWAP_DOUBLE(a[0],a[i])
   4938   }else if( a[i]>a[iGt] ){
   4939     SWAP_DOUBLE(a[i],a[iGt])
   4940   }
   4941   if( n==3 ) return;
   4942   rPivot = a[i];
   4943   iLt = i = 1;
   4944   do{
   4945     if( a[i]<rPivot ){
   4946       if( i>iLt ) SWAP_DOUBLE(a[i],a[iLt])
   4947       iLt++;
   4948       i++;
   4949     }else if( a[i]>rPivot ){
   4950       do{
   4951         iGt--;
   4952       }while( iGt>i && a[iGt]>rPivot );
   4953       SWAP_DOUBLE(a[i],a[iGt])
   4954     }else{
   4955       i++;
   4956     }
   4957   }while( i<iGt );
   4958   if( iLt>=2 ) percentSort(a, iLt);
   4959   if( n-iGt>=2 ) percentSort(a+iGt, n-iGt);
   4960     
   4961 /* Uncomment for testing */
   4962 #if 0
   4963   for(i=0; i<n-1; i++){
   4964     assert( a[i]<=a[i+1] );
   4965   }
   4966 #endif
   4967 }
   4968 
   4969 
   4970 /*
   4971 ** The "inverse" function for percentile(Y,P) is called to remove a
   4972 ** row that was previously inserted by "step".
   4973 */
   4974 static void percentInverse(sqlite3_context *pCtx,int argc,sqlite3_value **argv){
   4975   Percentile *p;
   4976   int eType;
   4977   double y;
   4978   int i;
   4979   assert( argc==2 || argc==1 );
   4980 
   4981   /* Allocate the session context. */
   4982   p = (Percentile*)sqlite3_aggregate_context(pCtx, sizeof(*p));
   4983   assert( p!=0 );
   4984 
   4985   /* Ignore rows for which Y is NULL */
   4986   eType = sqlite3_value_type(argv[0]);
   4987   if( eType==SQLITE_NULL ) return;
   4988 
   4989   /* If not NULL, then Y must be numeric.  Otherwise throw an error.
   4990   ** Requirement 4 */
   4991   if( eType!=SQLITE_INTEGER && eType!=SQLITE_FLOAT ){
   4992     return;
   4993   }
   4994 
   4995   /* Ignore the Y value if it is infinity or NaN */
   4996   y = sqlite3_value_double(argv[0]);
   4997   if( percentIsInfinity(y) ){
   4998     return;
   4999   }
   5000   if( p->bSorted==0 ){
   5001     assert( p->nUsed>1 );
   5002     percentSort(p->a, p->nUsed);
   5003     p->bSorted = 1;
   5004   }
   5005   p->bKeepSorted = 1;
   5006 
   5007   /* Find and remove the row */
   5008   i = percentBinarySearch(p, y, 1);
   5009   if( i>=0 ){
   5010     p->nUsed--;
   5011     if( i<(int)p->nUsed ){
   5012       memmove(&p->a[i], &p->a[i+1], (p->nUsed - i)*sizeof(p->a[0]));
   5013     }
   5014   }
   5015 }
   5016 
   5017 /*
   5018 ** Compute the final output of percentile().  Clean up all allocated
   5019 ** memory if and only if bIsFinal is true.
   5020 */
   5021 static void percentCompute(sqlite3_context *pCtx, int bIsFinal){
   5022   Percentile *p;
   5023   PercentileFunc *pFunc = (PercentileFunc*)sqlite3_user_data(pCtx);
   5024   unsigned i1, i2;
   5025   double v1, v2;
   5026   double ix, vx;
   5027   p = (Percentile*)sqlite3_aggregate_context(pCtx, 0);
   5028   if( p==0 ) return;
   5029   if( p->a==0 ) return;
   5030   if( p->nUsed ){
   5031     if( p->bSorted==0 ){
   5032       assert( p->nUsed>1 );
   5033       percentSort(p->a, p->nUsed);
   5034       p->bSorted = 1;
   5035     }
   5036     ix = p->rPct*(p->nUsed-1);
   5037     i1 = (unsigned)ix;
   5038     if( pFunc->bDiscrete ){
   5039       vx = p->a[i1];
   5040     }else{
   5041       i2 = ix==(double)i1 || i1==p->nUsed-1 ? i1 : i1+1;
   5042       v1 = p->a[i1];
   5043       v2 = p->a[i2];
   5044       vx = v1 + (v2-v1)*(ix-i1);
   5045     }
   5046     sqlite3_result_double(pCtx, vx);
   5047   }
   5048   if( bIsFinal ){
   5049     sqlite3_free(p->a);
   5050     memset(p, 0, sizeof(*p));
   5051   }else{
   5052     p->bKeepSorted = 1;
   5053   }
   5054 }
   5055 static void percentFinal(sqlite3_context *pCtx){
   5056   percentCompute(pCtx, 1);
   5057 }
   5058 static void percentValue(sqlite3_context *pCtx){
   5059   percentCompute(pCtx, 0);
   5060 }
   5061 
   5062 #if defined(_WIN32) && !defined(SQLITE3_H) && !defined(SQLITE_STATIC_PERCENTILE)
   5063 
   5064 #endif
   5065 int sqlite3_percentile_init(
   5066   sqlite3 *db, 
   5067   char **pzErrMsg, 
   5068   const sqlite3_api_routines *pApi
   5069 ){
   5070   int rc = SQLITE_OK;
   5071   unsigned int i;
   5072 #ifdef SQLITE3EXT_H
   5073   SQLITE_EXTENSION_INIT2(pApi);
   5074 #else
   5075   (void)pApi;      /* Unused parameter */
   5076 #endif
   5077   (void)pzErrMsg;  /* Unused parameter */
   5078   for(i=0; i<sizeof(aPercentFunc)/sizeof(aPercentFunc[0]); i++){
   5079     rc = sqlite3_create_window_function(db,
   5080             aPercentFunc[i].zName,
   5081             aPercentFunc[i].nArg,
   5082             SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_SELFORDER1,
   5083             (void*)&aPercentFunc[i],
   5084             percentStep, percentFinal, percentValue, percentInverse, 0);
   5085     if( rc ) break;
   5086   }
   5087   return rc;
   5088 }
   5089 
   5090 /************************* End ../ext/misc/percentile.c ********************/
   5091 #undef sqlite3_base_init
   5092 #define sqlite3_base_init sqlite3_base64_init
   5093 /************************* Begin ../ext/misc/base64.c ******************/
   5094 /*
   5095 ** 2022-11-18
   5096 **
   5097 ** The author disclaims copyright to this source code.  In place of
   5098 ** a legal notice, here is a blessing:
   5099 **
   5100 **    May you do good and not evil.
   5101 **    May you find forgiveness for yourself and forgive others.
   5102 **    May you share freely, never taking more than you give.
   5103 **
   5104 *************************************************************************
   5105 **
   5106 ** This is a SQLite extension for converting in either direction
   5107 ** between a (binary) blob and base64 text. Base64 can transit a
   5108 ** sane USASCII channel unmolested. It also plays nicely in CSV or
   5109 ** written as TCL brace-enclosed literals or SQL string literals,
   5110 ** and can be used unmodified in XML-like documents.
   5111 **
   5112 ** This is an independent implementation of conversions specified in
   5113 ** RFC 4648, done on the above date by the author (Larry Brasfield)
   5114 ** who thereby has the right to put this into the public domain.
   5115 **
   5116 ** The conversions meet RFC 4648 requirements, provided that this
   5117 ** C source specifies that line-feeds are included in the encoded
   5118 ** data to limit visible line lengths to 72 characters and to
   5119 ** terminate any encoded blob having non-zero length.
   5120 **
   5121 ** Length limitations are not imposed except that the runtime
   5122 ** SQLite string or blob length limits are respected. Otherwise,
   5123 ** any length binary sequence can be represented and recovered.
   5124 ** Generated base64 sequences, with their line-feeds included,
   5125 ** can be concatenated; the result converted back to binary will
   5126 ** be the concatenation of the represented binary sequences.
   5127 **
   5128 ** This SQLite3 extension creates a function, base64(x), which
   5129 ** either: converts text x containing base64 to a returned blob;
   5130 ** or converts a blob x to returned text containing base64. An
   5131 ** error will be thrown for other input argument types.
   5132 **
   5133 ** This code relies on UTF-8 encoding only with respect to the
   5134 ** meaning of the first 128 (7-bit) codes matching that of USASCII.
   5135 ** It will fail miserably if somehow made to try to convert EBCDIC.
   5136 ** Because it is table-driven, it could be enhanced to handle that,
   5137 ** but the world and SQLite have moved on from that anachronism.
   5138 **
   5139 ** To build the extension:
   5140 ** Set shell variable SQDIR=<your favorite SQLite checkout directory>
   5141 ** *Nix: gcc -O2 -shared -I$SQDIR -fPIC -o base64.so base64.c
   5142 ** OSX: gcc -O2 -dynamiclib -fPIC -I$SQDIR -o base64.dylib base64.c
   5143 ** Win32: gcc -O2 -shared -I%SQDIR% -o base64.dll base64.c
   5144 ** Win32: cl /Os -I%SQDIR% base64.c -link -dll -out:base64.dll
   5145 */
   5146 
   5147 #include <assert.h>
   5148 
   5149 /* #include "sqlite3ext.h" */
   5150 
   5151 #ifndef deliberate_fall_through
   5152 /* Quiet some compilers about some of our intentional code. */
   5153 # if GCC_VERSION>=7000000
   5154 #  define deliberate_fall_through __attribute__((fallthrough));
   5155 # else
   5156 #  define deliberate_fall_through
   5157 # endif
   5158 #endif
   5159 
   5160 SQLITE_EXTENSION_INIT1;
   5161 
   5162 #define PC 0x80 /* pad character */
   5163 #define WS 0x81 /* whitespace */
   5164 #define ND 0x82 /* Not above or digit-value */
   5165 #define PAD_CHAR '='
   5166 
   5167 #ifndef U8_TYPEDEF
   5168 /* typedef unsigned char u8; */
   5169 #define U8_TYPEDEF
   5170 #endif
   5171 
   5172 /* Decoding table, ASCII (7-bit) value to base 64 digit value or other */
   5173 static const u8 b64DigitValues[128] = {
   5174   /*                             HT LF VT  FF CR       */
   5175     ND,ND,ND,ND, ND,ND,ND,ND, ND,WS,WS,WS, WS,WS,ND,ND,
   5176   /*                                                US */
   5177     ND,ND,ND,ND, ND,ND,ND,ND, ND,ND,ND,ND, ND,ND,ND,ND,
   5178   /*sp                                  +            / */
   5179     WS,ND,ND,ND, ND,ND,ND,ND, ND,ND,ND,62, ND,ND,ND,63,
   5180   /* 0  1            5            9            =       */
   5181     52,53,54,55, 56,57,58,59, 60,61,ND,ND, ND,PC,ND,ND,
   5182   /*    A                                            O */
   5183     ND, 0, 1, 2,  3, 4, 5, 6,  7, 8, 9,10, 11,12,13,14,
   5184   /* P                               Z                 */
   5185     15,16,17,18, 19,20,21,22, 23,24,25,ND, ND,ND,ND,ND,
   5186   /*    a                                            o */
   5187     ND,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40,
   5188   /* p                               z                 */
   5189     41,42,43,44, 45,46,47,48, 49,50,51,ND, ND,ND,ND,ND
   5190 };
   5191 
   5192 static const char b64Numerals[64+1]
   5193 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
   5194 
   5195 #define BX_DV_PROTO(c) \
   5196   ((((u8)(c))<0x80)? (u8)(b64DigitValues[(u8)(c)]) : 0x80)
   5197 #define IS_BX_DIGIT(bdp) (((u8)(bdp))<0x80)
   5198 #define IS_BX_WS(bdp) ((bdp)==WS)
   5199 #define IS_BX_PAD(bdp) ((bdp)==PC)
   5200 #define BX_NUMERAL(dv) (b64Numerals[(u8)(dv)])
   5201 /* Width of base64 lines. Should be an integer multiple of 4. */
   5202 #define B64_DARK_MAX 72
   5203 
   5204 /* Encode a byte buffer into base64 text with linefeeds appended to limit
   5205 ** encoded group lengths to B64_DARK_MAX or to terminate the last group.
   5206 */
   5207 static char* toBase64( u8 *pIn, int nbIn, char *pOut ){
   5208   int nCol = 0;
   5209   while( nbIn >= 3 ){
   5210     /* Do the bit-shuffle, exploiting unsigned input to avoid masking. */
   5211     pOut[0] = BX_NUMERAL(pIn[0]>>2);
   5212     pOut[1] = BX_NUMERAL(((pIn[0]<<4)|(pIn[1]>>4))&0x3f);
   5213     pOut[2] = BX_NUMERAL(((pIn[1]&0xf)<<2)|(pIn[2]>>6));
   5214     pOut[3] = BX_NUMERAL(pIn[2]&0x3f);
   5215     pOut += 4;
   5216     nbIn -= 3;
   5217     pIn += 3;
   5218     if( (nCol += 4)>=B64_DARK_MAX || nbIn<=0 ){
   5219       *pOut++ = '\n';
   5220       nCol = 0;
   5221     }
   5222   }
   5223   if( nbIn > 0 ){
   5224     signed char nco = nbIn+1;
   5225     int nbe;
   5226     unsigned long qv = *pIn++;
   5227     for( nbe=1; nbe<3; ++nbe ){
   5228       qv <<= 8;
   5229       if( nbe<nbIn ) qv |= *pIn++;
   5230     }
   5231     for( nbe=3; nbe>=0; --nbe ){
   5232       char ce = (nbe<nco)? BX_NUMERAL((u8)(qv & 0x3f)) : PAD_CHAR;
   5233       qv >>= 6;
   5234       pOut[nbe] = ce;
   5235     }
   5236     pOut += 4;
   5237     *pOut++ = '\n';
   5238   }
   5239   *pOut = 0;
   5240   return pOut;
   5241 }
   5242 
   5243 /* Skip over text which is not base64 numeral(s). */
   5244 static char * skipNonB64( char *s, int nc ){
   5245   char c;
   5246   while( nc-- > 0 && (c = *s) && !IS_BX_DIGIT(BX_DV_PROTO(c)) ) ++s;
   5247   return s;
   5248 }
   5249 
   5250 /* Decode base64 text into a byte buffer. */
   5251 static u8* fromBase64( char *pIn, int ncIn, u8 *pOut ){
   5252   if( ncIn>0 && pIn[ncIn-1]=='\n' ) --ncIn;
   5253   while( ncIn>0 && *pIn!=PAD_CHAR ){
   5254     static signed char nboi[] = { 0, 0, 1, 2, 3 };
   5255     char *pUse = skipNonB64(pIn, ncIn);
   5256     unsigned long qv = 0L;
   5257     int nti, nbo, nac;
   5258     ncIn -= (pUse - pIn);
   5259     pIn = pUse;
   5260     nti = (ncIn>4)? 4 : ncIn;
   5261     ncIn -= nti;
   5262     nbo = nboi[nti];
   5263     if( nbo==0 ) break;
   5264     for( nac=0; nac<4; ++nac ){
   5265       char c = (nac<nti)? *pIn++ : b64Numerals[0];
   5266       u8 bdp = BX_DV_PROTO(c);
   5267       switch( bdp ){
   5268       case ND:
   5269         /*  Treat dark non-digits as pad, but they terminate decode too. */
   5270         ncIn = 0;
   5271         deliberate_fall_through; /* FALLTHRU */
   5272       case WS:
   5273         /* Treat whitespace as pad and terminate this group.*/
   5274         nti = nac;
   5275         deliberate_fall_through; /* FALLTHRU */
   5276       case PC:
   5277         bdp = 0;
   5278         --nbo;
   5279         deliberate_fall_through; /* FALLTHRU */
   5280       default: /* bdp is the digit value. */
   5281         qv = qv<<6 | bdp;
   5282         break;
   5283       }
   5284     }
   5285     switch( nbo ){
   5286     case 3:
   5287       pOut[2] = (qv) & 0xff;
   5288       deliberate_fall_through; /* FALLTHRU */
   5289     case 2:
   5290       pOut[1] = (qv>>8) & 0xff;
   5291       deliberate_fall_through; /* FALLTHRU */
   5292     case 1:
   5293       pOut[0] = (qv>>16) & 0xff;
   5294       break;
   5295     }
   5296     pOut += nbo;
   5297   }
   5298   return pOut;
   5299 }
   5300 
   5301 /* This function does the work for the SQLite base64(x) UDF. */
   5302 static void base64(sqlite3_context *context, int na, sqlite3_value *av[]){
   5303   int nb, nc, nv = sqlite3_value_bytes(av[0]);
   5304   int nvMax = sqlite3_limit(sqlite3_context_db_handle(context),
   5305                             SQLITE_LIMIT_LENGTH, -1);
   5306   char *cBuf;
   5307   u8 *bBuf;
   5308   assert(na==1);
   5309   switch( sqlite3_value_type(av[0]) ){
   5310   case SQLITE_BLOB:
   5311     nb = nv;
   5312     nc = 4*(nv+2/3); /* quads needed */
   5313     nc += (nc+(B64_DARK_MAX-1))/B64_DARK_MAX + 1; /* LFs and a 0-terminator */
   5314     if( nvMax < nc ){
   5315       sqlite3_result_error(context, "blob expanded to base64 too big", -1);
   5316       return;
   5317     }
   5318     bBuf = (u8*)sqlite3_value_blob(av[0]);
   5319     if( !bBuf ){
   5320       if( SQLITE_NOMEM==sqlite3_errcode(sqlite3_context_db_handle(context)) ){
   5321         goto memFail;
   5322       }
   5323       sqlite3_result_text(context,"",-1,SQLITE_STATIC);
   5324       break;
   5325     }
   5326     cBuf = sqlite3_malloc(nc);
   5327     if( !cBuf ) goto memFail;
   5328     nc = (int)(toBase64(bBuf, nb, cBuf) - cBuf);
   5329     sqlite3_result_text(context, cBuf, nc, sqlite3_free);
   5330     break;
   5331   case SQLITE_TEXT:
   5332     nc = nv;
   5333     nb = 3*((nv+3)/4); /* may overestimate due to LF and padding */
   5334     if( nvMax < nb ){
   5335       sqlite3_result_error(context, "blob from base64 may be too big", -1);
   5336       return;
   5337     }else if( nb<1 ){
   5338       nb = 1;
   5339     }
   5340     cBuf = (char *)sqlite3_value_text(av[0]);
   5341     if( !cBuf ){
   5342       if( SQLITE_NOMEM==sqlite3_errcode(sqlite3_context_db_handle(context)) ){
   5343         goto memFail;
   5344       }
   5345       sqlite3_result_zeroblob(context, 0);
   5346       break;
   5347     }
   5348     bBuf = sqlite3_malloc(nb);
   5349     if( !bBuf ) goto memFail;
   5350     nb = (int)(fromBase64(cBuf, nc, bBuf) - bBuf);
   5351     sqlite3_result_blob(context, bBuf, nb, sqlite3_free);
   5352     break;
   5353   default:
   5354     sqlite3_result_error(context, "base64 accepts only blob or text", -1);
   5355     return;
   5356   }
   5357   return;
   5358  memFail:
   5359   sqlite3_result_error(context, "base64 OOM", -1);
   5360 }
   5361 
   5362 /*
   5363 ** Establish linkage to running SQLite library.
   5364 */
   5365 #ifndef SQLITE_SHELL_EXTFUNCS
   5366 #ifdef _WIN32
   5367 
   5368 #endif
   5369 int sqlite3_base_init
   5370 #else
   5371 static int sqlite3_base64_init
   5372 #endif
   5373 (sqlite3 *db, char **pzErr, const sqlite3_api_routines *pApi){
   5374   SQLITE_EXTENSION_INIT2(pApi);
   5375   (void)pzErr;
   5376   return sqlite3_create_function
   5377     (db, "base64", 1,
   5378      SQLITE_DETERMINISTIC|SQLITE_INNOCUOUS|SQLITE_DIRECTONLY|SQLITE_UTF8,
   5379      0, base64, 0, 0);
   5380 }
   5381 
   5382 /*
   5383 ** Define some macros to allow this extension to be built into the shell
   5384 ** conveniently, in conjunction with use of SQLITE_SHELL_EXTFUNCS. This
   5385 ** allows shell.c, as distributed, to have this extension built in.
   5386 */
   5387 #define BASE64_INIT(db) sqlite3_base64_init(db, 0, 0)
   5388 #define BASE64_EXPOSE(db, pzErr) /* Not needed, ..._init() does this. */
   5389 
   5390 /************************* End ../ext/misc/base64.c ********************/
   5391 #undef sqlite3_base_init
   5392 #define sqlite3_base_init sqlite3_base85_init
   5393 #define OMIT_BASE85_CHECKER
   5394 /************************* Begin ../ext/misc/base85.c ******************/
   5395 /*
   5396 ** 2022-11-16
   5397 **
   5398 ** The author disclaims copyright to this source code.  In place of
   5399 ** a legal notice, here is a blessing:
   5400 **
   5401 **    May you do good and not evil.
   5402 **    May you find forgiveness for yourself and forgive others.
   5403 **    May you share freely, never taking more than you give.
   5404 **
   5405 *************************************************************************
   5406 **
   5407 ** This is a utility for converting binary to base85 or vice-versa.
   5408 ** It can be built as a standalone program or an SQLite3 extension.
   5409 **
   5410 ** Much like base64 representations, base85 can be sent through a
   5411 ** sane USASCII channel unmolested. It also plays nicely in CSV or
   5412 ** written as TCL brace-enclosed literals or SQL string literals.
   5413 ** It is not suited for unmodified use in XML-like documents.
   5414 **
   5415 ** The encoding used resembles Ascii85, but was devised by the author
   5416 ** (Larry Brasfield) before Mozilla, Adobe, ZMODEM or other Ascii85
   5417 ** variant sources existed, in the 1984 timeframe on a VAX mainframe.
   5418 ** Further, this is an independent implementation of a base85 system.
   5419 ** Hence, the author has rightfully put this into the public domain.
   5420 **
   5421 ** Base85 numerals are taken from the set of 7-bit USASCII codes,
   5422 ** excluding control characters and Space ! " ' ( ) { | } ~ Del
   5423 ** in code order representing digit values 0 to 84 (base 10.)
   5424 **
   5425 ** Groups of 4 bytes, interpreted as big-endian 32-bit values,
   5426 ** are represented as 5-digit base85 numbers with MS to LS digit
   5427 ** order. Groups of 1-3 bytes are represented with 2-4 digits,
   5428 ** still big-endian but 8-24 bit values. (Using big-endian yields
   5429 ** the simplest transition to byte groups smaller than 4 bytes.
   5430 ** These byte groups can also be considered base-256 numbers.)
   5431 ** Groups of 0 bytes are represented with 0 digits and vice-versa.
   5432 ** No pad characters are used; Encoded base85 numeral sequence
   5433 ** (aka "group") length maps 1-to-1 to the decoded binary length.
   5434 **
   5435 ** Any character not in the base85 numeral set delimits groups.
   5436 ** When base85 is streamed or stored in containers of indefinite
   5437 ** size, newline is used to separate it into sub-sequences of no
   5438 ** more than 80 digits so that fgets() can be used to read it.
   5439 **
   5440 ** Length limitations are not imposed except that the runtime
   5441 ** SQLite string or blob length limits are respected. Otherwise,
   5442 ** any length binary sequence can be represented and recovered.
   5443 ** Base85 sequences can be concatenated by separating them with
   5444 ** a non-base85 character; the conversion to binary will then
   5445 ** be the concatenation of the represented binary sequences.
   5446 
   5447 ** The standalone program either converts base85 on stdin to create
   5448 ** a binary file or converts a binary file to base85 on stdout.
   5449 ** Read or make it blurt its help for invocation details.
   5450 **
   5451 ** The SQLite3 extension creates a function, base85(x), which will
   5452 ** either convert text base85 to a blob or a blob to text base85
   5453 ** and return the result (or throw an error for other types.)
   5454 ** Unless built with OMIT_BASE85_CHECKER defined, it also creates a
   5455 ** function, is_base85(t), which returns 1 iff the text t contains
   5456 ** nothing other than base85 numerals and whitespace, or 0 otherwise.
   5457 **
   5458 ** To build the extension:
   5459 ** Set shell variable SQDIR=<your favorite SQLite checkout directory>
   5460 ** and variable OPTS to -DOMIT_BASE85_CHECKER if is_base85() unwanted.
   5461 ** *Nix: gcc -O2 -shared -I$SQDIR $OPTS -fPIC -o base85.so base85.c
   5462 ** OSX: gcc -O2 -dynamiclib -fPIC -I$SQDIR $OPTS -o base85.dylib base85.c
   5463 ** Win32: gcc -O2 -shared -I%SQDIR% %OPTS% -o base85.dll base85.c
   5464 ** Win32: cl /Os -I%SQDIR% %OPTS% base85.c -link -dll -out:base85.dll
   5465 **
   5466 ** To build the standalone program, define PP symbol BASE85_STANDALONE. Eg.
   5467 ** *Nix or OSX: gcc -O2 -DBASE85_STANDALONE base85.c -o base85
   5468 ** Win32: gcc -O2 -DBASE85_STANDALONE -o base85.exe base85.c
   5469 ** Win32: cl /Os /MD -DBASE85_STANDALONE base85.c
   5470 */
   5471 
   5472 #include <stdio.h>
   5473 #include <memory.h>
   5474 #include <string.h>
   5475 #include <assert.h>
   5476 #ifndef OMIT_BASE85_CHECKER
   5477 # include <ctype.h>
   5478 #endif
   5479 
   5480 #ifndef BASE85_STANDALONE
   5481 
   5482 /* # include "sqlite3ext.h" */
   5483 
   5484 SQLITE_EXTENSION_INIT1;
   5485 
   5486 #else
   5487 
   5488 # ifdef _WIN32
   5489 #  include <io.h>
   5490 #  include <fcntl.h>
   5491 # else
   5492 #  define setmode(fd,m)
   5493 # endif
   5494 
   5495 static char *zHelp =
   5496   "Usage: base85 <dirFlag> <binFile>\n"
   5497   " <dirFlag> is either -r to read or -w to write <binFile>,\n"
   5498   "   content to be converted to/from base85 on stdout/stdin.\n"
   5499   " <binFile> names a binary file to be rendered or created.\n"
   5500   "   Or, the name '-' refers to the stdin or stdout stream.\n"
   5501   ;
   5502 
   5503 static void sayHelp(){
   5504   printf("%s", zHelp);
   5505 }
   5506 #endif
   5507 
   5508 #ifndef U8_TYPEDEF
   5509 /* typedef unsigned char u8; */
   5510 #define U8_TYPEDEF
   5511 #endif
   5512 
   5513 /* Classify c according to interval within USASCII set w.r.t. base85
   5514  * Values of 1 and 3 are base85 numerals. Values of 0, 2, or 4 are not.
   5515  */
   5516 #define B85_CLASS( c ) (((c)>='#')+((c)>'&')+((c)>='*')+((c)>'z'))
   5517 
   5518 /* Provide digitValue to b85Numeral offset as a function of above class. */
   5519 static u8 b85_cOffset[] = { 0, '#', 0, '*'-4, 0 };
   5520 #define B85_DNOS( c ) b85_cOffset[B85_CLASS(c)]
   5521 
   5522 /* Say whether c is a base85 numeral. */
   5523 #define IS_B85( c ) (B85_CLASS(c) & 1)
   5524 
   5525 #if 0 /* Not used, */
   5526 static u8 base85DigitValue( char c ){
   5527   u8 dv = (u8)(c - '#');
   5528   if( dv>87 ) return 0xff;
   5529   return (dv > 3)? dv-3 : dv;
   5530 }
   5531 #endif
   5532 
   5533 /* Width of base64 lines. Should be an integer multiple of 5. */
   5534 #define B85_DARK_MAX 80
   5535 
   5536 
   5537 static char * skipNonB85( char *s, int nc ){
   5538   char c;
   5539   while( nc-- > 0 && (c = *s) && !IS_B85(c) ) ++s;
   5540   return s;
   5541 }
   5542 
   5543 /* Convert small integer, known to be in 0..84 inclusive, to base85 numeral.
   5544  * Do not use the macro form with argument expression having a side-effect.*/
   5545 #if 0
   5546 static char base85Numeral( u8 b ){
   5547   return (b < 4)? (char)(b + '#') : (char)(b - 4 + '*');
   5548 }
   5549 #else
   5550 # define base85Numeral( dn )\
   5551   ((char)(((dn) < 4)? (char)((dn) + '#') : (char)((dn) - 4 + '*')))
   5552 #endif
   5553 
   5554 static char *putcs(char *pc, char *s){
   5555   char c;
   5556   while( (c = *s++)!=0 ) *pc++ = c;
   5557   return pc;
   5558 }
   5559 
   5560 /* Encode a byte buffer into base85 text. If pSep!=0, it's a C string
   5561 ** to be appended to encoded groups to limit their length to B85_DARK_MAX
   5562 ** or to terminate the last group (to aid concatenation.)
   5563 */
   5564 static char* toBase85( u8 *pIn, int nbIn, char *pOut, char *pSep ){
   5565   int nCol = 0;
   5566   while( nbIn >= 4 ){
   5567     int nco = 5;
   5568     unsigned long qbv = (((unsigned long)pIn[0])<<24) |
   5569                         (pIn[1]<<16) | (pIn[2]<<8) | pIn[3];
   5570     while( nco > 0 ){
   5571       unsigned nqv = (unsigned)(qbv/85UL);
   5572       unsigned char dv = qbv - 85UL*nqv;
   5573       qbv = nqv;
   5574       pOut[--nco] = base85Numeral(dv);
   5575     }
   5576     nbIn -= 4;
   5577     pIn += 4;
   5578     pOut += 5;
   5579     if( pSep && (nCol += 5)>=B85_DARK_MAX ){
   5580       pOut = putcs(pOut, pSep);
   5581       nCol = 0;
   5582     }
   5583   }
   5584   if( nbIn > 0 ){
   5585     int nco = nbIn + 1;
   5586     unsigned long qv = *pIn++;
   5587     int nbe = 1;
   5588     while( nbe++ < nbIn ){
   5589       qv = (qv<<8) | *pIn++;
   5590     }
   5591     nCol += nco;
   5592     while( nco > 0 ){
   5593       u8 dv = (u8)(qv % 85);
   5594       qv /= 85;
   5595       pOut[--nco] = base85Numeral(dv);
   5596     }
   5597     pOut += (nbIn+1);
   5598   }
   5599   if( pSep && nCol>0 ) pOut = putcs(pOut, pSep);
   5600   *pOut = 0;
   5601   return pOut;
   5602 }
   5603 
   5604 /* Decode base85 text into a byte buffer. */
   5605 static u8* fromBase85( char *pIn, int ncIn, u8 *pOut ){
   5606   if( ncIn>0 && pIn[ncIn-1]=='\n' ) --ncIn;
   5607   while( ncIn>0 ){
   5608     static signed char nboi[] = { 0, 0, 1, 2, 3, 4 };
   5609     char *pUse = skipNonB85(pIn, ncIn);
   5610     unsigned long qv = 0L;
   5611     int nti, nbo;
   5612     ncIn -= (pUse - pIn);
   5613     pIn = pUse;
   5614     nti = (ncIn>5)? 5 : ncIn;
   5615     nbo = nboi[nti];
   5616     if( nbo==0 ) break;
   5617     while( nti>0 ){
   5618       char c = *pIn++;
   5619       u8 cdo = B85_DNOS(c);
   5620       --ncIn;
   5621       if( cdo==0 ) break;
   5622       qv = 85 * qv + (c - cdo);
   5623       --nti;
   5624     }
   5625     nbo -= nti; /* Adjust for early (non-digit) end of group. */
   5626     switch( nbo ){
   5627     case 4:
   5628       *pOut++ = (qv >> 24)&0xff;
   5629       /* FALLTHRU */
   5630     case 3:
   5631       *pOut++ = (qv >> 16)&0xff;
   5632       /* FALLTHRU */
   5633     case 2:
   5634       *pOut++ = (qv >> 8)&0xff;
   5635       /* FALLTHRU */
   5636     case 1:
   5637       *pOut++ = qv&0xff;
   5638       /* FALLTHRU */
   5639     case 0:
   5640       break;
   5641     }
   5642   }
   5643   return pOut;
   5644 }
   5645 
   5646 #ifndef OMIT_BASE85_CHECKER
   5647 /* Say whether input char sequence is all (base85 and/or whitespace).*/
   5648 static int allBase85( char *p, int len ){
   5649   char c;
   5650   while( len-- > 0 && (c = *p++) != 0 ){
   5651     if( !IS_B85(c) && !isspace(c) ) return 0;
   5652   }
   5653   return 1;
   5654 }
   5655 #endif
   5656 
   5657 #ifndef BASE85_STANDALONE
   5658 
   5659 # ifndef OMIT_BASE85_CHECKER
   5660 /* This function does the work for the SQLite is_base85(t) UDF. */
   5661 static void is_base85(sqlite3_context *context, int na, sqlite3_value *av[]){
   5662   assert(na==1);
   5663   switch( sqlite3_value_type(av[0]) ){
   5664   case SQLITE_TEXT:
   5665     {
   5666       int rv = allBase85( (char *)sqlite3_value_text(av[0]),
   5667                           sqlite3_value_bytes(av[0]) );
   5668       sqlite3_result_int(context, rv);
   5669     }
   5670     break;
   5671   case SQLITE_NULL:
   5672     sqlite3_result_null(context);
   5673     break;
   5674   default:
   5675     sqlite3_result_error(context, "is_base85 accepts only text or NULL", -1);
   5676     return;
   5677   }
   5678 }
   5679 # endif
   5680 
   5681 /* This function does the work for the SQLite base85(x) UDF. */
   5682 static void base85(sqlite3_context *context, int na, sqlite3_value *av[]){
   5683   int nb, nc, nv = sqlite3_value_bytes(av[0]);
   5684   int nvMax = sqlite3_limit(sqlite3_context_db_handle(context),
   5685                             SQLITE_LIMIT_LENGTH, -1);
   5686   char *cBuf;
   5687   u8 *bBuf;
   5688   assert(na==1);
   5689   switch( sqlite3_value_type(av[0]) ){
   5690   case SQLITE_BLOB:
   5691     nb = nv;
   5692     /*    ulongs    tail   newlines  tailenc+nul*/
   5693     nc = 5*(nv/4) + nv%4 + nv/64+1 + 2;
   5694     if( nvMax < nc ){
   5695       sqlite3_result_error(context, "blob expanded to base85 too big", -1);
   5696       return;
   5697     }
   5698     bBuf = (u8*)sqlite3_value_blob(av[0]);
   5699     if( !bBuf ){
   5700       if( SQLITE_NOMEM==sqlite3_errcode(sqlite3_context_db_handle(context)) ){
   5701         goto memFail;
   5702       }
   5703       sqlite3_result_text(context,"",-1,SQLITE_STATIC);
   5704       break;
   5705     }
   5706     cBuf = sqlite3_malloc(nc);
   5707     if( !cBuf ) goto memFail;
   5708     nc = (int)(toBase85(bBuf, nb, cBuf, "\n") - cBuf);
   5709     sqlite3_result_text(context, cBuf, nc, sqlite3_free);
   5710     break;
   5711   case SQLITE_TEXT:
   5712     nc = nv;
   5713     nb = 4*(nv/5) + nv%5; /* may overestimate */
   5714     if( nvMax < nb ){
   5715       sqlite3_result_error(context, "blob from base85 may be too big", -1);
   5716       return;
   5717     }else if( nb<1 ){
   5718       nb = 1;
   5719     }
   5720     cBuf = (char *)sqlite3_value_text(av[0]);
   5721     if( !cBuf ){
   5722       if( SQLITE_NOMEM==sqlite3_errcode(sqlite3_context_db_handle(context)) ){
   5723         goto memFail;
   5724       }
   5725       sqlite3_result_zeroblob(context, 0);
   5726       break;
   5727     }
   5728     bBuf = sqlite3_malloc(nb);
   5729     if( !bBuf ) goto memFail;
   5730     nb = (int)(fromBase85(cBuf, nc, bBuf) - bBuf);
   5731     sqlite3_result_blob(context, bBuf, nb, sqlite3_free);
   5732     break;
   5733   default:
   5734     sqlite3_result_error(context, "base85 accepts only blob or text.", -1);
   5735     return;
   5736   }
   5737   return;
   5738  memFail:
   5739   sqlite3_result_error(context, "base85 OOM", -1);
   5740 }
   5741 
   5742 /*
   5743 ** Establish linkage to running SQLite library.
   5744 */
   5745 #ifndef SQLITE_SHELL_EXTFUNCS
   5746 #ifdef _WIN32
   5747 
   5748 #endif
   5749 int sqlite3_base_init
   5750 #else
   5751 static int sqlite3_base85_init
   5752 #endif
   5753 (sqlite3 *db, char **pzErr, const sqlite3_api_routines *pApi){
   5754   SQLITE_EXTENSION_INIT2(pApi);
   5755   (void)pzErr;
   5756 # ifndef OMIT_BASE85_CHECKER
   5757   {
   5758     int rc = sqlite3_create_function
   5759       (db, "is_base85", 1,
   5760        SQLITE_DETERMINISTIC|SQLITE_INNOCUOUS|SQLITE_UTF8,
   5761        0, is_base85, 0, 0);
   5762     if( rc!=SQLITE_OK ) return rc;
   5763   }
   5764 # endif
   5765   return sqlite3_create_function
   5766     (db, "base85", 1,
   5767      SQLITE_DETERMINISTIC|SQLITE_INNOCUOUS|SQLITE_DIRECTONLY|SQLITE_UTF8,
   5768      0, base85, 0, 0);
   5769 }
   5770 
   5771 /*
   5772 ** Define some macros to allow this extension to be built into the shell
   5773 ** conveniently, in conjunction with use of SQLITE_SHELL_EXTFUNCS. This
   5774 ** allows shell.c, as distributed, to have this extension built in.
   5775 */
   5776 # define BASE85_INIT(db) sqlite3_base85_init(db, 0, 0)
   5777 # define BASE85_EXPOSE(db, pzErr) /* Not needed, ..._init() does this. */
   5778 
   5779 #else /* standalone program */
   5780 
   5781 int main(int na, char *av[]){
   5782   int cin;
   5783   int rc = 0;
   5784   u8 bBuf[4*(B85_DARK_MAX/5)];
   5785   char cBuf[5*(sizeof(bBuf)/4)+2];
   5786   size_t nio;
   5787 # ifndef OMIT_BASE85_CHECKER
   5788   int b85Clean = 1;
   5789 # endif
   5790   char rw;
   5791   FILE *fb = 0, *foc = 0;
   5792   char fmode[3] = "xb";
   5793   if( na < 3 || av[1][0]!='-' || (rw = av[1][1])==0 || (rw!='r' && rw!='w') ){
   5794     sayHelp();
   5795     return 0;
   5796   }
   5797   fmode[0] = rw;
   5798   if( av[2][0]=='-' && av[2][1]==0 ){
   5799     switch( rw ){
   5800     case 'r':
   5801       fb = stdin;
   5802       setmode(fileno(stdin), O_BINARY);
   5803       break;
   5804     case 'w':
   5805       fb = stdout;
   5806       setmode(fileno(stdout), O_BINARY);
   5807       break;
   5808     }
   5809   }else{
   5810     fb = fopen(av[2], fmode);
   5811     foc = fb;
   5812   }
   5813   if( !fb ){
   5814     fprintf(stderr, "Cannot open %s for %c\n", av[2], rw);
   5815     rc = 1;
   5816   }else{
   5817     switch( rw ){
   5818     case 'r':
   5819       while( (nio = fread( bBuf, 1, sizeof(bBuf), fb))>0 ){
   5820         toBase85( bBuf, (int)nio, cBuf, 0 );
   5821         fprintf(stdout, "%s\n", cBuf);
   5822       }
   5823       break;
   5824     case 'w':
   5825       while( 0 != fgets(cBuf, sizeof(cBuf), stdin) ){
   5826         int nc = strlen(cBuf);
   5827         size_t nbo = fromBase85( cBuf, nc, bBuf ) - bBuf;
   5828         if( 1 != fwrite(bBuf, nbo, 1, fb) ) rc = 1;
   5829 # ifndef OMIT_BASE85_CHECKER
   5830         b85Clean &= allBase85( cBuf, nc );
   5831 # endif
   5832       }
   5833       break;
   5834     default:
   5835       sayHelp();
   5836       rc = 1;
   5837     }
   5838     if( foc ) fclose(foc);
   5839   }
   5840 # ifndef OMIT_BASE85_CHECKER
   5841   if( !b85Clean ){
   5842     fprintf(stderr, "Base85 input had non-base85 dark or control content.\n");
   5843   }
   5844 # endif
   5845   return rc;
   5846 }
   5847 
   5848 #endif
   5849 
   5850 /************************* End ../ext/misc/base85.c ********************/
   5851 /************************* Begin ../ext/misc/ieee754.c ******************/
   5852 /*
   5853 ** 2013-04-17
   5854 **
   5855 ** The author disclaims copyright to this source code.  In place of
   5856 ** a legal notice, here is a blessing:
   5857 **
   5858 **    May you do good and not evil.
   5859 **    May you find forgiveness for yourself and forgive others.
   5860 **    May you share freely, never taking more than you give.
   5861 **
   5862 ******************************************************************************
   5863 **
   5864 ** This SQLite extension implements functions for the exact display
   5865 ** and input of IEEE754 Binary64 floating-point numbers.
   5866 **
   5867 **   ieee754(X)
   5868 **   ieee754(Y,Z)
   5869 **
   5870 ** In the first form, the value X should be a floating-point number.
   5871 ** The function will return a string of the form 'ieee754(Y,Z)' where
   5872 ** Y and Z are integers such that X==Y*pow(2,Z).
   5873 **
   5874 ** In the second form, Y and Z are integers which are the mantissa and
   5875 ** base-2 exponent of a new floating point number.  The function returns
   5876 ** a floating-point value equal to Y*pow(2,Z).
   5877 **
   5878 ** Examples:
   5879 **
   5880 **     ieee754(2.0)             ->     'ieee754(2,0)'
   5881 **     ieee754(45.25)           ->     'ieee754(181,-2)'
   5882 **     ieee754(2, 0)            ->     2.0
   5883 **     ieee754(181, -2)         ->     45.25
   5884 **
   5885 ** Two additional functions break apart the one-argument ieee754()
   5886 ** result into separate integer values:
   5887 **
   5888 **     ieee754_mantissa(45.25)  ->     181
   5889 **     ieee754_exponent(45.25)  ->     -2
   5890 **
   5891 ** These functions convert binary64 numbers into blobs and back again.
   5892 **
   5893 **     ieee754_from_blob(x'3ff0000000000000')  ->  1.0
   5894 **     ieee754_to_blob(1.0)                    ->  x'3ff0000000000000'
   5895 **
   5896 ** In all single-argument functions, if the argument is an 8-byte blob
   5897 ** then that blob is interpreted as a big-endian binary64 value.
   5898 **
   5899 **
   5900 ** EXACT DECIMAL REPRESENTATION OF BINARY64 VALUES
   5901 ** -----------------------------------------------
   5902 **
   5903 ** This extension in combination with the separate 'decimal' extension
   5904 ** can be used to compute the exact decimal representation of binary64
   5905 ** values.  To begin, first compute a table of exponent values:
   5906 **
   5907 **    CREATE TABLE pow2(x INTEGER PRIMARY KEY, v TEXT);
   5908 **    WITH RECURSIVE c(x,v) AS (
   5909 **      VALUES(0,'1')
   5910 **      UNION ALL
   5911 **      SELECT x+1, decimal_mul(v,'2') FROM c WHERE x+1<=971
   5912 **    ) INSERT INTO pow2(x,v) SELECT x, v FROM c;
   5913 **    WITH RECURSIVE c(x,v) AS (
   5914 **      VALUES(-1,'0.5')
   5915 **      UNION ALL
   5916 **      SELECT x-1, decimal_mul(v,'0.5') FROM c WHERE x-1>=-1075
   5917 **    ) INSERT INTO pow2(x,v) SELECT x, v FROM c;
   5918 **
   5919 ** Then, to compute the exact decimal representation of a floating
   5920 ** point value (the value 47.49 is used in the example) do:
   5921 **
   5922 **    WITH c(n) AS (VALUES(47.49))
   5923 **          ---------------^^^^^---- Replace with whatever you want
   5924 **    SELECT decimal_mul(ieee754_mantissa(c.n),pow2.v)
   5925 **      FROM pow2, c WHERE pow2.x=ieee754_exponent(c.n);
   5926 **
   5927 ** Here is a query to show various boundry values for the binary64
   5928 ** number format:
   5929 **
   5930 **    WITH c(name,bin) AS (VALUES
   5931 **       ('minimum positive value',        x'0000000000000001'),
   5932 **       ('maximum subnormal value',       x'000fffffffffffff'),
   5933 **       ('minimum positive normal value', x'0010000000000000'),
   5934 **       ('maximum value',                 x'7fefffffffffffff'))
   5935 **    SELECT c.name, decimal_mul(ieee754_mantissa(c.bin),pow2.v)
   5936 **      FROM pow2, c WHERE pow2.x=ieee754_exponent(c.bin);
   5937 **
   5938 */
   5939 /* #include "sqlite3ext.h" */
   5940 SQLITE_EXTENSION_INIT1
   5941 #include <assert.h>
   5942 #include <string.h>
   5943 
   5944 /* Mark a function parameter as unused, to suppress nuisance compiler
   5945 ** warnings. */
   5946 #ifndef UNUSED_PARAMETER
   5947 # define UNUSED_PARAMETER(X)  (void)(X)
   5948 #endif
   5949 
   5950 /*
   5951 ** Implementation of the ieee754() function
   5952 */
   5953 static void ieee754func(
   5954   sqlite3_context *context,
   5955   int argc,
   5956   sqlite3_value **argv
   5957 ){
   5958   if( argc==1 ){
   5959     sqlite3_int64 m, a;
   5960     double r;
   5961     int e;
   5962     int isNeg;
   5963     char zResult[100];
   5964     assert( sizeof(m)==sizeof(r) );
   5965     if( sqlite3_value_type(argv[0])==SQLITE_BLOB
   5966      && sqlite3_value_bytes(argv[0])==sizeof(r)
   5967     ){
   5968       const unsigned char *x = sqlite3_value_blob(argv[0]);
   5969       unsigned int i;
   5970       sqlite3_uint64 v = 0;
   5971       for(i=0; i<sizeof(r); i++){
   5972         v = (v<<8) | x[i];
   5973       }
   5974       memcpy(&r, &v, sizeof(r));
   5975     }else{
   5976       r = sqlite3_value_double(argv[0]);
   5977     }
   5978     if( r<0.0 ){
   5979       isNeg = 1;
   5980       r = -r;
   5981     }else{
   5982       isNeg = 0;
   5983     }
   5984     memcpy(&a,&r,sizeof(a));
   5985     if( a==0 ){
   5986       e = 0;
   5987       m = 0;
   5988     }else{
   5989       e = a>>52;
   5990       m = a & ((((sqlite3_int64)1)<<52)-1);
   5991       if( e==0 ){
   5992         m <<= 1;
   5993       }else{
   5994         m |= ((sqlite3_int64)1)<<52;
   5995       }
   5996       while( e<1075 && m>0 && (m&1)==0 ){
   5997         m >>= 1;
   5998         e++;
   5999       }
   6000       if( isNeg ) m = -m;
   6001     }
   6002     switch( *(int*)sqlite3_user_data(context) ){
   6003       case 0:
   6004         sqlite3_snprintf(sizeof(zResult), zResult, "ieee754(%lld,%d)",
   6005                          m, e-1075);
   6006         sqlite3_result_text(context, zResult, -1, SQLITE_TRANSIENT);
   6007         break;
   6008       case 1:
   6009         sqlite3_result_int64(context, m);
   6010         break;
   6011       case 2:
   6012         sqlite3_result_int(context, e-1075);
   6013         break;
   6014     }
   6015   }else{
   6016     sqlite3_int64 m, e, a;
   6017     double r;
   6018     int isNeg = 0;
   6019     m = sqlite3_value_int64(argv[0]);
   6020     e = sqlite3_value_int64(argv[1]);
   6021 
   6022     /* Limit the range of e.  Ticket 22dea1cfdb9151e4 2021-03-02 */
   6023     if( e>10000 ){
   6024       e = 10000;
   6025     }else if( e<-10000 ){
   6026       e = -10000;
   6027     }
   6028 
   6029     if( m<0 ){
   6030       isNeg = 1;
   6031       m = -m;
   6032       if( m<0 ) return;
   6033     }else if( m==0 && e>-1000 && e<1000 ){
   6034       sqlite3_result_double(context, 0.0);
   6035       return;
   6036     }
   6037     while( (m>>32)&0xffe00000 ){
   6038       m >>= 1;
   6039       e++;
   6040     }
   6041     while( m!=0 && ((m>>32)&0xfff00000)==0 ){
   6042       m <<= 1;
   6043       e--;
   6044     }
   6045     e += 1075;
   6046     if( e<=0 ){
   6047       /* Subnormal */
   6048       if( 1-e >= 64 ){
   6049         m = 0;
   6050       }else{
   6051         m >>= 1-e;
   6052       }
   6053       e = 0;
   6054     }else if( e>0x7ff ){
   6055       e = 0x7ff;
   6056     }
   6057     a = m & ((((sqlite3_int64)1)<<52)-1);
   6058     a |= e<<52;
   6059     if( isNeg ) a |= ((sqlite3_uint64)1)<<63;
   6060     memcpy(&r, &a, sizeof(r));
   6061     sqlite3_result_double(context, r);
   6062   }
   6063 }
   6064 
   6065 /*
   6066 ** Functions to convert between blobs and floats.
   6067 */
   6068 static void ieee754func_from_blob(
   6069   sqlite3_context *context,
   6070   int argc,
   6071   sqlite3_value **argv
   6072 ){
   6073   UNUSED_PARAMETER(argc);
   6074   if( sqlite3_value_type(argv[0])==SQLITE_BLOB
   6075    && sqlite3_value_bytes(argv[0])==sizeof(double)
   6076   ){
   6077     double r;
   6078     const unsigned char *x = sqlite3_value_blob(argv[0]);
   6079     unsigned int i;
   6080     sqlite3_uint64 v = 0;
   6081     for(i=0; i<sizeof(r); i++){
   6082       v = (v<<8) | x[i];
   6083     }
   6084     memcpy(&r, &v, sizeof(r));
   6085     sqlite3_result_double(context, r);
   6086   }
   6087 }
   6088 static void ieee754func_to_blob(
   6089   sqlite3_context *context,
   6090   int argc,
   6091   sqlite3_value **argv
   6092 ){
   6093   UNUSED_PARAMETER(argc);
   6094   if( sqlite3_value_type(argv[0])==SQLITE_FLOAT
   6095    || sqlite3_value_type(argv[0])==SQLITE_INTEGER
   6096   ){
   6097     double r = sqlite3_value_double(argv[0]);
   6098     sqlite3_uint64 v;
   6099     unsigned char a[sizeof(r)];
   6100     unsigned int i;
   6101     memcpy(&v, &r, sizeof(r));
   6102     for(i=1; i<=sizeof(r); i++){
   6103       a[sizeof(r)-i] = v&0xff;
   6104       v >>= 8;
   6105     }
   6106     sqlite3_result_blob(context, a, sizeof(r), SQLITE_TRANSIENT);
   6107   }
   6108 }
   6109 
   6110 /*
   6111 ** SQL Function:   ieee754_inc(r,N)
   6112 **
   6113 ** Move the floating point value r by N quantums and return the new
   6114 ** values.
   6115 **
   6116 ** Behind the scenes: this routine merely casts r into a 64-bit unsigned
   6117 ** integer, adds N, then casts the value back into float.
   6118 **
   6119 ** Example:  To find the smallest positive number:
   6120 **
   6121 **     SELECT ieee754_inc(0.0,+1);
   6122 */
   6123 static void ieee754inc(
   6124   sqlite3_context *context,
   6125   int argc,
   6126   sqlite3_value **argv
   6127 ){
   6128   double r;
   6129   sqlite3_int64 N;
   6130   sqlite3_uint64 m1, m2;
   6131   double r2;
   6132   UNUSED_PARAMETER(argc);
   6133   r = sqlite3_value_double(argv[0]);
   6134   N = sqlite3_value_int64(argv[1]);
   6135   memcpy(&m1, &r, 8);
   6136   m2 = m1 + N;
   6137   memcpy(&r2, &m2, 8);
   6138   sqlite3_result_double(context, r2);
   6139 }
   6140 
   6141 
   6142 #ifdef _WIN32
   6143 
   6144 #endif
   6145 int sqlite3_ieee_init(
   6146   sqlite3 *db, 
   6147   char **pzErrMsg, 
   6148   const sqlite3_api_routines *pApi
   6149 ){
   6150   static const struct {
   6151     char *zFName;
   6152     int nArg;
   6153     int iAux;
   6154     void (*xFunc)(sqlite3_context*,int,sqlite3_value**);
   6155   } aFunc[] = {
   6156     { "ieee754",           1,   0, ieee754func },
   6157     { "ieee754",           2,   0, ieee754func },
   6158     { "ieee754_mantissa",  1,   1, ieee754func },
   6159     { "ieee754_exponent",  1,   2, ieee754func },
   6160     { "ieee754_to_blob",   1,   0, ieee754func_to_blob },
   6161     { "ieee754_from_blob", 1,   0, ieee754func_from_blob },
   6162     { "ieee754_inc",       2,   0, ieee754inc  },
   6163   };
   6164   unsigned int i;
   6165   int rc = SQLITE_OK;
   6166   SQLITE_EXTENSION_INIT2(pApi);
   6167   (void)pzErrMsg;  /* Unused parameter */
   6168   for(i=0; i<sizeof(aFunc)/sizeof(aFunc[0]) && rc==SQLITE_OK; i++){
   6169     rc = sqlite3_create_function(db, aFunc[i].zFName, aFunc[i].nArg,
   6170                                SQLITE_UTF8|SQLITE_INNOCUOUS,
   6171                                (void*)&aFunc[i].iAux,
   6172                                aFunc[i].xFunc, 0, 0);
   6173   }
   6174   return rc;
   6175 }
   6176 
   6177 /************************* End ../ext/misc/ieee754.c ********************/
   6178 /************************* Begin ../ext/misc/series.c ******************/
   6179 /*
   6180 ** 2015-08-18, 2023-04-28
   6181 **
   6182 ** The author disclaims copyright to this source code.  In place of
   6183 ** a legal notice, here is a blessing:
   6184 **
   6185 **    May you do good and not evil.
   6186 **    May you find forgiveness for yourself and forgive others.
   6187 **    May you share freely, never taking more than you give.
   6188 **
   6189 *************************************************************************
   6190 **
   6191 ** This file demonstrates how to create a table-valued-function using
   6192 ** a virtual table.  This demo implements the generate_series() function
   6193 ** which gives the same results as the eponymous function in PostgreSQL,
   6194 ** within the limitation that its arguments are signed 64-bit integers.
   6195 **
   6196 ** Considering its equivalents to generate_series(start,stop,step): A
   6197 ** value V[n] sequence is produced for integer n ascending from 0 where
   6198 **  ( V[n] == start + n * step  &&  sgn(V[n] - stop) * sgn(step) >= 0 )
   6199 ** for each produced value (independent of production time ordering.)
   6200 **
   6201 ** All parameters must be either integer or convertable to integer.
   6202 ** The start parameter is required.
   6203 ** The stop parameter defaults to (1<<32)-1 (aka 4294967295 or 0xffffffff)
   6204 ** The step parameter defaults to 1 and 0 is treated as 1.
   6205 **
   6206 ** Examples:
   6207 **
   6208 **      SELECT * FROM generate_series(0,100,5);
   6209 **
   6210 ** The query above returns integers from 0 through 100 counting by steps
   6211 ** of 5.
   6212 **
   6213 **      SELECT * FROM generate_series(0,100);
   6214 **
   6215 ** Integers from 0 through 100 with a step size of 1.
   6216 **
   6217 **      SELECT * FROM generate_series(20) LIMIT 10;
   6218 **
   6219 ** Integers 20 through 29.
   6220 **
   6221 **      SELECT * FROM generate_series(0,-100,-5);
   6222 **
   6223 ** Integers 0 -5 -10 ... -100.
   6224 **
   6225 **      SELECT * FROM generate_series(0,-1);
   6226 **
   6227 ** Empty sequence.
   6228 **
   6229 ** HOW IT WORKS
   6230 **
   6231 ** The generate_series "function" is really a virtual table with the
   6232 ** following schema:
   6233 **
   6234 **     CREATE TABLE generate_series(
   6235 **       value,
   6236 **       start HIDDEN,
   6237 **       stop HIDDEN,
   6238 **       step HIDDEN
   6239 **     );
   6240 **
   6241 ** The virtual table also has a rowid which is an alias for the value.
   6242 **
   6243 ** Function arguments in queries against this virtual table are translated
   6244 ** into equality constraints against successive hidden columns.  In other
   6245 ** words, the following pairs of queries are equivalent to each other:
   6246 **
   6247 **    SELECT * FROM generate_series(0,100,5);
   6248 **    SELECT * FROM generate_series WHERE start=0 AND stop=100 AND step=5;
   6249 **
   6250 **    SELECT * FROM generate_series(0,100);
   6251 **    SELECT * FROM generate_series WHERE start=0 AND stop=100;
   6252 **
   6253 **    SELECT * FROM generate_series(20) LIMIT 10;
   6254 **    SELECT * FROM generate_series WHERE start=20 LIMIT 10;
   6255 **
   6256 ** The generate_series virtual table implementation leaves the xCreate method
   6257 ** set to NULL.  This means that it is not possible to do a CREATE VIRTUAL
   6258 ** TABLE command with "generate_series" as the USING argument.  Instead, there
   6259 ** is a single generate_series virtual table that is always available without
   6260 ** having to be created first.
   6261 **
   6262 ** The xBestIndex method looks for equality constraints against the hidden
   6263 ** start, stop, and step columns, and if present, it uses those constraints
   6264 ** to bound the sequence of generated values.  If the equality constraints
   6265 ** are missing, it uses 0 for start, 4294967295 for stop, and 1 for step.
   6266 ** xBestIndex returns a small cost when both start and stop are available,
   6267 ** and a very large cost if either start or stop are unavailable.  This
   6268 ** encourages the query planner to order joins such that the bounds of the
   6269 ** series are well-defined.
   6270 **
   6271 ** Update on 2024-08-22:
   6272 ** xBestIndex now also looks for equality and inequality constraints against
   6273 ** the value column and uses those constraints as additional bounds against
   6274 ** the sequence range.  Thus, a query like this:
   6275 **
   6276 **     SELECT value FROM generate_series($SA,$EA)
   6277 **      WHERE value BETWEEN $SB AND $EB;
   6278 **
   6279 ** Is logically the same as:
   6280 **
   6281 **     SELECT value FROM generate_series(max($SA,$SB),min($EA,$EB));
   6282 **
   6283 ** Constraints on the value column can server as substitutes for constraints
   6284 ** on the hidden start and stop columns.  So, the following two queries
   6285 ** are equivalent:
   6286 **
   6287 **     SELECT value FROM generate_series($S,$E);
   6288 **     SELECT value FROM generate_series WHERE value BETWEEN $S and $E;
   6289 **
   6290 */
   6291 /* #include "sqlite3ext.h" */
   6292 SQLITE_EXTENSION_INIT1
   6293 #include <assert.h>
   6294 #include <string.h>
   6295 #include <limits.h>
   6296 #include <math.h>
   6297 
   6298 #ifndef SQLITE_OMIT_VIRTUALTABLE
   6299 /*
   6300 ** Return that member of a generate_series(...) sequence whose 0-based
   6301 ** index is ix. The 0th member is given by smBase. The sequence members
   6302 ** progress per ix increment by smStep.
   6303 */
   6304 static sqlite3_int64 genSeqMember(
   6305   sqlite3_int64 smBase,
   6306   sqlite3_int64 smStep,
   6307   sqlite3_uint64 ix
   6308 ){
   6309   static const sqlite3_uint64 mxI64 =
   6310       ((sqlite3_uint64)0x7fffffff)<<32 | 0xffffffff;
   6311   if( ix>=mxI64 ){
   6312     /* Get ix into signed i64 range. */
   6313     ix -= mxI64;
   6314     /* With 2's complement ALU, this next can be 1 step, but is split into
   6315      * 2 for UBSAN's satisfaction (and hypothetical 1's complement ALUs.) */
   6316     smBase += (mxI64/2) * smStep;
   6317     smBase += (mxI64 - mxI64/2) * smStep;
   6318   }
   6319   /* Under UBSAN (or on 1's complement machines), must do this last term
   6320    * in steps to avoid the dreaded (and harmless) signed multiply overflow. */
   6321   if( ix>=2 ){
   6322     sqlite3_int64 ix2 = (sqlite3_int64)ix/2;
   6323     smBase += ix2*smStep;
   6324     ix -= ix2;
   6325   }
   6326   return smBase + ((sqlite3_int64)ix)*smStep;
   6327 }
   6328 
   6329 /* typedef unsigned char u8; */
   6330 
   6331 typedef struct SequenceSpec {
   6332   sqlite3_int64 iOBase;        /* Original starting value ("start") */
   6333   sqlite3_int64 iOTerm;        /* Original terminal value ("stop") */
   6334   sqlite3_int64 iBase;         /* Starting value to actually use */
   6335   sqlite3_int64 iTerm;         /* Terminal value to actually use */
   6336   sqlite3_int64 iStep;         /* Increment ("step") */
   6337   sqlite3_uint64 uSeqIndexMax; /* maximum sequence index (aka "n") */
   6338   sqlite3_uint64 uSeqIndexNow; /* Current index during generation */
   6339   sqlite3_int64 iValueNow;     /* Current value during generation */
   6340   u8 isNotEOF;                 /* Sequence generation not exhausted */
   6341   u8 isReversing;              /* Sequence is being reverse generated */
   6342 } SequenceSpec;
   6343 
   6344 /*
   6345 ** Prepare a SequenceSpec for use in generating an integer series
   6346 ** given initialized iBase, iTerm and iStep values. Sequence is
   6347 ** initialized per given isReversing. Other members are computed.
   6348 */
   6349 static void setupSequence( SequenceSpec *pss ){
   6350   int bSameSigns;
   6351   pss->uSeqIndexMax = 0;
   6352   pss->isNotEOF = 0;
   6353   bSameSigns = (pss->iBase < 0)==(pss->iTerm < 0);
   6354   if( pss->iTerm < pss->iBase ){
   6355     sqlite3_uint64 nuspan = 0;
   6356     if( bSameSigns ){
   6357       nuspan = (sqlite3_uint64)(pss->iBase - pss->iTerm);
   6358     }else{
   6359       /* Under UBSAN (or on 1's complement machines), must do this in steps.
   6360        * In this clause, iBase>=0 and iTerm<0 . */
   6361       nuspan = 1;
   6362       nuspan += pss->iBase;
   6363       nuspan += -(pss->iTerm+1);
   6364     }
   6365     if( pss->iStep<0 ){
   6366       pss->isNotEOF = 1;
   6367       if( nuspan==ULONG_MAX ){
   6368         pss->uSeqIndexMax = ( pss->iStep>LLONG_MIN )? nuspan/-pss->iStep : 1;
   6369       }else if( pss->iStep>LLONG_MIN ){
   6370         pss->uSeqIndexMax = nuspan/-pss->iStep;
   6371       }
   6372     }
   6373   }else if( pss->iTerm > pss->iBase ){
   6374     sqlite3_uint64 puspan = 0;
   6375     if( bSameSigns ){
   6376       puspan = (sqlite3_uint64)(pss->iTerm - pss->iBase);
   6377     }else{
   6378       /* Under UBSAN (or on 1's complement machines), must do this in steps.
   6379        * In this clause, iTerm>=0 and iBase<0 . */
   6380       puspan = 1;
   6381       puspan += pss->iTerm;
   6382       puspan += -(pss->iBase+1);
   6383     }
   6384     if( pss->iStep>0 ){
   6385       pss->isNotEOF = 1;
   6386       pss->uSeqIndexMax = puspan/pss->iStep;
   6387     }
   6388   }else if( pss->iTerm == pss->iBase ){
   6389       pss->isNotEOF = 1;
   6390       pss->uSeqIndexMax = 0;
   6391   }
   6392   pss->uSeqIndexNow = (pss->isReversing)? pss->uSeqIndexMax : 0;
   6393   pss->iValueNow = (pss->isReversing)
   6394     ? genSeqMember(pss->iBase, pss->iStep, pss->uSeqIndexMax)
   6395     : pss->iBase;
   6396 }
   6397 
   6398 /*
   6399 ** Progress sequence generator to yield next value, if any.
   6400 ** Leave its state to either yield next value or be at EOF.
   6401 ** Return whether there is a next value, or 0 at EOF.
   6402 */
   6403 static int progressSequence( SequenceSpec *pss ){
   6404   if( !pss->isNotEOF ) return 0;
   6405   if( pss->isReversing ){
   6406     if( pss->uSeqIndexNow > 0 ){
   6407       pss->uSeqIndexNow--;
   6408       pss->iValueNow -= pss->iStep;
   6409     }else{
   6410       pss->isNotEOF = 0;
   6411     }
   6412   }else{
   6413     if( pss->uSeqIndexNow < pss->uSeqIndexMax ){
   6414       pss->uSeqIndexNow++;
   6415       pss->iValueNow += pss->iStep;
   6416     }else{
   6417       pss->isNotEOF = 0;
   6418     }
   6419   }
   6420   return pss->isNotEOF;
   6421 }
   6422 
   6423 /* series_cursor is a subclass of sqlite3_vtab_cursor which will
   6424 ** serve as the underlying representation of a cursor that scans
   6425 ** over rows of the result
   6426 */
   6427 typedef struct series_cursor series_cursor;
   6428 struct series_cursor {
   6429   sqlite3_vtab_cursor base;  /* Base class - must be first */
   6430   SequenceSpec ss;           /* (this) Derived class data */
   6431 };
   6432 
   6433 /*
   6434 ** The seriesConnect() method is invoked to create a new
   6435 ** series_vtab that describes the generate_series virtual table.
   6436 **
   6437 ** Think of this routine as the constructor for series_vtab objects.
   6438 **
   6439 ** All this routine needs to do is:
   6440 **
   6441 **    (1) Allocate the series_vtab object and initialize all fields.
   6442 **
   6443 **    (2) Tell SQLite (via the sqlite3_declare_vtab() interface) what the
   6444 **        result set of queries against generate_series will look like.
   6445 */
   6446 static int seriesConnect(
   6447   sqlite3 *db,
   6448   void *pUnused,
   6449   int argcUnused, const char *const*argvUnused,
   6450   sqlite3_vtab **ppVtab,
   6451   char **pzErrUnused
   6452 ){
   6453   sqlite3_vtab *pNew;
   6454   int rc;
   6455 
   6456 /* Column numbers */
   6457 #define SERIES_COLUMN_ROWID (-1)
   6458 #define SERIES_COLUMN_VALUE 0
   6459 #define SERIES_COLUMN_START 1
   6460 #define SERIES_COLUMN_STOP  2
   6461 #define SERIES_COLUMN_STEP  3
   6462 
   6463   (void)pUnused;
   6464   (void)argcUnused;
   6465   (void)argvUnused;
   6466   (void)pzErrUnused;
   6467   rc = sqlite3_declare_vtab(db,
   6468      "CREATE TABLE x(value,start hidden,stop hidden,step hidden)");
   6469   if( rc==SQLITE_OK ){
   6470     pNew = *ppVtab = sqlite3_malloc( sizeof(*pNew) );
   6471     if( pNew==0 ) return SQLITE_NOMEM;
   6472     memset(pNew, 0, sizeof(*pNew));
   6473     sqlite3_vtab_config(db, SQLITE_VTAB_INNOCUOUS);
   6474   }
   6475   return rc;
   6476 }
   6477 
   6478 /*
   6479 ** This method is the destructor for series_cursor objects.
   6480 */
   6481 static int seriesDisconnect(sqlite3_vtab *pVtab){
   6482   sqlite3_free(pVtab);
   6483   return SQLITE_OK;
   6484 }
   6485 
   6486 /*
   6487 ** Constructor for a new series_cursor object.
   6488 */
   6489 static int seriesOpen(sqlite3_vtab *pUnused, sqlite3_vtab_cursor **ppCursor){
   6490   series_cursor *pCur;
   6491   (void)pUnused;
   6492   pCur = sqlite3_malloc( sizeof(*pCur) );
   6493   if( pCur==0 ) return SQLITE_NOMEM;
   6494   memset(pCur, 0, sizeof(*pCur));
   6495   *ppCursor = &pCur->base;
   6496   return SQLITE_OK;
   6497 }
   6498 
   6499 /*
   6500 ** Destructor for a series_cursor.
   6501 */
   6502 static int seriesClose(sqlite3_vtab_cursor *cur){
   6503   sqlite3_free(cur);
   6504   return SQLITE_OK;
   6505 }
   6506 
   6507 
   6508 /*
   6509 ** Advance a series_cursor to its next row of output.
   6510 */
   6511 static int seriesNext(sqlite3_vtab_cursor *cur){
   6512   series_cursor *pCur = (series_cursor*)cur;
   6513   progressSequence( & pCur->ss );
   6514   return SQLITE_OK;
   6515 }
   6516 
   6517 /*
   6518 ** Return values of columns for the row at which the series_cursor
   6519 ** is currently pointing.
   6520 */
   6521 static int seriesColumn(
   6522   sqlite3_vtab_cursor *cur,   /* The cursor */
   6523   sqlite3_context *ctx,       /* First argument to sqlite3_result_...() */
   6524   int i                       /* Which column to return */
   6525 ){
   6526   series_cursor *pCur = (series_cursor*)cur;
   6527   sqlite3_int64 x = 0;
   6528   switch( i ){
   6529     case SERIES_COLUMN_START:  x = pCur->ss.iOBase;     break;
   6530     case SERIES_COLUMN_STOP:   x = pCur->ss.iOTerm;     break;
   6531     case SERIES_COLUMN_STEP:   x = pCur->ss.iStep;      break;
   6532     default:                   x = pCur->ss.iValueNow;  break;
   6533   }
   6534   sqlite3_result_int64(ctx, x);
   6535   return SQLITE_OK;
   6536 }
   6537 
   6538 #ifndef LARGEST_UINT64
   6539 #define LARGEST_INT64  (0xffffffff|(((sqlite3_int64)0x7fffffff)<<32))
   6540 #define LARGEST_UINT64 (0xffffffff|(((sqlite3_uint64)0xffffffff)<<32))
   6541 #define SMALLEST_INT64 (((sqlite3_int64)-1) - LARGEST_INT64)
   6542 #endif
   6543 
   6544 /*
   6545 ** The rowid is the same as the value.
   6546 */
   6547 static int seriesRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
   6548   series_cursor *pCur = (series_cursor*)cur;
   6549   *pRowid = pCur->ss.iValueNow;
   6550   return SQLITE_OK;
   6551 }
   6552 
   6553 /*
   6554 ** Return TRUE if the cursor has been moved off of the last
   6555 ** row of output.
   6556 */
   6557 static int seriesEof(sqlite3_vtab_cursor *cur){
   6558   series_cursor *pCur = (series_cursor*)cur;
   6559   return !pCur->ss.isNotEOF;
   6560 }
   6561 
   6562 /* True to cause run-time checking of the start=, stop=, and/or step=
   6563 ** parameters.  The only reason to do this is for testing the
   6564 ** constraint checking logic for virtual tables in the SQLite core.
   6565 */
   6566 #ifndef SQLITE_SERIES_CONSTRAINT_VERIFY
   6567 # define SQLITE_SERIES_CONSTRAINT_VERIFY 0
   6568 #endif
   6569 
   6570 /*
   6571 ** This method is called to "rewind" the series_cursor object back
   6572 ** to the first row of output.  This method is always called at least
   6573 ** once prior to any call to seriesColumn() or seriesRowid() or
   6574 ** seriesEof().
   6575 **
   6576 ** The query plan selected by seriesBestIndex is passed in the idxNum
   6577 ** parameter.  (idxStr is not used in this implementation.)  idxNum
   6578 ** is a bitmask showing which constraints are available:
   6579 **
   6580 **   0x0001:    start=VALUE
   6581 **   0x0002:    stop=VALUE
   6582 **   0x0004:    step=VALUE
   6583 **   0x0008:    descending order
   6584 **   0x0010:    ascending order
   6585 **   0x0020:    LIMIT  VALUE
   6586 **   0x0040:    OFFSET  VALUE
   6587 **   0x0080:    value=VALUE
   6588 **   0x0100:    value>=VALUE
   6589 **   0x0200:    value>VALUE
   6590 **   0x1000:    value<=VALUE
   6591 **   0x2000:    value<VALUE
   6592 **
   6593 ** This routine should initialize the cursor and position it so that it
   6594 ** is pointing at the first row, or pointing off the end of the table
   6595 ** (so that seriesEof() will return true) if the table is empty.
   6596 */
   6597 static int seriesFilter(
   6598   sqlite3_vtab_cursor *pVtabCursor,
   6599   int idxNum, const char *idxStrUnused,
   6600   int argc, sqlite3_value **argv
   6601 ){
   6602   series_cursor *pCur = (series_cursor *)pVtabCursor;
   6603   int i = 0;
   6604   int returnNoRows = 0;
   6605   sqlite3_int64 iMin = SMALLEST_INT64;
   6606   sqlite3_int64 iMax = LARGEST_INT64;
   6607   sqlite3_int64 iLimit = 0;
   6608   sqlite3_int64 iOffset = 0;
   6609 
   6610   (void)idxStrUnused;
   6611   if( idxNum & 0x01 ){
   6612     pCur->ss.iBase = sqlite3_value_int64(argv[i++]);
   6613   }else{
   6614     pCur->ss.iBase = 0;
   6615   }
   6616   if( idxNum & 0x02 ){
   6617     pCur->ss.iTerm = sqlite3_value_int64(argv[i++]);
   6618   }else{
   6619     pCur->ss.iTerm = 0xffffffff;
   6620   }
   6621   if( idxNum & 0x04 ){
   6622     pCur->ss.iStep = sqlite3_value_int64(argv[i++]);
   6623     if( pCur->ss.iStep==0 ){
   6624       pCur->ss.iStep = 1;
   6625     }else if( pCur->ss.iStep<0 ){
   6626       if( (idxNum & 0x10)==0 ) idxNum |= 0x08;
   6627     }
   6628   }else{
   6629     pCur->ss.iStep = 1;
   6630   }
   6631 
   6632   /* If there are constraints on the value column but there are
   6633   ** no constraints on  the start, stop, and step columns, then
   6634   ** initialize the default range to be the entire range of 64-bit signed
   6635   ** integers.  This range will contracted by the value column constraints
   6636   ** further below.
   6637   */
   6638   if( (idxNum & 0x05)==0 && (idxNum & 0x0380)!=0 ){
   6639     pCur->ss.iBase = SMALLEST_INT64;
   6640   }
   6641   if( (idxNum & 0x06)==0 && (idxNum & 0x3080)!=0 ){
   6642     pCur->ss.iTerm = LARGEST_INT64;
   6643   }
   6644   pCur->ss.iOBase = pCur->ss.iBase;
   6645   pCur->ss.iOTerm = pCur->ss.iTerm;
   6646 
   6647   /* Extract the LIMIT and OFFSET values, but do not apply them yet.
   6648   ** The range must first be constrained by the limits on value.
   6649   */
   6650   if( idxNum & 0x20 ){
   6651     iLimit = sqlite3_value_int64(argv[i++]);
   6652     if( idxNum & 0x40 ){
   6653       iOffset = sqlite3_value_int64(argv[i++]);
   6654     }
   6655   }
   6656 
   6657   if( idxNum & 0x3380 ){
   6658     /* Extract the maximum range of output values determined by
   6659     ** constraints on the "value" column.
   6660     */
   6661     if( idxNum & 0x0080 ){
   6662       if( sqlite3_value_numeric_type(argv[i])==SQLITE_FLOAT ){
   6663         double r = sqlite3_value_double(argv[i++]);
   6664         if( r==ceil(r) ){
   6665           iMin = iMax = (sqlite3_int64)r;
   6666         }else{
   6667           returnNoRows = 1;
   6668         }
   6669       }else{
   6670         iMin = iMax = sqlite3_value_int64(argv[i++]);
   6671       }
   6672     }else{
   6673       if( idxNum & 0x0300 ){
   6674         if( sqlite3_value_numeric_type(argv[i])==SQLITE_FLOAT ){
   6675           double r = sqlite3_value_double(argv[i++]);
   6676           if( idxNum & 0x0200 && r==ceil(r) ){
   6677             iMin = (sqlite3_int64)ceil(r+1.0);
   6678           }else{
   6679             iMin = (sqlite3_int64)ceil(r);
   6680           }
   6681         }else{
   6682           iMin = sqlite3_value_int64(argv[i++]);
   6683           if( idxNum & 0x0200 ){
   6684             if( iMin==LARGEST_INT64 ){
   6685               returnNoRows = 1;
   6686             }else{
   6687               iMin++;
   6688             }
   6689           }
   6690         }
   6691       }
   6692       if( idxNum & 0x3000 ){
   6693         if( sqlite3_value_numeric_type(argv[i])==SQLITE_FLOAT ){
   6694           double r = sqlite3_value_double(argv[i++]);
   6695           if( (idxNum & 0x2000)!=0 && r==floor(r) ){
   6696             iMax = (sqlite3_int64)(r-1.0);
   6697           }else{
   6698             iMax = (sqlite3_int64)floor(r);
   6699           }
   6700         }else{
   6701           iMax = sqlite3_value_int64(argv[i++]);
   6702           if( idxNum & 0x2000 ){
   6703             if( iMax==SMALLEST_INT64 ){
   6704               returnNoRows = 1;
   6705             }else{
   6706               iMax--;
   6707             }
   6708           }
   6709         }
   6710       }
   6711       if( iMin>iMax ){
   6712         returnNoRows = 1;
   6713       }
   6714     }
   6715 
   6716     /* Try to reduce the range of values to be generated based on
   6717     ** constraints on the "value" column.
   6718     */
   6719     if( pCur->ss.iStep>0 ){
   6720       sqlite3_int64 szStep = pCur->ss.iStep;
   6721       if( pCur->ss.iBase<iMin ){
   6722         sqlite3_uint64 d = iMin - pCur->ss.iBase;
   6723         pCur->ss.iBase += ((d+szStep-1)/szStep)*szStep;
   6724       }
   6725       if( pCur->ss.iTerm>iMax ){
   6726         pCur->ss.iTerm = iMax;
   6727       }
   6728     }else{
   6729       sqlite3_int64 szStep = -pCur->ss.iStep;
   6730       assert( szStep>0 );
   6731       if( pCur->ss.iBase>iMax ){
   6732         sqlite3_uint64 d = pCur->ss.iBase - iMax;
   6733         pCur->ss.iBase -= ((d+szStep-1)/szStep)*szStep;
   6734       }
   6735       if( pCur->ss.iTerm<iMin ){
   6736         pCur->ss.iTerm = iMin;
   6737       }
   6738     }
   6739   }
   6740 
   6741   /* Apply LIMIT and OFFSET constraints, if any */
   6742   if( idxNum & 0x20 ){
   6743     if( iOffset>0 ){
   6744       pCur->ss.iBase += pCur->ss.iStep*iOffset;
   6745     }
   6746     if( iLimit>=0 ){
   6747       sqlite3_int64 iTerm;
   6748       iTerm = pCur->ss.iBase + (iLimit - 1)*pCur->ss.iStep;
   6749       if( pCur->ss.iStep<0 ){
   6750         if( iTerm>pCur->ss.iTerm ) pCur->ss.iTerm = iTerm;
   6751       }else{
   6752         if( iTerm<pCur->ss.iTerm ) pCur->ss.iTerm = iTerm;
   6753       }
   6754     }
   6755   }
   6756 
   6757 
   6758   for(i=0; i<argc; i++){
   6759     if( sqlite3_value_type(argv[i])==SQLITE_NULL ){
   6760       /* If any of the constraints have a NULL value, then return no rows.
   6761       ** See ticket https://sqlite.org/src/info/fac496b61722daf2 */
   6762       returnNoRows = 1;
   6763       break;
   6764     }
   6765   }
   6766   if( returnNoRows ){
   6767     pCur->ss.iBase = 1;
   6768     pCur->ss.iTerm = 0;
   6769     pCur->ss.iStep = 1;
   6770   }
   6771   if( idxNum & 0x08 ){
   6772     pCur->ss.isReversing = pCur->ss.iStep > 0;
   6773   }else{
   6774     pCur->ss.isReversing = pCur->ss.iStep < 0;
   6775   }
   6776   setupSequence( &pCur->ss );
   6777   return SQLITE_OK;
   6778 }
   6779 
   6780 /*
   6781 ** SQLite will invoke this method one or more times while planning a query
   6782 ** that uses the generate_series virtual table.  This routine needs to create
   6783 ** a query plan for each invocation and compute an estimated cost for that
   6784 ** plan.
   6785 **
   6786 ** In this implementation idxNum is used to represent the
   6787 ** query plan.  idxStr is unused.
   6788 **
   6789 ** The query plan is represented by bits in idxNum:
   6790 **
   6791 **   0x0001  start = $num
   6792 **   0x0002  stop = $num
   6793 **   0x0004  step = $num
   6794 **   0x0008  output is in descending order
   6795 **   0x0010  output is in ascending order
   6796 **   0x0020  LIMIT $num
   6797 **   0x0040  OFFSET $num
   6798 **   0x0080  value = $num
   6799 **   0x0100  value >= $num
   6800 **   0x0200  value > $num
   6801 **   0x1000  value <= $num
   6802 **   0x2000  value < $num
   6803 **
   6804 ** Only one of 0x0100 or 0x0200 will be returned.  Similarly, only
   6805 ** one of 0x1000 or 0x2000 will be returned.  If the 0x0080 is set, then
   6806 ** none of the 0xff00 bits will be set.
   6807 **
   6808 ** The order of parameters passed to xFilter is as follows:
   6809 **
   6810 **    * The argument to start= if bit 0x0001 is in the idxNum mask
   6811 **    * The argument to stop= if bit 0x0002 is in the idxNum mask
   6812 **    * The argument to step= if bit 0x0004 is in the idxNum mask
   6813 **    * The argument to LIMIT if bit 0x0020 is in the idxNum mask
   6814 **    * The argument to OFFSET if bit 0x0040 is in the idxNum mask
   6815 **    * The argument to value=, or value>= or value> if any of
   6816 **      bits 0x0380 are in the idxNum mask
   6817 **    * The argument to value<= or value< if either of bits 0x3000
   6818 **      are in the mask
   6819 **
   6820 */
   6821 static int seriesBestIndex(
   6822   sqlite3_vtab *pVTab,
   6823   sqlite3_index_info *pIdxInfo
   6824 ){
   6825   int i, j;              /* Loop over constraints */
   6826   int idxNum = 0;        /* The query plan bitmask */
   6827 #ifndef ZERO_ARGUMENT_GENERATE_SERIES
   6828   int bStartSeen = 0;    /* EQ constraint seen on the START column */
   6829 #endif
   6830   int unusableMask = 0;  /* Mask of unusable constraints */
   6831   int nArg = 0;          /* Number of arguments that seriesFilter() expects */
   6832   int aIdx[7];           /* Constraints on start, stop, step, LIMIT, OFFSET,
   6833                          ** and value.  aIdx[5] covers value=, value>=, and
   6834                          ** value>,  aIdx[6] covers value<= and value< */
   6835   const struct sqlite3_index_constraint *pConstraint;
   6836 
   6837   /* This implementation assumes that the start, stop, and step columns
   6838   ** are the last three columns in the virtual table. */
   6839   assert( SERIES_COLUMN_STOP == SERIES_COLUMN_START+1 );
   6840   assert( SERIES_COLUMN_STEP == SERIES_COLUMN_START+2 );
   6841 
   6842   aIdx[0] = aIdx[1] = aIdx[2] = aIdx[3] = aIdx[4] = aIdx[5] = aIdx[6] = -1;
   6843   pConstraint = pIdxInfo->aConstraint;
   6844   for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
   6845     int iCol;    /* 0 for start, 1 for stop, 2 for step */
   6846     int iMask;   /* bitmask for those column */
   6847     int op = pConstraint->op;
   6848     if( op>=SQLITE_INDEX_CONSTRAINT_LIMIT
   6849      && op<=SQLITE_INDEX_CONSTRAINT_OFFSET
   6850     ){
   6851       if( pConstraint->usable==0 ){
   6852         /* do nothing */
   6853       }else if( op==SQLITE_INDEX_CONSTRAINT_LIMIT ){
   6854         aIdx[3] = i;
   6855         idxNum |= 0x20;
   6856       }else{
   6857         assert( op==SQLITE_INDEX_CONSTRAINT_OFFSET );
   6858         aIdx[4] = i;
   6859         idxNum |= 0x40;
   6860       }
   6861       continue;
   6862     }
   6863     if( pConstraint->iColumn<SERIES_COLUMN_START ){
   6864       if( (pConstraint->iColumn==SERIES_COLUMN_VALUE ||
   6865            pConstraint->iColumn==SERIES_COLUMN_ROWID)
   6866        && pConstraint->usable
   6867       ){
   6868         switch( op ){
   6869           case SQLITE_INDEX_CONSTRAINT_EQ:
   6870           case SQLITE_INDEX_CONSTRAINT_IS: {
   6871             idxNum |=  0x0080;
   6872             idxNum &= ~0x3300;
   6873             aIdx[5] = i;
   6874             aIdx[6] = -1;
   6875 #ifndef ZERO_ARGUMENT_GENERATE_SERIES
   6876             bStartSeen = 1;
   6877 #endif
   6878             break;
   6879           }
   6880           case SQLITE_INDEX_CONSTRAINT_GE: {
   6881             if( idxNum & 0x0080 ) break;
   6882             idxNum |=  0x0100;
   6883             idxNum &= ~0x0200;
   6884             aIdx[5] = i;
   6885 #ifndef ZERO_ARGUMENT_GENERATE_SERIES
   6886             bStartSeen = 1;
   6887 #endif
   6888             break;
   6889           }
   6890           case SQLITE_INDEX_CONSTRAINT_GT: {
   6891             if( idxNum & 0x0080 ) break;
   6892             idxNum |=  0x0200;
   6893             idxNum &= ~0x0100;
   6894             aIdx[5] = i;
   6895 #ifndef ZERO_ARGUMENT_GENERATE_SERIES
   6896             bStartSeen = 1;
   6897 #endif
   6898             break;
   6899           }
   6900           case SQLITE_INDEX_CONSTRAINT_LE: {
   6901             if( idxNum & 0x0080 ) break;
   6902             idxNum |=  0x1000;
   6903             idxNum &= ~0x2000;
   6904             aIdx[6] = i;
   6905             break;
   6906           }
   6907           case SQLITE_INDEX_CONSTRAINT_LT: {
   6908             if( idxNum & 0x0080 ) break;
   6909             idxNum |=  0x2000;
   6910             idxNum &= ~0x1000;
   6911             aIdx[6] = i;
   6912             break;
   6913           }
   6914         }
   6915       }
   6916       continue;
   6917     }
   6918     iCol = pConstraint->iColumn - SERIES_COLUMN_START;
   6919     assert( iCol>=0 && iCol<=2 );
   6920     iMask = 1 << iCol;
   6921 #ifndef ZERO_ARGUMENT_GENERATE_SERIES
   6922     if( iCol==0 && op==SQLITE_INDEX_CONSTRAINT_EQ ){
   6923       bStartSeen = 1;
   6924     }
   6925 #endif
   6926     if( pConstraint->usable==0 ){
   6927       unusableMask |=  iMask;
   6928       continue;
   6929     }else if( op==SQLITE_INDEX_CONSTRAINT_EQ ){
   6930       idxNum |= iMask;
   6931       aIdx[iCol] = i;
   6932     }
   6933   }
   6934   if( aIdx[3]==0 ){
   6935     /* Ignore OFFSET if LIMIT is omitted */
   6936     idxNum &= ~0x60;
   6937     aIdx[4] = 0;
   6938   }
   6939   for(i=0; i<7; i++){
   6940     if( (j = aIdx[i])>=0 ){
   6941       pIdxInfo->aConstraintUsage[j].argvIndex = ++nArg;
   6942       pIdxInfo->aConstraintUsage[j].omit =
   6943          !SQLITE_SERIES_CONSTRAINT_VERIFY || i>=3;
   6944     }
   6945   }
   6946   /* The current generate_column() implementation requires at least one
   6947   ** argument (the START value).  Legacy versions assumed START=0 if the
   6948   ** first argument was omitted.  Compile with -DZERO_ARGUMENT_GENERATE_SERIES
   6949   ** to obtain the legacy behavior */
   6950 #ifndef ZERO_ARGUMENT_GENERATE_SERIES
   6951   if( !bStartSeen ){
   6952     sqlite3_free(pVTab->zErrMsg);
   6953     pVTab->zErrMsg = sqlite3_mprintf(
   6954         "first argument to \"generate_series()\" missing or unusable");
   6955     return SQLITE_ERROR;
   6956   }
   6957 #endif
   6958   if( (unusableMask & ~idxNum)!=0 ){
   6959     /* The start, stop, and step columns are inputs.  Therefore if there
   6960     ** are unusable constraints on any of start, stop, or step then
   6961     ** this plan is unusable */
   6962     return SQLITE_CONSTRAINT;
   6963   }
   6964   if( (idxNum & 0x03)==0x03 ){
   6965     /* Both start= and stop= boundaries are available.  This is the 
   6966     ** the preferred case */
   6967     pIdxInfo->estimatedCost = (double)(2 - ((idxNum&4)!=0));
   6968     pIdxInfo->estimatedRows = 1000;
   6969     if( pIdxInfo->nOrderBy>=1 && pIdxInfo->aOrderBy[0].iColumn==0 ){
   6970       if( pIdxInfo->aOrderBy[0].desc ){
   6971         idxNum |= 0x08;
   6972       }else{
   6973         idxNum |= 0x10;
   6974       }
   6975       pIdxInfo->orderByConsumed = 1;
   6976     }
   6977   }else if( (idxNum & 0x21)==0x21 ){
   6978     /* We have start= and LIMIT */
   6979     pIdxInfo->estimatedRows = 2500;
   6980   }else{
   6981     /* If either boundary is missing, we have to generate a huge span
   6982     ** of numbers.  Make this case very expensive so that the query
   6983     ** planner will work hard to avoid it. */
   6984     pIdxInfo->estimatedRows = 2147483647;
   6985   }
   6986   pIdxInfo->idxNum = idxNum;
   6987 #ifdef SQLITE_INDEX_SCAN_HEX
   6988   pIdxInfo->idxFlags = SQLITE_INDEX_SCAN_HEX;
   6989 #endif
   6990   return SQLITE_OK;
   6991 }
   6992 
   6993 /*
   6994 ** This following structure defines all the methods for the 
   6995 ** generate_series virtual table.
   6996 */
   6997 static sqlite3_module seriesModule = {
   6998   0,                         /* iVersion */
   6999   0,                         /* xCreate */
   7000   seriesConnect,             /* xConnect */
   7001   seriesBestIndex,           /* xBestIndex */
   7002   seriesDisconnect,          /* xDisconnect */
   7003   0,                         /* xDestroy */
   7004   seriesOpen,                /* xOpen - open a cursor */
   7005   seriesClose,               /* xClose - close a cursor */
   7006   seriesFilter,              /* xFilter - configure scan constraints */
   7007   seriesNext,                /* xNext - advance a cursor */
   7008   seriesEof,                 /* xEof - check for end of scan */
   7009   seriesColumn,              /* xColumn - read data */
   7010   seriesRowid,               /* xRowid - read data */
   7011   0,                         /* xUpdate */
   7012   0,                         /* xBegin */
   7013   0,                         /* xSync */
   7014   0,                         /* xCommit */
   7015   0,                         /* xRollback */
   7016   0,                         /* xFindMethod */
   7017   0,                         /* xRename */
   7018   0,                         /* xSavepoint */
   7019   0,                         /* xRelease */
   7020   0,                         /* xRollbackTo */
   7021   0,                         /* xShadowName */
   7022   0                          /* xIntegrity */
   7023 };
   7024 
   7025 #endif /* SQLITE_OMIT_VIRTUALTABLE */
   7026 
   7027 #ifdef _WIN32
   7028 
   7029 #endif
   7030 int sqlite3_series_init(
   7031   sqlite3 *db, 
   7032   char **pzErrMsg, 
   7033   const sqlite3_api_routines *pApi
   7034 ){
   7035   int rc = SQLITE_OK;
   7036   SQLITE_EXTENSION_INIT2(pApi);
   7037 #ifndef SQLITE_OMIT_VIRTUALTABLE
   7038   if( sqlite3_libversion_number()<3008012 && pzErrMsg!=0 ){
   7039     *pzErrMsg = sqlite3_mprintf(
   7040         "generate_series() requires SQLite 3.8.12 or later");
   7041     return SQLITE_ERROR;
   7042   }
   7043   rc = sqlite3_create_module(db, "generate_series", &seriesModule, 0);
   7044 #endif
   7045   return rc;
   7046 }
   7047 
   7048 /************************* End ../ext/misc/series.c ********************/
   7049 /************************* Begin ../ext/misc/regexp.c ******************/
   7050 /*
   7051 ** 2012-11-13
   7052 **
   7053 ** The author disclaims copyright to this source code.  In place of
   7054 ** a legal notice, here is a blessing:
   7055 **
   7056 **    May you do good and not evil.
   7057 **    May you find forgiveness for yourself and forgive others.
   7058 **    May you share freely, never taking more than you give.
   7059 **
   7060 ******************************************************************************
   7061 **
   7062 ** The code in this file implements a compact but reasonably
   7063 ** efficient regular-expression matcher for posix extended regular
   7064 ** expressions against UTF8 text.
   7065 **
   7066 ** This file is an SQLite extension.  It registers a single function
   7067 ** named "regexp(A,B)" where A is the regular expression and B is the
   7068 ** string to be matched.  By registering this function, SQLite will also
   7069 ** then implement the "B regexp A" operator.  Note that with the function
   7070 ** the regular expression comes first, but with the operator it comes
   7071 ** second.
   7072 **
   7073 **  The following regular expression syntax is supported:
   7074 **
   7075 **     X*      zero or more occurrences of X
   7076 **     X+      one or more occurrences of X
   7077 **     X?      zero or one occurrences of X
   7078 **     X{p,q}  between p and q occurrences of X
   7079 **     (X)     match X
   7080 **     X|Y     X or Y
   7081 **     ^X      X occurring at the beginning of the string
   7082 **     X$      X occurring at the end of the string
   7083 **     .       Match any single character
   7084 **     \c      Character c where c is one of \{}()[]|*+?.
   7085 **     \c      C-language escapes for c in afnrtv.  ex: \t or \n
   7086 **     \uXXXX  Where XXXX is exactly 4 hex digits, unicode value XXXX
   7087 **     \xXX    Where XX is exactly 2 hex digits, unicode value XX
   7088 **     [abc]   Any single character from the set abc
   7089 **     [^abc]  Any single character not in the set abc
   7090 **     [a-z]   Any single character in the range a-z
   7091 **     [^a-z]  Any single character not in the range a-z
   7092 **     \b      Word boundary
   7093 **     \w      Word character.  [A-Za-z0-9_]
   7094 **     \W      Non-word character
   7095 **     \d      Digit
   7096 **     \D      Non-digit
   7097 **     \s      Whitespace character
   7098 **     \S      Non-whitespace character
   7099 **
   7100 ** A nondeterministic finite automaton (NFA) is used for matching, so the
   7101 ** performance is bounded by O(N*M) where N is the size of the regular
   7102 ** expression and M is the size of the input string.  The matcher never
   7103 ** exhibits exponential behavior.  Note that the X{p,q} operator expands
   7104 ** to p copies of X following by q-p copies of X? and that the size of the
   7105 ** regular expression in the O(N*M) performance bound is computed after
   7106 ** this expansion.
   7107 */
   7108 #include <string.h>
   7109 #include <stdlib.h>
   7110 /* #include "sqlite3ext.h" */
   7111 SQLITE_EXTENSION_INIT1
   7112 
   7113 /*
   7114 ** The following #defines change the names of some functions implemented in
   7115 ** this file to prevent name collisions with C-library functions of the
   7116 ** same name.
   7117 */
   7118 #define re_match   sqlite3re_match
   7119 #define re_compile sqlite3re_compile
   7120 #define re_free    sqlite3re_free
   7121 
   7122 /* The end-of-input character */
   7123 #define RE_EOF            0    /* End of input */
   7124 #define RE_START  0xfffffff    /* Start of input - larger than an UTF-8 */
   7125 
   7126 /* The NFA is implemented as sequence of opcodes taken from the following
   7127 ** set.  Each opcode has a single integer argument.
   7128 */
   7129 #define RE_OP_MATCH       1    /* Match the one character in the argument */
   7130 #define RE_OP_ANY         2    /* Match any one character.  (Implements ".") */
   7131 #define RE_OP_ANYSTAR     3    /* Special optimized version of .* */
   7132 #define RE_OP_FORK        4    /* Continue to both next and opcode at iArg */
   7133 #define RE_OP_GOTO        5    /* Jump to opcode at iArg */
   7134 #define RE_OP_ACCEPT      6    /* Halt and indicate a successful match */
   7135 #define RE_OP_CC_INC      7    /* Beginning of a [...] character class */
   7136 #define RE_OP_CC_EXC      8    /* Beginning of a [^...] character class */
   7137 #define RE_OP_CC_VALUE    9    /* Single value in a character class */
   7138 #define RE_OP_CC_RANGE   10    /* Range of values in a character class */
   7139 #define RE_OP_WORD       11    /* Perl word character [A-Za-z0-9_] */
   7140 #define RE_OP_NOTWORD    12    /* Not a perl word character */
   7141 #define RE_OP_DIGIT      13    /* digit:  [0-9] */
   7142 #define RE_OP_NOTDIGIT   14    /* Not a digit */
   7143 #define RE_OP_SPACE      15    /* space:  [ \t\n\r\v\f] */
   7144 #define RE_OP_NOTSPACE   16    /* Not a digit */
   7145 #define RE_OP_BOUNDARY   17    /* Boundary between word and non-word */
   7146 #define RE_OP_ATSTART    18    /* Currently at the start of the string */
   7147 
   7148 #if defined(SQLITE_DEBUG)
   7149 /* Opcode names used for symbolic debugging */
   7150 static const char *ReOpName[] = {
   7151   "EOF",
   7152   "MATCH",
   7153   "ANY",
   7154   "ANYSTAR",
   7155   "FORK",
   7156   "GOTO",
   7157   "ACCEPT",
   7158   "CC_INC",
   7159   "CC_EXC",
   7160   "CC_VALUE",
   7161   "CC_RANGE",
   7162   "WORD",
   7163   "NOTWORD",
   7164   "DIGIT",
   7165   "NOTDIGIT",
   7166   "SPACE",
   7167   "NOTSPACE",
   7168   "BOUNDARY",
   7169   "ATSTART",
   7170 };
   7171 #endif /* SQLITE_DEBUG */
   7172 
   7173 
   7174 /* Each opcode is a "state" in the NFA */
   7175 typedef unsigned short ReStateNumber;
   7176 
   7177 /* Because this is an NFA and not a DFA, multiple states can be active at
   7178 ** once.  An instance of the following object records all active states in
   7179 ** the NFA.  The implementation is optimized for the common case where the
   7180 ** number of actives states is small.
   7181 */
   7182 typedef struct ReStateSet {
   7183   unsigned nState;            /* Number of current states */
   7184   ReStateNumber *aState;      /* Current states */
   7185 } ReStateSet;
   7186 
   7187 /* An input string read one character at a time.
   7188 */
   7189 typedef struct ReInput ReInput;
   7190 struct ReInput {
   7191   const unsigned char *z;  /* All text */
   7192   int i;                   /* Next byte to read */
   7193   int mx;                  /* EOF when i>=mx */
   7194 };
   7195 
   7196 /* A compiled NFA (or an NFA that is in the process of being compiled) is
   7197 ** an instance of the following object.
   7198 */
   7199 typedef struct ReCompiled ReCompiled;
   7200 struct ReCompiled {
   7201   ReInput sIn;                /* Regular expression text */
   7202   const char *zErr;           /* Error message to return */
   7203   char *aOp;                  /* Operators for the virtual machine */
   7204   int *aArg;                  /* Arguments to each operator */
   7205   unsigned (*xNextChar)(ReInput*);  /* Next character function */
   7206   unsigned char zInit[12];    /* Initial text to match */
   7207   int nInit;                  /* Number of bytes in zInit */
   7208   unsigned nState;            /* Number of entries in aOp[] and aArg[] */
   7209   unsigned nAlloc;            /* Slots allocated for aOp[] and aArg[] */
   7210 };
   7211 
   7212 /* Add a state to the given state set if it is not already there */
   7213 static void re_add_state(ReStateSet *pSet, int newState){
   7214   unsigned i;
   7215   for(i=0; i<pSet->nState; i++) if( pSet->aState[i]==newState ) return;
   7216   pSet->aState[pSet->nState++] = (ReStateNumber)newState;
   7217 }
   7218 
   7219 /* Extract the next unicode character from *pzIn and return it.  Advance
   7220 ** *pzIn to the first byte past the end of the character returned.  To
   7221 ** be clear:  this routine converts utf8 to unicode.  This routine is 
   7222 ** optimized for the common case where the next character is a single byte.
   7223 */
   7224 static unsigned re_next_char(ReInput *p){
   7225   unsigned c;
   7226   if( p->i>=p->mx ) return 0;
   7227   c = p->z[p->i++];
   7228   if( c>=0x80 ){
   7229     if( (c&0xe0)==0xc0 && p->i<p->mx && (p->z[p->i]&0xc0)==0x80 ){
   7230       c = (c&0x1f)<<6 | (p->z[p->i++]&0x3f);
   7231       if( c<0x80 ) c = 0xfffd;
   7232     }else if( (c&0xf0)==0xe0 && p->i+1<p->mx && (p->z[p->i]&0xc0)==0x80
   7233            && (p->z[p->i+1]&0xc0)==0x80 ){
   7234       c = (c&0x0f)<<12 | ((p->z[p->i]&0x3f)<<6) | (p->z[p->i+1]&0x3f);
   7235       p->i += 2;
   7236       if( c<=0x7ff || (c>=0xd800 && c<=0xdfff) ) c = 0xfffd;
   7237     }else if( (c&0xf8)==0xf0 && p->i+2<p->mx && (p->z[p->i]&0xc0)==0x80
   7238            && (p->z[p->i+1]&0xc0)==0x80 && (p->z[p->i+2]&0xc0)==0x80 ){
   7239       c = (c&0x07)<<18 | ((p->z[p->i]&0x3f)<<12) | ((p->z[p->i+1]&0x3f)<<6)
   7240                        | (p->z[p->i+2]&0x3f);
   7241       p->i += 3;
   7242       if( c<=0xffff || c>0x10ffff ) c = 0xfffd;
   7243     }else{
   7244       c = 0xfffd;
   7245     }
   7246   }
   7247   return c;
   7248 }
   7249 static unsigned re_next_char_nocase(ReInput *p){
   7250   unsigned c = re_next_char(p);
   7251   if( c>='A' && c<='Z' ) c += 'a' - 'A';
   7252   return c;
   7253 }
   7254 
   7255 /* Return true if c is a perl "word" character:  [A-Za-z0-9_] */
   7256 static int re_word_char(int c){
   7257   return (c>='0' && c<='9') || (c>='a' && c<='z')
   7258       || (c>='A' && c<='Z') || c=='_';
   7259 }
   7260 
   7261 /* Return true if c is a "digit" character:  [0-9] */
   7262 static int re_digit_char(int c){
   7263   return (c>='0' && c<='9');
   7264 }
   7265 
   7266 /* Return true if c is a perl "space" character:  [ \t\r\n\v\f] */
   7267 static int re_space_char(int c){
   7268   return c==' ' || c=='\t' || c=='\n' || c=='\r' || c=='\v' || c=='\f';
   7269 }
   7270 
   7271 /* Run a compiled regular expression on the zero-terminated input
   7272 ** string zIn[].  Return true on a match and false if there is no match.
   7273 */
   7274 static int re_match(ReCompiled *pRe, const unsigned char *zIn, int nIn){
   7275   ReStateSet aStateSet[2], *pThis, *pNext;
   7276   ReStateNumber aSpace[100];
   7277   ReStateNumber *pToFree;
   7278   unsigned int i = 0;
   7279   unsigned int iSwap = 0;
   7280   int c = RE_START;
   7281   int cPrev = 0;
   7282   int rc = 0;
   7283   ReInput in;
   7284 
   7285   in.z = zIn;
   7286   in.i = 0;
   7287   in.mx = nIn>=0 ? nIn : (int)strlen((char const*)zIn);
   7288 
   7289   /* Look for the initial prefix match, if there is one. */
   7290   if( pRe->nInit ){
   7291     unsigned char x = pRe->zInit[0];
   7292     while( in.i+pRe->nInit<=in.mx 
   7293      && (zIn[in.i]!=x ||
   7294          strncmp((const char*)zIn+in.i, (const char*)pRe->zInit, pRe->nInit)!=0)
   7295     ){
   7296       in.i++;
   7297     }
   7298     if( in.i+pRe->nInit>in.mx ) return 0;
   7299     c = RE_START-1;
   7300   }
   7301 
   7302   if( pRe->nState<=(sizeof(aSpace)/(sizeof(aSpace[0])*2)) ){
   7303     pToFree = 0;
   7304     aStateSet[0].aState = aSpace;
   7305   }else{
   7306     pToFree = sqlite3_malloc64( sizeof(ReStateNumber)*2*pRe->nState );
   7307     if( pToFree==0 ) return -1;
   7308     aStateSet[0].aState = pToFree;
   7309   }
   7310   aStateSet[1].aState = &aStateSet[0].aState[pRe->nState];
   7311   pNext = &aStateSet[1];
   7312   pNext->nState = 0;
   7313   re_add_state(pNext, 0);
   7314   while( c!=RE_EOF && pNext->nState>0 ){
   7315     cPrev = c;
   7316     c = pRe->xNextChar(&in);
   7317     pThis = pNext;
   7318     pNext = &aStateSet[iSwap];
   7319     iSwap = 1 - iSwap;
   7320     pNext->nState = 0;
   7321     for(i=0; i<pThis->nState; i++){
   7322       int x = pThis->aState[i];
   7323       switch( pRe->aOp[x] ){
   7324         case RE_OP_MATCH: {
   7325           if( pRe->aArg[x]==c ) re_add_state(pNext, x+1);
   7326           break;
   7327         }
   7328         case RE_OP_ATSTART: {
   7329           if( cPrev==RE_START ) re_add_state(pThis, x+1);
   7330           break;
   7331         }
   7332         case RE_OP_ANY: {
   7333           if( c!=0 ) re_add_state(pNext, x+1);
   7334           break;
   7335         }
   7336         case RE_OP_WORD: {
   7337           if( re_word_char(c) ) re_add_state(pNext, x+1);
   7338           break;
   7339         }
   7340         case RE_OP_NOTWORD: {
   7341           if( !re_word_char(c) && c!=0 ) re_add_state(pNext, x+1);
   7342           break;
   7343         }
   7344         case RE_OP_DIGIT: {
   7345           if( re_digit_char(c) ) re_add_state(pNext, x+1);
   7346           break;
   7347         }
   7348         case RE_OP_NOTDIGIT: {
   7349           if( !re_digit_char(c) && c!=0 ) re_add_state(pNext, x+1);
   7350           break;
   7351         }
   7352         case RE_OP_SPACE: {
   7353           if( re_space_char(c) ) re_add_state(pNext, x+1);
   7354           break;
   7355         }
   7356         case RE_OP_NOTSPACE: {
   7357           if( !re_space_char(c) && c!=0 ) re_add_state(pNext, x+1);
   7358           break;
   7359         }
   7360         case RE_OP_BOUNDARY: {
   7361           if( re_word_char(c)!=re_word_char(cPrev) ) re_add_state(pThis, x+1);
   7362           break;
   7363         }
   7364         case RE_OP_ANYSTAR: {
   7365           re_add_state(pNext, x);
   7366           re_add_state(pThis, x+1);
   7367           break;
   7368         }
   7369         case RE_OP_FORK: {
   7370           re_add_state(pThis, x+pRe->aArg[x]);
   7371           re_add_state(pThis, x+1);
   7372           break;
   7373         }
   7374         case RE_OP_GOTO: {
   7375           re_add_state(pThis, x+pRe->aArg[x]);
   7376           break;
   7377         }
   7378         case RE_OP_ACCEPT: {
   7379           rc = 1;
   7380           goto re_match_end;
   7381         }
   7382         case RE_OP_CC_EXC: {
   7383           if( c==0 ) break;
   7384           /* fall-through */ goto re_op_cc_inc;
   7385         }
   7386         case RE_OP_CC_INC: re_op_cc_inc: {
   7387           int j = 1;
   7388           int n = pRe->aArg[x];
   7389           int hit = 0;
   7390           for(j=1; j>0 && j<n; j++){
   7391             if( pRe->aOp[x+j]==RE_OP_CC_VALUE ){
   7392               if( pRe->aArg[x+j]==c ){
   7393                 hit = 1;
   7394                 j = -1;
   7395               }
   7396             }else{
   7397               if( pRe->aArg[x+j]<=c && pRe->aArg[x+j+1]>=c ){
   7398                 hit = 1;
   7399                 j = -1;
   7400               }else{
   7401                 j++;
   7402               }
   7403             }
   7404           }
   7405           if( pRe->aOp[x]==RE_OP_CC_EXC ) hit = !hit;
   7406           if( hit ) re_add_state(pNext, x+n);
   7407           break;
   7408         }
   7409       }
   7410     }
   7411   }
   7412   for(i=0; i<pNext->nState; i++){
   7413     int x = pNext->aState[i];
   7414     while( pRe->aOp[x]==RE_OP_GOTO ) x += pRe->aArg[x];
   7415     if( pRe->aOp[x]==RE_OP_ACCEPT ){ rc = 1; break; }
   7416   }
   7417 re_match_end:
   7418   sqlite3_free(pToFree);
   7419   return rc;
   7420 }
   7421 
   7422 /* Resize the opcode and argument arrays for an RE under construction.
   7423 */
   7424 static int re_resize(ReCompiled *p, int N){
   7425   char *aOp;
   7426   int *aArg;
   7427   aOp = sqlite3_realloc64(p->aOp, N*sizeof(p->aOp[0]));
   7428   if( aOp==0 ) return 1;
   7429   p->aOp = aOp;
   7430   aArg = sqlite3_realloc64(p->aArg, N*sizeof(p->aArg[0]));
   7431   if( aArg==0 ) return 1;
   7432   p->aArg = aArg;
   7433   p->nAlloc = N;
   7434   return 0;
   7435 }
   7436 
   7437 /* Insert a new opcode and argument into an RE under construction.  The
   7438 ** insertion point is just prior to existing opcode iBefore.
   7439 */
   7440 static int re_insert(ReCompiled *p, int iBefore, int op, int arg){
   7441   int i;
   7442   if( p->nAlloc<=p->nState && re_resize(p, p->nAlloc*2) ) return 0;
   7443   for(i=p->nState; i>iBefore; i--){
   7444     p->aOp[i] = p->aOp[i-1];
   7445     p->aArg[i] = p->aArg[i-1];
   7446   }
   7447   p->nState++;
   7448   p->aOp[iBefore] = (char)op;
   7449   p->aArg[iBefore] = arg;
   7450   return iBefore;
   7451 }
   7452 
   7453 /* Append a new opcode and argument to the end of the RE under construction.
   7454 */
   7455 static int re_append(ReCompiled *p, int op, int arg){
   7456   return re_insert(p, p->nState, op, arg);
   7457 }
   7458 
   7459 /* Make a copy of N opcodes starting at iStart onto the end of the RE
   7460 ** under construction.
   7461 */
   7462 static void re_copy(ReCompiled *p, int iStart, int N){
   7463   if( p->nState+N>=p->nAlloc && re_resize(p, p->nAlloc*2+N) ) return;
   7464   memcpy(&p->aOp[p->nState], &p->aOp[iStart], N*sizeof(p->aOp[0]));
   7465   memcpy(&p->aArg[p->nState], &p->aArg[iStart], N*sizeof(p->aArg[0]));
   7466   p->nState += N;
   7467 }
   7468 
   7469 /* Return true if c is a hexadecimal digit character:  [0-9a-fA-F]
   7470 ** If c is a hex digit, also set *pV = (*pV)*16 + valueof(c).  If
   7471 ** c is not a hex digit *pV is unchanged.
   7472 */
   7473 static int re_hex(int c, int *pV){
   7474   if( c>='0' && c<='9' ){
   7475     c -= '0';
   7476   }else if( c>='a' && c<='f' ){
   7477     c -= 'a' - 10;
   7478   }else if( c>='A' && c<='F' ){
   7479     c -= 'A' - 10;
   7480   }else{
   7481     return 0;
   7482   }
   7483   *pV = (*pV)*16 + (c & 0xff);
   7484   return 1;
   7485 }
   7486 
   7487 /* A backslash character has been seen, read the next character and
   7488 ** return its interpretation.
   7489 */
   7490 static unsigned re_esc_char(ReCompiled *p){
   7491   static const char zEsc[] = "afnrtv\\()*.+?[$^{|}]";
   7492   static const char zTrans[] = "\a\f\n\r\t\v";
   7493   int i, v = 0;
   7494   char c;
   7495   if( p->sIn.i>=p->sIn.mx ) return 0;
   7496   c = p->sIn.z[p->sIn.i];
   7497   if( c=='u' && p->sIn.i+4<p->sIn.mx ){
   7498     const unsigned char *zIn = p->sIn.z + p->sIn.i;
   7499     if( re_hex(zIn[1],&v)
   7500      && re_hex(zIn[2],&v)
   7501      && re_hex(zIn[3],&v)
   7502      && re_hex(zIn[4],&v)
   7503     ){
   7504       p->sIn.i += 5;
   7505       return v;
   7506     }
   7507   }
   7508   if( c=='x' && p->sIn.i+2<p->sIn.mx ){
   7509     const unsigned char *zIn = p->sIn.z + p->sIn.i;
   7510     if( re_hex(zIn[1],&v)
   7511      && re_hex(zIn[2],&v)
   7512     ){
   7513       p->sIn.i += 3;
   7514       return v;
   7515     }
   7516   }
   7517   for(i=0; zEsc[i] && zEsc[i]!=c; i++){}
   7518   if( zEsc[i] ){
   7519     if( i<6 ) c = zTrans[i];
   7520     p->sIn.i++;
   7521   }else{
   7522     p->zErr = "unknown \\ escape";
   7523   }
   7524   return c;
   7525 }
   7526 
   7527 /* Forward declaration */
   7528 static const char *re_subcompile_string(ReCompiled*);
   7529 
   7530 /* Peek at the next byte of input */
   7531 static unsigned char rePeek(ReCompiled *p){
   7532   return p->sIn.i<p->sIn.mx ? p->sIn.z[p->sIn.i] : 0;
   7533 }
   7534 
   7535 /* Compile RE text into a sequence of opcodes.  Continue up to the
   7536 ** first unmatched ")" character, then return.  If an error is found,
   7537 ** return a pointer to the error message string.
   7538 */
   7539 static const char *re_subcompile_re(ReCompiled *p){
   7540   const char *zErr;
   7541   int iStart, iEnd, iGoto;
   7542   iStart = p->nState;
   7543   zErr = re_subcompile_string(p);
   7544   if( zErr ) return zErr;
   7545   while( rePeek(p)=='|' ){
   7546     iEnd = p->nState;
   7547     re_insert(p, iStart, RE_OP_FORK, iEnd + 2 - iStart);
   7548     iGoto = re_append(p, RE_OP_GOTO, 0);
   7549     p->sIn.i++;
   7550     zErr = re_subcompile_string(p);
   7551     if( zErr ) return zErr;
   7552     p->aArg[iGoto] = p->nState - iGoto;
   7553   }
   7554   return 0;
   7555 }
   7556 
   7557 /* Compile an element of regular expression text (anything that can be
   7558 ** an operand to the "|" operator).  Return NULL on success or a pointer
   7559 ** to the error message if there is a problem.
   7560 */
   7561 static const char *re_subcompile_string(ReCompiled *p){
   7562   int iPrev = -1;
   7563   int iStart;
   7564   unsigned c;
   7565   const char *zErr;
   7566   while( (c = p->xNextChar(&p->sIn))!=0 ){
   7567     iStart = p->nState;
   7568     switch( c ){
   7569       case '|':
   7570       case ')': {
   7571         p->sIn.i--;
   7572         return 0;
   7573       }
   7574       case '(': {
   7575         zErr = re_subcompile_re(p);
   7576         if( zErr ) return zErr;
   7577         if( rePeek(p)!=')' ) return "unmatched '('";
   7578         p->sIn.i++;
   7579         break;
   7580       }
   7581       case '.': {
   7582         if( rePeek(p)=='*' ){
   7583           re_append(p, RE_OP_ANYSTAR, 0);
   7584           p->sIn.i++;
   7585         }else{
   7586           re_append(p, RE_OP_ANY, 0);
   7587         }
   7588         break;
   7589       }
   7590       case '*': {
   7591         if( iPrev<0 ) return "'*' without operand";
   7592         re_insert(p, iPrev, RE_OP_GOTO, p->nState - iPrev + 1);
   7593         re_append(p, RE_OP_FORK, iPrev - p->nState + 1);
   7594         break;
   7595       }
   7596       case '+': {
   7597         if( iPrev<0 ) return "'+' without operand";
   7598         re_append(p, RE_OP_FORK, iPrev - p->nState);
   7599         break;
   7600       }
   7601       case '?': {
   7602         if( iPrev<0 ) return "'?' without operand";
   7603         re_insert(p, iPrev, RE_OP_FORK, p->nState - iPrev+1);
   7604         break;
   7605       }
   7606       case '$': {
   7607         re_append(p, RE_OP_MATCH, RE_EOF);
   7608         break;
   7609       }
   7610       case '^': {
   7611         re_append(p, RE_OP_ATSTART, 0);
   7612         break;
   7613       }
   7614       case '{': {
   7615         int m = 0, n = 0;
   7616         int sz, j;
   7617         if( iPrev<0 ) return "'{m,n}' without operand";
   7618         while( (c=rePeek(p))>='0' && c<='9' ){ m = m*10 + c - '0'; p->sIn.i++; }
   7619         n = m;
   7620         if( c==',' ){
   7621           p->sIn.i++;
   7622           n = 0;
   7623           while( (c=rePeek(p))>='0' && c<='9' ){ n = n*10 + c-'0'; p->sIn.i++; }
   7624         }
   7625         if( c!='}' ) return "unmatched '{'";
   7626         if( n>0 && n<m ) return "n less than m in '{m,n}'";
   7627         p->sIn.i++;
   7628         sz = p->nState - iPrev;
   7629         if( m==0 ){
   7630           if( n==0 ) return "both m and n are zero in '{m,n}'";
   7631           re_insert(p, iPrev, RE_OP_FORK, sz+1);
   7632           iPrev++;
   7633           n--;
   7634         }else{
   7635           for(j=1; j<m; j++) re_copy(p, iPrev, sz);
   7636         }
   7637         for(j=m; j<n; j++){
   7638           re_append(p, RE_OP_FORK, sz+1);
   7639           re_copy(p, iPrev, sz);
   7640         }
   7641         if( n==0 && m>0 ){
   7642           re_append(p, RE_OP_FORK, -sz);
   7643         }
   7644         break;
   7645       }
   7646       case '[': {
   7647         unsigned int iFirst = p->nState;
   7648         if( rePeek(p)=='^' ){
   7649           re_append(p, RE_OP_CC_EXC, 0);
   7650           p->sIn.i++;
   7651         }else{
   7652           re_append(p, RE_OP_CC_INC, 0);
   7653         }
   7654         while( (c = p->xNextChar(&p->sIn))!=0 ){
   7655           if( c=='[' && rePeek(p)==':' ){
   7656             return "POSIX character classes not supported";
   7657           }
   7658           if( c=='\\' ) c = re_esc_char(p);
   7659           if( rePeek(p)=='-' ){
   7660             re_append(p, RE_OP_CC_RANGE, c);
   7661             p->sIn.i++;
   7662             c = p->xNextChar(&p->sIn);
   7663             if( c=='\\' ) c = re_esc_char(p);
   7664             re_append(p, RE_OP_CC_RANGE, c);
   7665           }else{
   7666             re_append(p, RE_OP_CC_VALUE, c);
   7667           }
   7668           if( rePeek(p)==']' ){ p->sIn.i++; break; }
   7669         }
   7670         if( c==0 ) return "unclosed '['";
   7671         if( p->nState>iFirst ) p->aArg[iFirst] = p->nState - iFirst;
   7672         break;
   7673       }
   7674       case '\\': {
   7675         int specialOp = 0;
   7676         switch( rePeek(p) ){
   7677           case 'b': specialOp = RE_OP_BOUNDARY;   break;
   7678           case 'd': specialOp = RE_OP_DIGIT;      break;
   7679           case 'D': specialOp = RE_OP_NOTDIGIT;   break;
   7680           case 's': specialOp = RE_OP_SPACE;      break;
   7681           case 'S': specialOp = RE_OP_NOTSPACE;   break;
   7682           case 'w': specialOp = RE_OP_WORD;       break;
   7683           case 'W': specialOp = RE_OP_NOTWORD;    break;
   7684         }
   7685         if( specialOp ){
   7686           p->sIn.i++;
   7687           re_append(p, specialOp, 0);
   7688         }else{
   7689           c = re_esc_char(p);
   7690           re_append(p, RE_OP_MATCH, c);
   7691         }
   7692         break;
   7693       }
   7694       default: {
   7695         re_append(p, RE_OP_MATCH, c);
   7696         break;
   7697       }
   7698     }
   7699     iPrev = iStart;
   7700   }
   7701   return 0;
   7702 }
   7703 
   7704 /* Free and reclaim all the memory used by a previously compiled
   7705 ** regular expression.  Applications should invoke this routine once
   7706 ** for every call to re_compile() to avoid memory leaks.
   7707 */
   7708 static void re_free(void *p){
   7709   ReCompiled *pRe = (ReCompiled*)p;
   7710   if( pRe ){
   7711     sqlite3_free(pRe->aOp);
   7712     sqlite3_free(pRe->aArg);
   7713     sqlite3_free(pRe);
   7714   }
   7715 }
   7716 
   7717 /*
   7718 ** Compile a textual regular expression in zIn[] into a compiled regular
   7719 ** expression suitable for us by re_match() and return a pointer to the
   7720 ** compiled regular expression in *ppRe.  Return NULL on success or an
   7721 ** error message if something goes wrong.
   7722 */
   7723 static const char *re_compile(ReCompiled **ppRe, const char *zIn, int noCase){
   7724   ReCompiled *pRe;
   7725   const char *zErr;
   7726   int i, j;
   7727 
   7728   *ppRe = 0;
   7729   pRe = sqlite3_malloc( sizeof(*pRe) );
   7730   if( pRe==0 ){
   7731     return "out of memory";
   7732   }
   7733   memset(pRe, 0, sizeof(*pRe));
   7734   pRe->xNextChar = noCase ? re_next_char_nocase : re_next_char;
   7735   if( re_resize(pRe, 30) ){
   7736     re_free(pRe);
   7737     return "out of memory";
   7738   }
   7739   if( zIn[0]=='^' ){
   7740     zIn++;
   7741   }else{
   7742     re_append(pRe, RE_OP_ANYSTAR, 0);
   7743   }
   7744   pRe->sIn.z = (unsigned char*)zIn;
   7745   pRe->sIn.i = 0;
   7746   pRe->sIn.mx = (int)strlen(zIn);
   7747   zErr = re_subcompile_re(pRe);
   7748   if( zErr ){
   7749     re_free(pRe);
   7750     return zErr;
   7751   }
   7752   if( pRe->sIn.i>=pRe->sIn.mx ){
   7753     re_append(pRe, RE_OP_ACCEPT, 0);
   7754     *ppRe = pRe;
   7755   }else{
   7756     re_free(pRe);
   7757     return "unrecognized character";
   7758   }
   7759 
   7760   /* The following is a performance optimization.  If the regex begins with
   7761   ** ".*" (if the input regex lacks an initial "^") and afterwards there are
   7762   ** one or more matching characters, enter those matching characters into
   7763   ** zInit[].  The re_match() routine can then search ahead in the input 
   7764   ** string looking for the initial match without having to run the whole
   7765   ** regex engine over the string.  Do not worry about trying to match
   7766   ** unicode characters beyond plane 0 - those are very rare and this is
   7767   ** just an optimization. */
   7768   if( pRe->aOp[0]==RE_OP_ANYSTAR && !noCase ){
   7769     for(j=0, i=1; j<(int)sizeof(pRe->zInit)-2 && pRe->aOp[i]==RE_OP_MATCH; i++){
   7770       unsigned x = pRe->aArg[i];
   7771       if( x<=0x7f ){
   7772         pRe->zInit[j++] = (unsigned char)x;
   7773       }else if( x<=0x7ff ){
   7774         pRe->zInit[j++] = (unsigned char)(0xc0 | (x>>6));
   7775         pRe->zInit[j++] = 0x80 | (x&0x3f);
   7776       }else if( x<=0xffff ){
   7777         pRe->zInit[j++] = (unsigned char)(0xe0 | (x>>12));
   7778         pRe->zInit[j++] = 0x80 | ((x>>6)&0x3f);
   7779         pRe->zInit[j++] = 0x80 | (x&0x3f);
   7780       }else{
   7781         break;
   7782       }
   7783     }
   7784     if( j>0 && pRe->zInit[j-1]==0 ) j--;
   7785     pRe->nInit = j;
   7786   }
   7787   return pRe->zErr;
   7788 }
   7789 
   7790 /*
   7791 ** Implementation of the regexp() SQL function.  This function implements
   7792 ** the build-in REGEXP operator.  The first argument to the function is the
   7793 ** pattern and the second argument is the string.  So, the SQL statements:
   7794 **
   7795 **       A REGEXP B
   7796 **
   7797 ** is implemented as regexp(B,A).
   7798 */
   7799 static void re_sql_func(
   7800   sqlite3_context *context,
   7801   int argc,
   7802   sqlite3_value **argv
   7803 ){
   7804   ReCompiled *pRe;          /* Compiled regular expression */
   7805   const char *zPattern;     /* The regular expression */
   7806   const unsigned char *zStr;/* String being searched */
   7807   const char *zErr;         /* Compile error message */
   7808   int setAux = 0;           /* True to invoke sqlite3_set_auxdata() */
   7809 
   7810   (void)argc;  /* Unused */
   7811   pRe = sqlite3_get_auxdata(context, 0);
   7812   if( pRe==0 ){
   7813     zPattern = (const char*)sqlite3_value_text(argv[0]);
   7814     if( zPattern==0 ) return;
   7815     zErr = re_compile(&pRe, zPattern, sqlite3_user_data(context)!=0);
   7816     if( zErr ){
   7817       re_free(pRe);
   7818       sqlite3_result_error(context, zErr, -1);
   7819       return;
   7820     }
   7821     if( pRe==0 ){
   7822       sqlite3_result_error_nomem(context);
   7823       return;
   7824     }
   7825     setAux = 1;
   7826   }
   7827   zStr = (const unsigned char*)sqlite3_value_text(argv[1]);
   7828   if( zStr!=0 ){
   7829     sqlite3_result_int(context, re_match(pRe, zStr, -1));
   7830   }
   7831   if( setAux ){
   7832     sqlite3_set_auxdata(context, 0, pRe, (void(*)(void*))re_free);
   7833   }
   7834 }
   7835 
   7836 #if defined(SQLITE_DEBUG)
   7837 /*
   7838 ** This function is used for testing and debugging only.  It is only available
   7839 ** if the SQLITE_DEBUG compile-time option is used.
   7840 **
   7841 ** Compile a regular expression and then convert the compiled expression into
   7842 ** text and return that text.
   7843 */
   7844 static void re_bytecode_func(
   7845   sqlite3_context *context,
   7846   int argc,
   7847   sqlite3_value **argv
   7848 ){
   7849   const char *zPattern;
   7850   const char *zErr;
   7851   ReCompiled *pRe;
   7852   sqlite3_str *pStr;
   7853   int i;
   7854   int n;
   7855   char *z;
   7856   (void)argc;
   7857 
   7858   zPattern = (const char*)sqlite3_value_text(argv[0]);
   7859   if( zPattern==0 ) return;
   7860   zErr = re_compile(&pRe, zPattern, sqlite3_user_data(context)!=0);
   7861   if( zErr ){
   7862     re_free(pRe);
   7863     sqlite3_result_error(context, zErr, -1);
   7864     return;
   7865   }
   7866   if( pRe==0 ){
   7867     sqlite3_result_error_nomem(context);
   7868     return;
   7869   }
   7870   pStr = sqlite3_str_new(0);
   7871   if( pStr==0 ) goto re_bytecode_func_err;
   7872   if( pRe->nInit>0 ){
   7873     sqlite3_str_appendf(pStr, "INIT     ");
   7874     for(i=0; i<pRe->nInit; i++){
   7875       sqlite3_str_appendf(pStr, "%02x", pRe->zInit[i]);
   7876     }
   7877     sqlite3_str_appendf(pStr, "\n");
   7878   }
   7879   for(i=0; (unsigned)i<pRe->nState; i++){
   7880     sqlite3_str_appendf(pStr, "%-8s %4d\n",
   7881          ReOpName[(unsigned char)pRe->aOp[i]], pRe->aArg[i]);
   7882   }
   7883   n = sqlite3_str_length(pStr);
   7884   z = sqlite3_str_finish(pStr);
   7885   if( n==0 ){
   7886     sqlite3_free(z);
   7887   }else{
   7888     sqlite3_result_text(context, z, n-1, sqlite3_free);
   7889   }
   7890 
   7891 re_bytecode_func_err:
   7892   re_free(pRe);
   7893 }
   7894 
   7895 #endif /* SQLITE_DEBUG */
   7896 
   7897 
   7898 /*
   7899 ** Invoke this routine to register the regexp() function with the
   7900 ** SQLite database connection.
   7901 */
   7902 #ifdef _WIN32
   7903 
   7904 #endif
   7905 int sqlite3_regexp_init(
   7906   sqlite3 *db, 
   7907   char **pzErrMsg, 
   7908   const sqlite3_api_routines *pApi
   7909 ){
   7910   int rc = SQLITE_OK;
   7911   SQLITE_EXTENSION_INIT2(pApi);
   7912   (void)pzErrMsg;  /* Unused */
   7913   rc = sqlite3_create_function(db, "regexp", 2, 
   7914                             SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC,
   7915                             0, re_sql_func, 0, 0);
   7916   if( rc==SQLITE_OK ){
   7917     /* The regexpi(PATTERN,STRING) function is a case-insensitive version
   7918     ** of regexp(PATTERN,STRING). */
   7919     rc = sqlite3_create_function(db, "regexpi", 2,
   7920                             SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC,
   7921                             (void*)db, re_sql_func, 0, 0);
   7922 #if defined(SQLITE_DEBUG)
   7923     if( rc==SQLITE_OK ){
   7924       rc = sqlite3_create_function(db, "regexp_bytecode", 1,
   7925                             SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC,
   7926                             0, re_bytecode_func, 0, 0);
   7927     }
   7928 #endif /* SQLITE_DEBUG */
   7929   }
   7930   return rc;
   7931 }
   7932 
   7933 /************************* End ../ext/misc/regexp.c ********************/
   7934 #ifndef SQLITE_SHELL_FIDDLE
   7935 /************************* Begin ../ext/misc/fileio.c ******************/
   7936 /*
   7937 ** 2014-06-13
   7938 **
   7939 ** The author disclaims copyright to this source code.  In place of
   7940 ** a legal notice, here is a blessing:
   7941 **
   7942 **    May you do good and not evil.
   7943 **    May you find forgiveness for yourself and forgive others.
   7944 **    May you share freely, never taking more than you give.
   7945 **
   7946 ******************************************************************************
   7947 **
   7948 ** This SQLite extension implements SQL functions readfile() and
   7949 ** writefile(), and eponymous virtual type "fsdir".
   7950 **
   7951 ** WRITEFILE(FILE, DATA [, MODE [, MTIME]]):
   7952 **
   7953 **   If neither of the optional arguments is present, then this UDF
   7954 **   function writes blob DATA to file FILE. If successful, the number
   7955 **   of bytes written is returned. If an error occurs, NULL is returned.
   7956 **
   7957 **   If the first option argument - MODE - is present, then it must
   7958 **   be passed an integer value that corresponds to a POSIX mode
   7959 **   value (file type + permissions, as returned in the stat.st_mode
   7960 **   field by the stat() system call). Three types of files may
   7961 **   be written/created:
   7962 **
   7963 **     regular files:  (mode & 0170000)==0100000
   7964 **     symbolic links: (mode & 0170000)==0120000
   7965 **     directories:    (mode & 0170000)==0040000
   7966 **
   7967 **   For a directory, the DATA is ignored. For a symbolic link, it is
   7968 **   interpreted as text and used as the target of the link. For a
   7969 **   regular file, it is interpreted as a blob and written into the
   7970 **   named file. Regardless of the type of file, its permissions are
   7971 **   set to (mode & 0777) before returning.
   7972 **
   7973 **   If the optional MTIME argument is present, then it is interpreted
   7974 **   as an integer - the number of seconds since the unix epoch. The
   7975 **   modification-time of the target file is set to this value before
   7976 **   returning.
   7977 **
   7978 **   If five or more arguments are passed to this function and an
   7979 **   error is encountered, an exception is raised.
   7980 **
   7981 ** READFILE(FILE):
   7982 **
   7983 **   Read and return the contents of file FILE (type blob) from disk.
   7984 **
   7985 ** FSDIR:
   7986 **
   7987 **   Used as follows:
   7988 **
   7989 **     SELECT * FROM fsdir($path [, $dir]);
   7990 **
   7991 **   Parameter $path is an absolute or relative pathname. If the file that it
   7992 **   refers to does not exist, it is an error. If the path refers to a regular
   7993 **   file or symbolic link, it returns a single row. Or, if the path refers
   7994 **   to a directory, it returns one row for the directory, and one row for each
   7995 **   file within the hierarchy rooted at $path.
   7996 **
   7997 **   Each row has the following columns:
   7998 **
   7999 **     name:  Path to file or directory (text value).
   8000 **     mode:  Value of stat.st_mode for directory entry (an integer).
   8001 **     mtime: Value of stat.st_mtime for directory entry (an integer).
   8002 **     data:  For a regular file, a blob containing the file data. For a
   8003 **            symlink, a text value containing the text of the link. For a
   8004 **            directory, NULL.
   8005 **
   8006 **   If a non-NULL value is specified for the optional $dir parameter and
   8007 **   $path is a relative path, then $path is interpreted relative to $dir. 
   8008 **   And the paths returned in the "name" column of the table are also 
   8009 **   relative to directory $dir.
   8010 **
   8011 ** Notes on building this extension for Windows:
   8012 **   Unless linked statically with the SQLite library, a preprocessor
   8013 **   symbol, FILEIO_WIN32_DLL, must be #define'd to create a stand-alone
   8014 **   DLL form of this extension for WIN32. See its use below for details.
   8015 */
   8016 /* #include "sqlite3ext.h" */
   8017 SQLITE_EXTENSION_INIT1
   8018 #include <stdio.h>
   8019 #include <string.h>
   8020 #include <assert.h>
   8021 
   8022 #include <sys/types.h>
   8023 #include <sys/stat.h>
   8024 #include <fcntl.h>
   8025 #if !defined(_WIN32) && !defined(WIN32)
   8026 #  include <unistd.h>
   8027 #  include <dirent.h>
   8028 #  include <utime.h>
   8029 #  include <sys/time.h>
   8030 #  define STRUCT_STAT struct stat
   8031 #else
   8032 #  include "windows.h"
   8033 #  include <io.h>
   8034 #  include <direct.h>
   8035 /* #  include "test_windirent.h" */
   8036 #  define dirent DIRENT
   8037 #  define STRUCT_STAT struct _stat
   8038 #  define chmod(path,mode) fileio_chmod(path,mode)
   8039 #  define mkdir(path,mode) fileio_mkdir(path)
   8040 #endif
   8041 #include <time.h>
   8042 #include <errno.h>
   8043 
   8044 /* When used as part of the CLI, the sqlite3_stdio.h module will have
   8045 ** been included before this one. In that case use the sqlite3_stdio.h
   8046 ** #defines.  If not, create our own for fopen().
   8047 */
   8048 #ifndef _SQLITE3_STDIO_H_
   8049 # define sqlite3_fopen fopen
   8050 #endif
   8051 
   8052 /*
   8053 ** Structure of the fsdir() table-valued function
   8054 */
   8055                  /*    0    1    2     3    4           5             */
   8056 #define FSDIR_SCHEMA "(name,mode,mtime,data,path HIDDEN,dir HIDDEN)"
   8057 #define FSDIR_COLUMN_NAME     0     /* Name of the file */
   8058 #define FSDIR_COLUMN_MODE     1     /* Access mode */
   8059 #define FSDIR_COLUMN_MTIME    2     /* Last modification time */
   8060 #define FSDIR_COLUMN_DATA     3     /* File content */
   8061 #define FSDIR_COLUMN_PATH     4     /* Path to top of search */
   8062 #define FSDIR_COLUMN_DIR      5     /* Path is relative to this directory */
   8063 
   8064 /*
   8065 ** UTF8 chmod() function for Windows
   8066 */
   8067 #if defined(_WIN32) || defined(WIN32)
   8068 static int fileio_chmod(const char *zPath, int pmode){
   8069   sqlite3_int64 sz = strlen(zPath);
   8070   wchar_t *b1 = sqlite3_malloc64( (sz+1)*sizeof(b1[0]) );
   8071   int rc;
   8072   if( b1==0 ) return -1;
   8073   sz = MultiByteToWideChar(CP_UTF8, 0, zPath, sz, b1, sz);
   8074   b1[sz] = 0;
   8075   rc = _wchmod(b1, pmode);
   8076   sqlite3_free(b1);
   8077   return rc;
   8078 }
   8079 #endif
   8080 
   8081 /*
   8082 ** UTF8 mkdir() function for Windows
   8083 */
   8084 #if defined(_WIN32) || defined(WIN32)
   8085 static int fileio_mkdir(const char *zPath){
   8086   sqlite3_int64 sz = strlen(zPath);
   8087   wchar_t *b1 = sqlite3_malloc64( (sz+1)*sizeof(b1[0]) );
   8088   int rc;
   8089   if( b1==0 ) return -1;
   8090   sz = MultiByteToWideChar(CP_UTF8, 0, zPath, sz, b1, sz);
   8091   b1[sz] = 0;
   8092   rc = _wmkdir(b1);
   8093   sqlite3_free(b1);
   8094   return rc;
   8095 }
   8096 #endif
   8097 
   8098 
   8099 /*
   8100 ** Set the result stored by context ctx to a blob containing the 
   8101 ** contents of file zName.  Or, leave the result unchanged (NULL)
   8102 ** if the file does not exist or is unreadable.
   8103 **
   8104 ** If the file exceeds the SQLite blob size limit, through an
   8105 ** SQLITE_TOOBIG error.
   8106 **
   8107 ** Throw an SQLITE_IOERR if there are difficulties pulling the file
   8108 ** off of disk.
   8109 */
   8110 static void readFileContents(sqlite3_context *ctx, const char *zName){
   8111   FILE *in;
   8112   sqlite3_int64 nIn;
   8113   void *pBuf;
   8114   sqlite3 *db;
   8115   int mxBlob;
   8116 
   8117   in = sqlite3_fopen(zName, "rb");
   8118   if( in==0 ){
   8119     /* File does not exist or is unreadable. Leave the result set to NULL. */
   8120     return;
   8121   }
   8122   fseek(in, 0, SEEK_END);
   8123   nIn = ftell(in);
   8124   rewind(in);
   8125   db = sqlite3_context_db_handle(ctx);
   8126   mxBlob = sqlite3_limit(db, SQLITE_LIMIT_LENGTH, -1);
   8127   if( nIn>mxBlob ){
   8128     sqlite3_result_error_code(ctx, SQLITE_TOOBIG);
   8129     fclose(in);
   8130     return;
   8131   }
   8132   pBuf = sqlite3_malloc64( nIn ? nIn : 1 );
   8133   if( pBuf==0 ){
   8134     sqlite3_result_error_nomem(ctx);
   8135     fclose(in);
   8136     return;
   8137   }
   8138   if( nIn==(sqlite3_int64)fread(pBuf, 1, (size_t)nIn, in) ){
   8139     sqlite3_result_blob64(ctx, pBuf, nIn, sqlite3_free);
   8140   }else{
   8141     sqlite3_result_error_code(ctx, SQLITE_IOERR);
   8142     sqlite3_free(pBuf);
   8143   }
   8144   fclose(in);
   8145 }
   8146 
   8147 /*
   8148 ** Implementation of the "readfile(X)" SQL function.  The entire content
   8149 ** of the file named X is read and returned as a BLOB.  NULL is returned
   8150 ** if the file does not exist or is unreadable.
   8151 */
   8152 static void readfileFunc(
   8153   sqlite3_context *context,
   8154   int argc,
   8155   sqlite3_value **argv
   8156 ){
   8157   const char *zName;
   8158   (void)(argc);  /* Unused parameter */
   8159   zName = (const char*)sqlite3_value_text(argv[0]);
   8160   if( zName==0 ) return;
   8161   readFileContents(context, zName);
   8162 }
   8163 
   8164 /*
   8165 ** Set the error message contained in context ctx to the results of
   8166 ** vprintf(zFmt, ...).
   8167 */
   8168 static void ctxErrorMsg(sqlite3_context *ctx, const char *zFmt, ...){
   8169   char *zMsg = 0;
   8170   va_list ap;
   8171   va_start(ap, zFmt);
   8172   zMsg = sqlite3_vmprintf(zFmt, ap);
   8173   sqlite3_result_error(ctx, zMsg, -1);
   8174   sqlite3_free(zMsg);
   8175   va_end(ap);
   8176 }
   8177 
   8178 #if defined(_WIN32)
   8179 /*
   8180 ** This function is designed to convert a Win32 FILETIME structure into the
   8181 ** number of seconds since the Unix Epoch (1970-01-01 00:00:00 UTC).
   8182 */
   8183 static sqlite3_uint64 fileTimeToUnixTime(
   8184   LPFILETIME pFileTime
   8185 ){
   8186   SYSTEMTIME epochSystemTime;
   8187   ULARGE_INTEGER epochIntervals;
   8188   FILETIME epochFileTime;
   8189   ULARGE_INTEGER fileIntervals;
   8190 
   8191   memset(&epochSystemTime, 0, sizeof(SYSTEMTIME));
   8192   epochSystemTime.wYear = 1970;
   8193   epochSystemTime.wMonth = 1;
   8194   epochSystemTime.wDay = 1;
   8195   SystemTimeToFileTime(&epochSystemTime, &epochFileTime);
   8196   epochIntervals.LowPart = epochFileTime.dwLowDateTime;
   8197   epochIntervals.HighPart = epochFileTime.dwHighDateTime;
   8198 
   8199   fileIntervals.LowPart = pFileTime->dwLowDateTime;
   8200   fileIntervals.HighPart = pFileTime->dwHighDateTime;
   8201 
   8202   return (fileIntervals.QuadPart - epochIntervals.QuadPart) / 10000000;
   8203 }
   8204 
   8205 
   8206 #if defined(FILEIO_WIN32_DLL) && (defined(_WIN32) || defined(WIN32))
   8207 #  /* To allow a standalone DLL, use this next replacement function: */
   8208 #  undef sqlite3_win32_utf8_to_unicode
   8209 #  define sqlite3_win32_utf8_to_unicode utf8_to_utf16
   8210 #
   8211 LPWSTR utf8_to_utf16(const char *z){
   8212   int nAllot = MultiByteToWideChar(CP_UTF8, 0, z, -1, NULL, 0);
   8213   LPWSTR rv = sqlite3_malloc(nAllot * sizeof(WCHAR));
   8214   if( rv!=0 && 0 < MultiByteToWideChar(CP_UTF8, 0, z, -1, rv, nAllot) )
   8215     return rv;
   8216   sqlite3_free(rv);
   8217   return 0;
   8218 }
   8219 #endif
   8220 
   8221 /*
   8222 ** This function attempts to normalize the time values found in the stat()
   8223 ** buffer to UTC.  This is necessary on Win32, where the runtime library
   8224 ** appears to return these values as local times.
   8225 */
   8226 static void statTimesToUtc(
   8227   const char *zPath,
   8228   STRUCT_STAT *pStatBuf
   8229 ){
   8230   HANDLE hFindFile;
   8231   WIN32_FIND_DATAW fd;
   8232   LPWSTR zUnicodeName;
   8233   extern LPWSTR sqlite3_win32_utf8_to_unicode(const char*);
   8234   zUnicodeName = sqlite3_win32_utf8_to_unicode(zPath);
   8235   if( zUnicodeName ){
   8236     memset(&fd, 0, sizeof(WIN32_FIND_DATAW));
   8237     hFindFile = FindFirstFileW(zUnicodeName, &fd);
   8238     if( hFindFile!=NULL ){
   8239       pStatBuf->st_ctime = (time_t)fileTimeToUnixTime(&fd.ftCreationTime);
   8240       pStatBuf->st_atime = (time_t)fileTimeToUnixTime(&fd.ftLastAccessTime);
   8241       pStatBuf->st_mtime = (time_t)fileTimeToUnixTime(&fd.ftLastWriteTime);
   8242       FindClose(hFindFile);
   8243     }
   8244     sqlite3_free(zUnicodeName);
   8245   }
   8246 }
   8247 #endif
   8248 
   8249 /*
   8250 ** This function is used in place of stat().  On Windows, special handling
   8251 ** is required in order for the included time to be returned as UTC.  On all
   8252 ** other systems, this function simply calls stat().
   8253 */
   8254 static int fileStat(
   8255   const char *zPath,
   8256   STRUCT_STAT *pStatBuf
   8257 ){
   8258 #if defined(_WIN32)
   8259   sqlite3_int64 sz = strlen(zPath);
   8260   wchar_t *b1 = sqlite3_malloc64( (sz+1)*sizeof(b1[0]) );
   8261   int rc;
   8262   if( b1==0 ) return 1;
   8263   sz = MultiByteToWideChar(CP_UTF8, 0, zPath, sz, b1, sz);
   8264   b1[sz] = 0;
   8265   rc = _wstat(b1, pStatBuf);
   8266   if( rc==0 ) statTimesToUtc(zPath, pStatBuf);
   8267   return rc;
   8268 #else
   8269   return stat(zPath, pStatBuf);
   8270 #endif
   8271 }
   8272 
   8273 /*
   8274 ** This function is used in place of lstat().  On Windows, special handling
   8275 ** is required in order for the included time to be returned as UTC.  On all
   8276 ** other systems, this function simply calls lstat().
   8277 */
   8278 static int fileLinkStat(
   8279   const char *zPath,
   8280   STRUCT_STAT *pStatBuf
   8281 ){
   8282 #if defined(_WIN32)
   8283   return fileStat(zPath, pStatBuf);
   8284 #else
   8285   return lstat(zPath, pStatBuf);
   8286 #endif
   8287 }
   8288 
   8289 /*
   8290 ** Argument zFile is the name of a file that will be created and/or written
   8291 ** by SQL function writefile(). This function ensures that the directory
   8292 ** zFile will be written to exists, creating it if required. The permissions
   8293 ** for any path components created by this function are set in accordance
   8294 ** with the current umask.
   8295 **
   8296 ** If an OOM condition is encountered, SQLITE_NOMEM is returned. Otherwise,
   8297 ** SQLITE_OK is returned if the directory is successfully created, or
   8298 ** SQLITE_ERROR otherwise.
   8299 */
   8300 static int makeDirectory(
   8301   const char *zFile
   8302 ){
   8303   char *zCopy = sqlite3_mprintf("%s", zFile);
   8304   int rc = SQLITE_OK;
   8305 
   8306   if( zCopy==0 ){
   8307     rc = SQLITE_NOMEM;
   8308   }else{
   8309     int nCopy = (int)strlen(zCopy);
   8310     int i = 1;
   8311 
   8312     while( rc==SQLITE_OK ){
   8313       STRUCT_STAT sStat;
   8314       int rc2;
   8315 
   8316       for(; zCopy[i]!='/' && i<nCopy; i++);
   8317       if( i==nCopy ) break;
   8318       zCopy[i] = '\0';
   8319 
   8320       rc2 = fileStat(zCopy, &sStat);
   8321       if( rc2!=0 ){
   8322         if( mkdir(zCopy, 0777) ) rc = SQLITE_ERROR;
   8323       }else{
   8324         if( !S_ISDIR(sStat.st_mode) ) rc = SQLITE_ERROR;
   8325       }
   8326       zCopy[i] = '/';
   8327       i++;
   8328     }
   8329 
   8330     sqlite3_free(zCopy);
   8331   }
   8332 
   8333   return rc;
   8334 }
   8335 
   8336 /*
   8337 ** This function does the work for the writefile() UDF. Refer to 
   8338 ** header comments at the top of this file for details.
   8339 */
   8340 static int writeFile(
   8341   sqlite3_context *pCtx,          /* Context to return bytes written in */
   8342   const char *zFile,              /* File to write */
   8343   sqlite3_value *pData,           /* Data to write */
   8344   mode_t mode,                    /* MODE parameter passed to writefile() */
   8345   sqlite3_int64 mtime             /* MTIME parameter (or -1 to not set time) */
   8346 ){
   8347   if( zFile==0 ) return 1;
   8348 #if !defined(_WIN32) && !defined(WIN32)
   8349   if( S_ISLNK(mode) ){
   8350     const char *zTo = (const char*)sqlite3_value_text(pData);
   8351     if( zTo==0 ) return 1;
   8352     unlink(zFile);
   8353     if( symlink(zTo, zFile)<0 ) return 1;
   8354   }else
   8355 #endif
   8356   {
   8357     if( S_ISDIR(mode) ){
   8358       if( mkdir(zFile, mode) ){
   8359         /* The mkdir() call to create the directory failed. This might not
   8360         ** be an error though - if there is already a directory at the same
   8361         ** path and either the permissions already match or can be changed
   8362         ** to do so using chmod(), it is not an error.  */
   8363         STRUCT_STAT sStat;
   8364         if( errno!=EEXIST
   8365          || 0!=fileStat(zFile, &sStat)
   8366          || !S_ISDIR(sStat.st_mode)
   8367          || ((sStat.st_mode&0777)!=(mode&0777) && 0!=chmod(zFile, mode&0777))
   8368         ){
   8369           return 1;
   8370         }
   8371       }
   8372     }else{
   8373       sqlite3_int64 nWrite = 0;
   8374       const char *z;
   8375       int rc = 0;
   8376       FILE *out = sqlite3_fopen(zFile, "wb");
   8377       if( out==0 ) return 1;
   8378       z = (const char*)sqlite3_value_blob(pData);
   8379       if( z ){
   8380         sqlite3_int64 n = fwrite(z, 1, sqlite3_value_bytes(pData), out);
   8381         nWrite = sqlite3_value_bytes(pData);
   8382         if( nWrite!=n ){
   8383           rc = 1;
   8384         }
   8385       }
   8386       fclose(out);
   8387       if( rc==0 && mode && chmod(zFile, mode & 0777) ){
   8388         rc = 1;
   8389       }
   8390       if( rc ) return 2;
   8391       sqlite3_result_int64(pCtx, nWrite);
   8392     }
   8393   }
   8394 
   8395   if( mtime>=0 ){
   8396 #if defined(_WIN32)
   8397 #if !SQLITE_OS_WINRT
   8398     /* Windows */
   8399     FILETIME lastAccess;
   8400     FILETIME lastWrite;
   8401     SYSTEMTIME currentTime;
   8402     LONGLONG intervals;
   8403     HANDLE hFile;
   8404     LPWSTR zUnicodeName;
   8405     extern LPWSTR sqlite3_win32_utf8_to_unicode(const char*);
   8406 
   8407     GetSystemTime(&currentTime);
   8408     SystemTimeToFileTime(&currentTime, &lastAccess);
   8409     intervals = (mtime*10000000) + 116444736000000000;
   8410     lastWrite.dwLowDateTime = (DWORD)intervals;
   8411     lastWrite.dwHighDateTime = intervals >> 32;
   8412     zUnicodeName = sqlite3_win32_utf8_to_unicode(zFile);
   8413     if( zUnicodeName==0 ){
   8414       return 1;
   8415     }
   8416     hFile = CreateFileW(
   8417       zUnicodeName, FILE_WRITE_ATTRIBUTES, 0, NULL, OPEN_EXISTING,
   8418       FILE_FLAG_BACKUP_SEMANTICS, NULL
   8419     );
   8420     sqlite3_free(zUnicodeName);
   8421     if( hFile!=INVALID_HANDLE_VALUE ){
   8422       BOOL bResult = SetFileTime(hFile, NULL, &lastAccess, &lastWrite);
   8423       CloseHandle(hFile);
   8424       return !bResult;
   8425     }else{
   8426       return 1;
   8427     }
   8428 #endif
   8429 #elif defined(AT_FDCWD) && 0 /* utimensat() is not universally available */
   8430     /* Recent unix */
   8431     struct timespec times[2];
   8432     times[0].tv_nsec = times[1].tv_nsec = 0;
   8433     times[0].tv_sec = time(0);
   8434     times[1].tv_sec = mtime;
   8435     if( utimensat(AT_FDCWD, zFile, times, AT_SYMLINK_NOFOLLOW) ){
   8436       return 1;
   8437     }
   8438 #else
   8439     /* Legacy unix. 
   8440     **
   8441     ** Do not use utimes() on a symbolic link - it sees through the link and
   8442     ** modifies the timestamps on the target. Or fails if the target does 
   8443     ** not exist.  */
   8444     if( 0==S_ISLNK(mode) ){
   8445       struct timeval times[2];
   8446       times[0].tv_usec = times[1].tv_usec = 0;
   8447       times[0].tv_sec = time(0);
   8448       times[1].tv_sec = mtime;
   8449       if( utimes(zFile, times) ){
   8450         return 1;
   8451       }
   8452     }
   8453 #endif
   8454   }
   8455 
   8456   return 0;
   8457 }
   8458 
   8459 /*
   8460 ** Implementation of the "writefile(W,X[,Y[,Z]]])" SQL function.  
   8461 ** Refer to header comments at the top of this file for details.
   8462 */
   8463 static void writefileFunc(
   8464   sqlite3_context *context,
   8465   int argc,
   8466   sqlite3_value **argv
   8467 ){
   8468   const char *zFile;
   8469   mode_t mode = 0;
   8470   int res;
   8471   sqlite3_int64 mtime = -1;
   8472 
   8473   if( argc<2 || argc>4 ){
   8474     sqlite3_result_error(context, 
   8475         "wrong number of arguments to function writefile()", -1
   8476     );
   8477     return;
   8478   }
   8479 
   8480   zFile = (const char*)sqlite3_value_text(argv[0]);
   8481   if( zFile==0 ) return;
   8482   if( argc>=3 ){
   8483     mode = (mode_t)sqlite3_value_int(argv[2]);
   8484   }
   8485   if( argc==4 ){
   8486     mtime = sqlite3_value_int64(argv[3]);
   8487   }
   8488 
   8489   res = writeFile(context, zFile, argv[1], mode, mtime);
   8490   if( res==1 && errno==ENOENT ){
   8491     if( makeDirectory(zFile)==SQLITE_OK ){
   8492       res = writeFile(context, zFile, argv[1], mode, mtime);
   8493     }
   8494   }
   8495 
   8496   if( argc>2 && res!=0 ){
   8497     if( S_ISLNK(mode) ){
   8498       ctxErrorMsg(context, "failed to create symlink: %s", zFile);
   8499     }else if( S_ISDIR(mode) ){
   8500       ctxErrorMsg(context, "failed to create directory: %s", zFile);
   8501     }else{
   8502       ctxErrorMsg(context, "failed to write file: %s", zFile);
   8503     }
   8504   }
   8505 }
   8506 
   8507 /*
   8508 ** SQL function:   lsmode(MODE)
   8509 **
   8510 ** Given a numberic st_mode from stat(), convert it into a human-readable
   8511 ** text string in the style of "ls -l".
   8512 */
   8513 static void lsModeFunc(
   8514   sqlite3_context *context,
   8515   int argc,
   8516   sqlite3_value **argv
   8517 ){
   8518   int i;
   8519   int iMode = sqlite3_value_int(argv[0]);
   8520   char z[16];
   8521   (void)argc;
   8522   if( S_ISLNK(iMode) ){
   8523     z[0] = 'l';
   8524   }else if( S_ISREG(iMode) ){
   8525     z[0] = '-';
   8526   }else if( S_ISDIR(iMode) ){
   8527     z[0] = 'd';
   8528   }else{
   8529     z[0] = '?';
   8530   }
   8531   for(i=0; i<3; i++){
   8532     int m = (iMode >> ((2-i)*3));
   8533     char *a = &z[1 + i*3];
   8534     a[0] = (m & 0x4) ? 'r' : '-';
   8535     a[1] = (m & 0x2) ? 'w' : '-';
   8536     a[2] = (m & 0x1) ? 'x' : '-';
   8537   }
   8538   z[10] = '\0';
   8539   sqlite3_result_text(context, z, -1, SQLITE_TRANSIENT);
   8540 }
   8541 
   8542 #ifndef SQLITE_OMIT_VIRTUALTABLE
   8543 
   8544 /* 
   8545 ** Cursor type for recursively iterating through a directory structure.
   8546 */
   8547 typedef struct fsdir_cursor fsdir_cursor;
   8548 typedef struct FsdirLevel FsdirLevel;
   8549 
   8550 struct FsdirLevel {
   8551   DIR *pDir;                 /* From opendir() */
   8552   char *zDir;                /* Name of directory (nul-terminated) */
   8553 };
   8554 
   8555 struct fsdir_cursor {
   8556   sqlite3_vtab_cursor base;  /* Base class - must be first */
   8557 
   8558   int nLvl;                  /* Number of entries in aLvl[] array */
   8559   int iLvl;                  /* Index of current entry */
   8560   FsdirLevel *aLvl;          /* Hierarchy of directories being traversed */
   8561 
   8562   const char *zBase;
   8563   int nBase;
   8564 
   8565   STRUCT_STAT sStat;         /* Current lstat() results */
   8566   char *zPath;               /* Path to current entry */
   8567   sqlite3_int64 iRowid;      /* Current rowid */
   8568 };
   8569 
   8570 typedef struct fsdir_tab fsdir_tab;
   8571 struct fsdir_tab {
   8572   sqlite3_vtab base;         /* Base class - must be first */
   8573 };
   8574 
   8575 /*
   8576 ** Construct a new fsdir virtual table object.
   8577 */
   8578 static int fsdirConnect(
   8579   sqlite3 *db,
   8580   void *pAux,
   8581   int argc, const char *const*argv,
   8582   sqlite3_vtab **ppVtab,
   8583   char **pzErr
   8584 ){
   8585   fsdir_tab *pNew = 0;
   8586   int rc;
   8587   (void)pAux;
   8588   (void)argc;
   8589   (void)argv;
   8590   (void)pzErr;
   8591   rc = sqlite3_declare_vtab(db, "CREATE TABLE x" FSDIR_SCHEMA);
   8592   if( rc==SQLITE_OK ){
   8593     pNew = (fsdir_tab*)sqlite3_malloc( sizeof(*pNew) );
   8594     if( pNew==0 ) return SQLITE_NOMEM;
   8595     memset(pNew, 0, sizeof(*pNew));
   8596     sqlite3_vtab_config(db, SQLITE_VTAB_DIRECTONLY);
   8597   }
   8598   *ppVtab = (sqlite3_vtab*)pNew;
   8599   return rc;
   8600 }
   8601 
   8602 /*
   8603 ** This method is the destructor for fsdir vtab objects.
   8604 */
   8605 static int fsdirDisconnect(sqlite3_vtab *pVtab){
   8606   sqlite3_free(pVtab);
   8607   return SQLITE_OK;
   8608 }
   8609 
   8610 /*
   8611 ** Constructor for a new fsdir_cursor object.
   8612 */
   8613 static int fsdirOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
   8614   fsdir_cursor *pCur;
   8615   (void)p;
   8616   pCur = sqlite3_malloc( sizeof(*pCur) );
   8617   if( pCur==0 ) return SQLITE_NOMEM;
   8618   memset(pCur, 0, sizeof(*pCur));
   8619   pCur->iLvl = -1;
   8620   *ppCursor = &pCur->base;
   8621   return SQLITE_OK;
   8622 }
   8623 
   8624 /*
   8625 ** Reset a cursor back to the state it was in when first returned
   8626 ** by fsdirOpen().
   8627 */
   8628 static void fsdirResetCursor(fsdir_cursor *pCur){
   8629   int i;
   8630   for(i=0; i<=pCur->iLvl; i++){
   8631     FsdirLevel *pLvl = &pCur->aLvl[i];
   8632     if( pLvl->pDir ) closedir(pLvl->pDir);
   8633     sqlite3_free(pLvl->zDir);
   8634   }
   8635   sqlite3_free(pCur->zPath);
   8636   sqlite3_free(pCur->aLvl);
   8637   pCur->aLvl = 0;
   8638   pCur->zPath = 0;
   8639   pCur->zBase = 0;
   8640   pCur->nBase = 0;
   8641   pCur->nLvl = 0;
   8642   pCur->iLvl = -1;
   8643   pCur->iRowid = 1;
   8644 }
   8645 
   8646 /*
   8647 ** Destructor for an fsdir_cursor.
   8648 */
   8649 static int fsdirClose(sqlite3_vtab_cursor *cur){
   8650   fsdir_cursor *pCur = (fsdir_cursor*)cur;
   8651 
   8652   fsdirResetCursor(pCur);
   8653   sqlite3_free(pCur);
   8654   return SQLITE_OK;
   8655 }
   8656 
   8657 /*
   8658 ** Set the error message for the virtual table associated with cursor
   8659 ** pCur to the results of vprintf(zFmt, ...).
   8660 */
   8661 static void fsdirSetErrmsg(fsdir_cursor *pCur, const char *zFmt, ...){
   8662   va_list ap;
   8663   va_start(ap, zFmt);
   8664   pCur->base.pVtab->zErrMsg = sqlite3_vmprintf(zFmt, ap);
   8665   va_end(ap);
   8666 }
   8667 
   8668 
   8669 /*
   8670 ** Advance an fsdir_cursor to its next row of output.
   8671 */
   8672 static int fsdirNext(sqlite3_vtab_cursor *cur){
   8673   fsdir_cursor *pCur = (fsdir_cursor*)cur;
   8674   mode_t m = pCur->sStat.st_mode;
   8675 
   8676   pCur->iRowid++;
   8677   if( S_ISDIR(m) ){
   8678     /* Descend into this directory */
   8679     int iNew = pCur->iLvl + 1;
   8680     FsdirLevel *pLvl;
   8681     if( iNew>=pCur->nLvl ){
   8682       int nNew = iNew+1;
   8683       sqlite3_int64 nByte = nNew*sizeof(FsdirLevel);
   8684       FsdirLevel *aNew = (FsdirLevel*)sqlite3_realloc64(pCur->aLvl, nByte);
   8685       if( aNew==0 ) return SQLITE_NOMEM;
   8686       memset(&aNew[pCur->nLvl], 0, sizeof(FsdirLevel)*(nNew-pCur->nLvl));
   8687       pCur->aLvl = aNew;
   8688       pCur->nLvl = nNew;
   8689     }
   8690     pCur->iLvl = iNew;
   8691     pLvl = &pCur->aLvl[iNew];
   8692     
   8693     pLvl->zDir = pCur->zPath;
   8694     pCur->zPath = 0;
   8695     pLvl->pDir = opendir(pLvl->zDir);
   8696     if( pLvl->pDir==0 ){
   8697       fsdirSetErrmsg(pCur, "cannot read directory: %s", pCur->zPath);
   8698       return SQLITE_ERROR;
   8699     }
   8700   }
   8701 
   8702   while( pCur->iLvl>=0 ){
   8703     FsdirLevel *pLvl = &pCur->aLvl[pCur->iLvl];
   8704     struct dirent *pEntry = readdir(pLvl->pDir);
   8705     if( pEntry ){
   8706       if( pEntry->d_name[0]=='.' ){
   8707        if( pEntry->d_name[1]=='.' && pEntry->d_name[2]=='\0' ) continue;
   8708        if( pEntry->d_name[1]=='\0' ) continue;
   8709       }
   8710       sqlite3_free(pCur->zPath);
   8711       pCur->zPath = sqlite3_mprintf("%s/%s", pLvl->zDir, pEntry->d_name);
   8712       if( pCur->zPath==0 ) return SQLITE_NOMEM;
   8713       if( fileLinkStat(pCur->zPath, &pCur->sStat) ){
   8714         fsdirSetErrmsg(pCur, "cannot stat file: %s", pCur->zPath);
   8715         return SQLITE_ERROR;
   8716       }
   8717       return SQLITE_OK;
   8718     }
   8719     closedir(pLvl->pDir);
   8720     sqlite3_free(pLvl->zDir);
   8721     pLvl->pDir = 0;
   8722     pLvl->zDir = 0;
   8723     pCur->iLvl--;
   8724   }
   8725 
   8726   /* EOF */
   8727   sqlite3_free(pCur->zPath);
   8728   pCur->zPath = 0;
   8729   return SQLITE_OK;
   8730 }
   8731 
   8732 /*
   8733 ** Return values of columns for the row at which the series_cursor
   8734 ** is currently pointing.
   8735 */
   8736 static int fsdirColumn(
   8737   sqlite3_vtab_cursor *cur,   /* The cursor */
   8738   sqlite3_context *ctx,       /* First argument to sqlite3_result_...() */
   8739   int i                       /* Which column to return */
   8740 ){
   8741   fsdir_cursor *pCur = (fsdir_cursor*)cur;
   8742   switch( i ){
   8743     case FSDIR_COLUMN_NAME: {
   8744       sqlite3_result_text(ctx, &pCur->zPath[pCur->nBase], -1, SQLITE_TRANSIENT);
   8745       break;
   8746     }
   8747 
   8748     case FSDIR_COLUMN_MODE:
   8749       sqlite3_result_int64(ctx, pCur->sStat.st_mode);
   8750       break;
   8751 
   8752     case FSDIR_COLUMN_MTIME:
   8753       sqlite3_result_int64(ctx, pCur->sStat.st_mtime);
   8754       break;
   8755 
   8756     case FSDIR_COLUMN_DATA: {
   8757       mode_t m = pCur->sStat.st_mode;
   8758       if( S_ISDIR(m) ){
   8759         sqlite3_result_null(ctx);
   8760 #if !defined(_WIN32) && !defined(WIN32)
   8761       }else if( S_ISLNK(m) ){
   8762         char aStatic[64];
   8763         char *aBuf = aStatic;
   8764         sqlite3_int64 nBuf = 64;
   8765         int n;
   8766 
   8767         while( 1 ){
   8768           n = readlink(pCur->zPath, aBuf, nBuf);
   8769           if( n<nBuf ) break;
   8770           if( aBuf!=aStatic ) sqlite3_free(aBuf);
   8771           nBuf = nBuf*2;
   8772           aBuf = sqlite3_malloc64(nBuf);
   8773           if( aBuf==0 ){
   8774             sqlite3_result_error_nomem(ctx);
   8775             return SQLITE_NOMEM;
   8776           }
   8777         }
   8778 
   8779         sqlite3_result_text(ctx, aBuf, n, SQLITE_TRANSIENT);
   8780         if( aBuf!=aStatic ) sqlite3_free(aBuf);
   8781 #endif
   8782       }else{
   8783         readFileContents(ctx, pCur->zPath);
   8784       }
   8785     }
   8786     case FSDIR_COLUMN_PATH:
   8787     default: {
   8788       /* The FSDIR_COLUMN_PATH and FSDIR_COLUMN_DIR are input parameters.
   8789       ** always return their values as NULL */
   8790       break;
   8791     }
   8792   }
   8793   return SQLITE_OK;
   8794 }
   8795 
   8796 /*
   8797 ** Return the rowid for the current row. In this implementation, the
   8798 ** first row returned is assigned rowid value 1, and each subsequent
   8799 ** row a value 1 more than that of the previous.
   8800 */
   8801 static int fsdirRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
   8802   fsdir_cursor *pCur = (fsdir_cursor*)cur;
   8803   *pRowid = pCur->iRowid;
   8804   return SQLITE_OK;
   8805 }
   8806 
   8807 /*
   8808 ** Return TRUE if the cursor has been moved off of the last
   8809 ** row of output.
   8810 */
   8811 static int fsdirEof(sqlite3_vtab_cursor *cur){
   8812   fsdir_cursor *pCur = (fsdir_cursor*)cur;
   8813   return (pCur->zPath==0);
   8814 }
   8815 
   8816 /*
   8817 ** xFilter callback.
   8818 **
   8819 ** idxNum==1   PATH parameter only
   8820 ** idxNum==2   Both PATH and DIR supplied
   8821 */
   8822 static int fsdirFilter(
   8823   sqlite3_vtab_cursor *cur, 
   8824   int idxNum, const char *idxStr,
   8825   int argc, sqlite3_value **argv
   8826 ){
   8827   const char *zDir = 0;
   8828   fsdir_cursor *pCur = (fsdir_cursor*)cur;
   8829   (void)idxStr;
   8830   fsdirResetCursor(pCur);
   8831 
   8832   if( idxNum==0 ){
   8833     fsdirSetErrmsg(pCur, "table function fsdir requires an argument");
   8834     return SQLITE_ERROR;
   8835   }
   8836 
   8837   assert( argc==idxNum && (argc==1 || argc==2) );
   8838   zDir = (const char*)sqlite3_value_text(argv[0]);
   8839   if( zDir==0 ){
   8840     fsdirSetErrmsg(pCur, "table function fsdir requires a non-NULL argument");
   8841     return SQLITE_ERROR;
   8842   }
   8843   if( argc==2 ){
   8844     pCur->zBase = (const char*)sqlite3_value_text(argv[1]);
   8845   }
   8846   if( pCur->zBase ){
   8847     pCur->nBase = (int)strlen(pCur->zBase)+1;
   8848     pCur->zPath = sqlite3_mprintf("%s/%s", pCur->zBase, zDir);
   8849   }else{
   8850     pCur->zPath = sqlite3_mprintf("%s", zDir);
   8851   }
   8852 
   8853   if( pCur->zPath==0 ){
   8854     return SQLITE_NOMEM;
   8855   }
   8856   if( fileLinkStat(pCur->zPath, &pCur->sStat) ){
   8857     fsdirSetErrmsg(pCur, "cannot stat file: %s", pCur->zPath);
   8858     return SQLITE_ERROR;
   8859   }
   8860 
   8861   return SQLITE_OK;
   8862 }
   8863 
   8864 /*
   8865 ** SQLite will invoke this method one or more times while planning a query
   8866 ** that uses the generate_series virtual table.  This routine needs to create
   8867 ** a query plan for each invocation and compute an estimated cost for that
   8868 ** plan.
   8869 **
   8870 ** In this implementation idxNum is used to represent the
   8871 ** query plan.  idxStr is unused.
   8872 **
   8873 ** The query plan is represented by values of idxNum:
   8874 **
   8875 **  (1)  The path value is supplied by argv[0]
   8876 **  (2)  Path is in argv[0] and dir is in argv[1]
   8877 */
   8878 static int fsdirBestIndex(
   8879   sqlite3_vtab *tab,
   8880   sqlite3_index_info *pIdxInfo
   8881 ){
   8882   int i;                 /* Loop over constraints */
   8883   int idxPath = -1;      /* Index in pIdxInfo->aConstraint of PATH= */
   8884   int idxDir = -1;       /* Index in pIdxInfo->aConstraint of DIR= */
   8885   int seenPath = 0;      /* True if an unusable PATH= constraint is seen */
   8886   int seenDir = 0;       /* True if an unusable DIR= constraint is seen */
   8887   const struct sqlite3_index_constraint *pConstraint;
   8888 
   8889   (void)tab;
   8890   pConstraint = pIdxInfo->aConstraint;
   8891   for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
   8892     if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue;
   8893     switch( pConstraint->iColumn ){
   8894       case FSDIR_COLUMN_PATH: {
   8895         if( pConstraint->usable ){
   8896           idxPath = i;
   8897           seenPath = 0;
   8898         }else if( idxPath<0 ){
   8899           seenPath = 1;
   8900         }
   8901         break;
   8902       }
   8903       case FSDIR_COLUMN_DIR: {
   8904         if( pConstraint->usable ){
   8905           idxDir = i;
   8906           seenDir = 0;
   8907         }else if( idxDir<0 ){
   8908           seenDir = 1;
   8909         }
   8910         break;
   8911       }
   8912     } 
   8913   }
   8914   if( seenPath || seenDir ){
   8915     /* If input parameters are unusable, disallow this plan */
   8916     return SQLITE_CONSTRAINT;
   8917   }
   8918 
   8919   if( idxPath<0 ){
   8920     pIdxInfo->idxNum = 0;
   8921     /* The pIdxInfo->estimatedCost should have been initialized to a huge
   8922     ** number.  Leave it unchanged. */
   8923     pIdxInfo->estimatedRows = 0x7fffffff;
   8924   }else{
   8925     pIdxInfo->aConstraintUsage[idxPath].omit = 1;
   8926     pIdxInfo->aConstraintUsage[idxPath].argvIndex = 1;
   8927     if( idxDir>=0 ){
   8928       pIdxInfo->aConstraintUsage[idxDir].omit = 1;
   8929       pIdxInfo->aConstraintUsage[idxDir].argvIndex = 2;
   8930       pIdxInfo->idxNum = 2;
   8931       pIdxInfo->estimatedCost = 10.0;
   8932     }else{
   8933       pIdxInfo->idxNum = 1;
   8934       pIdxInfo->estimatedCost = 100.0;
   8935     }
   8936   }
   8937 
   8938   return SQLITE_OK;
   8939 }
   8940 
   8941 /*
   8942 ** Register the "fsdir" virtual table.
   8943 */
   8944 static int fsdirRegister(sqlite3 *db){
   8945   static sqlite3_module fsdirModule = {
   8946     0,                         /* iVersion */
   8947     0,                         /* xCreate */
   8948     fsdirConnect,              /* xConnect */
   8949     fsdirBestIndex,            /* xBestIndex */
   8950     fsdirDisconnect,           /* xDisconnect */
   8951     0,                         /* xDestroy */
   8952     fsdirOpen,                 /* xOpen - open a cursor */
   8953     fsdirClose,                /* xClose - close a cursor */
   8954     fsdirFilter,               /* xFilter - configure scan constraints */
   8955     fsdirNext,                 /* xNext - advance a cursor */
   8956     fsdirEof,                  /* xEof - check for end of scan */
   8957     fsdirColumn,               /* xColumn - read data */
   8958     fsdirRowid,                /* xRowid - read data */
   8959     0,                         /* xUpdate */
   8960     0,                         /* xBegin */
   8961     0,                         /* xSync */
   8962     0,                         /* xCommit */
   8963     0,                         /* xRollback */
   8964     0,                         /* xFindMethod */
   8965     0,                         /* xRename */
   8966     0,                         /* xSavepoint */
   8967     0,                         /* xRelease */
   8968     0,                         /* xRollbackTo */
   8969     0,                         /* xShadowName */
   8970     0                          /* xIntegrity */
   8971   };
   8972 
   8973   int rc = sqlite3_create_module(db, "fsdir", &fsdirModule, 0);
   8974   return rc;
   8975 }
   8976 #else         /* SQLITE_OMIT_VIRTUALTABLE */
   8977 # define fsdirRegister(x) SQLITE_OK
   8978 #endif
   8979 
   8980 #ifdef _WIN32
   8981 
   8982 #endif
   8983 int sqlite3_fileio_init(
   8984   sqlite3 *db, 
   8985   char **pzErrMsg, 
   8986   const sqlite3_api_routines *pApi
   8987 ){
   8988   int rc = SQLITE_OK;
   8989   SQLITE_EXTENSION_INIT2(pApi);
   8990   (void)pzErrMsg;  /* Unused parameter */
   8991   rc = sqlite3_create_function(db, "readfile", 1, 
   8992                                SQLITE_UTF8|SQLITE_DIRECTONLY, 0,
   8993                                readfileFunc, 0, 0);
   8994   if( rc==SQLITE_OK ){
   8995     rc = sqlite3_create_function(db, "writefile", -1,
   8996                                  SQLITE_UTF8|SQLITE_DIRECTONLY, 0,
   8997                                  writefileFunc, 0, 0);
   8998   }
   8999   if( rc==SQLITE_OK ){
   9000     rc = sqlite3_create_function(db, "lsmode", 1, SQLITE_UTF8, 0,
   9001                                  lsModeFunc, 0, 0);
   9002   }
   9003   if( rc==SQLITE_OK ){
   9004     rc = fsdirRegister(db);
   9005   }
   9006   return rc;
   9007 }
   9008 
   9009 #if defined(FILEIO_WIN32_DLL) && (defined(_WIN32) || defined(WIN32))
   9010 /* To allow a standalone DLL, make test_windirent.c use the same
   9011  * redefined SQLite API calls as the above extension code does.
   9012  * Just pull in this .c to accomplish this. As a beneficial side
   9013  * effect, this extension becomes a single translation unit. */
   9014 #  include "test_windirent.c"
   9015 #endif
   9016 
   9017 /************************* End ../ext/misc/fileio.c ********************/
   9018 /************************* Begin ../ext/misc/completion.c ******************/
   9019 /*
   9020 ** 2017-07-10
   9021 **
   9022 ** The author disclaims copyright to this source code.  In place of
   9023 ** a legal notice, here is a blessing:
   9024 **
   9025 **    May you do good and not evil.
   9026 **    May you find forgiveness for yourself and forgive others.
   9027 **    May you share freely, never taking more than you give.
   9028 **
   9029 *************************************************************************
   9030 **
   9031 ** This file implements an eponymous virtual table that returns suggested
   9032 ** completions for a partial SQL input.
   9033 **
   9034 ** Suggested usage:
   9035 **
   9036 **     SELECT DISTINCT candidate COLLATE nocase
   9037 **       FROM completion($prefix,$wholeline)
   9038 **      ORDER BY 1;
   9039 **
   9040 ** The two query parameters are optional.  $prefix is the text of the
   9041 ** current word being typed and that is to be completed.  $wholeline is
   9042 ** the complete input line, used for context.
   9043 **
   9044 ** The raw completion() table might return the same candidate multiple
   9045 ** times, for example if the same column name is used to two or more
   9046 ** tables.  And the candidates are returned in an arbitrary order.  Hence,
   9047 ** the DISTINCT and ORDER BY are recommended.
   9048 **
   9049 ** This virtual table operates at the speed of human typing, and so there
   9050 ** is no attempt to make it fast.  Even a slow implementation will be much
   9051 ** faster than any human can type.
   9052 **
   9053 */
   9054 /* #include "sqlite3ext.h" */
   9055 SQLITE_EXTENSION_INIT1
   9056 #include <assert.h>
   9057 #include <string.h>
   9058 #include <ctype.h>
   9059 
   9060 #ifndef SQLITE_OMIT_VIRTUALTABLE
   9061 
   9062 #ifndef IsAlnum
   9063 #define IsAlnum(X)  isalnum((unsigned char)X)
   9064 #endif
   9065 
   9066 
   9067 /* completion_vtab is a subclass of sqlite3_vtab which will
   9068 ** serve as the underlying representation of a completion virtual table
   9069 */
   9070 typedef struct completion_vtab completion_vtab;
   9071 struct completion_vtab {
   9072   sqlite3_vtab base;  /* Base class - must be first */
   9073   sqlite3 *db;        /* Database connection for this completion vtab */
   9074 };
   9075 
   9076 /* completion_cursor is a subclass of sqlite3_vtab_cursor which will
   9077 ** serve as the underlying representation of a cursor that scans
   9078 ** over rows of the result
   9079 */
   9080 typedef struct completion_cursor completion_cursor;
   9081 struct completion_cursor {
   9082   sqlite3_vtab_cursor base;  /* Base class - must be first */
   9083   sqlite3 *db;               /* Database connection for this cursor */
   9084   int nPrefix, nLine;        /* Number of bytes in zPrefix and zLine */
   9085   char *zPrefix;             /* The prefix for the word we want to complete */
   9086   char *zLine;               /* The whole that we want to complete */
   9087   const char *zCurrentRow;   /* Current output row */
   9088   int szRow;                 /* Length of the zCurrentRow string */
   9089   sqlite3_stmt *pStmt;       /* Current statement */
   9090   sqlite3_int64 iRowid;      /* The rowid */
   9091   int ePhase;                /* Current phase */
   9092   int j;                     /* inter-phase counter */
   9093 };
   9094 
   9095 /* Values for ePhase:
   9096 */
   9097 #define COMPLETION_FIRST_PHASE   1
   9098 #define COMPLETION_KEYWORDS      1
   9099 #define COMPLETION_PRAGMAS       2
   9100 #define COMPLETION_FUNCTIONS     3
   9101 #define COMPLETION_COLLATIONS    4
   9102 #define COMPLETION_INDEXES       5
   9103 #define COMPLETION_TRIGGERS      6
   9104 #define COMPLETION_DATABASES     7
   9105 #define COMPLETION_TABLES        8    /* Also VIEWs and TRIGGERs */
   9106 #define COMPLETION_COLUMNS       9
   9107 #define COMPLETION_MODULES       10
   9108 #define COMPLETION_EOF           11
   9109 
   9110 /*
   9111 ** The completionConnect() method is invoked to create a new
   9112 ** completion_vtab that describes the completion virtual table.
   9113 **
   9114 ** Think of this routine as the constructor for completion_vtab objects.
   9115 **
   9116 ** All this routine needs to do is:
   9117 **
   9118 **    (1) Allocate the completion_vtab object and initialize all fields.
   9119 **
   9120 **    (2) Tell SQLite (via the sqlite3_declare_vtab() interface) what the
   9121 **        result set of queries against completion will look like.
   9122 */
   9123 static int completionConnect(
   9124   sqlite3 *db,
   9125   void *pAux,
   9126   int argc, const char *const*argv,
   9127   sqlite3_vtab **ppVtab,
   9128   char **pzErr
   9129 ){
   9130   completion_vtab *pNew;
   9131   int rc;
   9132 
   9133   (void)(pAux);    /* Unused parameter */
   9134   (void)(argc);    /* Unused parameter */
   9135   (void)(argv);    /* Unused parameter */
   9136   (void)(pzErr);   /* Unused parameter */
   9137 
   9138 /* Column numbers */
   9139 #define COMPLETION_COLUMN_CANDIDATE 0  /* Suggested completion of the input */
   9140 #define COMPLETION_COLUMN_PREFIX    1  /* Prefix of the word to be completed */
   9141 #define COMPLETION_COLUMN_WHOLELINE 2  /* Entire line seen so far */
   9142 #define COMPLETION_COLUMN_PHASE     3  /* ePhase - used for debugging only */
   9143 
   9144   sqlite3_vtab_config(db, SQLITE_VTAB_INNOCUOUS);
   9145   rc = sqlite3_declare_vtab(db,
   9146       "CREATE TABLE x("
   9147       "  candidate TEXT,"
   9148       "  prefix TEXT HIDDEN,"
   9149       "  wholeline TEXT HIDDEN,"
   9150       "  phase INT HIDDEN"        /* Used for debugging only */
   9151       ")");
   9152   if( rc==SQLITE_OK ){
   9153     pNew = sqlite3_malloc( sizeof(*pNew) );
   9154     *ppVtab = (sqlite3_vtab*)pNew;
   9155     if( pNew==0 ) return SQLITE_NOMEM;
   9156     memset(pNew, 0, sizeof(*pNew));
   9157     pNew->db = db;
   9158   }
   9159   return rc;
   9160 }
   9161 
   9162 /*
   9163 ** This method is the destructor for completion_cursor objects.
   9164 */
   9165 static int completionDisconnect(sqlite3_vtab *pVtab){
   9166   sqlite3_free(pVtab);
   9167   return SQLITE_OK;
   9168 }
   9169 
   9170 /*
   9171 ** Constructor for a new completion_cursor object.
   9172 */
   9173 static int completionOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
   9174   completion_cursor *pCur;
   9175   pCur = sqlite3_malloc( sizeof(*pCur) );
   9176   if( pCur==0 ) return SQLITE_NOMEM;
   9177   memset(pCur, 0, sizeof(*pCur));
   9178   pCur->db = ((completion_vtab*)p)->db;
   9179   *ppCursor = &pCur->base;
   9180   return SQLITE_OK;
   9181 }
   9182 
   9183 /*
   9184 ** Reset the completion_cursor.
   9185 */
   9186 static void completionCursorReset(completion_cursor *pCur){
   9187   sqlite3_free(pCur->zPrefix);   pCur->zPrefix = 0;  pCur->nPrefix = 0;
   9188   sqlite3_free(pCur->zLine);     pCur->zLine = 0;    pCur->nLine = 0;
   9189   sqlite3_finalize(pCur->pStmt); pCur->pStmt = 0;
   9190   pCur->j = 0;
   9191 }
   9192 
   9193 /*
   9194 ** Destructor for a completion_cursor.
   9195 */
   9196 static int completionClose(sqlite3_vtab_cursor *cur){
   9197   completionCursorReset((completion_cursor*)cur);
   9198   sqlite3_free(cur);
   9199   return SQLITE_OK;
   9200 }
   9201 
   9202 /*
   9203 ** Advance a completion_cursor to its next row of output.
   9204 **
   9205 ** The ->ePhase, ->j, and ->pStmt fields of the completion_cursor object
   9206 ** record the current state of the scan.  This routine sets ->zCurrentRow
   9207 ** to the current row of output and then returns.  If no more rows remain,
   9208 ** then ->ePhase is set to COMPLETION_EOF which will signal the virtual
   9209 ** table that has reached the end of its scan.
   9210 **
   9211 ** The current implementation just lists potential identifiers and
   9212 ** keywords and filters them by zPrefix.  Future enhancements should
   9213 ** take zLine into account to try to restrict the set of identifiers and
   9214 ** keywords based on what would be legal at the current point of input.
   9215 */
   9216 static int completionNext(sqlite3_vtab_cursor *cur){
   9217   completion_cursor *pCur = (completion_cursor*)cur;
   9218   int eNextPhase = 0;  /* Next phase to try if current phase reaches end */
   9219   int iCol = -1;       /* If >=0, step pCur->pStmt and use the i-th column */
   9220   pCur->iRowid++;
   9221   while( pCur->ePhase!=COMPLETION_EOF ){
   9222     switch( pCur->ePhase ){
   9223       case COMPLETION_KEYWORDS: {
   9224         if( pCur->j >= sqlite3_keyword_count() ){
   9225           pCur->zCurrentRow = 0;
   9226           pCur->ePhase = COMPLETION_DATABASES;
   9227         }else{
   9228           sqlite3_keyword_name(pCur->j++, &pCur->zCurrentRow, &pCur->szRow);
   9229         }
   9230         iCol = -1;
   9231         break;
   9232       }
   9233       case COMPLETION_DATABASES: {
   9234         if( pCur->pStmt==0 ){
   9235           sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1,
   9236                              &pCur->pStmt, 0);
   9237         }
   9238         iCol = 1;
   9239         eNextPhase = COMPLETION_TABLES;
   9240         break;
   9241       }
   9242       case COMPLETION_TABLES: {
   9243         if( pCur->pStmt==0 ){
   9244           sqlite3_stmt *pS2;
   9245           char *zSql = 0;
   9246           const char *zSep = "";
   9247           sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1, &pS2, 0);
   9248           while( sqlite3_step(pS2)==SQLITE_ROW ){
   9249             const char *zDb = (const char*)sqlite3_column_text(pS2, 1);
   9250             zSql = sqlite3_mprintf(
   9251                "%z%s"
   9252                "SELECT name FROM \"%w\".sqlite_schema",
   9253                zSql, zSep, zDb
   9254             );
   9255             if( zSql==0 ) return SQLITE_NOMEM;
   9256             zSep = " UNION ";
   9257           }
   9258           sqlite3_finalize(pS2);
   9259           sqlite3_prepare_v2(pCur->db, zSql, -1, &pCur->pStmt, 0);
   9260           sqlite3_free(zSql);
   9261         }
   9262         iCol = 0;
   9263         eNextPhase = COMPLETION_COLUMNS;
   9264         break;
   9265       }
   9266       case COMPLETION_COLUMNS: {
   9267         if( pCur->pStmt==0 ){
   9268           sqlite3_stmt *pS2;
   9269           char *zSql = 0;
   9270           const char *zSep = "";
   9271           sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1, &pS2, 0);
   9272           while( sqlite3_step(pS2)==SQLITE_ROW ){
   9273             const char *zDb = (const char*)sqlite3_column_text(pS2, 1);
   9274             zSql = sqlite3_mprintf(
   9275                "%z%s"
   9276                "SELECT pti.name FROM \"%w\".sqlite_schema AS sm"
   9277                        " JOIN pragma_table_xinfo(sm.name,%Q) AS pti"
   9278                " WHERE sm.type='table'",
   9279                zSql, zSep, zDb, zDb
   9280             );
   9281             if( zSql==0 ) return SQLITE_NOMEM;
   9282             zSep = " UNION ";
   9283           }
   9284           sqlite3_finalize(pS2);
   9285           sqlite3_prepare_v2(pCur->db, zSql, -1, &pCur->pStmt, 0);
   9286           sqlite3_free(zSql);
   9287         }
   9288         iCol = 0;
   9289         eNextPhase = COMPLETION_EOF;
   9290         break;
   9291       }
   9292     }
   9293     if( iCol<0 ){
   9294       /* This case is when the phase presets zCurrentRow */
   9295       if( pCur->zCurrentRow==0 ) continue;
   9296     }else{
   9297       if( sqlite3_step(pCur->pStmt)==SQLITE_ROW ){
   9298         /* Extract the next row of content */
   9299         pCur->zCurrentRow = (const char*)sqlite3_column_text(pCur->pStmt, iCol);
   9300         pCur->szRow = sqlite3_column_bytes(pCur->pStmt, iCol);
   9301       }else{
   9302         /* When all rows are finished, advance to the next phase */
   9303         sqlite3_finalize(pCur->pStmt);
   9304         pCur->pStmt = 0;
   9305         pCur->ePhase = eNextPhase;
   9306         continue;
   9307       }
   9308     }
   9309     if( pCur->nPrefix==0 ) break;
   9310     if( pCur->nPrefix<=pCur->szRow
   9311      && sqlite3_strnicmp(pCur->zPrefix, pCur->zCurrentRow, pCur->nPrefix)==0
   9312     ){
   9313       break;
   9314     }
   9315   }
   9316 
   9317   return SQLITE_OK;
   9318 }
   9319 
   9320 /*
   9321 ** Return values of columns for the row at which the completion_cursor
   9322 ** is currently pointing.
   9323 */
   9324 static int completionColumn(
   9325   sqlite3_vtab_cursor *cur,   /* The cursor */
   9326   sqlite3_context *ctx,       /* First argument to sqlite3_result_...() */
   9327   int i                       /* Which column to return */
   9328 ){
   9329   completion_cursor *pCur = (completion_cursor*)cur;
   9330   switch( i ){
   9331     case COMPLETION_COLUMN_CANDIDATE: {
   9332       sqlite3_result_text(ctx, pCur->zCurrentRow, pCur->szRow,SQLITE_TRANSIENT);
   9333       break;
   9334     }
   9335     case COMPLETION_COLUMN_PREFIX: {
   9336       sqlite3_result_text(ctx, pCur->zPrefix, -1, SQLITE_TRANSIENT);
   9337       break;
   9338     }
   9339     case COMPLETION_COLUMN_WHOLELINE: {
   9340       sqlite3_result_text(ctx, pCur->zLine, -1, SQLITE_TRANSIENT);
   9341       break;
   9342     }
   9343     case COMPLETION_COLUMN_PHASE: {
   9344       sqlite3_result_int(ctx, pCur->ePhase);
   9345       break;
   9346     }
   9347   }
   9348   return SQLITE_OK;
   9349 }
   9350 
   9351 /*
   9352 ** Return the rowid for the current row.  In this implementation, the
   9353 ** rowid is the same as the output value.
   9354 */
   9355 static int completionRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
   9356   completion_cursor *pCur = (completion_cursor*)cur;
   9357   *pRowid = pCur->iRowid;
   9358   return SQLITE_OK;
   9359 }
   9360 
   9361 /*
   9362 ** Return TRUE if the cursor has been moved off of the last
   9363 ** row of output.
   9364 */
   9365 static int completionEof(sqlite3_vtab_cursor *cur){
   9366   completion_cursor *pCur = (completion_cursor*)cur;
   9367   return pCur->ePhase >= COMPLETION_EOF;
   9368 }
   9369 
   9370 /*
   9371 ** This method is called to "rewind" the completion_cursor object back
   9372 ** to the first row of output.  This method is always called at least
   9373 ** once prior to any call to completionColumn() or completionRowid() or 
   9374 ** completionEof().
   9375 */
   9376 static int completionFilter(
   9377   sqlite3_vtab_cursor *pVtabCursor, 
   9378   int idxNum, const char *idxStr,
   9379   int argc, sqlite3_value **argv
   9380 ){
   9381   completion_cursor *pCur = (completion_cursor *)pVtabCursor;
   9382   int iArg = 0;
   9383   (void)(idxStr);   /* Unused parameter */
   9384   (void)(argc);     /* Unused parameter */
   9385   completionCursorReset(pCur);
   9386   if( idxNum & 1 ){
   9387     pCur->nPrefix = sqlite3_value_bytes(argv[iArg]);
   9388     if( pCur->nPrefix>0 ){
   9389       pCur->zPrefix = sqlite3_mprintf("%s", sqlite3_value_text(argv[iArg]));
   9390       if( pCur->zPrefix==0 ) return SQLITE_NOMEM;
   9391     }
   9392     iArg = 1;
   9393   }
   9394   if( idxNum & 2 ){
   9395     pCur->nLine = sqlite3_value_bytes(argv[iArg]);
   9396     if( pCur->nLine>0 ){
   9397       pCur->zLine = sqlite3_mprintf("%s", sqlite3_value_text(argv[iArg]));
   9398       if( pCur->zLine==0 ) return SQLITE_NOMEM;
   9399     }
   9400   }
   9401   if( pCur->zLine!=0 && pCur->zPrefix==0 ){
   9402     int i = pCur->nLine;
   9403     while( i>0 && (IsAlnum(pCur->zLine[i-1]) || pCur->zLine[i-1]=='_') ){
   9404       i--;
   9405     }
   9406     pCur->nPrefix = pCur->nLine - i;
   9407     if( pCur->nPrefix>0 ){
   9408       pCur->zPrefix = sqlite3_mprintf("%.*s", pCur->nPrefix, pCur->zLine + i);
   9409       if( pCur->zPrefix==0 ) return SQLITE_NOMEM;
   9410     }
   9411   }
   9412   pCur->iRowid = 0;
   9413   pCur->ePhase = COMPLETION_FIRST_PHASE;
   9414   return completionNext(pVtabCursor);
   9415 }
   9416 
   9417 /*
   9418 ** SQLite will invoke this method one or more times while planning a query
   9419 ** that uses the completion virtual table.  This routine needs to create
   9420 ** a query plan for each invocation and compute an estimated cost for that
   9421 ** plan.
   9422 **
   9423 ** There are two hidden parameters that act as arguments to the table-valued
   9424 ** function:  "prefix" and "wholeline".  Bit 0 of idxNum is set if "prefix"
   9425 ** is available and bit 1 is set if "wholeline" is available.
   9426 */
   9427 static int completionBestIndex(
   9428   sqlite3_vtab *tab,
   9429   sqlite3_index_info *pIdxInfo
   9430 ){
   9431   int i;                 /* Loop over constraints */
   9432   int idxNum = 0;        /* The query plan bitmask */
   9433   int prefixIdx = -1;    /* Index of the start= constraint, or -1 if none */
   9434   int wholelineIdx = -1; /* Index of the stop= constraint, or -1 if none */
   9435   int nArg = 0;          /* Number of arguments that completeFilter() expects */
   9436   const struct sqlite3_index_constraint *pConstraint;
   9437 
   9438   (void)(tab);    /* Unused parameter */
   9439   pConstraint = pIdxInfo->aConstraint;
   9440   for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
   9441     if( pConstraint->usable==0 ) continue;
   9442     if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue;
   9443     switch( pConstraint->iColumn ){
   9444       case COMPLETION_COLUMN_PREFIX:
   9445         prefixIdx = i;
   9446         idxNum |= 1;
   9447         break;
   9448       case COMPLETION_COLUMN_WHOLELINE:
   9449         wholelineIdx = i;
   9450         idxNum |= 2;
   9451         break;
   9452     }
   9453   }
   9454   if( prefixIdx>=0 ){
   9455     pIdxInfo->aConstraintUsage[prefixIdx].argvIndex = ++nArg;
   9456     pIdxInfo->aConstraintUsage[prefixIdx].omit = 1;
   9457   }
   9458   if( wholelineIdx>=0 ){
   9459     pIdxInfo->aConstraintUsage[wholelineIdx].argvIndex = ++nArg;
   9460     pIdxInfo->aConstraintUsage[wholelineIdx].omit = 1;
   9461   }
   9462   pIdxInfo->idxNum = idxNum;
   9463   pIdxInfo->estimatedCost = (double)5000 - 1000*nArg;
   9464   pIdxInfo->estimatedRows = 500 - 100*nArg;
   9465   return SQLITE_OK;
   9466 }
   9467 
   9468 /*
   9469 ** This following structure defines all the methods for the 
   9470 ** completion virtual table.
   9471 */
   9472 static sqlite3_module completionModule = {
   9473   0,                         /* iVersion */
   9474   0,                         /* xCreate */
   9475   completionConnect,         /* xConnect */
   9476   completionBestIndex,       /* xBestIndex */
   9477   completionDisconnect,      /* xDisconnect */
   9478   0,                         /* xDestroy */
   9479   completionOpen,            /* xOpen - open a cursor */
   9480   completionClose,           /* xClose - close a cursor */
   9481   completionFilter,          /* xFilter - configure scan constraints */
   9482   completionNext,            /* xNext - advance a cursor */
   9483   completionEof,             /* xEof - check for end of scan */
   9484   completionColumn,          /* xColumn - read data */
   9485   completionRowid,           /* xRowid - read data */
   9486   0,                         /* xUpdate */
   9487   0,                         /* xBegin */
   9488   0,                         /* xSync */
   9489   0,                         /* xCommit */
   9490   0,                         /* xRollback */
   9491   0,                         /* xFindMethod */
   9492   0,                         /* xRename */
   9493   0,                         /* xSavepoint */
   9494   0,                         /* xRelease */
   9495   0,                         /* xRollbackTo */
   9496   0,                         /* xShadowName */
   9497   0                          /* xIntegrity */
   9498 };
   9499 
   9500 #endif /* SQLITE_OMIT_VIRTUALTABLE */
   9501 
   9502 int sqlite3CompletionVtabInit(sqlite3 *db){
   9503   int rc = SQLITE_OK;
   9504 #ifndef SQLITE_OMIT_VIRTUALTABLE
   9505   rc = sqlite3_create_module(db, "completion", &completionModule, 0);
   9506 #endif
   9507   return rc;
   9508 }
   9509 
   9510 #ifdef _WIN32
   9511 
   9512 #endif
   9513 int sqlite3_completion_init(
   9514   sqlite3 *db, 
   9515   char **pzErrMsg, 
   9516   const sqlite3_api_routines *pApi
   9517 ){
   9518   int rc = SQLITE_OK;
   9519   SQLITE_EXTENSION_INIT2(pApi);
   9520   (void)(pzErrMsg);  /* Unused parameter */
   9521 #ifndef SQLITE_OMIT_VIRTUALTABLE
   9522   rc = sqlite3CompletionVtabInit(db);
   9523 #endif
   9524   return rc;
   9525 }
   9526 
   9527 /************************* End ../ext/misc/completion.c ********************/
   9528 /************************* Begin ../ext/misc/appendvfs.c ******************/
   9529 /*
   9530 ** 2017-10-20
   9531 **
   9532 ** The author disclaims copyright to this source code.  In place of
   9533 ** a legal notice, here is a blessing:
   9534 **
   9535 **    May you do good and not evil.
   9536 **    May you find forgiveness for yourself and forgive others.
   9537 **    May you share freely, never taking more than you give.
   9538 **
   9539 ******************************************************************************
   9540 **
   9541 ** This file implements a VFS shim that allows an SQLite database to be
   9542 ** appended onto the end of some other file, such as an executable.
   9543 **
   9544 ** A special record must appear at the end of the file that identifies the
   9545 ** file as an appended database and provides the offset to the first page
   9546 ** of the exposed content. (Or, it is the length of the content prefix.)
   9547 ** For best performance page 1 should be located at a disk page boundary,
   9548 ** though that is not required.
   9549 **
   9550 ** When opening a database using this VFS, the connection might treat
   9551 ** the file as an ordinary SQLite database, or it might treat it as a
   9552 ** database appended onto some other file.  The decision is made by
   9553 ** applying the following rules in order:
   9554 **
   9555 **  (1)  An empty file is an ordinary database.
   9556 **
   9557 **  (2)  If the file ends with the appendvfs trailer string
   9558 **       "Start-Of-SQLite3-NNNNNNNN" that file is an appended database.
   9559 **
   9560 **  (3)  If the file begins with the standard SQLite prefix string
   9561 **       "SQLite format 3", that file is an ordinary database.
   9562 **
   9563 **  (4)  If none of the above apply and the SQLITE_OPEN_CREATE flag is
   9564 **       set, then a new database is appended to the already existing file.
   9565 **
   9566 **  (5)  Otherwise, SQLITE_CANTOPEN is returned.
   9567 **
   9568 ** To avoid unnecessary complications with the PENDING_BYTE, the size of
   9569 ** the file containing the database is limited to 1GiB. (1073741824 bytes)
   9570 ** This VFS will not read or write past the 1GiB mark.  This restriction
   9571 ** might be lifted in future versions.  For now, if you need a larger
   9572 ** database, then keep it in a separate file.
   9573 **
   9574 ** If the file being opened is a plain database (not an appended one), then
   9575 ** this shim is a pass-through into the default underlying VFS. (rule 3)
   9576 **/
   9577 /* #include "sqlite3ext.h" */
   9578 SQLITE_EXTENSION_INIT1
   9579 #include <string.h>
   9580 #include <assert.h>
   9581 
   9582 /* The append mark at the end of the database is:
   9583 **
   9584 **     Start-Of-SQLite3-NNNNNNNN
   9585 **     123456789 123456789 12345
   9586 **
   9587 ** The NNNNNNNN represents a 64-bit big-endian unsigned integer which is
   9588 ** the offset to page 1, and also the length of the prefix content.
   9589 */
   9590 #define APND_MARK_PREFIX     "Start-Of-SQLite3-"
   9591 #define APND_MARK_PREFIX_SZ  17
   9592 #define APND_MARK_FOS_SZ      8
   9593 #define APND_MARK_SIZE       (APND_MARK_PREFIX_SZ+APND_MARK_FOS_SZ)
   9594 
   9595 /*
   9596 ** Maximum size of the combined prefix + database + append-mark.  This
   9597 ** must be less than 0x40000000 to avoid locking issues on Windows.
   9598 */
   9599 #define APND_MAX_SIZE  (0x40000000)
   9600 
   9601 /*
   9602 ** Try to align the database to an even multiple of APND_ROUNDUP bytes.
   9603 */
   9604 #ifndef APND_ROUNDUP
   9605 #define APND_ROUNDUP 4096
   9606 #endif
   9607 #define APND_ALIGN_MASK         ((sqlite3_int64)(APND_ROUNDUP-1))
   9608 #define APND_START_ROUNDUP(fsz) (((fsz)+APND_ALIGN_MASK) & ~APND_ALIGN_MASK)
   9609 
   9610 /*
   9611 ** Forward declaration of objects used by this utility
   9612 */
   9613 typedef struct sqlite3_vfs ApndVfs;
   9614 typedef struct ApndFile ApndFile;
   9615 
   9616 /* Access to a lower-level VFS that (might) implement dynamic loading,
   9617 ** access to randomness, etc.
   9618 */
   9619 #define ORIGVFS(p)  ((sqlite3_vfs*)((p)->pAppData))
   9620 #define ORIGFILE(p) ((sqlite3_file*)(((ApndFile*)(p))+1))
   9621 
   9622 /* An open appendvfs file
   9623 **
   9624 ** An instance of this structure describes the appended database file.
   9625 ** A separate sqlite3_file object is always appended. The appended
   9626 ** sqlite3_file object (which can be accessed using ORIGFILE()) describes
   9627 ** the entire file, including the prefix, the database, and the
   9628 ** append-mark.
   9629 **
   9630 ** The structure of an AppendVFS database is like this:
   9631 **
   9632 **   +-------------+---------+----------+-------------+
   9633 **   | prefix-file | padding | database | append-mark |
   9634 **   +-------------+---------+----------+-------------+
   9635 **                           ^          ^
   9636 **                           |          |
   9637 **                         iPgOne      iMark
   9638 **
   9639 **
   9640 ** "prefix file" -  file onto which the database has been appended.
   9641 ** "padding"     -  zero or more bytes inserted so that "database"
   9642 **                  starts on an APND_ROUNDUP boundary
   9643 ** "database"    -  The SQLite database file
   9644 ** "append-mark" -  The 25-byte "Start-Of-SQLite3-NNNNNNNN" that indicates
   9645 **                  the offset from the start of prefix-file to the start
   9646 **                  of "database".
   9647 **
   9648 ** The size of the database is iMark - iPgOne.
   9649 **
   9650 ** The NNNNNNNN in the "Start-Of-SQLite3-NNNNNNNN" suffix is the value
   9651 ** of iPgOne stored as a big-ending 64-bit integer.
   9652 **
   9653 ** iMark will be the size of the underlying file minus 25 (APND_MARKSIZE).
   9654 ** Or, iMark is -1 to indicate that it has not yet been written.
   9655 */
   9656 struct ApndFile {
   9657   sqlite3_file base;        /* Subclass.  MUST BE FIRST! */
   9658   sqlite3_int64 iPgOne;     /* Offset to the start of the database */
   9659   sqlite3_int64 iMark;      /* Offset of the append mark.  -1 if unwritten */
   9660   /* Always followed by another sqlite3_file that describes the whole file */
   9661 };
   9662 
   9663 /*
   9664 ** Methods for ApndFile
   9665 */
   9666 static int apndClose(sqlite3_file*);
   9667 static int apndRead(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst);
   9668 static int apndWrite(sqlite3_file*,const void*,int iAmt, sqlite3_int64 iOfst);
   9669 static int apndTruncate(sqlite3_file*, sqlite3_int64 size);
   9670 static int apndSync(sqlite3_file*, int flags);
   9671 static int apndFileSize(sqlite3_file*, sqlite3_int64 *pSize);
   9672 static int apndLock(sqlite3_file*, int);
   9673 static int apndUnlock(sqlite3_file*, int);
   9674 static int apndCheckReservedLock(sqlite3_file*, int *pResOut);
   9675 static int apndFileControl(sqlite3_file*, int op, void *pArg);
   9676 static int apndSectorSize(sqlite3_file*);
   9677 static int apndDeviceCharacteristics(sqlite3_file*);
   9678 static int apndShmMap(sqlite3_file*, int iPg, int pgsz, int, void volatile**);
   9679 static int apndShmLock(sqlite3_file*, int offset, int n, int flags);
   9680 static void apndShmBarrier(sqlite3_file*);
   9681 static int apndShmUnmap(sqlite3_file*, int deleteFlag);
   9682 static int apndFetch(sqlite3_file*, sqlite3_int64 iOfst, int iAmt, void **pp);
   9683 static int apndUnfetch(sqlite3_file*, sqlite3_int64 iOfst, void *p);
   9684 
   9685 /*
   9686 ** Methods for ApndVfs
   9687 */
   9688 static int apndOpen(sqlite3_vfs*, const char *, sqlite3_file*, int , int *);
   9689 static int apndDelete(sqlite3_vfs*, const char *zName, int syncDir);
   9690 static int apndAccess(sqlite3_vfs*, const char *zName, int flags, int *);
   9691 static int apndFullPathname(sqlite3_vfs*, const char *zName, int, char *zOut);
   9692 static void *apndDlOpen(sqlite3_vfs*, const char *zFilename);
   9693 static void apndDlError(sqlite3_vfs*, int nByte, char *zErrMsg);
   9694 static void (*apndDlSym(sqlite3_vfs *pVfs, void *p, const char*zSym))(void);
   9695 static void apndDlClose(sqlite3_vfs*, void*);
   9696 static int apndRandomness(sqlite3_vfs*, int nByte, char *zOut);
   9697 static int apndSleep(sqlite3_vfs*, int microseconds);
   9698 static int apndCurrentTime(sqlite3_vfs*, double*);
   9699 static int apndGetLastError(sqlite3_vfs*, int, char *);
   9700 static int apndCurrentTimeInt64(sqlite3_vfs*, sqlite3_int64*);
   9701 static int apndSetSystemCall(sqlite3_vfs*, const char*,sqlite3_syscall_ptr);
   9702 static sqlite3_syscall_ptr apndGetSystemCall(sqlite3_vfs*, const char *z);
   9703 static const char *apndNextSystemCall(sqlite3_vfs*, const char *zName);
   9704 
   9705 static sqlite3_vfs apnd_vfs = {
   9706   3,                            /* iVersion (set when registered) */
   9707   0,                            /* szOsFile (set when registered) */
   9708   1024,                         /* mxPathname */
   9709   0,                            /* pNext */
   9710   "apndvfs",                    /* zName */
   9711   0,                            /* pAppData (set when registered) */ 
   9712   apndOpen,                     /* xOpen */
   9713   apndDelete,                   /* xDelete */
   9714   apndAccess,                   /* xAccess */
   9715   apndFullPathname,             /* xFullPathname */
   9716   apndDlOpen,                   /* xDlOpen */
   9717   apndDlError,                  /* xDlError */
   9718   apndDlSym,                    /* xDlSym */
   9719   apndDlClose,                  /* xDlClose */
   9720   apndRandomness,               /* xRandomness */
   9721   apndSleep,                    /* xSleep */
   9722   apndCurrentTime,              /* xCurrentTime */
   9723   apndGetLastError,             /* xGetLastError */
   9724   apndCurrentTimeInt64,         /* xCurrentTimeInt64 */
   9725   apndSetSystemCall,            /* xSetSystemCall */
   9726   apndGetSystemCall,            /* xGetSystemCall */
   9727   apndNextSystemCall            /* xNextSystemCall */
   9728 };
   9729 
   9730 static const sqlite3_io_methods apnd_io_methods = {
   9731   3,                              /* iVersion */
   9732   apndClose,                      /* xClose */
   9733   apndRead,                       /* xRead */
   9734   apndWrite,                      /* xWrite */
   9735   apndTruncate,                   /* xTruncate */
   9736   apndSync,                       /* xSync */
   9737   apndFileSize,                   /* xFileSize */
   9738   apndLock,                       /* xLock */
   9739   apndUnlock,                     /* xUnlock */
   9740   apndCheckReservedLock,          /* xCheckReservedLock */
   9741   apndFileControl,                /* xFileControl */
   9742   apndSectorSize,                 /* xSectorSize */
   9743   apndDeviceCharacteristics,      /* xDeviceCharacteristics */
   9744   apndShmMap,                     /* xShmMap */
   9745   apndShmLock,                    /* xShmLock */
   9746   apndShmBarrier,                 /* xShmBarrier */
   9747   apndShmUnmap,                   /* xShmUnmap */
   9748   apndFetch,                      /* xFetch */
   9749   apndUnfetch                     /* xUnfetch */
   9750 };
   9751 
   9752 /*
   9753 ** Close an apnd-file.
   9754 */
   9755 static int apndClose(sqlite3_file *pFile){
   9756   pFile = ORIGFILE(pFile);
   9757   return pFile->pMethods->xClose(pFile);
   9758 }
   9759 
   9760 /*
   9761 ** Read data from an apnd-file.
   9762 */
   9763 static int apndRead(
   9764   sqlite3_file *pFile, 
   9765   void *zBuf, 
   9766   int iAmt, 
   9767   sqlite_int64 iOfst
   9768 ){
   9769   ApndFile *paf = (ApndFile *)pFile;
   9770   pFile = ORIGFILE(pFile);
   9771   return pFile->pMethods->xRead(pFile, zBuf, iAmt, paf->iPgOne+iOfst);
   9772 }
   9773 
   9774 /*
   9775 ** Add the append-mark onto what should become the end of the file.
   9776 *  If and only if this succeeds, internal ApndFile.iMark is updated.
   9777 *  Parameter iWriteEnd is the appendvfs-relative offset of the new mark.
   9778 */
   9779 static int apndWriteMark(
   9780   ApndFile *paf,
   9781   sqlite3_file *pFile,
   9782   sqlite_int64 iWriteEnd
   9783 ){
   9784   sqlite_int64 iPgOne = paf->iPgOne;
   9785   unsigned char a[APND_MARK_SIZE];
   9786   int i = APND_MARK_FOS_SZ;
   9787   int rc;
   9788   assert(pFile == ORIGFILE(paf));
   9789   memcpy(a, APND_MARK_PREFIX, APND_MARK_PREFIX_SZ);
   9790   while( --i >= 0 ){
   9791     a[APND_MARK_PREFIX_SZ+i] = (unsigned char)(iPgOne & 0xff);
   9792     iPgOne >>= 8;
   9793   }
   9794   iWriteEnd += paf->iPgOne;
   9795   if( SQLITE_OK==(rc = pFile->pMethods->xWrite
   9796                   (pFile, a, APND_MARK_SIZE, iWriteEnd)) ){
   9797     paf->iMark = iWriteEnd;
   9798   }
   9799   return rc;
   9800 }
   9801 
   9802 /*
   9803 ** Write data to an apnd-file.
   9804 */
   9805 static int apndWrite(
   9806   sqlite3_file *pFile,
   9807   const void *zBuf,
   9808   int iAmt,
   9809   sqlite_int64 iOfst
   9810 ){
   9811   ApndFile *paf = (ApndFile *)pFile;
   9812   sqlite_int64 iWriteEnd = iOfst + iAmt;
   9813   if( iWriteEnd>=APND_MAX_SIZE ) return SQLITE_FULL;
   9814   pFile = ORIGFILE(pFile);
   9815   /* If append-mark is absent or will be overwritten, write it. */
   9816   if( paf->iMark < 0 || paf->iPgOne + iWriteEnd > paf->iMark ){
   9817     int rc = apndWriteMark(paf, pFile, iWriteEnd);
   9818     if( SQLITE_OK!=rc ) return rc;
   9819   }
   9820   return pFile->pMethods->xWrite(pFile, zBuf, iAmt, paf->iPgOne+iOfst);
   9821 }
   9822 
   9823 /*
   9824 ** Truncate an apnd-file.
   9825 */
   9826 static int apndTruncate(sqlite3_file *pFile, sqlite_int64 size){
   9827   ApndFile *paf = (ApndFile *)pFile;
   9828   pFile = ORIGFILE(pFile);
   9829   /* The append mark goes out first so truncate failure does not lose it. */
   9830   if( SQLITE_OK!=apndWriteMark(paf, pFile, size) ) return SQLITE_IOERR;
   9831   /* Truncate underlying file just past append mark */
   9832   return pFile->pMethods->xTruncate(pFile, paf->iMark+APND_MARK_SIZE);
   9833 }
   9834 
   9835 /*
   9836 ** Sync an apnd-file.
   9837 */
   9838 static int apndSync(sqlite3_file *pFile, int flags){
   9839   pFile = ORIGFILE(pFile);
   9840   return pFile->pMethods->xSync(pFile, flags);
   9841 }
   9842 
   9843 /*
   9844 ** Return the current file-size of an apnd-file.
   9845 ** If the append mark is not yet there, the file-size is 0.
   9846 */
   9847 static int apndFileSize(sqlite3_file *pFile, sqlite_int64 *pSize){
   9848   ApndFile *paf = (ApndFile *)pFile;
   9849   *pSize = ( paf->iMark >= 0 )? (paf->iMark - paf->iPgOne) : 0;
   9850   return SQLITE_OK;
   9851 }
   9852 
   9853 /*
   9854 ** Lock an apnd-file.
   9855 */
   9856 static int apndLock(sqlite3_file *pFile, int eLock){
   9857   pFile = ORIGFILE(pFile);
   9858   return pFile->pMethods->xLock(pFile, eLock);
   9859 }
   9860 
   9861 /*
   9862 ** Unlock an apnd-file.
   9863 */
   9864 static int apndUnlock(sqlite3_file *pFile, int eLock){
   9865   pFile = ORIGFILE(pFile);
   9866   return pFile->pMethods->xUnlock(pFile, eLock);
   9867 }
   9868 
   9869 /*
   9870 ** Check if another file-handle holds a RESERVED lock on an apnd-file.
   9871 */
   9872 static int apndCheckReservedLock(sqlite3_file *pFile, int *pResOut){
   9873   pFile = ORIGFILE(pFile);
   9874   return pFile->pMethods->xCheckReservedLock(pFile, pResOut);
   9875 }
   9876 
   9877 /*
   9878 ** File control method. For custom operations on an apnd-file.
   9879 */
   9880 static int apndFileControl(sqlite3_file *pFile, int op, void *pArg){
   9881   ApndFile *paf = (ApndFile *)pFile;
   9882   int rc;
   9883   pFile = ORIGFILE(pFile);
   9884   if( op==SQLITE_FCNTL_SIZE_HINT ) *(sqlite3_int64*)pArg += paf->iPgOne;
   9885   rc = pFile->pMethods->xFileControl(pFile, op, pArg);
   9886   if( rc==SQLITE_OK && op==SQLITE_FCNTL_VFSNAME ){
   9887     *(char**)pArg = sqlite3_mprintf("apnd(%lld)/%z", paf->iPgOne,*(char**)pArg);
   9888   }
   9889   return rc;
   9890 }
   9891 
   9892 /*
   9893 ** Return the sector-size in bytes for an apnd-file.
   9894 */
   9895 static int apndSectorSize(sqlite3_file *pFile){
   9896   pFile = ORIGFILE(pFile);
   9897   return pFile->pMethods->xSectorSize(pFile);
   9898 }
   9899 
   9900 /*
   9901 ** Return the device characteristic flags supported by an apnd-file.
   9902 */
   9903 static int apndDeviceCharacteristics(sqlite3_file *pFile){
   9904   pFile = ORIGFILE(pFile);
   9905   return pFile->pMethods->xDeviceCharacteristics(pFile);
   9906 }
   9907 
   9908 /* Create a shared memory file mapping */
   9909 static int apndShmMap(
   9910   sqlite3_file *pFile,
   9911   int iPg,
   9912   int pgsz,
   9913   int bExtend,
   9914   void volatile **pp
   9915 ){
   9916   pFile = ORIGFILE(pFile);
   9917   return pFile->pMethods->xShmMap(pFile,iPg,pgsz,bExtend,pp);
   9918 }
   9919 
   9920 /* Perform locking on a shared-memory segment */
   9921 static int apndShmLock(sqlite3_file *pFile, int offset, int n, int flags){
   9922   pFile = ORIGFILE(pFile);
   9923   return pFile->pMethods->xShmLock(pFile,offset,n,flags);
   9924 }
   9925 
   9926 /* Memory barrier operation on shared memory */
   9927 static void apndShmBarrier(sqlite3_file *pFile){
   9928   pFile = ORIGFILE(pFile);
   9929   pFile->pMethods->xShmBarrier(pFile);
   9930 }
   9931 
   9932 /* Unmap a shared memory segment */
   9933 static int apndShmUnmap(sqlite3_file *pFile, int deleteFlag){
   9934   pFile = ORIGFILE(pFile);
   9935   return pFile->pMethods->xShmUnmap(pFile,deleteFlag);
   9936 }
   9937 
   9938 /* Fetch a page of a memory-mapped file */
   9939 static int apndFetch(
   9940   sqlite3_file *pFile,
   9941   sqlite3_int64 iOfst,
   9942   int iAmt,
   9943   void **pp
   9944 ){
   9945   ApndFile *p = (ApndFile *)pFile;
   9946   if( p->iMark < 0 || iOfst+iAmt > p->iMark ){
   9947     return SQLITE_IOERR; /* Cannot read what is not yet there. */
   9948   }
   9949   pFile = ORIGFILE(pFile);
   9950   return pFile->pMethods->xFetch(pFile, iOfst+p->iPgOne, iAmt, pp);
   9951 }
   9952 
   9953 /* Release a memory-mapped page */
   9954 static int apndUnfetch(sqlite3_file *pFile, sqlite3_int64 iOfst, void *pPage){
   9955   ApndFile *p = (ApndFile *)pFile;
   9956   pFile = ORIGFILE(pFile);
   9957   return pFile->pMethods->xUnfetch(pFile, iOfst+p->iPgOne, pPage);
   9958 }
   9959 
   9960 /*
   9961 ** Try to read the append-mark off the end of a file.  Return the
   9962 ** start of the appended database if the append-mark is present.
   9963 ** If there is no valid append-mark, return -1;
   9964 **
   9965 ** An append-mark is only valid if the NNNNNNNN start-of-database offset
   9966 ** indicates that the appended database contains at least one page.  The
   9967 ** start-of-database value must be a multiple of 512.
   9968 */
   9969 static sqlite3_int64 apndReadMark(sqlite3_int64 sz, sqlite3_file *pFile){
   9970   int rc, i;
   9971   sqlite3_int64 iMark;
   9972   int msbs = 8 * (APND_MARK_FOS_SZ-1);
   9973   unsigned char a[APND_MARK_SIZE];
   9974 
   9975   if( APND_MARK_SIZE!=(sz & 0x1ff) ) return -1;
   9976   rc = pFile->pMethods->xRead(pFile, a, APND_MARK_SIZE, sz-APND_MARK_SIZE);
   9977   if( rc ) return -1;
   9978   if( memcmp(a, APND_MARK_PREFIX, APND_MARK_PREFIX_SZ)!=0 ) return -1;
   9979   iMark = ((sqlite3_int64)(a[APND_MARK_PREFIX_SZ] & 0x7f)) << msbs;
   9980   for(i=1; i<8; i++){
   9981     msbs -= 8;
   9982     iMark |= (sqlite3_int64)a[APND_MARK_PREFIX_SZ+i]<<msbs;
   9983   }
   9984   if( iMark > (sz - APND_MARK_SIZE - 512) ) return -1;
   9985   if( iMark & 0x1ff ) return -1;
   9986   return iMark;
   9987 }
   9988 
   9989 static const char apvfsSqliteHdr[] = "SQLite format 3";
   9990 /*
   9991 ** Check to see if the file is an appendvfs SQLite database file.
   9992 ** Return true iff it is such. Parameter sz is the file's size.
   9993 */
   9994 static int apndIsAppendvfsDatabase(sqlite3_int64 sz, sqlite3_file *pFile){
   9995   int rc;
   9996   char zHdr[16];
   9997   sqlite3_int64 iMark = apndReadMark(sz, pFile);
   9998   if( iMark>=0 ){
   9999     /* If file has the correct end-marker, the expected odd size, and the
  10000     ** SQLite DB type marker where the end-marker puts it, then it
  10001     ** is an appendvfs database.
  10002     */
  10003     rc = pFile->pMethods->xRead(pFile, zHdr, sizeof(zHdr), iMark);
  10004     if( SQLITE_OK==rc
  10005      && memcmp(zHdr, apvfsSqliteHdr, sizeof(zHdr))==0
  10006      && (sz & 0x1ff) == APND_MARK_SIZE
  10007      && sz>=512+APND_MARK_SIZE
  10008     ){
  10009       return 1; /* It's an appendvfs database */
  10010     }
  10011   }
  10012   return 0;
  10013 }
  10014 
  10015 /*
  10016 ** Check to see if the file is an ordinary SQLite database file.
  10017 ** Return true iff so. Parameter sz is the file's size.
  10018 */
  10019 static int apndIsOrdinaryDatabaseFile(sqlite3_int64 sz, sqlite3_file *pFile){
  10020   char zHdr[16];
  10021   if( apndIsAppendvfsDatabase(sz, pFile) /* rule 2 */
  10022    || (sz & 0x1ff) != 0
  10023    || SQLITE_OK!=pFile->pMethods->xRead(pFile, zHdr, sizeof(zHdr), 0)
  10024    || memcmp(zHdr, apvfsSqliteHdr, sizeof(zHdr))!=0
  10025   ){
  10026     return 0;
  10027   }else{
  10028     return 1;
  10029   }
  10030 }
  10031 
  10032 /*
  10033 ** Open an apnd file handle.
  10034 */
  10035 static int apndOpen(
  10036   sqlite3_vfs *pApndVfs,
  10037   const char *zName,
  10038   sqlite3_file *pFile,
  10039   int flags,
  10040   int *pOutFlags
  10041 ){
  10042   ApndFile *pApndFile = (ApndFile*)pFile;
  10043   sqlite3_file *pBaseFile = ORIGFILE(pFile);
  10044   sqlite3_vfs *pBaseVfs = ORIGVFS(pApndVfs);
  10045   int rc;
  10046   sqlite3_int64 sz = 0;
  10047   if( (flags & SQLITE_OPEN_MAIN_DB)==0 ){
  10048     /* The appendvfs is not to be used for transient or temporary databases.
  10049     ** Just use the base VFS open to initialize the given file object and
  10050     ** open the underlying file. (Appendvfs is then unused for this file.)
  10051     */
  10052     return pBaseVfs->xOpen(pBaseVfs, zName, pFile, flags, pOutFlags);
  10053   }
  10054   memset(pApndFile, 0, sizeof(ApndFile));
  10055   pFile->pMethods = &apnd_io_methods;
  10056   pApndFile->iMark = -1;    /* Append mark not yet written */
  10057 
  10058   rc = pBaseVfs->xOpen(pBaseVfs, zName, pBaseFile, flags, pOutFlags);
  10059   if( rc==SQLITE_OK ){
  10060     rc = pBaseFile->pMethods->xFileSize(pBaseFile, &sz);
  10061     if( rc ){
  10062       pBaseFile->pMethods->xClose(pBaseFile);
  10063     }
  10064   }
  10065   if( rc ){
  10066     pFile->pMethods = 0;
  10067     return rc;
  10068   }
  10069   if( apndIsOrdinaryDatabaseFile(sz, pBaseFile) ){
  10070     /* The file being opened appears to be just an ordinary DB. Copy
  10071     ** the base dispatch-table so this instance mimics the base VFS. 
  10072     */
  10073     memmove(pApndFile, pBaseFile, pBaseVfs->szOsFile);
  10074     return SQLITE_OK;
  10075   }
  10076   pApndFile->iPgOne = apndReadMark(sz, pFile);
  10077   if( pApndFile->iPgOne>=0 ){
  10078     pApndFile->iMark = sz - APND_MARK_SIZE; /* Append mark found */
  10079     return SQLITE_OK;
  10080   }
  10081   if( (flags & SQLITE_OPEN_CREATE)==0 ){
  10082     pBaseFile->pMethods->xClose(pBaseFile);
  10083     rc = SQLITE_CANTOPEN;
  10084     pFile->pMethods = 0;
  10085   }else{
  10086     /* Round newly added appendvfs location to #define'd page boundary. 
  10087     ** Note that nothing has yet been written to the underlying file.
  10088     ** The append mark will be written along with first content write.
  10089     ** Until then, paf->iMark value indicates it is not yet written.
  10090     */
  10091     pApndFile->iPgOne = APND_START_ROUNDUP(sz);
  10092   }
  10093   return rc;
  10094 }
  10095 
  10096 /*
  10097 ** Delete an apnd file.
  10098 ** For an appendvfs, this could mean delete the appendvfs portion,
  10099 ** leaving the appendee as it was before it gained an appendvfs.
  10100 ** For now, this code deletes the underlying file too.
  10101 */
  10102 static int apndDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){
  10103   return ORIGVFS(pVfs)->xDelete(ORIGVFS(pVfs), zPath, dirSync);
  10104 }
  10105 
  10106 /*
  10107 ** All other VFS methods are pass-thrus.
  10108 */
  10109 static int apndAccess(
  10110   sqlite3_vfs *pVfs, 
  10111   const char *zPath, 
  10112   int flags, 
  10113   int *pResOut
  10114 ){
  10115   return ORIGVFS(pVfs)->xAccess(ORIGVFS(pVfs), zPath, flags, pResOut);
  10116 }
  10117 static int apndFullPathname(
  10118   sqlite3_vfs *pVfs, 
  10119   const char *zPath, 
  10120   int nOut, 
  10121   char *zOut
  10122 ){
  10123   return ORIGVFS(pVfs)->xFullPathname(ORIGVFS(pVfs),zPath,nOut,zOut);
  10124 }
  10125 static void *apndDlOpen(sqlite3_vfs *pVfs, const char *zPath){
  10126   return ORIGVFS(pVfs)->xDlOpen(ORIGVFS(pVfs), zPath);
  10127 }
  10128 static void apndDlError(sqlite3_vfs *pVfs, int nByte, char *zErrMsg){
  10129   ORIGVFS(pVfs)->xDlError(ORIGVFS(pVfs), nByte, zErrMsg);
  10130 }
  10131 static void (*apndDlSym(sqlite3_vfs *pVfs, void *p, const char *zSym))(void){
  10132   return ORIGVFS(pVfs)->xDlSym(ORIGVFS(pVfs), p, zSym);
  10133 }
  10134 static void apndDlClose(sqlite3_vfs *pVfs, void *pHandle){
  10135   ORIGVFS(pVfs)->xDlClose(ORIGVFS(pVfs), pHandle);
  10136 }
  10137 static int apndRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){
  10138   return ORIGVFS(pVfs)->xRandomness(ORIGVFS(pVfs), nByte, zBufOut);
  10139 }
  10140 static int apndSleep(sqlite3_vfs *pVfs, int nMicro){
  10141   return ORIGVFS(pVfs)->xSleep(ORIGVFS(pVfs), nMicro);
  10142 }
  10143 static int apndCurrentTime(sqlite3_vfs *pVfs, double *pTimeOut){
  10144   return ORIGVFS(pVfs)->xCurrentTime(ORIGVFS(pVfs), pTimeOut);
  10145 }
  10146 static int apndGetLastError(sqlite3_vfs *pVfs, int a, char *b){
  10147   return ORIGVFS(pVfs)->xGetLastError(ORIGVFS(pVfs), a, b);
  10148 }
  10149 static int apndCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *p){
  10150   return ORIGVFS(pVfs)->xCurrentTimeInt64(ORIGVFS(pVfs), p);
  10151 }
  10152 static int apndSetSystemCall(
  10153   sqlite3_vfs *pVfs,
  10154   const char *zName,
  10155   sqlite3_syscall_ptr pCall
  10156 ){
  10157   return ORIGVFS(pVfs)->xSetSystemCall(ORIGVFS(pVfs),zName,pCall);
  10158 }
  10159 static sqlite3_syscall_ptr apndGetSystemCall(
  10160   sqlite3_vfs *pVfs,
  10161   const char *zName
  10162 ){
  10163   return ORIGVFS(pVfs)->xGetSystemCall(ORIGVFS(pVfs),zName);
  10164 }
  10165 static const char *apndNextSystemCall(sqlite3_vfs *pVfs, const char *zName){
  10166   return ORIGVFS(pVfs)->xNextSystemCall(ORIGVFS(pVfs), zName);
  10167 }
  10168 
  10169   
  10170 #ifdef _WIN32
  10171 
  10172 #endif
  10173 /* 
  10174 ** This routine is called when the extension is loaded.
  10175 ** Register the new VFS.
  10176 */
  10177 int sqlite3_appendvfs_init(
  10178   sqlite3 *db, 
  10179   char **pzErrMsg, 
  10180   const sqlite3_api_routines *pApi
  10181 ){
  10182   int rc = SQLITE_OK;
  10183   sqlite3_vfs *pOrig;
  10184   SQLITE_EXTENSION_INIT2(pApi);
  10185   (void)pzErrMsg;
  10186   (void)db;
  10187   pOrig = sqlite3_vfs_find(0);
  10188   if( pOrig==0 ) return SQLITE_ERROR;
  10189   apnd_vfs.iVersion = pOrig->iVersion;
  10190   apnd_vfs.pAppData = pOrig;
  10191   apnd_vfs.szOsFile = pOrig->szOsFile + sizeof(ApndFile);
  10192   rc = sqlite3_vfs_register(&apnd_vfs, 0);
  10193 #ifdef APPENDVFS_TEST
  10194   if( rc==SQLITE_OK ){
  10195     rc = sqlite3_auto_extension((void(*)(void))apndvfsRegister);
  10196   }
  10197 #endif
  10198   if( rc==SQLITE_OK ) rc = SQLITE_OK_LOAD_PERMANENTLY;
  10199   return rc;
  10200 }
  10201 
  10202 /************************* End ../ext/misc/appendvfs.c ********************/
  10203 #endif
  10204 #ifdef SQLITE_HAVE_ZLIB
  10205 /************************* Begin ../ext/misc/zipfile.c ******************/
  10206 /*
  10207 ** 2017-12-26
  10208 **
  10209 ** The author disclaims copyright to this source code.  In place of
  10210 ** a legal notice, here is a blessing:
  10211 **
  10212 **    May you do good and not evil.
  10213 **    May you find forgiveness for yourself and forgive others.
  10214 **    May you share freely, never taking more than you give.
  10215 **
  10216 ******************************************************************************
  10217 **
  10218 ** This file implements a virtual table for reading and writing ZIP archive
  10219 ** files.
  10220 **
  10221 ** Usage example:
  10222 **
  10223 **     SELECT name, sz, datetime(mtime,'unixepoch') FROM zipfile($filename);
  10224 **
  10225 ** Current limitations:
  10226 **
  10227 **    *  No support for encryption
  10228 **    *  No support for ZIP archives spanning multiple files
  10229 **    *  No support for zip64 extensions
  10230 **    *  Only the "inflate/deflate" (zlib) compression method is supported
  10231 */
  10232 /* #include "sqlite3ext.h" */
  10233 SQLITE_EXTENSION_INIT1
  10234 #include <stdio.h>
  10235 #include <string.h>
  10236 #include <assert.h>
  10237 #ifndef SQLITE_NO_STDINT
  10238 #  include <stdint.h>
  10239 #endif
  10240 
  10241 #include <zlib.h>
  10242 
  10243 /* When used as part of the CLI, the sqlite3_stdio.h module will have
  10244 ** been included before this one. In that case use the sqlite3_stdio.h
  10245 ** #defines.  If not, create our own for fopen().
  10246 */
  10247 #ifndef _SQLITE3_STDIO_H_
  10248 # define sqlite3_fopen fopen
  10249 #endif
  10250 
  10251 #ifndef SQLITE_OMIT_VIRTUALTABLE
  10252 
  10253 #ifndef SQLITE_AMALGAMATION
  10254 
  10255 #ifndef UINT32_TYPE
  10256 # ifdef HAVE_UINT32_T
  10257 #  define UINT32_TYPE uint32_t
  10258 # else
  10259 #  define UINT32_TYPE unsigned int
  10260 # endif
  10261 #endif
  10262 #ifndef UINT16_TYPE
  10263 # ifdef HAVE_UINT16_T
  10264 #  define UINT16_TYPE uint16_t
  10265 # else
  10266 #  define UINT16_TYPE unsigned short int
  10267 # endif
  10268 #endif
  10269 /* typedef sqlite3_int64 i64; */
  10270 /* typedef unsigned char u8; */
  10271 /* typedef UINT32_TYPE u32;           // 4-byte unsigned integer // */
  10272 /* typedef UINT16_TYPE u16;           // 2-byte unsigned integer // */
  10273 #define MIN(a,b) ((a)<(b) ? (a) : (b))
  10274 
  10275 #if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST)
  10276 # define SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS 1
  10277 #endif
  10278 #if defined(SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS)
  10279 # define ALWAYS(X)      (1)
  10280 # define NEVER(X)       (0)
  10281 #elif !defined(NDEBUG)
  10282 # define ALWAYS(X)      ((X)?1:(assert(0),0))
  10283 # define NEVER(X)       ((X)?(assert(0),1):0)
  10284 #else
  10285 # define ALWAYS(X)      (X)
  10286 # define NEVER(X)       (X)
  10287 #endif
  10288 
  10289 #endif   /* SQLITE_AMALGAMATION */
  10290 
  10291 /*
  10292 ** Definitions for mode bitmasks S_IFDIR, S_IFREG and S_IFLNK.
  10293 **
  10294 ** In some ways it would be better to obtain these values from system 
  10295 ** header files. But, the dependency is undesirable and (a) these
  10296 ** have been stable for decades, (b) the values are part of POSIX and
  10297 ** are also made explicit in [man stat], and (c) are part of the 
  10298 ** file format for zip archives.
  10299 */
  10300 #ifndef S_IFDIR
  10301 # define S_IFDIR 0040000
  10302 #endif
  10303 #ifndef S_IFREG
  10304 # define S_IFREG 0100000
  10305 #endif
  10306 #ifndef S_IFLNK
  10307 # define S_IFLNK 0120000
  10308 #endif
  10309 
  10310 static const char ZIPFILE_SCHEMA[] = 
  10311   "CREATE TABLE y("
  10312     "name PRIMARY KEY,"  /* 0: Name of file in zip archive */
  10313     "mode,"              /* 1: POSIX mode for file */
  10314     "mtime,"             /* 2: Last modification time (secs since 1970)*/
  10315     "sz,"                /* 3: Size of object */
  10316     "rawdata,"           /* 4: Raw data */
  10317     "data,"              /* 5: Uncompressed data */
  10318     "method,"            /* 6: Compression method (integer) */
  10319     "z HIDDEN"           /* 7: Name of zip file */
  10320   ") WITHOUT ROWID;";
  10321 
  10322 #define ZIPFILE_F_COLUMN_IDX 7    /* Index of column "file" in the above */
  10323 #define ZIPFILE_BUFFER_SIZE (64*1024)
  10324 
  10325 
  10326 /*
  10327 ** Magic numbers used to read and write zip files.
  10328 **
  10329 ** ZIPFILE_NEWENTRY_MADEBY:
  10330 **   Use this value for the "version-made-by" field in new zip file
  10331 **   entries. The upper byte indicates "unix", and the lower byte 
  10332 **   indicates that the zip file matches pkzip specification 3.0. 
  10333 **   This is what info-zip seems to do.
  10334 **
  10335 ** ZIPFILE_NEWENTRY_REQUIRED:
  10336 **   Value for "version-required-to-extract" field of new entries.
  10337 **   Version 2.0 is required to support folders and deflate compression.
  10338 **
  10339 ** ZIPFILE_NEWENTRY_FLAGS:
  10340 **   Value for "general-purpose-bit-flags" field of new entries. Bit
  10341 **   11 means "utf-8 filename and comment".
  10342 **
  10343 ** ZIPFILE_SIGNATURE_CDS:
  10344 **   First 4 bytes of a valid CDS record.
  10345 **
  10346 ** ZIPFILE_SIGNATURE_LFH:
  10347 **   First 4 bytes of a valid LFH record.
  10348 **
  10349 ** ZIPFILE_SIGNATURE_EOCD
  10350 **   First 4 bytes of a valid EOCD record.
  10351 */
  10352 #define ZIPFILE_EXTRA_TIMESTAMP   0x5455
  10353 #define ZIPFILE_NEWENTRY_MADEBY   ((3<<8) + 30)
  10354 #define ZIPFILE_NEWENTRY_REQUIRED 20
  10355 #define ZIPFILE_NEWENTRY_FLAGS    0x800
  10356 #define ZIPFILE_SIGNATURE_CDS     0x02014b50
  10357 #define ZIPFILE_SIGNATURE_LFH     0x04034b50
  10358 #define ZIPFILE_SIGNATURE_EOCD    0x06054b50
  10359 
  10360 /*
  10361 ** The sizes of the fixed-size part of each of the three main data 
  10362 ** structures in a zip archive.
  10363 */
  10364 #define ZIPFILE_LFH_FIXED_SZ      30
  10365 #define ZIPFILE_EOCD_FIXED_SZ     22
  10366 #define ZIPFILE_CDS_FIXED_SZ      46
  10367 
  10368 /*
  10369 *** 4.3.16  End of central directory record:
  10370 ***
  10371 ***   end of central dir signature    4 bytes  (0x06054b50)
  10372 ***   number of this disk             2 bytes
  10373 ***   number of the disk with the
  10374 ***   start of the central directory  2 bytes
  10375 ***   total number of entries in the
  10376 ***   central directory on this disk  2 bytes
  10377 ***   total number of entries in
  10378 ***   the central directory           2 bytes
  10379 ***   size of the central directory   4 bytes
  10380 ***   offset of start of central
  10381 ***   directory with respect to
  10382 ***   the starting disk number        4 bytes
  10383 ***   .ZIP file comment length        2 bytes
  10384 ***   .ZIP file comment       (variable size)
  10385 */
  10386 typedef struct ZipfileEOCD ZipfileEOCD;
  10387 struct ZipfileEOCD {
  10388   u16 iDisk;
  10389   u16 iFirstDisk;
  10390   u16 nEntry;
  10391   u16 nEntryTotal;
  10392   u32 nSize;
  10393   u32 iOffset;
  10394 };
  10395 
  10396 /*
  10397 *** 4.3.12  Central directory structure:
  10398 ***
  10399 *** ...
  10400 ***
  10401 ***   central file header signature   4 bytes  (0x02014b50)
  10402 ***   version made by                 2 bytes
  10403 ***   version needed to extract       2 bytes
  10404 ***   general purpose bit flag        2 bytes
  10405 ***   compression method              2 bytes
  10406 ***   last mod file time              2 bytes
  10407 ***   last mod file date              2 bytes
  10408 ***   crc-32                          4 bytes
  10409 ***   compressed size                 4 bytes
  10410 ***   uncompressed size               4 bytes
  10411 ***   file name length                2 bytes
  10412 ***   extra field length              2 bytes
  10413 ***   file comment length             2 bytes
  10414 ***   disk number start               2 bytes
  10415 ***   internal file attributes        2 bytes
  10416 ***   external file attributes        4 bytes
  10417 ***   relative offset of local header 4 bytes
  10418 */
  10419 typedef struct ZipfileCDS ZipfileCDS;
  10420 struct ZipfileCDS {
  10421   u16 iVersionMadeBy;
  10422   u16 iVersionExtract;
  10423   u16 flags;
  10424   u16 iCompression;
  10425   u16 mTime;
  10426   u16 mDate;
  10427   u32 crc32;
  10428   u32 szCompressed;
  10429   u32 szUncompressed;
  10430   u16 nFile;
  10431   u16 nExtra;
  10432   u16 nComment;
  10433   u16 iDiskStart;
  10434   u16 iInternalAttr;
  10435   u32 iExternalAttr;
  10436   u32 iOffset;
  10437   char *zFile;                    /* Filename (sqlite3_malloc()) */
  10438 };
  10439 
  10440 /*
  10441 *** 4.3.7  Local file header:
  10442 ***
  10443 ***   local file header signature     4 bytes  (0x04034b50)
  10444 ***   version needed to extract       2 bytes
  10445 ***   general purpose bit flag        2 bytes
  10446 ***   compression method              2 bytes
  10447 ***   last mod file time              2 bytes
  10448 ***   last mod file date              2 bytes
  10449 ***   crc-32                          4 bytes
  10450 ***   compressed size                 4 bytes
  10451 ***   uncompressed size               4 bytes
  10452 ***   file name length                2 bytes
  10453 ***   extra field length              2 bytes
  10454 ***   
  10455 */
  10456 typedef struct ZipfileLFH ZipfileLFH;
  10457 struct ZipfileLFH {
  10458   u16 iVersionExtract;
  10459   u16 flags;
  10460   u16 iCompression;
  10461   u16 mTime;
  10462   u16 mDate;
  10463   u32 crc32;
  10464   u32 szCompressed;
  10465   u32 szUncompressed;
  10466   u16 nFile;
  10467   u16 nExtra;
  10468 };
  10469 
  10470 typedef struct ZipfileEntry ZipfileEntry;
  10471 struct ZipfileEntry {
  10472   ZipfileCDS cds;            /* Parsed CDS record */
  10473   u32 mUnixTime;             /* Modification time, in UNIX format */
  10474   u8 *aExtra;                /* cds.nExtra+cds.nComment bytes of extra data */
  10475   i64 iDataOff;              /* Offset to data in file (if aData==0) */
  10476   u8 *aData;                 /* cds.szCompressed bytes of compressed data */
  10477   ZipfileEntry *pNext;       /* Next element in in-memory CDS */
  10478 };
  10479 
  10480 /* 
  10481 ** Cursor type for zipfile tables.
  10482 */
  10483 typedef struct ZipfileCsr ZipfileCsr;
  10484 struct ZipfileCsr {
  10485   sqlite3_vtab_cursor base;  /* Base class - must be first */
  10486   i64 iId;                   /* Cursor ID */
  10487   u8 bEof;                   /* True when at EOF */
  10488   u8 bNoop;                  /* If next xNext() call is no-op */
  10489 
  10490   /* Used outside of write transactions */
  10491   FILE *pFile;               /* Zip file */
  10492   i64 iNextOff;              /* Offset of next record in central directory */
  10493   ZipfileEOCD eocd;          /* Parse of central directory record */
  10494 
  10495   ZipfileEntry *pFreeEntry;  /* Free this list when cursor is closed or reset */
  10496   ZipfileEntry *pCurrent;    /* Current entry */
  10497   ZipfileCsr *pCsrNext;      /* Next cursor on same virtual table */
  10498 };
  10499 
  10500 typedef struct ZipfileTab ZipfileTab;
  10501 struct ZipfileTab {
  10502   sqlite3_vtab base;         /* Base class - must be first */
  10503   char *zFile;               /* Zip file this table accesses (may be NULL) */
  10504   sqlite3 *db;               /* Host database connection */
  10505   u8 *aBuffer;               /* Temporary buffer used for various tasks */
  10506 
  10507   ZipfileCsr *pCsrList;      /* List of cursors */
  10508   i64 iNextCsrid;
  10509 
  10510   /* The following are used by write transactions only */
  10511   ZipfileEntry *pFirstEntry; /* Linked list of all files (if pWriteFd!=0) */
  10512   ZipfileEntry *pLastEntry;  /* Last element in pFirstEntry list */
  10513   FILE *pWriteFd;            /* File handle open on zip archive */
  10514   i64 szCurrent;             /* Current size of zip archive */
  10515   i64 szOrig;                /* Size of archive at start of transaction */
  10516 };
  10517 
  10518 /*
  10519 ** Set the error message contained in context ctx to the results of
  10520 ** vprintf(zFmt, ...).
  10521 */
  10522 static void zipfileCtxErrorMsg(sqlite3_context *ctx, const char *zFmt, ...){
  10523   char *zMsg = 0;
  10524   va_list ap;
  10525   va_start(ap, zFmt);
  10526   zMsg = sqlite3_vmprintf(zFmt, ap);
  10527   sqlite3_result_error(ctx, zMsg, -1);
  10528   sqlite3_free(zMsg);
  10529   va_end(ap);
  10530 }
  10531 
  10532 /*
  10533 ** If string zIn is quoted, dequote it in place. Otherwise, if the string
  10534 ** is not quoted, do nothing.
  10535 */
  10536 static void zipfileDequote(char *zIn){
  10537   char q = zIn[0];
  10538   if( q=='"' || q=='\'' || q=='`' || q=='[' ){
  10539     int iIn = 1;
  10540     int iOut = 0;
  10541     if( q=='[' ) q = ']';
  10542     while( ALWAYS(zIn[iIn]) ){
  10543       char c = zIn[iIn++];
  10544       if( c==q && zIn[iIn++]!=q ) break;
  10545       zIn[iOut++] = c;
  10546     }
  10547     zIn[iOut] = '\0';
  10548   }
  10549 }
  10550 
  10551 /*
  10552 ** Construct a new ZipfileTab virtual table object.
  10553 ** 
  10554 **   argv[0]   -> module name  ("zipfile")
  10555 **   argv[1]   -> database name
  10556 **   argv[2]   -> table name
  10557 **   argv[...] -> "column name" and other module argument fields.
  10558 */
  10559 static int zipfileConnect(
  10560   sqlite3 *db,
  10561   void *pAux,
  10562   int argc, const char *const*argv,
  10563   sqlite3_vtab **ppVtab,
  10564   char **pzErr
  10565 ){
  10566   int nByte = sizeof(ZipfileTab) + ZIPFILE_BUFFER_SIZE;
  10567   int nFile = 0;
  10568   const char *zFile = 0;
  10569   ZipfileTab *pNew = 0;
  10570   int rc;
  10571   (void)pAux;
  10572 
  10573   /* If the table name is not "zipfile", require that the argument be
  10574   ** specified. This stops zipfile tables from being created as:
  10575   **
  10576   **   CREATE VIRTUAL TABLE zzz USING zipfile();
  10577   **
  10578   ** It does not prevent:
  10579   **
  10580   **   CREATE VIRTUAL TABLE zipfile USING zipfile();
  10581   */
  10582   assert( 0==sqlite3_stricmp(argv[0], "zipfile") );
  10583   if( (0!=sqlite3_stricmp(argv[2], "zipfile") && argc<4) || argc>4 ){
  10584     *pzErr = sqlite3_mprintf("zipfile constructor requires one argument");
  10585     return SQLITE_ERROR;
  10586   }
  10587 
  10588   if( argc>3 ){
  10589     zFile = argv[3];
  10590     nFile = (int)strlen(zFile)+1;
  10591   }
  10592 
  10593   rc = sqlite3_declare_vtab(db, ZIPFILE_SCHEMA);
  10594   if( rc==SQLITE_OK ){
  10595     pNew = (ZipfileTab*)sqlite3_malloc64((sqlite3_int64)nByte+nFile);
  10596     if( pNew==0 ) return SQLITE_NOMEM;
  10597     memset(pNew, 0, nByte+nFile);
  10598     pNew->db = db;
  10599     pNew->aBuffer = (u8*)&pNew[1];
  10600     if( zFile ){
  10601       pNew->zFile = (char*)&pNew->aBuffer[ZIPFILE_BUFFER_SIZE];
  10602       memcpy(pNew->zFile, zFile, nFile);
  10603       zipfileDequote(pNew->zFile);
  10604     }
  10605   }
  10606   sqlite3_vtab_config(db, SQLITE_VTAB_DIRECTONLY);
  10607   *ppVtab = (sqlite3_vtab*)pNew;
  10608   return rc;
  10609 }
  10610 
  10611 /*
  10612 ** Free the ZipfileEntry structure indicated by the only argument.
  10613 */
  10614 static void zipfileEntryFree(ZipfileEntry *p){
  10615   if( p ){
  10616     sqlite3_free(p->cds.zFile);
  10617     sqlite3_free(p);
  10618   }
  10619 }
  10620 
  10621 /*
  10622 ** Release resources that should be freed at the end of a write 
  10623 ** transaction.
  10624 */
  10625 static void zipfileCleanupTransaction(ZipfileTab *pTab){
  10626   ZipfileEntry *pEntry;
  10627   ZipfileEntry *pNext;
  10628 
  10629   if( pTab->pWriteFd ){
  10630     fclose(pTab->pWriteFd);
  10631     pTab->pWriteFd = 0;
  10632   }
  10633   for(pEntry=pTab->pFirstEntry; pEntry; pEntry=pNext){
  10634     pNext = pEntry->pNext;
  10635     zipfileEntryFree(pEntry);
  10636   }
  10637   pTab->pFirstEntry = 0;
  10638   pTab->pLastEntry = 0;
  10639   pTab->szCurrent = 0;
  10640   pTab->szOrig = 0;
  10641 }
  10642 
  10643 /*
  10644 ** This method is the destructor for zipfile vtab objects.
  10645 */
  10646 static int zipfileDisconnect(sqlite3_vtab *pVtab){
  10647   zipfileCleanupTransaction((ZipfileTab*)pVtab);
  10648   sqlite3_free(pVtab);
  10649   return SQLITE_OK;
  10650 }
  10651 
  10652 /*
  10653 ** Constructor for a new ZipfileCsr object.
  10654 */
  10655 static int zipfileOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCsr){
  10656   ZipfileTab *pTab = (ZipfileTab*)p;
  10657   ZipfileCsr *pCsr;
  10658   pCsr = sqlite3_malloc(sizeof(*pCsr));
  10659   *ppCsr = (sqlite3_vtab_cursor*)pCsr;
  10660   if( pCsr==0 ){
  10661     return SQLITE_NOMEM;
  10662   }
  10663   memset(pCsr, 0, sizeof(*pCsr));
  10664   pCsr->iId = ++pTab->iNextCsrid;
  10665   pCsr->pCsrNext = pTab->pCsrList;
  10666   pTab->pCsrList = pCsr;
  10667   return SQLITE_OK;
  10668 }
  10669 
  10670 /*
  10671 ** Reset a cursor back to the state it was in when first returned
  10672 ** by zipfileOpen().
  10673 */
  10674 static void zipfileResetCursor(ZipfileCsr *pCsr){
  10675   ZipfileEntry *p;
  10676   ZipfileEntry *pNext;
  10677 
  10678   pCsr->bEof = 0;
  10679   if( pCsr->pFile ){
  10680     fclose(pCsr->pFile);
  10681     pCsr->pFile = 0;
  10682     zipfileEntryFree(pCsr->pCurrent);
  10683     pCsr->pCurrent = 0;
  10684   }
  10685 
  10686   for(p=pCsr->pFreeEntry; p; p=pNext){
  10687     pNext = p->pNext;
  10688     zipfileEntryFree(p);
  10689   }
  10690 }
  10691 
  10692 /*
  10693 ** Destructor for an ZipfileCsr.
  10694 */
  10695 static int zipfileClose(sqlite3_vtab_cursor *cur){
  10696   ZipfileCsr *pCsr = (ZipfileCsr*)cur;
  10697   ZipfileTab *pTab = (ZipfileTab*)(pCsr->base.pVtab);
  10698   ZipfileCsr **pp;
  10699   zipfileResetCursor(pCsr);
  10700 
  10701   /* Remove this cursor from the ZipfileTab.pCsrList list. */
  10702   for(pp=&pTab->pCsrList; *pp!=pCsr; pp=&((*pp)->pCsrNext));
  10703   *pp = pCsr->pCsrNext;
  10704 
  10705   sqlite3_free(pCsr);
  10706   return SQLITE_OK;
  10707 }
  10708 
  10709 /*
  10710 ** Set the error message for the virtual table associated with cursor
  10711 ** pCsr to the results of vprintf(zFmt, ...).
  10712 */
  10713 static void zipfileTableErr(ZipfileTab *pTab, const char *zFmt, ...){
  10714   va_list ap;
  10715   va_start(ap, zFmt);
  10716   sqlite3_free(pTab->base.zErrMsg);
  10717   pTab->base.zErrMsg = sqlite3_vmprintf(zFmt, ap);
  10718   va_end(ap);
  10719 }
  10720 static void zipfileCursorErr(ZipfileCsr *pCsr, const char *zFmt, ...){
  10721   va_list ap;
  10722   va_start(ap, zFmt);
  10723   sqlite3_free(pCsr->base.pVtab->zErrMsg);
  10724   pCsr->base.pVtab->zErrMsg = sqlite3_vmprintf(zFmt, ap);
  10725   va_end(ap);
  10726 }
  10727 
  10728 /*
  10729 ** Read nRead bytes of data from offset iOff of file pFile into buffer
  10730 ** aRead[]. Return SQLITE_OK if successful, or an SQLite error code
  10731 ** otherwise. 
  10732 **
  10733 ** If an error does occur, output variable (*pzErrmsg) may be set to point
  10734 ** to an English language error message. It is the responsibility of the
  10735 ** caller to eventually free this buffer using
  10736 ** sqlite3_free().
  10737 */
  10738 static int zipfileReadData(
  10739   FILE *pFile,                    /* Read from this file */
  10740   u8 *aRead,                      /* Read into this buffer */
  10741   int nRead,                      /* Number of bytes to read */
  10742   i64 iOff,                       /* Offset to read from */
  10743   char **pzErrmsg                 /* OUT: Error message (from sqlite3_malloc) */
  10744 ){
  10745   size_t n;
  10746   fseek(pFile, (long)iOff, SEEK_SET);
  10747   n = fread(aRead, 1, nRead, pFile);
  10748   if( (int)n!=nRead ){
  10749     *pzErrmsg = sqlite3_mprintf("error in fread()");
  10750     return SQLITE_ERROR;
  10751   }
  10752   return SQLITE_OK;
  10753 }
  10754 
  10755 static int zipfileAppendData(
  10756   ZipfileTab *pTab,
  10757   const u8 *aWrite,
  10758   int nWrite
  10759 ){
  10760   if( nWrite>0 ){
  10761     size_t n = nWrite;
  10762     fseek(pTab->pWriteFd, (long)pTab->szCurrent, SEEK_SET);
  10763     n = fwrite(aWrite, 1, nWrite, pTab->pWriteFd);
  10764     if( (int)n!=nWrite ){
  10765       pTab->base.zErrMsg = sqlite3_mprintf("error in fwrite()");
  10766       return SQLITE_ERROR;
  10767     }
  10768     pTab->szCurrent += nWrite;
  10769   }
  10770   return SQLITE_OK;
  10771 }
  10772 
  10773 /*
  10774 ** Read and return a 16-bit little-endian unsigned integer from buffer aBuf.
  10775 */
  10776 static u16 zipfileGetU16(const u8 *aBuf){
  10777   return (aBuf[1] << 8) + aBuf[0];
  10778 }
  10779 
  10780 /*
  10781 ** Read and return a 32-bit little-endian unsigned integer from buffer aBuf.
  10782 */
  10783 static u32 zipfileGetU32(const u8 *aBuf){
  10784   if( aBuf==0 ) return 0;
  10785   return ((u32)(aBuf[3]) << 24)
  10786        + ((u32)(aBuf[2]) << 16)
  10787        + ((u32)(aBuf[1]) <<  8)
  10788        + ((u32)(aBuf[0]) <<  0);
  10789 }
  10790 
  10791 /*
  10792 ** Write a 16-bit little endiate integer into buffer aBuf.
  10793 */
  10794 static void zipfilePutU16(u8 *aBuf, u16 val){
  10795   aBuf[0] = val & 0xFF;
  10796   aBuf[1] = (val>>8) & 0xFF;
  10797 }
  10798 
  10799 /*
  10800 ** Write a 32-bit little endiate integer into buffer aBuf.
  10801 */
  10802 static void zipfilePutU32(u8 *aBuf, u32 val){
  10803   aBuf[0] = val & 0xFF;
  10804   aBuf[1] = (val>>8) & 0xFF;
  10805   aBuf[2] = (val>>16) & 0xFF;
  10806   aBuf[3] = (val>>24) & 0xFF;
  10807 }
  10808 
  10809 #define zipfileRead32(aBuf) ( aBuf+=4, zipfileGetU32(aBuf-4) )
  10810 #define zipfileRead16(aBuf) ( aBuf+=2, zipfileGetU16(aBuf-2) )
  10811 
  10812 #define zipfileWrite32(aBuf,val) { zipfilePutU32(aBuf,val); aBuf+=4; }
  10813 #define zipfileWrite16(aBuf,val) { zipfilePutU16(aBuf,val); aBuf+=2; }
  10814 
  10815 /*
  10816 ** Magic numbers used to read CDS records.
  10817 */
  10818 #define ZIPFILE_CDS_NFILE_OFF        28
  10819 #define ZIPFILE_CDS_SZCOMPRESSED_OFF 20
  10820 
  10821 /*
  10822 ** Decode the CDS record in buffer aBuf into (*pCDS). Return SQLITE_ERROR
  10823 ** if the record is not well-formed, or SQLITE_OK otherwise.
  10824 */
  10825 static int zipfileReadCDS(u8 *aBuf, ZipfileCDS *pCDS){
  10826   u8 *aRead = aBuf;
  10827   u32 sig = zipfileRead32(aRead);
  10828   int rc = SQLITE_OK;
  10829   if( sig!=ZIPFILE_SIGNATURE_CDS ){
  10830     rc = SQLITE_ERROR;
  10831   }else{
  10832     pCDS->iVersionMadeBy = zipfileRead16(aRead);
  10833     pCDS->iVersionExtract = zipfileRead16(aRead);
  10834     pCDS->flags = zipfileRead16(aRead);
  10835     pCDS->iCompression = zipfileRead16(aRead);
  10836     pCDS->mTime = zipfileRead16(aRead);
  10837     pCDS->mDate = zipfileRead16(aRead);
  10838     pCDS->crc32 = zipfileRead32(aRead);
  10839     pCDS->szCompressed = zipfileRead32(aRead);
  10840     pCDS->szUncompressed = zipfileRead32(aRead);
  10841     assert( aRead==&aBuf[ZIPFILE_CDS_NFILE_OFF] );
  10842     pCDS->nFile = zipfileRead16(aRead);
  10843     pCDS->nExtra = zipfileRead16(aRead);
  10844     pCDS->nComment = zipfileRead16(aRead);
  10845     pCDS->iDiskStart = zipfileRead16(aRead);
  10846     pCDS->iInternalAttr = zipfileRead16(aRead);
  10847     pCDS->iExternalAttr = zipfileRead32(aRead);
  10848     pCDS->iOffset = zipfileRead32(aRead);
  10849     assert( aRead==&aBuf[ZIPFILE_CDS_FIXED_SZ] );
  10850   }
  10851 
  10852   return rc;
  10853 }
  10854 
  10855 /*
  10856 ** Decode the LFH record in buffer aBuf into (*pLFH). Return SQLITE_ERROR
  10857 ** if the record is not well-formed, or SQLITE_OK otherwise.
  10858 */
  10859 static int zipfileReadLFH(
  10860   u8 *aBuffer,
  10861   ZipfileLFH *pLFH
  10862 ){
  10863   u8 *aRead = aBuffer;
  10864   int rc = SQLITE_OK;
  10865 
  10866   u32 sig = zipfileRead32(aRead);
  10867   if( sig!=ZIPFILE_SIGNATURE_LFH ){
  10868     rc = SQLITE_ERROR;
  10869   }else{
  10870     pLFH->iVersionExtract = zipfileRead16(aRead);
  10871     pLFH->flags = zipfileRead16(aRead);
  10872     pLFH->iCompression = zipfileRead16(aRead);
  10873     pLFH->mTime = zipfileRead16(aRead);
  10874     pLFH->mDate = zipfileRead16(aRead);
  10875     pLFH->crc32 = zipfileRead32(aRead);
  10876     pLFH->szCompressed = zipfileRead32(aRead);
  10877     pLFH->szUncompressed = zipfileRead32(aRead);
  10878     pLFH->nFile = zipfileRead16(aRead);
  10879     pLFH->nExtra = zipfileRead16(aRead);
  10880   }
  10881   return rc;
  10882 }
  10883 
  10884 
  10885 /*
  10886 ** Buffer aExtra (size nExtra bytes) contains zip archive "extra" fields.
  10887 ** Scan through this buffer to find an "extra-timestamp" field. If one
  10888 ** exists, extract the 32-bit modification-timestamp from it and store
  10889 ** the value in output parameter *pmTime.
  10890 **
  10891 ** Zero is returned if no extra-timestamp record could be found (and so
  10892 ** *pmTime is left unchanged), or non-zero otherwise.
  10893 **
  10894 ** The general format of an extra field is:
  10895 **
  10896 **   Header ID    2 bytes
  10897 **   Data Size    2 bytes
  10898 **   Data         N bytes
  10899 */
  10900 static int zipfileScanExtra(u8 *aExtra, int nExtra, u32 *pmTime){
  10901   int ret = 0;
  10902   u8 *p = aExtra;
  10903   u8 *pEnd = &aExtra[nExtra];
  10904 
  10905   while( p<pEnd ){
  10906     u16 id = zipfileRead16(p);
  10907     u16 nByte = zipfileRead16(p);
  10908 
  10909     switch( id ){
  10910       case ZIPFILE_EXTRA_TIMESTAMP: {
  10911         u8 b = p[0];
  10912         if( b & 0x01 ){     /* 0x01 -> modtime is present */
  10913           *pmTime = zipfileGetU32(&p[1]);
  10914           ret = 1;
  10915         }
  10916         break;
  10917       }
  10918     }
  10919 
  10920     p += nByte;
  10921   }
  10922   return ret;
  10923 }
  10924 
  10925 /*
  10926 ** Convert the standard MS-DOS timestamp stored in the mTime and mDate
  10927 ** fields of the CDS structure passed as the only argument to a 32-bit
  10928 ** UNIX seconds-since-the-epoch timestamp. Return the result.
  10929 **
  10930 ** "Standard" MS-DOS time format:
  10931 **
  10932 **   File modification time:
  10933 **     Bits 00-04: seconds divided by 2
  10934 **     Bits 05-10: minute
  10935 **     Bits 11-15: hour
  10936 **   File modification date:
  10937 **     Bits 00-04: day
  10938 **     Bits 05-08: month (1-12)
  10939 **     Bits 09-15: years from 1980 
  10940 **
  10941 ** https://msdn.microsoft.com/en-us/library/9kkf9tah.aspx
  10942 */
  10943 static u32 zipfileMtime(ZipfileCDS *pCDS){
  10944   int Y,M,D,X1,X2,A,B,sec,min,hr;
  10945   i64 JDsec;
  10946   Y = (1980 + ((pCDS->mDate >> 9) & 0x7F));
  10947   M = ((pCDS->mDate >> 5) & 0x0F);
  10948   D = (pCDS->mDate & 0x1F);
  10949   sec = (pCDS->mTime & 0x1F)*2;
  10950   min = (pCDS->mTime >> 5) & 0x3F;
  10951   hr = (pCDS->mTime >> 11) & 0x1F;
  10952   if( M<=2 ){
  10953     Y--;
  10954     M += 12;
  10955   }
  10956   X1 = 36525*(Y+4716)/100;
  10957   X2 = 306001*(M+1)/10000;
  10958   A = Y/100;
  10959   B = 2 - A + (A/4);
  10960   JDsec = (i64)((X1 + X2 + D + B - 1524.5)*86400) + hr*3600 + min*60 + sec;
  10961   return (u32)(JDsec - (i64)24405875*(i64)8640);
  10962 }
  10963 
  10964 /*
  10965 ** The opposite of zipfileMtime(). This function populates the mTime and
  10966 ** mDate fields of the CDS structure passed as the first argument according
  10967 ** to the UNIX timestamp value passed as the second.
  10968 */
  10969 static void zipfileMtimeToDos(ZipfileCDS *pCds, u32 mUnixTime){
  10970   /* Convert unix timestamp to JD (2440588 is noon on 1/1/1970) */
  10971   i64 JD = (i64)2440588 + mUnixTime / (24*60*60);
  10972 
  10973   int A, B, C, D, E;
  10974   int yr, mon, day;
  10975   int hr, min, sec;
  10976 
  10977   A = (int)((JD - 1867216.25)/36524.25);
  10978   A = (int)(JD + 1 + A - (A/4));
  10979   B = A + 1524;
  10980   C = (int)((B - 122.1)/365.25);
  10981   D = (36525*(C&32767))/100;
  10982   E = (int)((B-D)/30.6001);
  10983 
  10984   day = B - D - (int)(30.6001*E);
  10985   mon = (E<14 ? E-1 : E-13);
  10986   yr = mon>2 ? C-4716 : C-4715;
  10987 
  10988   hr = (mUnixTime % (24*60*60)) / (60*60);
  10989   min = (mUnixTime % (60*60)) / 60;
  10990   sec = (mUnixTime % 60);
  10991 
  10992   if( yr>=1980 ){
  10993     pCds->mDate = (u16)(day + (mon << 5) + ((yr-1980) << 9));
  10994     pCds->mTime = (u16)(sec/2 + (min<<5) + (hr<<11));
  10995   }else{
  10996     pCds->mDate = pCds->mTime = 0;
  10997   }
  10998 
  10999   assert( mUnixTime<315507600 
  11000        || mUnixTime==zipfileMtime(pCds) 
  11001        || ((mUnixTime % 2) && mUnixTime-1==zipfileMtime(pCds)) 
  11002        /* || (mUnixTime % 2) */
  11003   );
  11004 }
  11005 
  11006 /*
  11007 ** If aBlob is not NULL, then it is a pointer to a buffer (nBlob bytes in
  11008 ** size) containing an entire zip archive image. Or, if aBlob is NULL,
  11009 ** then pFile is a file-handle open on a zip file. In either case, this
  11010 ** function creates a ZipfileEntry object based on the zip archive entry
  11011 ** for which the CDS record is at offset iOff.
  11012 **
  11013 ** If successful, SQLITE_OK is returned and (*ppEntry) set to point to
  11014 ** the new object. Otherwise, an SQLite error code is returned and the
  11015 ** final value of (*ppEntry) undefined.
  11016 */
  11017 static int zipfileGetEntry(
  11018   ZipfileTab *pTab,               /* Store any error message here */
  11019   const u8 *aBlob,                /* Pointer to in-memory file image */
  11020   int nBlob,                      /* Size of aBlob[] in bytes */
  11021   FILE *pFile,                    /* If aBlob==0, read from this file */
  11022   i64 iOff,                       /* Offset of CDS record */
  11023   ZipfileEntry **ppEntry          /* OUT: Pointer to new object */
  11024 ){
  11025   u8 *aRead;
  11026   char **pzErr = &pTab->base.zErrMsg;
  11027   int rc = SQLITE_OK;
  11028   (void)nBlob;
  11029 
  11030   if( aBlob==0 ){
  11031     aRead = pTab->aBuffer;
  11032     rc = zipfileReadData(pFile, aRead, ZIPFILE_CDS_FIXED_SZ, iOff, pzErr);
  11033   }else{
  11034     aRead = (u8*)&aBlob[iOff];
  11035   }
  11036 
  11037   if( rc==SQLITE_OK ){
  11038     sqlite3_int64 nAlloc;
  11039     ZipfileEntry *pNew;
  11040 
  11041     int nFile = zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF]);
  11042     int nExtra = zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF+2]);
  11043     nExtra += zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF+4]);
  11044 
  11045     nAlloc = sizeof(ZipfileEntry) + nExtra;
  11046     if( aBlob ){
  11047       nAlloc += zipfileGetU32(&aRead[ZIPFILE_CDS_SZCOMPRESSED_OFF]);
  11048     }
  11049 
  11050     pNew = (ZipfileEntry*)sqlite3_malloc64(nAlloc);
  11051     if( pNew==0 ){
  11052       rc = SQLITE_NOMEM;
  11053     }else{
  11054       memset(pNew, 0, sizeof(ZipfileEntry));
  11055       rc = zipfileReadCDS(aRead, &pNew->cds);
  11056       if( rc!=SQLITE_OK ){
  11057         *pzErr = sqlite3_mprintf("failed to read CDS at offset %lld", iOff);
  11058       }else if( aBlob==0 ){
  11059         rc = zipfileReadData(
  11060             pFile, aRead, nExtra+nFile, iOff+ZIPFILE_CDS_FIXED_SZ, pzErr
  11061         );
  11062       }else{
  11063         aRead = (u8*)&aBlob[iOff + ZIPFILE_CDS_FIXED_SZ];
  11064       }
  11065     }
  11066 
  11067     if( rc==SQLITE_OK ){
  11068       u32 *pt = &pNew->mUnixTime;
  11069       pNew->cds.zFile = sqlite3_mprintf("%.*s", nFile, aRead); 
  11070       pNew->aExtra = (u8*)&pNew[1];
  11071       memcpy(pNew->aExtra, &aRead[nFile], nExtra);
  11072       if( pNew->cds.zFile==0 ){
  11073         rc = SQLITE_NOMEM;
  11074       }else if( 0==zipfileScanExtra(&aRead[nFile], pNew->cds.nExtra, pt) ){
  11075         pNew->mUnixTime = zipfileMtime(&pNew->cds);
  11076       }
  11077     }
  11078 
  11079     if( rc==SQLITE_OK ){
  11080       static const int szFix = ZIPFILE_LFH_FIXED_SZ;
  11081       ZipfileLFH lfh;
  11082       if( pFile ){
  11083         rc = zipfileReadData(pFile, aRead, szFix, pNew->cds.iOffset, pzErr);
  11084       }else{
  11085         aRead = (u8*)&aBlob[pNew->cds.iOffset];
  11086       }
  11087 
  11088       if( rc==SQLITE_OK ) rc = zipfileReadLFH(aRead, &lfh);
  11089       if( rc==SQLITE_OK ){
  11090         pNew->iDataOff =  pNew->cds.iOffset + ZIPFILE_LFH_FIXED_SZ;
  11091         pNew->iDataOff += lfh.nFile + lfh.nExtra;
  11092         if( aBlob && pNew->cds.szCompressed ){
  11093           pNew->aData = &pNew->aExtra[nExtra];
  11094           memcpy(pNew->aData, &aBlob[pNew->iDataOff], pNew->cds.szCompressed);
  11095         }
  11096       }else{
  11097         *pzErr = sqlite3_mprintf("failed to read LFH at offset %d", 
  11098             (int)pNew->cds.iOffset
  11099         );
  11100       }
  11101     }
  11102 
  11103     if( rc!=SQLITE_OK ){
  11104       zipfileEntryFree(pNew);
  11105     }else{
  11106       *ppEntry = pNew;
  11107     }
  11108   }
  11109 
  11110   return rc;
  11111 }
  11112 
  11113 /*
  11114 ** Advance an ZipfileCsr to its next row of output.
  11115 */
  11116 static int zipfileNext(sqlite3_vtab_cursor *cur){
  11117   ZipfileCsr *pCsr = (ZipfileCsr*)cur;
  11118   int rc = SQLITE_OK;
  11119 
  11120   if( pCsr->pFile ){
  11121     i64 iEof = pCsr->eocd.iOffset + pCsr->eocd.nSize;
  11122     zipfileEntryFree(pCsr->pCurrent);
  11123     pCsr->pCurrent = 0;
  11124     if( pCsr->iNextOff>=iEof ){
  11125       pCsr->bEof = 1;
  11126     }else{
  11127       ZipfileEntry *p = 0;
  11128       ZipfileTab *pTab = (ZipfileTab*)(cur->pVtab);
  11129       rc = zipfileGetEntry(pTab, 0, 0, pCsr->pFile, pCsr->iNextOff, &p);
  11130       if( rc==SQLITE_OK ){
  11131         pCsr->iNextOff += ZIPFILE_CDS_FIXED_SZ;
  11132         pCsr->iNextOff += (int)p->cds.nExtra + p->cds.nFile + p->cds.nComment;
  11133       }
  11134       pCsr->pCurrent = p;
  11135     }
  11136   }else{
  11137     if( !pCsr->bNoop ){
  11138       pCsr->pCurrent = pCsr->pCurrent->pNext;
  11139     }
  11140     if( pCsr->pCurrent==0 ){
  11141       pCsr->bEof = 1;
  11142     }
  11143   }
  11144 
  11145   pCsr->bNoop = 0;
  11146   return rc;
  11147 }
  11148 
  11149 static void zipfileFree(void *p) { 
  11150   sqlite3_free(p); 
  11151 }
  11152 
  11153 /*
  11154 ** Buffer aIn (size nIn bytes) contains compressed data. Uncompressed, the
  11155 ** size is nOut bytes. This function uncompresses the data and sets the
  11156 ** return value in context pCtx to the result (a blob).
  11157 **
  11158 ** If an error occurs, an error code is left in pCtx instead.
  11159 */
  11160 static void zipfileInflate(
  11161   sqlite3_context *pCtx,          /* Store result here */
  11162   const u8 *aIn,                  /* Compressed data */
  11163   int nIn,                        /* Size of buffer aIn[] in bytes */
  11164   int nOut                        /* Expected output size */
  11165 ){
  11166   u8 *aRes = sqlite3_malloc(nOut);
  11167   if( aRes==0 ){
  11168     sqlite3_result_error_nomem(pCtx);
  11169   }else{
  11170     int err;
  11171     z_stream str;
  11172     memset(&str, 0, sizeof(str));
  11173 
  11174     str.next_in = (Byte*)aIn;
  11175     str.avail_in = nIn;
  11176     str.next_out = (Byte*)aRes;
  11177     str.avail_out = nOut;
  11178 
  11179     err = inflateInit2(&str, -15);
  11180     if( err!=Z_OK ){
  11181       zipfileCtxErrorMsg(pCtx, "inflateInit2() failed (%d)", err);
  11182     }else{
  11183       err = inflate(&str, Z_NO_FLUSH);
  11184       if( err!=Z_STREAM_END ){
  11185         zipfileCtxErrorMsg(pCtx, "inflate() failed (%d)", err);
  11186       }else{
  11187         sqlite3_result_blob(pCtx, aRes, nOut, zipfileFree);
  11188         aRes = 0;
  11189       }
  11190     }
  11191     sqlite3_free(aRes);
  11192     inflateEnd(&str);
  11193   }
  11194 }
  11195 
  11196 /*
  11197 ** Buffer aIn (size nIn bytes) contains uncompressed data. This function
  11198 ** compresses it and sets (*ppOut) to point to a buffer containing the
  11199 ** compressed data. The caller is responsible for eventually calling
  11200 ** sqlite3_free() to release buffer (*ppOut). Before returning, (*pnOut) 
  11201 ** is set to the size of buffer (*ppOut) in bytes.
  11202 **
  11203 ** If no error occurs, SQLITE_OK is returned. Otherwise, an SQLite error
  11204 ** code is returned and an error message left in virtual-table handle
  11205 ** pTab. The values of (*ppOut) and (*pnOut) are left unchanged in this
  11206 ** case.
  11207 */
  11208 static int zipfileDeflate(
  11209   const u8 *aIn, int nIn,         /* Input */
  11210   u8 **ppOut, int *pnOut,         /* Output */
  11211   char **pzErr                    /* OUT: Error message */
  11212 ){
  11213   int rc = SQLITE_OK;
  11214   sqlite3_int64 nAlloc;
  11215   z_stream str;
  11216   u8 *aOut;
  11217 
  11218   memset(&str, 0, sizeof(str));
  11219   str.next_in = (Bytef*)aIn;
  11220   str.avail_in = nIn;
  11221   deflateInit2(&str, 9, Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY);
  11222 
  11223   nAlloc = deflateBound(&str, nIn);
  11224   aOut = (u8*)sqlite3_malloc64(nAlloc);
  11225   if( aOut==0 ){
  11226     rc = SQLITE_NOMEM;
  11227   }else{
  11228     int res;
  11229     str.next_out = aOut;
  11230     str.avail_out = nAlloc;
  11231     res = deflate(&str, Z_FINISH);
  11232     if( res==Z_STREAM_END ){
  11233       *ppOut = aOut;
  11234       *pnOut = (int)str.total_out;
  11235     }else{
  11236       sqlite3_free(aOut);
  11237       *pzErr = sqlite3_mprintf("zipfile: deflate() error");
  11238       rc = SQLITE_ERROR;
  11239     }
  11240     deflateEnd(&str);
  11241   }
  11242 
  11243   return rc;
  11244 }
  11245 
  11246 
  11247 /*
  11248 ** Return values of columns for the row at which the series_cursor
  11249 ** is currently pointing.
  11250 */
  11251 static int zipfileColumn(
  11252   sqlite3_vtab_cursor *cur,   /* The cursor */
  11253   sqlite3_context *ctx,       /* First argument to sqlite3_result_...() */
  11254   int i                       /* Which column to return */
  11255 ){
  11256   ZipfileCsr *pCsr = (ZipfileCsr*)cur;
  11257   ZipfileCDS *pCDS = &pCsr->pCurrent->cds;
  11258   int rc = SQLITE_OK;
  11259   switch( i ){
  11260     case 0:   /* name */
  11261       sqlite3_result_text(ctx, pCDS->zFile, -1, SQLITE_TRANSIENT);
  11262       break;
  11263     case 1:   /* mode */
  11264       /* TODO: Whether or not the following is correct surely depends on
  11265       ** the platform on which the archive was created.  */
  11266       sqlite3_result_int(ctx, pCDS->iExternalAttr >> 16);
  11267       break;
  11268     case 2: { /* mtime */
  11269       sqlite3_result_int64(ctx, pCsr->pCurrent->mUnixTime);
  11270       break;
  11271     }
  11272     case 3: { /* sz */
  11273       if( sqlite3_vtab_nochange(ctx)==0 ){
  11274         sqlite3_result_int64(ctx, pCDS->szUncompressed);
  11275       }
  11276       break;
  11277     }
  11278     case 4:   /* rawdata */
  11279       if( sqlite3_vtab_nochange(ctx) ) break;
  11280     case 5: { /* data */
  11281       if( i==4 || pCDS->iCompression==0 || pCDS->iCompression==8 ){
  11282         int sz = pCDS->szCompressed;
  11283         int szFinal = pCDS->szUncompressed;
  11284         if( szFinal>0 ){
  11285           u8 *aBuf;
  11286           u8 *aFree = 0;
  11287           if( pCsr->pCurrent->aData ){
  11288             aBuf = pCsr->pCurrent->aData;
  11289           }else{
  11290             aBuf = aFree = sqlite3_malloc64(sz);
  11291             if( aBuf==0 ){
  11292               rc = SQLITE_NOMEM;
  11293             }else{
  11294               FILE *pFile = pCsr->pFile;
  11295               if( pFile==0 ){
  11296                 pFile = ((ZipfileTab*)(pCsr->base.pVtab))->pWriteFd;
  11297               }
  11298               rc = zipfileReadData(pFile, aBuf, sz, pCsr->pCurrent->iDataOff,
  11299                   &pCsr->base.pVtab->zErrMsg
  11300               );
  11301             }
  11302           }
  11303           if( rc==SQLITE_OK ){
  11304             if( i==5 && pCDS->iCompression ){
  11305               zipfileInflate(ctx, aBuf, sz, szFinal);
  11306             }else{
  11307               sqlite3_result_blob(ctx, aBuf, sz, SQLITE_TRANSIENT);
  11308             }
  11309           }
  11310           sqlite3_free(aFree);
  11311         }else{
  11312           /* Figure out if this is a directory or a zero-sized file. Consider
  11313           ** it to be a directory either if the mode suggests so, or if
  11314           ** the final character in the name is '/'.  */
  11315           u32 mode = pCDS->iExternalAttr >> 16;
  11316           if( !(mode & S_IFDIR)
  11317            && pCDS->nFile>=1
  11318            && pCDS->zFile[pCDS->nFile-1]!='/'
  11319           ){
  11320             sqlite3_result_blob(ctx, "", 0, SQLITE_STATIC);
  11321           }
  11322         }
  11323       }
  11324       break;
  11325     }
  11326     case 6:   /* method */
  11327       sqlite3_result_int(ctx, pCDS->iCompression);
  11328       break;
  11329     default:  /* z */
  11330       assert( i==7 );
  11331       sqlite3_result_int64(ctx, pCsr->iId);
  11332       break;
  11333   }
  11334 
  11335   return rc;
  11336 }
  11337 
  11338 /*
  11339 ** Return TRUE if the cursor is at EOF.
  11340 */
  11341 static int zipfileEof(sqlite3_vtab_cursor *cur){
  11342   ZipfileCsr *pCsr = (ZipfileCsr*)cur;
  11343   return pCsr->bEof;
  11344 }
  11345 
  11346 /*
  11347 ** If aBlob is not NULL, then it points to a buffer nBlob bytes in size
  11348 ** containing an entire zip archive image. Or, if aBlob is NULL, then pFile
  11349 ** is guaranteed to be a file-handle open on a zip file.
  11350 **
  11351 ** This function attempts to locate the EOCD record within the zip archive
  11352 ** and populate *pEOCD with the results of decoding it. SQLITE_OK is
  11353 ** returned if successful. Otherwise, an SQLite error code is returned and
  11354 ** an English language error message may be left in virtual-table pTab.
  11355 */
  11356 static int zipfileReadEOCD(
  11357   ZipfileTab *pTab,               /* Return errors here */
  11358   const u8 *aBlob,                /* Pointer to in-memory file image */
  11359   int nBlob,                      /* Size of aBlob[] in bytes */
  11360   FILE *pFile,                    /* Read from this file if aBlob==0 */
  11361   ZipfileEOCD *pEOCD              /* Object to populate */
  11362 ){
  11363   u8 *aRead = pTab->aBuffer;      /* Temporary buffer */
  11364   int nRead;                      /* Bytes to read from file */
  11365   int rc = SQLITE_OK;
  11366 
  11367   memset(pEOCD, 0, sizeof(ZipfileEOCD));
  11368   if( aBlob==0 ){
  11369     i64 iOff;                     /* Offset to read from */
  11370     i64 szFile;                   /* Total size of file in bytes */
  11371     fseek(pFile, 0, SEEK_END);
  11372     szFile = (i64)ftell(pFile);
  11373     if( szFile==0 ){
  11374       return SQLITE_OK;
  11375     }
  11376     nRead = (int)(MIN(szFile, ZIPFILE_BUFFER_SIZE));
  11377     iOff = szFile - nRead;
  11378     rc = zipfileReadData(pFile, aRead, nRead, iOff, &pTab->base.zErrMsg);
  11379   }else{
  11380     nRead = (int)(MIN(nBlob, ZIPFILE_BUFFER_SIZE));
  11381     aRead = (u8*)&aBlob[nBlob-nRead];
  11382   }
  11383 
  11384   if( rc==SQLITE_OK ){
  11385     int i;
  11386 
  11387     /* Scan backwards looking for the signature bytes */
  11388     for(i=nRead-20; i>=0; i--){
  11389       if( aRead[i]==0x50 && aRead[i+1]==0x4b 
  11390        && aRead[i+2]==0x05 && aRead[i+3]==0x06 
  11391       ){
  11392         break;
  11393       }
  11394     }
  11395     if( i<0 ){
  11396       pTab->base.zErrMsg = sqlite3_mprintf(
  11397           "cannot find end of central directory record"
  11398       );
  11399       return SQLITE_ERROR;
  11400     }
  11401 
  11402     aRead += i+4;
  11403     pEOCD->iDisk = zipfileRead16(aRead);
  11404     pEOCD->iFirstDisk = zipfileRead16(aRead);
  11405     pEOCD->nEntry = zipfileRead16(aRead);
  11406     pEOCD->nEntryTotal = zipfileRead16(aRead);
  11407     pEOCD->nSize = zipfileRead32(aRead);
  11408     pEOCD->iOffset = zipfileRead32(aRead);
  11409   }
  11410 
  11411   return rc;
  11412 }
  11413 
  11414 /*
  11415 ** Add object pNew to the linked list that begins at ZipfileTab.pFirstEntry 
  11416 ** and ends with pLastEntry. If argument pBefore is NULL, then pNew is added
  11417 ** to the end of the list. Otherwise, it is added to the list immediately
  11418 ** before pBefore (which is guaranteed to be a part of said list).
  11419 */
  11420 static void zipfileAddEntry(
  11421   ZipfileTab *pTab, 
  11422   ZipfileEntry *pBefore, 
  11423   ZipfileEntry *pNew
  11424 ){
  11425   assert( (pTab->pFirstEntry==0)==(pTab->pLastEntry==0) );
  11426   assert( pNew->pNext==0 );
  11427   if( pBefore==0 ){
  11428     if( pTab->pFirstEntry==0 ){
  11429       pTab->pFirstEntry = pTab->pLastEntry = pNew;
  11430     }else{
  11431       assert( pTab->pLastEntry->pNext==0 );
  11432       pTab->pLastEntry->pNext = pNew;
  11433       pTab->pLastEntry = pNew;
  11434     }
  11435   }else{
  11436     ZipfileEntry **pp;
  11437     for(pp=&pTab->pFirstEntry; *pp!=pBefore; pp=&((*pp)->pNext));
  11438     pNew->pNext = pBefore;
  11439     *pp = pNew;
  11440   }
  11441 }
  11442 
  11443 static int zipfileLoadDirectory(ZipfileTab *pTab, const u8 *aBlob, int nBlob){
  11444   ZipfileEOCD eocd;
  11445   int rc;
  11446   int i;
  11447   i64 iOff;
  11448 
  11449   rc = zipfileReadEOCD(pTab, aBlob, nBlob, pTab->pWriteFd, &eocd);
  11450   iOff = eocd.iOffset;
  11451   for(i=0; rc==SQLITE_OK && i<eocd.nEntry; i++){
  11452     ZipfileEntry *pNew = 0;
  11453     rc = zipfileGetEntry(pTab, aBlob, nBlob, pTab->pWriteFd, iOff, &pNew);
  11454 
  11455     if( rc==SQLITE_OK ){
  11456       zipfileAddEntry(pTab, 0, pNew);
  11457       iOff += ZIPFILE_CDS_FIXED_SZ;
  11458       iOff += (int)pNew->cds.nExtra + pNew->cds.nFile + pNew->cds.nComment;
  11459     }
  11460   }
  11461   return rc;
  11462 }
  11463 
  11464 /*
  11465 ** xFilter callback.
  11466 */
  11467 static int zipfileFilter(
  11468   sqlite3_vtab_cursor *cur, 
  11469   int idxNum, const char *idxStr,
  11470   int argc, sqlite3_value **argv
  11471 ){
  11472   ZipfileTab *pTab = (ZipfileTab*)cur->pVtab;
  11473   ZipfileCsr *pCsr = (ZipfileCsr*)cur;
  11474   const char *zFile = 0;          /* Zip file to scan */
  11475   int rc = SQLITE_OK;             /* Return Code */
  11476   int bInMemory = 0;              /* True for an in-memory zipfile */
  11477 
  11478   (void)idxStr;
  11479   (void)argc;
  11480 
  11481   zipfileResetCursor(pCsr);
  11482 
  11483   if( pTab->zFile ){
  11484     zFile = pTab->zFile;
  11485   }else if( idxNum==0 ){
  11486     zipfileCursorErr(pCsr, "zipfile() function requires an argument");
  11487     return SQLITE_ERROR;
  11488   }else if( sqlite3_value_type(argv[0])==SQLITE_BLOB ){
  11489     static const u8 aEmptyBlob = 0;
  11490     const u8 *aBlob = (const u8*)sqlite3_value_blob(argv[0]);
  11491     int nBlob = sqlite3_value_bytes(argv[0]);
  11492     assert( pTab->pFirstEntry==0 );
  11493     if( aBlob==0 ){
  11494       aBlob = &aEmptyBlob;
  11495       nBlob = 0;
  11496     }
  11497     rc = zipfileLoadDirectory(pTab, aBlob, nBlob);
  11498     pCsr->pFreeEntry = pTab->pFirstEntry;
  11499     pTab->pFirstEntry = pTab->pLastEntry = 0;
  11500     if( rc!=SQLITE_OK ) return rc;
  11501     bInMemory = 1;
  11502   }else{
  11503     zFile = (const char*)sqlite3_value_text(argv[0]);
  11504   }
  11505 
  11506   if( 0==pTab->pWriteFd && 0==bInMemory ){
  11507     pCsr->pFile = zFile ? sqlite3_fopen(zFile, "rb") : 0;
  11508     if( pCsr->pFile==0 ){
  11509       zipfileCursorErr(pCsr, "cannot open file: %s", zFile);
  11510       rc = SQLITE_ERROR;
  11511     }else{
  11512       rc = zipfileReadEOCD(pTab, 0, 0, pCsr->pFile, &pCsr->eocd);
  11513       if( rc==SQLITE_OK ){
  11514         if( pCsr->eocd.nEntry==0 ){
  11515           pCsr->bEof = 1;
  11516         }else{
  11517           pCsr->iNextOff = pCsr->eocd.iOffset;
  11518           rc = zipfileNext(cur);
  11519         }
  11520       }
  11521     }
  11522   }else{
  11523     pCsr->bNoop = 1;
  11524     pCsr->pCurrent = pCsr->pFreeEntry ? pCsr->pFreeEntry : pTab->pFirstEntry;
  11525     rc = zipfileNext(cur);
  11526   }
  11527 
  11528   return rc;
  11529 }
  11530 
  11531 /*
  11532 ** xBestIndex callback.
  11533 */
  11534 static int zipfileBestIndex(
  11535   sqlite3_vtab *tab,
  11536   sqlite3_index_info *pIdxInfo
  11537 ){
  11538   int i;
  11539   int idx = -1;
  11540   int unusable = 0;
  11541   (void)tab;
  11542 
  11543   for(i=0; i<pIdxInfo->nConstraint; i++){
  11544     const struct sqlite3_index_constraint *pCons = &pIdxInfo->aConstraint[i];
  11545     if( pCons->iColumn!=ZIPFILE_F_COLUMN_IDX ) continue;
  11546     if( pCons->usable==0 ){
  11547       unusable = 1;
  11548     }else if( pCons->op==SQLITE_INDEX_CONSTRAINT_EQ ){
  11549       idx = i;
  11550     }
  11551   }
  11552   pIdxInfo->estimatedCost = 1000.0;
  11553   if( idx>=0 ){
  11554     pIdxInfo->aConstraintUsage[idx].argvIndex = 1;
  11555     pIdxInfo->aConstraintUsage[idx].omit = 1;
  11556     pIdxInfo->idxNum = 1;
  11557   }else if( unusable ){
  11558     return SQLITE_CONSTRAINT;
  11559   }
  11560   return SQLITE_OK;
  11561 }
  11562 
  11563 static ZipfileEntry *zipfileNewEntry(const char *zPath){
  11564   ZipfileEntry *pNew;
  11565   pNew = sqlite3_malloc(sizeof(ZipfileEntry));
  11566   if( pNew ){
  11567     memset(pNew, 0, sizeof(ZipfileEntry));
  11568     pNew->cds.zFile = sqlite3_mprintf("%s", zPath);
  11569     if( pNew->cds.zFile==0 ){
  11570       sqlite3_free(pNew);
  11571       pNew = 0;
  11572     }
  11573   }
  11574   return pNew;
  11575 }
  11576 
  11577 static int zipfileSerializeLFH(ZipfileEntry *pEntry, u8 *aBuf){
  11578   ZipfileCDS *pCds = &pEntry->cds;
  11579   u8 *a = aBuf;
  11580 
  11581   pCds->nExtra = 9;
  11582 
  11583   /* Write the LFH itself */
  11584   zipfileWrite32(a, ZIPFILE_SIGNATURE_LFH);
  11585   zipfileWrite16(a, pCds->iVersionExtract);
  11586   zipfileWrite16(a, pCds->flags);
  11587   zipfileWrite16(a, pCds->iCompression);
  11588   zipfileWrite16(a, pCds->mTime);
  11589   zipfileWrite16(a, pCds->mDate);
  11590   zipfileWrite32(a, pCds->crc32);
  11591   zipfileWrite32(a, pCds->szCompressed);
  11592   zipfileWrite32(a, pCds->szUncompressed);
  11593   zipfileWrite16(a, (u16)pCds->nFile);
  11594   zipfileWrite16(a, pCds->nExtra);
  11595   assert( a==&aBuf[ZIPFILE_LFH_FIXED_SZ] );
  11596 
  11597   /* Add the file name */
  11598   memcpy(a, pCds->zFile, (int)pCds->nFile);
  11599   a += (int)pCds->nFile;
  11600 
  11601   /* The "extra" data */
  11602   zipfileWrite16(a, ZIPFILE_EXTRA_TIMESTAMP);
  11603   zipfileWrite16(a, 5);
  11604   *a++ = 0x01;
  11605   zipfileWrite32(a, pEntry->mUnixTime);
  11606 
  11607   return a-aBuf;
  11608 }
  11609 
  11610 static int zipfileAppendEntry(
  11611   ZipfileTab *pTab,
  11612   ZipfileEntry *pEntry,
  11613   const u8 *pData,
  11614   int nData
  11615 ){
  11616   u8 *aBuf = pTab->aBuffer;
  11617   int nBuf;
  11618   int rc;
  11619 
  11620   nBuf = zipfileSerializeLFH(pEntry, aBuf);
  11621   rc = zipfileAppendData(pTab, aBuf, nBuf);
  11622   if( rc==SQLITE_OK ){
  11623     pEntry->iDataOff = pTab->szCurrent;
  11624     rc = zipfileAppendData(pTab, pData, nData);
  11625   }
  11626 
  11627   return rc;
  11628 }
  11629 
  11630 static int zipfileGetMode(
  11631   sqlite3_value *pVal, 
  11632   int bIsDir,                     /* If true, default to directory */
  11633   u32 *pMode,                     /* OUT: Mode value */
  11634   char **pzErr                    /* OUT: Error message */
  11635 ){
  11636   const char *z = (const char*)sqlite3_value_text(pVal);
  11637   u32 mode = 0;
  11638   if( z==0 ){
  11639     mode = (bIsDir ? (S_IFDIR + 0755) : (S_IFREG + 0644));
  11640   }else if( z[0]>='0' && z[0]<='9' ){
  11641     mode = (unsigned int)sqlite3_value_int(pVal);
  11642   }else{
  11643     const char zTemplate[11] = "-rwxrwxrwx";
  11644     int i;
  11645     if( strlen(z)!=10 ) goto parse_error;
  11646     switch( z[0] ){
  11647       case '-': mode |= S_IFREG; break;
  11648       case 'd': mode |= S_IFDIR; break;
  11649       case 'l': mode |= S_IFLNK; break;
  11650       default: goto parse_error;
  11651     }
  11652     for(i=1; i<10; i++){
  11653       if( z[i]==zTemplate[i] ) mode |= 1 << (9-i);
  11654       else if( z[i]!='-' ) goto parse_error;
  11655     }
  11656   }
  11657   if( ((mode & S_IFDIR)==0)==bIsDir ){
  11658     /* The "mode" attribute is a directory, but data has been specified.
  11659     ** Or vice-versa - no data but "mode" is a file or symlink.  */
  11660     *pzErr = sqlite3_mprintf("zipfile: mode does not match data");
  11661     return SQLITE_CONSTRAINT;
  11662   }
  11663   *pMode = mode;
  11664   return SQLITE_OK;
  11665 
  11666  parse_error:
  11667   *pzErr = sqlite3_mprintf("zipfile: parse error in mode: %s", z);
  11668   return SQLITE_ERROR;
  11669 }
  11670 
  11671 /*
  11672 ** Both (const char*) arguments point to nul-terminated strings. Argument
  11673 ** nB is the value of strlen(zB). This function returns 0 if the strings are
  11674 ** identical, ignoring any trailing '/' character in either path.  */
  11675 static int zipfileComparePath(const char *zA, const char *zB, int nB){
  11676   int nA = (int)strlen(zA);
  11677   if( nA>0 && zA[nA-1]=='/' ) nA--;
  11678   if( nB>0 && zB[nB-1]=='/' ) nB--;
  11679   if( nA==nB && memcmp(zA, zB, nA)==0 ) return 0;
  11680   return 1;
  11681 }
  11682 
  11683 static int zipfileBegin(sqlite3_vtab *pVtab){
  11684   ZipfileTab *pTab = (ZipfileTab*)pVtab;
  11685   int rc = SQLITE_OK;
  11686 
  11687   assert( pTab->pWriteFd==0 );
  11688   if( pTab->zFile==0 || pTab->zFile[0]==0 ){
  11689     pTab->base.zErrMsg = sqlite3_mprintf("zipfile: missing filename");
  11690     return SQLITE_ERROR;
  11691   }
  11692 
  11693   /* Open a write fd on the file. Also load the entire central directory
  11694   ** structure into memory. During the transaction any new file data is 
  11695   ** appended to the archive file, but the central directory is accumulated
  11696   ** in main-memory until the transaction is committed.  */
  11697   pTab->pWriteFd = sqlite3_fopen(pTab->zFile, "ab+");
  11698   if( pTab->pWriteFd==0 ){
  11699     pTab->base.zErrMsg = sqlite3_mprintf(
  11700         "zipfile: failed to open file %s for writing", pTab->zFile
  11701         );
  11702     rc = SQLITE_ERROR;
  11703   }else{
  11704     fseek(pTab->pWriteFd, 0, SEEK_END);
  11705     pTab->szCurrent = pTab->szOrig = (i64)ftell(pTab->pWriteFd);
  11706     rc = zipfileLoadDirectory(pTab, 0, 0);
  11707   }
  11708 
  11709   if( rc!=SQLITE_OK ){
  11710     zipfileCleanupTransaction(pTab);
  11711   }
  11712 
  11713   return rc;
  11714 }
  11715 
  11716 /*
  11717 ** Return the current time as a 32-bit timestamp in UNIX epoch format (like
  11718 ** time(2)).
  11719 */
  11720 static u32 zipfileTime(void){
  11721   sqlite3_vfs *pVfs = sqlite3_vfs_find(0);
  11722   u32 ret;
  11723   if( pVfs==0 ) return 0;
  11724   if( pVfs->iVersion>=2 && pVfs->xCurrentTimeInt64 ){
  11725     i64 ms;
  11726     pVfs->xCurrentTimeInt64(pVfs, &ms);
  11727     ret = (u32)((ms/1000) - ((i64)24405875 * 8640));
  11728   }else{
  11729     double day;
  11730     pVfs->xCurrentTime(pVfs, &day);
  11731     ret = (u32)((day - 2440587.5) * 86400);
  11732   }
  11733   return ret;
  11734 }
  11735 
  11736 /*
  11737 ** Return a 32-bit timestamp in UNIX epoch format.
  11738 **
  11739 ** If the value passed as the only argument is either NULL or an SQL NULL,
  11740 ** return the current time. Otherwise, return the value stored in (*pVal)
  11741 ** cast to a 32-bit unsigned integer.
  11742 */
  11743 static u32 zipfileGetTime(sqlite3_value *pVal){
  11744   if( pVal==0 || sqlite3_value_type(pVal)==SQLITE_NULL ){
  11745     return zipfileTime();
  11746   }
  11747   return (u32)sqlite3_value_int64(pVal);
  11748 }
  11749 
  11750 /*
  11751 ** Unless it is NULL, entry pOld is currently part of the pTab->pFirstEntry
  11752 ** linked list.  Remove it from the list and free the object.
  11753 */
  11754 static void zipfileRemoveEntryFromList(ZipfileTab *pTab, ZipfileEntry *pOld){
  11755   if( pOld ){
  11756     if( pTab->pFirstEntry==pOld ){
  11757       pTab->pFirstEntry = pOld->pNext;
  11758       if( pTab->pLastEntry==pOld ) pTab->pLastEntry = 0;
  11759     }else{
  11760       ZipfileEntry *p;
  11761       for(p=pTab->pFirstEntry; p; p=p->pNext){
  11762         if( p->pNext==pOld ){
  11763           p->pNext = pOld->pNext;
  11764           if( pTab->pLastEntry==pOld ) pTab->pLastEntry = p;
  11765           break;
  11766         }
  11767       }
  11768     }
  11769     zipfileEntryFree(pOld);
  11770   }
  11771 }
  11772 
  11773 /*
  11774 ** xUpdate method.
  11775 */
  11776 static int zipfileUpdate(
  11777   sqlite3_vtab *pVtab, 
  11778   int nVal, 
  11779   sqlite3_value **apVal, 
  11780   sqlite_int64 *pRowid
  11781 ){
  11782   ZipfileTab *pTab = (ZipfileTab*)pVtab;
  11783   int rc = SQLITE_OK;             /* Return Code */
  11784   ZipfileEntry *pNew = 0;         /* New in-memory CDS entry */
  11785 
  11786   u32 mode = 0;                   /* Mode for new entry */
  11787   u32 mTime = 0;                  /* Modification time for new entry */
  11788   i64 sz = 0;                     /* Uncompressed size */
  11789   const char *zPath = 0;          /* Path for new entry */
  11790   int nPath = 0;                  /* strlen(zPath) */
  11791   const u8 *pData = 0;            /* Pointer to buffer containing content */
  11792   int nData = 0;                  /* Size of pData buffer in bytes */
  11793   int iMethod = 0;                /* Compression method for new entry */
  11794   u8 *pFree = 0;                  /* Free this */
  11795   char *zFree = 0;                /* Also free this */
  11796   ZipfileEntry *pOld = 0;
  11797   ZipfileEntry *pOld2 = 0;
  11798   int bUpdate = 0;                /* True for an update that modifies "name" */
  11799   int bIsDir = 0;
  11800   u32 iCrc32 = 0;
  11801 
  11802   (void)pRowid;
  11803 
  11804   if( pTab->pWriteFd==0 ){
  11805     rc = zipfileBegin(pVtab);
  11806     if( rc!=SQLITE_OK ) return rc;
  11807   }
  11808 
  11809   /* If this is a DELETE or UPDATE, find the archive entry to delete. */
  11810   if( sqlite3_value_type(apVal[0])!=SQLITE_NULL ){
  11811     const char *zDelete = (const char*)sqlite3_value_text(apVal[0]);
  11812     int nDelete = (int)strlen(zDelete);
  11813     if( nVal>1 ){
  11814       const char *zUpdate = (const char*)sqlite3_value_text(apVal[1]);
  11815       if( zUpdate && zipfileComparePath(zUpdate, zDelete, nDelete)!=0 ){
  11816         bUpdate = 1;
  11817       }
  11818     }
  11819     for(pOld=pTab->pFirstEntry; 1; pOld=pOld->pNext){
  11820       if( zipfileComparePath(pOld->cds.zFile, zDelete, nDelete)==0 ){
  11821         break;
  11822       }
  11823       assert( pOld->pNext );
  11824     }
  11825   }
  11826 
  11827   if( nVal>1 ){
  11828     /* Check that "sz" and "rawdata" are both NULL: */
  11829     if( sqlite3_value_type(apVal[5])!=SQLITE_NULL ){
  11830       zipfileTableErr(pTab, "sz must be NULL");
  11831       rc = SQLITE_CONSTRAINT;
  11832     }
  11833     if( sqlite3_value_type(apVal[6])!=SQLITE_NULL ){
  11834       zipfileTableErr(pTab, "rawdata must be NULL"); 
  11835       rc = SQLITE_CONSTRAINT;
  11836     }
  11837 
  11838     if( rc==SQLITE_OK ){
  11839       if( sqlite3_value_type(apVal[7])==SQLITE_NULL ){
  11840         /* data=NULL. A directory */
  11841         bIsDir = 1;
  11842       }else{
  11843         /* Value specified for "data", and possibly "method". This must be
  11844         ** a regular file or a symlink. */
  11845         const u8 *aIn = sqlite3_value_blob(apVal[7]);
  11846         int nIn = sqlite3_value_bytes(apVal[7]);
  11847         int bAuto = sqlite3_value_type(apVal[8])==SQLITE_NULL;
  11848 
  11849         iMethod = sqlite3_value_int(apVal[8]);
  11850         sz = nIn;
  11851         pData = aIn;
  11852         nData = nIn;
  11853         if( iMethod!=0 && iMethod!=8 ){
  11854           zipfileTableErr(pTab, "unknown compression method: %d", iMethod);
  11855           rc = SQLITE_CONSTRAINT;
  11856         }else{
  11857           if( bAuto || iMethod ){
  11858             int nCmp;
  11859             rc = zipfileDeflate(aIn, nIn, &pFree, &nCmp, &pTab->base.zErrMsg);
  11860             if( rc==SQLITE_OK ){
  11861               if( iMethod || nCmp<nIn ){
  11862                 iMethod = 8;
  11863                 pData = pFree;
  11864                 nData = nCmp;
  11865               }
  11866             }
  11867           }
  11868           iCrc32 = crc32(0, aIn, nIn);
  11869         }
  11870       }
  11871     }
  11872 
  11873     if( rc==SQLITE_OK ){
  11874       rc = zipfileGetMode(apVal[3], bIsDir, &mode, &pTab->base.zErrMsg);
  11875     }
  11876 
  11877     if( rc==SQLITE_OK ){
  11878       zPath = (const char*)sqlite3_value_text(apVal[2]);
  11879       if( zPath==0 ) zPath = "";
  11880       nPath = (int)strlen(zPath);
  11881       mTime = zipfileGetTime(apVal[4]);
  11882     }
  11883 
  11884     if( rc==SQLITE_OK && bIsDir ){
  11885       /* For a directory, check that the last character in the path is a
  11886       ** '/'. This appears to be required for compatibility with info-zip
  11887       ** (the unzip command on unix). It does not create directories
  11888       ** otherwise.  */
  11889       if( nPath<=0 || zPath[nPath-1]!='/' ){
  11890         zFree = sqlite3_mprintf("%s/", zPath);
  11891         zPath = (const char*)zFree;
  11892         if( zFree==0 ){
  11893           rc = SQLITE_NOMEM;
  11894           nPath = 0;
  11895         }else{
  11896           nPath = (int)strlen(zPath);
  11897         }
  11898       }
  11899     }
  11900 
  11901     /* Check that we're not inserting a duplicate entry -OR- updating an
  11902     ** entry with a path, thereby making it into a duplicate. */
  11903     if( (pOld==0 || bUpdate) && rc==SQLITE_OK ){
  11904       ZipfileEntry *p;
  11905       for(p=pTab->pFirstEntry; p; p=p->pNext){
  11906         if( zipfileComparePath(p->cds.zFile, zPath, nPath)==0 ){
  11907           switch( sqlite3_vtab_on_conflict(pTab->db) ){
  11908             case SQLITE_IGNORE: {
  11909               goto zipfile_update_done;
  11910             }
  11911             case SQLITE_REPLACE: {
  11912               pOld2 = p;
  11913               break;
  11914             }
  11915             default: {
  11916               zipfileTableErr(pTab, "duplicate name: \"%s\"", zPath);
  11917               rc = SQLITE_CONSTRAINT;
  11918               break;
  11919             }
  11920           }
  11921           break;
  11922         }
  11923       }
  11924     }
  11925 
  11926     if( rc==SQLITE_OK ){
  11927       /* Create the new CDS record. */
  11928       pNew = zipfileNewEntry(zPath);
  11929       if( pNew==0 ){
  11930         rc = SQLITE_NOMEM;
  11931       }else{
  11932         pNew->cds.iVersionMadeBy = ZIPFILE_NEWENTRY_MADEBY;
  11933         pNew->cds.iVersionExtract = ZIPFILE_NEWENTRY_REQUIRED;
  11934         pNew->cds.flags = ZIPFILE_NEWENTRY_FLAGS;
  11935         pNew->cds.iCompression = (u16)iMethod;
  11936         zipfileMtimeToDos(&pNew->cds, mTime);
  11937         pNew->cds.crc32 = iCrc32;
  11938         pNew->cds.szCompressed = nData;
  11939         pNew->cds.szUncompressed = (u32)sz;
  11940         pNew->cds.iExternalAttr = (mode<<16);
  11941         pNew->cds.iOffset = (u32)pTab->szCurrent;
  11942         pNew->cds.nFile = (u16)nPath;
  11943         pNew->mUnixTime = (u32)mTime;
  11944         rc = zipfileAppendEntry(pTab, pNew, pData, nData);
  11945         zipfileAddEntry(pTab, pOld, pNew);
  11946       }
  11947     }
  11948   }
  11949 
  11950   if( rc==SQLITE_OK && (pOld || pOld2) ){
  11951     ZipfileCsr *pCsr;
  11952     for(pCsr=pTab->pCsrList; pCsr; pCsr=pCsr->pCsrNext){
  11953       if( pCsr->pCurrent && (pCsr->pCurrent==pOld || pCsr->pCurrent==pOld2) ){
  11954         pCsr->pCurrent = pCsr->pCurrent->pNext;
  11955         pCsr->bNoop = 1;
  11956       }
  11957     }
  11958 
  11959     zipfileRemoveEntryFromList(pTab, pOld);
  11960     zipfileRemoveEntryFromList(pTab, pOld2);
  11961   }
  11962 
  11963 zipfile_update_done:
  11964   sqlite3_free(pFree);
  11965   sqlite3_free(zFree);
  11966   return rc;
  11967 }
  11968 
  11969 static int zipfileSerializeEOCD(ZipfileEOCD *p, u8 *aBuf){
  11970   u8 *a = aBuf;
  11971   zipfileWrite32(a, ZIPFILE_SIGNATURE_EOCD);
  11972   zipfileWrite16(a, p->iDisk);
  11973   zipfileWrite16(a, p->iFirstDisk);
  11974   zipfileWrite16(a, p->nEntry);
  11975   zipfileWrite16(a, p->nEntryTotal);
  11976   zipfileWrite32(a, p->nSize);
  11977   zipfileWrite32(a, p->iOffset);
  11978   zipfileWrite16(a, 0);        /* Size of trailing comment in bytes*/
  11979 
  11980   return a-aBuf;
  11981 }
  11982 
  11983 static int zipfileAppendEOCD(ZipfileTab *pTab, ZipfileEOCD *p){
  11984   int nBuf = zipfileSerializeEOCD(p, pTab->aBuffer);
  11985   assert( nBuf==ZIPFILE_EOCD_FIXED_SZ );
  11986   return zipfileAppendData(pTab, pTab->aBuffer, nBuf);
  11987 }
  11988 
  11989 /*
  11990 ** Serialize the CDS structure into buffer aBuf[]. Return the number
  11991 ** of bytes written.
  11992 */
  11993 static int zipfileSerializeCDS(ZipfileEntry *pEntry, u8 *aBuf){
  11994   u8 *a = aBuf;
  11995   ZipfileCDS *pCDS = &pEntry->cds;
  11996 
  11997   if( pEntry->aExtra==0 ){
  11998     pCDS->nExtra = 9;
  11999   }
  12000 
  12001   zipfileWrite32(a, ZIPFILE_SIGNATURE_CDS);
  12002   zipfileWrite16(a, pCDS->iVersionMadeBy);
  12003   zipfileWrite16(a, pCDS->iVersionExtract);
  12004   zipfileWrite16(a, pCDS->flags);
  12005   zipfileWrite16(a, pCDS->iCompression);
  12006   zipfileWrite16(a, pCDS->mTime);
  12007   zipfileWrite16(a, pCDS->mDate);
  12008   zipfileWrite32(a, pCDS->crc32);
  12009   zipfileWrite32(a, pCDS->szCompressed);
  12010   zipfileWrite32(a, pCDS->szUncompressed);
  12011   assert( a==&aBuf[ZIPFILE_CDS_NFILE_OFF] );
  12012   zipfileWrite16(a, pCDS->nFile);
  12013   zipfileWrite16(a, pCDS->nExtra);
  12014   zipfileWrite16(a, pCDS->nComment);
  12015   zipfileWrite16(a, pCDS->iDiskStart);
  12016   zipfileWrite16(a, pCDS->iInternalAttr);
  12017   zipfileWrite32(a, pCDS->iExternalAttr);
  12018   zipfileWrite32(a, pCDS->iOffset);
  12019 
  12020   memcpy(a, pCDS->zFile, pCDS->nFile);
  12021   a += pCDS->nFile;
  12022 
  12023   if( pEntry->aExtra ){
  12024     int n = (int)pCDS->nExtra + (int)pCDS->nComment;
  12025     memcpy(a, pEntry->aExtra, n);
  12026     a += n;
  12027   }else{
  12028     assert( pCDS->nExtra==9 );
  12029     zipfileWrite16(a, ZIPFILE_EXTRA_TIMESTAMP);
  12030     zipfileWrite16(a, 5);
  12031     *a++ = 0x01;
  12032     zipfileWrite32(a, pEntry->mUnixTime);
  12033   }
  12034 
  12035   return a-aBuf;
  12036 }
  12037 
  12038 static int zipfileCommit(sqlite3_vtab *pVtab){
  12039   ZipfileTab *pTab = (ZipfileTab*)pVtab;
  12040   int rc = SQLITE_OK;
  12041   if( pTab->pWriteFd ){
  12042     i64 iOffset = pTab->szCurrent;
  12043     ZipfileEntry *p;
  12044     ZipfileEOCD eocd;
  12045     int nEntry = 0;
  12046 
  12047     /* Write out all entries */
  12048     for(p=pTab->pFirstEntry; rc==SQLITE_OK && p; p=p->pNext){
  12049       int n = zipfileSerializeCDS(p, pTab->aBuffer);
  12050       rc = zipfileAppendData(pTab, pTab->aBuffer, n);
  12051       nEntry++;
  12052     }
  12053 
  12054     /* Write out the EOCD record */
  12055     eocd.iDisk = 0;
  12056     eocd.iFirstDisk = 0;
  12057     eocd.nEntry = (u16)nEntry;
  12058     eocd.nEntryTotal = (u16)nEntry;
  12059     eocd.nSize = (u32)(pTab->szCurrent - iOffset);
  12060     eocd.iOffset = (u32)iOffset;
  12061     rc = zipfileAppendEOCD(pTab, &eocd);
  12062 
  12063     zipfileCleanupTransaction(pTab);
  12064   }
  12065   return rc;
  12066 }
  12067 
  12068 static int zipfileRollback(sqlite3_vtab *pVtab){
  12069   return zipfileCommit(pVtab);
  12070 }
  12071 
  12072 static ZipfileCsr *zipfileFindCursor(ZipfileTab *pTab, i64 iId){
  12073   ZipfileCsr *pCsr;
  12074   for(pCsr=pTab->pCsrList; pCsr; pCsr=pCsr->pCsrNext){
  12075     if( iId==pCsr->iId ) break;
  12076   }
  12077   return pCsr;
  12078 }
  12079 
  12080 static void zipfileFunctionCds(
  12081   sqlite3_context *context,
  12082   int argc,
  12083   sqlite3_value **argv
  12084 ){
  12085   ZipfileCsr *pCsr;
  12086   ZipfileTab *pTab = (ZipfileTab*)sqlite3_user_data(context);
  12087   assert( argc>0 );
  12088 
  12089   pCsr = zipfileFindCursor(pTab, sqlite3_value_int64(argv[0]));
  12090   if( pCsr ){
  12091     ZipfileCDS *p = &pCsr->pCurrent->cds;
  12092     char *zRes = sqlite3_mprintf("{"
  12093         "\"version-made-by\" : %u, "
  12094         "\"version-to-extract\" : %u, "
  12095         "\"flags\" : %u, "
  12096         "\"compression\" : %u, "
  12097         "\"time\" : %u, "
  12098         "\"date\" : %u, "
  12099         "\"crc32\" : %u, "
  12100         "\"compressed-size\" : %u, "
  12101         "\"uncompressed-size\" : %u, "
  12102         "\"file-name-length\" : %u, "
  12103         "\"extra-field-length\" : %u, "
  12104         "\"file-comment-length\" : %u, "
  12105         "\"disk-number-start\" : %u, "
  12106         "\"internal-attr\" : %u, "
  12107         "\"external-attr\" : %u, "
  12108         "\"offset\" : %u }",
  12109         (u32)p->iVersionMadeBy, (u32)p->iVersionExtract,
  12110         (u32)p->flags, (u32)p->iCompression,
  12111         (u32)p->mTime, (u32)p->mDate,
  12112         (u32)p->crc32, (u32)p->szCompressed,
  12113         (u32)p->szUncompressed, (u32)p->nFile,
  12114         (u32)p->nExtra, (u32)p->nComment,
  12115         (u32)p->iDiskStart, (u32)p->iInternalAttr,
  12116         (u32)p->iExternalAttr, (u32)p->iOffset
  12117     );
  12118 
  12119     if( zRes==0 ){
  12120       sqlite3_result_error_nomem(context);
  12121     }else{
  12122       sqlite3_result_text(context, zRes, -1, SQLITE_TRANSIENT);
  12123       sqlite3_free(zRes);
  12124     }
  12125   }
  12126 }
  12127 
  12128 /*
  12129 ** xFindFunction method.
  12130 */
  12131 static int zipfileFindFunction(
  12132   sqlite3_vtab *pVtab,            /* Virtual table handle */
  12133   int nArg,                       /* Number of SQL function arguments */
  12134   const char *zName,              /* Name of SQL function */
  12135   void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), /* OUT: Result */
  12136   void **ppArg                    /* OUT: User data for *pxFunc */
  12137 ){
  12138   (void)nArg;
  12139   if( sqlite3_stricmp("zipfile_cds", zName)==0 ){
  12140     *pxFunc = zipfileFunctionCds;
  12141     *ppArg = (void*)pVtab;
  12142     return 1;
  12143   }
  12144   return 0;
  12145 }
  12146 
  12147 typedef struct ZipfileBuffer ZipfileBuffer;
  12148 struct ZipfileBuffer {
  12149   u8 *a;                          /* Pointer to buffer */
  12150   int n;                          /* Size of buffer in bytes */
  12151   int nAlloc;                     /* Byte allocated at a[] */
  12152 };
  12153 
  12154 typedef struct ZipfileCtx ZipfileCtx;
  12155 struct ZipfileCtx {
  12156   int nEntry;
  12157   ZipfileBuffer body;
  12158   ZipfileBuffer cds;
  12159 };
  12160 
  12161 static int zipfileBufferGrow(ZipfileBuffer *pBuf, int nByte){
  12162   if( pBuf->n+nByte>pBuf->nAlloc ){
  12163     u8 *aNew;
  12164     sqlite3_int64 nNew = pBuf->n ? pBuf->n*2 : 512;
  12165     int nReq = pBuf->n + nByte;
  12166 
  12167     while( nNew<nReq ) nNew = nNew*2;
  12168     aNew = sqlite3_realloc64(pBuf->a, nNew);
  12169     if( aNew==0 ) return SQLITE_NOMEM;
  12170     pBuf->a = aNew;
  12171     pBuf->nAlloc = (int)nNew;
  12172   }
  12173   return SQLITE_OK;
  12174 }
  12175 
  12176 /*
  12177 ** xStep() callback for the zipfile() aggregate. This can be called in
  12178 ** any of the following ways:
  12179 **
  12180 **   SELECT zipfile(name,data) ...
  12181 **   SELECT zipfile(name,mode,mtime,data) ...
  12182 **   SELECT zipfile(name,mode,mtime,data,method) ...
  12183 */
  12184 static void zipfileStep(sqlite3_context *pCtx, int nVal, sqlite3_value **apVal){
  12185   ZipfileCtx *p;                  /* Aggregate function context */
  12186   ZipfileEntry e;                 /* New entry to add to zip archive */
  12187 
  12188   sqlite3_value *pName = 0;
  12189   sqlite3_value *pMode = 0;
  12190   sqlite3_value *pMtime = 0;
  12191   sqlite3_value *pData = 0;
  12192   sqlite3_value *pMethod = 0;
  12193 
  12194   int bIsDir = 0;
  12195   u32 mode;
  12196   int rc = SQLITE_OK;
  12197   char *zErr = 0;
  12198 
  12199   int iMethod = -1;               /* Compression method to use (0 or 8) */
  12200 
  12201   const u8 *aData = 0;            /* Possibly compressed data for new entry */
  12202   int nData = 0;                  /* Size of aData[] in bytes */
  12203   int szUncompressed = 0;         /* Size of data before compression */
  12204   u8 *aFree = 0;                  /* Free this before returning */
  12205   u32 iCrc32 = 0;                 /* crc32 of uncompressed data */
  12206 
  12207   char *zName = 0;                /* Path (name) of new entry */
  12208   int nName = 0;                  /* Size of zName in bytes */
  12209   char *zFree = 0;                /* Free this before returning */
  12210   int nByte;
  12211 
  12212   memset(&e, 0, sizeof(e));
  12213   p = (ZipfileCtx*)sqlite3_aggregate_context(pCtx, sizeof(ZipfileCtx));
  12214   if( p==0 ) return;
  12215 
  12216   /* Martial the arguments into stack variables */
  12217   if( nVal!=2 && nVal!=4 && nVal!=5 ){
  12218     zErr = sqlite3_mprintf("wrong number of arguments to function zipfile()");
  12219     rc = SQLITE_ERROR;
  12220     goto zipfile_step_out;
  12221   }
  12222   pName = apVal[0];
  12223   if( nVal==2 ){
  12224     pData = apVal[1];
  12225   }else{
  12226     pMode = apVal[1];
  12227     pMtime = apVal[2];
  12228     pData = apVal[3];
  12229     if( nVal==5 ){
  12230       pMethod = apVal[4];
  12231     }
  12232   }
  12233 
  12234   /* Check that the 'name' parameter looks ok. */
  12235   zName = (char*)sqlite3_value_text(pName);
  12236   nName = sqlite3_value_bytes(pName);
  12237   if( zName==0 ){
  12238     zErr = sqlite3_mprintf("first argument to zipfile() must be non-NULL");
  12239     rc = SQLITE_ERROR;
  12240     goto zipfile_step_out;
  12241   }
  12242 
  12243   /* Inspect the 'method' parameter. This must be either 0 (store), 8 (use
  12244   ** deflate compression) or NULL (choose automatically).  */
  12245   if( pMethod && SQLITE_NULL!=sqlite3_value_type(pMethod) ){
  12246     iMethod = (int)sqlite3_value_int64(pMethod);
  12247     if( iMethod!=0 && iMethod!=8 ){
  12248       zErr = sqlite3_mprintf("illegal method value: %d", iMethod);
  12249       rc = SQLITE_ERROR;
  12250       goto zipfile_step_out;
  12251     }
  12252   }
  12253 
  12254   /* Now inspect the data. If this is NULL, then the new entry must be a
  12255   ** directory.  Otherwise, figure out whether or not the data should
  12256   ** be deflated or simply stored in the zip archive. */
  12257   if( sqlite3_value_type(pData)==SQLITE_NULL ){
  12258     bIsDir = 1;
  12259     iMethod = 0;
  12260   }else{
  12261     aData = sqlite3_value_blob(pData);
  12262     szUncompressed = nData = sqlite3_value_bytes(pData);
  12263     iCrc32 = crc32(0, aData, nData);
  12264     if( iMethod<0 || iMethod==8 ){
  12265       int nOut = 0;
  12266       rc = zipfileDeflate(aData, nData, &aFree, &nOut, &zErr);
  12267       if( rc!=SQLITE_OK ){
  12268         goto zipfile_step_out;
  12269       }
  12270       if( iMethod==8 || nOut<nData ){
  12271         aData = aFree;
  12272         nData = nOut;
  12273         iMethod = 8;
  12274       }else{
  12275         iMethod = 0;
  12276       }
  12277     }
  12278   }
  12279 
  12280   /* Decode the "mode" argument. */
  12281   rc = zipfileGetMode(pMode, bIsDir, &mode, &zErr);
  12282   if( rc ) goto zipfile_step_out;
  12283 
  12284   /* Decode the "mtime" argument. */
  12285   e.mUnixTime = zipfileGetTime(pMtime);
  12286 
  12287   /* If this is a directory entry, ensure that there is exactly one '/'
  12288   ** at the end of the path. Or, if this is not a directory and the path
  12289   ** ends in '/' it is an error. */
  12290   if( bIsDir==0 ){
  12291     if( nName>0 && zName[nName-1]=='/' ){
  12292       zErr = sqlite3_mprintf("non-directory name must not end with /");
  12293       rc = SQLITE_ERROR;
  12294       goto zipfile_step_out;
  12295     }
  12296   }else{
  12297     if( nName==0 || zName[nName-1]!='/' ){
  12298       zName = zFree = sqlite3_mprintf("%s/", zName);
  12299       if( zName==0 ){
  12300         rc = SQLITE_NOMEM;
  12301         goto zipfile_step_out;
  12302       }
  12303       nName = (int)strlen(zName);
  12304     }else{
  12305       while( nName>1 && zName[nName-2]=='/' ) nName--;
  12306     }
  12307   }
  12308 
  12309   /* Assemble the ZipfileEntry object for the new zip archive entry */
  12310   e.cds.iVersionMadeBy = ZIPFILE_NEWENTRY_MADEBY;
  12311   e.cds.iVersionExtract = ZIPFILE_NEWENTRY_REQUIRED;
  12312   e.cds.flags = ZIPFILE_NEWENTRY_FLAGS;
  12313   e.cds.iCompression = (u16)iMethod;
  12314   zipfileMtimeToDos(&e.cds, (u32)e.mUnixTime);
  12315   e.cds.crc32 = iCrc32;
  12316   e.cds.szCompressed = nData;
  12317   e.cds.szUncompressed = szUncompressed;
  12318   e.cds.iExternalAttr = (mode<<16);
  12319   e.cds.iOffset = p->body.n;
  12320   e.cds.nFile = (u16)nName;
  12321   e.cds.zFile = zName;
  12322 
  12323   /* Append the LFH to the body of the new archive */
  12324   nByte = ZIPFILE_LFH_FIXED_SZ + e.cds.nFile + 9;
  12325   if( (rc = zipfileBufferGrow(&p->body, nByte)) ) goto zipfile_step_out;
  12326   p->body.n += zipfileSerializeLFH(&e, &p->body.a[p->body.n]);
  12327 
  12328   /* Append the data to the body of the new archive */
  12329   if( nData>0 ){
  12330     if( (rc = zipfileBufferGrow(&p->body, nData)) ) goto zipfile_step_out;
  12331     memcpy(&p->body.a[p->body.n], aData, nData);
  12332     p->body.n += nData;
  12333   }
  12334 
  12335   /* Append the CDS record to the directory of the new archive */
  12336   nByte = ZIPFILE_CDS_FIXED_SZ + e.cds.nFile + 9;
  12337   if( (rc = zipfileBufferGrow(&p->cds, nByte)) ) goto zipfile_step_out;
  12338   p->cds.n += zipfileSerializeCDS(&e, &p->cds.a[p->cds.n]);
  12339 
  12340   /* Increment the count of entries in the archive */
  12341   p->nEntry++;
  12342 
  12343  zipfile_step_out:
  12344   sqlite3_free(aFree);
  12345   sqlite3_free(zFree);
  12346   if( rc ){
  12347     if( zErr ){
  12348       sqlite3_result_error(pCtx, zErr, -1);
  12349     }else{
  12350       sqlite3_result_error_code(pCtx, rc);
  12351     }
  12352   }
  12353   sqlite3_free(zErr);
  12354 }
  12355 
  12356 /*
  12357 ** xFinalize() callback for zipfile aggregate function.
  12358 */
  12359 static void zipfileFinal(sqlite3_context *pCtx){
  12360   ZipfileCtx *p;
  12361   ZipfileEOCD eocd;
  12362   sqlite3_int64 nZip;
  12363   u8 *aZip;
  12364 
  12365   p = (ZipfileCtx*)sqlite3_aggregate_context(pCtx, sizeof(ZipfileCtx));
  12366   if( p==0 ) return;
  12367   if( p->nEntry>0 ){
  12368     memset(&eocd, 0, sizeof(eocd));
  12369     eocd.nEntry = (u16)p->nEntry;
  12370     eocd.nEntryTotal = (u16)p->nEntry;
  12371     eocd.nSize = p->cds.n;
  12372     eocd.iOffset = p->body.n;
  12373 
  12374     nZip = p->body.n + p->cds.n + ZIPFILE_EOCD_FIXED_SZ;
  12375     aZip = (u8*)sqlite3_malloc64(nZip);
  12376     if( aZip==0 ){
  12377       sqlite3_result_error_nomem(pCtx);
  12378     }else{
  12379       memcpy(aZip, p->body.a, p->body.n);
  12380       memcpy(&aZip[p->body.n], p->cds.a, p->cds.n);
  12381       zipfileSerializeEOCD(&eocd, &aZip[p->body.n + p->cds.n]);
  12382       sqlite3_result_blob(pCtx, aZip, (int)nZip, zipfileFree);
  12383     }
  12384   }
  12385 
  12386   sqlite3_free(p->body.a);
  12387   sqlite3_free(p->cds.a);
  12388 }
  12389 
  12390 
  12391 /*
  12392 ** Register the "zipfile" virtual table.
  12393 */
  12394 static int zipfileRegister(sqlite3 *db){
  12395   static sqlite3_module zipfileModule = {
  12396     1,                         /* iVersion */
  12397     zipfileConnect,            /* xCreate */
  12398     zipfileConnect,            /* xConnect */
  12399     zipfileBestIndex,          /* xBestIndex */
  12400     zipfileDisconnect,         /* xDisconnect */
  12401     zipfileDisconnect,         /* xDestroy */
  12402     zipfileOpen,               /* xOpen - open a cursor */
  12403     zipfileClose,              /* xClose - close a cursor */
  12404     zipfileFilter,             /* xFilter - configure scan constraints */
  12405     zipfileNext,               /* xNext - advance a cursor */
  12406     zipfileEof,                /* xEof - check for end of scan */
  12407     zipfileColumn,             /* xColumn - read data */
  12408     0,                         /* xRowid - read data */
  12409     zipfileUpdate,             /* xUpdate */
  12410     zipfileBegin,              /* xBegin */
  12411     0,                         /* xSync */
  12412     zipfileCommit,             /* xCommit */
  12413     zipfileRollback,           /* xRollback */
  12414     zipfileFindFunction,       /* xFindMethod */
  12415     0,                         /* xRename */
  12416     0,                         /* xSavepoint */
  12417     0,                         /* xRelease */
  12418     0,                         /* xRollback */
  12419     0,                         /* xShadowName */
  12420     0                          /* xIntegrity */
  12421   };
  12422 
  12423   int rc = sqlite3_create_module(db, "zipfile"  , &zipfileModule, 0);
  12424   if( rc==SQLITE_OK ) rc = sqlite3_overload_function(db, "zipfile_cds", -1);
  12425   if( rc==SQLITE_OK ){
  12426     rc = sqlite3_create_function(db, "zipfile", -1, SQLITE_UTF8, 0, 0, 
  12427         zipfileStep, zipfileFinal
  12428     );
  12429   }
  12430   assert( sizeof(i64)==8 );
  12431   assert( sizeof(u32)==4 );
  12432   assert( sizeof(u16)==2 );
  12433   assert( sizeof(u8)==1 );
  12434   return rc;
  12435 }
  12436 #else         /* SQLITE_OMIT_VIRTUALTABLE */
  12437 # define zipfileRegister(x) SQLITE_OK
  12438 #endif
  12439 
  12440 #ifdef _WIN32
  12441 
  12442 #endif
  12443 int sqlite3_zipfile_init(
  12444   sqlite3 *db, 
  12445   char **pzErrMsg, 
  12446   const sqlite3_api_routines *pApi
  12447 ){
  12448   SQLITE_EXTENSION_INIT2(pApi);
  12449   (void)pzErrMsg;  /* Unused parameter */
  12450   return zipfileRegister(db);
  12451 }
  12452 
  12453 /************************* End ../ext/misc/zipfile.c ********************/
  12454 /************************* Begin ../ext/misc/sqlar.c ******************/
  12455 /*
  12456 ** 2017-12-17
  12457 **
  12458 ** The author disclaims copyright to this source code.  In place of
  12459 ** a legal notice, here is a blessing:
  12460 **
  12461 **    May you do good and not evil.
  12462 **    May you find forgiveness for yourself and forgive others.
  12463 **    May you share freely, never taking more than you give.
  12464 **
  12465 ******************************************************************************
  12466 **
  12467 ** Utility functions sqlar_compress() and sqlar_uncompress(). Useful
  12468 ** for working with sqlar archives and used by the shell tool's built-in
  12469 ** sqlar support.
  12470 */
  12471 /* #include "sqlite3ext.h" */
  12472 SQLITE_EXTENSION_INIT1
  12473 #include <zlib.h>
  12474 #include <assert.h>
  12475 
  12476 /*
  12477 ** Implementation of the "sqlar_compress(X)" SQL function.
  12478 **
  12479 ** If the type of X is SQLITE_BLOB, and compressing that blob using
  12480 ** zlib utility function compress() yields a smaller blob, return the
  12481 ** compressed blob. Otherwise, return a copy of X.
  12482 **
  12483 ** SQLar uses the "zlib format" for compressed content.  The zlib format
  12484 ** contains a two-byte identification header and a four-byte checksum at
  12485 ** the end.  This is different from ZIP which uses the raw deflate format.
  12486 **
  12487 ** Future enhancements to SQLar might add support for new compression formats.
  12488 ** If so, those new formats will be identified by alternative headers in the
  12489 ** compressed data.
  12490 */
  12491 static void sqlarCompressFunc(
  12492   sqlite3_context *context,
  12493   int argc,
  12494   sqlite3_value **argv
  12495 ){
  12496   assert( argc==1 );
  12497   if( sqlite3_value_type(argv[0])==SQLITE_BLOB ){
  12498     const Bytef *pData = sqlite3_value_blob(argv[0]);
  12499     uLong nData = sqlite3_value_bytes(argv[0]);
  12500     uLongf nOut = compressBound(nData);
  12501     Bytef *pOut;
  12502 
  12503     pOut = (Bytef*)sqlite3_malloc(nOut);
  12504     if( pOut==0 ){
  12505       sqlite3_result_error_nomem(context);
  12506       return;
  12507     }else{
  12508       if( Z_OK!=compress(pOut, &nOut, pData, nData) ){
  12509         sqlite3_result_error(context, "error in compress()", -1);
  12510       }else if( nOut<nData ){
  12511         sqlite3_result_blob(context, pOut, nOut, SQLITE_TRANSIENT);
  12512       }else{
  12513         sqlite3_result_value(context, argv[0]);
  12514       }
  12515       sqlite3_free(pOut);
  12516     }
  12517   }else{
  12518     sqlite3_result_value(context, argv[0]);
  12519   }
  12520 }
  12521 
  12522 /*
  12523 ** Implementation of the "sqlar_uncompress(X,SZ)" SQL function
  12524 **
  12525 ** Parameter SZ is interpreted as an integer. If it is less than or
  12526 ** equal to zero, then this function returns a copy of X. Or, if
  12527 ** SZ is equal to the size of X when interpreted as a blob, also
  12528 ** return a copy of X. Otherwise, decompress blob X using zlib
  12529 ** utility function uncompress() and return the results (another
  12530 ** blob).
  12531 */
  12532 static void sqlarUncompressFunc(
  12533   sqlite3_context *context,
  12534   int argc,
  12535   sqlite3_value **argv
  12536 ){
  12537   uLong nData;
  12538   sqlite3_int64 sz;
  12539 
  12540   assert( argc==2 );
  12541   sz = sqlite3_value_int(argv[1]);
  12542 
  12543   if( sz<=0 || sz==(nData = sqlite3_value_bytes(argv[0])) ){
  12544     sqlite3_result_value(context, argv[0]);
  12545   }else{
  12546     uLongf szf = sz;
  12547     const Bytef *pData= sqlite3_value_blob(argv[0]);
  12548     Bytef *pOut = sqlite3_malloc(sz);
  12549     if( pOut==0 ){
  12550       sqlite3_result_error_nomem(context);
  12551     }else if( Z_OK!=uncompress(pOut, &szf, pData, nData) ){
  12552       sqlite3_result_error(context, "error in uncompress()", -1);
  12553     }else{
  12554       sqlite3_result_blob(context, pOut, szf, SQLITE_TRANSIENT);
  12555     }
  12556     sqlite3_free(pOut);
  12557   }
  12558 }
  12559 
  12560 #ifdef _WIN32
  12561 
  12562 #endif
  12563 int sqlite3_sqlar_init(
  12564   sqlite3 *db, 
  12565   char **pzErrMsg, 
  12566   const sqlite3_api_routines *pApi
  12567 ){
  12568   int rc = SQLITE_OK;
  12569   SQLITE_EXTENSION_INIT2(pApi);
  12570   (void)pzErrMsg;  /* Unused parameter */
  12571   rc = sqlite3_create_function(db, "sqlar_compress", 1, 
  12572                                SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
  12573                                sqlarCompressFunc, 0, 0);
  12574   if( rc==SQLITE_OK ){
  12575     rc = sqlite3_create_function(db, "sqlar_uncompress", 2,
  12576                                  SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
  12577                                  sqlarUncompressFunc, 0, 0);
  12578   }
  12579   return rc;
  12580 }
  12581 
  12582 /************************* End ../ext/misc/sqlar.c ********************/
  12583 #endif
  12584 /************************* Begin ../ext/expert/sqlite3expert.h ******************/
  12585 /*
  12586 ** 2017 April 07
  12587 **
  12588 ** The author disclaims copyright to this source code.  In place of
  12589 ** a legal notice, here is a blessing:
  12590 **
  12591 **    May you do good and not evil.
  12592 **    May you find forgiveness for yourself and forgive others.
  12593 **    May you share freely, never taking more than you give.
  12594 **
  12595 *************************************************************************
  12596 */
  12597 #if !defined(SQLITEEXPERT_H)
  12598 #define SQLITEEXPERT_H 1
  12599 /* #include "sqlite3.h" */
  12600 
  12601 typedef struct sqlite3expert sqlite3expert;
  12602 
  12603 /*
  12604 ** Create a new sqlite3expert object.
  12605 **
  12606 ** If successful, a pointer to the new object is returned and (*pzErr) set
  12607 ** to NULL. Or, if an error occurs, NULL is returned and (*pzErr) set to
  12608 ** an English-language error message. In this case it is the responsibility
  12609 ** of the caller to eventually free the error message buffer using
  12610 ** sqlite3_free().
  12611 */
  12612 sqlite3expert *sqlite3_expert_new(sqlite3 *db, char **pzErr);
  12613 
  12614 /*
  12615 ** Configure an sqlite3expert object.
  12616 **
  12617 ** EXPERT_CONFIG_SAMPLE:
  12618 **   By default, sqlite3_expert_analyze() generates sqlite_stat1 data for
  12619 **   each candidate index. This involves scanning and sorting the entire
  12620 **   contents of each user database table once for each candidate index
  12621 **   associated with the table. For large databases, this can be 
  12622 **   prohibitively slow. This option allows the sqlite3expert object to
  12623 **   be configured so that sqlite_stat1 data is instead generated based on a
  12624 **   subset of each table, or so that no sqlite_stat1 data is used at all.
  12625 **
  12626 **   A single integer argument is passed to this option. If the value is less
  12627 **   than or equal to zero, then no sqlite_stat1 data is generated or used by
  12628 **   the analysis - indexes are recommended based on the database schema only.
  12629 **   Or, if the value is 100 or greater, complete sqlite_stat1 data is
  12630 **   generated for each candidate index (this is the default). Finally, if the
  12631 **   value falls between 0 and 100, then it represents the percentage of user
  12632 **   table rows that should be considered when generating sqlite_stat1 data.
  12633 **
  12634 **   Examples:
  12635 **
  12636 **     // Do not generate any sqlite_stat1 data
  12637 **     sqlite3_expert_config(pExpert, EXPERT_CONFIG_SAMPLE, 0);
  12638 **
  12639 **     // Generate sqlite_stat1 data based on 10% of the rows in each table.
  12640 **     sqlite3_expert_config(pExpert, EXPERT_CONFIG_SAMPLE, 10);
  12641 */
  12642 int sqlite3_expert_config(sqlite3expert *p, int op, ...);
  12643 
  12644 #define EXPERT_CONFIG_SAMPLE 1    /* int */
  12645 
  12646 /*
  12647 ** Specify zero or more SQL statements to be included in the analysis.
  12648 **
  12649 ** Buffer zSql must contain zero or more complete SQL statements. This
  12650 ** function parses all statements contained in the buffer and adds them
  12651 ** to the internal list of statements to analyze. If successful, SQLITE_OK
  12652 ** is returned and (*pzErr) set to NULL. Or, if an error occurs - for example
  12653 ** due to a error in the SQL - an SQLite error code is returned and (*pzErr)
  12654 ** may be set to point to an English language error message. In this case
  12655 ** the caller is responsible for eventually freeing the error message buffer
  12656 ** using sqlite3_free().
  12657 **
  12658 ** If an error does occur while processing one of the statements in the
  12659 ** buffer passed as the second argument, none of the statements in the
  12660 ** buffer are added to the analysis.
  12661 **
  12662 ** This function must be called before sqlite3_expert_analyze(). If a call
  12663 ** to this function is made on an sqlite3expert object that has already
  12664 ** been passed to sqlite3_expert_analyze() SQLITE_MISUSE is returned
  12665 ** immediately and no statements are added to the analysis.
  12666 */
  12667 int sqlite3_expert_sql(
  12668   sqlite3expert *p,               /* From a successful sqlite3_expert_new() */
  12669   const char *zSql,               /* SQL statement(s) to add */
  12670   char **pzErr                    /* OUT: Error message (if any) */
  12671 );
  12672 
  12673 
  12674 /*
  12675 ** This function is called after the sqlite3expert object has been configured
  12676 ** with all SQL statements using sqlite3_expert_sql() to actually perform
  12677 ** the analysis. Once this function has been called, it is not possible to
  12678 ** add further SQL statements to the analysis.
  12679 **
  12680 ** If successful, SQLITE_OK is returned and (*pzErr) is set to NULL. Or, if
  12681 ** an error occurs, an SQLite error code is returned and (*pzErr) set to 
  12682 ** point to a buffer containing an English language error message. In this
  12683 ** case it is the responsibility of the caller to eventually free the buffer
  12684 ** using sqlite3_free().
  12685 **
  12686 ** If an error does occur within this function, the sqlite3expert object
  12687 ** is no longer useful for any purpose. At that point it is no longer
  12688 ** possible to add further SQL statements to the object or to re-attempt
  12689 ** the analysis. The sqlite3expert object must still be freed using a call
  12690 ** sqlite3_expert_destroy().
  12691 */
  12692 int sqlite3_expert_analyze(sqlite3expert *p, char **pzErr);
  12693 
  12694 /*
  12695 ** Return the total number of statements loaded using sqlite3_expert_sql().
  12696 ** The total number of SQL statements may be different from the total number
  12697 ** to calls to sqlite3_expert_sql().
  12698 */
  12699 int sqlite3_expert_count(sqlite3expert*);
  12700 
  12701 /*
  12702 ** Return a component of the report.
  12703 **
  12704 ** This function is called after sqlite3_expert_analyze() to extract the
  12705 ** results of the analysis. Each call to this function returns either a
  12706 ** NULL pointer or a pointer to a buffer containing a nul-terminated string.
  12707 ** The value passed as the third argument must be one of the EXPERT_REPORT_*
  12708 ** #define constants defined below.
  12709 **
  12710 ** For some EXPERT_REPORT_* parameters, the buffer returned contains 
  12711 ** information relating to a specific SQL statement. In these cases that
  12712 ** SQL statement is identified by the value passed as the second argument.
  12713 ** SQL statements are numbered from 0 in the order in which they are parsed.
  12714 ** If an out-of-range value (less than zero or equal to or greater than the
  12715 ** value returned by sqlite3_expert_count()) is passed as the second argument
  12716 ** along with such an EXPERT_REPORT_* parameter, NULL is always returned.
  12717 **
  12718 ** EXPERT_REPORT_SQL:
  12719 **   Return the text of SQL statement iStmt.
  12720 **
  12721 ** EXPERT_REPORT_INDEXES:
  12722 **   Return a buffer containing the CREATE INDEX statements for all recommended
  12723 **   indexes for statement iStmt. If there are no new recommeded indexes, NULL 
  12724 **   is returned.
  12725 **
  12726 ** EXPERT_REPORT_PLAN:
  12727 **   Return a buffer containing the EXPLAIN QUERY PLAN output for SQL query
  12728 **   iStmt after the proposed indexes have been added to the database schema.
  12729 **
  12730 ** EXPERT_REPORT_CANDIDATES:
  12731 **   Return a pointer to a buffer containing the CREATE INDEX statements 
  12732 **   for all indexes that were tested (for all SQL statements). The iStmt
  12733 **   parameter is ignored for EXPERT_REPORT_CANDIDATES calls.
  12734 */
  12735 const char *sqlite3_expert_report(sqlite3expert*, int iStmt, int eReport);
  12736 
  12737 /*
  12738 ** Values for the third argument passed to sqlite3_expert_report().
  12739 */
  12740 #define EXPERT_REPORT_SQL        1
  12741 #define EXPERT_REPORT_INDEXES    2
  12742 #define EXPERT_REPORT_PLAN       3
  12743 #define EXPERT_REPORT_CANDIDATES 4
  12744 
  12745 /*
  12746 ** Free an (sqlite3expert*) handle and all associated resources. There 
  12747 ** should be one call to this function for each successful call to 
  12748 ** sqlite3-expert_new().
  12749 */
  12750 void sqlite3_expert_destroy(sqlite3expert*);
  12751 
  12752 #endif  /* !defined(SQLITEEXPERT_H) */
  12753 
  12754 /************************* End ../ext/expert/sqlite3expert.h ********************/
  12755 /************************* Begin ../ext/expert/sqlite3expert.c ******************/
  12756 /*
  12757 ** 2017 April 09
  12758 **
  12759 ** The author disclaims copyright to this source code.  In place of
  12760 ** a legal notice, here is a blessing:
  12761 **
  12762 **    May you do good and not evil.
  12763 **    May you find forgiveness for yourself and forgive others.
  12764 **    May you share freely, never taking more than you give.
  12765 **
  12766 *************************************************************************
  12767 */
  12768 /* #include "sqlite3expert.h" */
  12769 #include <assert.h>
  12770 #include <string.h>
  12771 #include <stdio.h>
  12772 
  12773 #if !defined(SQLITE_AMALGAMATION)
  12774 #if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST)
  12775 # define SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS 1
  12776 #endif
  12777 #if defined(SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS)
  12778 # define ALWAYS(X)      (1)
  12779 # define NEVER(X)       (0)
  12780 #elif !defined(NDEBUG)
  12781 # define ALWAYS(X)      ((X)?1:(assert(0),0))
  12782 # define NEVER(X)       ((X)?(assert(0),1):0)
  12783 #else
  12784 # define ALWAYS(X)      (X)
  12785 # define NEVER(X)       (X)
  12786 #endif
  12787 #endif /* !defined(SQLITE_AMALGAMATION) */
  12788 
  12789 
  12790 #ifndef SQLITE_OMIT_VIRTUALTABLE
  12791 
  12792 /* typedef sqlite3_int64 i64; */
  12793 /* typedef sqlite3_uint64 u64; */
  12794 
  12795 typedef struct IdxColumn IdxColumn;
  12796 typedef struct IdxConstraint IdxConstraint;
  12797 typedef struct IdxScan IdxScan;
  12798 typedef struct IdxStatement IdxStatement;
  12799 typedef struct IdxTable IdxTable;
  12800 typedef struct IdxWrite IdxWrite;
  12801 
  12802 #define STRLEN  (int)strlen
  12803 
  12804 /*
  12805 ** A temp table name that we assume no user database will actually use.
  12806 ** If this assumption proves incorrect triggers on the table with the
  12807 ** conflicting name will be ignored.
  12808 */
  12809 #define UNIQUE_TABLE_NAME "t592690916721053953805701627921227776"
  12810 
  12811 /*
  12812 ** A single constraint. Equivalent to either "col = ?" or "col < ?" (or
  12813 ** any other type of single-ended range constraint on a column).
  12814 **
  12815 ** pLink:
  12816 **   Used to temporarily link IdxConstraint objects into lists while
  12817 **   creating candidate indexes.
  12818 */
  12819 struct IdxConstraint {
  12820   char *zColl;                    /* Collation sequence */
  12821   int bRange;                     /* True for range, false for eq */
  12822   int iCol;                       /* Constrained table column */
  12823   int bFlag;                      /* Used by idxFindCompatible() */
  12824   int bDesc;                      /* True if ORDER BY <expr> DESC */
  12825   IdxConstraint *pNext;           /* Next constraint in pEq or pRange list */
  12826   IdxConstraint *pLink;           /* See above */
  12827 };
  12828 
  12829 /*
  12830 ** A single scan of a single table.
  12831 */
  12832 struct IdxScan {
  12833   IdxTable *pTab;                 /* Associated table object */
  12834   int iDb;                        /* Database containing table zTable */
  12835   i64 covering;                   /* Mask of columns required for cov. index */
  12836   IdxConstraint *pOrder;          /* ORDER BY columns */
  12837   IdxConstraint *pEq;             /* List of == constraints */
  12838   IdxConstraint *pRange;          /* List of < constraints */
  12839   IdxScan *pNextScan;             /* Next IdxScan object for same analysis */
  12840 };
  12841 
  12842 /*
  12843 ** Information regarding a single database table. Extracted from 
  12844 ** "PRAGMA table_info" by function idxGetTableInfo().
  12845 */
  12846 struct IdxColumn {
  12847   char *zName;
  12848   char *zColl;
  12849   int iPk;
  12850 };
  12851 struct IdxTable {
  12852   int nCol;
  12853   char *zName;                    /* Table name */
  12854   IdxColumn *aCol;
  12855   IdxTable *pNext;                /* Next table in linked list of all tables */
  12856 };
  12857 
  12858 /*
  12859 ** An object of the following type is created for each unique table/write-op
  12860 ** seen. The objects are stored in a singly-linked list beginning at
  12861 ** sqlite3expert.pWrite.
  12862 */
  12863 struct IdxWrite {
  12864   IdxTable *pTab;
  12865   int eOp;                        /* SQLITE_UPDATE, DELETE or INSERT */
  12866   IdxWrite *pNext;
  12867 };
  12868 
  12869 /*
  12870 ** Each statement being analyzed is represented by an instance of this
  12871 ** structure.
  12872 */
  12873 struct IdxStatement {
  12874   int iId;                        /* Statement number */
  12875   char *zSql;                     /* SQL statement */
  12876   char *zIdx;                     /* Indexes */
  12877   char *zEQP;                     /* Plan */
  12878   IdxStatement *pNext;
  12879 };
  12880 
  12881 
  12882 /*
  12883 ** A hash table for storing strings. With space for a payload string
  12884 ** with each entry. Methods are:
  12885 **
  12886 **   idxHashInit()
  12887 **   idxHashClear()
  12888 **   idxHashAdd()
  12889 **   idxHashSearch()
  12890 */
  12891 #define IDX_HASH_SIZE 1023
  12892 typedef struct IdxHashEntry IdxHashEntry;
  12893 typedef struct IdxHash IdxHash;
  12894 struct IdxHashEntry {
  12895   char *zKey;                     /* nul-terminated key */
  12896   char *zVal;                     /* nul-terminated value string */
  12897   char *zVal2;                    /* nul-terminated value string 2 */
  12898   IdxHashEntry *pHashNext;        /* Next entry in same hash bucket */
  12899   IdxHashEntry *pNext;            /* Next entry in hash */
  12900 };
  12901 struct IdxHash {
  12902   IdxHashEntry *pFirst;
  12903   IdxHashEntry *aHash[IDX_HASH_SIZE];
  12904 };
  12905 
  12906 /*
  12907 ** sqlite3expert object.
  12908 */
  12909 struct sqlite3expert {
  12910   int iSample;                    /* Percentage of tables to sample for stat1 */
  12911   sqlite3 *db;                    /* User database */
  12912   sqlite3 *dbm;                   /* In-memory db for this analysis */
  12913   sqlite3 *dbv;                   /* Vtab schema for this analysis */
  12914   IdxTable *pTable;               /* List of all IdxTable objects */
  12915   IdxScan *pScan;                 /* List of scan objects */
  12916   IdxWrite *pWrite;               /* List of write objects */
  12917   IdxStatement *pStatement;       /* List of IdxStatement objects */
  12918   int bRun;                       /* True once analysis has run */
  12919   char **pzErrmsg;
  12920   int rc;                         /* Error code from whereinfo hook */
  12921   IdxHash hIdx;                   /* Hash containing all candidate indexes */
  12922   char *zCandidates;              /* For EXPERT_REPORT_CANDIDATES */
  12923 };
  12924 
  12925 
  12926 /*
  12927 ** Allocate and return nByte bytes of zeroed memory using sqlite3_malloc(). 
  12928 ** If the allocation fails, set *pRc to SQLITE_NOMEM and return NULL.
  12929 */
  12930 static void *idxMalloc(int *pRc, int nByte){
  12931   void *pRet;
  12932   assert( *pRc==SQLITE_OK );
  12933   assert( nByte>0 );
  12934   pRet = sqlite3_malloc(nByte);
  12935   if( pRet ){
  12936     memset(pRet, 0, nByte);
  12937   }else{
  12938     *pRc = SQLITE_NOMEM;
  12939   }
  12940   return pRet;
  12941 }
  12942 
  12943 /*
  12944 ** Initialize an IdxHash hash table.
  12945 */
  12946 static void idxHashInit(IdxHash *pHash){
  12947   memset(pHash, 0, sizeof(IdxHash));
  12948 }
  12949 
  12950 /*
  12951 ** Reset an IdxHash hash table.
  12952 */
  12953 static void idxHashClear(IdxHash *pHash){
  12954   int i;
  12955   for(i=0; i<IDX_HASH_SIZE; i++){
  12956     IdxHashEntry *pEntry;
  12957     IdxHashEntry *pNext;
  12958     for(pEntry=pHash->aHash[i]; pEntry; pEntry=pNext){
  12959       pNext = pEntry->pHashNext;
  12960       sqlite3_free(pEntry->zVal2);
  12961       sqlite3_free(pEntry);
  12962     }
  12963   }
  12964   memset(pHash, 0, sizeof(IdxHash));
  12965 }
  12966 
  12967 /*
  12968 ** Return the index of the hash bucket that the string specified by the
  12969 ** arguments to this function belongs.
  12970 */
  12971 static int idxHashString(const char *z, int n){
  12972   unsigned int ret = 0;
  12973   int i;
  12974   for(i=0; i<n; i++){
  12975     ret += (ret<<3) + (unsigned char)(z[i]);
  12976   }
  12977   return (int)(ret % IDX_HASH_SIZE);
  12978 }
  12979 
  12980 /*
  12981 ** If zKey is already present in the hash table, return non-zero and do
  12982 ** nothing. Otherwise, add an entry with key zKey and payload string zVal to
  12983 ** the hash table passed as the second argument. 
  12984 */
  12985 static int idxHashAdd(
  12986   int *pRc, 
  12987   IdxHash *pHash, 
  12988   const char *zKey,
  12989   const char *zVal
  12990 ){
  12991   int nKey = STRLEN(zKey);
  12992   int iHash = idxHashString(zKey, nKey);
  12993   int nVal = (zVal ? STRLEN(zVal) : 0);
  12994   IdxHashEntry *pEntry;
  12995   assert( iHash>=0 );
  12996   for(pEntry=pHash->aHash[iHash]; pEntry; pEntry=pEntry->pHashNext){
  12997     if( STRLEN(pEntry->zKey)==nKey && 0==memcmp(pEntry->zKey, zKey, nKey) ){
  12998       return 1;
  12999     }
  13000   }
  13001   pEntry = idxMalloc(pRc, sizeof(IdxHashEntry) + nKey+1 + nVal+1);
  13002   if( pEntry ){
  13003     pEntry->zKey = (char*)&pEntry[1];
  13004     memcpy(pEntry->zKey, zKey, nKey);
  13005     if( zVal ){
  13006       pEntry->zVal = &pEntry->zKey[nKey+1];
  13007       memcpy(pEntry->zVal, zVal, nVal);
  13008     }
  13009     pEntry->pHashNext = pHash->aHash[iHash];
  13010     pHash->aHash[iHash] = pEntry;
  13011 
  13012     pEntry->pNext = pHash->pFirst;
  13013     pHash->pFirst = pEntry;
  13014   }
  13015   return 0;
  13016 }
  13017 
  13018 /*
  13019 ** If zKey/nKey is present in the hash table, return a pointer to the 
  13020 ** hash-entry object.
  13021 */
  13022 static IdxHashEntry *idxHashFind(IdxHash *pHash, const char *zKey, int nKey){
  13023   int iHash;
  13024   IdxHashEntry *pEntry;
  13025   if( nKey<0 ) nKey = STRLEN(zKey);
  13026   iHash = idxHashString(zKey, nKey);
  13027   assert( iHash>=0 );
  13028   for(pEntry=pHash->aHash[iHash]; pEntry; pEntry=pEntry->pHashNext){
  13029     if( STRLEN(pEntry->zKey)==nKey && 0==memcmp(pEntry->zKey, zKey, nKey) ){
  13030       return pEntry;
  13031     }
  13032   }
  13033   return 0;
  13034 }
  13035 
  13036 /*
  13037 ** If the hash table contains an entry with a key equal to the string
  13038 ** passed as the final two arguments to this function, return a pointer
  13039 ** to the payload string. Otherwise, if zKey/nKey is not present in the
  13040 ** hash table, return NULL.
  13041 */
  13042 static const char *idxHashSearch(IdxHash *pHash, const char *zKey, int nKey){
  13043   IdxHashEntry *pEntry = idxHashFind(pHash, zKey, nKey);
  13044   if( pEntry ) return pEntry->zVal;
  13045   return 0;
  13046 }
  13047 
  13048 /*
  13049 ** Allocate and return a new IdxConstraint object. Set the IdxConstraint.zColl
  13050 ** variable to point to a copy of nul-terminated string zColl.
  13051 */
  13052 static IdxConstraint *idxNewConstraint(int *pRc, const char *zColl){
  13053   IdxConstraint *pNew;
  13054   int nColl = STRLEN(zColl);
  13055 
  13056   assert( *pRc==SQLITE_OK );
  13057   pNew = (IdxConstraint*)idxMalloc(pRc, sizeof(IdxConstraint) * nColl + 1);
  13058   if( pNew ){
  13059     pNew->zColl = (char*)&pNew[1];
  13060     memcpy(pNew->zColl, zColl, nColl+1);
  13061   }
  13062   return pNew;
  13063 }
  13064 
  13065 /*
  13066 ** An error associated with database handle db has just occurred. Pass
  13067 ** the error message to callback function xOut.
  13068 */
  13069 static void idxDatabaseError(
  13070   sqlite3 *db,                    /* Database handle */
  13071   char **pzErrmsg                 /* Write error here */
  13072 ){
  13073   *pzErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(db));
  13074 }
  13075 
  13076 /*
  13077 ** Prepare an SQL statement.
  13078 */
  13079 static int idxPrepareStmt(
  13080   sqlite3 *db,                    /* Database handle to compile against */
  13081   sqlite3_stmt **ppStmt,          /* OUT: Compiled SQL statement */
  13082   char **pzErrmsg,                /* OUT: sqlite3_malloc()ed error message */
  13083   const char *zSql                /* SQL statement to compile */
  13084 ){
  13085   int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0);
  13086   if( rc!=SQLITE_OK ){
  13087     *ppStmt = 0;
  13088     idxDatabaseError(db, pzErrmsg);
  13089   }
  13090   return rc;
  13091 }
  13092 
  13093 /*
  13094 ** Prepare an SQL statement using the results of a printf() formatting.
  13095 */
  13096 static int idxPrintfPrepareStmt(
  13097   sqlite3 *db,                    /* Database handle to compile against */
  13098   sqlite3_stmt **ppStmt,          /* OUT: Compiled SQL statement */
  13099   char **pzErrmsg,                /* OUT: sqlite3_malloc()ed error message */
  13100   const char *zFmt,               /* printf() format of SQL statement */
  13101   ...                             /* Trailing printf() arguments */
  13102 ){
  13103   va_list ap;
  13104   int rc;
  13105   char *zSql;
  13106   va_start(ap, zFmt);
  13107   zSql = sqlite3_vmprintf(zFmt, ap);
  13108   if( zSql==0 ){
  13109     rc = SQLITE_NOMEM;
  13110   }else{
  13111     rc = idxPrepareStmt(db, ppStmt, pzErrmsg, zSql);
  13112     sqlite3_free(zSql);
  13113   }
  13114   va_end(ap);
  13115   return rc;
  13116 }
  13117 
  13118 
  13119 /*************************************************************************
  13120 ** Beginning of virtual table implementation.
  13121 */
  13122 typedef struct ExpertVtab ExpertVtab;
  13123 struct ExpertVtab {
  13124   sqlite3_vtab base;
  13125   IdxTable *pTab;
  13126   sqlite3expert *pExpert;
  13127 };
  13128 
  13129 typedef struct ExpertCsr ExpertCsr;
  13130 struct ExpertCsr {
  13131   sqlite3_vtab_cursor base;
  13132   sqlite3_stmt *pData;
  13133 };
  13134 
  13135 static char *expertDequote(const char *zIn){
  13136   int n = STRLEN(zIn);
  13137   char *zRet = sqlite3_malloc(n);
  13138 
  13139   assert( zIn[0]=='\'' );
  13140   assert( zIn[n-1]=='\'' );
  13141 
  13142   if( zRet ){
  13143     int iOut = 0;
  13144     int iIn = 0;
  13145     for(iIn=1; iIn<(n-1); iIn++){
  13146       if( zIn[iIn]=='\'' ){
  13147         assert( zIn[iIn+1]=='\'' );
  13148         iIn++;
  13149       }
  13150       zRet[iOut++] = zIn[iIn];
  13151     }
  13152     zRet[iOut] = '\0';
  13153   }
  13154 
  13155   return zRet;
  13156 }
  13157 
  13158 /* 
  13159 ** This function is the implementation of both the xConnect and xCreate
  13160 ** methods of the r-tree virtual table.
  13161 **
  13162 **   argv[0]   -> module name
  13163 **   argv[1]   -> database name
  13164 **   argv[2]   -> table name
  13165 **   argv[...] -> column names...
  13166 */
  13167 static int expertConnect(
  13168   sqlite3 *db,
  13169   void *pAux,
  13170   int argc, const char *const*argv,
  13171   sqlite3_vtab **ppVtab,
  13172   char **pzErr
  13173 ){
  13174   sqlite3expert *pExpert = (sqlite3expert*)pAux;
  13175   ExpertVtab *p = 0;
  13176   int rc;
  13177 
  13178   if( argc!=4 ){
  13179     *pzErr = sqlite3_mprintf("internal error!");
  13180     rc = SQLITE_ERROR;
  13181   }else{
  13182     char *zCreateTable = expertDequote(argv[3]);
  13183     if( zCreateTable ){
  13184       rc = sqlite3_declare_vtab(db, zCreateTable);
  13185       if( rc==SQLITE_OK ){
  13186         p = idxMalloc(&rc, sizeof(ExpertVtab));
  13187       }
  13188       if( rc==SQLITE_OK ){
  13189         p->pExpert = pExpert;
  13190         p->pTab = pExpert->pTable;
  13191         assert( sqlite3_stricmp(p->pTab->zName, argv[2])==0 );
  13192       }
  13193       sqlite3_free(zCreateTable);
  13194     }else{
  13195       rc = SQLITE_NOMEM;
  13196     }
  13197   }
  13198 
  13199   *ppVtab = (sqlite3_vtab*)p;
  13200   return rc;
  13201 }
  13202 
  13203 static int expertDisconnect(sqlite3_vtab *pVtab){
  13204   ExpertVtab *p = (ExpertVtab*)pVtab;
  13205   sqlite3_free(p);
  13206   return SQLITE_OK;
  13207 }
  13208 
  13209 static int expertBestIndex(sqlite3_vtab *pVtab, sqlite3_index_info *pIdxInfo){
  13210   ExpertVtab *p = (ExpertVtab*)pVtab;
  13211   int rc = SQLITE_OK;
  13212   int n = 0;
  13213   IdxScan *pScan;
  13214   const int opmask = 
  13215     SQLITE_INDEX_CONSTRAINT_EQ | SQLITE_INDEX_CONSTRAINT_GT |
  13216     SQLITE_INDEX_CONSTRAINT_LT | SQLITE_INDEX_CONSTRAINT_GE |
  13217     SQLITE_INDEX_CONSTRAINT_LE;
  13218 
  13219   pScan = idxMalloc(&rc, sizeof(IdxScan));
  13220   if( pScan ){
  13221     int i;
  13222 
  13223     /* Link the new scan object into the list */
  13224     pScan->pTab = p->pTab;
  13225     pScan->pNextScan = p->pExpert->pScan;
  13226     p->pExpert->pScan = pScan;
  13227 
  13228     /* Add the constraints to the IdxScan object */
  13229     for(i=0; i<pIdxInfo->nConstraint; i++){
  13230       struct sqlite3_index_constraint *pCons = &pIdxInfo->aConstraint[i];
  13231       if( pCons->usable 
  13232        && pCons->iColumn>=0 
  13233        && p->pTab->aCol[pCons->iColumn].iPk==0
  13234        && (pCons->op & opmask) 
  13235       ){
  13236         IdxConstraint *pNew;
  13237         const char *zColl = sqlite3_vtab_collation(pIdxInfo, i);
  13238         pNew = idxNewConstraint(&rc, zColl);
  13239         if( pNew ){
  13240           pNew->iCol = pCons->iColumn;
  13241           if( pCons->op==SQLITE_INDEX_CONSTRAINT_EQ ){
  13242             pNew->pNext = pScan->pEq;
  13243             pScan->pEq = pNew;
  13244           }else{
  13245             pNew->bRange = 1;
  13246             pNew->pNext = pScan->pRange;
  13247             pScan->pRange = pNew;
  13248           }
  13249         }
  13250         n++;
  13251         pIdxInfo->aConstraintUsage[i].argvIndex = n;
  13252       }
  13253     }
  13254 
  13255     /* Add the ORDER BY to the IdxScan object */
  13256     for(i=pIdxInfo->nOrderBy-1; i>=0; i--){
  13257       int iCol = pIdxInfo->aOrderBy[i].iColumn;
  13258       if( iCol>=0 ){
  13259         IdxConstraint *pNew = idxNewConstraint(&rc, p->pTab->aCol[iCol].zColl);
  13260         if( pNew ){
  13261           pNew->iCol = iCol;
  13262           pNew->bDesc = pIdxInfo->aOrderBy[i].desc;
  13263           pNew->pNext = pScan->pOrder;
  13264           pNew->pLink = pScan->pOrder;
  13265           pScan->pOrder = pNew;
  13266           n++;
  13267         }
  13268       }
  13269     }
  13270   }
  13271 
  13272   pIdxInfo->estimatedCost = 1000000.0 / (n+1);
  13273   return rc;
  13274 }
  13275 
  13276 static int expertUpdate(
  13277   sqlite3_vtab *pVtab, 
  13278   int nData, 
  13279   sqlite3_value **azData, 
  13280   sqlite_int64 *pRowid
  13281 ){
  13282   (void)pVtab;
  13283   (void)nData;
  13284   (void)azData;
  13285   (void)pRowid;
  13286   return SQLITE_OK;
  13287 }
  13288 
  13289 /* 
  13290 ** Virtual table module xOpen method.
  13291 */
  13292 static int expertOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
  13293   int rc = SQLITE_OK;
  13294   ExpertCsr *pCsr;
  13295   (void)pVTab;
  13296   pCsr = idxMalloc(&rc, sizeof(ExpertCsr));
  13297   *ppCursor = (sqlite3_vtab_cursor*)pCsr;
  13298   return rc;
  13299 }
  13300 
  13301 /* 
  13302 ** Virtual table module xClose method.
  13303 */
  13304 static int expertClose(sqlite3_vtab_cursor *cur){
  13305   ExpertCsr *pCsr = (ExpertCsr*)cur;
  13306   sqlite3_finalize(pCsr->pData);
  13307   sqlite3_free(pCsr);
  13308   return SQLITE_OK;
  13309 }
  13310 
  13311 /*
  13312 ** Virtual table module xEof method.
  13313 **
  13314 ** Return non-zero if the cursor does not currently point to a valid 
  13315 ** record (i.e if the scan has finished), or zero otherwise.
  13316 */
  13317 static int expertEof(sqlite3_vtab_cursor *cur){
  13318   ExpertCsr *pCsr = (ExpertCsr*)cur;
  13319   return pCsr->pData==0;
  13320 }
  13321 
  13322 /* 
  13323 ** Virtual table module xNext method.
  13324 */
  13325 static int expertNext(sqlite3_vtab_cursor *cur){
  13326   ExpertCsr *pCsr = (ExpertCsr*)cur;
  13327   int rc = SQLITE_OK;
  13328 
  13329   assert( pCsr->pData );
  13330   rc = sqlite3_step(pCsr->pData);
  13331   if( rc!=SQLITE_ROW ){
  13332     rc = sqlite3_finalize(pCsr->pData);
  13333     pCsr->pData = 0;
  13334   }else{
  13335     rc = SQLITE_OK;
  13336   }
  13337 
  13338   return rc;
  13339 }
  13340 
  13341 /* 
  13342 ** Virtual table module xRowid method.
  13343 */
  13344 static int expertRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
  13345   (void)cur;
  13346   *pRowid = 0;
  13347   return SQLITE_OK;
  13348 }
  13349 
  13350 /* 
  13351 ** Virtual table module xColumn method.
  13352 */
  13353 static int expertColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){
  13354   ExpertCsr *pCsr = (ExpertCsr*)cur;
  13355   sqlite3_value *pVal;
  13356   pVal = sqlite3_column_value(pCsr->pData, i);
  13357   if( pVal ){
  13358     sqlite3_result_value(ctx, pVal);
  13359   }
  13360   return SQLITE_OK;
  13361 }
  13362 
  13363 /* 
  13364 ** Virtual table module xFilter method.
  13365 */
  13366 static int expertFilter(
  13367   sqlite3_vtab_cursor *cur, 
  13368   int idxNum, const char *idxStr,
  13369   int argc, sqlite3_value **argv
  13370 ){
  13371   ExpertCsr *pCsr = (ExpertCsr*)cur;
  13372   ExpertVtab *pVtab = (ExpertVtab*)(cur->pVtab);
  13373   sqlite3expert *pExpert = pVtab->pExpert;
  13374   int rc;
  13375 
  13376   (void)idxNum;
  13377   (void)idxStr;
  13378   (void)argc;
  13379   (void)argv;
  13380   rc = sqlite3_finalize(pCsr->pData);
  13381   pCsr->pData = 0;
  13382   if( rc==SQLITE_OK ){
  13383     rc = idxPrintfPrepareStmt(pExpert->db, &pCsr->pData, &pVtab->base.zErrMsg,
  13384         "SELECT * FROM main.%Q WHERE sqlite_expert_sample()", pVtab->pTab->zName
  13385     );
  13386   }
  13387 
  13388   if( rc==SQLITE_OK ){
  13389     rc = expertNext(cur);
  13390   }
  13391   return rc;
  13392 }
  13393 
  13394 static int idxRegisterVtab(sqlite3expert *p){
  13395   static sqlite3_module expertModule = {
  13396     2,                            /* iVersion */
  13397     expertConnect,                /* xCreate - create a table */
  13398     expertConnect,                /* xConnect - connect to an existing table */
  13399     expertBestIndex,              /* xBestIndex - Determine search strategy */
  13400     expertDisconnect,             /* xDisconnect - Disconnect from a table */
  13401     expertDisconnect,             /* xDestroy - Drop a table */
  13402     expertOpen,                   /* xOpen - open a cursor */
  13403     expertClose,                  /* xClose - close a cursor */
  13404     expertFilter,                 /* xFilter - configure scan constraints */
  13405     expertNext,                   /* xNext - advance a cursor */
  13406     expertEof,                    /* xEof */
  13407     expertColumn,                 /* xColumn - read data */
  13408     expertRowid,                  /* xRowid - read data */
  13409     expertUpdate,                 /* xUpdate - write data */
  13410     0,                            /* xBegin - begin transaction */
  13411     0,                            /* xSync - sync transaction */
  13412     0,                            /* xCommit - commit transaction */
  13413     0,                            /* xRollback - rollback transaction */
  13414     0,                            /* xFindFunction - function overloading */
  13415     0,                            /* xRename - rename the table */
  13416     0,                            /* xSavepoint */
  13417     0,                            /* xRelease */
  13418     0,                            /* xRollbackTo */
  13419     0,                            /* xShadowName */
  13420     0,                            /* xIntegrity */
  13421   };
  13422 
  13423   return sqlite3_create_module(p->dbv, "expert", &expertModule, (void*)p);
  13424 }
  13425 /*
  13426 ** End of virtual table implementation.
  13427 *************************************************************************/
  13428 /*
  13429 ** Finalize SQL statement pStmt. If (*pRc) is SQLITE_OK when this function
  13430 ** is called, set it to the return value of sqlite3_finalize() before
  13431 ** returning. Otherwise, discard the sqlite3_finalize() return value.
  13432 */
  13433 static void idxFinalize(int *pRc, sqlite3_stmt *pStmt){
  13434   int rc = sqlite3_finalize(pStmt);
  13435   if( *pRc==SQLITE_OK ) *pRc = rc;
  13436 }
  13437 
  13438 /*
  13439 ** Attempt to allocate an IdxTable structure corresponding to table zTab
  13440 ** in the main database of connection db. If successful, set (*ppOut) to
  13441 ** point to the new object and return SQLITE_OK. Otherwise, return an
  13442 ** SQLite error code and set (*ppOut) to NULL. In this case *pzErrmsg may be
  13443 ** set to point to an error string.
  13444 **
  13445 ** It is the responsibility of the caller to eventually free either the
  13446 ** IdxTable object or error message using sqlite3_free().
  13447 */
  13448 static int idxGetTableInfo(
  13449   sqlite3 *db,                    /* Database connection to read details from */
  13450   const char *zTab,               /* Table name */
  13451   IdxTable **ppOut,               /* OUT: New object (if successful) */
  13452   char **pzErrmsg                 /* OUT: Error message (if not) */
  13453 ){
  13454   sqlite3_stmt *p1 = 0;
  13455   int nCol = 0;
  13456   int nTab;
  13457   int nByte;
  13458   IdxTable *pNew = 0;
  13459   int rc, rc2;
  13460   char *pCsr = 0;
  13461   int nPk = 0;
  13462 
  13463   *ppOut = 0;
  13464   if( zTab==0 ) return SQLITE_ERROR;
  13465   nTab = STRLEN(zTab);
  13466   nByte = sizeof(IdxTable) + nTab + 1;
  13467   rc = idxPrintfPrepareStmt(db, &p1, pzErrmsg, "PRAGMA table_xinfo=%Q", zTab);
  13468   while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){
  13469     const char *zCol = (const char*)sqlite3_column_text(p1, 1);
  13470     const char *zColSeq = 0;
  13471     if( zCol==0 ){
  13472       rc = SQLITE_ERROR;
  13473       break;
  13474     }
  13475     nByte += 1 + STRLEN(zCol);
  13476     rc = sqlite3_table_column_metadata(
  13477         db, "main", zTab, zCol, 0, &zColSeq, 0, 0, 0
  13478     );
  13479     if( zColSeq==0 ) zColSeq = "binary";
  13480     nByte += 1 + STRLEN(zColSeq);
  13481     nCol++;
  13482     nPk += (sqlite3_column_int(p1, 5)>0);
  13483   }
  13484   rc2 = sqlite3_reset(p1);
  13485   if( rc==SQLITE_OK ) rc = rc2;
  13486 
  13487   nByte += sizeof(IdxColumn) * nCol;
  13488   if( rc==SQLITE_OK ){
  13489     pNew = idxMalloc(&rc, nByte);
  13490   }
  13491   if( rc==SQLITE_OK ){
  13492     pNew->aCol = (IdxColumn*)&pNew[1];
  13493     pNew->nCol = nCol;
  13494     pCsr = (char*)&pNew->aCol[nCol];
  13495   }
  13496 
  13497   nCol = 0;
  13498   while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){
  13499     const char *zCol = (const char*)sqlite3_column_text(p1, 1);
  13500     const char *zColSeq = 0;
  13501     int nCopy;
  13502     if( zCol==0 ) continue;
  13503     nCopy = STRLEN(zCol) + 1;
  13504     pNew->aCol[nCol].zName = pCsr;
  13505     pNew->aCol[nCol].iPk = (sqlite3_column_int(p1, 5)==1 && nPk==1);
  13506     memcpy(pCsr, zCol, nCopy);
  13507     pCsr += nCopy;
  13508 
  13509     rc = sqlite3_table_column_metadata(
  13510         db, "main", zTab, zCol, 0, &zColSeq, 0, 0, 0
  13511     );
  13512     if( rc==SQLITE_OK ){
  13513       if( zColSeq==0 ) zColSeq = "binary";
  13514       nCopy = STRLEN(zColSeq) + 1;
  13515       pNew->aCol[nCol].zColl = pCsr;
  13516       memcpy(pCsr, zColSeq, nCopy);
  13517       pCsr += nCopy;
  13518     }
  13519 
  13520     nCol++;
  13521   }
  13522   idxFinalize(&rc, p1);
  13523 
  13524   if( rc!=SQLITE_OK ){
  13525     sqlite3_free(pNew);
  13526     pNew = 0;
  13527   }else if( ALWAYS(pNew!=0) ){
  13528     pNew->zName = pCsr;
  13529     if( ALWAYS(pNew->zName!=0) ) memcpy(pNew->zName, zTab, nTab+1);
  13530   }
  13531 
  13532   *ppOut = pNew;
  13533   return rc;
  13534 }
  13535 
  13536 /*
  13537 ** This function is a no-op if *pRc is set to anything other than 
  13538 ** SQLITE_OK when it is called.
  13539 **
  13540 ** If *pRc is initially set to SQLITE_OK, then the text specified by
  13541 ** the printf() style arguments is appended to zIn and the result returned
  13542 ** in a buffer allocated by sqlite3_malloc(). sqlite3_free() is called on
  13543 ** zIn before returning.
  13544 */
  13545 static char *idxAppendText(int *pRc, char *zIn, const char *zFmt, ...){
  13546   va_list ap;
  13547   char *zAppend = 0;
  13548   char *zRet = 0;
  13549   int nIn = zIn ? STRLEN(zIn) : 0;
  13550   int nAppend = 0;
  13551   va_start(ap, zFmt);
  13552   if( *pRc==SQLITE_OK ){
  13553     zAppend = sqlite3_vmprintf(zFmt, ap);
  13554     if( zAppend ){
  13555       nAppend = STRLEN(zAppend);
  13556       zRet = (char*)sqlite3_malloc(nIn + nAppend + 1);
  13557     }
  13558     if( zAppend && zRet ){
  13559       if( nIn ) memcpy(zRet, zIn, nIn);
  13560       memcpy(&zRet[nIn], zAppend, nAppend+1);
  13561     }else{
  13562       sqlite3_free(zRet);
  13563       zRet = 0;
  13564       *pRc = SQLITE_NOMEM;
  13565     }
  13566     sqlite3_free(zAppend);
  13567     sqlite3_free(zIn);
  13568   }
  13569   va_end(ap);
  13570   return zRet;
  13571 }
  13572 
  13573 /*
  13574 ** Return true if zId must be quoted in order to use it as an SQL
  13575 ** identifier, or false otherwise.
  13576 */
  13577 static int idxIdentifierRequiresQuotes(const char *zId){
  13578   int i;
  13579   int nId = STRLEN(zId);
  13580   
  13581   if( sqlite3_keyword_check(zId, nId) ) return 1;
  13582 
  13583   for(i=0; zId[i]; i++){
  13584     if( !(zId[i]=='_')
  13585      && !(zId[i]>='0' && zId[i]<='9')
  13586      && !(zId[i]>='a' && zId[i]<='z')
  13587      && !(zId[i]>='A' && zId[i]<='Z')
  13588     ){
  13589       return 1;
  13590     }
  13591   }
  13592   return 0;
  13593 }
  13594 
  13595 /*
  13596 ** This function appends an index column definition suitable for constraint
  13597 ** pCons to the string passed as zIn and returns the result.
  13598 */
  13599 static char *idxAppendColDefn(
  13600   int *pRc,                       /* IN/OUT: Error code */
  13601   char *zIn,                      /* Column defn accumulated so far */
  13602   IdxTable *pTab,                 /* Table index will be created on */
  13603   IdxConstraint *pCons
  13604 ){
  13605   char *zRet = zIn;
  13606   IdxColumn *p = &pTab->aCol[pCons->iCol];
  13607   if( zRet ) zRet = idxAppendText(pRc, zRet, ", ");
  13608 
  13609   if( idxIdentifierRequiresQuotes(p->zName) ){
  13610     zRet = idxAppendText(pRc, zRet, "%Q", p->zName);
  13611   }else{
  13612     zRet = idxAppendText(pRc, zRet, "%s", p->zName);
  13613   }
  13614 
  13615   if( sqlite3_stricmp(p->zColl, pCons->zColl) ){
  13616     if( idxIdentifierRequiresQuotes(pCons->zColl) ){
  13617       zRet = idxAppendText(pRc, zRet, " COLLATE %Q", pCons->zColl);
  13618     }else{
  13619       zRet = idxAppendText(pRc, zRet, " COLLATE %s", pCons->zColl);
  13620     }
  13621   }
  13622 
  13623   if( pCons->bDesc ){
  13624     zRet = idxAppendText(pRc, zRet, " DESC");
  13625   }
  13626   return zRet;
  13627 }
  13628 
  13629 /*
  13630 ** Search database dbm for an index compatible with the one idxCreateFromCons()
  13631 ** would create from arguments pScan, pEq and pTail. If no error occurs and 
  13632 ** such an index is found, return non-zero. Or, if no such index is found,
  13633 ** return zero.
  13634 **
  13635 ** If an error occurs, set *pRc to an SQLite error code and return zero.
  13636 */
  13637 static int idxFindCompatible(
  13638   int *pRc,                       /* OUT: Error code */
  13639   sqlite3* dbm,                   /* Database to search */
  13640   IdxScan *pScan,                 /* Scan for table to search for index on */
  13641   IdxConstraint *pEq,             /* List of == constraints */
  13642   IdxConstraint *pTail            /* List of range constraints */
  13643 ){
  13644   const char *zTbl = pScan->pTab->zName;
  13645   sqlite3_stmt *pIdxList = 0;
  13646   IdxConstraint *pIter;
  13647   int nEq = 0;                    /* Number of elements in pEq */
  13648   int rc;
  13649 
  13650   /* Count the elements in list pEq */
  13651   for(pIter=pEq; pIter; pIter=pIter->pLink) nEq++;
  13652 
  13653   rc = idxPrintfPrepareStmt(dbm, &pIdxList, 0, "PRAGMA index_list=%Q", zTbl);
  13654   while( rc==SQLITE_OK && sqlite3_step(pIdxList)==SQLITE_ROW ){
  13655     int bMatch = 1;
  13656     IdxConstraint *pT = pTail;
  13657     sqlite3_stmt *pInfo = 0;
  13658     const char *zIdx = (const char*)sqlite3_column_text(pIdxList, 1);
  13659     if( zIdx==0 ) continue;
  13660 
  13661     /* Zero the IdxConstraint.bFlag values in the pEq list */
  13662     for(pIter=pEq; pIter; pIter=pIter->pLink) pIter->bFlag = 0;
  13663 
  13664     rc = idxPrintfPrepareStmt(dbm, &pInfo, 0, "PRAGMA index_xInfo=%Q", zIdx);
  13665     while( rc==SQLITE_OK && sqlite3_step(pInfo)==SQLITE_ROW ){
  13666       int iIdx = sqlite3_column_int(pInfo, 0);
  13667       int iCol = sqlite3_column_int(pInfo, 1);
  13668       const char *zColl = (const char*)sqlite3_column_text(pInfo, 4);
  13669 
  13670       if( iIdx<nEq ){
  13671         for(pIter=pEq; pIter; pIter=pIter->pLink){
  13672           if( pIter->bFlag ) continue;
  13673           if( pIter->iCol!=iCol ) continue;
  13674           if( sqlite3_stricmp(pIter->zColl, zColl) ) continue;
  13675           pIter->bFlag = 1;
  13676           break;
  13677         }
  13678         if( pIter==0 ){
  13679           bMatch = 0;
  13680           break;
  13681         }
  13682       }else{
  13683         if( pT ){
  13684           if( pT->iCol!=iCol || sqlite3_stricmp(pT->zColl, zColl) ){
  13685             bMatch = 0;
  13686             break;
  13687           }
  13688           pT = pT->pLink;
  13689         }
  13690       }
  13691     }
  13692     idxFinalize(&rc, pInfo);
  13693 
  13694     if( rc==SQLITE_OK && bMatch ){
  13695       sqlite3_finalize(pIdxList);
  13696       return 1;
  13697     }
  13698   }
  13699   idxFinalize(&rc, pIdxList);
  13700 
  13701   *pRc = rc;
  13702   return 0;
  13703 }
  13704 
  13705 /* Callback for sqlite3_exec() with query with leading count(*) column.
  13706  * The first argument is expected to be an int*, referent to be incremented
  13707  * if that leading column is not exactly '0'.
  13708  */
  13709 static int countNonzeros(void* pCount, int nc,
  13710                          char* azResults[], char* azColumns[]){
  13711   (void)azColumns;  /* Suppress unused parameter warning */
  13712   if( nc>0 && (azResults[0][0]!='0' || azResults[0][1]!=0) ){
  13713     *((int *)pCount) += 1;
  13714   }
  13715   return 0;
  13716 }
  13717 
  13718 static int idxCreateFromCons(
  13719   sqlite3expert *p,
  13720   IdxScan *pScan,
  13721   IdxConstraint *pEq, 
  13722   IdxConstraint *pTail
  13723 ){
  13724   sqlite3 *dbm = p->dbm;
  13725   int rc = SQLITE_OK;
  13726   if( (pEq || pTail) && 0==idxFindCompatible(&rc, dbm, pScan, pEq, pTail) ){
  13727     IdxTable *pTab = pScan->pTab;
  13728     char *zCols = 0;
  13729     char *zIdx = 0;
  13730     IdxConstraint *pCons;
  13731     unsigned int h = 0;
  13732     const char *zFmt;
  13733 
  13734     for(pCons=pEq; pCons; pCons=pCons->pLink){
  13735       zCols = idxAppendColDefn(&rc, zCols, pTab, pCons);
  13736     }
  13737     for(pCons=pTail; pCons; pCons=pCons->pLink){
  13738       zCols = idxAppendColDefn(&rc, zCols, pTab, pCons);
  13739     }
  13740 
  13741     if( rc==SQLITE_OK ){
  13742       /* Hash the list of columns to come up with a name for the index */
  13743       const char *zTable = pScan->pTab->zName;
  13744       int quoteTable = idxIdentifierRequiresQuotes(zTable);
  13745       char *zName = 0;          /* Index name */
  13746       int collisions = 0;
  13747       do{
  13748         int i;
  13749         char *zFind;
  13750         for(i=0; zCols[i]; i++){
  13751           h += ((h<<3) + zCols[i]);
  13752         }
  13753         sqlite3_free(zName);
  13754         zName = sqlite3_mprintf("%s_idx_%08x", zTable, h);
  13755         if( zName==0 ) break;
  13756         /* Is is unique among table, view and index names? */
  13757         zFmt = "SELECT count(*) FROM sqlite_schema WHERE name=%Q"
  13758           " AND type in ('index','table','view')";
  13759         zFind = sqlite3_mprintf(zFmt, zName);
  13760         i = 0;
  13761         rc = sqlite3_exec(dbm, zFind, countNonzeros, &i, 0);
  13762         assert(rc==SQLITE_OK);
  13763         sqlite3_free(zFind);
  13764         if( i==0 ){
  13765           collisions = 0;
  13766           break;
  13767         }
  13768         ++collisions;
  13769       }while( collisions<50 && zName!=0 );
  13770       if( collisions ){
  13771         /* This return means "Gave up trying to find a unique index name." */
  13772         rc = SQLITE_BUSY_TIMEOUT;
  13773       }else if( zName==0 ){
  13774         rc = SQLITE_NOMEM;
  13775       }else{
  13776         if( quoteTable ){
  13777           zFmt = "CREATE INDEX \"%w\" ON \"%w\"(%s)";
  13778         }else{
  13779           zFmt = "CREATE INDEX %s ON %s(%s)";
  13780         }
  13781         zIdx = sqlite3_mprintf(zFmt, zName, zTable, zCols);
  13782         if( !zIdx ){
  13783           rc = SQLITE_NOMEM;
  13784         }else{
  13785           rc = sqlite3_exec(dbm, zIdx, 0, 0, p->pzErrmsg);
  13786           if( rc!=SQLITE_OK ){
  13787             rc = SQLITE_BUSY_TIMEOUT;
  13788           }else{
  13789             idxHashAdd(&rc, &p->hIdx, zName, zIdx);
  13790           }
  13791         }
  13792         sqlite3_free(zName);
  13793         sqlite3_free(zIdx);
  13794       }
  13795     }
  13796 
  13797     sqlite3_free(zCols);
  13798   }
  13799   return rc;
  13800 }
  13801 
  13802 /*
  13803 ** Return true if list pList (linked by IdxConstraint.pLink) contains
  13804 ** a constraint compatible with *p. Otherwise return false.
  13805 */
  13806 static int idxFindConstraint(IdxConstraint *pList, IdxConstraint *p){
  13807   IdxConstraint *pCmp;
  13808   for(pCmp=pList; pCmp; pCmp=pCmp->pLink){
  13809     if( p->iCol==pCmp->iCol ) return 1;
  13810   }
  13811   return 0;
  13812 }
  13813 
  13814 static int idxCreateFromWhere(
  13815   sqlite3expert *p, 
  13816   IdxScan *pScan,                 /* Create indexes for this scan */
  13817   IdxConstraint *pTail            /* range/ORDER BY constraints for inclusion */
  13818 ){
  13819   IdxConstraint *p1 = 0;
  13820   IdxConstraint *pCon;
  13821   int rc;
  13822 
  13823   /* Gather up all the == constraints. */
  13824   for(pCon=pScan->pEq; pCon; pCon=pCon->pNext){
  13825     if( !idxFindConstraint(p1, pCon) && !idxFindConstraint(pTail, pCon) ){
  13826       pCon->pLink = p1;
  13827       p1 = pCon;
  13828     }
  13829   }
  13830 
  13831   /* Create an index using the == constraints collected above. And the
  13832   ** range constraint/ORDER BY terms passed in by the caller, if any. */
  13833   rc = idxCreateFromCons(p, pScan, p1, pTail);
  13834 
  13835   /* If no range/ORDER BY passed by the caller, create a version of the
  13836   ** index for each range constraint.  */
  13837   if( pTail==0 ){
  13838     for(pCon=pScan->pRange; rc==SQLITE_OK && pCon; pCon=pCon->pNext){
  13839       assert( pCon->pLink==0 );
  13840       if( !idxFindConstraint(p1, pCon) && !idxFindConstraint(pTail, pCon) ){
  13841         rc = idxCreateFromCons(p, pScan, p1, pCon);
  13842       }
  13843     }
  13844   }
  13845 
  13846   return rc;
  13847 }
  13848 
  13849 /*
  13850 ** Create candidate indexes in database [dbm] based on the data in 
  13851 ** linked-list pScan.
  13852 */
  13853 static int idxCreateCandidates(sqlite3expert *p){
  13854   int rc = SQLITE_OK;
  13855   IdxScan *pIter;
  13856 
  13857   for(pIter=p->pScan; pIter && rc==SQLITE_OK; pIter=pIter->pNextScan){
  13858     rc = idxCreateFromWhere(p, pIter, 0);
  13859     if( rc==SQLITE_OK && pIter->pOrder ){
  13860       rc = idxCreateFromWhere(p, pIter, pIter->pOrder);
  13861     }
  13862   }
  13863 
  13864   return rc;
  13865 }
  13866 
  13867 /*
  13868 ** Free all elements of the linked list starting at pConstraint.
  13869 */
  13870 static void idxConstraintFree(IdxConstraint *pConstraint){
  13871   IdxConstraint *pNext;
  13872   IdxConstraint *p;
  13873 
  13874   for(p=pConstraint; p; p=pNext){
  13875     pNext = p->pNext;
  13876     sqlite3_free(p);
  13877   }
  13878 }
  13879 
  13880 /*
  13881 ** Free all elements of the linked list starting from pScan up until pLast
  13882 ** (pLast is not freed).
  13883 */
  13884 static void idxScanFree(IdxScan *pScan, IdxScan *pLast){
  13885   IdxScan *p;
  13886   IdxScan *pNext;
  13887   for(p=pScan; p!=pLast; p=pNext){
  13888     pNext = p->pNextScan;
  13889     idxConstraintFree(p->pOrder);
  13890     idxConstraintFree(p->pEq);
  13891     idxConstraintFree(p->pRange);
  13892     sqlite3_free(p);
  13893   }
  13894 }
  13895 
  13896 /*
  13897 ** Free all elements of the linked list starting from pStatement up 
  13898 ** until pLast (pLast is not freed).
  13899 */
  13900 static void idxStatementFree(IdxStatement *pStatement, IdxStatement *pLast){
  13901   IdxStatement *p;
  13902   IdxStatement *pNext;
  13903   for(p=pStatement; p!=pLast; p=pNext){
  13904     pNext = p->pNext;
  13905     sqlite3_free(p->zEQP);
  13906     sqlite3_free(p->zIdx);
  13907     sqlite3_free(p);
  13908   }
  13909 }
  13910 
  13911 /*
  13912 ** Free the linked list of IdxTable objects starting at pTab.
  13913 */
  13914 static void idxTableFree(IdxTable *pTab){
  13915   IdxTable *pIter;
  13916   IdxTable *pNext;
  13917   for(pIter=pTab; pIter; pIter=pNext){
  13918     pNext = pIter->pNext;
  13919     sqlite3_free(pIter);
  13920   }
  13921 }
  13922 
  13923 /*
  13924 ** Free the linked list of IdxWrite objects starting at pTab.
  13925 */
  13926 static void idxWriteFree(IdxWrite *pTab){
  13927   IdxWrite *pIter;
  13928   IdxWrite *pNext;
  13929   for(pIter=pTab; pIter; pIter=pNext){
  13930     pNext = pIter->pNext;
  13931     sqlite3_free(pIter);
  13932   }
  13933 }
  13934 
  13935 
  13936 
  13937 /*
  13938 ** This function is called after candidate indexes have been created. It
  13939 ** runs all the queries to see which indexes they prefer, and populates
  13940 ** IdxStatement.zIdx and IdxStatement.zEQP with the results.
  13941 */
  13942 static int idxFindIndexes(
  13943   sqlite3expert *p,
  13944   char **pzErr                         /* OUT: Error message (sqlite3_malloc) */
  13945 ){
  13946   IdxStatement *pStmt;
  13947   sqlite3 *dbm = p->dbm;
  13948   int rc = SQLITE_OK;
  13949 
  13950   IdxHash hIdx;
  13951   idxHashInit(&hIdx);
  13952 
  13953   for(pStmt=p->pStatement; rc==SQLITE_OK && pStmt; pStmt=pStmt->pNext){
  13954     IdxHashEntry *pEntry;
  13955     sqlite3_stmt *pExplain = 0;
  13956     idxHashClear(&hIdx);
  13957     rc = idxPrintfPrepareStmt(dbm, &pExplain, pzErr,
  13958         "EXPLAIN QUERY PLAN %s", pStmt->zSql
  13959     );
  13960     while( rc==SQLITE_OK && sqlite3_step(pExplain)==SQLITE_ROW ){
  13961       /* int iId = sqlite3_column_int(pExplain, 0); */
  13962       /* int iParent = sqlite3_column_int(pExplain, 1); */
  13963       /* int iNotUsed = sqlite3_column_int(pExplain, 2); */
  13964       const char *zDetail = (const char*)sqlite3_column_text(pExplain, 3);
  13965       int nDetail;
  13966       int i;
  13967 
  13968       if( !zDetail ) continue;
  13969       nDetail = STRLEN(zDetail);
  13970 
  13971       for(i=0; i<nDetail; i++){
  13972         const char *zIdx = 0;
  13973         if( i+13<nDetail && memcmp(&zDetail[i], " USING INDEX ", 13)==0 ){
  13974           zIdx = &zDetail[i+13];
  13975         }else if( i+22<nDetail 
  13976             && memcmp(&zDetail[i], " USING COVERING INDEX ", 22)==0 
  13977         ){
  13978           zIdx = &zDetail[i+22];
  13979         }
  13980         if( zIdx ){
  13981           const char *zSql;
  13982           int nIdx = 0;
  13983           while( zIdx[nIdx]!='\0' && (zIdx[nIdx]!=' ' || zIdx[nIdx+1]!='(') ){
  13984             nIdx++;
  13985           }
  13986           zSql = idxHashSearch(&p->hIdx, zIdx, nIdx);
  13987           if( zSql ){
  13988             idxHashAdd(&rc, &hIdx, zSql, 0);
  13989             if( rc ) goto find_indexes_out;
  13990           }
  13991           break;
  13992         }
  13993       }
  13994 
  13995       if( zDetail[0]!='-' ){
  13996         pStmt->zEQP = idxAppendText(&rc, pStmt->zEQP, "%s\n", zDetail);
  13997       }
  13998     }
  13999 
  14000     for(pEntry=hIdx.pFirst; pEntry; pEntry=pEntry->pNext){
  14001       pStmt->zIdx = idxAppendText(&rc, pStmt->zIdx, "%s;\n", pEntry->zKey);
  14002     }
  14003 
  14004     idxFinalize(&rc, pExplain);
  14005   }
  14006 
  14007  find_indexes_out:
  14008   idxHashClear(&hIdx);
  14009   return rc;
  14010 }
  14011 
  14012 static int idxAuthCallback(
  14013   void *pCtx,
  14014   int eOp,
  14015   const char *z3,
  14016   const char *z4,
  14017   const char *zDb,
  14018   const char *zTrigger
  14019 ){
  14020   int rc = SQLITE_OK;
  14021   (void)z4;
  14022   (void)zTrigger;
  14023   if( eOp==SQLITE_INSERT || eOp==SQLITE_UPDATE || eOp==SQLITE_DELETE ){
  14024     if( sqlite3_stricmp(zDb, "main")==0 ){
  14025       sqlite3expert *p = (sqlite3expert*)pCtx;
  14026       IdxTable *pTab;
  14027       for(pTab=p->pTable; pTab; pTab=pTab->pNext){
  14028         if( 0==sqlite3_stricmp(z3, pTab->zName) ) break;
  14029       }
  14030       if( pTab ){
  14031         IdxWrite *pWrite;
  14032         for(pWrite=p->pWrite; pWrite; pWrite=pWrite->pNext){
  14033           if( pWrite->pTab==pTab && pWrite->eOp==eOp ) break;
  14034         }
  14035         if( pWrite==0 ){
  14036           pWrite = idxMalloc(&rc, sizeof(IdxWrite));
  14037           if( rc==SQLITE_OK ){
  14038             pWrite->pTab = pTab;
  14039             pWrite->eOp = eOp;
  14040             pWrite->pNext = p->pWrite;
  14041             p->pWrite = pWrite;
  14042           }
  14043         }
  14044       }
  14045     }
  14046   }
  14047   return rc;
  14048 }
  14049 
  14050 static int idxProcessOneTrigger(
  14051   sqlite3expert *p, 
  14052   IdxWrite *pWrite, 
  14053   char **pzErr
  14054 ){
  14055   static const char *zInt = UNIQUE_TABLE_NAME;
  14056   static const char *zDrop = "DROP TABLE " UNIQUE_TABLE_NAME;
  14057   IdxTable *pTab = pWrite->pTab;
  14058   const char *zTab = pTab->zName;
  14059   const char *zSql = 
  14060     "SELECT 'CREATE TEMP' || substr(sql, 7) FROM sqlite_schema "
  14061     "WHERE tbl_name = %Q AND type IN ('table', 'trigger') "
  14062     "ORDER BY type;";
  14063   sqlite3_stmt *pSelect = 0;
  14064   int rc = SQLITE_OK;
  14065   char *zWrite = 0;
  14066 
  14067   /* Create the table and its triggers in the temp schema */
  14068   rc = idxPrintfPrepareStmt(p->db, &pSelect, pzErr, zSql, zTab, zTab);
  14069   while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSelect) ){
  14070     const char *zCreate = (const char*)sqlite3_column_text(pSelect, 0);
  14071     if( zCreate==0 ) continue;
  14072     rc = sqlite3_exec(p->dbv, zCreate, 0, 0, pzErr);
  14073   }
  14074   idxFinalize(&rc, pSelect);
  14075 
  14076   /* Rename the table in the temp schema to zInt */
  14077   if( rc==SQLITE_OK ){
  14078     char *z = sqlite3_mprintf("ALTER TABLE temp.%Q RENAME TO %Q", zTab, zInt);
  14079     if( z==0 ){
  14080       rc = SQLITE_NOMEM;
  14081     }else{
  14082       rc = sqlite3_exec(p->dbv, z, 0, 0, pzErr);
  14083       sqlite3_free(z);
  14084     }
  14085   }
  14086 
  14087   switch( pWrite->eOp ){
  14088     case SQLITE_INSERT: {
  14089       int i;
  14090       zWrite = idxAppendText(&rc, zWrite, "INSERT INTO %Q VALUES(", zInt);
  14091       for(i=0; i<pTab->nCol; i++){
  14092         zWrite = idxAppendText(&rc, zWrite, "%s?", i==0 ? "" : ", ");
  14093       }
  14094       zWrite = idxAppendText(&rc, zWrite, ")");
  14095       break;
  14096     }
  14097     case SQLITE_UPDATE: {
  14098       int i;
  14099       zWrite = idxAppendText(&rc, zWrite, "UPDATE %Q SET ", zInt);
  14100       for(i=0; i<pTab->nCol; i++){
  14101         zWrite = idxAppendText(&rc, zWrite, "%s%Q=?", i==0 ? "" : ", ", 
  14102             pTab->aCol[i].zName
  14103         );
  14104       }
  14105       break;
  14106     }
  14107     default: {
  14108       assert( pWrite->eOp==SQLITE_DELETE );
  14109       if( rc==SQLITE_OK ){
  14110         zWrite = sqlite3_mprintf("DELETE FROM %Q", zInt);
  14111         if( zWrite==0 ) rc = SQLITE_NOMEM;
  14112       }
  14113     }
  14114   }
  14115 
  14116   if( rc==SQLITE_OK ){
  14117     sqlite3_stmt *pX = 0;
  14118     rc = sqlite3_prepare_v2(p->dbv, zWrite, -1, &pX, 0);
  14119     idxFinalize(&rc, pX);
  14120     if( rc!=SQLITE_OK ){
  14121       idxDatabaseError(p->dbv, pzErr);
  14122     }
  14123   }
  14124   sqlite3_free(zWrite);
  14125 
  14126   if( rc==SQLITE_OK ){
  14127     rc = sqlite3_exec(p->dbv, zDrop, 0, 0, pzErr);
  14128   }
  14129 
  14130   return rc;
  14131 }
  14132 
  14133 static int idxProcessTriggers(sqlite3expert *p, char **pzErr){
  14134   int rc = SQLITE_OK;
  14135   IdxWrite *pEnd = 0;
  14136   IdxWrite *pFirst = p->pWrite;
  14137 
  14138   while( rc==SQLITE_OK && pFirst!=pEnd ){
  14139     IdxWrite *pIter;
  14140     for(pIter=pFirst; rc==SQLITE_OK && pIter!=pEnd; pIter=pIter->pNext){
  14141       rc = idxProcessOneTrigger(p, pIter, pzErr);
  14142     }
  14143     pEnd = pFirst;
  14144     pFirst = p->pWrite;
  14145   }
  14146 
  14147   return rc;
  14148 }
  14149 
  14150 /*
  14151 ** This function tests if the schema of the main database of database handle
  14152 ** db contains an object named zTab. Assuming no error occurs, output parameter
  14153 ** (*pbContains) is set to true if zTab exists, or false if it does not.
  14154 **
  14155 ** Or, if an error occurs, an SQLite error code is returned. The final value
  14156 ** of (*pbContains) is undefined in this case.
  14157 */
  14158 static int expertDbContainsObject(
  14159   sqlite3 *db, 
  14160   const char *zTab, 
  14161   int *pbContains                 /* OUT: True if object exists */
  14162 ){
  14163   const char *zSql = "SELECT 1 FROM sqlite_schema WHERE name = ?";
  14164   sqlite3_stmt *pSql = 0;
  14165   int rc = SQLITE_OK;
  14166   int ret = 0;
  14167 
  14168   rc = sqlite3_prepare_v2(db, zSql, -1, &pSql, 0);
  14169   if( rc==SQLITE_OK ){
  14170     sqlite3_bind_text(pSql, 1, zTab, -1, SQLITE_STATIC);
  14171     if( SQLITE_ROW==sqlite3_step(pSql) ){
  14172       ret = 1;
  14173     }
  14174     rc = sqlite3_finalize(pSql);
  14175   }
  14176 
  14177   *pbContains = ret;
  14178   return rc;
  14179 }
  14180 
  14181 /*
  14182 ** Execute SQL command zSql using database handle db. If no error occurs,
  14183 ** set (*pzErr) to NULL and return SQLITE_OK. 
  14184 **
  14185 ** If an error does occur, return an SQLite error code and set (*pzErr) to
  14186 ** point to a buffer containing an English language error message. Except,
  14187 ** if the error message begins with "no such module:", then ignore the
  14188 ** error and return as if the SQL statement had succeeded.
  14189 **
  14190 ** This is used to copy as much of the database schema as possible while 
  14191 ** ignoring any errors related to missing virtual table modules.
  14192 */
  14193 static int expertSchemaSql(sqlite3 *db, const char *zSql, char **pzErr){
  14194   int rc = SQLITE_OK;
  14195   char *zErr = 0;
  14196 
  14197   rc = sqlite3_exec(db, zSql, 0, 0, &zErr);
  14198   if( rc!=SQLITE_OK && zErr ){
  14199     int nErr = STRLEN(zErr);
  14200     if( nErr>=15 && memcmp(zErr, "no such module:", 15)==0 ){
  14201       sqlite3_free(zErr);
  14202       rc = SQLITE_OK;
  14203       zErr = 0;
  14204     }
  14205   }
  14206 
  14207   *pzErr = zErr;
  14208   return rc;
  14209 }
  14210 
  14211 static int idxCreateVtabSchema(sqlite3expert *p, char **pzErrmsg){
  14212   int rc = idxRegisterVtab(p);
  14213   sqlite3_stmt *pSchema = 0;
  14214 
  14215   /* For each table in the main db schema:
  14216   **
  14217   **   1) Add an entry to the p->pTable list, and
  14218   **   2) Create the equivalent virtual table in dbv.
  14219   */
  14220   rc = idxPrepareStmt(p->db, &pSchema, pzErrmsg,
  14221       "SELECT type, name, sql, 1, "
  14222       "       substr(sql,1,14)=='create virtual' COLLATE nocase "
  14223       "FROM sqlite_schema "
  14224       "WHERE type IN ('table','view') AND "
  14225       "      substr(name,1,7)!='sqlite_' COLLATE nocase "
  14226       " UNION ALL "
  14227       "SELECT type, name, sql, 2, 0 FROM sqlite_schema "
  14228       "WHERE type = 'trigger'"
  14229       "  AND tbl_name IN(SELECT name FROM sqlite_schema WHERE type = 'view') "
  14230       "ORDER BY 4, 5 DESC, 1"
  14231   );
  14232   while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSchema) ){
  14233     const char *zType = (const char*)sqlite3_column_text(pSchema, 0);
  14234     const char *zName = (const char*)sqlite3_column_text(pSchema, 1);
  14235     const char *zSql = (const char*)sqlite3_column_text(pSchema, 2);
  14236     int bVirtual = sqlite3_column_int(pSchema, 4);
  14237     int bExists = 0;
  14238 
  14239     if( zType==0 || zName==0 ) continue;
  14240     rc = expertDbContainsObject(p->dbv, zName, &bExists);
  14241     if( rc || bExists ) continue;
  14242 
  14243     if( zType[0]=='v' || zType[1]=='r' || bVirtual ){
  14244       /* A view. Or a trigger on a view. */
  14245       if( zSql ) rc = expertSchemaSql(p->dbv, zSql, pzErrmsg);
  14246     }else{
  14247       IdxTable *pTab;
  14248       rc = idxGetTableInfo(p->db, zName, &pTab, pzErrmsg);
  14249       if( rc==SQLITE_OK && ALWAYS(pTab!=0) ){
  14250         int i;
  14251         char *zInner = 0;
  14252         char *zOuter = 0;
  14253         pTab->pNext = p->pTable;
  14254         p->pTable = pTab;
  14255 
  14256         /* The statement the vtab will pass to sqlite3_declare_vtab() */
  14257         zInner = idxAppendText(&rc, 0, "CREATE TABLE x(");
  14258         for(i=0; i<pTab->nCol; i++){
  14259           zInner = idxAppendText(&rc, zInner, "%s%Q COLLATE %s", 
  14260               (i==0 ? "" : ", "), pTab->aCol[i].zName, pTab->aCol[i].zColl
  14261           );
  14262         }
  14263         zInner = idxAppendText(&rc, zInner, ")");
  14264 
  14265         /* The CVT statement to create the vtab */
  14266         zOuter = idxAppendText(&rc, 0, 
  14267             "CREATE VIRTUAL TABLE %Q USING expert(%Q)", zName, zInner
  14268         );
  14269         if( rc==SQLITE_OK ){
  14270           rc = sqlite3_exec(p->dbv, zOuter, 0, 0, pzErrmsg);
  14271         }
  14272         sqlite3_free(zInner);
  14273         sqlite3_free(zOuter);
  14274       }
  14275     }
  14276   }
  14277   idxFinalize(&rc, pSchema);
  14278   return rc;
  14279 }
  14280 
  14281 struct IdxSampleCtx {
  14282   int iTarget;
  14283   double target;                  /* Target nRet/nRow value */
  14284   double nRow;                    /* Number of rows seen */
  14285   double nRet;                    /* Number of rows returned */
  14286 };
  14287 
  14288 static void idxSampleFunc(
  14289   sqlite3_context *pCtx,
  14290   int argc,
  14291   sqlite3_value **argv
  14292 ){
  14293   struct IdxSampleCtx *p = (struct IdxSampleCtx*)sqlite3_user_data(pCtx);
  14294   int bRet;
  14295 
  14296   (void)argv;
  14297   assert( argc==0 );
  14298   if( p->nRow==0.0 ){
  14299     bRet = 1;
  14300   }else{
  14301     bRet = (p->nRet / p->nRow) <= p->target;
  14302     if( bRet==0 ){
  14303       unsigned short rnd;
  14304       sqlite3_randomness(2, (void*)&rnd);
  14305       bRet = ((int)rnd % 100) <= p->iTarget;
  14306     }
  14307   }
  14308 
  14309   sqlite3_result_int(pCtx, bRet);
  14310   p->nRow += 1.0;
  14311   p->nRet += (double)bRet;
  14312 }
  14313 
  14314 struct IdxRemCtx {
  14315   int nSlot;
  14316   struct IdxRemSlot {
  14317     int eType;                    /* SQLITE_NULL, INTEGER, REAL, TEXT, BLOB */
  14318     i64 iVal;                     /* SQLITE_INTEGER value */
  14319     double rVal;                  /* SQLITE_FLOAT value */
  14320     int nByte;                    /* Bytes of space allocated at z */
  14321     int n;                        /* Size of buffer z */
  14322     char *z;                      /* SQLITE_TEXT/BLOB value */
  14323   } aSlot[1];
  14324 };
  14325 
  14326 /*
  14327 ** Implementation of scalar function sqlite_expert_rem().
  14328 */
  14329 static void idxRemFunc(
  14330   sqlite3_context *pCtx,
  14331   int argc,
  14332   sqlite3_value **argv
  14333 ){
  14334   struct IdxRemCtx *p = (struct IdxRemCtx*)sqlite3_user_data(pCtx);
  14335   struct IdxRemSlot *pSlot;
  14336   int iSlot;
  14337   assert( argc==2 );
  14338 
  14339   iSlot = sqlite3_value_int(argv[0]);
  14340   assert( iSlot<p->nSlot );
  14341   pSlot = &p->aSlot[iSlot];
  14342 
  14343   switch( pSlot->eType ){
  14344     case SQLITE_NULL:
  14345       /* no-op */
  14346       break;
  14347 
  14348     case SQLITE_INTEGER:
  14349       sqlite3_result_int64(pCtx, pSlot->iVal);
  14350       break;
  14351 
  14352     case SQLITE_FLOAT:
  14353       sqlite3_result_double(pCtx, pSlot->rVal);
  14354       break;
  14355 
  14356     case SQLITE_BLOB:
  14357       sqlite3_result_blob(pCtx, pSlot->z, pSlot->n, SQLITE_TRANSIENT);
  14358       break;
  14359 
  14360     case SQLITE_TEXT:
  14361       sqlite3_result_text(pCtx, pSlot->z, pSlot->n, SQLITE_TRANSIENT);
  14362       break;
  14363   }
  14364 
  14365   pSlot->eType = sqlite3_value_type(argv[1]);
  14366   switch( pSlot->eType ){
  14367     case SQLITE_NULL:
  14368       /* no-op */
  14369       break;
  14370 
  14371     case SQLITE_INTEGER:
  14372       pSlot->iVal = sqlite3_value_int64(argv[1]);
  14373       break;
  14374 
  14375     case SQLITE_FLOAT:
  14376       pSlot->rVal = sqlite3_value_double(argv[1]);
  14377       break;
  14378 
  14379     case SQLITE_BLOB:
  14380     case SQLITE_TEXT: {
  14381       int nByte = sqlite3_value_bytes(argv[1]);
  14382       const void *pData = 0;
  14383       if( nByte>pSlot->nByte ){
  14384         char *zNew = (char*)sqlite3_realloc(pSlot->z, nByte*2);
  14385         if( zNew==0 ){
  14386           sqlite3_result_error_nomem(pCtx);
  14387           return;
  14388         }
  14389         pSlot->nByte = nByte*2;
  14390         pSlot->z = zNew;
  14391       }
  14392       pSlot->n = nByte;
  14393       if( pSlot->eType==SQLITE_BLOB ){
  14394         pData = sqlite3_value_blob(argv[1]);
  14395         if( pData ) memcpy(pSlot->z, pData, nByte);
  14396       }else{
  14397         pData = sqlite3_value_text(argv[1]);
  14398         memcpy(pSlot->z, pData, nByte);
  14399       }
  14400       break;
  14401     }
  14402   }
  14403 }
  14404 
  14405 static int idxLargestIndex(sqlite3 *db, int *pnMax, char **pzErr){
  14406   int rc = SQLITE_OK;
  14407   const char *zMax = 
  14408     "SELECT max(i.seqno) FROM "
  14409     "  sqlite_schema AS s, "
  14410     "  pragma_index_list(s.name) AS l, "
  14411     "  pragma_index_info(l.name) AS i "
  14412     "WHERE s.type = 'table'";
  14413   sqlite3_stmt *pMax = 0;
  14414 
  14415   *pnMax = 0;
  14416   rc = idxPrepareStmt(db, &pMax, pzErr, zMax);
  14417   if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pMax) ){
  14418     *pnMax = sqlite3_column_int(pMax, 0) + 1;
  14419   }
  14420   idxFinalize(&rc, pMax);
  14421 
  14422   return rc;
  14423 }
  14424 
  14425 static int idxPopulateOneStat1(
  14426   sqlite3expert *p,
  14427   sqlite3_stmt *pIndexXInfo,
  14428   sqlite3_stmt *pWriteStat,
  14429   const char *zTab,
  14430   const char *zIdx,
  14431   char **pzErr
  14432 ){
  14433   char *zCols = 0;
  14434   char *zOrder = 0;
  14435   char *zQuery = 0;
  14436   int nCol = 0;
  14437   int i;
  14438   sqlite3_stmt *pQuery = 0;
  14439   int *aStat = 0;
  14440   int rc = SQLITE_OK;
  14441 
  14442   assert( p->iSample>0 );
  14443 
  14444   /* Formulate the query text */
  14445   sqlite3_bind_text(pIndexXInfo, 1, zIdx, -1, SQLITE_STATIC);
  14446   while( SQLITE_OK==rc && SQLITE_ROW==sqlite3_step(pIndexXInfo) ){
  14447     const char *zComma = zCols==0 ? "" : ", ";
  14448     const char *zName = (const char*)sqlite3_column_text(pIndexXInfo, 0);
  14449     const char *zColl = (const char*)sqlite3_column_text(pIndexXInfo, 1);
  14450     if( zName==0 ){
  14451       /* This index contains an expression. Ignore it. */
  14452       sqlite3_free(zCols);
  14453       sqlite3_free(zOrder);
  14454       return sqlite3_reset(pIndexXInfo);
  14455     }
  14456     zCols = idxAppendText(&rc, zCols, 
  14457         "%sx.%Q IS sqlite_expert_rem(%d, x.%Q) COLLATE %s", 
  14458         zComma, zName, nCol, zName, zColl
  14459     );
  14460     zOrder = idxAppendText(&rc, zOrder, "%s%d", zComma, ++nCol);
  14461   }
  14462   sqlite3_reset(pIndexXInfo);
  14463   if( rc==SQLITE_OK ){
  14464     if( p->iSample==100 ){
  14465       zQuery = sqlite3_mprintf(
  14466           "SELECT %s FROM %Q x ORDER BY %s", zCols, zTab, zOrder
  14467       );
  14468     }else{
  14469       zQuery = sqlite3_mprintf(
  14470           "SELECT %s FROM temp."UNIQUE_TABLE_NAME" x ORDER BY %s", zCols, zOrder
  14471       );
  14472     }
  14473   }
  14474   sqlite3_free(zCols);
  14475   sqlite3_free(zOrder);
  14476 
  14477   /* Formulate the query text */
  14478   if( rc==SQLITE_OK ){
  14479     sqlite3 *dbrem = (p->iSample==100 ? p->db : p->dbv);
  14480     rc = idxPrepareStmt(dbrem, &pQuery, pzErr, zQuery);
  14481   }
  14482   sqlite3_free(zQuery);
  14483 
  14484   if( rc==SQLITE_OK ){
  14485     aStat = (int*)idxMalloc(&rc, sizeof(int)*(nCol+1));
  14486   }
  14487   if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pQuery) ){
  14488     IdxHashEntry *pEntry;
  14489     char *zStat = 0;
  14490     for(i=0; i<=nCol; i++) aStat[i] = 1;
  14491     while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pQuery) ){
  14492       aStat[0]++;
  14493       for(i=0; i<nCol; i++){
  14494         if( sqlite3_column_int(pQuery, i)==0 ) break;
  14495       }
  14496       for(/*no-op*/; i<nCol; i++){
  14497         aStat[i+1]++;
  14498       }
  14499     }
  14500 
  14501     if( rc==SQLITE_OK ){
  14502       int s0 = aStat[0];
  14503       zStat = sqlite3_mprintf("%d", s0);
  14504       if( zStat==0 ) rc = SQLITE_NOMEM;
  14505       for(i=1; rc==SQLITE_OK && i<=nCol; i++){
  14506         zStat = idxAppendText(&rc, zStat, " %d", (s0+aStat[i]/2) / aStat[i]);
  14507       }
  14508     }
  14509 
  14510     if( rc==SQLITE_OK ){
  14511       sqlite3_bind_text(pWriteStat, 1, zTab, -1, SQLITE_STATIC);
  14512       sqlite3_bind_text(pWriteStat, 2, zIdx, -1, SQLITE_STATIC);
  14513       sqlite3_bind_text(pWriteStat, 3, zStat, -1, SQLITE_STATIC);
  14514       sqlite3_step(pWriteStat);
  14515       rc = sqlite3_reset(pWriteStat);
  14516     }
  14517 
  14518     pEntry = idxHashFind(&p->hIdx, zIdx, STRLEN(zIdx));
  14519     if( pEntry ){
  14520       assert( pEntry->zVal2==0 );
  14521       pEntry->zVal2 = zStat;
  14522     }else{
  14523       sqlite3_free(zStat);
  14524     }
  14525   }
  14526   sqlite3_free(aStat);
  14527   idxFinalize(&rc, pQuery);
  14528 
  14529   return rc;
  14530 }
  14531 
  14532 static int idxBuildSampleTable(sqlite3expert *p, const char *zTab){
  14533   int rc;
  14534   char *zSql;
  14535 
  14536   rc = sqlite3_exec(p->dbv,"DROP TABLE IF EXISTS temp."UNIQUE_TABLE_NAME,0,0,0);
  14537   if( rc!=SQLITE_OK ) return rc;
  14538 
  14539   zSql = sqlite3_mprintf(
  14540       "CREATE TABLE temp." UNIQUE_TABLE_NAME " AS SELECT * FROM %Q", zTab
  14541   );
  14542   if( zSql==0 ) return SQLITE_NOMEM;
  14543   rc = sqlite3_exec(p->dbv, zSql, 0, 0, 0);
  14544   sqlite3_free(zSql);
  14545 
  14546   return rc;
  14547 }
  14548 
  14549 /*
  14550 ** This function is called as part of sqlite3_expert_analyze(). Candidate
  14551 ** indexes have already been created in database sqlite3expert.dbm, this
  14552 ** function populates sqlite_stat1 table in the same database.
  14553 **
  14554 ** The stat1 data is generated by querying the 
  14555 */
  14556 static int idxPopulateStat1(sqlite3expert *p, char **pzErr){
  14557   int rc = SQLITE_OK;
  14558   int nMax =0;
  14559   struct IdxRemCtx *pCtx = 0;
  14560   struct IdxSampleCtx samplectx; 
  14561   int i;
  14562   i64 iPrev = -100000;
  14563   sqlite3_stmt *pAllIndex = 0;
  14564   sqlite3_stmt *pIndexXInfo = 0;
  14565   sqlite3_stmt *pWrite = 0;
  14566 
  14567   const char *zAllIndex =
  14568     "SELECT s.rowid, s.name, l.name FROM "
  14569     "  sqlite_schema AS s, "
  14570     "  pragma_index_list(s.name) AS l "
  14571     "WHERE s.type = 'table'";
  14572   const char *zIndexXInfo = 
  14573     "SELECT name, coll FROM pragma_index_xinfo(?) WHERE key";
  14574   const char *zWrite = "INSERT INTO sqlite_stat1 VALUES(?, ?, ?)";
  14575 
  14576   /* If iSample==0, no sqlite_stat1 data is required. */
  14577   if( p->iSample==0 ) return SQLITE_OK;
  14578 
  14579   rc = idxLargestIndex(p->dbm, &nMax, pzErr);
  14580   if( nMax<=0 || rc!=SQLITE_OK ) return rc;
  14581 
  14582   rc = sqlite3_exec(p->dbm, "ANALYZE; PRAGMA writable_schema=1", 0, 0, 0);
  14583 
  14584   if( rc==SQLITE_OK ){
  14585     int nByte = sizeof(struct IdxRemCtx) + (sizeof(struct IdxRemSlot) * nMax);
  14586     pCtx = (struct IdxRemCtx*)idxMalloc(&rc, nByte);
  14587   }
  14588 
  14589   if( rc==SQLITE_OK ){
  14590     sqlite3 *dbrem = (p->iSample==100 ? p->db : p->dbv);
  14591     rc = sqlite3_create_function(dbrem, "sqlite_expert_rem", 
  14592         2, SQLITE_UTF8, (void*)pCtx, idxRemFunc, 0, 0
  14593     );
  14594   }
  14595   if( rc==SQLITE_OK ){
  14596     rc = sqlite3_create_function(p->db, "sqlite_expert_sample", 
  14597         0, SQLITE_UTF8, (void*)&samplectx, idxSampleFunc, 0, 0
  14598     );
  14599   }
  14600 
  14601   if( rc==SQLITE_OK ){
  14602     pCtx->nSlot = nMax+1;
  14603     rc = idxPrepareStmt(p->dbm, &pAllIndex, pzErr, zAllIndex);
  14604   }
  14605   if( rc==SQLITE_OK ){
  14606     rc = idxPrepareStmt(p->dbm, &pIndexXInfo, pzErr, zIndexXInfo);
  14607   }
  14608   if( rc==SQLITE_OK ){
  14609     rc = idxPrepareStmt(p->dbm, &pWrite, pzErr, zWrite);
  14610   }
  14611 
  14612   while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pAllIndex) ){
  14613     i64 iRowid = sqlite3_column_int64(pAllIndex, 0);
  14614     const char *zTab = (const char*)sqlite3_column_text(pAllIndex, 1);
  14615     const char *zIdx = (const char*)sqlite3_column_text(pAllIndex, 2);
  14616     if( zTab==0 || zIdx==0 ) continue;
  14617     if( p->iSample<100 && iPrev!=iRowid ){
  14618       samplectx.target = (double)p->iSample / 100.0;
  14619       samplectx.iTarget = p->iSample;
  14620       samplectx.nRow = 0.0;
  14621       samplectx.nRet = 0.0;
  14622       rc = idxBuildSampleTable(p, zTab);
  14623       if( rc!=SQLITE_OK ) break;
  14624     }
  14625     rc = idxPopulateOneStat1(p, pIndexXInfo, pWrite, zTab, zIdx, pzErr);
  14626     iPrev = iRowid;
  14627   }
  14628   if( rc==SQLITE_OK && p->iSample<100 ){
  14629     rc = sqlite3_exec(p->dbv, 
  14630         "DROP TABLE IF EXISTS temp." UNIQUE_TABLE_NAME, 0,0,0
  14631     );
  14632   }
  14633 
  14634   idxFinalize(&rc, pAllIndex);
  14635   idxFinalize(&rc, pIndexXInfo);
  14636   idxFinalize(&rc, pWrite);
  14637 
  14638   if( pCtx ){
  14639     for(i=0; i<pCtx->nSlot; i++){
  14640       sqlite3_free(pCtx->aSlot[i].z);
  14641     }
  14642     sqlite3_free(pCtx);
  14643   }
  14644 
  14645   if( rc==SQLITE_OK ){
  14646     rc = sqlite3_exec(p->dbm, "ANALYZE sqlite_schema", 0, 0, 0);
  14647   }
  14648 
  14649   sqlite3_create_function(p->db, "sqlite_expert_rem", 2, SQLITE_UTF8, 0,0,0,0);
  14650   sqlite3_create_function(p->db, "sqlite_expert_sample", 0,SQLITE_UTF8,0,0,0,0);
  14651 
  14652   sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp."UNIQUE_TABLE_NAME,0,0,0);
  14653   return rc;
  14654 }
  14655 
  14656 /*
  14657 ** Define and possibly pretend to use a useless collation sequence.
  14658 ** This pretense allows expert to accept SQL using custom collations.
  14659 */
  14660 int dummyCompare(void *up1, int up2, const void *up3, int up4, const void *up5){
  14661   (void)up1;
  14662   (void)up2;
  14663   (void)up3;
  14664   (void)up4;
  14665   (void)up5;
  14666   assert(0); /* VDBE should never be run. */
  14667   return 0;
  14668 }
  14669 /* And a callback to register above upon actual need */
  14670 void useDummyCS(void *up1, sqlite3 *db, int etr, const char *zName){
  14671   (void)up1;
  14672   sqlite3_create_collation_v2(db, zName, etr, 0, dummyCompare, 0);
  14673 }
  14674 
  14675 #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) \
  14676   && !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS)
  14677 /*
  14678 ** dummy functions for no-op implementation of UDFs during expert's work
  14679 */
  14680 void dummyUDF(sqlite3_context *up1, int up2, sqlite3_value **up3){
  14681   (void)up1;
  14682   (void)up2;
  14683   (void)up3;
  14684   assert(0); /* VDBE should never be run. */
  14685 }
  14686 void dummyUDFvalue(sqlite3_context *up1){
  14687   (void)up1;
  14688   assert(0); /* VDBE should never be run. */
  14689 }
  14690 
  14691 /*
  14692 ** Register UDFs from user database with another.
  14693 */
  14694 int registerUDFs(sqlite3 *dbSrc, sqlite3 *dbDst){
  14695   sqlite3_stmt *pStmt;
  14696   int rc = sqlite3_prepare_v2(dbSrc,
  14697             "SELECT name,type,enc,narg,flags "
  14698             "FROM pragma_function_list() "
  14699             "WHERE builtin==0", -1, &pStmt, 0);
  14700   if( rc==SQLITE_OK ){
  14701     while( SQLITE_ROW==(rc = sqlite3_step(pStmt)) ){
  14702       int nargs = sqlite3_column_int(pStmt,3);
  14703       int flags = sqlite3_column_int(pStmt,4);
  14704       const char *name = (char*)sqlite3_column_text(pStmt,0);
  14705       const char *type = (char*)sqlite3_column_text(pStmt,1);
  14706       const char *enc = (char*)sqlite3_column_text(pStmt,2);
  14707       if( name==0 || type==0 || enc==0 ){
  14708         /* no-op.  Only happens on OOM */
  14709       }else{
  14710         int ienc = SQLITE_UTF8;
  14711         int rcf = SQLITE_ERROR;
  14712         if( strcmp(enc,"utf16le")==0 ) ienc = SQLITE_UTF16LE;
  14713         else if( strcmp(enc,"utf16be")==0 ) ienc = SQLITE_UTF16BE;
  14714         ienc |= (flags & (SQLITE_DETERMINISTIC|SQLITE_DIRECTONLY));
  14715         if( strcmp(type,"w")==0 ){
  14716           rcf = sqlite3_create_window_function(dbDst,name,nargs,ienc,0,
  14717                                                dummyUDF,dummyUDFvalue,0,0,0);
  14718         }else if( strcmp(type,"a")==0 ){
  14719           rcf = sqlite3_create_function(dbDst,name,nargs,ienc,0,
  14720                                         0,dummyUDF,dummyUDFvalue);
  14721         }else if( strcmp(type,"s")==0 ){
  14722           rcf = sqlite3_create_function(dbDst,name,nargs,ienc,0,
  14723                                         dummyUDF,0,0);
  14724         }
  14725         if( rcf!=SQLITE_OK ){
  14726           rc = rcf;
  14727           break;
  14728         }
  14729       }
  14730     }
  14731     sqlite3_finalize(pStmt);
  14732     if( rc==SQLITE_DONE ) rc = SQLITE_OK;
  14733   }
  14734   return rc;
  14735 }
  14736 #endif
  14737 
  14738 /*
  14739 ** Allocate a new sqlite3expert object.
  14740 */
  14741 sqlite3expert *sqlite3_expert_new(sqlite3 *db, char **pzErrmsg){
  14742   int rc = SQLITE_OK;
  14743   sqlite3expert *pNew;
  14744 
  14745   pNew = (sqlite3expert*)idxMalloc(&rc, sizeof(sqlite3expert));
  14746 
  14747   /* Open two in-memory databases to work with. The "vtab database" (dbv)
  14748   ** will contain a virtual table corresponding to each real table in
  14749   ** the user database schema, and a copy of each view. It is used to
  14750   ** collect information regarding the WHERE, ORDER BY and other clauses
  14751   ** of the user's query.
  14752   */
  14753   if( rc==SQLITE_OK ){
  14754     pNew->db = db;
  14755     pNew->iSample = 100;
  14756     rc = sqlite3_open(":memory:", &pNew->dbv);
  14757   }
  14758   if( rc==SQLITE_OK ){
  14759     rc = sqlite3_open(":memory:", &pNew->dbm);
  14760     if( rc==SQLITE_OK ){
  14761       sqlite3_db_config(pNew->dbm, SQLITE_DBCONFIG_TRIGGER_EQP, 1, (int*)0);
  14762     }
  14763   }
  14764 
  14765   /* Allow custom collations to be dealt with through prepare. */
  14766   if( rc==SQLITE_OK ) rc = sqlite3_collation_needed(pNew->dbm,0,useDummyCS);
  14767   if( rc==SQLITE_OK ) rc = sqlite3_collation_needed(pNew->dbv,0,useDummyCS);
  14768 
  14769 #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) \
  14770   && !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS)
  14771   /* Register UDFs from database [db] with [dbm] and [dbv]. */
  14772   if( rc==SQLITE_OK ){
  14773     rc = registerUDFs(pNew->db, pNew->dbm);
  14774   }
  14775   if( rc==SQLITE_OK ){
  14776     rc = registerUDFs(pNew->db, pNew->dbv);
  14777   }
  14778 #endif
  14779 
  14780   /* Copy the entire schema of database [db] into [dbm]. */
  14781   if( rc==SQLITE_OK ){
  14782     sqlite3_stmt *pSql = 0;
  14783     rc = idxPrintfPrepareStmt(pNew->db, &pSql, pzErrmsg, 
  14784         "SELECT sql, name, substr(sql,1,14)=='create virtual' COLLATE nocase"
  14785         " FROM sqlite_schema WHERE substr(name,1,7)!='sqlite_' COLLATE nocase"
  14786         " ORDER BY 3 DESC, rowid"
  14787     );
  14788     while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
  14789       const char *zSql = (const char*)sqlite3_column_text(pSql, 0);
  14790       const char *zName = (const char*)sqlite3_column_text(pSql, 1);
  14791       int bExists = 0;
  14792       rc = expertDbContainsObject(pNew->dbm, zName, &bExists);
  14793       if( rc==SQLITE_OK && zSql && bExists==0 ){
  14794         rc = expertSchemaSql(pNew->dbm, zSql, pzErrmsg);
  14795       }
  14796     }
  14797     idxFinalize(&rc, pSql);
  14798   }
  14799 
  14800   /* Create the vtab schema */
  14801   if( rc==SQLITE_OK ){
  14802     rc = idxCreateVtabSchema(pNew, pzErrmsg);
  14803   }
  14804 
  14805   /* Register the auth callback with dbv */
  14806   if( rc==SQLITE_OK ){
  14807     sqlite3_set_authorizer(pNew->dbv, idxAuthCallback, (void*)pNew);
  14808   }
  14809 
  14810   /* If an error has occurred, free the new object and return NULL. Otherwise,
  14811   ** return the new sqlite3expert handle.  */
  14812   if( rc!=SQLITE_OK ){
  14813     sqlite3_expert_destroy(pNew);
  14814     pNew = 0;
  14815   }
  14816   return pNew;
  14817 }
  14818 
  14819 /*
  14820 ** Configure an sqlite3expert object.
  14821 */
  14822 int sqlite3_expert_config(sqlite3expert *p, int op, ...){
  14823   int rc = SQLITE_OK;
  14824   va_list ap;
  14825   va_start(ap, op);
  14826   switch( op ){
  14827     case EXPERT_CONFIG_SAMPLE: {
  14828       int iVal = va_arg(ap, int);
  14829       if( iVal<0 ) iVal = 0;
  14830       if( iVal>100 ) iVal = 100;
  14831       p->iSample = iVal;
  14832       break;
  14833     }
  14834     default:
  14835       rc = SQLITE_NOTFOUND;
  14836       break;
  14837   }
  14838 
  14839   va_end(ap);
  14840   return rc;
  14841 }
  14842 
  14843 /*
  14844 ** Add an SQL statement to the analysis.
  14845 */
  14846 int sqlite3_expert_sql(
  14847   sqlite3expert *p,               /* From sqlite3_expert_new() */
  14848   const char *zSql,               /* SQL statement to add */
  14849   char **pzErr                    /* OUT: Error message (if any) */
  14850 ){
  14851   IdxScan *pScanOrig = p->pScan;
  14852   IdxStatement *pStmtOrig = p->pStatement;
  14853   int rc = SQLITE_OK;
  14854   const char *zStmt = zSql;
  14855 
  14856   if( p->bRun ) return SQLITE_MISUSE;
  14857 
  14858   while( rc==SQLITE_OK && zStmt && zStmt[0] ){
  14859     sqlite3_stmt *pStmt = 0;
  14860     /* Ensure that the provided statement compiles against user's DB. */
  14861     rc = idxPrepareStmt(p->db, &pStmt, pzErr, zStmt);
  14862     if( rc!=SQLITE_OK ) break;
  14863     sqlite3_finalize(pStmt);
  14864     rc = sqlite3_prepare_v2(p->dbv, zStmt, -1, &pStmt, &zStmt);
  14865     if( rc==SQLITE_OK ){
  14866       if( pStmt ){
  14867         IdxStatement *pNew;
  14868         const char *z = sqlite3_sql(pStmt);
  14869         int n = STRLEN(z);
  14870         pNew = (IdxStatement*)idxMalloc(&rc, sizeof(IdxStatement) + n+1);
  14871         if( rc==SQLITE_OK ){
  14872           pNew->zSql = (char*)&pNew[1];
  14873           memcpy(pNew->zSql, z, n+1);
  14874           pNew->pNext = p->pStatement;
  14875           if( p->pStatement ) pNew->iId = p->pStatement->iId+1;
  14876           p->pStatement = pNew;
  14877         }
  14878         sqlite3_finalize(pStmt);
  14879       }
  14880     }else{
  14881       idxDatabaseError(p->dbv, pzErr);
  14882     }
  14883   }
  14884 
  14885   if( rc!=SQLITE_OK ){
  14886     idxScanFree(p->pScan, pScanOrig);
  14887     idxStatementFree(p->pStatement, pStmtOrig);
  14888     p->pScan = pScanOrig;
  14889     p->pStatement = pStmtOrig;
  14890   }
  14891 
  14892   return rc;
  14893 }
  14894 
  14895 int sqlite3_expert_analyze(sqlite3expert *p, char **pzErr){
  14896   int rc;
  14897   IdxHashEntry *pEntry;
  14898 
  14899   /* Do trigger processing to collect any extra IdxScan structures */
  14900   rc = idxProcessTriggers(p, pzErr);
  14901 
  14902   /* Create candidate indexes within the in-memory database file */
  14903   if( rc==SQLITE_OK ){
  14904     rc = idxCreateCandidates(p);
  14905   }else if ( rc==SQLITE_BUSY_TIMEOUT ){
  14906     if( pzErr )
  14907       *pzErr = sqlite3_mprintf("Cannot find a unique index name to propose.");
  14908     return rc;
  14909   }
  14910 
  14911   /* Generate the stat1 data */
  14912   if( rc==SQLITE_OK ){
  14913     rc = idxPopulateStat1(p, pzErr);
  14914   }
  14915 
  14916   /* Formulate the EXPERT_REPORT_CANDIDATES text */
  14917   for(pEntry=p->hIdx.pFirst; pEntry; pEntry=pEntry->pNext){
  14918     p->zCandidates = idxAppendText(&rc, p->zCandidates, 
  14919         "%s;%s%s\n", pEntry->zVal, 
  14920         pEntry->zVal2 ? " -- stat1: " : "", pEntry->zVal2
  14921     );
  14922   }
  14923 
  14924   /* Figure out which of the candidate indexes are preferred by the query
  14925   ** planner and report the results to the user.  */
  14926   if( rc==SQLITE_OK ){
  14927     rc = idxFindIndexes(p, pzErr);
  14928   }
  14929 
  14930   if( rc==SQLITE_OK ){
  14931     p->bRun = 1;
  14932   }
  14933   return rc;
  14934 }
  14935 
  14936 /*
  14937 ** Return the total number of statements that have been added to this
  14938 ** sqlite3expert using sqlite3_expert_sql().
  14939 */
  14940 int sqlite3_expert_count(sqlite3expert *p){
  14941   int nRet = 0;
  14942   if( p->pStatement ) nRet = p->pStatement->iId+1;
  14943   return nRet;
  14944 }
  14945 
  14946 /*
  14947 ** Return a component of the report.
  14948 */
  14949 const char *sqlite3_expert_report(sqlite3expert *p, int iStmt, int eReport){
  14950   const char *zRet = 0;
  14951   IdxStatement *pStmt;
  14952 
  14953   if( p->bRun==0 ) return 0;
  14954   for(pStmt=p->pStatement; pStmt && pStmt->iId!=iStmt; pStmt=pStmt->pNext);
  14955   switch( eReport ){
  14956     case EXPERT_REPORT_SQL:
  14957       if( pStmt ) zRet = pStmt->zSql;
  14958       break;
  14959     case EXPERT_REPORT_INDEXES:
  14960       if( pStmt ) zRet = pStmt->zIdx;
  14961       break;
  14962     case EXPERT_REPORT_PLAN:
  14963       if( pStmt ) zRet = pStmt->zEQP;
  14964       break;
  14965     case EXPERT_REPORT_CANDIDATES:
  14966       zRet = p->zCandidates;
  14967       break;
  14968   }
  14969   return zRet;
  14970 }
  14971 
  14972 /*
  14973 ** Free an sqlite3expert object.
  14974 */
  14975 void sqlite3_expert_destroy(sqlite3expert *p){
  14976   if( p ){
  14977     sqlite3_close(p->dbm);
  14978     sqlite3_close(p->dbv);
  14979     idxScanFree(p->pScan, 0);
  14980     idxStatementFree(p->pStatement, 0);
  14981     idxTableFree(p->pTable);
  14982     idxWriteFree(p->pWrite);
  14983     idxHashClear(&p->hIdx);
  14984     sqlite3_free(p->zCandidates);
  14985     sqlite3_free(p);
  14986   }
  14987 }
  14988 
  14989 #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
  14990 
  14991 /************************* End ../ext/expert/sqlite3expert.c ********************/
  14992 /************************* Begin ../ext/intck/sqlite3intck.h ******************/
  14993 /*
  14994 ** 2024-02-08
  14995 **
  14996 ** The author disclaims copyright to this source code.  In place of
  14997 ** a legal notice, here is a blessing:
  14998 **
  14999 **    May you do good and not evil.
  15000 **    May you find forgiveness for yourself and forgive others.
  15001 **    May you share freely, never taking more than you give.
  15002 **
  15003 *************************************************************************
  15004 */
  15005 
  15006 /*
  15007 ** Incremental Integrity-Check Extension
  15008 ** -------------------------------------
  15009 **
  15010 ** This module contains code to check whether or not an SQLite database
  15011 ** is well-formed or corrupt. This is the same task as performed by SQLite's
  15012 ** built-in "PRAGMA integrity_check" command. This module differs from
  15013 ** "PRAGMA integrity_check" in that:
  15014 **
  15015 **   +  It is less thorough - this module does not detect certain types
  15016 **      of corruption that are detected by the PRAGMA command. However,
  15017 **      it does detect all kinds of corruption that are likely to cause
  15018 **      errors in SQLite applications.
  15019 **
  15020 **   +  It is slower. Sometimes up to three times slower.
  15021 **
  15022 **   +  It allows integrity-check operations to be split into multiple
  15023 **      transactions, so that the database does not need to be read-locked
  15024 **      for the duration of the integrity-check.
  15025 **
  15026 ** One way to use the API to run integrity-check on the "main" database
  15027 ** of handle db is:
  15028 **
  15029 **   int rc = SQLITE_OK;
  15030 **   sqlite3_intck *p = 0;
  15031 **
  15032 **   sqlite3_intck_open(db, "main", &p);
  15033 **   while( SQLITE_OK==sqlite3_intck_step(p) ){
  15034 **     const char *zMsg = sqlite3_intck_message(p);
  15035 **     if( zMsg ) printf("corruption: %s\n", zMsg);
  15036 **   }
  15037 **   rc = sqlite3_intck_error(p, &zErr);
  15038 **   if( rc!=SQLITE_OK ){
  15039 **     printf("error occured (rc=%d), (errmsg=%s)\n", rc, zErr);
  15040 **   }
  15041 **   sqlite3_intck_close(p);
  15042 **
  15043 ** Usually, the sqlite3_intck object opens a read transaction within the
  15044 ** first call to sqlite3_intck_step() and holds it open until the 
  15045 ** integrity-check is complete. However, if sqlite3_intck_unlock() is
  15046 ** called, the read transaction is ended and a new read transaction opened
  15047 ** by the subsequent call to sqlite3_intck_step().
  15048 */
  15049 
  15050 #ifndef _SQLITE_INTCK_H
  15051 #define _SQLITE_INTCK_H
  15052 
  15053 /* #include "sqlite3.h" */
  15054 
  15055 #ifdef __cplusplus
  15056 extern "C" {
  15057 #endif
  15058 
  15059 /*
  15060 ** An ongoing incremental integrity-check operation is represented by an
  15061 ** opaque pointer of the following type.
  15062 */
  15063 typedef struct sqlite3_intck sqlite3_intck;
  15064 
  15065 /*
  15066 ** Open a new incremental integrity-check object. If successful, populate
  15067 ** output variable (*ppOut) with the new object handle and return SQLITE_OK.
  15068 ** Or, if an error occurs, set (*ppOut) to NULL and return an SQLite error
  15069 ** code (e.g. SQLITE_NOMEM).
  15070 **
  15071 ** The integrity-check will be conducted on database zDb (which must be "main",
  15072 ** "temp", or the name of an attached database) of database handle db. Once
  15073 ** this function has been called successfully, the caller should not use 
  15074 ** database handle db until the integrity-check object has been destroyed
  15075 ** using sqlite3_intck_close().
  15076 */
  15077 int sqlite3_intck_open(
  15078   sqlite3 *db,                    /* Database handle */
  15079   const char *zDb,                /* Database name ("main", "temp" etc.) */
  15080   sqlite3_intck **ppOut           /* OUT: New sqlite3_intck handle */
  15081 );
  15082 
  15083 /*
  15084 ** Close and release all resources associated with a handle opened by an
  15085 ** earlier call to sqlite3_intck_open(). The results of using an
  15086 ** integrity-check handle after it has been passed to this function are
  15087 ** undefined.
  15088 */
  15089 void sqlite3_intck_close(sqlite3_intck *pCk);
  15090 
  15091 /*
  15092 ** Do the next step of the integrity-check operation specified by the handle
  15093 ** passed as the only argument. This function returns SQLITE_DONE if the 
  15094 ** integrity-check operation is finished, or an SQLite error code if
  15095 ** an error occurs, or SQLITE_OK if no error occurs but the integrity-check
  15096 ** is not finished. It is not considered an error if database corruption
  15097 ** is encountered.
  15098 **
  15099 ** Following a successful call to sqlite3_intck_step() (one that returns
  15100 ** SQLITE_OK), sqlite3_intck_message() returns a non-NULL value if 
  15101 ** corruption was detected in the db.
  15102 **
  15103 ** If an error occurs and a value other than SQLITE_OK or SQLITE_DONE is
  15104 ** returned, then the integrity-check handle is placed in an error state.
  15105 ** In this state all subsequent calls to sqlite3_intck_step() or 
  15106 ** sqlite3_intck_unlock() will immediately return the same error. The 
  15107 ** sqlite3_intck_error() method may be used to obtain an English language 
  15108 ** error message in this case.
  15109 */
  15110 int sqlite3_intck_step(sqlite3_intck *pCk);
  15111 
  15112 /*
  15113 ** If the previous call to sqlite3_intck_step() encountered corruption 
  15114 ** within the database, then this function returns a pointer to a buffer
  15115 ** containing a nul-terminated string describing the corruption in 
  15116 ** English. If the previous call to sqlite3_intck_step() did not encounter
  15117 ** corruption, or if there was no previous call, this function returns 
  15118 ** NULL.
  15119 */
  15120 const char *sqlite3_intck_message(sqlite3_intck *pCk);
  15121 
  15122 /*
  15123 ** Close any read-transaction opened by an earlier call to 
  15124 ** sqlite3_intck_step(). Any subsequent call to sqlite3_intck_step() will
  15125 ** open a new transaction. Return SQLITE_OK if successful, or an SQLite error
  15126 ** code otherwise.
  15127 **
  15128 ** If an error occurs, then the integrity-check handle is placed in an error
  15129 ** state. In this state all subsequent calls to sqlite3_intck_step() or 
  15130 ** sqlite3_intck_unlock() will immediately return the same error. The 
  15131 ** sqlite3_intck_error() method may be used to obtain an English language 
  15132 ** error message in this case.
  15133 */
  15134 int sqlite3_intck_unlock(sqlite3_intck *pCk);
  15135 
  15136 /*
  15137 ** If an error has occurred in an earlier call to sqlite3_intck_step()
  15138 ** or sqlite3_intck_unlock(), then this method returns the associated 
  15139 ** SQLite error code. Additionally, if pzErr is not NULL, then (*pzErr)
  15140 ** may be set to point to a nul-terminated string containing an English
  15141 ** language error message. Or, if no error message is available, to
  15142 ** NULL.
  15143 **
  15144 ** If no error has occurred within sqlite3_intck_step() or
  15145 ** sqlite_intck_unlock() calls on the handle passed as the first argument, 
  15146 ** then SQLITE_OK is returned and (*pzErr) set to NULL.
  15147 */
  15148 int sqlite3_intck_error(sqlite3_intck *pCk, const char **pzErr);
  15149 
  15150 /*
  15151 ** This API is used for testing only. It returns the full-text of an SQL
  15152 ** statement used to test object zObj, which may be a table or index.
  15153 ** The returned buffer is valid until the next call to either this function
  15154 ** or sqlite3_intck_close() on the same sqlite3_intck handle.
  15155 */
  15156 const char *sqlite3_intck_test_sql(sqlite3_intck *pCk, const char *zObj);
  15157 
  15158 
  15159 #ifdef __cplusplus
  15160 }  /* end of the 'extern "C"' block */
  15161 #endif
  15162 
  15163 #endif /* ifndef _SQLITE_INTCK_H */
  15164 
  15165 /************************* End ../ext/intck/sqlite3intck.h ********************/
  15166 /************************* Begin ../ext/intck/sqlite3intck.c ******************/
  15167 /*
  15168 ** 2024-02-08
  15169 **
  15170 ** The author disclaims copyright to this source code.  In place of
  15171 ** a legal notice, here is a blessing:
  15172 **
  15173 **    May you do good and not evil.
  15174 **    May you find forgiveness for yourself and forgive others.
  15175 **    May you share freely, never taking more than you give.
  15176 **
  15177 *************************************************************************
  15178 */
  15179 
  15180 /* #include "sqlite3intck.h" */
  15181 #include <string.h>
  15182 #include <assert.h>
  15183 
  15184 #include <stdio.h>
  15185 #include <stdlib.h>
  15186 
  15187 /*
  15188 ** nKeyVal:
  15189 **   The number of values that make up the 'key' for the current pCheck
  15190 **   statement.
  15191 **
  15192 ** rc:
  15193 **   Error code returned by most recent sqlite3_intck_step() or 
  15194 **   sqlite3_intck_unlock() call. This is set to SQLITE_DONE when
  15195 **   the integrity-check operation is finished.
  15196 **
  15197 ** zErr:
  15198 **   If the object has entered the error state, this is the error message.
  15199 **   Is freed using sqlite3_free() when the object is deleted.
  15200 **
  15201 ** zTestSql:
  15202 **   The value returned by the most recent call to sqlite3_intck_testsql().
  15203 **   Each call to testsql() frees the previous zTestSql value (using
  15204 **   sqlite3_free()) and replaces it with the new value it will return.
  15205 */
  15206 struct sqlite3_intck {
  15207   sqlite3 *db;
  15208   const char *zDb;                /* Copy of zDb parameter to _open() */
  15209   char *zObj;                     /* Current object. Or NULL. */
  15210 
  15211   sqlite3_stmt *pCheck;           /* Current check statement */
  15212   char *zKey;
  15213   int nKeyVal;
  15214 
  15215   char *zMessage;
  15216   int bCorruptSchema;
  15217 
  15218   int rc;                         /* Error code */
  15219   char *zErr;                     /* Error message */
  15220   char *zTestSql;                 /* Returned by sqlite3_intck_test_sql() */
  15221 };
  15222 
  15223 
  15224 /*
  15225 ** Some error has occurred while using database p->db. Save the error message
  15226 ** and error code currently held by the database handle in p->rc and p->zErr.
  15227 */
  15228 static void intckSaveErrmsg(sqlite3_intck *p){
  15229   p->rc = sqlite3_errcode(p->db);
  15230   sqlite3_free(p->zErr);
  15231   p->zErr = sqlite3_mprintf("%s", sqlite3_errmsg(p->db));
  15232 }
  15233 
  15234 /*
  15235 ** If the handle passed as the first argument is already in the error state,
  15236 ** then this function is a no-op (returns NULL immediately). Otherwise, if an
  15237 ** error occurs within this function, it leaves an error in said handle.
  15238 **
  15239 ** Otherwise, this function attempts to prepare SQL statement zSql and
  15240 ** return the resulting statement handle to the user.
  15241 */
  15242 static sqlite3_stmt *intckPrepare(sqlite3_intck *p, const char *zSql){
  15243   sqlite3_stmt *pRet = 0;
  15244   if( p->rc==SQLITE_OK ){
  15245     p->rc = sqlite3_prepare_v2(p->db, zSql, -1, &pRet, 0);
  15246     if( p->rc!=SQLITE_OK ){
  15247       intckSaveErrmsg(p);
  15248       assert( pRet==0 );
  15249     }
  15250   }
  15251   return pRet;
  15252 }
  15253 
  15254 /*
  15255 ** If the handle passed as the first argument is already in the error state,
  15256 ** then this function is a no-op (returns NULL immediately). Otherwise, if an
  15257 ** error occurs within this function, it leaves an error in said handle.
  15258 **
  15259 ** Otherwise, this function treats argument zFmt as a printf() style format
  15260 ** string. It formats it according to the trailing arguments and then 
  15261 ** attempts to prepare the results and return the resulting prepared
  15262 ** statement.
  15263 */
  15264 static sqlite3_stmt *intckPrepareFmt(sqlite3_intck *p, const char *zFmt, ...){
  15265   sqlite3_stmt *pRet = 0;
  15266   va_list ap;
  15267   char *zSql = 0;
  15268   va_start(ap, zFmt);
  15269   zSql = sqlite3_vmprintf(zFmt, ap);
  15270   if( p->rc==SQLITE_OK && zSql==0 ){
  15271     p->rc = SQLITE_NOMEM;
  15272   }
  15273   pRet = intckPrepare(p, zSql);
  15274   sqlite3_free(zSql);
  15275   va_end(ap);
  15276   return pRet;
  15277 }
  15278 
  15279 /*
  15280 ** Finalize SQL statement pStmt. If an error occurs and the handle passed
  15281 ** as the first argument does not already contain an error, store the
  15282 ** error in the handle.
  15283 */
  15284 static void intckFinalize(sqlite3_intck *p, sqlite3_stmt *pStmt){
  15285   int rc = sqlite3_finalize(pStmt);
  15286   if( p->rc==SQLITE_OK && rc!=SQLITE_OK ){
  15287     intckSaveErrmsg(p);
  15288   }
  15289 }
  15290 
  15291 /*
  15292 ** If there is already an error in handle p, return it. Otherwise, call
  15293 ** sqlite3_step() on the statement handle and return that value.
  15294 */
  15295 static int intckStep(sqlite3_intck *p, sqlite3_stmt *pStmt){
  15296   if( p->rc ) return p->rc;
  15297   return sqlite3_step(pStmt);
  15298 }
  15299 
  15300 /*
  15301 ** Execute SQL statement zSql. There is no way to obtain any results 
  15302 ** returned by the statement. This function uses the sqlite3_intck error
  15303 ** code convention.
  15304 */
  15305 static void intckExec(sqlite3_intck *p, const char *zSql){
  15306   sqlite3_stmt *pStmt = 0;
  15307   pStmt = intckPrepare(p, zSql);
  15308   intckStep(p, pStmt);
  15309   intckFinalize(p, pStmt);
  15310 }
  15311 
  15312 /*
  15313 ** A wrapper around sqlite3_mprintf() that uses the sqlite3_intck error
  15314 ** code convention.
  15315 */
  15316 static char *intckMprintf(sqlite3_intck *p, const char *zFmt, ...){
  15317   va_list ap;
  15318   char *zRet = 0;
  15319   va_start(ap, zFmt);
  15320   zRet = sqlite3_vmprintf(zFmt, ap);
  15321   if( p->rc==SQLITE_OK ){
  15322     if( zRet==0 ){
  15323       p->rc = SQLITE_NOMEM;
  15324     }
  15325   }else{
  15326     sqlite3_free(zRet);
  15327     zRet = 0;
  15328   }
  15329   return zRet;
  15330 }
  15331 
  15332 /*
  15333 ** This is used by sqlite3_intck_unlock() to save the vector key value 
  15334 ** required to restart the current pCheck query as a nul-terminated string 
  15335 ** in p->zKey.
  15336 */
  15337 static void intckSaveKey(sqlite3_intck *p){
  15338   int ii;
  15339   char *zSql = 0;
  15340   sqlite3_stmt *pStmt = 0;
  15341   sqlite3_stmt *pXinfo = 0;
  15342   const char *zDir = 0;
  15343 
  15344   assert( p->pCheck );
  15345   assert( p->zKey==0 );
  15346 
  15347   pXinfo = intckPrepareFmt(p, 
  15348       "SELECT group_concat(desc, '') FROM %Q.sqlite_schema s, "
  15349       "pragma_index_xinfo(%Q, %Q) "
  15350       "WHERE s.type='index' AND s.name=%Q",
  15351       p->zDb, p->zObj, p->zDb, p->zObj
  15352   );
  15353   if( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pXinfo) ){
  15354     zDir = (const char*)sqlite3_column_text(pXinfo, 0);
  15355   }
  15356 
  15357   if( zDir==0 ){
  15358     /* Object is a table, not an index. This is the easy case,as there are 
  15359     ** no DESC columns or NULL values in a primary key.  */
  15360     const char *zSep = "SELECT '(' || ";
  15361     for(ii=0; ii<p->nKeyVal; ii++){
  15362       zSql = intckMprintf(p, "%z%squote(?)", zSql, zSep);
  15363       zSep = " || ', ' || ";
  15364     }
  15365     zSql = intckMprintf(p, "%z || ')'", zSql);
  15366   }else{
  15367 
  15368     /* Object is an index. */
  15369     assert( p->nKeyVal>1 );
  15370     for(ii=p->nKeyVal; ii>0; ii--){
  15371       int bLastIsDesc = zDir[ii-1]=='1';
  15372       int bLastIsNull = sqlite3_column_type(p->pCheck, ii)==SQLITE_NULL;
  15373       const char *zLast = sqlite3_column_name(p->pCheck, ii);
  15374       char *zLhs = 0;
  15375       char *zRhs = 0;
  15376       char *zWhere = 0;
  15377 
  15378       if( bLastIsNull ){
  15379         if( bLastIsDesc ) continue;
  15380         zWhere = intckMprintf(p, "'%s IS NOT NULL'", zLast);
  15381       }else{
  15382         const char *zOp = bLastIsDesc ? "<" : ">";
  15383         zWhere = intckMprintf(p, "'%s %s ' || quote(?%d)", zLast, zOp, ii);
  15384       }
  15385 
  15386       if( ii>1 ){
  15387         const char *zLhsSep = "";
  15388         const char *zRhsSep = "";
  15389         int jj;
  15390         for(jj=0; jj<ii-1; jj++){
  15391           const char *zAlias = (const char*)sqlite3_column_name(p->pCheck,jj+1);
  15392           zLhs = intckMprintf(p, "%z%s%s", zLhs, zLhsSep, zAlias);
  15393           zRhs = intckMprintf(p, "%z%squote(?%d)", zRhs, zRhsSep, jj+1);
  15394           zLhsSep = ",";
  15395           zRhsSep = " || ',' || ";
  15396         }
  15397 
  15398         zWhere = intckMprintf(p, 
  15399             "'(%z) IS (' || %z || ') AND ' || %z",
  15400             zLhs, zRhs, zWhere);
  15401       }
  15402       zWhere = intckMprintf(p, "'WHERE ' || %z", zWhere);
  15403 
  15404       zSql = intckMprintf(p, "%z%s(quote( %z ) )",
  15405           zSql,
  15406           (zSql==0 ? "VALUES" : ",\n      "),
  15407           zWhere
  15408       );
  15409     }
  15410     zSql = intckMprintf(p, 
  15411         "WITH wc(q) AS (\n%z\n)"
  15412         "SELECT 'VALUES' || group_concat('(' || q || ')', ',\n      ') FROM wc"
  15413         , zSql
  15414     );
  15415   }
  15416 
  15417   pStmt = intckPrepare(p, zSql);
  15418   if( p->rc==SQLITE_OK ){
  15419     for(ii=0; ii<p->nKeyVal; ii++){
  15420       sqlite3_bind_value(pStmt, ii+1, sqlite3_column_value(p->pCheck, ii+1));
  15421     }
  15422     if( SQLITE_ROW==sqlite3_step(pStmt) ){
  15423       p->zKey = intckMprintf(p,"%s",(const char*)sqlite3_column_text(pStmt, 0));
  15424     }
  15425     intckFinalize(p, pStmt);
  15426   }
  15427 
  15428   sqlite3_free(zSql);
  15429   intckFinalize(p, pXinfo);
  15430 }
  15431 
  15432 /*
  15433 ** Find the next database object (table or index) to check. If successful,
  15434 ** set sqlite3_intck.zObj to point to a nul-terminated buffer containing
  15435 ** the object's name before returning.
  15436 */
  15437 static void intckFindObject(sqlite3_intck *p){
  15438   sqlite3_stmt *pStmt = 0;
  15439   char *zPrev = p->zObj;
  15440   p->zObj = 0;
  15441 
  15442   assert( p->rc==SQLITE_OK );
  15443   assert( p->pCheck==0 );
  15444 
  15445   pStmt = intckPrepareFmt(p, 
  15446     "WITH tables(table_name) AS (" 
  15447     "  SELECT name"
  15448     "  FROM %Q.sqlite_schema WHERE (type='table' OR type='index') AND rootpage"
  15449     "  UNION ALL "
  15450     "  SELECT 'sqlite_schema'"
  15451     ")"
  15452     "SELECT table_name FROM tables "
  15453     "WHERE ?1 IS NULL OR table_name%s?1 "
  15454     "ORDER BY 1"
  15455     , p->zDb, (p->zKey ? ">=" : ">")
  15456   );
  15457 
  15458   if( p->rc==SQLITE_OK ){
  15459     sqlite3_bind_text(pStmt, 1, zPrev, -1, SQLITE_TRANSIENT);
  15460     if( sqlite3_step(pStmt)==SQLITE_ROW ){
  15461       p->zObj = intckMprintf(p,"%s",(const char*)sqlite3_column_text(pStmt, 0));
  15462     }
  15463   }
  15464   intckFinalize(p, pStmt);
  15465 
  15466   /* If this is a new object, ensure the previous key value is cleared. */
  15467   if( sqlite3_stricmp(p->zObj, zPrev) ){
  15468     sqlite3_free(p->zKey);
  15469     p->zKey = 0;
  15470   }
  15471 
  15472   sqlite3_free(zPrev);
  15473 }
  15474 
  15475 /*
  15476 ** Return the size in bytes of the first token in nul-terminated buffer z.
  15477 ** For the purposes of this call, a token is either:
  15478 **
  15479 **   *  a quoted SQL string,
  15480 *    *  a contiguous series of ascii alphabet characters, or
  15481 *    *  any other single byte.
  15482 */
  15483 static int intckGetToken(const char *z){
  15484   char c = z[0];
  15485   int iRet = 1;
  15486   if( c=='\'' || c=='"' || c=='`' ){
  15487     while( 1 ){
  15488       if( z[iRet]==c ){
  15489         iRet++;
  15490         if( z[iRet]!=c ) break;
  15491       }
  15492       iRet++;
  15493     }
  15494   }
  15495   else if( c=='[' ){
  15496     while( z[iRet++]!=']' && z[iRet] );
  15497   }
  15498   else if( (c>='A' && c<='Z') || (c>='a' && c<='z') ){
  15499     while( (z[iRet]>='A' && z[iRet]<='Z') || (z[iRet]>='a' && z[iRet]<='z') ){
  15500       iRet++;
  15501     }
  15502   }
  15503 
  15504   return iRet;
  15505 }
  15506 
  15507 /*
  15508 ** Return true if argument c is an ascii whitespace character.
  15509 */
  15510 static int intckIsSpace(char c){
  15511   return (c==' ' || c=='\t' || c=='\n' || c=='\r');
  15512 }
  15513 
  15514 /*
  15515 ** Argument z points to the text of a CREATE INDEX statement. This function
  15516 ** identifies the part of the text that contains either the index WHERE 
  15517 ** clause (if iCol<0) or the iCol'th column of the index.
  15518 **
  15519 ** If (iCol<0), the identified fragment does not include the "WHERE" keyword,
  15520 ** only the expression that follows it. If (iCol>=0) then the identified
  15521 ** fragment does not include any trailing sort-order keywords - "ASC" or 
  15522 ** "DESC".
  15523 **
  15524 ** If the CREATE INDEX statement does not contain the requested field or
  15525 ** clause, NULL is returned and (*pnByte) is set to 0. Otherwise, a pointer to
  15526 ** the identified fragment is returned and output parameter (*pnByte) set
  15527 ** to its size in bytes.
  15528 */
  15529 static const char *intckParseCreateIndex(const char *z, int iCol, int *pnByte){
  15530   int iOff = 0;
  15531   int iThisCol = 0;
  15532   int iStart = 0;
  15533   int nOpen = 0;
  15534 
  15535   const char *zRet = 0;
  15536   int nRet = 0;
  15537 
  15538   int iEndOfCol = 0;
  15539 
  15540   /* Skip forward until the first "(" token */
  15541   while( z[iOff]!='(' ){
  15542     iOff += intckGetToken(&z[iOff]);
  15543     if( z[iOff]=='\0' ) return 0;
  15544   }
  15545   assert( z[iOff]=='(' );
  15546 
  15547   nOpen = 1;
  15548   iOff++;
  15549   iStart = iOff;
  15550   while( z[iOff] ){
  15551     const char *zToken = &z[iOff];
  15552     int nToken = 0;
  15553 
  15554     /* Check if this is the end of the current column - either a "," or ")"
  15555     ** when nOpen==1.  */
  15556     if( nOpen==1 ){
  15557       if( z[iOff]==',' || z[iOff]==')' ){
  15558         if( iCol==iThisCol ){
  15559           int iEnd = iEndOfCol ? iEndOfCol : iOff;
  15560           nRet = (iEnd - iStart);
  15561           zRet = &z[iStart];
  15562           break;
  15563         }
  15564         iStart = iOff+1;
  15565         while( intckIsSpace(z[iStart]) ) iStart++;
  15566         iThisCol++;
  15567       }
  15568       if( z[iOff]==')' ) break;
  15569     }
  15570     if( z[iOff]=='(' ) nOpen++;
  15571     if( z[iOff]==')' ) nOpen--;
  15572     nToken = intckGetToken(zToken);
  15573 
  15574     if( (nToken==3 && 0==sqlite3_strnicmp(zToken, "ASC", nToken))
  15575      || (nToken==4 && 0==sqlite3_strnicmp(zToken, "DESC", nToken))
  15576     ){
  15577       iEndOfCol = iOff;
  15578     }else if( 0==intckIsSpace(zToken[0]) ){
  15579       iEndOfCol = 0;
  15580     }
  15581 
  15582     iOff += nToken;
  15583   }
  15584 
  15585   /* iStart is now the byte offset of 1 byte passed the final ')' in the
  15586   ** CREATE INDEX statement. Try to find a WHERE clause to return.  */
  15587   while( zRet==0 && z[iOff] ){
  15588     int n = intckGetToken(&z[iOff]);
  15589     if( n==5 && 0==sqlite3_strnicmp(&z[iOff], "where", 5) ){
  15590       zRet = &z[iOff+5];
  15591       nRet = (int)strlen(zRet);
  15592     }
  15593     iOff += n;
  15594   }
  15595 
  15596   /* Trim any whitespace from the start and end of the returned string. */
  15597   if( zRet ){
  15598     while( intckIsSpace(zRet[0]) ){
  15599       nRet--;
  15600       zRet++;
  15601     }
  15602     while( nRet>0 && intckIsSpace(zRet[nRet-1]) ) nRet--;
  15603   }
  15604 
  15605   *pnByte = nRet;
  15606   return zRet;
  15607 }
  15608 
  15609 /*
  15610 ** User-defined SQL function wrapper for intckParseCreateIndex():
  15611 **
  15612 **     SELECT parse_create_index(<sql>, <icol>);
  15613 */
  15614 static void intckParseCreateIndexFunc(
  15615   sqlite3_context *pCtx, 
  15616   int nVal, 
  15617   sqlite3_value **apVal
  15618 ){
  15619   const char *zSql = (const char*)sqlite3_value_text(apVal[0]);
  15620   int idx = sqlite3_value_int(apVal[1]);
  15621   const char *zRes = 0;
  15622   int nRes = 0;
  15623 
  15624   assert( nVal==2 );
  15625   if( zSql ){
  15626     zRes = intckParseCreateIndex(zSql, idx, &nRes);
  15627   }
  15628   sqlite3_result_text(pCtx, zRes, nRes, SQLITE_TRANSIENT);
  15629 }
  15630 
  15631 /*
  15632 ** Return true if sqlite3_intck.db has automatic indexes enabled, false
  15633 ** otherwise.
  15634 */
  15635 static int intckGetAutoIndex(sqlite3_intck *p){
  15636   int bRet = 0;
  15637   sqlite3_stmt *pStmt = 0;
  15638   pStmt = intckPrepare(p, "PRAGMA automatic_index");
  15639   if( SQLITE_ROW==intckStep(p, pStmt) ){
  15640     bRet = sqlite3_column_int(pStmt, 0);
  15641   }
  15642   intckFinalize(p, pStmt);
  15643   return bRet;
  15644 }
  15645 
  15646 /*
  15647 ** Return true if zObj is an index, or false otherwise.
  15648 */
  15649 static int intckIsIndex(sqlite3_intck *p, const char *zObj){
  15650   int bRet = 0;
  15651   sqlite3_stmt *pStmt = 0;
  15652   pStmt = intckPrepareFmt(p, 
  15653       "SELECT 1 FROM %Q.sqlite_schema WHERE name=%Q AND type='index'",
  15654       p->zDb, zObj
  15655   );
  15656   if( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
  15657     bRet = 1;
  15658   }
  15659   intckFinalize(p, pStmt);
  15660   return bRet;
  15661 }
  15662 
  15663 /*
  15664 ** Return a pointer to a nul-terminated buffer containing the SQL statement
  15665 ** used to check database object zObj (a table or index) for corruption.
  15666 ** If parameter zPrev is not NULL, then it must be a string containing the
  15667 ** vector key required to restart the check where it left off last time.
  15668 ** If pnKeyVal is not NULL, then (*pnKeyVal) is set to the number of
  15669 ** columns in the vector key value for the specified object.
  15670 **
  15671 ** This function uses the sqlite3_intck error code convention.
  15672 */
  15673 static char *intckCheckObjectSql(
  15674   sqlite3_intck *p,               /* Integrity check object */
  15675   const char *zObj,               /* Object (table or index) to scan */
  15676   const char *zPrev,              /* Restart key vector, if any */
  15677   int *pnKeyVal                   /* OUT: Number of key-values for this scan */
  15678 ){
  15679   char *zRet = 0;
  15680   sqlite3_stmt *pStmt = 0;
  15681   int bAutoIndex = 0;
  15682   int bIsIndex = 0;
  15683 
  15684   const char *zCommon = 
  15685       /* Relation without_rowid also contains just one row. Column "b" is
  15686       ** set to true if the table being examined is a WITHOUT ROWID table,
  15687       ** or false otherwise.  */
  15688       ", without_rowid(b) AS ("
  15689       "  SELECT EXISTS ("
  15690       "    SELECT 1 FROM tabname, pragma_index_list(tab, db) AS l"
  15691       "      WHERE origin='pk' "
  15692       "      AND NOT EXISTS (SELECT 1 FROM sqlite_schema WHERE name=l.name)"
  15693       "  )"
  15694       ")"
  15695       ""
  15696       /* Table idx_cols contains 1 row for each column in each index on the
  15697       ** table being checked. Columns are:
  15698       **
  15699       **   idx_name: Name of the index.
  15700       **   idx_ispk: True if this index is the PK of a WITHOUT ROWID table.
  15701       **   col_name: Name of indexed column, or NULL for index on expression.
  15702       **   col_expr: Indexed expression, including COLLATE clause.
  15703       **   col_alias: Alias used for column in 'intck_wrapper' table.
  15704       */
  15705       ", idx_cols(idx_name, idx_ispk, col_name, col_expr, col_alias) AS ("
  15706       "  SELECT l.name, (l.origin=='pk' AND w.b), i.name, COALESCE(("
  15707       "    SELECT parse_create_index(sql, i.seqno) FROM "
  15708       "    sqlite_schema WHERE name = l.name"
  15709       "  ), format('\"%w\"', i.name) || ' COLLATE ' || quote(i.coll)),"
  15710       "  'c' || row_number() OVER ()"
  15711       "  FROM "
  15712       "      tabname t,"
  15713       "      without_rowid w,"
  15714       "      pragma_index_list(t.tab, t.db) l,"
  15715       "      pragma_index_xinfo(l.name) i"
  15716       "      WHERE i.key"
  15717       "  UNION ALL"
  15718       "  SELECT '', 1, '_rowid_', '_rowid_', 'r1' FROM without_rowid WHERE b=0"
  15719       ")"
  15720       ""
  15721       ""
  15722       /*
  15723       ** For a PK declared as "PRIMARY KEY(a, b) ... WITHOUT ROWID", where
  15724       ** the intck_wrapper aliases of "a" and "b" are "c1" and "c2":
  15725       **
  15726       **   o_pk:   "o.c1, o.c2"
  15727       **   i_pk:   "i.'a', i.'b'"
  15728       **   ...
  15729       **   n_pk:   2
  15730       */ 
  15731       ", tabpk(db, tab, idx, o_pk, i_pk, q_pk, eq_pk, ps_pk, pk_pk, n_pk) AS ("
  15732       "    WITH pkfields(f, a) AS ("
  15733       "      SELECT i.col_name, i.col_alias FROM idx_cols i WHERE i.idx_ispk"
  15734       "    )"
  15735       "    SELECT t.db, t.tab, t.idx, "
  15736       "           group_concat(a, ', '), "
  15737       "           group_concat('i.'||quote(f), ', '), "
  15738       "           group_concat('quote(o.'||a||')', ' || '','' || '),  "
  15739       "           format('(%s)==(%s)',"
  15740       "               group_concat('o.'||a, ', '), "
  15741       "               group_concat(format('\"%w\"', f), ', ')"
  15742       "           ),"
  15743       "           group_concat('%s', ','),"
  15744       "           group_concat('quote('||a||')', ', '),  "
  15745       "           count(*)"
  15746       "    FROM tabname t, pkfields"
  15747       ")"
  15748       ""
  15749       ", idx(name, match_expr, partial, partial_alias, idx_ps, idx_idx) AS ("
  15750       "  SELECT idx_name,"
  15751       "    format('(%s,%s) IS (%s,%s)', "
  15752       "           group_concat(i.col_expr, ', '), i_pk,"
  15753       "           group_concat('o.'||i.col_alias, ', '), o_pk"
  15754       "    ), "
  15755       "    parse_create_index("
  15756       "        (SELECT sql FROM sqlite_schema WHERE name=idx_name), -1"
  15757       "    ),"
  15758       "    'cond' || row_number() OVER ()"
  15759       "    , group_concat('%s', ',')"
  15760       "    , group_concat('quote('||i.col_alias||')', ', ')"
  15761       "  FROM tabpk t, "
  15762       "       without_rowid w,"
  15763       "       idx_cols i"
  15764       "  WHERE i.idx_ispk==0 "
  15765       "  GROUP BY idx_name"
  15766       ")"
  15767       ""
  15768       ", wrapper_with(s) AS ("
  15769       "  SELECT 'intck_wrapper AS (\n  SELECT\n    ' || ("
  15770       "      WITH f(a, b) AS ("
  15771       "        SELECT col_expr, col_alias FROM idx_cols"
  15772       "          UNION ALL "
  15773       "        SELECT partial, partial_alias FROM idx WHERE partial IS NOT NULL"
  15774       "      )"
  15775       "      SELECT group_concat(format('%s AS %s', a, b), ',\n    ') FROM f"
  15776       "    )"
  15777       "    || format('\n  FROM %Q.%Q ', t.db, t.tab)"
  15778            /* If the object being checked is a table, append "NOT INDEXED".
  15779            ** Otherwise, append "INDEXED BY <index>", and then, if the index 
  15780            ** is a partial index " WHERE <condition>".  */
  15781       "    || CASE WHEN t.idx IS NULL THEN "
  15782       "        'NOT INDEXED'"
  15783       "       ELSE"
  15784       "        format('INDEXED BY %Q%s', t.idx, ' WHERE '||i.partial)"
  15785       "       END"
  15786       "    || '\n)'"
  15787       "    FROM tabname t LEFT JOIN idx i ON (i.name=t.idx)"
  15788       ")"
  15789       ""
  15790   ;
  15791 
  15792   bAutoIndex = intckGetAutoIndex(p);
  15793   if( bAutoIndex ) intckExec(p, "PRAGMA automatic_index = 0");
  15794 
  15795   bIsIndex = intckIsIndex(p, zObj);
  15796   if( bIsIndex ){
  15797     pStmt = intckPrepareFmt(p,
  15798       /* Table idxname contains a single row. The first column, "db", contains
  15799       ** the name of the db containing the table (e.g. "main") and the second,
  15800       ** "tab", the name of the table itself.  */
  15801       "WITH tabname(db, tab, idx) AS ("
  15802       "  SELECT %Q, (SELECT tbl_name FROM %Q.sqlite_schema WHERE name=%Q), %Q "
  15803       ")"
  15804       ""
  15805       ", whereclause(w_c) AS (%s)"
  15806       ""
  15807       "%s" /* zCommon */
  15808       ""
  15809       ", case_statement(c) AS ("
  15810       "  SELECT "
  15811       "    'CASE WHEN (' || group_concat(col_alias, ', ') || ', 1) IS (\n' "
  15812       "    || '      SELECT ' || group_concat(col_expr, ', ') || ', 1 FROM '"
  15813       "    || format('%%Q.%%Q NOT INDEXED WHERE %%s\n', t.db, t.tab, p.eq_pk)"
  15814       "    || '    )\n  THEN NULL\n    '"
  15815       "    || 'ELSE format(''surplus entry ('"
  15816       "    ||   group_concat('%%s', ',') || ',' || p.ps_pk"
  15817       "    || ') in index ' || t.idx || ''', ' "
  15818       "    ||   group_concat('quote('||i.col_alias||')', ', ') || ', ' || p.pk_pk"
  15819       "    || ')'"
  15820       "    || '\n  END AS error_message'"
  15821       "  FROM tabname t, tabpk p, idx_cols i WHERE i.idx_name=t.idx"
  15822       ")"
  15823       ""
  15824       ", thiskey(k, n) AS ("
  15825       "    SELECT group_concat(i.col_alias, ', ') || ', ' || p.o_pk, "
  15826       "           count(*) + p.n_pk "
  15827       "    FROM tabpk p, idx_cols i WHERE i.idx_name=p.idx"
  15828       ")"
  15829       ""
  15830       ", main_select(m, n) AS ("
  15831       "  SELECT format("
  15832       "      'WITH %%s\n' ||"
  15833       "      ', idx_checker AS (\n' ||"
  15834       "      '  SELECT %%s,\n' ||"
  15835       "      '  %%s\n' || "
  15836       "      '  FROM intck_wrapper AS o\n' ||"
  15837       "      ')\n',"
  15838       "      ww.s, c, t.k"
  15839       "  ), t.n"
  15840       "  FROM case_statement, wrapper_with ww, thiskey t"
  15841       ")"
  15842 
  15843       "SELECT m || "
  15844       "    group_concat('SELECT * FROM idx_checker ' || w_c, ' UNION ALL '), n"
  15845       " FROM "
  15846       "main_select, whereclause "
  15847       , p->zDb, p->zDb, zObj, zObj
  15848       , zPrev ? zPrev : "VALUES('')", zCommon
  15849       );
  15850   }else{
  15851     pStmt = intckPrepareFmt(p,
  15852       /* Table tabname contains a single row. The first column, "db", contains
  15853       ** the name of the db containing the table (e.g. "main") and the second,
  15854       ** "tab", the name of the table itself.  */
  15855       "WITH tabname(db, tab, idx, prev) AS (SELECT %Q, %Q, NULL, %Q)"
  15856       ""
  15857       "%s" /* zCommon */
  15858 
  15859       /* expr(e) contains one row for each index on table zObj. Value e
  15860       ** is set to an expression that evaluates to NULL if the required
  15861       ** entry is present in the index, or an error message otherwise.  */
  15862       ", expr(e, p) AS ("
  15863       "  SELECT format('CASE WHEN EXISTS \n"
  15864       "    (SELECT 1 FROM %%Q.%%Q AS i INDEXED BY %%Q WHERE %%s%%s)\n"
  15865       "    THEN NULL\n"
  15866       "    ELSE format(''entry (%%s,%%s) missing from index %%s'', %%s, %%s)\n"
  15867       "  END\n'"
  15868       "    , t.db, t.tab, i.name, i.match_expr, ' AND (' || partial || ')',"
  15869       "      i.idx_ps, t.ps_pk, i.name, i.idx_idx, t.pk_pk),"
  15870       "    CASE WHEN partial IS NULL THEN NULL ELSE i.partial_alias END"
  15871       "  FROM tabpk t, idx i"
  15872       ")"
  15873 
  15874       ", numbered(ii, cond, e) AS ("
  15875       "  SELECT 0, 'n.ii=0', 'NULL'"
  15876       "    UNION ALL "
  15877       "  SELECT row_number() OVER (),"
  15878       "      '(n.ii='||row_number() OVER ()||COALESCE(' AND '||p||')', ')'), e"
  15879       "  FROM expr"
  15880       ")"
  15881 
  15882       ", counter_with(w) AS ("
  15883       "    SELECT 'WITH intck_counter(ii) AS (\n  ' || "
  15884       "       group_concat('SELECT '||ii, ' UNION ALL\n  ') "
  15885       "    || '\n)' FROM numbered"
  15886       ")"
  15887       ""
  15888       ", case_statement(c) AS ("
  15889       "    SELECT 'CASE ' || "
  15890       "    group_concat(format('\n  WHEN %%s THEN (%%s)', cond, e), '') ||"
  15891       "    '\nEND AS error_message'"
  15892       "    FROM numbered"
  15893       ")"
  15894       ""
  15895 
  15896       /* This table contains a single row consisting of a single value -
  15897       ** the text of an SQL expression that may be used by the main SQL
  15898       ** statement to output an SQL literal that can be used to resume
  15899       ** the scan if it is suspended. e.g. for a rowid table, an expression
  15900       ** like:
  15901       **
  15902       **     format('(%d,%d)', _rowid_, n.ii)
  15903       */
  15904       ", thiskey(k, n) AS ("
  15905       "    SELECT o_pk || ', ii', n_pk+1 FROM tabpk"
  15906       ")"
  15907       ""
  15908       ", whereclause(w_c) AS ("
  15909       "    SELECT CASE WHEN prev!='' THEN "
  15910       "    '\nWHERE (' || o_pk ||', n.ii) > ' || prev"
  15911       "    ELSE ''"
  15912       "    END"
  15913       "    FROM tabpk, tabname"
  15914       ")"
  15915       ""
  15916       ", main_select(m, n) AS ("
  15917       "  SELECT format("
  15918       "      '%%s, %%s\nSELECT %%s,\n%%s\nFROM intck_wrapper AS o"
  15919                ", intck_counter AS n%%s\nORDER BY %%s', "
  15920       "      w, ww.s, c, thiskey.k, whereclause.w_c, t.o_pk"
  15921       "  ), thiskey.n"
  15922       "  FROM case_statement, tabpk t, counter_with, "
  15923       "       wrapper_with ww, thiskey, whereclause"
  15924       ")"
  15925 
  15926       "SELECT m, n FROM main_select",
  15927       p->zDb, zObj, zPrev, zCommon
  15928     );
  15929   }
  15930 
  15931   while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
  15932     zRet = intckMprintf(p, "%s", (const char*)sqlite3_column_text(pStmt, 0));
  15933     if( pnKeyVal ){
  15934       *pnKeyVal = sqlite3_column_int(pStmt, 1);
  15935     }
  15936   }
  15937   intckFinalize(p, pStmt);
  15938 
  15939   if( bAutoIndex ) intckExec(p, "PRAGMA automatic_index = 1");
  15940   return zRet;
  15941 }
  15942 
  15943 /*
  15944 ** Open a new integrity-check object.
  15945 */
  15946 int sqlite3_intck_open(
  15947   sqlite3 *db,                    /* Database handle to operate on */
  15948   const char *zDbArg,             /* "main", "temp" etc. */
  15949   sqlite3_intck **ppOut           /* OUT: New integrity-check handle */
  15950 ){
  15951   sqlite3_intck *pNew = 0;
  15952   int rc = SQLITE_OK;
  15953   const char *zDb = zDbArg ? zDbArg : "main";
  15954   int nDb = (int)strlen(zDb);
  15955 
  15956   pNew = (sqlite3_intck*)sqlite3_malloc(sizeof(*pNew) + nDb + 1);
  15957   if( pNew==0 ){
  15958     rc = SQLITE_NOMEM;
  15959   }else{
  15960     memset(pNew, 0, sizeof(*pNew));
  15961     pNew->db = db;
  15962     pNew->zDb = (const char*)&pNew[1];
  15963     memcpy(&pNew[1], zDb, nDb+1);
  15964     rc = sqlite3_create_function(db, "parse_create_index", 
  15965         2, SQLITE_UTF8, 0, intckParseCreateIndexFunc, 0, 0
  15966     );
  15967     if( rc!=SQLITE_OK ){
  15968       sqlite3_intck_close(pNew);
  15969       pNew = 0;
  15970     }
  15971   }
  15972 
  15973   *ppOut = pNew;
  15974   return rc;
  15975 }
  15976 
  15977 /*
  15978 ** Free the integrity-check object.
  15979 */
  15980 void sqlite3_intck_close(sqlite3_intck *p){
  15981   if( p ){
  15982     sqlite3_finalize(p->pCheck);
  15983     sqlite3_create_function(
  15984         p->db, "parse_create_index", 1, SQLITE_UTF8, 0, 0, 0, 0
  15985     );
  15986     sqlite3_free(p->zObj);
  15987     sqlite3_free(p->zKey);
  15988     sqlite3_free(p->zTestSql);
  15989     sqlite3_free(p->zErr);
  15990     sqlite3_free(p->zMessage);
  15991     sqlite3_free(p);
  15992   }
  15993 }
  15994 
  15995 /*
  15996 ** Step the integrity-check object.
  15997 */
  15998 int sqlite3_intck_step(sqlite3_intck *p){
  15999   if( p->rc==SQLITE_OK ){
  16000 
  16001     if( p->zMessage ){
  16002       sqlite3_free(p->zMessage);
  16003       p->zMessage = 0;
  16004     }
  16005 
  16006     if( p->bCorruptSchema ){
  16007       p->rc = SQLITE_DONE;
  16008     }else
  16009     if( p->pCheck==0 ){
  16010       intckFindObject(p);
  16011       if( p->rc==SQLITE_OK ){
  16012         if( p->zObj ){
  16013           char *zSql = 0;
  16014           zSql = intckCheckObjectSql(p, p->zObj, p->zKey, &p->nKeyVal);
  16015           p->pCheck = intckPrepare(p, zSql);
  16016           sqlite3_free(zSql);
  16017           sqlite3_free(p->zKey);
  16018           p->zKey = 0;
  16019         }else{
  16020           p->rc = SQLITE_DONE;
  16021         }
  16022       }else if( p->rc==SQLITE_CORRUPT ){
  16023         p->rc = SQLITE_OK;
  16024         p->zMessage = intckMprintf(p, "%s",
  16025             "corruption found while reading database schema"
  16026         );
  16027         p->bCorruptSchema = 1;
  16028       }
  16029     }
  16030 
  16031     if( p->pCheck ){
  16032       assert( p->rc==SQLITE_OK );
  16033       if( sqlite3_step(p->pCheck)==SQLITE_ROW ){
  16034         /* Normal case, do nothing. */
  16035       }else{
  16036         intckFinalize(p, p->pCheck);
  16037         p->pCheck = 0;
  16038         p->nKeyVal = 0;
  16039         if( p->rc==SQLITE_CORRUPT ){
  16040           p->rc = SQLITE_OK;
  16041           p->zMessage = intckMprintf(p, 
  16042               "corruption found while scanning database object %s", p->zObj
  16043           );
  16044         }
  16045       }
  16046     }
  16047   }
  16048 
  16049   return p->rc;
  16050 }
  16051 
  16052 /*
  16053 ** Return a message describing the corruption encountered by the most recent
  16054 ** call to sqlite3_intck_step(), or NULL if no corruption was encountered.
  16055 */
  16056 const char *sqlite3_intck_message(sqlite3_intck *p){
  16057   assert( p->pCheck==0 || p->zMessage==0 );
  16058   if( p->zMessage ){
  16059     return p->zMessage;
  16060   }
  16061   if( p->pCheck ){
  16062     return (const char*)sqlite3_column_text(p->pCheck, 0);
  16063   }
  16064   return 0;
  16065 }
  16066 
  16067 /*
  16068 ** Return the error code and message.
  16069 */
  16070 int sqlite3_intck_error(sqlite3_intck *p, const char **pzErr){
  16071   if( pzErr ) *pzErr = p->zErr;
  16072   return (p->rc==SQLITE_DONE ? SQLITE_OK : p->rc);
  16073 }
  16074 
  16075 /*
  16076 ** Close any read transaction the integrity-check object is holding open
  16077 ** on the database.
  16078 */
  16079 int sqlite3_intck_unlock(sqlite3_intck *p){
  16080   if( p->rc==SQLITE_OK && p->pCheck ){
  16081     assert( p->zKey==0 && p->nKeyVal>0 );
  16082     intckSaveKey(p);
  16083     intckFinalize(p, p->pCheck);
  16084     p->pCheck = 0;
  16085   }
  16086   return p->rc;
  16087 }
  16088 
  16089 /*
  16090 ** Return the SQL statement used to check object zObj. Or, if zObj is 
  16091 ** NULL, the current SQL statement.
  16092 */
  16093 const char *sqlite3_intck_test_sql(sqlite3_intck *p, const char *zObj){
  16094   sqlite3_free(p->zTestSql);
  16095   if( zObj ){
  16096     p->zTestSql = intckCheckObjectSql(p, zObj, 0, 0);
  16097   }else{
  16098     if( p->zObj ){
  16099       p->zTestSql = intckCheckObjectSql(p, p->zObj, p->zKey, 0);
  16100     }else{
  16101       sqlite3_free(p->zTestSql);
  16102       p->zTestSql = 0;
  16103     }
  16104   }
  16105   return p->zTestSql;
  16106 }
  16107 
  16108 /************************* End ../ext/intck/sqlite3intck.c ********************/
  16109 /************************* Begin ../ext/misc/stmtrand.c ******************/
  16110 /*
  16111 ** 2024-05-24
  16112 **
  16113 ** The author disclaims copyright to this source code.  In place of
  16114 ** a legal notice, here is a blessing:
  16115 **
  16116 **    May you do good and not evil.
  16117 **    May you find forgiveness for yourself and forgive others.
  16118 **    May you share freely, never taking more than you give.
  16119 **
  16120 ******************************************************************************
  16121 **
  16122 ** An SQL function that return pseudo-random non-negative integers.
  16123 **
  16124 **      SELECT stmtrand(123);
  16125 **
  16126 ** A special feature of this function is that the same sequence of random
  16127 ** integers is returned for each invocation of the statement.  This makes
  16128 ** the results repeatable, and hence useful for testing.  The argument is
  16129 ** an integer which is the seed for the random number sequence.  The seed
  16130 ** is used by the first invocation of this function only and is ignored
  16131 ** for all subsequent calls within the same statement.
  16132 **
  16133 ** Resetting a statement (sqlite3_reset()) also resets the random number
  16134 ** sequence.
  16135 */
  16136 /* #include "sqlite3ext.h" */
  16137 SQLITE_EXTENSION_INIT1
  16138 #include <assert.h>
  16139 #include <string.h>
  16140 
  16141 /* State of the pseudo-random number generator */
  16142 typedef struct Stmtrand {
  16143   unsigned int x, y;
  16144 } Stmtrand;
  16145 
  16146 /* auxdata key */
  16147 #define STMTRAND_KEY  (-4418371)
  16148 
  16149 /*
  16150 ** Function:     stmtrand(SEED)
  16151 **
  16152 ** Return a pseudo-random number.
  16153 */
  16154 static void stmtrandFunc(
  16155   sqlite3_context *context,
  16156   int argc,
  16157   sqlite3_value **argv
  16158 ){
  16159   Stmtrand *p;
  16160 
  16161   p = (Stmtrand*)sqlite3_get_auxdata(context, STMTRAND_KEY);
  16162   if( p==0 ){
  16163     unsigned int seed;
  16164     p = sqlite3_malloc( sizeof(*p) );
  16165     if( p==0 ){
  16166       sqlite3_result_error_nomem(context);
  16167       return;
  16168     }
  16169     if( argc>=1 ){
  16170       seed = (unsigned int)sqlite3_value_int(argv[0]);
  16171     }else{
  16172       seed = 0;
  16173     }
  16174     p->x = seed | 1;
  16175     p->y = seed;
  16176     sqlite3_set_auxdata(context, STMTRAND_KEY, p, sqlite3_free);
  16177     p = (Stmtrand*)sqlite3_get_auxdata(context, STMTRAND_KEY);
  16178     if( p==0 ){
  16179       sqlite3_result_error_nomem(context);
  16180       return;
  16181     }
  16182   }
  16183   p->x = (p->x>>1) ^ ((1+~(p->x&1)) & 0xd0000001);
  16184   p->y = p->y*1103515245 + 12345;
  16185   sqlite3_result_int(context, (int)((p->x ^ p->y)&0x7fffffff));
  16186 }
  16187 
  16188 #ifdef _WIN32
  16189 
  16190 #endif
  16191 int sqlite3_stmtrand_init(
  16192   sqlite3 *db, 
  16193   char **pzErrMsg, 
  16194   const sqlite3_api_routines *pApi
  16195 ){
  16196   int rc = SQLITE_OK;
  16197   SQLITE_EXTENSION_INIT2(pApi);
  16198   (void)pzErrMsg;  /* Unused parameter */
  16199   rc = sqlite3_create_function(db, "stmtrand", 1, SQLITE_UTF8, 0,
  16200                                stmtrandFunc, 0, 0);
  16201   if( rc==SQLITE_OK ){
  16202     rc = sqlite3_create_function(db, "stmtrand", 0, SQLITE_UTF8, 0,
  16203                                  stmtrandFunc, 0, 0);
  16204   }
  16205   return rc;
  16206 }
  16207 
  16208 /************************* End ../ext/misc/stmtrand.c ********************/
  16209 /************************* Begin ../ext/misc/vfstrace.c ******************/
  16210 /*
  16211 ** 2011 March 16
  16212 **
  16213 ** The author disclaims copyright to this source code.  In place of
  16214 ** a legal notice, here is a blessing:
  16215 **
  16216 **    May you do good and not evil.
  16217 **    May you find forgiveness for yourself and forgive others.
  16218 **    May you share freely, never taking more than you give.
  16219 **
  16220 ******************************************************************************
  16221 **
  16222 ** This file contains code implements a VFS shim that writes diagnostic
  16223 ** output for each VFS call, similar to "strace".
  16224 **
  16225 ** USAGE:
  16226 **
  16227 ** This source file exports a single symbol which is the name of a
  16228 ** function:
  16229 **
  16230 **   int vfstrace_register(
  16231 **     const char *zTraceName,         // Name of the newly constructed VFS
  16232 **     const char *zOldVfsName,        // Name of the underlying VFS
  16233 **     int (*xOut)(const char*,void*), // Output routine.  ex: fputs
  16234 **     void *pOutArg,                  // 2nd argument to xOut.  ex: stderr
  16235 **     int makeDefault                 // Make the new VFS the default
  16236 **   );
  16237 **
  16238 ** Applications that want to trace their VFS usage must provide a callback
  16239 ** function with this prototype:
  16240 **
  16241 **   int traceOutput(const char *zMessage, void *pAppData);
  16242 **
  16243 ** This function will "output" the trace messages, where "output" can
  16244 ** mean different things to different applications.  The traceOutput function
  16245 ** for the command-line shell (see shell.c) is "fputs" from the standard
  16246 ** library, which means that all trace output is written on the stream
  16247 ** specified by the second argument.  In the case of the command-line shell
  16248 ** the second argument is stderr.  Other applications might choose to output
  16249 ** trace information to a file, over a socket, or write it into a buffer.
  16250 **
  16251 ** The vfstrace_register() function creates a new "shim" VFS named by
  16252 ** the zTraceName parameter.  A "shim" VFS is an SQLite backend that does
  16253 ** not really perform the duties of a true backend, but simply filters or
  16254 ** interprets VFS calls before passing them off to another VFS which does
  16255 ** the actual work.  In this case the other VFS - the one that does the
  16256 ** real work - is identified by the second parameter, zOldVfsName.  If
  16257 ** the 2nd parameter is NULL then the default VFS is used.  The common
  16258 ** case is for the 2nd parameter to be NULL.
  16259 **
  16260 ** The third and fourth parameters are the pointer to the output function
  16261 ** and the second argument to the output function.  For the SQLite
  16262 ** command-line shell, when the -vfstrace option is used, these parameters
  16263 ** are fputs and stderr, respectively.
  16264 **
  16265 ** The fifth argument is true (non-zero) to cause the newly created VFS
  16266 ** to become the default VFS.  The common case is for the fifth parameter
  16267 ** to be true.
  16268 **
  16269 ** The call to vfstrace_register() simply creates the shim VFS that does
  16270 ** tracing.  The application must also arrange to use the new VFS for
  16271 ** all database connections that are created and for which tracing is 
  16272 ** desired.  This can be done by specifying the trace VFS using URI filename
  16273 ** notation, or by specifying the trace VFS as the 4th parameter to
  16274 ** sqlite3_open_v2() or by making the trace VFS be the default (by setting
  16275 ** the 5th parameter of vfstrace_register() to 1).
  16276 **
  16277 **
  16278 ** ENABLING VFSTRACE IN A COMMAND-LINE SHELL
  16279 **
  16280 ** The SQLite command line shell implemented by the shell.c source file
  16281 ** can be used with this module.  To compile in -vfstrace support, first
  16282 ** gather this file (test_vfstrace.c), the shell source file (shell.c),
  16283 ** and the SQLite amalgamation source files (sqlite3.c, sqlite3.h) into
  16284 ** the working directory.  Then compile using a command like the following:
  16285 **
  16286 **    gcc -o sqlite3 -Os -I. -DSQLITE_ENABLE_VFSTRACE \
  16287 **        -DSQLITE_THREADSAFE=0 -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_RTREE \
  16288 **        -DHAVE_READLINE -DHAVE_USLEEP=1 \
  16289 **        shell.c test_vfstrace.c sqlite3.c -ldl -lreadline -lncurses
  16290 **
  16291 ** The gcc command above works on Linux and provides (in addition to the
  16292 ** -vfstrace option) support for FTS3 and FTS4, RTREE, and command-line
  16293 ** editing using the readline library.  The command-line shell does not
  16294 ** use threads so we added -DSQLITE_THREADSAFE=0 just to make the code
  16295 ** run a little faster.   For compiling on a Mac, you'll probably need
  16296 ** to omit the -DHAVE_READLINE, the -lreadline, and the -lncurses options.
  16297 ** The compilation could be simplified to just this:
  16298 **
  16299 **    gcc -DSQLITE_ENABLE_VFSTRACE \
  16300 **         shell.c test_vfstrace.c sqlite3.c -ldl -lpthread
  16301 **
  16302 ** In this second example, all unnecessary options have been removed
  16303 ** Note that since the code is now threadsafe, we had to add the -lpthread
  16304 ** option to pull in the pthreads library.
  16305 **
  16306 ** To cross-compile for windows using MinGW, a command like this might
  16307 ** work:
  16308 **
  16309 **    /opt/mingw/bin/i386-mingw32msvc-gcc -o sqlite3.exe -Os -I \
  16310 **         -DSQLITE_THREADSAFE=0 -DSQLITE_ENABLE_VFSTRACE \
  16311 **         shell.c test_vfstrace.c sqlite3.c
  16312 **
  16313 ** Similar compiler commands will work on different systems.  The key
  16314 ** invariants are (1) you must have -DSQLITE_ENABLE_VFSTRACE so that
  16315 ** the shell.c source file will know to include the -vfstrace command-line
  16316 ** option and (2) you must compile and link the three source files
  16317 ** shell,c, test_vfstrace.c, and sqlite3.c.
  16318 **
  16319 ** RUNTIME CONTROL OF VFSTRACE OUTPUT
  16320 **
  16321 ** The application can use the "vfstrace" pragma to control which VFS
  16322 ** APIs are traced.  To disable all output:
  16323 **
  16324 **    PRAGMA vfstrace('-all');
  16325 **
  16326 ** To enable all output (which is the default setting):
  16327 **
  16328 **    PRAGMA vfstrace('+all');
  16329 **
  16330 ** Individual APIs can be enabled or disabled by name, with or without
  16331 ** the initial "x" character.  For example, to set up for tracing lock
  16332 ** primitives only:
  16333 **
  16334 **    PRAGMA vfstrace('-all, +Lock,Unlock,ShmLock');
  16335 **
  16336 ** The argument to the vfstrace pragma ignores capitalization and any
  16337 ** characters other than alphabetics, '+', and '-'.
  16338 */
  16339 #include <stdlib.h>
  16340 #include <string.h>
  16341 /* #include "sqlite3.h" */
  16342 
  16343 /*
  16344 ** An instance of this structure is attached to the each trace VFS to
  16345 ** provide auxiliary information.
  16346 */
  16347 typedef struct vfstrace_info vfstrace_info;
  16348 struct vfstrace_info {
  16349   sqlite3_vfs *pRootVfs;              /* The underlying real VFS */
  16350   int (*xOut)(const char*, void*);    /* Send output here */
  16351   unsigned int mTrace;                /* Mask of interfaces to trace */
  16352   u8 bOn;                             /* Tracing on/off */
  16353   void *pOutArg;                      /* First argument to xOut */
  16354   const char *zVfsName;               /* Name of this trace-VFS */
  16355   sqlite3_vfs *pTraceVfs;             /* Pointer back to the trace VFS */
  16356 };
  16357 
  16358 /*
  16359 ** The sqlite3_file object for the trace VFS
  16360 */
  16361 typedef struct vfstrace_file vfstrace_file;
  16362 struct vfstrace_file {
  16363   sqlite3_file base;        /* Base class.  Must be first */
  16364   vfstrace_info *pInfo;     /* The trace-VFS to which this file belongs */
  16365   const char *zFName;       /* Base name of the file */
  16366   sqlite3_file *pReal;      /* The real underlying file */
  16367 };
  16368 
  16369 /*
  16370 ** Bit values for vfstrace_info.mTrace.
  16371 */
  16372 #define VTR_CLOSE           0x00000001
  16373 #define VTR_READ            0x00000002
  16374 #define VTR_WRITE           0x00000004
  16375 #define VTR_TRUNC           0x00000008
  16376 #define VTR_SYNC            0x00000010
  16377 #define VTR_FSIZE           0x00000020
  16378 #define VTR_LOCK            0x00000040
  16379 #define VTR_UNLOCK          0x00000080
  16380 #define VTR_CRL             0x00000100
  16381 #define VTR_FCTRL           0x00000200
  16382 #define VTR_SECSZ           0x00000400
  16383 #define VTR_DEVCHAR         0x00000800
  16384 #define VTR_SHMLOCK         0x00001000
  16385 #define VTR_SHMMAP          0x00002000
  16386 #define VTR_SHMBAR          0x00004000
  16387 #define VTR_SHMUNMAP        0x00008000
  16388 #define VTR_OPEN            0x00010000
  16389 #define VTR_DELETE          0x00020000
  16390 #define VTR_ACCESS          0x00040000
  16391 #define VTR_FULLPATH        0x00080000
  16392 #define VTR_DLOPEN          0x00100000
  16393 #define VTR_DLERR           0x00200000
  16394 #define VTR_DLSYM           0x00400000
  16395 #define VTR_DLCLOSE         0x00800000
  16396 #define VTR_RAND            0x01000000
  16397 #define VTR_SLEEP           0x02000000
  16398 #define VTR_CURTIME         0x04000000
  16399 #define VTR_LASTERR         0x08000000
  16400 #define VTR_FETCH           0x10000000   /* Also coverse xUnfetch */
  16401 
  16402 /*
  16403 ** Method declarations for vfstrace_file.
  16404 */
  16405 static int vfstraceClose(sqlite3_file*);
  16406 static int vfstraceRead(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst);
  16407 static int vfstraceWrite(sqlite3_file*,const void*,int iAmt, sqlite3_int64);
  16408 static int vfstraceTruncate(sqlite3_file*, sqlite3_int64 size);
  16409 static int vfstraceSync(sqlite3_file*, int flags);
  16410 static int vfstraceFileSize(sqlite3_file*, sqlite3_int64 *pSize);
  16411 static int vfstraceLock(sqlite3_file*, int);
  16412 static int vfstraceUnlock(sqlite3_file*, int);
  16413 static int vfstraceCheckReservedLock(sqlite3_file*, int *);
  16414 static int vfstraceFileControl(sqlite3_file*, int op, void *pArg);
  16415 static int vfstraceSectorSize(sqlite3_file*);
  16416 static int vfstraceDeviceCharacteristics(sqlite3_file*);
  16417 static int vfstraceShmLock(sqlite3_file*,int,int,int);
  16418 static int vfstraceShmMap(sqlite3_file*,int,int,int, void volatile **);
  16419 static void vfstraceShmBarrier(sqlite3_file*);
  16420 static int vfstraceShmUnmap(sqlite3_file*,int);
  16421 
  16422 /*
  16423 ** Method declarations for vfstrace_vfs.
  16424 */
  16425 static int vfstraceOpen(sqlite3_vfs*, const char *, sqlite3_file*, int , int *);
  16426 static int vfstraceDelete(sqlite3_vfs*, const char *zName, int syncDir);
  16427 static int vfstraceAccess(sqlite3_vfs*, const char *zName, int flags, int *);
  16428 static int vfstraceFullPathname(sqlite3_vfs*, const char *zName, int, char *);
  16429 static void *vfstraceDlOpen(sqlite3_vfs*, const char *zFilename);
  16430 static void vfstraceDlError(sqlite3_vfs*, int nByte, char *zErrMsg);
  16431 static void (*vfstraceDlSym(sqlite3_vfs*,void*, const char *zSymbol))(void);
  16432 static void vfstraceDlClose(sqlite3_vfs*, void*);
  16433 static int vfstraceRandomness(sqlite3_vfs*, int nByte, char *zOut);
  16434 static int vfstraceSleep(sqlite3_vfs*, int microseconds);
  16435 static int vfstraceCurrentTime(sqlite3_vfs*, double*);
  16436 static int vfstraceGetLastError(sqlite3_vfs*, int, char*);
  16437 static int vfstraceCurrentTimeInt64(sqlite3_vfs*, sqlite3_int64*);
  16438 static int vfstraceSetSystemCall(sqlite3_vfs*,const char*, sqlite3_syscall_ptr);
  16439 static sqlite3_syscall_ptr vfstraceGetSystemCall(sqlite3_vfs*, const char *);
  16440 static const char *vfstraceNextSystemCall(sqlite3_vfs*, const char *zName);
  16441 
  16442 /*
  16443 ** Return a pointer to the tail of the pathname.  Examples:
  16444 **
  16445 **     /home/drh/xyzzy.txt -> xyzzy.txt
  16446 **     xyzzy.txt           -> xyzzy.txt
  16447 */
  16448 static const char *fileTail(const char *z){
  16449   size_t i;
  16450   if( z==0 ) return 0;
  16451   i = strlen(z)-1;
  16452   while( i>0 && z[i-1]!='/' ){ i--; }
  16453   return &z[i];
  16454 }
  16455 
  16456 /*
  16457 ** Send trace output defined by zFormat and subsequent arguments.
  16458 */
  16459 static void vfstrace_printf(
  16460   vfstrace_info *pInfo,
  16461   const char *zFormat,
  16462   ...
  16463 ){
  16464   va_list ap;
  16465   char *zMsg;
  16466   if( pInfo->bOn ){
  16467     va_start(ap, zFormat);
  16468     zMsg = sqlite3_vmprintf(zFormat, ap);
  16469     va_end(ap);
  16470     pInfo->xOut(zMsg, pInfo->pOutArg);
  16471     sqlite3_free(zMsg);
  16472   }
  16473 }
  16474 
  16475 /*
  16476 ** Try to convert an error code into a symbolic name for that error code.
  16477 */
  16478 static const char *vfstrace_errcode_name(int rc ){
  16479   const char *zVal = 0;
  16480   switch( rc ){
  16481     case SQLITE_OK:                 zVal = "SQLITE_OK";                 break;
  16482     case SQLITE_INTERNAL:           zVal = "SQLITE_INTERNAL";           break;
  16483     case SQLITE_ERROR:              zVal = "SQLITE_ERROR";              break;
  16484     case SQLITE_PERM:               zVal = "SQLITE_PERM";               break;
  16485     case SQLITE_ABORT:              zVal = "SQLITE_ABORT";              break;
  16486     case SQLITE_BUSY:               zVal = "SQLITE_BUSY";               break;
  16487     case SQLITE_LOCKED:             zVal = "SQLITE_LOCKED";             break;
  16488     case SQLITE_NOMEM:              zVal = "SQLITE_NOMEM";              break;
  16489     case SQLITE_READONLY:           zVal = "SQLITE_READONLY";           break;
  16490     case SQLITE_INTERRUPT:          zVal = "SQLITE_INTERRUPT";          break;
  16491     case SQLITE_IOERR:              zVal = "SQLITE_IOERR";              break;
  16492     case SQLITE_CORRUPT:            zVal = "SQLITE_CORRUPT";            break;
  16493     case SQLITE_NOTFOUND:           zVal = "SQLITE_NOTFOUND";           break;
  16494     case SQLITE_FULL:               zVal = "SQLITE_FULL";               break;
  16495     case SQLITE_CANTOPEN:           zVal = "SQLITE_CANTOPEN";           break;
  16496     case SQLITE_PROTOCOL:           zVal = "SQLITE_PROTOCOL";           break;
  16497     case SQLITE_EMPTY:              zVal = "SQLITE_EMPTY";              break;
  16498     case SQLITE_SCHEMA:             zVal = "SQLITE_SCHEMA";             break;
  16499     case SQLITE_TOOBIG:             zVal = "SQLITE_TOOBIG";             break;
  16500     case SQLITE_CONSTRAINT:         zVal = "SQLITE_CONSTRAINT";         break;
  16501     case SQLITE_MISMATCH:           zVal = "SQLITE_MISMATCH";           break;
  16502     case SQLITE_MISUSE:             zVal = "SQLITE_MISUSE";             break;
  16503     case SQLITE_NOLFS:              zVal = "SQLITE_NOLFS";              break;
  16504     case SQLITE_IOERR_READ:         zVal = "SQLITE_IOERR_READ";         break;
  16505     case SQLITE_IOERR_SHORT_READ:   zVal = "SQLITE_IOERR_SHORT_READ";   break;
  16506     case SQLITE_IOERR_WRITE:        zVal = "SQLITE_IOERR_WRITE";        break;
  16507     case SQLITE_IOERR_FSYNC:        zVal = "SQLITE_IOERR_FSYNC";        break;
  16508     case SQLITE_IOERR_DIR_FSYNC:    zVal = "SQLITE_IOERR_DIR_FSYNC";    break;
  16509     case SQLITE_IOERR_TRUNCATE:     zVal = "SQLITE_IOERR_TRUNCATE";     break;
  16510     case SQLITE_IOERR_FSTAT:        zVal = "SQLITE_IOERR_FSTAT";        break;
  16511     case SQLITE_IOERR_UNLOCK:       zVal = "SQLITE_IOERR_UNLOCK";       break;
  16512     case SQLITE_IOERR_RDLOCK:       zVal = "SQLITE_IOERR_RDLOCK";       break;
  16513     case SQLITE_IOERR_DELETE:       zVal = "SQLITE_IOERR_DELETE";       break;
  16514     case SQLITE_IOERR_BLOCKED:      zVal = "SQLITE_IOERR_BLOCKED";      break;
  16515     case SQLITE_IOERR_NOMEM:        zVal = "SQLITE_IOERR_NOMEM";        break;
  16516     case SQLITE_IOERR_ACCESS:       zVal = "SQLITE_IOERR_ACCESS";       break;
  16517     case SQLITE_IOERR_CHECKRESERVEDLOCK:
  16518                                zVal = "SQLITE_IOERR_CHECKRESERVEDLOCK"; break;
  16519     case SQLITE_IOERR_LOCK:         zVal = "SQLITE_IOERR_LOCK";         break;
  16520     case SQLITE_IOERR_CLOSE:        zVal = "SQLITE_IOERR_CLOSE";        break;
  16521     case SQLITE_IOERR_DIR_CLOSE:    zVal = "SQLITE_IOERR_DIR_CLOSE";    break;
  16522     case SQLITE_IOERR_SHMOPEN:      zVal = "SQLITE_IOERR_SHMOPEN";      break;
  16523     case SQLITE_IOERR_SHMSIZE:      zVal = "SQLITE_IOERR_SHMSIZE";      break;
  16524     case SQLITE_IOERR_SHMLOCK:      zVal = "SQLITE_IOERR_SHMLOCK";      break;
  16525     case SQLITE_IOERR_SHMMAP:       zVal = "SQLITE_IOERR_SHMMAP";       break;
  16526     case SQLITE_IOERR_SEEK:         zVal = "SQLITE_IOERR_SEEK";         break;
  16527     case SQLITE_IOERR_GETTEMPPATH:  zVal = "SQLITE_IOERR_GETTEMPPATH";  break;
  16528     case SQLITE_IOERR_CONVPATH:     zVal = "SQLITE_IOERR_CONVPATH";     break;
  16529     case SQLITE_READONLY_DBMOVED:   zVal = "SQLITE_READONLY_DBMOVED";   break;
  16530     case SQLITE_LOCKED_SHAREDCACHE: zVal = "SQLITE_LOCKED_SHAREDCACHE"; break;
  16531     case SQLITE_BUSY_RECOVERY:      zVal = "SQLITE_BUSY_RECOVERY";      break;
  16532     case SQLITE_CANTOPEN_NOTEMPDIR: zVal = "SQLITE_CANTOPEN_NOTEMPDIR"; break;
  16533   }
  16534   return zVal;
  16535 }
  16536 
  16537 /*
  16538 ** Convert value rc into a string and print it using zFormat.  zFormat
  16539 ** should have exactly one %s
  16540 */
  16541 static void vfstrace_print_errcode(
  16542   vfstrace_info *pInfo,
  16543   const char *zFormat,
  16544   int rc
  16545 ){
  16546   const char *zVal;
  16547   char zBuf[50];
  16548   zVal = vfstrace_errcode_name(rc);
  16549   if( zVal==0 ){
  16550     zVal = vfstrace_errcode_name(rc&0xff);
  16551     if( zVal ){
  16552       sqlite3_snprintf(sizeof(zBuf), zBuf, "%s | 0x%x", zVal, rc&0xffff00);
  16553     }else{
  16554       sqlite3_snprintf(sizeof(zBuf), zBuf, "%d (0x%x)", rc, rc);
  16555     }
  16556     zVal = zBuf;
  16557   }
  16558   vfstrace_printf(pInfo, zFormat, zVal);
  16559 }
  16560 
  16561 /*
  16562 ** Append to a buffer.
  16563 */
  16564 static void strappend(char *z, int *pI, const char *zAppend){
  16565   int i = *pI;
  16566   while( zAppend[0] ){ z[i++] = *(zAppend++); }
  16567   z[i] = 0;
  16568   *pI = i;
  16569 }
  16570 
  16571 /*
  16572 ** Turn tracing output on or off according to mMask.
  16573 */
  16574 static void vfstraceOnOff(vfstrace_info *pInfo, unsigned int mMask){
  16575   pInfo->bOn = (pInfo->mTrace & mMask)!=0;
  16576 }
  16577 
  16578 /*
  16579 ** Close an vfstrace-file.
  16580 */
  16581 static int vfstraceClose(sqlite3_file *pFile){
  16582   vfstrace_file *p = (vfstrace_file *)pFile;
  16583   vfstrace_info *pInfo = p->pInfo;
  16584   int rc;
  16585   vfstraceOnOff(pInfo, VTR_CLOSE);
  16586   vfstrace_printf(pInfo, "%s.xClose(%s)", pInfo->zVfsName, p->zFName);
  16587   rc = p->pReal->pMethods->xClose(p->pReal);
  16588   vfstrace_print_errcode(pInfo, " -> %s\n", rc);
  16589   if( rc==SQLITE_OK ){
  16590     sqlite3_free((void*)p->base.pMethods);
  16591     p->base.pMethods = 0;
  16592   }
  16593   return rc;
  16594 }
  16595 
  16596 /*
  16597 ** Read data from an vfstrace-file.
  16598 */
  16599 static int vfstraceRead(
  16600   sqlite3_file *pFile, 
  16601   void *zBuf, 
  16602   int iAmt, 
  16603   sqlite_int64 iOfst
  16604 ){
  16605   vfstrace_file *p = (vfstrace_file *)pFile;
  16606   vfstrace_info *pInfo = p->pInfo;
  16607   int rc;
  16608   vfstraceOnOff(pInfo, VTR_READ);
  16609   vfstrace_printf(pInfo, "%s.xRead(%s,n=%d,ofst=%lld)",
  16610                   pInfo->zVfsName, p->zFName, iAmt, iOfst);
  16611   rc = p->pReal->pMethods->xRead(p->pReal, zBuf, iAmt, iOfst);
  16612   vfstrace_print_errcode(pInfo, " -> %s\n", rc);
  16613   return rc;
  16614 }
  16615 
  16616 /*
  16617 ** Write data to an vfstrace-file.
  16618 */
  16619 static int vfstraceWrite(
  16620   sqlite3_file *pFile, 
  16621   const void *zBuf, 
  16622   int iAmt, 
  16623   sqlite_int64 iOfst
  16624 ){
  16625   vfstrace_file *p = (vfstrace_file *)pFile;
  16626   vfstrace_info *pInfo = p->pInfo;
  16627   int rc;
  16628   vfstraceOnOff(pInfo, VTR_WRITE);
  16629   vfstrace_printf(pInfo, "%s.xWrite(%s,n=%d,ofst=%lld)",
  16630                   pInfo->zVfsName, p->zFName, iAmt, iOfst);
  16631   rc = p->pReal->pMethods->xWrite(p->pReal, zBuf, iAmt, iOfst);
  16632   vfstrace_print_errcode(pInfo, " -> %s\n", rc);
  16633   return rc;
  16634 }
  16635 
  16636 /*
  16637 ** Truncate an vfstrace-file.
  16638 */
  16639 static int vfstraceTruncate(sqlite3_file *pFile, sqlite_int64 size){
  16640   vfstrace_file *p = (vfstrace_file *)pFile;
  16641   vfstrace_info *pInfo = p->pInfo;
  16642   int rc;
  16643   vfstraceOnOff(pInfo, VTR_TRUNC);
  16644   vfstrace_printf(pInfo, "%s.xTruncate(%s,%lld)", pInfo->zVfsName, p->zFName,
  16645                   size);
  16646   rc = p->pReal->pMethods->xTruncate(p->pReal, size);
  16647   vfstrace_printf(pInfo, " -> %d\n", rc);
  16648   return rc;
  16649 }
  16650 
  16651 /*
  16652 ** Sync an vfstrace-file.
  16653 */
  16654 static int vfstraceSync(sqlite3_file *pFile, int flags){
  16655   vfstrace_file *p = (vfstrace_file *)pFile;
  16656   vfstrace_info *pInfo = p->pInfo;
  16657   int rc;
  16658   int i;
  16659   char zBuf[100];
  16660   memcpy(zBuf, "|0", 3);
  16661   i = 0;
  16662   if( flags & SQLITE_SYNC_FULL )        strappend(zBuf, &i, "|FULL");
  16663   else if( flags & SQLITE_SYNC_NORMAL ) strappend(zBuf, &i, "|NORMAL");
  16664   if( flags & SQLITE_SYNC_DATAONLY )    strappend(zBuf, &i, "|DATAONLY");
  16665   if( flags & ~(SQLITE_SYNC_FULL|SQLITE_SYNC_DATAONLY) ){
  16666     sqlite3_snprintf(sizeof(zBuf)-i, &zBuf[i], "|0x%x", flags);
  16667   }
  16668   vfstraceOnOff(pInfo, VTR_SYNC);
  16669   vfstrace_printf(pInfo, "%s.xSync(%s,%s)", pInfo->zVfsName, p->zFName,
  16670                   &zBuf[1]);
  16671   rc = p->pReal->pMethods->xSync(p->pReal, flags);
  16672   vfstrace_printf(pInfo, " -> %d\n", rc);
  16673   return rc;
  16674 }
  16675 
  16676 /*
  16677 ** Return the current file-size of an vfstrace-file.
  16678 */
  16679 static int vfstraceFileSize(sqlite3_file *pFile, sqlite_int64 *pSize){
  16680   vfstrace_file *p = (vfstrace_file *)pFile;
  16681   vfstrace_info *pInfo = p->pInfo;
  16682   int rc;
  16683   vfstraceOnOff(pInfo, VTR_FSIZE);
  16684   vfstrace_printf(pInfo, "%s.xFileSize(%s)", pInfo->zVfsName, p->zFName);
  16685   rc = p->pReal->pMethods->xFileSize(p->pReal, pSize);
  16686   vfstrace_print_errcode(pInfo, " -> %s,", rc);
  16687   vfstrace_printf(pInfo, " size=%lld\n", *pSize);
  16688   return rc;
  16689 }
  16690 
  16691 /*
  16692 ** Return the name of a lock.
  16693 */
  16694 static const char *lockName(int eLock){
  16695   const char *azLockNames[] = {
  16696      "NONE", "SHARED", "RESERVED", "PENDING", "EXCLUSIVE"
  16697   };
  16698   if( eLock<0 || eLock>=(int)(sizeof(azLockNames)/sizeof(azLockNames[0])) ){
  16699     return "???";
  16700   }else{
  16701     return azLockNames[eLock];
  16702   }
  16703 }
  16704 
  16705 /*
  16706 ** Lock an vfstrace-file.
  16707 */
  16708 static int vfstraceLock(sqlite3_file *pFile, int eLock){
  16709   vfstrace_file *p = (vfstrace_file *)pFile;
  16710   vfstrace_info *pInfo = p->pInfo;
  16711   int rc;
  16712   vfstraceOnOff(pInfo, VTR_LOCK);
  16713   vfstrace_printf(pInfo, "%s.xLock(%s,%s)", pInfo->zVfsName, p->zFName,
  16714                   lockName(eLock));
  16715   rc = p->pReal->pMethods->xLock(p->pReal, eLock);
  16716   vfstrace_print_errcode(pInfo, " -> %s\n", rc);
  16717   return rc;
  16718 }
  16719 
  16720 /*
  16721 ** Unlock an vfstrace-file.
  16722 */
  16723 static int vfstraceUnlock(sqlite3_file *pFile, int eLock){
  16724   vfstrace_file *p = (vfstrace_file *)pFile;
  16725   vfstrace_info *pInfo = p->pInfo;
  16726   int rc;
  16727   vfstraceOnOff(pInfo, VTR_UNLOCK);
  16728   vfstrace_printf(pInfo, "%s.xUnlock(%s,%s)", pInfo->zVfsName, p->zFName,
  16729                   lockName(eLock));
  16730   rc = p->pReal->pMethods->xUnlock(p->pReal, eLock);
  16731   vfstrace_print_errcode(pInfo, " -> %s\n", rc);
  16732   return rc;
  16733 }
  16734 
  16735 /*
  16736 ** Check if another file-handle holds a RESERVED lock on an vfstrace-file.
  16737 */
  16738 static int vfstraceCheckReservedLock(sqlite3_file *pFile, int *pResOut){
  16739   vfstrace_file *p = (vfstrace_file *)pFile;
  16740   vfstrace_info *pInfo = p->pInfo;
  16741   int rc;
  16742   vfstraceOnOff(pInfo, VTR_CRL);
  16743   vfstrace_printf(pInfo, "%s.xCheckReservedLock(%s,%d)", 
  16744                   pInfo->zVfsName, p->zFName);
  16745   rc = p->pReal->pMethods->xCheckReservedLock(p->pReal, pResOut);
  16746   vfstrace_print_errcode(pInfo, " -> %s", rc);
  16747   vfstrace_printf(pInfo, ", out=%d\n", *pResOut);
  16748   return rc;
  16749 }
  16750 
  16751 /*
  16752 ** File control method. For custom operations on an vfstrace-file.
  16753 */
  16754 static int vfstraceFileControl(sqlite3_file *pFile, int op, void *pArg){
  16755   vfstrace_file *p = (vfstrace_file *)pFile;
  16756   vfstrace_info *pInfo = p->pInfo;
  16757   int rc;
  16758   char zBuf[100];
  16759   char zBuf2[100];
  16760   char *zOp;
  16761   char *zRVal = 0;
  16762   vfstraceOnOff(pInfo, VTR_FCTRL);
  16763   switch( op ){
  16764     case SQLITE_FCNTL_LOCKSTATE:           zOp = "LOCKSTATE";           break;
  16765     case SQLITE_GET_LOCKPROXYFILE:         zOp = "GET_LOCKPROXYFILE";   break;
  16766     case SQLITE_SET_LOCKPROXYFILE:         zOp = "SET_LOCKPROXYFILE";   break;
  16767     case SQLITE_LAST_ERRNO:                zOp = "LAST_ERRNO";          break;
  16768     case SQLITE_FCNTL_SIZE_HINT: {
  16769       sqlite3_snprintf(sizeof(zBuf), zBuf, "SIZE_HINT,%lld",
  16770                        *(sqlite3_int64*)pArg);
  16771       zOp = zBuf;
  16772       break;
  16773     }
  16774     case SQLITE_FCNTL_CHUNK_SIZE: {
  16775       sqlite3_snprintf(sizeof(zBuf), zBuf, "CHUNK_SIZE,%d", *(int*)pArg);
  16776       zOp = zBuf;
  16777       break;
  16778     }
  16779     case SQLITE_FCNTL_FILE_POINTER:        zOp = "FILE_POINTER";        break;
  16780     case SQLITE_FCNTL_WIN32_AV_RETRY:      zOp = "WIN32_AV_RETRY";      break;
  16781     case SQLITE_FCNTL_PERSIST_WAL: {
  16782        sqlite3_snprintf(sizeof(zBuf), zBuf, "PERSIST_WAL,%d", *(int*)pArg);
  16783        zOp = zBuf;
  16784        break;
  16785     }
  16786     case SQLITE_FCNTL_OVERWRITE:           zOp = "OVERWRITE";           break;
  16787     case SQLITE_FCNTL_VFSNAME:             zOp = "VFSNAME";             break;
  16788     case SQLITE_FCNTL_POWERSAFE_OVERWRITE: zOp = "POWERSAFE_OVERWRITE"; break;
  16789     case SQLITE_FCNTL_PRAGMA: {
  16790       const char *const* a = (const char*const*)pArg;
  16791       if( a[1] && strcmp(a[1],"vfstrace")==0 && a[2] ){
  16792         const u8 *zArg = (const u8*)a[2];
  16793         if( zArg[0]>='0' && zArg[0]<='9' ){
  16794           pInfo->mTrace = (sqlite3_uint64)strtoll(a[2], 0, 0);
  16795         }else{
  16796           static const struct {
  16797             const char *z;
  16798             unsigned int m;
  16799           } aKw[] = {
  16800             { "all",                   0xffffffff   },
  16801             { "close",                 VTR_CLOSE    },
  16802             { "read",                  VTR_READ     },
  16803             { "write",                 VTR_WRITE    },
  16804             { "truncate",              VTR_TRUNC    },
  16805             { "sync",                  VTR_SYNC     },
  16806             { "filesize",              VTR_FSIZE    },
  16807             { "lock",                  VTR_LOCK     },
  16808             { "unlock",                VTR_UNLOCK   },
  16809             { "checkreservedlock",     VTR_CRL      },
  16810             { "filecontrol",           VTR_FCTRL    },
  16811             { "sectorsize",            VTR_SECSZ    },
  16812             { "devicecharacteristics", VTR_DEVCHAR  },
  16813             { "shmlock",               VTR_SHMLOCK  },
  16814             { "shmmap",                VTR_SHMMAP   },
  16815             { "shmummap",              VTR_SHMUNMAP },
  16816             { "shmbarrier",            VTR_SHMBAR   },
  16817             { "open",                  VTR_OPEN     },
  16818             { "delete",                VTR_DELETE   },
  16819             { "access",                VTR_ACCESS   },
  16820             { "fullpathname",          VTR_FULLPATH },
  16821             { "dlopen",                VTR_DLOPEN   },
  16822             { "dlerror",               VTR_DLERR    },
  16823             { "dlsym",                 VTR_DLSYM    },
  16824             { "dlclose",               VTR_DLCLOSE  },
  16825             { "randomness",            VTR_RAND     },
  16826             { "sleep",                 VTR_SLEEP    },
  16827             { "currenttime",           VTR_CURTIME  },
  16828             { "currenttimeint64",      VTR_CURTIME  },
  16829             { "getlasterror",          VTR_LASTERR  },
  16830             { "fetch",                 VTR_FETCH    },
  16831           };
  16832           int onOff = 1;
  16833           while( zArg[0] ){
  16834             int jj, n;
  16835             while( zArg[0]!=0 && zArg[0]!='-' && zArg[0]!='+'
  16836                    && !isalpha(zArg[0]) ) zArg++;
  16837             if( zArg[0]==0 ) break;
  16838             if( zArg[0]=='-' ){
  16839               onOff = 0;
  16840               zArg++;
  16841             }else if( zArg[0]=='+' ){
  16842               onOff = 1;
  16843               zArg++;
  16844             }
  16845             while( !isalpha(zArg[0]) ){
  16846               if( zArg[0]==0 ) break;
  16847               zArg++;
  16848             }
  16849             if( zArg[0]=='x' && isalpha(zArg[1]) ) zArg++;
  16850             for(n=0; isalpha(zArg[n]); n++){}
  16851             for(jj=0; jj<(int)(sizeof(aKw)/sizeof(aKw[0])); jj++){
  16852               if( sqlite3_strnicmp(aKw[jj].z,(const char*)zArg,n)==0 ){
  16853                 if( onOff ){
  16854                   pInfo->mTrace |= aKw[jj].m;
  16855                 }else{
  16856                   pInfo->mTrace &= ~aKw[jj].m;
  16857                 }
  16858                 break;
  16859               }
  16860             }
  16861             zArg += n;
  16862           }
  16863         }
  16864       }
  16865       sqlite3_snprintf(sizeof(zBuf), zBuf, "PRAGMA,[%s,%s]",a[1],a[2]);
  16866       zOp = zBuf;
  16867       break;
  16868     }
  16869     case SQLITE_FCNTL_BUSYHANDLER:         zOp = "BUSYHANDLER";         break;
  16870     case SQLITE_FCNTL_TEMPFILENAME:        zOp = "TEMPFILENAME";        break;
  16871     case SQLITE_FCNTL_MMAP_SIZE: {
  16872       sqlite3_int64 iMMap = *(sqlite3_int64*)pArg;
  16873       sqlite3_snprintf(sizeof(zBuf), zBuf, "MMAP_SIZE,%lld",iMMap);
  16874       zOp = zBuf;
  16875       break;
  16876     }
  16877     case SQLITE_FCNTL_TRACE:               zOp = "TRACE";               break;
  16878     case SQLITE_FCNTL_HAS_MOVED:           zOp = "HAS_MOVED";           break;
  16879     case SQLITE_FCNTL_SYNC:                zOp = "SYNC";                break;
  16880     case SQLITE_FCNTL_COMMIT_PHASETWO:     zOp = "COMMIT_PHASETWO";     break;
  16881     case SQLITE_FCNTL_WIN32_SET_HANDLE:    zOp = "WIN32_SET_HANDLE";    break;
  16882     case SQLITE_FCNTL_WAL_BLOCK:           zOp = "WAL_BLOCK";           break;
  16883     case SQLITE_FCNTL_ZIPVFS:              zOp = "ZIPVFS";              break; 
  16884     case SQLITE_FCNTL_RBU:                 zOp = "RBU";                 break;
  16885     case SQLITE_FCNTL_VFS_POINTER:         zOp = "VFS_POINTER";         break;
  16886     case SQLITE_FCNTL_JOURNAL_POINTER:     zOp = "JOURNAL_POINTER";     break;
  16887     case SQLITE_FCNTL_WIN32_GET_HANDLE:    zOp = "WIN32_GET_HANDLE";    break;
  16888     case SQLITE_FCNTL_PDB:                 zOp = "PDB";                 break;
  16889     case SQLITE_FCNTL_BEGIN_ATOMIC_WRITE:  zOp = "BEGIN_ATOMIC_WRITE";  break;
  16890     case SQLITE_FCNTL_COMMIT_ATOMIC_WRITE: zOp = "COMMIT_ATOMIC_WRITE"; break;
  16891     case SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE: {
  16892        zOp = "ROLLBACK_ATOMIC_WRITE";
  16893        break;
  16894     }
  16895     case SQLITE_FCNTL_LOCK_TIMEOUT: {
  16896        sqlite3_snprintf(sizeof(zBuf), zBuf, "LOCK_TIMEOUT,%d", *(int*)pArg);
  16897        zOp = zBuf;
  16898        break;
  16899     }
  16900     case SQLITE_FCNTL_DATA_VERSION:        zOp = "DATA_VERSION";        break;
  16901     case SQLITE_FCNTL_SIZE_LIMIT:          zOp = "SIZE_LIMIT";          break;
  16902     case SQLITE_FCNTL_CKPT_DONE:           zOp = "CKPT_DONE";           break;
  16903     case SQLITE_FCNTL_RESERVE_BYTES:       zOp = "RESERVED_BYTES";      break;
  16904     case SQLITE_FCNTL_CKPT_START:          zOp = "CKPT_START";          break;
  16905     case SQLITE_FCNTL_EXTERNAL_READER:     zOp = "EXTERNAL_READER";     break;
  16906     case SQLITE_FCNTL_CKSM_FILE:           zOp = "CKSM_FILE";           break;
  16907     case SQLITE_FCNTL_RESET_CACHE:         zOp = "RESET_CACHE";         break;
  16908     case 0xca093fa0:                       zOp = "DB_UNCHANGED";        break;
  16909     default: {
  16910       sqlite3_snprintf(sizeof zBuf, zBuf, "%d", op);
  16911       zOp = zBuf;
  16912       break;
  16913     }
  16914   }
  16915   vfstrace_printf(pInfo, "%s.xFileControl(%s,%s)",
  16916                   pInfo->zVfsName, p->zFName, zOp);
  16917   rc = p->pReal->pMethods->xFileControl(p->pReal, op, pArg);
  16918   if( rc==SQLITE_OK ){
  16919     switch( op ){
  16920       case SQLITE_FCNTL_VFSNAME: {
  16921         *(char**)pArg = sqlite3_mprintf("vfstrace.%s/%z",
  16922                                     pInfo->zVfsName, *(char**)pArg);
  16923         zRVal = *(char**)pArg;
  16924         break;
  16925       }
  16926       case SQLITE_FCNTL_MMAP_SIZE: {
  16927         sqlite3_snprintf(sizeof(zBuf2), zBuf2, "%lld", *(sqlite3_int64*)pArg);
  16928         zRVal = zBuf2;
  16929         break;
  16930       }
  16931       case SQLITE_FCNTL_HAS_MOVED:
  16932       case SQLITE_FCNTL_PERSIST_WAL: {
  16933         sqlite3_snprintf(sizeof(zBuf2), zBuf2, "%d", *(int*)pArg);
  16934         zRVal = zBuf2;
  16935         break;
  16936       }
  16937       case SQLITE_FCNTL_PRAGMA:
  16938       case SQLITE_FCNTL_TEMPFILENAME: {
  16939         zRVal = *(char**)pArg;
  16940         break;
  16941       }
  16942     }
  16943   }
  16944   if( zRVal ){
  16945     vfstrace_print_errcode(pInfo, " -> %s", rc);
  16946     vfstrace_printf(pInfo, ", %s\n", zRVal);
  16947   }else{
  16948     vfstrace_print_errcode(pInfo, " -> %s\n", rc);
  16949   }
  16950   return rc;
  16951 }
  16952 
  16953 /*
  16954 ** Return the sector-size in bytes for an vfstrace-file.
  16955 */
  16956 static int vfstraceSectorSize(sqlite3_file *pFile){
  16957   vfstrace_file *p = (vfstrace_file *)pFile;
  16958   vfstrace_info *pInfo = p->pInfo;
  16959   int rc;
  16960   vfstraceOnOff(pInfo, VTR_SECSZ);
  16961   vfstrace_printf(pInfo, "%s.xSectorSize(%s)", pInfo->zVfsName, p->zFName);
  16962   rc = p->pReal->pMethods->xSectorSize(p->pReal);
  16963   vfstrace_printf(pInfo, " -> %d\n", rc);
  16964   return rc;
  16965 }
  16966 
  16967 /*
  16968 ** Return the device characteristic flags supported by an vfstrace-file.
  16969 */
  16970 static int vfstraceDeviceCharacteristics(sqlite3_file *pFile){
  16971   vfstrace_file *p = (vfstrace_file *)pFile;
  16972   vfstrace_info *pInfo = p->pInfo;
  16973   int rc;
  16974   vfstraceOnOff(pInfo, VTR_DEVCHAR);
  16975   vfstrace_printf(pInfo, "%s.xDeviceCharacteristics(%s)",
  16976                   pInfo->zVfsName, p->zFName);
  16977   rc = p->pReal->pMethods->xDeviceCharacteristics(p->pReal);
  16978   vfstrace_printf(pInfo, " -> 0x%08x\n", rc);
  16979   return rc;
  16980 }
  16981 
  16982 /*
  16983 ** Shared-memory operations.
  16984 */
  16985 static int vfstraceShmLock(sqlite3_file *pFile, int ofst, int n, int flags){
  16986   static const char *azLockName[] = {
  16987      "WRITE",
  16988      "CKPT",
  16989      "RECOVER",
  16990      "READ0",
  16991      "READ1",
  16992      "READ2",
  16993      "READ3",
  16994      "READ4",
  16995   };
  16996   vfstrace_file *p = (vfstrace_file *)pFile;
  16997   vfstrace_info *pInfo = p->pInfo;
  16998   int rc;
  16999   char zLck[100];
  17000   int i = 0;
  17001   vfstraceOnOff(pInfo, VTR_SHMLOCK);
  17002   memcpy(zLck, "|0", 3);
  17003   if( flags & SQLITE_SHM_UNLOCK )    strappend(zLck, &i, "|UNLOCK");
  17004   if( flags & SQLITE_SHM_LOCK )      strappend(zLck, &i, "|LOCK");
  17005   if( flags & SQLITE_SHM_SHARED )    strappend(zLck, &i, "|SHARED");
  17006   if( flags & SQLITE_SHM_EXCLUSIVE ) strappend(zLck, &i, "|EXCLUSIVE");
  17007   if( flags & ~(0xf) ){
  17008      sqlite3_snprintf(sizeof(zLck)-i, &zLck[i], "|0x%x", flags);
  17009   }
  17010   if( ofst>=0 && ofst<(int)(sizeof(azLockName)/sizeof(azLockName[0])) ){
  17011     vfstrace_printf(pInfo, "%s.xShmLock(%s,ofst=%d(%s),n=%d,%s)",
  17012                   pInfo->zVfsName, p->zFName, ofst, azLockName[ofst],
  17013                   n, &zLck[1]);
  17014   }else{
  17015     vfstrace_printf(pInfo, "%s.xShmLock(%s,ofst=5d,n=%d,%s)",
  17016                   pInfo->zVfsName, p->zFName, ofst,
  17017                   n, &zLck[1]);
  17018   }
  17019   rc = p->pReal->pMethods->xShmLock(p->pReal, ofst, n, flags);
  17020   vfstrace_print_errcode(pInfo, " -> %s\n", rc);
  17021   return rc;
  17022 }
  17023 static int vfstraceShmMap(
  17024   sqlite3_file *pFile, 
  17025   int iRegion, 
  17026   int szRegion, 
  17027   int isWrite, 
  17028   void volatile **pp
  17029 ){
  17030   vfstrace_file *p = (vfstrace_file *)pFile;
  17031   vfstrace_info *pInfo = p->pInfo;
  17032   int rc;
  17033   vfstraceOnOff(pInfo, VTR_SHMMAP);
  17034   vfstrace_printf(pInfo, "%s.xShmMap(%s,iRegion=%d,szRegion=%d,isWrite=%d,*)",
  17035                   pInfo->zVfsName, p->zFName, iRegion, szRegion, isWrite);
  17036   rc = p->pReal->pMethods->xShmMap(p->pReal, iRegion, szRegion, isWrite, pp);
  17037   vfstrace_print_errcode(pInfo, " -> %s\n", rc);
  17038   return rc;
  17039 }
  17040 static void vfstraceShmBarrier(sqlite3_file *pFile){
  17041   vfstrace_file *p = (vfstrace_file *)pFile;
  17042   vfstrace_info *pInfo = p->pInfo;
  17043   vfstraceOnOff(pInfo, VTR_SHMBAR);
  17044   vfstrace_printf(pInfo, "%s.xShmBarrier(%s)\n", pInfo->zVfsName, p->zFName);
  17045   p->pReal->pMethods->xShmBarrier(p->pReal);
  17046 }
  17047 static int vfstraceShmUnmap(sqlite3_file *pFile, int delFlag){
  17048   vfstrace_file *p = (vfstrace_file *)pFile;
  17049   vfstrace_info *pInfo = p->pInfo;
  17050   int rc;
  17051   vfstraceOnOff(pInfo, VTR_SHMUNMAP);
  17052   vfstrace_printf(pInfo, "%s.xShmUnmap(%s,delFlag=%d)",
  17053                   pInfo->zVfsName, p->zFName, delFlag);
  17054   rc = p->pReal->pMethods->xShmUnmap(p->pReal, delFlag);
  17055   vfstrace_print_errcode(pInfo, " -> %s\n", rc);
  17056   return rc;
  17057 }
  17058 static int vfstraceFetch(sqlite3_file *pFile, i64 iOff, int nAmt, void **pptr){
  17059   vfstrace_file *p = (vfstrace_file *)pFile;
  17060   vfstrace_info *pInfo = p->pInfo;
  17061   int rc;
  17062   vfstraceOnOff(pInfo, VTR_FETCH);
  17063   vfstrace_printf(pInfo, "%s.xFetch(%s,iOff=%lld,nAmt=%d,p=%p)",
  17064                   pInfo->zVfsName, p->zFName, iOff, nAmt, *pptr);
  17065   rc = p->pReal->pMethods->xFetch(p->pReal, iOff, nAmt, pptr);
  17066   vfstrace_print_errcode(pInfo, " -> %s\n", rc);
  17067   return rc;
  17068 }
  17069 static int vfstraceUnfetch(sqlite3_file *pFile, i64 iOff, void *ptr){
  17070   vfstrace_file *p = (vfstrace_file *)pFile;
  17071   vfstrace_info *pInfo = p->pInfo;
  17072   int rc;
  17073   vfstraceOnOff(pInfo, VTR_FETCH);
  17074   vfstrace_printf(pInfo, "%s.xUnfetch(%s,iOff=%lld,p=%p)",
  17075                   pInfo->zVfsName, p->zFName, iOff, ptr);
  17076   rc = p->pReal->pMethods->xUnfetch(p->pReal, iOff, ptr);
  17077   vfstrace_print_errcode(pInfo, " -> %s\n", rc);
  17078   return rc;
  17079 }
  17080 
  17081 
  17082 /*
  17083 ** Open an vfstrace file handle.
  17084 */
  17085 static int vfstraceOpen(
  17086   sqlite3_vfs *pVfs,
  17087   const char *zName,
  17088   sqlite3_file *pFile,
  17089   int flags,
  17090   int *pOutFlags
  17091 ){
  17092   int rc;
  17093   vfstrace_file *p = (vfstrace_file *)pFile;
  17094   vfstrace_info *pInfo = (vfstrace_info*)pVfs->pAppData;
  17095   sqlite3_vfs *pRoot = pInfo->pRootVfs;
  17096   p->pInfo = pInfo;
  17097   p->zFName = zName ? fileTail(zName) : "<temp>";
  17098   p->pReal = (sqlite3_file *)&p[1];
  17099   rc = pRoot->xOpen(pRoot, zName, p->pReal, flags, pOutFlags);
  17100   vfstraceOnOff(pInfo, VTR_OPEN);
  17101   vfstrace_printf(pInfo, "%s.xOpen(%s,flags=0x%x)",
  17102                   pInfo->zVfsName, p->zFName, flags);
  17103   if( p->pReal->pMethods ){
  17104     sqlite3_io_methods *pNew = sqlite3_malloc( sizeof(*pNew) );
  17105     const sqlite3_io_methods *pSub = p->pReal->pMethods;
  17106     memset(pNew, 0, sizeof(*pNew));
  17107     pNew->iVersion = pSub->iVersion;
  17108     pNew->xClose = vfstraceClose;
  17109     pNew->xRead = vfstraceRead;
  17110     pNew->xWrite = vfstraceWrite;
  17111     pNew->xTruncate = vfstraceTruncate;
  17112     pNew->xSync = vfstraceSync;
  17113     pNew->xFileSize = vfstraceFileSize;
  17114     pNew->xLock = vfstraceLock;
  17115     pNew->xUnlock = vfstraceUnlock;
  17116     pNew->xCheckReservedLock = vfstraceCheckReservedLock;
  17117     pNew->xFileControl = vfstraceFileControl;
  17118     pNew->xSectorSize = vfstraceSectorSize;
  17119     pNew->xDeviceCharacteristics = vfstraceDeviceCharacteristics;
  17120     if( pNew->iVersion>=2 ){
  17121       pNew->xShmMap = pSub->xShmMap ? vfstraceShmMap : 0;
  17122       pNew->xShmLock = pSub->xShmLock ? vfstraceShmLock : 0;
  17123       pNew->xShmBarrier = pSub->xShmBarrier ? vfstraceShmBarrier : 0;
  17124       pNew->xShmUnmap = pSub->xShmUnmap ? vfstraceShmUnmap : 0;
  17125     }
  17126     if( pNew->iVersion>=3 ){
  17127       pNew->xFetch = pSub->xFetch ? vfstraceFetch : 0;
  17128       pNew->xUnfetch = pSub->xUnfetch ? vfstraceUnfetch : 0;
  17129     }
  17130     pFile->pMethods = pNew;
  17131   }
  17132   vfstrace_print_errcode(pInfo, " -> %s", rc);
  17133   if( pOutFlags ){
  17134     vfstrace_printf(pInfo, ", outFlags=0x%x\n", *pOutFlags);
  17135   }else{
  17136     vfstrace_printf(pInfo, "\n");
  17137   }
  17138   return rc;
  17139 }
  17140 
  17141 /*
  17142 ** Delete the file located at zPath. If the dirSync argument is true,
  17143 ** ensure the file-system modifications are synced to disk before
  17144 ** returning.
  17145 */
  17146 static int vfstraceDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){
  17147   vfstrace_info *pInfo = (vfstrace_info*)pVfs->pAppData;
  17148   sqlite3_vfs *pRoot = pInfo->pRootVfs;
  17149   int rc;
  17150   vfstraceOnOff(pInfo, VTR_DELETE);
  17151   vfstrace_printf(pInfo, "%s.xDelete(\"%s\",%d)",
  17152                   pInfo->zVfsName, zPath, dirSync);
  17153   rc = pRoot->xDelete(pRoot, zPath, dirSync);
  17154   vfstrace_print_errcode(pInfo, " -> %s\n", rc);
  17155   return rc;
  17156 }
  17157 
  17158 /*
  17159 ** Test for access permissions. Return true if the requested permission
  17160 ** is available, or false otherwise.
  17161 */
  17162 static int vfstraceAccess(
  17163   sqlite3_vfs *pVfs, 
  17164   const char *zPath, 
  17165   int flags, 
  17166   int *pResOut
  17167 ){
  17168   vfstrace_info *pInfo = (vfstrace_info*)pVfs->pAppData;
  17169   sqlite3_vfs *pRoot = pInfo->pRootVfs;
  17170   int rc;
  17171   vfstraceOnOff(pInfo, VTR_ACCESS);
  17172   vfstrace_printf(pInfo, "%s.xAccess(\"%s\",%d)",
  17173                   pInfo->zVfsName, zPath, flags);
  17174   rc = pRoot->xAccess(pRoot, zPath, flags, pResOut);
  17175   vfstrace_print_errcode(pInfo, " -> %s", rc);
  17176   vfstrace_printf(pInfo, ", out=%d\n", *pResOut);
  17177   return rc;
  17178 }
  17179 
  17180 /*
  17181 ** Populate buffer zOut with the full canonical pathname corresponding
  17182 ** to the pathname in zPath. zOut is guaranteed to point to a buffer
  17183 ** of at least (DEVSYM_MAX_PATHNAME+1) bytes.
  17184 */
  17185 static int vfstraceFullPathname(
  17186   sqlite3_vfs *pVfs, 
  17187   const char *zPath, 
  17188   int nOut, 
  17189   char *zOut
  17190 ){
  17191   vfstrace_info *pInfo = (vfstrace_info*)pVfs->pAppData;
  17192   sqlite3_vfs *pRoot = pInfo->pRootVfs;
  17193   int rc;
  17194   vfstraceOnOff(pInfo, VTR_FULLPATH);
  17195   vfstrace_printf(pInfo, "%s.xFullPathname(\"%s\")",
  17196                   pInfo->zVfsName, zPath);
  17197   rc = pRoot->xFullPathname(pRoot, zPath, nOut, zOut);
  17198   vfstrace_print_errcode(pInfo, " -> %s", rc);
  17199   vfstrace_printf(pInfo, ", out=\"%.*s\"\n", nOut, zOut);
  17200   return rc;
  17201 }
  17202 
  17203 /*
  17204 ** Open the dynamic library located at zPath and return a handle.
  17205 */
  17206 static void *vfstraceDlOpen(sqlite3_vfs *pVfs, const char *zPath){
  17207   vfstrace_info *pInfo = (vfstrace_info*)pVfs->pAppData;
  17208   sqlite3_vfs *pRoot = pInfo->pRootVfs;
  17209   vfstraceOnOff(pInfo, VTR_DLOPEN);
  17210   vfstrace_printf(pInfo, "%s.xDlOpen(\"%s\")\n", pInfo->zVfsName, zPath);
  17211   return pRoot->xDlOpen(pRoot, zPath);
  17212 }
  17213 
  17214 /*
  17215 ** Populate the buffer zErrMsg (size nByte bytes) with a human readable
  17216 ** utf-8 string describing the most recent error encountered associated 
  17217 ** with dynamic libraries.
  17218 */
  17219 static void vfstraceDlError(sqlite3_vfs *pVfs, int nByte, char *zErrMsg){
  17220   vfstrace_info *pInfo = (vfstrace_info*)pVfs->pAppData;
  17221   sqlite3_vfs *pRoot = pInfo->pRootVfs;
  17222   vfstraceOnOff(pInfo, VTR_DLERR);
  17223   vfstrace_printf(pInfo, "%s.xDlError(%d)", pInfo->zVfsName, nByte);
  17224   pRoot->xDlError(pRoot, nByte, zErrMsg);
  17225   vfstrace_printf(pInfo, " -> \"%s\"", zErrMsg);
  17226 }
  17227 
  17228 /*
  17229 ** Return a pointer to the symbol zSymbol in the dynamic library pHandle.
  17230 */
  17231 static void (*vfstraceDlSym(sqlite3_vfs *pVfs,void *p,const char *zSym))(void){
  17232   vfstrace_info *pInfo = (vfstrace_info*)pVfs->pAppData;
  17233   sqlite3_vfs *pRoot = pInfo->pRootVfs;
  17234   vfstrace_printf(pInfo, "%s.xDlSym(\"%s\")\n", pInfo->zVfsName, zSym);
  17235   return pRoot->xDlSym(pRoot, p, zSym);
  17236 }
  17237 
  17238 /*
  17239 ** Close the dynamic library handle pHandle.
  17240 */
  17241 static void vfstraceDlClose(sqlite3_vfs *pVfs, void *pHandle){
  17242   vfstrace_info *pInfo = (vfstrace_info*)pVfs->pAppData;
  17243   sqlite3_vfs *pRoot = pInfo->pRootVfs;
  17244   vfstraceOnOff(pInfo, VTR_DLCLOSE);
  17245   vfstrace_printf(pInfo, "%s.xDlClose()\n", pInfo->zVfsName);
  17246   pRoot->xDlClose(pRoot, pHandle);
  17247 }
  17248 
  17249 /*
  17250 ** Populate the buffer pointed to by zBufOut with nByte bytes of 
  17251 ** random data.
  17252 */
  17253 static int vfstraceRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){
  17254   vfstrace_info *pInfo = (vfstrace_info*)pVfs->pAppData;
  17255   sqlite3_vfs *pRoot = pInfo->pRootVfs;
  17256   vfstraceOnOff(pInfo, VTR_RAND);
  17257   vfstrace_printf(pInfo, "%s.xRandomness(%d)\n", pInfo->zVfsName, nByte);
  17258   return pRoot->xRandomness(pRoot, nByte, zBufOut);
  17259 }
  17260 
  17261 /*
  17262 ** Sleep for nMicro microseconds. Return the number of microseconds 
  17263 ** actually slept.
  17264 */
  17265 static int vfstraceSleep(sqlite3_vfs *pVfs, int nMicro){
  17266   vfstrace_info *pInfo = (vfstrace_info*)pVfs->pAppData;
  17267   sqlite3_vfs *pRoot = pInfo->pRootVfs;
  17268   vfstraceOnOff(pInfo, VTR_SLEEP);
  17269   vfstrace_printf(pInfo, "%s.xSleep(%d)\n", pInfo->zVfsName, nMicro);
  17270   return pRoot->xSleep(pRoot, nMicro);
  17271 }
  17272 
  17273 /*
  17274 ** Return the current time as a Julian Day number in *pTimeOut.
  17275 */
  17276 static int vfstraceCurrentTime(sqlite3_vfs *pVfs, double *pTimeOut){
  17277   vfstrace_info *pInfo = (vfstrace_info*)pVfs->pAppData;
  17278   sqlite3_vfs *pRoot = pInfo->pRootVfs;
  17279   int rc;
  17280   vfstraceOnOff(pInfo, VTR_CURTIME);
  17281   vfstrace_printf(pInfo, "%s.xCurrentTime()", pInfo->zVfsName);
  17282   rc = pRoot->xCurrentTime(pRoot, pTimeOut);
  17283   vfstrace_printf(pInfo, " -> %.17g\n", *pTimeOut);
  17284   return rc;
  17285 }
  17286 static int vfstraceCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *pTimeOut){
  17287   vfstrace_info *pInfo = (vfstrace_info*)pVfs->pAppData;
  17288   sqlite3_vfs *pRoot = pInfo->pRootVfs;
  17289   int rc;
  17290   vfstraceOnOff(pInfo, VTR_CURTIME);
  17291   vfstrace_printf(pInfo, "%s.xCurrentTimeInt64()", pInfo->zVfsName);
  17292   rc = pRoot->xCurrentTimeInt64(pRoot, pTimeOut);
  17293   vfstrace_printf(pInfo, " -> %lld\n", *pTimeOut);
  17294   return rc;
  17295 }
  17296 
  17297 /*
  17298 ** Return the most recent error code and message
  17299 */
  17300 static int vfstraceGetLastError(sqlite3_vfs *pVfs, int nErr, char *zErr){
  17301   vfstrace_info *pInfo = (vfstrace_info*)pVfs->pAppData;
  17302   sqlite3_vfs *pRoot = pInfo->pRootVfs;
  17303   int rc;
  17304   vfstraceOnOff(pInfo, VTR_LASTERR);
  17305   vfstrace_printf(pInfo, "%s.xGetLastError(%d,zBuf)", pInfo->zVfsName, nErr);
  17306   if( nErr ) zErr[0] = 0;
  17307   rc = pRoot->xGetLastError(pRoot, nErr, zErr);
  17308   vfstrace_printf(pInfo, " -> zBuf[] = \"%s\", rc = %d\n", nErr?zErr:"", rc);
  17309   return rc;
  17310 }
  17311 
  17312 /*
  17313 ** Override system calls.
  17314 */
  17315 static int vfstraceSetSystemCall(
  17316   sqlite3_vfs *pVfs,
  17317   const char *zName,
  17318   sqlite3_syscall_ptr pFunc
  17319 ){
  17320   vfstrace_info *pInfo = (vfstrace_info*)pVfs->pAppData;
  17321   sqlite3_vfs *pRoot = pInfo->pRootVfs;
  17322   return pRoot->xSetSystemCall(pRoot, zName, pFunc);
  17323 }
  17324 static sqlite3_syscall_ptr vfstraceGetSystemCall(
  17325   sqlite3_vfs *pVfs,
  17326   const char *zName
  17327 ){
  17328   vfstrace_info *pInfo = (vfstrace_info*)pVfs->pAppData;
  17329   sqlite3_vfs *pRoot = pInfo->pRootVfs;
  17330   return pRoot->xGetSystemCall(pRoot, zName);
  17331 }
  17332 static const char *vfstraceNextSystemCall(sqlite3_vfs *pVfs, const char *zName){
  17333   vfstrace_info *pInfo = (vfstrace_info*)pVfs->pAppData;
  17334   sqlite3_vfs *pRoot = pInfo->pRootVfs;
  17335   return pRoot->xNextSystemCall(pRoot, zName);
  17336 }
  17337 
  17338 
  17339 /*
  17340 ** Clients invoke this routine to construct a new trace-vfs shim.
  17341 **
  17342 ** Return SQLITE_OK on success.  
  17343 **
  17344 ** SQLITE_NOMEM is returned in the case of a memory allocation error.
  17345 ** SQLITE_NOTFOUND is returned if zOldVfsName does not exist.
  17346 */
  17347 int vfstrace_register(
  17348    const char *zTraceName,           /* Name of the newly constructed VFS */
  17349    const char *zOldVfsName,          /* Name of the underlying VFS */
  17350    int (*xOut)(const char*,void*),   /* Output routine.  ex: fputs */
  17351    void *pOutArg,                    /* 2nd argument to xOut.  ex: stderr */
  17352    int makeDefault                   /* True to make the new VFS the default */
  17353 ){
  17354   sqlite3_vfs *pNew;
  17355   sqlite3_vfs *pRoot;
  17356   vfstrace_info *pInfo;
  17357   size_t nName;
  17358   size_t nByte;
  17359 
  17360   pRoot = sqlite3_vfs_find(zOldVfsName);
  17361   if( pRoot==0 ) return SQLITE_NOTFOUND;
  17362   nName = strlen(zTraceName);
  17363   nByte = sizeof(*pNew) + sizeof(*pInfo) + nName + 1;
  17364   pNew = sqlite3_malloc64( nByte );
  17365   if( pNew==0 ) return SQLITE_NOMEM;
  17366   memset(pNew, 0, nByte);
  17367   pInfo = (vfstrace_info*)&pNew[1];
  17368   pNew->iVersion = pRoot->iVersion;
  17369   pNew->szOsFile = pRoot->szOsFile + sizeof(vfstrace_file);
  17370   pNew->mxPathname = pRoot->mxPathname;
  17371   pNew->zName = (char*)&pInfo[1];
  17372   memcpy((char*)&pInfo[1], zTraceName, nName+1);
  17373   pNew->pAppData = pInfo;
  17374   pNew->xOpen = vfstraceOpen;
  17375   pNew->xDelete = vfstraceDelete;
  17376   pNew->xAccess = vfstraceAccess;
  17377   pNew->xFullPathname = vfstraceFullPathname;
  17378   pNew->xDlOpen = pRoot->xDlOpen==0 ? 0 : vfstraceDlOpen;
  17379   pNew->xDlError = pRoot->xDlError==0 ? 0 : vfstraceDlError;
  17380   pNew->xDlSym = pRoot->xDlSym==0 ? 0 : vfstraceDlSym;
  17381   pNew->xDlClose = pRoot->xDlClose==0 ? 0 : vfstraceDlClose;
  17382   pNew->xRandomness = vfstraceRandomness;
  17383   pNew->xSleep = vfstraceSleep;
  17384   pNew->xCurrentTime = vfstraceCurrentTime;
  17385   pNew->xGetLastError = pRoot->xGetLastError==0 ? 0 : vfstraceGetLastError;
  17386   if( pNew->iVersion>=2 ){
  17387     pNew->xCurrentTimeInt64 = pRoot->xCurrentTimeInt64==0 ? 0 :
  17388                                    vfstraceCurrentTimeInt64;
  17389     if( pNew->iVersion>=3 ){
  17390       pNew->xSetSystemCall = pRoot->xSetSystemCall==0 ? 0 : 
  17391                                    vfstraceSetSystemCall;
  17392       pNew->xGetSystemCall = pRoot->xGetSystemCall==0 ? 0 : 
  17393                                    vfstraceGetSystemCall;
  17394       pNew->xNextSystemCall = pRoot->xNextSystemCall==0 ? 0 : 
  17395                                    vfstraceNextSystemCall;
  17396     }
  17397   }
  17398   pInfo->pRootVfs = pRoot;
  17399   pInfo->xOut = xOut;
  17400   pInfo->pOutArg = pOutArg;
  17401   pInfo->zVfsName = pNew->zName;
  17402   pInfo->pTraceVfs = pNew;
  17403   pInfo->mTrace = 0xffffffff;
  17404   pInfo->bOn = 1;
  17405   vfstrace_printf(pInfo, "%s.enabled_for(\"%s\")\n",
  17406        pInfo->zVfsName, pRoot->zName);
  17407   return sqlite3_vfs_register(pNew, makeDefault);
  17408 }
  17409 
  17410 /*
  17411 ** Look for the named VFS.  If it is a TRACEVFS, then unregister it
  17412 ** and delete it.
  17413 */
  17414 void vfstrace_unregister(const char *zTraceName){
  17415   sqlite3_vfs *pVfs = sqlite3_vfs_find(zTraceName);
  17416   if( pVfs==0 ) return;
  17417   if( pVfs->xOpen!=vfstraceOpen ) return;
  17418   sqlite3_vfs_unregister(pVfs);
  17419   sqlite3_free(pVfs);
  17420 }
  17421 
  17422 /************************* End ../ext/misc/vfstrace.c ********************/
  17423 
  17424 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
  17425 #define SQLITE_SHELL_HAVE_RECOVER 1
  17426 #else
  17427 #define SQLITE_SHELL_HAVE_RECOVER 0
  17428 #endif
  17429 #if SQLITE_SHELL_HAVE_RECOVER
  17430 /************************* Begin ../ext/recover/sqlite3recover.h ******************/
  17431 /*
  17432 ** 2022-08-27
  17433 **
  17434 ** The author disclaims copyright to this source code.  In place of
  17435 ** a legal notice, here is a blessing:
  17436 **
  17437 **    May you do good and not evil.
  17438 **    May you find forgiveness for yourself and forgive others.
  17439 **    May you share freely, never taking more than you give.
  17440 **
  17441 *************************************************************************
  17442 **
  17443 ** This file contains the public interface to the "recover" extension -
  17444 ** an SQLite extension designed to recover data from corrupted database
  17445 ** files.
  17446 */
  17447 
  17448 /*
  17449 ** OVERVIEW:
  17450 **
  17451 ** To use the API to recover data from a corrupted database, an
  17452 ** application:
  17453 **
  17454 **   1) Creates an sqlite3_recover handle by calling either
  17455 **      sqlite3_recover_init() or sqlite3_recover_init_sql().
  17456 **
  17457 **   2) Configures the new handle using one or more calls to
  17458 **      sqlite3_recover_config().
  17459 **
  17460 **   3) Executes the recovery by repeatedly calling sqlite3_recover_step() on
  17461 **      the handle until it returns something other than SQLITE_OK. If it
  17462 **      returns SQLITE_DONE, then the recovery operation completed without 
  17463 **      error. If it returns some other non-SQLITE_OK value, then an error 
  17464 **      has occurred.
  17465 **
  17466 **   4) Retrieves any error code and English language error message using the
  17467 **      sqlite3_recover_errcode() and sqlite3_recover_errmsg() APIs,
  17468 **      respectively.
  17469 **
  17470 **   5) Destroys the sqlite3_recover handle and frees all resources
  17471 **      using sqlite3_recover_finish().
  17472 **
  17473 ** The application may abandon the recovery operation at any point 
  17474 ** before it is finished by passing the sqlite3_recover handle to
  17475 ** sqlite3_recover_finish(). This is not an error, but the final state
  17476 ** of the output database, or the results of running the partial script
  17477 ** delivered to the SQL callback, are undefined.
  17478 */
  17479 
  17480 #ifndef _SQLITE_RECOVER_H
  17481 #define _SQLITE_RECOVER_H
  17482 
  17483 /* #include "sqlite3.h" */
  17484 
  17485 #ifdef __cplusplus
  17486 extern "C" {
  17487 #endif
  17488 
  17489 /*
  17490 ** An instance of the sqlite3_recover object represents a recovery
  17491 ** operation in progress.
  17492 **
  17493 ** Constructors:
  17494 **
  17495 **    sqlite3_recover_init()
  17496 **    sqlite3_recover_init_sql()
  17497 **
  17498 ** Destructor:
  17499 **
  17500 **    sqlite3_recover_finish()
  17501 **
  17502 ** Methods:
  17503 **
  17504 **    sqlite3_recover_config()
  17505 **    sqlite3_recover_errcode()
  17506 **    sqlite3_recover_errmsg()
  17507 **    sqlite3_recover_run()
  17508 **    sqlite3_recover_step()
  17509 */
  17510 typedef struct sqlite3_recover sqlite3_recover;
  17511 
  17512 /* 
  17513 ** These two APIs attempt to create and return a new sqlite3_recover object.
  17514 ** In both cases the first two arguments identify the (possibly
  17515 ** corrupt) database to recover data from. The first argument is an open
  17516 ** database handle and the second the name of a database attached to that
  17517 ** handle (i.e. "main", "temp" or the name of an attached database).
  17518 **
  17519 ** If sqlite3_recover_init() is used to create the new sqlite3_recover
  17520 ** handle, then data is recovered into a new database, identified by
  17521 ** string parameter zUri. zUri may be an absolute or relative file path,
  17522 ** or may be an SQLite URI. If the identified database file already exists,
  17523 ** it is overwritten.
  17524 **
  17525 ** If sqlite3_recover_init_sql() is invoked, then any recovered data will
  17526 ** be returned to the user as a series of SQL statements. Executing these
  17527 ** SQL statements results in the same database as would have been created
  17528 ** had sqlite3_recover_init() been used. For each SQL statement in the
  17529 ** output, the callback function passed as the third argument (xSql) is 
  17530 ** invoked once. The first parameter is a passed a copy of the fourth argument
  17531 ** to this function (pCtx) as its first parameter, and a pointer to a
  17532 ** nul-terminated buffer containing the SQL statement formated as UTF-8 as 
  17533 ** the second. If the xSql callback returns any value other than SQLITE_OK,
  17534 ** then processing is immediately abandoned and the value returned used as
  17535 ** the recover handle error code (see below).
  17536 **
  17537 ** If an out-of-memory error occurs, NULL may be returned instead of
  17538 ** a valid handle. In all other cases, it is the responsibility of the
  17539 ** application to avoid resource leaks by ensuring that
  17540 ** sqlite3_recover_finish() is called on all allocated handles.
  17541 */
  17542 sqlite3_recover *sqlite3_recover_init(
  17543   sqlite3* db, 
  17544   const char *zDb, 
  17545   const char *zUri
  17546 );
  17547 sqlite3_recover *sqlite3_recover_init_sql(
  17548   sqlite3* db, 
  17549   const char *zDb, 
  17550   int (*xSql)(void*, const char*),
  17551   void *pCtx
  17552 );
  17553 
  17554 /*
  17555 ** Configure an sqlite3_recover object that has just been created using
  17556 ** sqlite3_recover_init() or sqlite3_recover_init_sql(). This function
  17557 ** may only be called before the first call to sqlite3_recover_step()
  17558 ** or sqlite3_recover_run() on the object.
  17559 **
  17560 ** The second argument passed to this function must be one of the
  17561 ** SQLITE_RECOVER_* symbols defined below. Valid values for the third argument
  17562 ** depend on the specific SQLITE_RECOVER_* symbol in use.
  17563 **
  17564 ** SQLITE_OK is returned if the configuration operation was successful,
  17565 ** or an SQLite error code otherwise.
  17566 */
  17567 int sqlite3_recover_config(sqlite3_recover*, int op, void *pArg);
  17568 
  17569 /*
  17570 ** SQLITE_RECOVER_LOST_AND_FOUND:
  17571 **   The pArg argument points to a string buffer containing the name
  17572 **   of a "lost-and-found" table in the output database, or NULL. If
  17573 **   the argument is non-NULL and the database contains seemingly
  17574 **   valid pages that cannot be associated with any table in the
  17575 **   recovered part of the schema, data is extracted from these
  17576 **   pages to add to the lost-and-found table.
  17577 **
  17578 ** SQLITE_RECOVER_FREELIST_CORRUPT:
  17579 **   The pArg value must actually be a pointer to a value of type
  17580 **   int containing value 0 or 1 cast as a (void*). If this option is set
  17581 **   (argument is 1) and a lost-and-found table has been configured using
  17582 **   SQLITE_RECOVER_LOST_AND_FOUND, then is assumed that the freelist is 
  17583 **   corrupt and an attempt is made to recover records from pages that
  17584 **   appear to be linked into the freelist. Otherwise, pages on the freelist
  17585 **   are ignored. Setting this option can recover more data from the
  17586 **   database, but often ends up "recovering" deleted records. The default 
  17587 **   value is 0 (clear).
  17588 **
  17589 ** SQLITE_RECOVER_ROWIDS:
  17590 **   The pArg value must actually be a pointer to a value of type
  17591 **   int containing value 0 or 1 cast as a (void*). If this option is set
  17592 **   (argument is 1), then an attempt is made to recover rowid values
  17593 **   that are not also INTEGER PRIMARY KEY values. If this option is
  17594 **   clear, then new rowids are assigned to all recovered rows. The
  17595 **   default value is 1 (set).
  17596 **
  17597 ** SQLITE_RECOVER_SLOWINDEXES:
  17598 **   The pArg value must actually be a pointer to a value of type
  17599 **   int containing value 0 or 1 cast as a (void*). If this option is clear
  17600 **   (argument is 0), then when creating an output database, the recover 
  17601 **   module creates and populates non-UNIQUE indexes right at the end of the
  17602 **   recovery operation - after all recoverable data has been inserted
  17603 **   into the new database. This is faster overall, but means that the
  17604 **   final call to sqlite3_recover_step() for a recovery operation may
  17605 **   be need to create a large number of indexes, which may be very slow.
  17606 **
  17607 **   Or, if this option is set (argument is 1), then non-UNIQUE indexes
  17608 **   are created in the output database before it is populated with 
  17609 **   recovered data. This is slower overall, but avoids the slow call
  17610 **   to sqlite3_recover_step() at the end of the recovery operation.
  17611 **
  17612 **   The default option value is 0.
  17613 */
  17614 #define SQLITE_RECOVER_LOST_AND_FOUND   1
  17615 #define SQLITE_RECOVER_FREELIST_CORRUPT 2
  17616 #define SQLITE_RECOVER_ROWIDS           3
  17617 #define SQLITE_RECOVER_SLOWINDEXES      4
  17618 
  17619 /*
  17620 ** Perform a unit of work towards the recovery operation. This function 
  17621 ** must normally be called multiple times to complete database recovery.
  17622 **
  17623 ** If no error occurs but the recovery operation is not completed, this
  17624 ** function returns SQLITE_OK. If recovery has been completed successfully
  17625 ** then SQLITE_DONE is returned. If an error has occurred, then an SQLite
  17626 ** error code (e.g. SQLITE_IOERR or SQLITE_NOMEM) is returned. It is not
  17627 ** considered an error if some or all of the data cannot be recovered
  17628 ** due to database corruption.
  17629 **
  17630 ** Once sqlite3_recover_step() has returned a value other than SQLITE_OK,
  17631 ** all further such calls on the same recover handle are no-ops that return
  17632 ** the same non-SQLITE_OK value.
  17633 */
  17634 int sqlite3_recover_step(sqlite3_recover*);
  17635 
  17636 /* 
  17637 ** Run the recovery operation to completion. Return SQLITE_OK if successful,
  17638 ** or an SQLite error code otherwise. Calling this function is the same
  17639 ** as executing:
  17640 **
  17641 **     while( SQLITE_OK==sqlite3_recover_step(p) );
  17642 **     return sqlite3_recover_errcode(p);
  17643 */
  17644 int sqlite3_recover_run(sqlite3_recover*);
  17645 
  17646 /*
  17647 ** If an error has been encountered during a prior call to
  17648 ** sqlite3_recover_step(), then this function attempts to return a 
  17649 ** pointer to a buffer containing an English language explanation of 
  17650 ** the error. If no error message is available, or if an out-of memory 
  17651 ** error occurs while attempting to allocate a buffer in which to format
  17652 ** the error message, NULL is returned.
  17653 **
  17654 ** The returned buffer remains valid until the sqlite3_recover handle is
  17655 ** destroyed using sqlite3_recover_finish().
  17656 */
  17657 const char *sqlite3_recover_errmsg(sqlite3_recover*);
  17658 
  17659 /*
  17660 ** If this function is called on an sqlite3_recover handle after
  17661 ** an error occurs, an SQLite error code is returned. Otherwise, SQLITE_OK.
  17662 */
  17663 int sqlite3_recover_errcode(sqlite3_recover*);
  17664 
  17665 /* 
  17666 ** Clean up a recovery object created by a call to sqlite3_recover_init().
  17667 ** The results of using a recovery object with any API after it has been
  17668 ** passed to this function are undefined.
  17669 **
  17670 ** This function returns the same value as sqlite3_recover_errcode().
  17671 */
  17672 int sqlite3_recover_finish(sqlite3_recover*);
  17673 
  17674 
  17675 #ifdef __cplusplus
  17676 }  /* end of the 'extern "C"' block */
  17677 #endif
  17678 
  17679 #endif /* ifndef _SQLITE_RECOVER_H */
  17680 
  17681 /************************* End ../ext/recover/sqlite3recover.h ********************/
  17682 # ifndef SQLITE_HAVE_SQLITE3R
  17683 /************************* Begin ../ext/recover/dbdata.c ******************/
  17684 /*
  17685 ** 2019-04-17
  17686 **
  17687 ** The author disclaims copyright to this source code.  In place of
  17688 ** a legal notice, here is a blessing:
  17689 **
  17690 **    May you do good and not evil.
  17691 **    May you find forgiveness for yourself and forgive others.
  17692 **    May you share freely, never taking more than you give.
  17693 **
  17694 ******************************************************************************
  17695 **
  17696 ** This file contains an implementation of two eponymous virtual tables,
  17697 ** "sqlite_dbdata" and "sqlite_dbptr". Both modules require that the
  17698 ** "sqlite_dbpage" eponymous virtual table be available.
  17699 **
  17700 ** SQLITE_DBDATA:
  17701 **   sqlite_dbdata is used to extract data directly from a database b-tree
  17702 **   page and its associated overflow pages, bypassing the b-tree layer.
  17703 **   The table schema is equivalent to:
  17704 **
  17705 **     CREATE TABLE sqlite_dbdata(
  17706 **       pgno INTEGER,
  17707 **       cell INTEGER,
  17708 **       field INTEGER,
  17709 **       value ANY,
  17710 **       schema TEXT HIDDEN
  17711 **     );
  17712 **
  17713 **   IMPORTANT: THE VIRTUAL TABLE SCHEMA ABOVE IS SUBJECT TO CHANGE. IN THE
  17714 **   FUTURE NEW NON-HIDDEN COLUMNS MAY BE ADDED BETWEEN "value" AND
  17715 **   "schema".
  17716 **
  17717 **   Each page of the database is inspected. If it cannot be interpreted as
  17718 **   a b-tree page, or if it is a b-tree page containing 0 entries, the
  17719 **   sqlite_dbdata table contains no rows for that page.  Otherwise, the
  17720 **   table contains one row for each field in the record associated with
  17721 **   each cell on the page. For intkey b-trees, the key value is stored in
  17722 **   field -1.
  17723 **
  17724 **   For example, for the database:
  17725 **
  17726 **     CREATE TABLE t1(a, b);     -- root page is page 2
  17727 **     INSERT INTO t1(rowid, a, b) VALUES(5, 'v', 'five');
  17728 **     INSERT INTO t1(rowid, a, b) VALUES(10, 'x', 'ten');
  17729 **
  17730 **   the sqlite_dbdata table contains, as well as from entries related to 
  17731 **   page 1, content equivalent to:
  17732 **
  17733 **     INSERT INTO sqlite_dbdata(pgno, cell, field, value) VALUES
  17734 **         (2, 0, -1, 5     ),
  17735 **         (2, 0,  0, 'v'   ),
  17736 **         (2, 0,  1, 'five'),
  17737 **         (2, 1, -1, 10    ),
  17738 **         (2, 1,  0, 'x'   ),
  17739 **         (2, 1,  1, 'ten' );
  17740 **
  17741 **   If database corruption is encountered, this module does not report an
  17742 **   error. Instead, it attempts to extract as much data as possible and
  17743 **   ignores the corruption.
  17744 **
  17745 ** SQLITE_DBPTR:
  17746 **   The sqlite_dbptr table has the following schema:
  17747 **
  17748 **     CREATE TABLE sqlite_dbptr(
  17749 **       pgno INTEGER,
  17750 **       child INTEGER,
  17751 **       schema TEXT HIDDEN
  17752 **     );
  17753 **
  17754 **   It contains one entry for each b-tree pointer between a parent and
  17755 **   child page in the database.
  17756 */
  17757 
  17758 #if !defined(SQLITEINT_H) 
  17759 /* #include "sqlite3.h" */
  17760 
  17761 /* typedef unsigned char u8; */
  17762 /* typedef unsigned int u32; */
  17763 
  17764 #endif
  17765 #include <string.h>
  17766 #include <assert.h>
  17767 
  17768 #ifndef SQLITE_OMIT_VIRTUALTABLE
  17769 
  17770 #define DBDATA_PADDING_BYTES 100 
  17771 
  17772 typedef struct DbdataTable DbdataTable;
  17773 typedef struct DbdataCursor DbdataCursor;
  17774 typedef struct DbdataBuffer DbdataBuffer;
  17775 
  17776 /*
  17777 ** Buffer type.
  17778 */
  17779 struct DbdataBuffer {
  17780   u8 *aBuf;
  17781   sqlite3_int64 nBuf;
  17782 };
  17783 
  17784 /* Cursor object */
  17785 struct DbdataCursor {
  17786   sqlite3_vtab_cursor base;       /* Base class.  Must be first */
  17787   sqlite3_stmt *pStmt;            /* For fetching database pages */
  17788 
  17789   int iPgno;                      /* Current page number */
  17790   u8 *aPage;                      /* Buffer containing page */
  17791   int nPage;                      /* Size of aPage[] in bytes */
  17792   int nCell;                      /* Number of cells on aPage[] */
  17793   int iCell;                      /* Current cell number */
  17794   int bOnePage;                   /* True to stop after one page */
  17795   int szDb;
  17796   sqlite3_int64 iRowid;
  17797 
  17798   /* Only for the sqlite_dbdata table */
  17799   DbdataBuffer rec;
  17800   sqlite3_int64 nRec;             /* Size of pRec[] in bytes */
  17801   sqlite3_int64 nHdr;             /* Size of header in bytes */
  17802   int iField;                     /* Current field number */
  17803   u8 *pHdrPtr;
  17804   u8 *pPtr;
  17805   u32 enc;                        /* Text encoding */
  17806   
  17807   sqlite3_int64 iIntkey;          /* Integer key value */
  17808 };
  17809 
  17810 /* Table object */
  17811 struct DbdataTable {
  17812   sqlite3_vtab base;              /* Base class.  Must be first */
  17813   sqlite3 *db;                    /* The database connection */
  17814   sqlite3_stmt *pStmt;            /* For fetching database pages */
  17815   int bPtr;                       /* True for sqlite3_dbptr table */
  17816 };
  17817 
  17818 /* Column and schema definitions for sqlite_dbdata */
  17819 #define DBDATA_COLUMN_PGNO        0
  17820 #define DBDATA_COLUMN_CELL        1
  17821 #define DBDATA_COLUMN_FIELD       2
  17822 #define DBDATA_COLUMN_VALUE       3
  17823 #define DBDATA_COLUMN_SCHEMA      4
  17824 #define DBDATA_SCHEMA             \
  17825       "CREATE TABLE x("           \
  17826       "  pgno INTEGER,"           \
  17827       "  cell INTEGER,"           \
  17828       "  field INTEGER,"          \
  17829       "  value ANY,"              \
  17830       "  schema TEXT HIDDEN"      \
  17831       ")"
  17832 
  17833 /* Column and schema definitions for sqlite_dbptr */
  17834 #define DBPTR_COLUMN_PGNO         0
  17835 #define DBPTR_COLUMN_CHILD        1
  17836 #define DBPTR_COLUMN_SCHEMA       2
  17837 #define DBPTR_SCHEMA              \
  17838       "CREATE TABLE x("           \
  17839       "  pgno INTEGER,"           \
  17840       "  child INTEGER,"          \
  17841       "  schema TEXT HIDDEN"      \
  17842       ")"
  17843 
  17844 /*
  17845 ** Ensure the buffer passed as the first argument is at least nMin bytes
  17846 ** in size. If an error occurs while attempting to resize the buffer,
  17847 ** SQLITE_NOMEM is returned. Otherwise, SQLITE_OK.
  17848 */
  17849 static int dbdataBufferSize(DbdataBuffer *pBuf, sqlite3_int64 nMin){
  17850   if( nMin>pBuf->nBuf ){
  17851     sqlite3_int64 nNew = nMin+16384;
  17852     u8 *aNew = (u8*)sqlite3_realloc64(pBuf->aBuf, nNew);
  17853 
  17854     if( aNew==0 ) return SQLITE_NOMEM;
  17855     pBuf->aBuf = aNew;
  17856     pBuf->nBuf = nNew;
  17857   }
  17858   return SQLITE_OK;
  17859 }
  17860 
  17861 /*
  17862 ** Release the allocation managed by buffer pBuf.
  17863 */
  17864 static void dbdataBufferFree(DbdataBuffer *pBuf){
  17865   sqlite3_free(pBuf->aBuf);
  17866   memset(pBuf, 0, sizeof(*pBuf));
  17867 }
  17868 
  17869 /*
  17870 ** Connect to an sqlite_dbdata (pAux==0) or sqlite_dbptr (pAux!=0) virtual 
  17871 ** table.
  17872 */
  17873 static int dbdataConnect(
  17874   sqlite3 *db,
  17875   void *pAux,
  17876   int argc, const char *const*argv,
  17877   sqlite3_vtab **ppVtab,
  17878   char **pzErr
  17879 ){
  17880   DbdataTable *pTab = 0;
  17881   int rc = sqlite3_declare_vtab(db, pAux ? DBPTR_SCHEMA : DBDATA_SCHEMA);
  17882 
  17883   (void)argc;
  17884   (void)argv;
  17885   (void)pzErr;
  17886   sqlite3_vtab_config(db, SQLITE_VTAB_USES_ALL_SCHEMAS);
  17887   if( rc==SQLITE_OK ){
  17888     pTab = (DbdataTable*)sqlite3_malloc64(sizeof(DbdataTable));
  17889     if( pTab==0 ){
  17890       rc = SQLITE_NOMEM;
  17891     }else{
  17892       memset(pTab, 0, sizeof(DbdataTable));
  17893       pTab->db = db;
  17894       pTab->bPtr = (pAux!=0);
  17895     }
  17896   }
  17897 
  17898   *ppVtab = (sqlite3_vtab*)pTab;
  17899   return rc;
  17900 }
  17901 
  17902 /*
  17903 ** Disconnect from or destroy a sqlite_dbdata or sqlite_dbptr virtual table.
  17904 */
  17905 static int dbdataDisconnect(sqlite3_vtab *pVtab){
  17906   DbdataTable *pTab = (DbdataTable*)pVtab;
  17907   if( pTab ){
  17908     sqlite3_finalize(pTab->pStmt);
  17909     sqlite3_free(pVtab);
  17910   }
  17911   return SQLITE_OK;
  17912 }
  17913 
  17914 /*
  17915 ** This function interprets two types of constraints:
  17916 **
  17917 **       schema=?
  17918 **       pgno=?
  17919 **
  17920 ** If neither are present, idxNum is set to 0. If schema=? is present,
  17921 ** the 0x01 bit in idxNum is set. If pgno=? is present, the 0x02 bit
  17922 ** in idxNum is set.
  17923 **
  17924 ** If both parameters are present, schema is in position 0 and pgno in
  17925 ** position 1.
  17926 */
  17927 static int dbdataBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdx){
  17928   DbdataTable *pTab = (DbdataTable*)tab;
  17929   int i;
  17930   int iSchema = -1;
  17931   int iPgno = -1;
  17932   int colSchema = (pTab->bPtr ? DBPTR_COLUMN_SCHEMA : DBDATA_COLUMN_SCHEMA);
  17933 
  17934   for(i=0; i<pIdx->nConstraint; i++){
  17935     struct sqlite3_index_constraint *p = &pIdx->aConstraint[i];
  17936     if( p->op==SQLITE_INDEX_CONSTRAINT_EQ ){
  17937       if( p->iColumn==colSchema ){
  17938         if( p->usable==0 ) return SQLITE_CONSTRAINT;
  17939         iSchema = i;
  17940       }
  17941       if( p->iColumn==DBDATA_COLUMN_PGNO && p->usable ){
  17942         iPgno = i;
  17943       }
  17944     }
  17945   }
  17946 
  17947   if( iSchema>=0 ){
  17948     pIdx->aConstraintUsage[iSchema].argvIndex = 1;
  17949     pIdx->aConstraintUsage[iSchema].omit = 1;
  17950   }
  17951   if( iPgno>=0 ){
  17952     pIdx->aConstraintUsage[iPgno].argvIndex = 1 + (iSchema>=0);
  17953     pIdx->aConstraintUsage[iPgno].omit = 1;
  17954     pIdx->estimatedCost = 100;
  17955     pIdx->estimatedRows =  50;
  17956 
  17957     if( pTab->bPtr==0 && pIdx->nOrderBy && pIdx->aOrderBy[0].desc==0 ){
  17958       int iCol = pIdx->aOrderBy[0].iColumn;
  17959       if( pIdx->nOrderBy==1 ){
  17960         pIdx->orderByConsumed = (iCol==0 || iCol==1);
  17961       }else if( pIdx->nOrderBy==2 && pIdx->aOrderBy[1].desc==0 && iCol==0 ){
  17962         pIdx->orderByConsumed = (pIdx->aOrderBy[1].iColumn==1);
  17963       }
  17964     }
  17965 
  17966   }else{
  17967     pIdx->estimatedCost = 100000000;
  17968     pIdx->estimatedRows = 1000000000;
  17969   }
  17970   pIdx->idxNum = (iSchema>=0 ? 0x01 : 0x00) | (iPgno>=0 ? 0x02 : 0x00);
  17971   return SQLITE_OK;
  17972 }
  17973 
  17974 /*
  17975 ** Open a new sqlite_dbdata or sqlite_dbptr cursor.
  17976 */
  17977 static int dbdataOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
  17978   DbdataCursor *pCsr;
  17979 
  17980   pCsr = (DbdataCursor*)sqlite3_malloc64(sizeof(DbdataCursor));
  17981   if( pCsr==0 ){
  17982     return SQLITE_NOMEM;
  17983   }else{
  17984     memset(pCsr, 0, sizeof(DbdataCursor));
  17985     pCsr->base.pVtab = pVTab;
  17986   }
  17987 
  17988   *ppCursor = (sqlite3_vtab_cursor *)pCsr;
  17989   return SQLITE_OK;
  17990 }
  17991 
  17992 /*
  17993 ** Restore a cursor object to the state it was in when first allocated 
  17994 ** by dbdataOpen().
  17995 */
  17996 static void dbdataResetCursor(DbdataCursor *pCsr){
  17997   DbdataTable *pTab = (DbdataTable*)(pCsr->base.pVtab);
  17998   if( pTab->pStmt==0 ){
  17999     pTab->pStmt = pCsr->pStmt;
  18000   }else{
  18001     sqlite3_finalize(pCsr->pStmt);
  18002   }
  18003   pCsr->pStmt = 0;
  18004   pCsr->iPgno = 1;
  18005   pCsr->iCell = 0;
  18006   pCsr->iField = 0;
  18007   pCsr->bOnePage = 0;
  18008   sqlite3_free(pCsr->aPage);
  18009   dbdataBufferFree(&pCsr->rec);
  18010   pCsr->aPage = 0;
  18011   pCsr->nRec = 0;
  18012 }
  18013 
  18014 /*
  18015 ** Close an sqlite_dbdata or sqlite_dbptr cursor.
  18016 */
  18017 static int dbdataClose(sqlite3_vtab_cursor *pCursor){
  18018   DbdataCursor *pCsr = (DbdataCursor*)pCursor;
  18019   dbdataResetCursor(pCsr);
  18020   sqlite3_free(pCsr);
  18021   return SQLITE_OK;
  18022 }
  18023 
  18024 /* 
  18025 ** Utility methods to decode 16 and 32-bit big-endian unsigned integers. 
  18026 */
  18027 static u32 get_uint16(unsigned char *a){
  18028   return (a[0]<<8)|a[1];
  18029 }
  18030 static u32 get_uint32(unsigned char *a){
  18031   return ((u32)a[0]<<24)
  18032        | ((u32)a[1]<<16)
  18033        | ((u32)a[2]<<8)
  18034        | ((u32)a[3]);
  18035 }
  18036 
  18037 /*
  18038 ** Load page pgno from the database via the sqlite_dbpage virtual table.
  18039 ** If successful, set (*ppPage) to point to a buffer containing the page
  18040 ** data, (*pnPage) to the size of that buffer in bytes and return
  18041 ** SQLITE_OK. In this case it is the responsibility of the caller to
  18042 ** eventually free the buffer using sqlite3_free().
  18043 **
  18044 ** Or, if an error occurs, set both (*ppPage) and (*pnPage) to 0 and
  18045 ** return an SQLite error code.
  18046 */
  18047 static int dbdataLoadPage(
  18048   DbdataCursor *pCsr,             /* Cursor object */
  18049   u32 pgno,                       /* Page number of page to load */
  18050   u8 **ppPage,                    /* OUT: pointer to page buffer */
  18051   int *pnPage                     /* OUT: Size of (*ppPage) in bytes */
  18052 ){
  18053   int rc2;
  18054   int rc = SQLITE_OK;
  18055   sqlite3_stmt *pStmt = pCsr->pStmt;
  18056 
  18057   *ppPage = 0;
  18058   *pnPage = 0;
  18059   if( pgno>0 ){
  18060     sqlite3_bind_int64(pStmt, 2, pgno);
  18061     if( SQLITE_ROW==sqlite3_step(pStmt) ){
  18062       int nCopy = sqlite3_column_bytes(pStmt, 0);
  18063       if( nCopy>0 ){
  18064         u8 *pPage;
  18065         pPage = (u8*)sqlite3_malloc64(nCopy + DBDATA_PADDING_BYTES);
  18066         if( pPage==0 ){
  18067           rc = SQLITE_NOMEM;
  18068         }else{
  18069           const u8 *pCopy = sqlite3_column_blob(pStmt, 0);
  18070           memcpy(pPage, pCopy, nCopy);
  18071           memset(&pPage[nCopy], 0, DBDATA_PADDING_BYTES);
  18072         }
  18073         *ppPage = pPage;
  18074         *pnPage = nCopy;
  18075       }
  18076     }
  18077     rc2 = sqlite3_reset(pStmt);
  18078     if( rc==SQLITE_OK ) rc = rc2;
  18079   }
  18080 
  18081   return rc;
  18082 }
  18083 
  18084 /*
  18085 ** Read a varint.  Put the value in *pVal and return the number of bytes.
  18086 */
  18087 static int dbdataGetVarint(const u8 *z, sqlite3_int64 *pVal){
  18088   sqlite3_uint64 u = 0;
  18089   int i;
  18090   for(i=0; i<8; i++){
  18091     u = (u<<7) + (z[i]&0x7f);
  18092     if( (z[i]&0x80)==0 ){ *pVal = (sqlite3_int64)u; return i+1; }
  18093   }
  18094   u = (u<<8) + (z[i]&0xff);
  18095   *pVal = (sqlite3_int64)u;
  18096   return 9;
  18097 }
  18098 
  18099 /*
  18100 ** Like dbdataGetVarint(), but set the output to 0 if it is less than 0
  18101 ** or greater than 0xFFFFFFFF. This can be used for all varints in an
  18102 ** SQLite database except for key values in intkey tables.
  18103 */
  18104 static int dbdataGetVarintU32(const u8 *z, sqlite3_int64 *pVal){
  18105   sqlite3_int64 val;
  18106   int nRet = dbdataGetVarint(z, &val);
  18107   if( val<0 || val>0xFFFFFFFF ) val = 0;
  18108   *pVal = val;
  18109   return nRet;
  18110 }
  18111 
  18112 /*
  18113 ** Return the number of bytes of space used by an SQLite value of type
  18114 ** eType.
  18115 */
  18116 static int dbdataValueBytes(int eType){
  18117   switch( eType ){
  18118     case 0: case 8: case 9:
  18119     case 10: case 11:
  18120       return 0;
  18121     case 1:
  18122       return 1;
  18123     case 2:
  18124       return 2;
  18125     case 3:
  18126       return 3;
  18127     case 4:
  18128       return 4;
  18129     case 5:
  18130       return 6;
  18131     case 6:
  18132     case 7:
  18133       return 8;
  18134     default:
  18135       if( eType>0 ){
  18136         return ((eType-12) / 2);
  18137       }
  18138       return 0;
  18139   }
  18140 }
  18141 
  18142 /*
  18143 ** Load a value of type eType from buffer pData and use it to set the
  18144 ** result of context object pCtx.
  18145 */
  18146 static void dbdataValue(
  18147   sqlite3_context *pCtx, 
  18148   u32 enc,
  18149   int eType, 
  18150   u8 *pData,
  18151   sqlite3_int64 nData
  18152 ){
  18153   if( eType>=0 ){
  18154     if( dbdataValueBytes(eType)<=nData ){
  18155       switch( eType ){
  18156         case 0: 
  18157         case 10: 
  18158         case 11: 
  18159           sqlite3_result_null(pCtx);
  18160           break;
  18161         
  18162         case 8: 
  18163           sqlite3_result_int(pCtx, 0);
  18164           break;
  18165         case 9:
  18166           sqlite3_result_int(pCtx, 1);
  18167           break;
  18168     
  18169         case 1: case 2: case 3: case 4: case 5: case 6: case 7: {
  18170           sqlite3_uint64 v = (signed char)pData[0];
  18171           pData++;
  18172           switch( eType ){
  18173             case 7:
  18174             case 6:  v = (v<<16) + (pData[0]<<8) + pData[1];  pData += 2;
  18175             case 5:  v = (v<<16) + (pData[0]<<8) + pData[1];  pData += 2;
  18176             case 4:  v = (v<<8) + pData[0];  pData++;
  18177             case 3:  v = (v<<8) + pData[0];  pData++;
  18178             case 2:  v = (v<<8) + pData[0];  pData++;
  18179           }
  18180     
  18181           if( eType==7 ){
  18182             double r;
  18183             memcpy(&r, &v, sizeof(r));
  18184             sqlite3_result_double(pCtx, r);
  18185           }else{
  18186             sqlite3_result_int64(pCtx, (sqlite3_int64)v);
  18187           }
  18188           break;
  18189         }
  18190     
  18191         default: {
  18192           int n = ((eType-12) / 2);
  18193           if( eType % 2 ){
  18194             switch( enc ){
  18195   #ifndef SQLITE_OMIT_UTF16
  18196               case SQLITE_UTF16BE:
  18197                 sqlite3_result_text16be(pCtx, (void*)pData, n, SQLITE_TRANSIENT);
  18198                 break;
  18199               case SQLITE_UTF16LE:
  18200                 sqlite3_result_text16le(pCtx, (void*)pData, n, SQLITE_TRANSIENT);
  18201                 break;
  18202   #endif
  18203               default:
  18204                 sqlite3_result_text(pCtx, (char*)pData, n, SQLITE_TRANSIENT);
  18205                 break;
  18206             }
  18207           }else{
  18208             sqlite3_result_blob(pCtx, pData, n, SQLITE_TRANSIENT);
  18209           }
  18210         }
  18211       }
  18212     }else{
  18213       if( eType==7 ){
  18214         sqlite3_result_double(pCtx, 0.0);
  18215       }else if( eType<7 ){
  18216         sqlite3_result_int(pCtx, 0);
  18217       }else if( eType%2 ){
  18218         sqlite3_result_text(pCtx, "", 0, SQLITE_STATIC);
  18219       }else{
  18220         sqlite3_result_blob(pCtx, "", 0, SQLITE_STATIC);
  18221       }
  18222     }
  18223   }
  18224 }
  18225 
  18226 /* This macro is a copy of the MX_CELL() macro in the SQLite core. Given
  18227 ** a page-size, it returns the maximum number of cells that may be present
  18228 ** on the page.  */
  18229 #define DBDATA_MX_CELL(pgsz) ((pgsz-8)/6)
  18230 
  18231 /* Maximum number of fields that may appear in a single record. This is
  18232 ** the "hard-limit", according to comments in sqliteLimit.h. */
  18233 #define DBDATA_MX_FIELD 32676
  18234 
  18235 /*
  18236 ** Move an sqlite_dbdata or sqlite_dbptr cursor to the next entry.
  18237 */
  18238 static int dbdataNext(sqlite3_vtab_cursor *pCursor){
  18239   DbdataCursor *pCsr = (DbdataCursor*)pCursor;
  18240   DbdataTable *pTab = (DbdataTable*)pCursor->pVtab;
  18241 
  18242   pCsr->iRowid++;
  18243   while( 1 ){
  18244     int rc;
  18245     int iOff = (pCsr->iPgno==1 ? 100 : 0);
  18246     int bNextPage = 0;
  18247 
  18248     if( pCsr->aPage==0 ){
  18249       while( 1 ){
  18250         if( pCsr->bOnePage==0 && pCsr->iPgno>pCsr->szDb ) return SQLITE_OK;
  18251         rc = dbdataLoadPage(pCsr, pCsr->iPgno, &pCsr->aPage, &pCsr->nPage);
  18252         if( rc!=SQLITE_OK ) return rc;
  18253         if( pCsr->aPage && pCsr->nPage>=256 ) break;
  18254         sqlite3_free(pCsr->aPage);
  18255         pCsr->aPage = 0;
  18256         if( pCsr->bOnePage ) return SQLITE_OK;
  18257         pCsr->iPgno++;
  18258       }
  18259 
  18260       assert( iOff+3+2<=pCsr->nPage );
  18261       pCsr->iCell = pTab->bPtr ? -2 : 0;
  18262       pCsr->nCell = get_uint16(&pCsr->aPage[iOff+3]);
  18263       if( pCsr->nCell>DBDATA_MX_CELL(pCsr->nPage) ){
  18264         pCsr->nCell = DBDATA_MX_CELL(pCsr->nPage);
  18265       }
  18266     }
  18267 
  18268     if( pTab->bPtr ){
  18269       if( pCsr->aPage[iOff]!=0x02 && pCsr->aPage[iOff]!=0x05 ){
  18270         pCsr->iCell = pCsr->nCell;
  18271       }
  18272       pCsr->iCell++;
  18273       if( pCsr->iCell>=pCsr->nCell ){
  18274         sqlite3_free(pCsr->aPage);
  18275         pCsr->aPage = 0;
  18276         if( pCsr->bOnePage ) return SQLITE_OK;
  18277         pCsr->iPgno++;
  18278       }else{
  18279         return SQLITE_OK;
  18280       }
  18281     }else{
  18282       /* If there is no record loaded, load it now. */
  18283       assert( pCsr->rec.aBuf!=0 || pCsr->nRec==0 );
  18284       if( pCsr->nRec==0 ){
  18285         int bHasRowid = 0;
  18286         int nPointer = 0;
  18287         sqlite3_int64 nPayload = 0;
  18288         sqlite3_int64 nHdr = 0;
  18289         int iHdr;
  18290         int U, X;
  18291         int nLocal;
  18292   
  18293         switch( pCsr->aPage[iOff] ){
  18294           case 0x02:
  18295             nPointer = 4;
  18296             break;
  18297           case 0x0a:
  18298             break;
  18299           case 0x0d:
  18300             bHasRowid = 1;
  18301             break;
  18302           default:
  18303             /* This is not a b-tree page with records on it. Continue. */
  18304             pCsr->iCell = pCsr->nCell;
  18305             break;
  18306         }
  18307 
  18308         if( pCsr->iCell>=pCsr->nCell ){
  18309           bNextPage = 1;
  18310         }else{
  18311           int iCellPtr = iOff + 8 + nPointer + pCsr->iCell*2;
  18312   
  18313           if( iCellPtr>pCsr->nPage ){
  18314             bNextPage = 1;
  18315           }else{
  18316             iOff = get_uint16(&pCsr->aPage[iCellPtr]);
  18317           }
  18318     
  18319           /* For an interior node cell, skip past the child-page number */
  18320           iOff += nPointer;
  18321     
  18322           /* Load the "byte of payload including overflow" field */
  18323           if( bNextPage || iOff>pCsr->nPage || iOff<=iCellPtr ){
  18324             bNextPage = 1;
  18325           }else{
  18326             iOff += dbdataGetVarintU32(&pCsr->aPage[iOff], &nPayload);
  18327             if( nPayload>0x7fffff00 ) nPayload &= 0x3fff;
  18328             if( nPayload==0 ) nPayload = 1;
  18329           }
  18330     
  18331           /* If this is a leaf intkey cell, load the rowid */
  18332           if( bHasRowid && !bNextPage && iOff<pCsr->nPage ){
  18333             iOff += dbdataGetVarint(&pCsr->aPage[iOff], &pCsr->iIntkey);
  18334           }
  18335     
  18336           /* Figure out how much data to read from the local page */
  18337           U = pCsr->nPage;
  18338           if( bHasRowid ){
  18339             X = U-35;
  18340           }else{
  18341             X = ((U-12)*64/255)-23;
  18342           }
  18343           if( nPayload<=X ){
  18344             nLocal = nPayload;
  18345           }else{
  18346             int M, K;
  18347             M = ((U-12)*32/255)-23;
  18348             K = M+((nPayload-M)%(U-4));
  18349             if( K<=X ){
  18350               nLocal = K;
  18351             }else{
  18352               nLocal = M;
  18353             }
  18354           }
  18355 
  18356           if( bNextPage || nLocal+iOff>pCsr->nPage ){
  18357             bNextPage = 1;
  18358           }else{
  18359 
  18360             /* Allocate space for payload. And a bit more to catch small buffer
  18361             ** overruns caused by attempting to read a varint or similar from 
  18362             ** near the end of a corrupt record.  */
  18363             rc = dbdataBufferSize(&pCsr->rec, nPayload+DBDATA_PADDING_BYTES);
  18364             if( rc!=SQLITE_OK ) return rc;
  18365             assert( pCsr->rec.aBuf!=0 );
  18366             assert( nPayload!=0 );
  18367 
  18368             /* Load the nLocal bytes of payload */
  18369             memcpy(pCsr->rec.aBuf, &pCsr->aPage[iOff], nLocal);
  18370             iOff += nLocal;
  18371 
  18372             /* Load content from overflow pages */
  18373             if( nPayload>nLocal ){
  18374               sqlite3_int64 nRem = nPayload - nLocal;
  18375               u32 pgnoOvfl = get_uint32(&pCsr->aPage[iOff]);
  18376               while( nRem>0 ){
  18377                 u8 *aOvfl = 0;
  18378                 int nOvfl = 0;
  18379                 int nCopy;
  18380                 rc = dbdataLoadPage(pCsr, pgnoOvfl, &aOvfl, &nOvfl);
  18381                 assert( rc!=SQLITE_OK || aOvfl==0 || nOvfl==pCsr->nPage );
  18382                 if( rc!=SQLITE_OK ) return rc;
  18383                 if( aOvfl==0 ) break;
  18384 
  18385                 nCopy = U-4;
  18386                 if( nCopy>nRem ) nCopy = nRem;
  18387                 memcpy(&pCsr->rec.aBuf[nPayload-nRem], &aOvfl[4], nCopy);
  18388                 nRem -= nCopy;
  18389 
  18390                 pgnoOvfl = get_uint32(aOvfl);
  18391                 sqlite3_free(aOvfl);
  18392               }
  18393               nPayload -= nRem;
  18394             }
  18395             memset(&pCsr->rec.aBuf[nPayload], 0, DBDATA_PADDING_BYTES);
  18396             pCsr->nRec = nPayload;
  18397     
  18398             iHdr = dbdataGetVarintU32(pCsr->rec.aBuf, &nHdr);
  18399             if( nHdr>nPayload ) nHdr = 0;
  18400             pCsr->nHdr = nHdr;
  18401             pCsr->pHdrPtr = &pCsr->rec.aBuf[iHdr];
  18402             pCsr->pPtr = &pCsr->rec.aBuf[pCsr->nHdr];
  18403             pCsr->iField = (bHasRowid ? -1 : 0);
  18404           }
  18405         }
  18406       }else{
  18407         pCsr->iField++;
  18408         if( pCsr->iField>0 ){
  18409           sqlite3_int64 iType;
  18410           if( pCsr->pHdrPtr>=&pCsr->rec.aBuf[pCsr->nRec] 
  18411            || pCsr->iField>=DBDATA_MX_FIELD
  18412           ){
  18413             bNextPage = 1;
  18414           }else{
  18415             int szField = 0;
  18416             pCsr->pHdrPtr += dbdataGetVarintU32(pCsr->pHdrPtr, &iType);
  18417             szField = dbdataValueBytes(iType);
  18418             if( (pCsr->nRec - (pCsr->pPtr - pCsr->rec.aBuf))<szField ){
  18419               pCsr->pPtr = &pCsr->rec.aBuf[pCsr->nRec];
  18420             }else{
  18421               pCsr->pPtr += szField;
  18422             }
  18423           }
  18424         }
  18425       }
  18426 
  18427       if( bNextPage ){
  18428         sqlite3_free(pCsr->aPage);
  18429         pCsr->aPage = 0;
  18430         pCsr->nRec = 0;
  18431         if( pCsr->bOnePage ) return SQLITE_OK;
  18432         pCsr->iPgno++;
  18433       }else{
  18434         if( pCsr->iField<0 || pCsr->pHdrPtr<&pCsr->rec.aBuf[pCsr->nHdr] ){
  18435           return SQLITE_OK;
  18436         }
  18437 
  18438         /* Advance to the next cell. The next iteration of the loop will load
  18439         ** the record and so on. */
  18440         pCsr->nRec = 0;
  18441         pCsr->iCell++;
  18442       }
  18443     }
  18444   }
  18445 
  18446   assert( !"can't get here" );
  18447   return SQLITE_OK;
  18448 }
  18449 
  18450 /* 
  18451 ** Return true if the cursor is at EOF.
  18452 */
  18453 static int dbdataEof(sqlite3_vtab_cursor *pCursor){
  18454   DbdataCursor *pCsr = (DbdataCursor*)pCursor;
  18455   return pCsr->aPage==0;
  18456 }
  18457 
  18458 /*
  18459 ** Return true if nul-terminated string zSchema ends in "()". Or false
  18460 ** otherwise.
  18461 */
  18462 static int dbdataIsFunction(const char *zSchema){
  18463   size_t n = strlen(zSchema);
  18464   if( n>2 && zSchema[n-2]=='(' && zSchema[n-1]==')' ){
  18465     return (int)n-2;
  18466   }
  18467   return 0;
  18468 }
  18469 
  18470 /* 
  18471 ** Determine the size in pages of database zSchema (where zSchema is
  18472 ** "main", "temp" or the name of an attached database) and set 
  18473 ** pCsr->szDb accordingly. If successful, return SQLITE_OK. Otherwise,
  18474 ** an SQLite error code.
  18475 */
  18476 static int dbdataDbsize(DbdataCursor *pCsr, const char *zSchema){
  18477   DbdataTable *pTab = (DbdataTable*)pCsr->base.pVtab;
  18478   char *zSql = 0;
  18479   int rc, rc2;
  18480   int nFunc = 0;
  18481   sqlite3_stmt *pStmt = 0;
  18482 
  18483   if( (nFunc = dbdataIsFunction(zSchema))>0 ){
  18484     zSql = sqlite3_mprintf("SELECT %.*s(0)", nFunc, zSchema);
  18485   }else{
  18486     zSql = sqlite3_mprintf("PRAGMA %Q.page_count", zSchema);
  18487   }
  18488   if( zSql==0 ) return SQLITE_NOMEM;
  18489 
  18490   rc = sqlite3_prepare_v2(pTab->db, zSql, -1, &pStmt, 0);
  18491   sqlite3_free(zSql);
  18492   if( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
  18493     pCsr->szDb = sqlite3_column_int(pStmt, 0);
  18494   }
  18495   rc2 = sqlite3_finalize(pStmt);
  18496   if( rc==SQLITE_OK ) rc = rc2;
  18497   return rc;
  18498 }
  18499 
  18500 /*
  18501 ** Attempt to figure out the encoding of the database by retrieving page 1
  18502 ** and inspecting the header field. If successful, set the pCsr->enc variable
  18503 ** and return SQLITE_OK. Otherwise, return an SQLite error code.
  18504 */
  18505 static int dbdataGetEncoding(DbdataCursor *pCsr){
  18506   int rc = SQLITE_OK;
  18507   int nPg1 = 0;
  18508   u8 *aPg1 = 0;
  18509   rc = dbdataLoadPage(pCsr, 1, &aPg1, &nPg1);
  18510   if( rc==SQLITE_OK && nPg1>=(56+4) ){
  18511     pCsr->enc = get_uint32(&aPg1[56]);
  18512   }
  18513   sqlite3_free(aPg1);
  18514   return rc;
  18515 }
  18516 
  18517 
  18518 /* 
  18519 ** xFilter method for sqlite_dbdata and sqlite_dbptr.
  18520 */
  18521 static int dbdataFilter(
  18522   sqlite3_vtab_cursor *pCursor, 
  18523   int idxNum, const char *idxStr,
  18524   int argc, sqlite3_value **argv
  18525 ){
  18526   DbdataCursor *pCsr = (DbdataCursor*)pCursor;
  18527   DbdataTable *pTab = (DbdataTable*)pCursor->pVtab;
  18528   int rc = SQLITE_OK;
  18529   const char *zSchema = "main";
  18530   (void)idxStr;
  18531   (void)argc;
  18532 
  18533   dbdataResetCursor(pCsr);
  18534   assert( pCsr->iPgno==1 );
  18535   if( idxNum & 0x01 ){
  18536     zSchema = (const char*)sqlite3_value_text(argv[0]);
  18537     if( zSchema==0 ) zSchema = "";
  18538   }
  18539   if( idxNum & 0x02 ){
  18540     pCsr->iPgno = sqlite3_value_int(argv[(idxNum & 0x01)]);
  18541     pCsr->bOnePage = 1;
  18542   }else{
  18543     rc = dbdataDbsize(pCsr, zSchema);
  18544   }
  18545 
  18546   if( rc==SQLITE_OK ){
  18547     int nFunc = 0;
  18548     if( pTab->pStmt ){
  18549       pCsr->pStmt = pTab->pStmt;
  18550       pTab->pStmt = 0;
  18551     }else if( (nFunc = dbdataIsFunction(zSchema))>0 ){
  18552       char *zSql = sqlite3_mprintf("SELECT %.*s(?2)", nFunc, zSchema);
  18553       if( zSql==0 ){
  18554         rc = SQLITE_NOMEM;
  18555       }else{
  18556         rc = sqlite3_prepare_v2(pTab->db, zSql, -1, &pCsr->pStmt, 0);
  18557         sqlite3_free(zSql);
  18558       }
  18559     }else{
  18560       rc = sqlite3_prepare_v2(pTab->db, 
  18561           "SELECT data FROM sqlite_dbpage(?) WHERE pgno=?", -1,
  18562           &pCsr->pStmt, 0
  18563       );
  18564     }
  18565   }
  18566   if( rc==SQLITE_OK ){
  18567     rc = sqlite3_bind_text(pCsr->pStmt, 1, zSchema, -1, SQLITE_TRANSIENT);
  18568   }
  18569 
  18570   /* Try to determine the encoding of the db by inspecting the header
  18571   ** field on page 1. */
  18572   if( rc==SQLITE_OK ){
  18573     rc = dbdataGetEncoding(pCsr);
  18574   }
  18575 
  18576   if( rc!=SQLITE_OK ){
  18577     pTab->base.zErrMsg = sqlite3_mprintf("%s", sqlite3_errmsg(pTab->db));
  18578   }
  18579 
  18580   if( rc==SQLITE_OK ){
  18581     rc = dbdataNext(pCursor);
  18582   }
  18583   return rc;
  18584 }
  18585 
  18586 /*
  18587 ** Return a column for the sqlite_dbdata or sqlite_dbptr table.
  18588 */
  18589 static int dbdataColumn(
  18590   sqlite3_vtab_cursor *pCursor, 
  18591   sqlite3_context *ctx, 
  18592   int i
  18593 ){
  18594   DbdataCursor *pCsr = (DbdataCursor*)pCursor;
  18595   DbdataTable *pTab = (DbdataTable*)pCursor->pVtab;
  18596   if( pTab->bPtr ){
  18597     switch( i ){
  18598       case DBPTR_COLUMN_PGNO:
  18599         sqlite3_result_int64(ctx, pCsr->iPgno);
  18600         break;
  18601       case DBPTR_COLUMN_CHILD: {
  18602         int iOff = pCsr->iPgno==1 ? 100 : 0;
  18603         if( pCsr->iCell<0 ){
  18604           iOff += 8;
  18605         }else{
  18606           iOff += 12 + pCsr->iCell*2;
  18607           if( iOff>pCsr->nPage ) return SQLITE_OK;
  18608           iOff = get_uint16(&pCsr->aPage[iOff]);
  18609         }
  18610         if( iOff<=pCsr->nPage ){
  18611           sqlite3_result_int64(ctx, get_uint32(&pCsr->aPage[iOff]));
  18612         }
  18613         break;
  18614       }
  18615     }
  18616   }else{
  18617     switch( i ){
  18618       case DBDATA_COLUMN_PGNO:
  18619         sqlite3_result_int64(ctx, pCsr->iPgno);
  18620         break;
  18621       case DBDATA_COLUMN_CELL:
  18622         sqlite3_result_int(ctx, pCsr->iCell);
  18623         break;
  18624       case DBDATA_COLUMN_FIELD:
  18625         sqlite3_result_int(ctx, pCsr->iField);
  18626         break;
  18627       case DBDATA_COLUMN_VALUE: {
  18628         if( pCsr->iField<0 ){
  18629           sqlite3_result_int64(ctx, pCsr->iIntkey);
  18630         }else if( &pCsr->rec.aBuf[pCsr->nRec] >= pCsr->pPtr ){
  18631           sqlite3_int64 iType;
  18632           dbdataGetVarintU32(pCsr->pHdrPtr, &iType);
  18633           dbdataValue(
  18634               ctx, pCsr->enc, iType, pCsr->pPtr, 
  18635               &pCsr->rec.aBuf[pCsr->nRec] - pCsr->pPtr
  18636           );
  18637         }
  18638         break;
  18639       }
  18640     }
  18641   }
  18642   return SQLITE_OK;
  18643 }
  18644 
  18645 /* 
  18646 ** Return the rowid for an sqlite_dbdata or sqlite_dptr table.
  18647 */
  18648 static int dbdataRowid(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){
  18649   DbdataCursor *pCsr = (DbdataCursor*)pCursor;
  18650   *pRowid = pCsr->iRowid;
  18651   return SQLITE_OK;
  18652 }
  18653 
  18654 
  18655 /*
  18656 ** Invoke this routine to register the "sqlite_dbdata" virtual table module
  18657 */
  18658 static int sqlite3DbdataRegister(sqlite3 *db){
  18659   static sqlite3_module dbdata_module = {
  18660     0,                            /* iVersion */
  18661     0,                            /* xCreate */
  18662     dbdataConnect,                /* xConnect */
  18663     dbdataBestIndex,              /* xBestIndex */
  18664     dbdataDisconnect,             /* xDisconnect */
  18665     0,                            /* xDestroy */
  18666     dbdataOpen,                   /* xOpen - open a cursor */
  18667     dbdataClose,                  /* xClose - close a cursor */
  18668     dbdataFilter,                 /* xFilter - configure scan constraints */
  18669     dbdataNext,                   /* xNext - advance a cursor */
  18670     dbdataEof,                    /* xEof - check for end of scan */
  18671     dbdataColumn,                 /* xColumn - read data */
  18672     dbdataRowid,                  /* xRowid - read data */
  18673     0,                            /* xUpdate */
  18674     0,                            /* xBegin */
  18675     0,                            /* xSync */
  18676     0,                            /* xCommit */
  18677     0,                            /* xRollback */
  18678     0,                            /* xFindMethod */
  18679     0,                            /* xRename */
  18680     0,                            /* xSavepoint */
  18681     0,                            /* xRelease */
  18682     0,                            /* xRollbackTo */
  18683     0,                            /* xShadowName */
  18684     0                             /* xIntegrity */
  18685   };
  18686 
  18687   int rc = sqlite3_create_module(db, "sqlite_dbdata", &dbdata_module, 0);
  18688   if( rc==SQLITE_OK ){
  18689     rc = sqlite3_create_module(db, "sqlite_dbptr", &dbdata_module, (void*)1);
  18690   }
  18691   return rc;
  18692 }
  18693 
  18694 #ifdef _WIN32
  18695 
  18696 #endif
  18697 int sqlite3_dbdata_init(
  18698   sqlite3 *db, 
  18699   char **pzErrMsg, 
  18700   const sqlite3_api_routines *pApi
  18701 ){
  18702   (void)pzErrMsg;
  18703   return sqlite3DbdataRegister(db);
  18704 }
  18705 
  18706 #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
  18707 
  18708 /************************* End ../ext/recover/dbdata.c ********************/
  18709 /************************* Begin ../ext/recover/sqlite3recover.c ******************/
  18710 /*
  18711 ** 2022-08-27
  18712 **
  18713 ** The author disclaims copyright to this source code.  In place of
  18714 ** a legal notice, here is a blessing:
  18715 **
  18716 **    May you do good and not evil.
  18717 **    May you find forgiveness for yourself and forgive others.
  18718 **    May you share freely, never taking more than you give.
  18719 **
  18720 *************************************************************************
  18721 **
  18722 */
  18723 
  18724 
  18725 /* #include "sqlite3recover.h" */
  18726 #include <assert.h>
  18727 #include <string.h>
  18728 
  18729 #ifndef SQLITE_OMIT_VIRTUALTABLE
  18730 
  18731 /*
  18732 ** Declaration for public API function in file dbdata.c. This may be called
  18733 ** with NULL as the final two arguments to register the sqlite_dbptr and
  18734 ** sqlite_dbdata virtual tables with a database handle.
  18735 */
  18736 #ifdef _WIN32
  18737 
  18738 #endif
  18739 int sqlite3_dbdata_init(sqlite3*, char**, const sqlite3_api_routines*);
  18740 
  18741 /* typedef unsigned int u32; */
  18742 /* typedef unsigned char u8; */
  18743 /* typedef sqlite3_int64 i64; */
  18744 
  18745 /*
  18746 ** Work around C99 "flex-array" syntax for pre-C99 compilers, so as
  18747 ** to avoid complaints from -fsanitize=strict-bounds.
  18748 */
  18749 #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
  18750 # define FLEXARRAY
  18751 #else
  18752 # define FLEXARRAY 1
  18753 #endif
  18754 
  18755 typedef struct RecoverTable RecoverTable;
  18756 typedef struct RecoverColumn RecoverColumn;
  18757 
  18758 /*
  18759 ** When recovering rows of data that can be associated with table
  18760 ** definitions recovered from the sqlite_schema table, each table is
  18761 ** represented by an instance of the following object.
  18762 **
  18763 ** iRoot:
  18764 **   The root page in the original database. Not necessarily (and usually
  18765 **   not) the same in the recovered database.
  18766 **
  18767 ** zTab:
  18768 **   Name of the table.
  18769 **
  18770 ** nCol/aCol[]:
  18771 **   aCol[] is an array of nCol columns. In the order in which they appear 
  18772 **   in the table.
  18773 **
  18774 ** bIntkey:
  18775 **   Set to true for intkey tables, false for WITHOUT ROWID.
  18776 **
  18777 ** iRowidBind:
  18778 **   Each column in the aCol[] array has associated with it the index of
  18779 **   the bind parameter its values will be bound to in the INSERT statement
  18780 **   used to construct the output database. If the table does has a rowid
  18781 **   but not an INTEGER PRIMARY KEY column, then iRowidBind contains the
  18782 **   index of the bind paramater to which the rowid value should be bound.
  18783 **   Otherwise, it contains -1. If the table does contain an INTEGER PRIMARY 
  18784 **   KEY column, then the rowid value should be bound to the index associated
  18785 **   with the column.
  18786 **
  18787 ** pNext:
  18788 **   All RecoverTable objects used by the recovery operation are allocated
  18789 **   and populated as part of creating the recovered database schema in
  18790 **   the output database, before any non-schema data are recovered. They
  18791 **   are then stored in a singly-linked list linked by this variable beginning
  18792 **   at sqlite3_recover.pTblList.
  18793 */
  18794 struct RecoverTable {
  18795   u32 iRoot;                      /* Root page in original database */
  18796   char *zTab;                     /* Name of table */
  18797   int nCol;                       /* Number of columns in table */
  18798   RecoverColumn *aCol;            /* Array of columns */
  18799   int bIntkey;                    /* True for intkey, false for without rowid */
  18800   int iRowidBind;                 /* If >0, bind rowid to INSERT here */
  18801   RecoverTable *pNext;
  18802 };
  18803 
  18804 /*
  18805 ** Each database column is represented by an instance of the following object
  18806 ** stored in the RecoverTable.aCol[] array of the associated table.
  18807 **
  18808 ** iField:
  18809 **   The index of the associated field within database records. Or -1 if
  18810 **   there is no associated field (e.g. for virtual generated columns).
  18811 **
  18812 ** iBind:
  18813 **   The bind index of the INSERT statement to bind this columns values
  18814 **   to. Or 0 if there is no such index (iff (iField<0)).
  18815 **
  18816 ** bIPK:
  18817 **   True if this is the INTEGER PRIMARY KEY column.
  18818 **
  18819 ** zCol:
  18820 **   Name of column.
  18821 **
  18822 ** eHidden:
  18823 **   A RECOVER_EHIDDEN_* constant value (see below for interpretation of each).
  18824 */
  18825 struct RecoverColumn {
  18826   int iField;                     /* Field in record on disk */
  18827   int iBind;                      /* Binding to use in INSERT */
  18828   int bIPK;                       /* True for IPK column */
  18829   char *zCol;
  18830   int eHidden;
  18831 };
  18832 
  18833 #define RECOVER_EHIDDEN_NONE    0      /* Normal database column */
  18834 #define RECOVER_EHIDDEN_HIDDEN  1      /* Column is __HIDDEN__ */
  18835 #define RECOVER_EHIDDEN_VIRTUAL 2      /* Virtual generated column */
  18836 #define RECOVER_EHIDDEN_STORED  3      /* Stored generated column */
  18837 
  18838 /*
  18839 ** Bitmap object used to track pages in the input database. Allocated
  18840 ** and manipulated only by the following functions:
  18841 **
  18842 **     recoverBitmapAlloc()
  18843 **     recoverBitmapFree()
  18844 **     recoverBitmapSet()
  18845 **     recoverBitmapQuery()
  18846 **
  18847 ** nPg:
  18848 **   Largest page number that may be stored in the bitmap. The range
  18849 **   of valid keys is 1 to nPg, inclusive.
  18850 **
  18851 ** aElem[]:
  18852 **   Array large enough to contain a bit for each key. For key value
  18853 **   iKey, the associated bit is the bit (iKey%32) of aElem[iKey/32].
  18854 **   In other words, the following is true if bit iKey is set, or 
  18855 **   false if it is clear:
  18856 **
  18857 **       (aElem[iKey/32] & (1 << (iKey%32))) ? 1 : 0
  18858 */
  18859 typedef struct RecoverBitmap RecoverBitmap;
  18860 struct RecoverBitmap {
  18861   i64 nPg;                        /* Size of bitmap */
  18862   u32 aElem[FLEXARRAY];           /* Array of 32-bit bitmasks */
  18863 };
  18864 
  18865 /* Size in bytes of a RecoverBitmap object sufficient to cover 32 pages */
  18866 #define SZ_RECOVERBITMAP_32  (16)
  18867 
  18868 /*
  18869 ** State variables (part of the sqlite3_recover structure) used while
  18870 ** recovering data for tables identified in the recovered schema (state
  18871 ** RECOVER_STATE_WRITING).
  18872 */
  18873 typedef struct RecoverStateW1 RecoverStateW1;
  18874 struct RecoverStateW1 {
  18875   sqlite3_stmt *pTbls;
  18876   sqlite3_stmt *pSel;
  18877   sqlite3_stmt *pInsert;
  18878   int nInsert;
  18879 
  18880   RecoverTable *pTab;             /* Table currently being written */
  18881   int nMax;                       /* Max column count in any schema table */
  18882   sqlite3_value **apVal;          /* Array of nMax values */
  18883   int nVal;                       /* Number of valid entries in apVal[] */
  18884   int bHaveRowid;
  18885   i64 iRowid;
  18886   i64 iPrevPage;
  18887   int iPrevCell;
  18888 };
  18889 
  18890 /*
  18891 ** State variables (part of the sqlite3_recover structure) used while
  18892 ** recovering data destined for the lost and found table (states
  18893 ** RECOVER_STATE_LOSTANDFOUND[123]).
  18894 */
  18895 typedef struct RecoverStateLAF RecoverStateLAF;
  18896 struct RecoverStateLAF {
  18897   RecoverBitmap *pUsed;
  18898   i64 nPg;                        /* Size of db in pages */
  18899   sqlite3_stmt *pAllAndParent;
  18900   sqlite3_stmt *pMapInsert;
  18901   sqlite3_stmt *pMaxField;
  18902   sqlite3_stmt *pUsedPages;
  18903   sqlite3_stmt *pFindRoot;
  18904   sqlite3_stmt *pInsert;          /* INSERT INTO lost_and_found ... */
  18905   sqlite3_stmt *pAllPage;
  18906   sqlite3_stmt *pPageData;
  18907   sqlite3_value **apVal;
  18908   int nMaxField;
  18909 };
  18910 
  18911 /*
  18912 ** Main recover handle structure.
  18913 */
  18914 struct sqlite3_recover {
  18915   /* Copies of sqlite3_recover_init[_sql]() parameters */
  18916   sqlite3 *dbIn;                  /* Input database */
  18917   char *zDb;                      /* Name of input db ("main" etc.) */
  18918   char *zUri;                     /* URI for output database */
  18919   void *pSqlCtx;                  /* SQL callback context */
  18920   int (*xSql)(void*,const char*); /* Pointer to SQL callback function */
  18921 
  18922   /* Values configured by sqlite3_recover_config() */
  18923   char *zStateDb;                 /* State database to use (or NULL) */
  18924   char *zLostAndFound;            /* Name of lost-and-found table (or NULL) */
  18925   int bFreelistCorrupt;           /* SQLITE_RECOVER_FREELIST_CORRUPT setting */
  18926   int bRecoverRowid;              /* SQLITE_RECOVER_ROWIDS setting */
  18927   int bSlowIndexes;               /* SQLITE_RECOVER_SLOWINDEXES setting */
  18928 
  18929   int pgsz;
  18930   int detected_pgsz;
  18931   int nReserve;
  18932   u8 *pPage1Disk;
  18933   u8 *pPage1Cache;
  18934 
  18935   /* Error code and error message */
  18936   int errCode;                    /* For sqlite3_recover_errcode() */
  18937   char *zErrMsg;                  /* For sqlite3_recover_errmsg() */
  18938 
  18939   int eState;
  18940   int bCloseTransaction;
  18941 
  18942   /* Variables used with eState==RECOVER_STATE_WRITING */
  18943   RecoverStateW1 w1;
  18944 
  18945   /* Variables used with states RECOVER_STATE_LOSTANDFOUND[123] */
  18946   RecoverStateLAF laf;
  18947 
  18948   /* Fields used within sqlite3_recover_run() */
  18949   sqlite3 *dbOut;                 /* Output database */
  18950   sqlite3_stmt *pGetPage;         /* SELECT against input db sqlite_dbdata */
  18951   RecoverTable *pTblList;         /* List of tables recovered from schema */
  18952 };
  18953 
  18954 /*
  18955 ** The various states in which an sqlite3_recover object may exist:
  18956 **
  18957 **   RECOVER_STATE_INIT:
  18958 **    The object is initially created in this state. sqlite3_recover_step()
  18959 **    has yet to be called. This is the only state in which it is permitted
  18960 **    to call sqlite3_recover_config().
  18961 **
  18962 **   RECOVER_STATE_WRITING:
  18963 **
  18964 **   RECOVER_STATE_LOSTANDFOUND1:
  18965 **    State to populate the bitmap of pages used by other tables or the
  18966 **    database freelist.
  18967 **
  18968 **   RECOVER_STATE_LOSTANDFOUND2:
  18969 **    Populate the recovery.map table - used to figure out a "root" page
  18970 **    for each lost page from in the database from which records are
  18971 **    extracted.
  18972 **
  18973 **   RECOVER_STATE_LOSTANDFOUND3:
  18974 **    Populate the lost-and-found table itself.
  18975 */
  18976 #define RECOVER_STATE_INIT           0
  18977 #define RECOVER_STATE_WRITING        1
  18978 #define RECOVER_STATE_LOSTANDFOUND1  2
  18979 #define RECOVER_STATE_LOSTANDFOUND2  3
  18980 #define RECOVER_STATE_LOSTANDFOUND3  4
  18981 #define RECOVER_STATE_SCHEMA2        5
  18982 #define RECOVER_STATE_DONE           6
  18983 
  18984 
  18985 /*
  18986 ** Global variables used by this extension.
  18987 */
  18988 typedef struct RecoverGlobal RecoverGlobal;
  18989 struct RecoverGlobal {
  18990   const sqlite3_io_methods *pMethods;
  18991   sqlite3_recover *p;
  18992 };
  18993 static RecoverGlobal recover_g;
  18994 
  18995 /*
  18996 ** Use this static SQLite mutex to protect the globals during the
  18997 ** first call to sqlite3_recover_step().
  18998 */ 
  18999 #define RECOVER_MUTEX_ID SQLITE_MUTEX_STATIC_APP2
  19000 
  19001 
  19002 /* 
  19003 ** Default value for SQLITE_RECOVER_ROWIDS (sqlite3_recover.bRecoverRowid).
  19004 */
  19005 #define RECOVER_ROWID_DEFAULT 1
  19006 
  19007 /*
  19008 ** Mutex handling:
  19009 **
  19010 **    recoverEnterMutex()       -   Enter the recovery mutex
  19011 **    recoverLeaveMutex()       -   Leave the recovery mutex
  19012 **    recoverAssertMutexHeld()  -   Assert that the recovery mutex is held
  19013 */
  19014 #if defined(SQLITE_THREADSAFE) && SQLITE_THREADSAFE==0
  19015 # define recoverEnterMutex()
  19016 # define recoverLeaveMutex()
  19017 #else
  19018 static void recoverEnterMutex(void){
  19019   sqlite3_mutex_enter(sqlite3_mutex_alloc(RECOVER_MUTEX_ID));
  19020 }
  19021 static void recoverLeaveMutex(void){
  19022   sqlite3_mutex_leave(sqlite3_mutex_alloc(RECOVER_MUTEX_ID));
  19023 }
  19024 #endif
  19025 #if SQLITE_THREADSAFE+0>=1 && defined(SQLITE_DEBUG)
  19026 static void recoverAssertMutexHeld(void){
  19027   assert( sqlite3_mutex_held(sqlite3_mutex_alloc(RECOVER_MUTEX_ID)) );
  19028 }
  19029 #else
  19030 # define recoverAssertMutexHeld()
  19031 #endif
  19032 
  19033 
  19034 /*
  19035 ** Like strlen(). But handles NULL pointer arguments.
  19036 */
  19037 static int recoverStrlen(const char *zStr){
  19038   if( zStr==0 ) return 0;
  19039   return (int)(strlen(zStr)&0x7fffffff);
  19040 }
  19041 
  19042 /*
  19043 ** This function is a no-op if the recover handle passed as the first 
  19044 ** argument already contains an error (if p->errCode!=SQLITE_OK). 
  19045 **
  19046 ** Otherwise, an attempt is made to allocate, zero and return a buffer nByte
  19047 ** bytes in size. If successful, a pointer to the new buffer is returned. Or,
  19048 ** if an OOM error occurs, NULL is returned and the handle error code
  19049 ** (p->errCode) set to SQLITE_NOMEM.
  19050 */
  19051 static void *recoverMalloc(sqlite3_recover *p, i64 nByte){
  19052   void *pRet = 0;
  19053   assert( nByte>0 );
  19054   if( p->errCode==SQLITE_OK ){
  19055     pRet = sqlite3_malloc64(nByte);
  19056     if( pRet ){
  19057       memset(pRet, 0, nByte);
  19058     }else{
  19059       p->errCode = SQLITE_NOMEM;
  19060     }
  19061   }
  19062   return pRet;
  19063 }
  19064 
  19065 /*
  19066 ** Set the error code and error message for the recover handle passed as
  19067 ** the first argument. The error code is set to the value of parameter
  19068 ** errCode.
  19069 **
  19070 ** Parameter zFmt must be a printf() style formatting string. The handle 
  19071 ** error message is set to the result of using any trailing arguments for 
  19072 ** parameter substitutions in the formatting string.
  19073 **
  19074 ** For example:
  19075 **
  19076 **   recoverError(p, SQLITE_ERROR, "no such table: %s", zTablename);
  19077 */
  19078 static int recoverError(
  19079   sqlite3_recover *p, 
  19080   int errCode, 
  19081   const char *zFmt, ...
  19082 ){
  19083   char *z = 0;
  19084   va_list ap;
  19085   va_start(ap, zFmt);
  19086   if( zFmt ){
  19087     z = sqlite3_vmprintf(zFmt, ap);
  19088   }
  19089   va_end(ap);
  19090   sqlite3_free(p->zErrMsg);
  19091   p->zErrMsg = z;
  19092   p->errCode = errCode;
  19093   return errCode;
  19094 }
  19095 
  19096 
  19097 /*
  19098 ** This function is a no-op if p->errCode is initially other than SQLITE_OK.
  19099 ** In this case it returns NULL.
  19100 **
  19101 ** Otherwise, an attempt is made to allocate and return a bitmap object
  19102 ** large enough to store a bit for all page numbers between 1 and nPg,
  19103 ** inclusive. The bitmap is initially zeroed.
  19104 */
  19105 static RecoverBitmap *recoverBitmapAlloc(sqlite3_recover *p, i64 nPg){
  19106   int nElem = (nPg+1+31) / 32;
  19107   int nByte = SZ_RECOVERBITMAP_32 + nElem*sizeof(u32);
  19108   RecoverBitmap *pRet = (RecoverBitmap*)recoverMalloc(p, nByte);
  19109 
  19110   if( pRet ){
  19111     pRet->nPg = nPg;
  19112   }
  19113   return pRet;
  19114 }
  19115 
  19116 /*
  19117 ** Free a bitmap object allocated by recoverBitmapAlloc().
  19118 */
  19119 static void recoverBitmapFree(RecoverBitmap *pMap){
  19120   sqlite3_free(pMap);
  19121 }
  19122 
  19123 /*
  19124 ** Set the bit associated with page iPg in bitvec pMap.
  19125 */
  19126 static void recoverBitmapSet(RecoverBitmap *pMap, i64 iPg){
  19127   if( iPg<=pMap->nPg ){
  19128     int iElem = (iPg / 32);
  19129     int iBit = (iPg % 32);
  19130     pMap->aElem[iElem] |= (((u32)1) << iBit);
  19131   }
  19132 }
  19133 
  19134 /*
  19135 ** Query bitmap object pMap for the state of the bit associated with page
  19136 ** iPg. Return 1 if it is set, or 0 otherwise.
  19137 */
  19138 static int recoverBitmapQuery(RecoverBitmap *pMap, i64 iPg){
  19139   int ret = 1;
  19140   if( iPg<=pMap->nPg && iPg>0 ){
  19141     int iElem = (iPg / 32);
  19142     int iBit = (iPg % 32);
  19143     ret = (pMap->aElem[iElem] & (((u32)1) << iBit)) ? 1 : 0;
  19144   }
  19145   return ret;
  19146 }
  19147 
  19148 /*
  19149 ** Set the recover handle error to the error code and message returned by
  19150 ** calling sqlite3_errcode() and sqlite3_errmsg(), respectively, on database
  19151 ** handle db.
  19152 */
  19153 static int recoverDbError(sqlite3_recover *p, sqlite3 *db){
  19154   return recoverError(p, sqlite3_errcode(db), "%s", sqlite3_errmsg(db));
  19155 }
  19156 
  19157 /*
  19158 ** This function is a no-op if recover handle p already contains an error
  19159 ** (if p->errCode!=SQLITE_OK). 
  19160 **
  19161 ** Otherwise, it attempts to prepare the SQL statement in zSql against
  19162 ** database handle db. If successful, the statement handle is returned.
  19163 ** Or, if an error occurs, NULL is returned and an error left in the
  19164 ** recover handle.
  19165 */
  19166 static sqlite3_stmt *recoverPrepare(
  19167   sqlite3_recover *p,
  19168   sqlite3 *db, 
  19169   const char *zSql
  19170 ){
  19171   sqlite3_stmt *pStmt = 0;
  19172   if( p->errCode==SQLITE_OK ){
  19173     if( sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0) ){
  19174       recoverDbError(p, db);
  19175     }
  19176   }
  19177   return pStmt;
  19178 }
  19179 
  19180 /*
  19181 ** This function is a no-op if recover handle p already contains an error
  19182 ** (if p->errCode!=SQLITE_OK). 
  19183 **
  19184 ** Otherwise, argument zFmt is used as a printf() style format string,
  19185 ** along with any trailing arguments, to create an SQL statement. This
  19186 ** SQL statement is prepared against database handle db and, if successful,
  19187 ** the statment handle returned. Or, if an error occurs - either during
  19188 ** the printf() formatting or when preparing the resulting SQL - an
  19189 ** error code and message are left in the recover handle.
  19190 */
  19191 static sqlite3_stmt *recoverPreparePrintf(
  19192   sqlite3_recover *p,
  19193   sqlite3 *db, 
  19194   const char *zFmt, ...
  19195 ){
  19196   sqlite3_stmt *pStmt = 0;
  19197   if( p->errCode==SQLITE_OK ){
  19198     va_list ap;
  19199     char *z;
  19200     va_start(ap, zFmt);
  19201     z = sqlite3_vmprintf(zFmt, ap);
  19202     va_end(ap);
  19203     if( z==0 ){
  19204       p->errCode = SQLITE_NOMEM;
  19205     }else{
  19206       pStmt = recoverPrepare(p, db, z);
  19207       sqlite3_free(z);
  19208     }
  19209   }
  19210   return pStmt;
  19211 }
  19212 
  19213 /*
  19214 ** Reset SQLite statement handle pStmt. If the call to sqlite3_reset() 
  19215 ** indicates that an error occurred, and there is not already an error
  19216 ** in the recover handle passed as the first argument, set the error
  19217 ** code and error message appropriately.
  19218 **
  19219 ** This function returns a copy of the statement handle pointer passed
  19220 ** as the second argument.
  19221 */
  19222 static sqlite3_stmt *recoverReset(sqlite3_recover *p, sqlite3_stmt *pStmt){
  19223   int rc = sqlite3_reset(pStmt);
  19224   if( rc!=SQLITE_OK && rc!=SQLITE_CONSTRAINT && p->errCode==SQLITE_OK ){
  19225     recoverDbError(p, sqlite3_db_handle(pStmt));
  19226   }
  19227   return pStmt;
  19228 }
  19229 
  19230 /*
  19231 ** Finalize SQLite statement handle pStmt. If the call to sqlite3_reset() 
  19232 ** indicates that an error occurred, and there is not already an error
  19233 ** in the recover handle passed as the first argument, set the error
  19234 ** code and error message appropriately.
  19235 */
  19236 static void recoverFinalize(sqlite3_recover *p, sqlite3_stmt *pStmt){
  19237   sqlite3 *db = sqlite3_db_handle(pStmt);
  19238   int rc = sqlite3_finalize(pStmt);
  19239   if( rc!=SQLITE_OK && p->errCode==SQLITE_OK ){
  19240     recoverDbError(p, db);
  19241   }
  19242 }
  19243 
  19244 /*
  19245 ** This function is a no-op if recover handle p already contains an error
  19246 ** (if p->errCode!=SQLITE_OK). A copy of p->errCode is returned in this 
  19247 ** case.
  19248 **
  19249 ** Otherwise, execute SQL script zSql. If successful, return SQLITE_OK.
  19250 ** Or, if an error occurs, leave an error code and message in the recover
  19251 ** handle and return a copy of the error code.
  19252 */
  19253 static int recoverExec(sqlite3_recover *p, sqlite3 *db, const char *zSql){
  19254   if( p->errCode==SQLITE_OK ){
  19255     int rc = sqlite3_exec(db, zSql, 0, 0, 0);
  19256     if( rc ){
  19257       recoverDbError(p, db);
  19258     }
  19259   }
  19260   return p->errCode;
  19261 }
  19262 
  19263 /*
  19264 ** Bind the value pVal to parameter iBind of statement pStmt. Leave an
  19265 ** error in the recover handle passed as the first argument if an error
  19266 ** (e.g. an OOM) occurs.
  19267 */
  19268 static void recoverBindValue(
  19269   sqlite3_recover *p, 
  19270   sqlite3_stmt *pStmt, 
  19271   int iBind, 
  19272   sqlite3_value *pVal
  19273 ){
  19274   if( p->errCode==SQLITE_OK ){
  19275     int rc = sqlite3_bind_value(pStmt, iBind, pVal);
  19276     if( rc ) recoverError(p, rc, 0);
  19277   }
  19278 }
  19279 
  19280 /*
  19281 ** This function is a no-op if recover handle p already contains an error
  19282 ** (if p->errCode!=SQLITE_OK). NULL is returned in this case.
  19283 **
  19284 ** Otherwise, an attempt is made to interpret zFmt as a printf() style
  19285 ** formatting string and the result of using the trailing arguments for
  19286 ** parameter substitution with it written into a buffer obtained from
  19287 ** sqlite3_malloc(). If successful, a pointer to the buffer is returned.
  19288 ** It is the responsibility of the caller to eventually free the buffer
  19289 ** using sqlite3_free().
  19290 **
  19291 ** Or, if an error occurs, an error code and message is left in the recover
  19292 ** handle and NULL returned.
  19293 */
  19294 static char *recoverMPrintf(sqlite3_recover *p, const char *zFmt, ...){
  19295   va_list ap;
  19296   char *z;
  19297   va_start(ap, zFmt);
  19298   z = sqlite3_vmprintf(zFmt, ap);
  19299   va_end(ap);
  19300   if( p->errCode==SQLITE_OK ){
  19301     if( z==0 ) p->errCode = SQLITE_NOMEM;
  19302   }else{
  19303     sqlite3_free(z);
  19304     z = 0;
  19305   }
  19306   return z;
  19307 }
  19308 
  19309 /*
  19310 ** This function is a no-op if recover handle p already contains an error
  19311 ** (if p->errCode!=SQLITE_OK). Zero is returned in this case.
  19312 **
  19313 ** Otherwise, execute "PRAGMA page_count" against the input database. If
  19314 ** successful, return the integer result. Or, if an error occurs, leave an
  19315 ** error code and error message in the sqlite3_recover handle and return
  19316 ** zero.
  19317 */
  19318 static i64 recoverPageCount(sqlite3_recover *p){
  19319   i64 nPg = 0;
  19320   if( p->errCode==SQLITE_OK ){
  19321     sqlite3_stmt *pStmt = 0;
  19322     pStmt = recoverPreparePrintf(p, p->dbIn, "PRAGMA %Q.page_count", p->zDb);
  19323     if( pStmt ){
  19324       sqlite3_step(pStmt);
  19325       nPg = sqlite3_column_int64(pStmt, 0);
  19326     }
  19327     recoverFinalize(p, pStmt);
  19328   }
  19329   return nPg;
  19330 }
  19331 
  19332 /*
  19333 ** Implementation of SQL scalar function "read_i32". The first argument to 
  19334 ** this function must be a blob. The second a non-negative integer. This 
  19335 ** function reads and returns a 32-bit big-endian integer from byte
  19336 ** offset (4*<arg2>) of the blob.
  19337 **
  19338 **     SELECT read_i32(<blob>, <idx>)
  19339 */
  19340 static void recoverReadI32(
  19341   sqlite3_context *context, 
  19342   int argc, 
  19343   sqlite3_value **argv
  19344 ){
  19345   const unsigned char *pBlob;
  19346   int nBlob;
  19347   int iInt;
  19348 
  19349   assert( argc==2 );
  19350   nBlob = sqlite3_value_bytes(argv[0]);
  19351   pBlob = (const unsigned char*)sqlite3_value_blob(argv[0]);
  19352   iInt = sqlite3_value_int(argv[1]) & 0xFFFF;
  19353 
  19354   if( (iInt+1)*4<=nBlob ){
  19355     const unsigned char *a = &pBlob[iInt*4];
  19356     i64 iVal = ((i64)a[0]<<24)
  19357              + ((i64)a[1]<<16)
  19358              + ((i64)a[2]<< 8)
  19359              + ((i64)a[3]<< 0);
  19360     sqlite3_result_int64(context, iVal);
  19361   }
  19362 }
  19363 
  19364 /*
  19365 ** Implementation of SQL scalar function "page_is_used". This function
  19366 ** is used as part of the procedure for locating orphan rows for the
  19367 ** lost-and-found table, and it depends on those routines having populated
  19368 ** the sqlite3_recover.laf.pUsed variable.
  19369 **
  19370 ** The only argument to this function is a page-number. It returns true 
  19371 ** if the page has already been used somehow during data recovery, or false
  19372 ** otherwise.
  19373 **
  19374 **     SELECT page_is_used(<pgno>);
  19375 */
  19376 static void recoverPageIsUsed(
  19377   sqlite3_context *pCtx,
  19378   int nArg,
  19379   sqlite3_value **apArg
  19380 ){
  19381   sqlite3_recover *p = (sqlite3_recover*)sqlite3_user_data(pCtx);
  19382   i64 pgno = sqlite3_value_int64(apArg[0]);
  19383   assert( nArg==1 );
  19384   sqlite3_result_int(pCtx, recoverBitmapQuery(p->laf.pUsed, pgno));
  19385 }
  19386 
  19387 /*
  19388 ** The implementation of a user-defined SQL function invoked by the 
  19389 ** sqlite_dbdata and sqlite_dbptr virtual table modules to access pages
  19390 ** of the database being recovered.
  19391 **
  19392 ** This function always takes a single integer argument. If the argument
  19393 ** is zero, then the value returned is the number of pages in the db being
  19394 ** recovered. If the argument is greater than zero, it is a page number. 
  19395 ** The value returned in this case is an SQL blob containing the data for 
  19396 ** the identified page of the db being recovered. e.g.
  19397 **
  19398 **     SELECT getpage(0);       -- return number of pages in db
  19399 **     SELECT getpage(4);       -- return page 4 of db as a blob of data 
  19400 */
  19401 static void recoverGetPage(
  19402   sqlite3_context *pCtx,
  19403   int nArg,
  19404   sqlite3_value **apArg
  19405 ){
  19406   sqlite3_recover *p = (sqlite3_recover*)sqlite3_user_data(pCtx);
  19407   i64 pgno = sqlite3_value_int64(apArg[0]);
  19408   sqlite3_stmt *pStmt = 0;
  19409 
  19410   assert( nArg==1 );
  19411   if( pgno==0 ){
  19412     i64 nPg = recoverPageCount(p);
  19413     sqlite3_result_int64(pCtx, nPg);
  19414     return;
  19415   }else{
  19416     if( p->pGetPage==0 ){
  19417       pStmt = p->pGetPage = recoverPreparePrintf(
  19418           p, p->dbIn, "SELECT data FROM sqlite_dbpage(%Q) WHERE pgno=?", p->zDb
  19419       );
  19420     }else if( p->errCode==SQLITE_OK ){
  19421       pStmt = p->pGetPage;
  19422     }
  19423 
  19424     if( pStmt ){
  19425       sqlite3_bind_int64(pStmt, 1, pgno);
  19426       if( SQLITE_ROW==sqlite3_step(pStmt) ){
  19427         const u8 *aPg;
  19428         int nPg;
  19429         assert( p->errCode==SQLITE_OK );
  19430         aPg = sqlite3_column_blob(pStmt, 0);
  19431         nPg = sqlite3_column_bytes(pStmt, 0);
  19432         if( pgno==1 && nPg==p->pgsz && 0==memcmp(p->pPage1Cache, aPg, nPg) ){
  19433           aPg = p->pPage1Disk;
  19434         }
  19435         sqlite3_result_blob(pCtx, aPg, nPg-p->nReserve, SQLITE_TRANSIENT);
  19436       }
  19437       recoverReset(p, pStmt);
  19438     }
  19439   }
  19440 
  19441   if( p->errCode ){
  19442     if( p->zErrMsg ) sqlite3_result_error(pCtx, p->zErrMsg, -1);
  19443     sqlite3_result_error_code(pCtx, p->errCode);
  19444   }
  19445 }
  19446 
  19447 /*
  19448 ** Find a string that is not found anywhere in z[].  Return a pointer
  19449 ** to that string.
  19450 **
  19451 ** Try to use zA and zB first.  If both of those are already found in z[]
  19452 ** then make up some string and store it in the buffer zBuf.
  19453 */
  19454 static const char *recoverUnusedString(
  19455   const char *z,                    /* Result must not appear anywhere in z */
  19456   const char *zA, const char *zB,   /* Try these first */
  19457   char *zBuf                        /* Space to store a generated string */
  19458 ){
  19459   unsigned i = 0;
  19460   if( strstr(z, zA)==0 ) return zA;
  19461   if( strstr(z, zB)==0 ) return zB;
  19462   do{
  19463     sqlite3_snprintf(20,zBuf,"(%s%u)", zA, i++);
  19464   }while( strstr(z,zBuf)!=0 );
  19465   return zBuf;
  19466 }
  19467 
  19468 /*
  19469 ** Implementation of scalar SQL function "escape_crlf".  The argument passed to
  19470 ** this function is the output of built-in function quote(). If the first
  19471 ** character of the input is "'", indicating that the value passed to quote()
  19472 ** was a text value, then this function searches the input for "\n" and "\r"
  19473 ** characters and adds a wrapper similar to the following:
  19474 **
  19475 **   replace(replace(<input>, '\n', char(10), '\r', char(13));
  19476 **
  19477 ** Or, if the first character of the input is not "'", then a copy of the input
  19478 ** is returned.
  19479 */
  19480 static void recoverEscapeCrlf(
  19481   sqlite3_context *context, 
  19482   int argc, 
  19483   sqlite3_value **argv
  19484 ){
  19485   const char *zText = (const char*)sqlite3_value_text(argv[0]);
  19486   (void)argc;
  19487   if( zText && zText[0]=='\'' ){
  19488     int nText = sqlite3_value_bytes(argv[0]);
  19489     int i;
  19490     char zBuf1[20];
  19491     char zBuf2[20];
  19492     const char *zNL = 0;
  19493     const char *zCR = 0;
  19494     int nCR = 0;
  19495     int nNL = 0;
  19496 
  19497     for(i=0; zText[i]; i++){
  19498       if( zNL==0 && zText[i]=='\n' ){
  19499         zNL = recoverUnusedString(zText, "\\n", "\\012", zBuf1);
  19500         nNL = (int)strlen(zNL);
  19501       }
  19502       if( zCR==0 && zText[i]=='\r' ){
  19503         zCR = recoverUnusedString(zText, "\\r", "\\015", zBuf2);
  19504         nCR = (int)strlen(zCR);
  19505       }
  19506     }
  19507 
  19508     if( zNL || zCR ){
  19509       int iOut = 0;
  19510       i64 nMax = (nNL > nCR) ? nNL : nCR;
  19511       i64 nAlloc = nMax * nText + (nMax+64)*2;
  19512       char *zOut = (char*)sqlite3_malloc64(nAlloc);
  19513       if( zOut==0 ){
  19514         sqlite3_result_error_nomem(context);
  19515         return;
  19516       }
  19517 
  19518       if( zNL && zCR ){
  19519         memcpy(&zOut[iOut], "replace(replace(", 16);
  19520         iOut += 16;
  19521       }else{
  19522         memcpy(&zOut[iOut], "replace(", 8);
  19523         iOut += 8;
  19524       }
  19525       for(i=0; zText[i]; i++){
  19526         if( zText[i]=='\n' ){
  19527           memcpy(&zOut[iOut], zNL, nNL);
  19528           iOut += nNL;
  19529         }else if( zText[i]=='\r' ){
  19530           memcpy(&zOut[iOut], zCR, nCR);
  19531           iOut += nCR;
  19532         }else{
  19533           zOut[iOut] = zText[i];
  19534           iOut++;
  19535         }
  19536       }
  19537 
  19538       if( zNL ){
  19539         memcpy(&zOut[iOut], ",'", 2); iOut += 2;
  19540         memcpy(&zOut[iOut], zNL, nNL); iOut += nNL;
  19541         memcpy(&zOut[iOut], "', char(10))", 12); iOut += 12;
  19542       }
  19543       if( zCR ){
  19544         memcpy(&zOut[iOut], ",'", 2); iOut += 2;
  19545         memcpy(&zOut[iOut], zCR, nCR); iOut += nCR;
  19546         memcpy(&zOut[iOut], "', char(13))", 12); iOut += 12;
  19547       }
  19548 
  19549       sqlite3_result_text(context, zOut, iOut, SQLITE_TRANSIENT);
  19550       sqlite3_free(zOut);
  19551       return;
  19552     }
  19553   }
  19554 
  19555   sqlite3_result_value(context, argv[0]);
  19556 }
  19557 
  19558 /*
  19559 ** This function is a no-op if recover handle p already contains an error
  19560 ** (if p->errCode!=SQLITE_OK). A copy of the error code is returned in
  19561 ** this case. 
  19562 **
  19563 ** Otherwise, attempt to populate temporary table "recovery.schema" with the
  19564 ** parts of the database schema that can be extracted from the input database.
  19565 **
  19566 ** If no error occurs, SQLITE_OK is returned. Otherwise, an error code
  19567 ** and error message are left in the recover handle and a copy of the
  19568 ** error code returned. It is not considered an error if part of all of
  19569 ** the database schema cannot be recovered due to corruption.
  19570 */
  19571 static int recoverCacheSchema(sqlite3_recover *p){
  19572   return recoverExec(p, p->dbOut,
  19573     "WITH RECURSIVE pages(p) AS ("
  19574     "  SELECT 1"
  19575     "    UNION"
  19576     "  SELECT child FROM sqlite_dbptr('getpage()'), pages WHERE pgno=p"
  19577     ")"
  19578     "INSERT INTO recovery.schema SELECT"
  19579     "  max(CASE WHEN field=0 THEN value ELSE NULL END),"
  19580     "  max(CASE WHEN field=1 THEN value ELSE NULL END),"
  19581     "  max(CASE WHEN field=2 THEN value ELSE NULL END),"
  19582     "  max(CASE WHEN field=3 THEN value ELSE NULL END),"
  19583     "  max(CASE WHEN field=4 THEN value ELSE NULL END)"
  19584     "FROM sqlite_dbdata('getpage()') WHERE pgno IN ("
  19585     "  SELECT p FROM pages"
  19586     ") GROUP BY pgno, cell"
  19587   );
  19588 }
  19589 
  19590 /*
  19591 ** If this recover handle is not in SQL callback mode (i.e. was not created 
  19592 ** using sqlite3_recover_init_sql()) of if an error has already occurred, 
  19593 ** this function is a no-op. Otherwise, issue a callback with SQL statement
  19594 ** zSql as the parameter. 
  19595 **
  19596 ** If the callback returns non-zero, set the recover handle error code to
  19597 ** the value returned (so that the caller will abandon processing).
  19598 */
  19599 static void recoverSqlCallback(sqlite3_recover *p, const char *zSql){
  19600   if( p->errCode==SQLITE_OK && p->xSql ){
  19601     int res = p->xSql(p->pSqlCtx, zSql);
  19602     if( res ){
  19603       recoverError(p, SQLITE_ERROR, "callback returned an error - %d", res);
  19604     }
  19605   }
  19606 }
  19607 
  19608 /*
  19609 ** Transfer the following settings from the input database to the output
  19610 ** database:
  19611 **
  19612 **   + page-size,
  19613 **   + auto-vacuum settings,
  19614 **   + database encoding,
  19615 **   + user-version (PRAGMA user_version), and
  19616 **   + application-id (PRAGMA application_id), and
  19617 */
  19618 static void recoverTransferSettings(sqlite3_recover *p){
  19619   const char *aPragma[] = {
  19620     "encoding",
  19621     "page_size",
  19622     "auto_vacuum",
  19623     "user_version",
  19624     "application_id"
  19625   };
  19626   int ii;
  19627 
  19628   /* Truncate the output database to 0 pages in size. This is done by 
  19629   ** opening a new, empty, temp db, then using the backup API to clobber 
  19630   ** any existing output db with a copy of it. */
  19631   if( p->errCode==SQLITE_OK ){
  19632     sqlite3 *db2 = 0;
  19633     int rc = sqlite3_open("", &db2);
  19634     if( rc!=SQLITE_OK ){
  19635       recoverDbError(p, db2);
  19636       return;
  19637     }
  19638 
  19639     for(ii=0; ii<(int)(sizeof(aPragma)/sizeof(aPragma[0])); ii++){
  19640       const char *zPrag = aPragma[ii];
  19641       sqlite3_stmt *p1 = 0;
  19642       p1 = recoverPreparePrintf(p, p->dbIn, "PRAGMA %Q.%s", p->zDb, zPrag);
  19643       if( p->errCode==SQLITE_OK && sqlite3_step(p1)==SQLITE_ROW ){
  19644         const char *zArg = (const char*)sqlite3_column_text(p1, 0);
  19645         char *z2 = recoverMPrintf(p, "PRAGMA %s = %Q", zPrag, zArg);
  19646         recoverSqlCallback(p, z2);
  19647         recoverExec(p, db2, z2);
  19648         sqlite3_free(z2);
  19649         if( zArg==0 ){
  19650           recoverError(p, SQLITE_NOMEM, 0);
  19651         }
  19652       }
  19653       recoverFinalize(p, p1);
  19654     }
  19655     recoverExec(p, db2, "CREATE TABLE t1(a); DROP TABLE t1;");
  19656 
  19657     if( p->errCode==SQLITE_OK ){
  19658       sqlite3 *db = p->dbOut;
  19659       sqlite3_backup *pBackup = sqlite3_backup_init(db, "main", db2, "main");
  19660       if( pBackup ){
  19661         sqlite3_backup_step(pBackup, -1);
  19662         p->errCode = sqlite3_backup_finish(pBackup);
  19663       }else{
  19664         recoverDbError(p, db);
  19665       }
  19666     }
  19667 
  19668     sqlite3_close(db2);
  19669   }
  19670 }
  19671 
  19672 /*
  19673 ** This function is a no-op if recover handle p already contains an error
  19674 ** (if p->errCode!=SQLITE_OK). A copy of the error code is returned in
  19675 ** this case. 
  19676 **
  19677 ** Otherwise, an attempt is made to open the output database, attach
  19678 ** and create the schema of the temporary database used to store
  19679 ** intermediate data, and to register all required user functions and
  19680 ** virtual table modules with the output handle.
  19681 **
  19682 ** If no error occurs, SQLITE_OK is returned. Otherwise, an error code
  19683 ** and error message are left in the recover handle and a copy of the
  19684 ** error code returned.
  19685 */
  19686 static int recoverOpenOutput(sqlite3_recover *p){
  19687   struct Func {
  19688     const char *zName;
  19689     int nArg;
  19690     void (*xFunc)(sqlite3_context*,int,sqlite3_value **);
  19691   } aFunc[] = {
  19692     { "getpage", 1, recoverGetPage },
  19693     { "page_is_used", 1, recoverPageIsUsed },
  19694     { "read_i32", 2, recoverReadI32 },
  19695     { "escape_crlf", 1, recoverEscapeCrlf },
  19696   };
  19697 
  19698   const int flags = SQLITE_OPEN_URI|SQLITE_OPEN_CREATE|SQLITE_OPEN_READWRITE;
  19699   sqlite3 *db = 0;                /* New database handle */
  19700   int ii;                         /* For iterating through aFunc[] */
  19701 
  19702   assert( p->dbOut==0 );
  19703 
  19704   if( sqlite3_open_v2(p->zUri, &db, flags, 0) ){
  19705     recoverDbError(p, db);
  19706   }
  19707 
  19708   /* Register the sqlite_dbdata and sqlite_dbptr virtual table modules.
  19709   ** These two are registered with the output database handle - this
  19710   ** module depends on the input handle supporting the sqlite_dbpage
  19711   ** virtual table only.  */
  19712   if( p->errCode==SQLITE_OK ){
  19713     p->errCode = sqlite3_dbdata_init(db, 0, 0);
  19714   }
  19715 
  19716   /* Register the custom user-functions with the output handle. */
  19717   for(ii=0;
  19718       p->errCode==SQLITE_OK && ii<(int)(sizeof(aFunc)/sizeof(aFunc[0]));
  19719       ii++){
  19720     p->errCode = sqlite3_create_function(db, aFunc[ii].zName, 
  19721         aFunc[ii].nArg, SQLITE_UTF8, (void*)p, aFunc[ii].xFunc, 0, 0
  19722     );
  19723   }
  19724 
  19725   p->dbOut = db;
  19726   return p->errCode;
  19727 }
  19728 
  19729 /*
  19730 ** Attach the auxiliary database 'recovery' to the output database handle.
  19731 ** This temporary database is used during the recovery process and then 
  19732 ** discarded.
  19733 */
  19734 static void recoverOpenRecovery(sqlite3_recover *p){
  19735   char *zSql = recoverMPrintf(p, "ATTACH %Q AS recovery;", p->zStateDb);
  19736   recoverExec(p, p->dbOut, zSql);
  19737   recoverExec(p, p->dbOut,
  19738       "PRAGMA writable_schema = 1;"
  19739       "CREATE TABLE recovery.map(pgno INTEGER PRIMARY KEY, parent INT);" 
  19740       "CREATE TABLE recovery.schema(type, name, tbl_name, rootpage, sql);"
  19741   );
  19742   sqlite3_free(zSql);
  19743 }
  19744 
  19745 
  19746 /*
  19747 ** This function is a no-op if recover handle p already contains an error
  19748 ** (if p->errCode!=SQLITE_OK).
  19749 **
  19750 ** Otherwise, argument zName must be the name of a table that has just been
  19751 ** created in the output database. This function queries the output db
  19752 ** for the schema of said table, and creates a RecoverTable object to
  19753 ** store the schema in memory. The new RecoverTable object is linked into
  19754 ** the list at sqlite3_recover.pTblList.
  19755 **
  19756 ** Parameter iRoot must be the root page of table zName in the INPUT 
  19757 ** database.
  19758 */
  19759 static void recoverAddTable(
  19760   sqlite3_recover *p, 
  19761   const char *zName,              /* Name of table created in output db */
  19762   i64 iRoot                       /* Root page of same table in INPUT db */
  19763 ){
  19764   sqlite3_stmt *pStmt = recoverPreparePrintf(p, p->dbOut, 
  19765       "PRAGMA table_xinfo(%Q)", zName
  19766   );
  19767 
  19768   if( pStmt ){
  19769     int iPk = -1;
  19770     int iBind = 1;
  19771     RecoverTable *pNew = 0;
  19772     int nCol = 0;
  19773     int nName = recoverStrlen(zName);
  19774     int nByte = 0;
  19775     while( sqlite3_step(pStmt)==SQLITE_ROW ){
  19776       nCol++;
  19777       nByte += (sqlite3_column_bytes(pStmt, 1)+1);
  19778     }
  19779     nByte += sizeof(RecoverTable) + nCol*sizeof(RecoverColumn) + nName+1;
  19780     recoverReset(p, pStmt);
  19781 
  19782     pNew = recoverMalloc(p, nByte);
  19783     if( pNew ){
  19784       int i = 0;
  19785       int iField = 0;
  19786       char *csr = 0;
  19787       pNew->aCol = (RecoverColumn*)&pNew[1];
  19788       pNew->zTab = csr = (char*)&pNew->aCol[nCol];
  19789       pNew->nCol = nCol;
  19790       pNew->iRoot = iRoot;
  19791       memcpy(csr, zName, nName);
  19792       csr += nName+1;
  19793 
  19794       for(i=0; sqlite3_step(pStmt)==SQLITE_ROW; i++){
  19795         int iPKF = sqlite3_column_int(pStmt, 5);
  19796         int n = sqlite3_column_bytes(pStmt, 1);
  19797         const char *z = (const char*)sqlite3_column_text(pStmt, 1);
  19798         const char *zType = (const char*)sqlite3_column_text(pStmt, 2);
  19799         int eHidden = sqlite3_column_int(pStmt, 6);
  19800 
  19801         if( iPk==-1 && iPKF==1 && !sqlite3_stricmp("integer", zType) ) iPk = i;
  19802         if( iPKF>1 ) iPk = -2;
  19803         pNew->aCol[i].zCol = csr;
  19804         pNew->aCol[i].eHidden = eHidden;
  19805         if( eHidden==RECOVER_EHIDDEN_VIRTUAL ){
  19806           pNew->aCol[i].iField = -1;
  19807         }else{
  19808           pNew->aCol[i].iField = iField++;
  19809         }
  19810         if( eHidden!=RECOVER_EHIDDEN_VIRTUAL
  19811          && eHidden!=RECOVER_EHIDDEN_STORED
  19812         ){
  19813           pNew->aCol[i].iBind = iBind++;
  19814         }
  19815         memcpy(csr, z, n);
  19816         csr += (n+1);
  19817       }
  19818 
  19819       pNew->pNext = p->pTblList;
  19820       p->pTblList = pNew;
  19821       pNew->bIntkey = 1;
  19822     }
  19823 
  19824     recoverFinalize(p, pStmt);
  19825 
  19826     pStmt = recoverPreparePrintf(p, p->dbOut, "PRAGMA index_xinfo(%Q)", zName);
  19827     while( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
  19828       int iField = sqlite3_column_int(pStmt, 0);
  19829       int iCol = sqlite3_column_int(pStmt, 1);
  19830 
  19831       assert( iCol<pNew->nCol );
  19832       pNew->aCol[iCol].iField = iField;
  19833 
  19834       pNew->bIntkey = 0;
  19835       iPk = -2;
  19836     }
  19837     recoverFinalize(p, pStmt);
  19838 
  19839     if( p->errCode==SQLITE_OK ){
  19840       if( iPk>=0 ){
  19841         pNew->aCol[iPk].bIPK = 1;
  19842       }else if( pNew->bIntkey ){
  19843         pNew->iRowidBind = iBind++;
  19844       }
  19845     }
  19846   }
  19847 }
  19848 
  19849 /*
  19850 ** This function is called after recoverCacheSchema() has cached those parts
  19851 ** of the input database schema that could be recovered in temporary table
  19852 ** "recovery.schema". This function creates in the output database copies
  19853 ** of all parts of that schema that must be created before the tables can
  19854 ** be populated. Specifically, this means:
  19855 **
  19856 **     * all tables that are not VIRTUAL, and
  19857 **     * UNIQUE indexes.
  19858 **
  19859 ** If the recovery handle uses SQL callbacks, then callbacks containing
  19860 ** the associated "CREATE TABLE" and "CREATE INDEX" statements are made.
  19861 **
  19862 ** Additionally, records are added to the sqlite_schema table of the
  19863 ** output database for any VIRTUAL tables. The CREATE VIRTUAL TABLE
  19864 ** records are written directly to sqlite_schema, not actually executed.
  19865 ** If the handle is in SQL callback mode, then callbacks are invoked 
  19866 ** with equivalent SQL statements.
  19867 */
  19868 static int recoverWriteSchema1(sqlite3_recover *p){
  19869   sqlite3_stmt *pSelect = 0;
  19870   sqlite3_stmt *pTblname = 0;
  19871 
  19872   pSelect = recoverPrepare(p, p->dbOut,
  19873       "WITH dbschema(rootpage, name, sql, tbl, isVirtual, isIndex) AS ("
  19874       "  SELECT rootpage, name, sql, "
  19875       "    type='table', "
  19876       "    sql LIKE 'create virtual%',"
  19877       "    (type='index' AND (sql LIKE '%unique%' OR ?1))"
  19878       "  FROM recovery.schema"
  19879       ")"
  19880       "SELECT rootpage, tbl, isVirtual, name, sql"
  19881       " FROM dbschema "
  19882       "  WHERE tbl OR isIndex"
  19883       "  ORDER BY tbl DESC, name=='sqlite_sequence' DESC"
  19884   );
  19885 
  19886   pTblname = recoverPrepare(p, p->dbOut,
  19887       "SELECT name FROM sqlite_schema "
  19888       "WHERE type='table' ORDER BY rowid DESC LIMIT 1"
  19889   );
  19890 
  19891   if( pSelect ){
  19892     sqlite3_bind_int(pSelect, 1, p->bSlowIndexes);
  19893     while( sqlite3_step(pSelect)==SQLITE_ROW ){
  19894       i64 iRoot = sqlite3_column_int64(pSelect, 0);
  19895       int bTable = sqlite3_column_int(pSelect, 1);
  19896       int bVirtual = sqlite3_column_int(pSelect, 2);
  19897       const char *zName = (const char*)sqlite3_column_text(pSelect, 3);
  19898       const char *zSql = (const char*)sqlite3_column_text(pSelect, 4);
  19899       char *zFree = 0;
  19900       int rc = SQLITE_OK;
  19901 
  19902       if( bVirtual ){
  19903         zSql = (const char*)(zFree = recoverMPrintf(p,
  19904             "INSERT INTO sqlite_schema VALUES('table', %Q, %Q, 0, %Q)",
  19905             zName, zName, zSql
  19906         ));
  19907       }
  19908       rc = sqlite3_exec(p->dbOut, zSql, 0, 0, 0);
  19909       if( rc==SQLITE_OK ){
  19910         recoverSqlCallback(p, zSql);
  19911         if( bTable && !bVirtual ){
  19912           if( SQLITE_ROW==sqlite3_step(pTblname) ){
  19913             const char *zTbl = (const char*)sqlite3_column_text(pTblname, 0);
  19914             if( zTbl ) recoverAddTable(p, zTbl, iRoot);
  19915           }
  19916           recoverReset(p, pTblname);
  19917         }
  19918       }else if( rc!=SQLITE_ERROR ){
  19919         recoverDbError(p, p->dbOut);
  19920       }
  19921       sqlite3_free(zFree);
  19922     }
  19923   }
  19924   recoverFinalize(p, pSelect);
  19925   recoverFinalize(p, pTblname);
  19926 
  19927   return p->errCode;
  19928 }
  19929 
  19930 /*
  19931 ** This function is called after the output database has been populated. It
  19932 ** adds all recovered schema elements that were not created in the output
  19933 ** database by recoverWriteSchema1() - everything except for tables and
  19934 ** UNIQUE indexes. Specifically:
  19935 **
  19936 **     * views,
  19937 **     * triggers,
  19938 **     * non-UNIQUE indexes.
  19939 **
  19940 ** If the recover handle is in SQL callback mode, then equivalent callbacks
  19941 ** are issued to create the schema elements.
  19942 */
  19943 static int recoverWriteSchema2(sqlite3_recover *p){
  19944   sqlite3_stmt *pSelect = 0;
  19945 
  19946   pSelect = recoverPrepare(p, p->dbOut,
  19947       p->bSlowIndexes ?
  19948       "SELECT rootpage, sql FROM recovery.schema "
  19949       "  WHERE type!='table' AND type!='index'"
  19950       :
  19951       "SELECT rootpage, sql FROM recovery.schema "
  19952       "  WHERE type!='table' AND (type!='index' OR sql NOT LIKE '%unique%')"
  19953   );
  19954 
  19955   if( pSelect ){
  19956     while( sqlite3_step(pSelect)==SQLITE_ROW ){
  19957       const char *zSql = (const char*)sqlite3_column_text(pSelect, 1);
  19958       int rc = sqlite3_exec(p->dbOut, zSql, 0, 0, 0);
  19959       if( rc==SQLITE_OK ){
  19960         recoverSqlCallback(p, zSql);
  19961       }else if( rc!=SQLITE_ERROR ){
  19962         recoverDbError(p, p->dbOut);
  19963       }
  19964     }
  19965   }
  19966   recoverFinalize(p, pSelect);
  19967 
  19968   return p->errCode;
  19969 }
  19970 
  19971 /*
  19972 ** This function is a no-op if recover handle p already contains an error
  19973 ** (if p->errCode!=SQLITE_OK). In this case it returns NULL.
  19974 **
  19975 ** Otherwise, if the recover handle is configured to create an output
  19976 ** database (was created by sqlite3_recover_init()), then this function
  19977 ** prepares and returns an SQL statement to INSERT a new record into table
  19978 ** pTab, assuming the first nField fields of a record extracted from disk
  19979 ** are valid.
  19980 **
  19981 ** For example, if table pTab is:
  19982 **
  19983 **     CREATE TABLE name(a, b GENERATED ALWAYS AS (a+1) STORED, c, d, e);
  19984 **
  19985 ** And nField is 4, then the SQL statement prepared and returned is:
  19986 **
  19987 **     INSERT INTO (a, c, d) VALUES (?1, ?2, ?3);
  19988 **
  19989 ** In this case even though 4 values were extracted from the input db,
  19990 ** only 3 are written to the output, as the generated STORED column 
  19991 ** cannot be written.
  19992 **
  19993 ** If the recover handle is in SQL callback mode, then the SQL statement
  19994 ** prepared is such that evaluating it returns a single row containing
  19995 ** a single text value - itself an SQL statement similar to the above,
  19996 ** except with SQL literals in place of the variables. For example:
  19997 **
  19998 **     SELECT 'INSERT INTO (a, c, d) VALUES (' 
  19999 **          || quote(?1) || ', '
  20000 **          || quote(?2) || ', '
  20001 **          || quote(?3) || ')';
  20002 **
  20003 ** In either case, it is the responsibility of the caller to eventually
  20004 ** free the statement handle using sqlite3_finalize().
  20005 */
  20006 static sqlite3_stmt *recoverInsertStmt(
  20007   sqlite3_recover *p, 
  20008   RecoverTable *pTab,
  20009   int nField
  20010 ){
  20011   sqlite3_stmt *pRet = 0;
  20012   const char *zSep = "";
  20013   const char *zSqlSep = "";
  20014   char *zSql = 0;
  20015   char *zFinal = 0;
  20016   char *zBind = 0;
  20017   int ii;
  20018   int bSql = p->xSql ? 1 : 0;
  20019 
  20020   if( nField<=0 ) return 0;
  20021 
  20022   assert( nField<=pTab->nCol );
  20023 
  20024   zSql = recoverMPrintf(p, "INSERT OR IGNORE INTO %Q(", pTab->zTab);
  20025 
  20026   if( pTab->iRowidBind ){
  20027     assert( pTab->bIntkey );
  20028     zSql = recoverMPrintf(p, "%z_rowid_", zSql);
  20029     if( bSql ){
  20030       zBind = recoverMPrintf(p, "%zquote(?%d)", zBind, pTab->iRowidBind);
  20031     }else{
  20032       zBind = recoverMPrintf(p, "%z?%d", zBind, pTab->iRowidBind);
  20033     }
  20034     zSqlSep = "||', '||";
  20035     zSep = ", ";
  20036   }
  20037 
  20038   for(ii=0; ii<nField; ii++){
  20039     int eHidden = pTab->aCol[ii].eHidden;
  20040     if( eHidden!=RECOVER_EHIDDEN_VIRTUAL
  20041      && eHidden!=RECOVER_EHIDDEN_STORED
  20042     ){
  20043       assert( pTab->aCol[ii].iField>=0 && pTab->aCol[ii].iBind>=1 );
  20044       zSql = recoverMPrintf(p, "%z%s%Q", zSql, zSep, pTab->aCol[ii].zCol);
  20045 
  20046       if( bSql ){
  20047         zBind = recoverMPrintf(p, 
  20048             "%z%sescape_crlf(quote(?%d))", zBind, zSqlSep, pTab->aCol[ii].iBind
  20049         );
  20050         zSqlSep = "||', '||";
  20051       }else{
  20052         zBind = recoverMPrintf(p, "%z%s?%d", zBind, zSep, pTab->aCol[ii].iBind);
  20053       }
  20054       zSep = ", ";
  20055     }
  20056   }
  20057 
  20058   if( bSql ){
  20059     zFinal = recoverMPrintf(p, "SELECT %Q || ') VALUES (' || %s || ')'", 
  20060         zSql, zBind
  20061     );
  20062   }else{
  20063     zFinal = recoverMPrintf(p, "%s) VALUES (%s)", zSql, zBind);
  20064   }
  20065 
  20066   pRet = recoverPrepare(p, p->dbOut, zFinal);
  20067   sqlite3_free(zSql);
  20068   sqlite3_free(zBind);
  20069   sqlite3_free(zFinal);
  20070   
  20071   return pRet;
  20072 }
  20073 
  20074 
  20075 /*
  20076 ** Search the list of RecoverTable objects at p->pTblList for one that
  20077 ** has root page iRoot in the input database. If such an object is found,
  20078 ** return a pointer to it. Otherwise, return NULL.
  20079 */
  20080 static RecoverTable *recoverFindTable(sqlite3_recover *p, u32 iRoot){
  20081   RecoverTable *pRet = 0;
  20082   for(pRet=p->pTblList; pRet && pRet->iRoot!=iRoot; pRet=pRet->pNext);
  20083   return pRet;
  20084 }
  20085 
  20086 /*
  20087 ** This function attempts to create a lost and found table within the 
  20088 ** output db. If successful, it returns a pointer to a buffer containing
  20089 ** the name of the new table. It is the responsibility of the caller to
  20090 ** eventually free this buffer using sqlite3_free().
  20091 **
  20092 ** If an error occurs, NULL is returned and an error code and error 
  20093 ** message left in the recover handle.
  20094 */
  20095 static char *recoverLostAndFoundCreate(
  20096   sqlite3_recover *p,             /* Recover object */
  20097   int nField                      /* Number of column fields in new table */
  20098 ){
  20099   char *zTbl = 0;
  20100   sqlite3_stmt *pProbe = 0;
  20101   int ii = 0;
  20102 
  20103   pProbe = recoverPrepare(p, p->dbOut,
  20104     "SELECT 1 FROM sqlite_schema WHERE name=?"
  20105   );
  20106   for(ii=-1; zTbl==0 && p->errCode==SQLITE_OK && ii<1000; ii++){
  20107     int bFail = 0;
  20108     if( ii<0 ){
  20109       zTbl = recoverMPrintf(p, "%s", p->zLostAndFound);
  20110     }else{
  20111       zTbl = recoverMPrintf(p, "%s_%d", p->zLostAndFound, ii);
  20112     }
  20113 
  20114     if( p->errCode==SQLITE_OK ){
  20115       sqlite3_bind_text(pProbe, 1, zTbl, -1, SQLITE_STATIC);
  20116       if( SQLITE_ROW==sqlite3_step(pProbe) ){
  20117         bFail = 1;
  20118       }
  20119       recoverReset(p, pProbe);
  20120     }
  20121 
  20122     if( bFail ){
  20123       sqlite3_clear_bindings(pProbe);
  20124       sqlite3_free(zTbl);
  20125       zTbl = 0;
  20126     }
  20127   }
  20128   recoverFinalize(p, pProbe);
  20129 
  20130   if( zTbl ){
  20131     const char *zSep = 0;
  20132     char *zField = 0;
  20133     char *zSql = 0;
  20134 
  20135     zSep = "rootpgno INTEGER, pgno INTEGER, nfield INTEGER, id INTEGER, ";
  20136     for(ii=0; p->errCode==SQLITE_OK && ii<nField; ii++){
  20137       zField = recoverMPrintf(p, "%z%sc%d", zField, zSep, ii);
  20138       zSep = ", ";
  20139     }
  20140 
  20141     zSql = recoverMPrintf(p, "CREATE TABLE %s(%s)", zTbl, zField);
  20142     sqlite3_free(zField);
  20143 
  20144     recoverExec(p, p->dbOut, zSql);
  20145     recoverSqlCallback(p, zSql);
  20146     sqlite3_free(zSql);
  20147   }else if( p->errCode==SQLITE_OK ){
  20148     recoverError(
  20149         p, SQLITE_ERROR, "failed to create %s output table", p->zLostAndFound
  20150     );
  20151   }
  20152 
  20153   return zTbl;
  20154 }
  20155 
  20156 /*
  20157 ** Synthesize and prepare an INSERT statement to write to the lost_and_found
  20158 ** table in the output database. The name of the table is zTab, and it has
  20159 ** nField c* fields.
  20160 */
  20161 static sqlite3_stmt *recoverLostAndFoundInsert(
  20162   sqlite3_recover *p,
  20163   const char *zTab,
  20164   int nField
  20165 ){
  20166   int nTotal = nField + 4;
  20167   int ii;
  20168   char *zBind = 0;
  20169   sqlite3_stmt *pRet = 0;
  20170 
  20171   if( p->xSql==0 ){
  20172     for(ii=0; ii<nTotal; ii++){
  20173       zBind = recoverMPrintf(p, "%z%s?", zBind, zBind?", ":"", ii);
  20174     }
  20175     pRet = recoverPreparePrintf(
  20176         p, p->dbOut, "INSERT INTO %s VALUES(%s)", zTab, zBind
  20177     );
  20178   }else{
  20179     const char *zSep = "";
  20180     for(ii=0; ii<nTotal; ii++){
  20181       zBind = recoverMPrintf(p, "%z%squote(?)", zBind, zSep);
  20182       zSep = "|| ', ' ||";
  20183     }
  20184     pRet = recoverPreparePrintf(
  20185         p, p->dbOut, "SELECT 'INSERT INTO %s VALUES(' || %s || ')'", zTab, zBind
  20186     );
  20187   }
  20188 
  20189   sqlite3_free(zBind);
  20190   return pRet;
  20191 }
  20192 
  20193 /*
  20194 ** Input database page iPg contains data that will be written to the
  20195 ** lost-and-found table of the output database. This function attempts
  20196 ** to identify the root page of the tree that page iPg belonged to.
  20197 ** If successful, it sets output variable (*piRoot) to the page number
  20198 ** of the root page and returns SQLITE_OK. Otherwise, if an error occurs,
  20199 ** an SQLite error code is returned and the final value of *piRoot 
  20200 ** undefined.
  20201 */
  20202 static int recoverLostAndFoundFindRoot(
  20203   sqlite3_recover *p, 
  20204   i64 iPg,
  20205   i64 *piRoot
  20206 ){
  20207   RecoverStateLAF *pLaf = &p->laf;
  20208 
  20209   if( pLaf->pFindRoot==0 ){
  20210     pLaf->pFindRoot = recoverPrepare(p, p->dbOut,
  20211         "WITH RECURSIVE p(pgno) AS ("
  20212         "  SELECT ?"
  20213         "    UNION"
  20214         "  SELECT parent FROM recovery.map AS m, p WHERE m.pgno=p.pgno"
  20215         ") "
  20216         "SELECT p.pgno FROM p, recovery.map m WHERE m.pgno=p.pgno "
  20217         "    AND m.parent IS NULL"
  20218     );
  20219   }
  20220   if( p->errCode==SQLITE_OK ){
  20221     sqlite3_bind_int64(pLaf->pFindRoot, 1, iPg);
  20222     if( sqlite3_step(pLaf->pFindRoot)==SQLITE_ROW ){
  20223       *piRoot = sqlite3_column_int64(pLaf->pFindRoot, 0);
  20224     }else{
  20225       *piRoot = iPg;
  20226     }
  20227     recoverReset(p, pLaf->pFindRoot);
  20228   }
  20229   return p->errCode;
  20230 }
  20231 
  20232 /*
  20233 ** Recover data from page iPage of the input database and write it to
  20234 ** the lost-and-found table in the output database.
  20235 */
  20236 static void recoverLostAndFoundOnePage(sqlite3_recover *p, i64 iPage){
  20237   RecoverStateLAF *pLaf = &p->laf;
  20238   sqlite3_value **apVal = pLaf->apVal;
  20239   sqlite3_stmt *pPageData = pLaf->pPageData;
  20240   sqlite3_stmt *pInsert = pLaf->pInsert;
  20241 
  20242   int nVal = -1;
  20243   int iPrevCell = 0;
  20244   i64 iRoot = 0;
  20245   int bHaveRowid = 0;
  20246   i64 iRowid = 0;
  20247   int ii = 0;
  20248 
  20249   if( recoverLostAndFoundFindRoot(p, iPage, &iRoot) ) return;
  20250   sqlite3_bind_int64(pPageData, 1, iPage);
  20251   while( p->errCode==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPageData) ){
  20252     int iCell = sqlite3_column_int64(pPageData, 0);
  20253     int iField = sqlite3_column_int64(pPageData, 1);
  20254 
  20255     if( iPrevCell!=iCell && nVal>=0 ){
  20256       /* Insert the new row */
  20257       sqlite3_bind_int64(pInsert, 1, iRoot);      /* rootpgno */
  20258       sqlite3_bind_int64(pInsert, 2, iPage);      /* pgno */
  20259       sqlite3_bind_int(pInsert, 3, nVal);         /* nfield */
  20260       if( bHaveRowid ){
  20261         sqlite3_bind_int64(pInsert, 4, iRowid);   /* id */
  20262       }
  20263       for(ii=0; ii<nVal; ii++){
  20264         recoverBindValue(p, pInsert, 5+ii, apVal[ii]);
  20265       }
  20266       if( sqlite3_step(pInsert)==SQLITE_ROW ){
  20267         recoverSqlCallback(p, (const char*)sqlite3_column_text(pInsert, 0));
  20268       }
  20269       recoverReset(p, pInsert);
  20270 
  20271       /* Discard the accumulated row data */
  20272       for(ii=0; ii<nVal; ii++){
  20273         sqlite3_value_free(apVal[ii]);
  20274         apVal[ii] = 0;
  20275       }
  20276       sqlite3_clear_bindings(pInsert);
  20277       bHaveRowid = 0;
  20278       nVal = -1;
  20279     }
  20280 
  20281     if( iCell<0 ) break;
  20282 
  20283     if( iField<0 ){
  20284       assert( nVal==-1 );
  20285       iRowid = sqlite3_column_int64(pPageData, 2);
  20286       bHaveRowid = 1;
  20287       nVal = 0;
  20288     }else if( iField<pLaf->nMaxField ){
  20289       sqlite3_value *pVal = sqlite3_column_value(pPageData, 2);
  20290       apVal[iField] = sqlite3_value_dup(pVal);
  20291       assert( iField==nVal || (nVal==-1 && iField==0) );
  20292       nVal = iField+1;
  20293       if( apVal[iField]==0 ){
  20294         recoverError(p, SQLITE_NOMEM, 0);
  20295       }
  20296     }
  20297 
  20298     iPrevCell = iCell;
  20299   }
  20300   recoverReset(p, pPageData);
  20301 
  20302   for(ii=0; ii<nVal; ii++){
  20303     sqlite3_value_free(apVal[ii]);
  20304     apVal[ii] = 0;
  20305   }
  20306 }
  20307 
  20308 /*
  20309 ** Perform one step (sqlite3_recover_step()) of work for the connection 
  20310 ** passed as the only argument, which is guaranteed to be in
  20311 ** RECOVER_STATE_LOSTANDFOUND3 state - during which the lost-and-found 
  20312 ** table of the output database is populated with recovered data that can 
  20313 ** not be assigned to any recovered schema object.
  20314 */ 
  20315 static int recoverLostAndFound3Step(sqlite3_recover *p){
  20316   RecoverStateLAF *pLaf = &p->laf;
  20317   if( p->errCode==SQLITE_OK ){
  20318     if( pLaf->pInsert==0 ){
  20319       return SQLITE_DONE;
  20320     }else{
  20321       if( p->errCode==SQLITE_OK ){
  20322         int res = sqlite3_step(pLaf->pAllPage);
  20323         if( res==SQLITE_ROW ){
  20324           i64 iPage = sqlite3_column_int64(pLaf->pAllPage, 0);
  20325           if( recoverBitmapQuery(pLaf->pUsed, iPage)==0 ){
  20326             recoverLostAndFoundOnePage(p, iPage);
  20327           }
  20328         }else{
  20329           recoverReset(p, pLaf->pAllPage);
  20330           return SQLITE_DONE;
  20331         }
  20332       }
  20333     }
  20334   }
  20335   return SQLITE_OK;
  20336 }
  20337 
  20338 /*
  20339 ** Initialize resources required in RECOVER_STATE_LOSTANDFOUND3 
  20340 ** state - during which the lost-and-found table of the output database 
  20341 ** is populated with recovered data that can not be assigned to any 
  20342 ** recovered schema object.
  20343 */ 
  20344 static void recoverLostAndFound3Init(sqlite3_recover *p){
  20345   RecoverStateLAF *pLaf = &p->laf;
  20346 
  20347   if( pLaf->nMaxField>0 ){
  20348     char *zTab = 0;               /* Name of lost_and_found table */
  20349 
  20350     zTab = recoverLostAndFoundCreate(p, pLaf->nMaxField);
  20351     pLaf->pInsert = recoverLostAndFoundInsert(p, zTab, pLaf->nMaxField);
  20352     sqlite3_free(zTab);
  20353 
  20354     pLaf->pAllPage = recoverPreparePrintf(p, p->dbOut,
  20355         "WITH RECURSIVE seq(ii) AS ("
  20356         "  SELECT 1 UNION ALL SELECT ii+1 FROM seq WHERE ii<%lld"
  20357         ")"
  20358         "SELECT ii FROM seq" , p->laf.nPg
  20359     );
  20360     pLaf->pPageData = recoverPrepare(p, p->dbOut,
  20361         "SELECT cell, field, value "
  20362         "FROM sqlite_dbdata('getpage()') d WHERE d.pgno=? "
  20363         "UNION ALL "
  20364         "SELECT -1, -1, -1"
  20365     );
  20366 
  20367     pLaf->apVal = (sqlite3_value**)recoverMalloc(p, 
  20368         pLaf->nMaxField*sizeof(sqlite3_value*)
  20369     );
  20370   }
  20371 }
  20372 
  20373 /*
  20374 ** Initialize resources required in RECOVER_STATE_WRITING state - during which
  20375 ** tables recovered from the schema of the input database are populated with
  20376 ** recovered data.
  20377 */ 
  20378 static int recoverWriteDataInit(sqlite3_recover *p){
  20379   RecoverStateW1 *p1 = &p->w1;
  20380   RecoverTable *pTbl = 0;
  20381   int nByte = 0;
  20382 
  20383   /* Figure out the maximum number of columns for any table in the schema */
  20384   assert( p1->nMax==0 );
  20385   for(pTbl=p->pTblList; pTbl; pTbl=pTbl->pNext){
  20386     if( pTbl->nCol>p1->nMax ) p1->nMax = pTbl->nCol;
  20387   }
  20388 
  20389   /* Allocate an array of (sqlite3_value*) in which to accumulate the values
  20390   ** that will be written to the output database in a single row. */
  20391   nByte = sizeof(sqlite3_value*) * (p1->nMax+1);
  20392   p1->apVal = (sqlite3_value**)recoverMalloc(p, nByte);
  20393   if( p1->apVal==0 ) return p->errCode;
  20394 
  20395   /* Prepare the SELECT to loop through schema tables (pTbls) and the SELECT
  20396   ** to loop through cells that appear to belong to a single table (pSel). */
  20397   p1->pTbls = recoverPrepare(p, p->dbOut,
  20398       "SELECT rootpage FROM recovery.schema "
  20399       "  WHERE type='table' AND (sql NOT LIKE 'create virtual%')"
  20400       "  ORDER BY (tbl_name='sqlite_sequence') ASC"
  20401   );
  20402   p1->pSel = recoverPrepare(p, p->dbOut, 
  20403       "WITH RECURSIVE pages(page) AS ("
  20404       "  SELECT ?1"
  20405       "    UNION"
  20406       "  SELECT child FROM sqlite_dbptr('getpage()'), pages "
  20407       "    WHERE pgno=page"
  20408       ") "
  20409       "SELECT page, cell, field, value "
  20410       "FROM sqlite_dbdata('getpage()') d, pages p WHERE p.page=d.pgno "
  20411       "UNION ALL "
  20412       "SELECT 0, 0, 0, 0"
  20413   );
  20414 
  20415   return p->errCode;
  20416 }
  20417 
  20418 /*
  20419 ** Clean up resources allocated by recoverWriteDataInit() (stuff in 
  20420 ** sqlite3_recover.w1).
  20421 */
  20422 static void recoverWriteDataCleanup(sqlite3_recover *p){
  20423   RecoverStateW1 *p1 = &p->w1;
  20424   int ii;
  20425   for(ii=0; ii<p1->nVal; ii++){
  20426     sqlite3_value_free(p1->apVal[ii]);
  20427   }
  20428   sqlite3_free(p1->apVal);
  20429   recoverFinalize(p, p1->pInsert);
  20430   recoverFinalize(p, p1->pTbls);
  20431   recoverFinalize(p, p1->pSel);
  20432   memset(p1, 0, sizeof(*p1));
  20433 }
  20434 
  20435 /*
  20436 ** Perform one step (sqlite3_recover_step()) of work for the connection 
  20437 ** passed as the only argument, which is guaranteed to be in
  20438 ** RECOVER_STATE_WRITING state - during which tables recovered from the
  20439 ** schema of the input database are populated with recovered data.
  20440 */ 
  20441 static int recoverWriteDataStep(sqlite3_recover *p){
  20442   RecoverStateW1 *p1 = &p->w1;
  20443   sqlite3_stmt *pSel = p1->pSel;
  20444   sqlite3_value **apVal = p1->apVal;
  20445 
  20446   if( p->errCode==SQLITE_OK && p1->pTab==0 ){
  20447     if( sqlite3_step(p1->pTbls)==SQLITE_ROW ){
  20448       i64 iRoot = sqlite3_column_int64(p1->pTbls, 0);
  20449       p1->pTab = recoverFindTable(p, iRoot);
  20450 
  20451       recoverFinalize(p, p1->pInsert);
  20452       p1->pInsert = 0;
  20453 
  20454       /* If this table is unknown, return early. The caller will invoke this
  20455       ** function again and it will move on to the next table.  */
  20456       if( p1->pTab==0 ) return p->errCode;
  20457 
  20458       /* If this is the sqlite_sequence table, delete any rows added by
  20459       ** earlier INSERT statements on tables with AUTOINCREMENT primary
  20460       ** keys before recovering its contents. The p1->pTbls SELECT statement
  20461       ** is rigged to deliver "sqlite_sequence" last of all, so we don't
  20462       ** worry about it being modified after it is recovered. */
  20463       if( sqlite3_stricmp("sqlite_sequence", p1->pTab->zTab)==0 ){
  20464         recoverExec(p, p->dbOut, "DELETE FROM sqlite_sequence");
  20465         recoverSqlCallback(p, "DELETE FROM sqlite_sequence");
  20466       }
  20467 
  20468       /* Bind the root page of this table within the original database to 
  20469       ** SELECT statement p1->pSel. The SELECT statement will then iterate
  20470       ** through cells that look like they belong to table pTab.  */
  20471       sqlite3_bind_int64(pSel, 1, iRoot);
  20472 
  20473       p1->nVal = 0;
  20474       p1->bHaveRowid = 0;
  20475       p1->iPrevPage = -1;
  20476       p1->iPrevCell = -1;
  20477     }else{
  20478       return SQLITE_DONE;
  20479     }
  20480   }
  20481   assert( p->errCode!=SQLITE_OK || p1->pTab );
  20482 
  20483   if( p->errCode==SQLITE_OK && sqlite3_step(pSel)==SQLITE_ROW ){
  20484     RecoverTable *pTab = p1->pTab;
  20485 
  20486     i64 iPage = sqlite3_column_int64(pSel, 0);
  20487     int iCell = sqlite3_column_int(pSel, 1);
  20488     int iField = sqlite3_column_int(pSel, 2);
  20489     sqlite3_value *pVal = sqlite3_column_value(pSel, 3);
  20490     int bNewCell = (p1->iPrevPage!=iPage || p1->iPrevCell!=iCell);
  20491 
  20492     assert( bNewCell==0 || (iField==-1 || iField==0) );
  20493     assert( bNewCell || iField==p1->nVal || p1->nVal==pTab->nCol );
  20494 
  20495     if( bNewCell ){
  20496       int ii = 0;
  20497       if( p1->nVal>=0 ){
  20498         if( p1->pInsert==0 || p1->nVal!=p1->nInsert ){
  20499           recoverFinalize(p, p1->pInsert);
  20500           p1->pInsert = recoverInsertStmt(p, pTab, p1->nVal);
  20501           p1->nInsert = p1->nVal;
  20502         }
  20503         if( p1->nVal>0 ){
  20504           sqlite3_stmt *pInsert = p1->pInsert;
  20505           for(ii=0; ii<pTab->nCol; ii++){
  20506             RecoverColumn *pCol = &pTab->aCol[ii];
  20507             int iBind = pCol->iBind;
  20508             if( iBind>0 ){
  20509               if( pCol->bIPK ){
  20510                 sqlite3_bind_int64(pInsert, iBind, p1->iRowid);
  20511               }else if( pCol->iField<p1->nVal ){
  20512                 recoverBindValue(p, pInsert, iBind, apVal[pCol->iField]);
  20513               }
  20514             }
  20515           }
  20516           if( p->bRecoverRowid && pTab->iRowidBind>0 && p1->bHaveRowid ){
  20517             sqlite3_bind_int64(pInsert, pTab->iRowidBind, p1->iRowid);
  20518           }
  20519           if( SQLITE_ROW==sqlite3_step(pInsert) ){
  20520             const char *z = (const char*)sqlite3_column_text(pInsert, 0);
  20521             recoverSqlCallback(p, z);
  20522           }
  20523           recoverReset(p, pInsert);
  20524           assert( p->errCode || pInsert );
  20525           if( pInsert ) sqlite3_clear_bindings(pInsert);
  20526         }
  20527       }
  20528 
  20529       for(ii=0; ii<p1->nVal; ii++){
  20530         sqlite3_value_free(apVal[ii]);
  20531         apVal[ii] = 0;
  20532       }
  20533       p1->nVal = -1;
  20534       p1->bHaveRowid = 0;
  20535     }
  20536 
  20537     if( iPage!=0 ){
  20538       if( iField<0 ){
  20539         p1->iRowid = sqlite3_column_int64(pSel, 3);
  20540         assert( p1->nVal==-1 );
  20541         p1->nVal = 0;
  20542         p1->bHaveRowid = 1;
  20543       }else if( iField<pTab->nCol ){
  20544         assert( apVal[iField]==0 );
  20545         apVal[iField] = sqlite3_value_dup( pVal );
  20546         if( apVal[iField]==0 ){
  20547           recoverError(p, SQLITE_NOMEM, 0);
  20548         }
  20549         p1->nVal = iField+1;
  20550       }else if( pTab->nCol==0 ){
  20551         p1->nVal = pTab->nCol;
  20552       }
  20553       p1->iPrevCell = iCell;
  20554       p1->iPrevPage = iPage;
  20555     }
  20556   }else{
  20557     recoverReset(p, pSel);
  20558     p1->pTab = 0;
  20559   }
  20560 
  20561   return p->errCode;
  20562 }
  20563 
  20564 /*
  20565 ** Initialize resources required by sqlite3_recover_step() in
  20566 ** RECOVER_STATE_LOSTANDFOUND1 state - during which the set of pages not
  20567 ** already allocated to a recovered schema element is determined.
  20568 */ 
  20569 static void recoverLostAndFound1Init(sqlite3_recover *p){
  20570   RecoverStateLAF *pLaf = &p->laf;
  20571   sqlite3_stmt *pStmt = 0;
  20572 
  20573   assert( p->laf.pUsed==0 );
  20574   pLaf->nPg = recoverPageCount(p);
  20575   pLaf->pUsed = recoverBitmapAlloc(p, pLaf->nPg);
  20576 
  20577   /* Prepare a statement to iterate through all pages that are part of any tree
  20578   ** in the recoverable part of the input database schema to the bitmap. And,
  20579   ** if !p->bFreelistCorrupt, add all pages that appear to be part of the
  20580   ** freelist.  */
  20581   pStmt = recoverPrepare(
  20582       p, p->dbOut,
  20583       "WITH trunk(pgno) AS ("
  20584       "  SELECT read_i32(getpage(1), 8) AS x WHERE x>0"
  20585       "    UNION"
  20586       "  SELECT read_i32(getpage(trunk.pgno), 0) AS x FROM trunk WHERE x>0"
  20587       "),"
  20588       "trunkdata(pgno, data) AS ("
  20589       "  SELECT pgno, getpage(pgno) FROM trunk"
  20590       "),"
  20591       "freelist(data, n, freepgno) AS ("
  20592       "  SELECT data, min(16384, read_i32(data, 1)-1), pgno FROM trunkdata"
  20593       "    UNION ALL"
  20594       "  SELECT data, n-1, read_i32(data, 2+n) FROM freelist WHERE n>=0"
  20595       "),"
  20596       ""
  20597       "roots(r) AS ("
  20598       "  SELECT 1 UNION ALL"
  20599       "  SELECT rootpage FROM recovery.schema WHERE rootpage>0"
  20600       "),"
  20601       "used(page) AS ("
  20602       "  SELECT r FROM roots"
  20603       "    UNION"
  20604       "  SELECT child FROM sqlite_dbptr('getpage()'), used "
  20605       "    WHERE pgno=page"
  20606       ") "
  20607       "SELECT page FROM used"
  20608       " UNION ALL "
  20609       "SELECT freepgno FROM freelist WHERE NOT ?"
  20610   );
  20611   if( pStmt ) sqlite3_bind_int(pStmt, 1, p->bFreelistCorrupt);
  20612   pLaf->pUsedPages = pStmt;
  20613 }
  20614 
  20615 /*
  20616 ** Perform one step (sqlite3_recover_step()) of work for the connection 
  20617 ** passed as the only argument, which is guaranteed to be in
  20618 ** RECOVER_STATE_LOSTANDFOUND1 state - during which the set of pages not
  20619 ** already allocated to a recovered schema element is determined.
  20620 */ 
  20621 static int recoverLostAndFound1Step(sqlite3_recover *p){
  20622   RecoverStateLAF *pLaf = &p->laf;
  20623   int rc = p->errCode;
  20624   if( rc==SQLITE_OK ){
  20625     rc = sqlite3_step(pLaf->pUsedPages);
  20626     if( rc==SQLITE_ROW ){
  20627       i64 iPg = sqlite3_column_int64(pLaf->pUsedPages, 0);
  20628       recoverBitmapSet(pLaf->pUsed, iPg);
  20629       rc = SQLITE_OK;
  20630     }else{
  20631       recoverFinalize(p, pLaf->pUsedPages);
  20632       pLaf->pUsedPages = 0;
  20633     }
  20634   }
  20635   return rc;
  20636 }
  20637 
  20638 /*
  20639 ** Initialize resources required by RECOVER_STATE_LOSTANDFOUND2 
  20640 ** state - during which the pages identified in RECOVER_STATE_LOSTANDFOUND1
  20641 ** are sorted into sets that likely belonged to the same database tree.
  20642 */ 
  20643 static void recoverLostAndFound2Init(sqlite3_recover *p){
  20644   RecoverStateLAF *pLaf = &p->laf;
  20645 
  20646   assert( p->laf.pAllAndParent==0 );
  20647   assert( p->laf.pMapInsert==0 );
  20648   assert( p->laf.pMaxField==0 );
  20649   assert( p->laf.nMaxField==0 );
  20650 
  20651   pLaf->pMapInsert = recoverPrepare(p, p->dbOut,
  20652       "INSERT OR IGNORE INTO recovery.map(pgno, parent) VALUES(?, ?)"
  20653   );
  20654   pLaf->pAllAndParent = recoverPreparePrintf(p, p->dbOut,
  20655       "WITH RECURSIVE seq(ii) AS ("
  20656       "  SELECT 1 UNION ALL SELECT ii+1 FROM seq WHERE ii<%lld"
  20657       ")"
  20658       "SELECT pgno, child FROM sqlite_dbptr('getpage()') "
  20659       " UNION ALL "
  20660       "SELECT NULL, ii FROM seq", p->laf.nPg
  20661   );
  20662   pLaf->pMaxField = recoverPreparePrintf(p, p->dbOut,
  20663       "SELECT max(field)+1 FROM sqlite_dbdata('getpage') WHERE pgno = ?"
  20664   );
  20665 }
  20666 
  20667 /*
  20668 ** Perform one step (sqlite3_recover_step()) of work for the connection 
  20669 ** passed as the only argument, which is guaranteed to be in
  20670 ** RECOVER_STATE_LOSTANDFOUND2 state - during which the pages identified 
  20671 ** in RECOVER_STATE_LOSTANDFOUND1 are sorted into sets that likely belonged 
  20672 ** to the same database tree.
  20673 */ 
  20674 static int recoverLostAndFound2Step(sqlite3_recover *p){
  20675   RecoverStateLAF *pLaf = &p->laf;
  20676   if( p->errCode==SQLITE_OK ){
  20677     int res = sqlite3_step(pLaf->pAllAndParent);
  20678     if( res==SQLITE_ROW ){
  20679       i64 iChild = sqlite3_column_int(pLaf->pAllAndParent, 1);
  20680       if( recoverBitmapQuery(pLaf->pUsed, iChild)==0 ){
  20681         sqlite3_bind_int64(pLaf->pMapInsert, 1, iChild);
  20682         sqlite3_bind_value(pLaf->pMapInsert, 2, 
  20683             sqlite3_column_value(pLaf->pAllAndParent, 0)
  20684         );
  20685         sqlite3_step(pLaf->pMapInsert);
  20686         recoverReset(p, pLaf->pMapInsert);
  20687         sqlite3_bind_int64(pLaf->pMaxField, 1, iChild);
  20688         if( SQLITE_ROW==sqlite3_step(pLaf->pMaxField) ){
  20689           int nMax = sqlite3_column_int(pLaf->pMaxField, 0);
  20690           if( nMax>pLaf->nMaxField ) pLaf->nMaxField = nMax;
  20691         }
  20692         recoverReset(p, pLaf->pMaxField);
  20693       }
  20694     }else{
  20695       recoverFinalize(p, pLaf->pAllAndParent);
  20696       pLaf->pAllAndParent =0;
  20697       return SQLITE_DONE;
  20698     }
  20699   }
  20700   return p->errCode;
  20701 }
  20702 
  20703 /*
  20704 ** Free all resources allocated as part of sqlite3_recover_step() calls
  20705 ** in one of the RECOVER_STATE_LOSTANDFOUND[123] states.
  20706 */
  20707 static void recoverLostAndFoundCleanup(sqlite3_recover *p){
  20708   recoverBitmapFree(p->laf.pUsed);
  20709   p->laf.pUsed = 0;
  20710   sqlite3_finalize(p->laf.pUsedPages);
  20711   sqlite3_finalize(p->laf.pAllAndParent);
  20712   sqlite3_finalize(p->laf.pMapInsert);
  20713   sqlite3_finalize(p->laf.pMaxField);
  20714   sqlite3_finalize(p->laf.pFindRoot);
  20715   sqlite3_finalize(p->laf.pInsert);
  20716   sqlite3_finalize(p->laf.pAllPage);
  20717   sqlite3_finalize(p->laf.pPageData);
  20718   p->laf.pUsedPages = 0;
  20719   p->laf.pAllAndParent = 0;
  20720   p->laf.pMapInsert = 0;
  20721   p->laf.pMaxField = 0;
  20722   p->laf.pFindRoot = 0;
  20723   p->laf.pInsert = 0;
  20724   p->laf.pAllPage = 0;
  20725   p->laf.pPageData = 0;
  20726   sqlite3_free(p->laf.apVal);
  20727   p->laf.apVal = 0;
  20728 }
  20729 
  20730 /*
  20731 ** Free all resources allocated as part of sqlite3_recover_step() calls.
  20732 */
  20733 static void recoverFinalCleanup(sqlite3_recover *p){
  20734   RecoverTable *pTab = 0;
  20735   RecoverTable *pNext = 0;
  20736 
  20737   recoverWriteDataCleanup(p);
  20738   recoverLostAndFoundCleanup(p);
  20739 
  20740   for(pTab=p->pTblList; pTab; pTab=pNext){
  20741     pNext = pTab->pNext;
  20742     sqlite3_free(pTab);
  20743   }
  20744   p->pTblList = 0;
  20745   sqlite3_finalize(p->pGetPage);
  20746   p->pGetPage = 0;
  20747   sqlite3_file_control(p->dbIn, p->zDb, SQLITE_FCNTL_RESET_CACHE, 0);
  20748 
  20749   {
  20750 #ifndef NDEBUG
  20751     int res = 
  20752 #endif
  20753        sqlite3_close(p->dbOut);
  20754     assert( res==SQLITE_OK );
  20755   }
  20756   p->dbOut = 0;
  20757 }
  20758 
  20759 /*
  20760 ** Decode and return an unsigned 16-bit big-endian integer value from 
  20761 ** buffer a[].
  20762 */
  20763 static u32 recoverGetU16(const u8 *a){
  20764   return (((u32)a[0])<<8) + ((u32)a[1]);
  20765 }
  20766 
  20767 /*
  20768 ** Decode and return an unsigned 32-bit big-endian integer value from 
  20769 ** buffer a[].
  20770 */
  20771 static u32 recoverGetU32(const u8 *a){
  20772   return (((u32)a[0])<<24) + (((u32)a[1])<<16) + (((u32)a[2])<<8) + ((u32)a[3]);
  20773 }
  20774 
  20775 /*
  20776 ** Decode an SQLite varint from buffer a[]. Write the decoded value to (*pVal)
  20777 ** and return the number of bytes consumed.
  20778 */
  20779 static int recoverGetVarint(const u8 *a, i64 *pVal){
  20780   sqlite3_uint64 u = 0;
  20781   int i;
  20782   for(i=0; i<8; i++){
  20783     u = (u<<7) + (a[i]&0x7f);
  20784     if( (a[i]&0x80)==0 ){ *pVal = (sqlite3_int64)u; return i+1; }
  20785   }
  20786   u = (u<<8) + (a[i]&0xff);
  20787   *pVal = (sqlite3_int64)u;
  20788   return 9;
  20789 }
  20790 
  20791 /*
  20792 ** The second argument points to a buffer n bytes in size. If this buffer
  20793 ** or a prefix thereof appears to contain a well-formed SQLite b-tree page, 
  20794 ** return the page-size in bytes. Otherwise, if the buffer does not 
  20795 ** appear to contain a well-formed b-tree page, return 0.
  20796 */
  20797 static int recoverIsValidPage(u8 *aTmp, const u8 *a, int n){
  20798   u8 *aUsed = aTmp;
  20799   int nFrag = 0;
  20800   int nActual = 0;
  20801   int iFree = 0;
  20802   int nCell = 0;                  /* Number of cells on page */
  20803   int iCellOff = 0;               /* Offset of cell array in page */
  20804   int iContent = 0;
  20805   int eType = 0;
  20806   int ii = 0;
  20807 
  20808   eType = (int)a[0];
  20809   if( eType!=0x02 && eType!=0x05 && eType!=0x0A && eType!=0x0D ) return 0;
  20810 
  20811   iFree = (int)recoverGetU16(&a[1]);
  20812   nCell = (int)recoverGetU16(&a[3]);
  20813   iContent = (int)recoverGetU16(&a[5]);
  20814   if( iContent==0 ) iContent = 65536;
  20815   nFrag = (int)a[7];
  20816 
  20817   if( iContent>n ) return 0;
  20818 
  20819   memset(aUsed, 0, n);
  20820   memset(aUsed, 0xFF, iContent);
  20821 
  20822   /* Follow the free-list. This is the same format for all b-tree pages. */
  20823   if( iFree && iFree<=iContent ) return 0;
  20824   while( iFree ){
  20825     int iNext = 0;
  20826     int nByte = 0;
  20827     if( iFree>(n-4) ) return 0;
  20828     iNext = recoverGetU16(&a[iFree]);
  20829     nByte = recoverGetU16(&a[iFree+2]);
  20830     if( iFree+nByte>n || nByte<4 ) return 0;
  20831     if( iNext && iNext<iFree+nByte ) return 0;
  20832     memset(&aUsed[iFree], 0xFF, nByte);
  20833     iFree = iNext;
  20834   }
  20835 
  20836   /* Run through the cells */
  20837   if( eType==0x02 || eType==0x05 ){
  20838     iCellOff = 12;
  20839   }else{
  20840     iCellOff = 8;
  20841   }
  20842   if( (iCellOff + 2*nCell)>iContent ) return 0;
  20843   for(ii=0; ii<nCell; ii++){
  20844     int iByte;
  20845     i64 nPayload = 0;
  20846     int nByte = 0;
  20847     int iOff = recoverGetU16(&a[iCellOff + 2*ii]);
  20848     if( iOff<iContent || iOff>n ){
  20849       return 0;
  20850     }
  20851     if( eType==0x05 || eType==0x02 ) nByte += 4;
  20852     nByte += recoverGetVarint(&a[iOff+nByte], &nPayload);
  20853     if( eType==0x0D ){
  20854       i64 dummy = 0;
  20855       nByte += recoverGetVarint(&a[iOff+nByte], &dummy);
  20856     }
  20857     if( eType!=0x05 ){
  20858       int X = (eType==0x0D) ? n-35 : (((n-12)*64/255)-23);
  20859       int M = ((n-12)*32/255)-23;
  20860       int K = M+((nPayload-M)%(n-4));
  20861 
  20862       if( nPayload<X ){
  20863         nByte += nPayload;
  20864       }else if( K<=X ){
  20865         nByte += K+4;
  20866       }else{
  20867         nByte += M+4;
  20868       }
  20869     }
  20870 
  20871     if( iOff+nByte>n ){
  20872       return 0;
  20873     }
  20874     for(iByte=iOff; iByte<(iOff+nByte); iByte++){
  20875       if( aUsed[iByte]!=0 ){
  20876         return 0;
  20877       }
  20878       aUsed[iByte] = 0xFF;
  20879     }
  20880   }
  20881 
  20882   nActual = 0;
  20883   for(ii=0; ii<n; ii++){
  20884     if( aUsed[ii]==0 ) nActual++;
  20885   }
  20886   return (nActual==nFrag);
  20887 }
  20888 
  20889 
  20890 static int recoverVfsClose(sqlite3_file*);
  20891 static int recoverVfsRead(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst);
  20892 static int recoverVfsWrite(sqlite3_file*, const void*, int, sqlite3_int64);
  20893 static int recoverVfsTruncate(sqlite3_file*, sqlite3_int64 size);
  20894 static int recoverVfsSync(sqlite3_file*, int flags);
  20895 static int recoverVfsFileSize(sqlite3_file*, sqlite3_int64 *pSize);
  20896 static int recoverVfsLock(sqlite3_file*, int);
  20897 static int recoverVfsUnlock(sqlite3_file*, int);
  20898 static int recoverVfsCheckReservedLock(sqlite3_file*, int *pResOut);
  20899 static int recoverVfsFileControl(sqlite3_file*, int op, void *pArg);
  20900 static int recoverVfsSectorSize(sqlite3_file*);
  20901 static int recoverVfsDeviceCharacteristics(sqlite3_file*);
  20902 static int recoverVfsShmMap(sqlite3_file*, int, int, int, void volatile**);
  20903 static int recoverVfsShmLock(sqlite3_file*, int offset, int n, int flags);
  20904 static void recoverVfsShmBarrier(sqlite3_file*);
  20905 static int recoverVfsShmUnmap(sqlite3_file*, int deleteFlag);
  20906 static int recoverVfsFetch(sqlite3_file*, sqlite3_int64, int, void**);
  20907 static int recoverVfsUnfetch(sqlite3_file *pFd, sqlite3_int64 iOff, void *p);
  20908 
  20909 static sqlite3_io_methods recover_methods = {
  20910   2, /* iVersion */
  20911   recoverVfsClose,
  20912   recoverVfsRead,
  20913   recoverVfsWrite,
  20914   recoverVfsTruncate,
  20915   recoverVfsSync,
  20916   recoverVfsFileSize,
  20917   recoverVfsLock,
  20918   recoverVfsUnlock,
  20919   recoverVfsCheckReservedLock,
  20920   recoverVfsFileControl,
  20921   recoverVfsSectorSize,
  20922   recoverVfsDeviceCharacteristics,
  20923   recoverVfsShmMap,
  20924   recoverVfsShmLock,
  20925   recoverVfsShmBarrier,
  20926   recoverVfsShmUnmap,
  20927   recoverVfsFetch,
  20928   recoverVfsUnfetch
  20929 };
  20930 
  20931 static int recoverVfsClose(sqlite3_file *pFd){
  20932   assert( pFd->pMethods!=&recover_methods );
  20933   return pFd->pMethods->xClose(pFd);
  20934 }
  20935 
  20936 /*
  20937 ** Write value v to buffer a[] as a 16-bit big-endian unsigned integer.
  20938 */
  20939 static void recoverPutU16(u8 *a, u32 v){
  20940   a[0] = (v>>8) & 0x00FF;
  20941   a[1] = (v>>0) & 0x00FF;
  20942 }
  20943 
  20944 /*
  20945 ** Write value v to buffer a[] as a 32-bit big-endian unsigned integer.
  20946 */
  20947 static void recoverPutU32(u8 *a, u32 v){
  20948   a[0] = (v>>24) & 0x00FF;
  20949   a[1] = (v>>16) & 0x00FF;
  20950   a[2] = (v>>8) & 0x00FF;
  20951   a[3] = (v>>0) & 0x00FF;
  20952 }
  20953 
  20954 /*
  20955 ** Detect the page-size of the database opened by file-handle pFd by 
  20956 ** searching the first part of the file for a well-formed SQLite b-tree 
  20957 ** page. If parameter nReserve is non-zero, then as well as searching for
  20958 ** a b-tree page with zero reserved bytes, this function searches for one
  20959 ** with nReserve reserved bytes at the end of it.
  20960 **
  20961 ** If successful, set variable p->detected_pgsz to the detected page-size
  20962 ** in bytes and return SQLITE_OK. Or, if no error occurs but no valid page
  20963 ** can be found, return SQLITE_OK but leave p->detected_pgsz set to 0. Or,
  20964 ** if an error occurs (e.g. an IO or OOM error), then an SQLite error code
  20965 ** is returned. The final value of p->detected_pgsz is undefined in this
  20966 ** case.
  20967 */
  20968 static int recoverVfsDetectPagesize(
  20969   sqlite3_recover *p,             /* Recover handle */
  20970   sqlite3_file *pFd,              /* File-handle open on input database */
  20971   u32 nReserve,                   /* Possible nReserve value */
  20972   i64 nSz                         /* Size of database file in bytes */
  20973 ){
  20974   int rc = SQLITE_OK;
  20975   const int nMin = 512;
  20976   const int nMax = 65536;
  20977   const int nMaxBlk = 4;
  20978   u32 pgsz = 0;
  20979   int iBlk = 0;
  20980   u8 *aPg = 0;
  20981   u8 *aTmp = 0;
  20982   int nBlk = 0;
  20983 
  20984   aPg = (u8*)sqlite3_malloc(2*nMax);
  20985   if( aPg==0 ) return SQLITE_NOMEM;
  20986   aTmp = &aPg[nMax];
  20987 
  20988   nBlk = (nSz+nMax-1)/nMax;
  20989   if( nBlk>nMaxBlk ) nBlk = nMaxBlk;
  20990 
  20991   do {
  20992     for(iBlk=0; rc==SQLITE_OK && iBlk<nBlk; iBlk++){
  20993       int nByte = (nSz>=((iBlk+1)*nMax)) ? nMax : (nSz % nMax);
  20994       memset(aPg, 0, nMax);
  20995       rc = pFd->pMethods->xRead(pFd, aPg, nByte, iBlk*nMax);
  20996       if( rc==SQLITE_OK ){
  20997         int pgsz2;
  20998         for(pgsz2=(pgsz ? pgsz*2 : nMin); pgsz2<=nMax; pgsz2=pgsz2*2){
  20999           int iOff;
  21000           for(iOff=0; iOff<nMax; iOff+=pgsz2){
  21001             if( recoverIsValidPage(aTmp, &aPg[iOff], pgsz2-nReserve) ){
  21002               pgsz = pgsz2;
  21003               break;
  21004             }
  21005           }
  21006         }
  21007       }
  21008     }
  21009     if( pgsz>(u32)p->detected_pgsz ){
  21010       p->detected_pgsz = pgsz;
  21011       p->nReserve = nReserve;
  21012     }
  21013     if( nReserve==0 ) break;
  21014     nReserve = 0;
  21015   }while( 1 );
  21016 
  21017   p->detected_pgsz = pgsz;
  21018   sqlite3_free(aPg);
  21019   return rc;
  21020 }
  21021 
  21022 /*
  21023 ** The xRead() method of the wrapper VFS. This is used to intercept calls
  21024 ** to read page 1 of the input database.
  21025 */
  21026 static int recoverVfsRead(sqlite3_file *pFd, void *aBuf, int nByte, i64 iOff){
  21027   int rc = SQLITE_OK;
  21028   if( pFd->pMethods==&recover_methods ){
  21029     pFd->pMethods = recover_g.pMethods;
  21030     rc = pFd->pMethods->xRead(pFd, aBuf, nByte, iOff);
  21031     if( nByte==16 ){
  21032       sqlite3_randomness(16, aBuf);
  21033     }else
  21034     if( rc==SQLITE_OK && iOff==0 && nByte>=108 ){
  21035       /* Ensure that the database has a valid header file. The only fields
  21036       ** that really matter to recovery are:
  21037       **
  21038       **   + Database page size (16-bits at offset 16)
  21039       **   + Size of db in pages (32-bits at offset 28)
  21040       **   + Database encoding (32-bits at offset 56)
  21041       **
  21042       ** Also preserved are:
  21043       **
  21044       **   + first freelist page (32-bits at offset 32)
  21045       **   + size of freelist (32-bits at offset 36)
  21046       **   + the wal-mode flags (16-bits at offset 18)
  21047       **
  21048       ** We also try to preserve the auto-vacuum, incr-value, user-version
  21049       ** and application-id fields - all 32 bit quantities at offsets 
  21050       ** 52, 60, 64 and 68. All other fields are set to known good values.
  21051       **
  21052       ** Byte offset 105 should also contain the page-size as a 16-bit 
  21053       ** integer.
  21054       */
  21055       const int aPreserve[] = {32, 36, 52, 60, 64, 68};
  21056       u8 aHdr[108] = {
  21057         0x53, 0x51, 0x4c, 0x69, 0x74, 0x65, 0x20, 0x66, 
  21058         0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x33, 0x00,
  21059         0xFF, 0xFF, 0x01, 0x01, 0x00, 0x40, 0x20, 0x20,
  21060         0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
  21061         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  21062         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
  21063         0x00, 0x00, 0x10, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
  21064         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  21065         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  21066         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  21067         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  21068         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  21069         0x00, 0x2e, 0x5b, 0x30,
  21070 
  21071         0x0D, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00
  21072       };
  21073       u8 *a = (u8*)aBuf;
  21074 
  21075       u32 pgsz = recoverGetU16(&a[16]);
  21076       u32 nReserve = a[20];
  21077       u32 enc = recoverGetU32(&a[56]);
  21078       u32 dbsz = 0;
  21079       i64 dbFileSize = 0;
  21080       int ii;
  21081       sqlite3_recover *p = recover_g.p;
  21082 
  21083       if( pgsz==0x01 ) pgsz = 65536;
  21084       rc = pFd->pMethods->xFileSize(pFd, &dbFileSize);
  21085 
  21086       if( rc==SQLITE_OK && p->detected_pgsz==0 ){
  21087         rc = recoverVfsDetectPagesize(p, pFd, nReserve, dbFileSize);
  21088       }
  21089       if( p->detected_pgsz ){
  21090         pgsz = p->detected_pgsz;
  21091         nReserve = p->nReserve;
  21092       }
  21093 
  21094       if( pgsz ){
  21095         dbsz = dbFileSize / pgsz;
  21096       }
  21097       if( enc!=SQLITE_UTF8 && enc!=SQLITE_UTF16BE && enc!=SQLITE_UTF16LE ){
  21098         enc = SQLITE_UTF8;
  21099       }
  21100 
  21101       sqlite3_free(p->pPage1Cache);
  21102       p->pPage1Cache = 0;
  21103       p->pPage1Disk = 0;
  21104 
  21105       p->pgsz = nByte;
  21106       p->pPage1Cache = (u8*)recoverMalloc(p, nByte*2);
  21107       if( p->pPage1Cache ){
  21108         p->pPage1Disk = &p->pPage1Cache[nByte];
  21109         memcpy(p->pPage1Disk, aBuf, nByte);
  21110         aHdr[18] = a[18];
  21111         aHdr[19] = a[19];
  21112         recoverPutU32(&aHdr[28], dbsz);
  21113         recoverPutU32(&aHdr[56], enc);
  21114         recoverPutU16(&aHdr[105], pgsz-nReserve);
  21115         if( pgsz==65536 ) pgsz = 1;
  21116         recoverPutU16(&aHdr[16], pgsz);
  21117         aHdr[20] = nReserve;
  21118         for(ii=0; ii<(int)(sizeof(aPreserve)/sizeof(aPreserve[0])); ii++){
  21119           memcpy(&aHdr[aPreserve[ii]], &a[aPreserve[ii]], 4);
  21120         }
  21121         memcpy(aBuf, aHdr, sizeof(aHdr));
  21122         memset(&((u8*)aBuf)[sizeof(aHdr)], 0, nByte-sizeof(aHdr));
  21123 
  21124         memcpy(p->pPage1Cache, aBuf, nByte);
  21125       }else{
  21126         rc = p->errCode;
  21127       }
  21128 
  21129     }
  21130     pFd->pMethods = &recover_methods;
  21131   }else{
  21132     rc = pFd->pMethods->xRead(pFd, aBuf, nByte, iOff);
  21133   }
  21134   return rc;
  21135 }
  21136 
  21137 /*
  21138 ** Used to make sqlite3_io_methods wrapper methods less verbose.
  21139 */
  21140 #define RECOVER_VFS_WRAPPER(code)                         \
  21141   int rc = SQLITE_OK;                                     \
  21142   if( pFd->pMethods==&recover_methods ){                  \
  21143     pFd->pMethods = recover_g.pMethods;                   \
  21144     rc = code;                                            \
  21145     pFd->pMethods = &recover_methods;                     \
  21146   }else{                                                  \
  21147     rc = code;                                            \
  21148   }                                                       \
  21149   return rc;                                              
  21150 
  21151 /*
  21152 ** Methods of the wrapper VFS. All methods except for xRead() and xClose()
  21153 ** simply uninstall the sqlite3_io_methods wrapper, invoke the equivalent
  21154 ** method on the lower level VFS, then reinstall the wrapper before returning.
  21155 ** Those that return an integer value use the RECOVER_VFS_WRAPPER macro.
  21156 */
  21157 static int recoverVfsWrite(
  21158   sqlite3_file *pFd, const void *aBuf, int nByte, i64 iOff
  21159 ){
  21160   RECOVER_VFS_WRAPPER (
  21161       pFd->pMethods->xWrite(pFd, aBuf, nByte, iOff)
  21162   );
  21163 }
  21164 static int recoverVfsTruncate(sqlite3_file *pFd, sqlite3_int64 size){
  21165   RECOVER_VFS_WRAPPER (
  21166       pFd->pMethods->xTruncate(pFd, size)
  21167   );
  21168 }
  21169 static int recoverVfsSync(sqlite3_file *pFd, int flags){
  21170   RECOVER_VFS_WRAPPER (
  21171       pFd->pMethods->xSync(pFd, flags)
  21172   );
  21173 }
  21174 static int recoverVfsFileSize(sqlite3_file *pFd, sqlite3_int64 *pSize){
  21175   RECOVER_VFS_WRAPPER (
  21176       pFd->pMethods->xFileSize(pFd, pSize)
  21177   );
  21178 }
  21179 static int recoverVfsLock(sqlite3_file *pFd, int eLock){
  21180   RECOVER_VFS_WRAPPER (
  21181       pFd->pMethods->xLock(pFd, eLock)
  21182   );
  21183 }
  21184 static int recoverVfsUnlock(sqlite3_file *pFd, int eLock){
  21185   RECOVER_VFS_WRAPPER (
  21186       pFd->pMethods->xUnlock(pFd, eLock)
  21187   );
  21188 }
  21189 static int recoverVfsCheckReservedLock(sqlite3_file *pFd, int *pResOut){
  21190   RECOVER_VFS_WRAPPER (
  21191       pFd->pMethods->xCheckReservedLock(pFd, pResOut)
  21192   );
  21193 }
  21194 static int recoverVfsFileControl(sqlite3_file *pFd, int op, void *pArg){
  21195   RECOVER_VFS_WRAPPER (
  21196     (pFd->pMethods ?  pFd->pMethods->xFileControl(pFd, op, pArg) : SQLITE_NOTFOUND)
  21197   );
  21198 }
  21199 static int recoverVfsSectorSize(sqlite3_file *pFd){
  21200   RECOVER_VFS_WRAPPER (
  21201       pFd->pMethods->xSectorSize(pFd)
  21202   );
  21203 }
  21204 static int recoverVfsDeviceCharacteristics(sqlite3_file *pFd){
  21205   RECOVER_VFS_WRAPPER (
  21206       pFd->pMethods->xDeviceCharacteristics(pFd)
  21207   );
  21208 }
  21209 static int recoverVfsShmMap(
  21210   sqlite3_file *pFd, int iPg, int pgsz, int bExtend, void volatile **pp
  21211 ){
  21212   RECOVER_VFS_WRAPPER (
  21213       pFd->pMethods->xShmMap(pFd, iPg, pgsz, bExtend, pp)
  21214   );
  21215 }
  21216 static int recoverVfsShmLock(sqlite3_file *pFd, int offset, int n, int flags){
  21217   RECOVER_VFS_WRAPPER (
  21218       pFd->pMethods->xShmLock(pFd, offset, n, flags)
  21219   );
  21220 }
  21221 static void recoverVfsShmBarrier(sqlite3_file *pFd){
  21222   if( pFd->pMethods==&recover_methods ){
  21223     pFd->pMethods = recover_g.pMethods;
  21224     pFd->pMethods->xShmBarrier(pFd);
  21225     pFd->pMethods = &recover_methods;
  21226   }else{
  21227     pFd->pMethods->xShmBarrier(pFd);
  21228   }
  21229 }
  21230 static int recoverVfsShmUnmap(sqlite3_file *pFd, int deleteFlag){
  21231   RECOVER_VFS_WRAPPER (
  21232       pFd->pMethods->xShmUnmap(pFd, deleteFlag)
  21233   );
  21234 }
  21235 
  21236 static int recoverVfsFetch(
  21237   sqlite3_file *pFd, 
  21238   sqlite3_int64 iOff, 
  21239   int iAmt, 
  21240   void **pp
  21241 ){
  21242   (void)pFd;
  21243   (void)iOff;
  21244   (void)iAmt;
  21245   *pp = 0;
  21246   return SQLITE_OK;
  21247 }
  21248 static int recoverVfsUnfetch(sqlite3_file *pFd, sqlite3_int64 iOff, void *p){
  21249   (void)pFd;
  21250   (void)iOff;
  21251   (void)p;
  21252   return SQLITE_OK;
  21253 }
  21254 
  21255 /*
  21256 ** Install the VFS wrapper around the file-descriptor open on the input
  21257 ** database for recover handle p. Mutex RECOVER_MUTEX_ID must be held
  21258 ** when this function is called.
  21259 */
  21260 static void recoverInstallWrapper(sqlite3_recover *p){
  21261   sqlite3_file *pFd = 0;
  21262   assert( recover_g.pMethods==0 );
  21263   recoverAssertMutexHeld();
  21264   sqlite3_file_control(p->dbIn, p->zDb, SQLITE_FCNTL_FILE_POINTER, (void*)&pFd);
  21265   assert( pFd==0 || pFd->pMethods!=&recover_methods );
  21266   if( pFd && pFd->pMethods ){
  21267     int iVersion = 1 + (pFd->pMethods->iVersion>1 && pFd->pMethods->xShmMap!=0);
  21268     recover_g.pMethods = pFd->pMethods;
  21269     recover_g.p = p;
  21270     recover_methods.iVersion = iVersion;
  21271     pFd->pMethods = &recover_methods;
  21272   }
  21273 }
  21274 
  21275 /*
  21276 ** Uninstall the VFS wrapper that was installed around the file-descriptor open
  21277 ** on the input database for recover handle p. Mutex RECOVER_MUTEX_ID must be
  21278 ** held when this function is called.
  21279 */
  21280 static void recoverUninstallWrapper(sqlite3_recover *p){
  21281   sqlite3_file *pFd = 0;
  21282   recoverAssertMutexHeld();
  21283   sqlite3_file_control(p->dbIn, p->zDb,SQLITE_FCNTL_FILE_POINTER,(void*)&pFd);
  21284   if( pFd && pFd->pMethods ){
  21285     pFd->pMethods = recover_g.pMethods;
  21286     recover_g.pMethods = 0;
  21287     recover_g.p = 0;
  21288   }
  21289 }
  21290 
  21291 /*
  21292 ** This function does the work of a single sqlite3_recover_step() call. It
  21293 ** is guaranteed that the handle is not in an error state when this
  21294 ** function is called.
  21295 */
  21296 static void recoverStep(sqlite3_recover *p){
  21297   assert( p && p->errCode==SQLITE_OK );
  21298   switch( p->eState ){
  21299     case RECOVER_STATE_INIT: {
  21300       int bUseWrapper = 1;
  21301       /* This is the very first call to sqlite3_recover_step() on this object.
  21302       */
  21303       recoverSqlCallback(p, "BEGIN");
  21304       recoverSqlCallback(p, "PRAGMA writable_schema = on");
  21305       recoverSqlCallback(p, "PRAGMA foreign_keys = off");
  21306 
  21307       recoverEnterMutex();
  21308 
  21309       /* Open the output database. And register required virtual tables and 
  21310       ** user functions with the new handle. */
  21311       recoverOpenOutput(p);
  21312 
  21313       /* Attempt to open a transaction and read page 1 of the input database.
  21314       ** Two attempts may be made - one with a wrapper installed to ensure
  21315       ** that the database header is sane, and then if that attempt returns
  21316       ** SQLITE_NOTADB, then again with no wrapper. The second attempt is
  21317       ** required for encrypted databases.  */
  21318       if( p->errCode==SQLITE_OK ){
  21319         do{
  21320           p->errCode = SQLITE_OK;
  21321           if( bUseWrapper ) recoverInstallWrapper(p);
  21322 
  21323           /* Open a transaction on the input database. */
  21324           sqlite3_file_control(p->dbIn, p->zDb, SQLITE_FCNTL_RESET_CACHE, 0);
  21325           recoverExec(p, p->dbIn, "PRAGMA writable_schema = on");
  21326           recoverExec(p, p->dbIn, "BEGIN");
  21327           if( p->errCode==SQLITE_OK ) p->bCloseTransaction = 1;
  21328           recoverExec(p, p->dbIn, "SELECT 1 FROM sqlite_schema");
  21329           recoverTransferSettings(p);
  21330           recoverOpenRecovery(p);
  21331           recoverCacheSchema(p);
  21332 
  21333           if( bUseWrapper ) recoverUninstallWrapper(p);
  21334         }while( p->errCode==SQLITE_NOTADB 
  21335              && (bUseWrapper--) 
  21336              && SQLITE_OK==sqlite3_exec(p->dbIn, "ROLLBACK", 0, 0, 0)
  21337         );
  21338       }
  21339 
  21340       recoverLeaveMutex();
  21341       recoverExec(p, p->dbOut, "BEGIN");
  21342       recoverWriteSchema1(p);
  21343       p->eState = RECOVER_STATE_WRITING;
  21344       break;
  21345     }
  21346       
  21347     case RECOVER_STATE_WRITING: {
  21348       if( p->w1.pTbls==0 ){
  21349         recoverWriteDataInit(p);
  21350       }
  21351       if( SQLITE_DONE==recoverWriteDataStep(p) ){
  21352         recoverWriteDataCleanup(p);
  21353         if( p->zLostAndFound ){
  21354           p->eState = RECOVER_STATE_LOSTANDFOUND1;
  21355         }else{
  21356           p->eState = RECOVER_STATE_SCHEMA2;
  21357         }
  21358       }
  21359       break;
  21360     }
  21361 
  21362     case RECOVER_STATE_LOSTANDFOUND1: {
  21363       if( p->laf.pUsed==0 ){
  21364         recoverLostAndFound1Init(p);
  21365       }
  21366       if( SQLITE_DONE==recoverLostAndFound1Step(p) ){
  21367         p->eState = RECOVER_STATE_LOSTANDFOUND2;
  21368       }
  21369       break;
  21370     }
  21371     case RECOVER_STATE_LOSTANDFOUND2: {
  21372       if( p->laf.pAllAndParent==0 ){
  21373         recoverLostAndFound2Init(p);
  21374       }
  21375       if( SQLITE_DONE==recoverLostAndFound2Step(p) ){
  21376         p->eState = RECOVER_STATE_LOSTANDFOUND3;
  21377       }
  21378       break;
  21379     }
  21380 
  21381     case RECOVER_STATE_LOSTANDFOUND3: {
  21382       if( p->laf.pInsert==0 ){
  21383         recoverLostAndFound3Init(p);
  21384       }
  21385       if( SQLITE_DONE==recoverLostAndFound3Step(p) ){
  21386         p->eState = RECOVER_STATE_SCHEMA2;
  21387       }
  21388       break;
  21389     }
  21390 
  21391     case RECOVER_STATE_SCHEMA2: {
  21392       int rc = SQLITE_OK;
  21393 
  21394       recoverWriteSchema2(p);
  21395       p->eState = RECOVER_STATE_DONE;
  21396 
  21397       /* If no error has occurred, commit the write transaction on the output
  21398       ** database. Regardless of whether or not an error has occurred, make
  21399       ** an attempt to end the read transaction on the input database.  */
  21400       recoverExec(p, p->dbOut, "COMMIT");
  21401       rc = sqlite3_exec(p->dbIn, "END", 0, 0, 0);
  21402       if( p->errCode==SQLITE_OK ) p->errCode = rc;
  21403 
  21404       recoverSqlCallback(p, "PRAGMA writable_schema = off");
  21405       recoverSqlCallback(p, "COMMIT");
  21406       p->eState = RECOVER_STATE_DONE;
  21407       recoverFinalCleanup(p);
  21408       break;
  21409     };
  21410 
  21411     case RECOVER_STATE_DONE: {
  21412       /* no-op */
  21413       break;
  21414     };
  21415   }
  21416 }
  21417 
  21418 
  21419 /*
  21420 ** This is a worker function that does the heavy lifting for both init
  21421 ** functions:
  21422 **
  21423 **     sqlite3_recover_init()
  21424 **     sqlite3_recover_init_sql()
  21425 **
  21426 ** All this function does is allocate space for the recover handle and
  21427 ** take copies of the input parameters. All the real work is done within
  21428 ** sqlite3_recover_run().
  21429 */
  21430 sqlite3_recover *recoverInit(
  21431   sqlite3* db, 
  21432   const char *zDb, 
  21433   const char *zUri,               /* Output URI for _recover_init() */
  21434   int (*xSql)(void*, const char*),/* SQL callback for _recover_init_sql() */
  21435   void *pSqlCtx                   /* Context arg for _recover_init_sql() */
  21436 ){
  21437   sqlite3_recover *pRet = 0;
  21438   int nDb = 0;
  21439   int nUri = 0;
  21440   int nByte = 0;
  21441 
  21442   if( zDb==0 ){ zDb = "main"; }
  21443 
  21444   nDb = recoverStrlen(zDb);
  21445   nUri = recoverStrlen(zUri);
  21446 
  21447   nByte = sizeof(sqlite3_recover) + nDb+1 + nUri+1;
  21448   pRet = (sqlite3_recover*)sqlite3_malloc(nByte);
  21449   if( pRet ){
  21450     memset(pRet, 0, nByte);
  21451     pRet->dbIn = db;
  21452     pRet->zDb = (char*)&pRet[1];
  21453     pRet->zUri = &pRet->zDb[nDb+1];
  21454     memcpy(pRet->zDb, zDb, nDb);
  21455     if( nUri>0 && zUri ) memcpy(pRet->zUri, zUri, nUri);
  21456     pRet->xSql = xSql;
  21457     pRet->pSqlCtx = pSqlCtx;
  21458     pRet->bRecoverRowid = RECOVER_ROWID_DEFAULT;
  21459   }
  21460 
  21461   return pRet;
  21462 }
  21463 
  21464 /*
  21465 ** Initialize a recovery handle that creates a new database containing
  21466 ** the recovered data.
  21467 */
  21468 sqlite3_recover *sqlite3_recover_init(
  21469   sqlite3* db, 
  21470   const char *zDb, 
  21471   const char *zUri
  21472 ){
  21473   return recoverInit(db, zDb, zUri, 0, 0);
  21474 }
  21475 
  21476 /*
  21477 ** Initialize a recovery handle that returns recovered data in the
  21478 ** form of SQL statements via a callback.
  21479 */
  21480 sqlite3_recover *sqlite3_recover_init_sql(
  21481   sqlite3* db, 
  21482   const char *zDb, 
  21483   int (*xSql)(void*, const char*),
  21484   void *pSqlCtx
  21485 ){
  21486   return recoverInit(db, zDb, 0, xSql, pSqlCtx);
  21487 }
  21488 
  21489 /*
  21490 ** Return the handle error message, if any.
  21491 */
  21492 const char *sqlite3_recover_errmsg(sqlite3_recover *p){
  21493   return (p && p->errCode!=SQLITE_NOMEM) ? p->zErrMsg : "out of memory";
  21494 }
  21495 
  21496 /*
  21497 ** Return the handle error code.
  21498 */
  21499 int sqlite3_recover_errcode(sqlite3_recover *p){
  21500   return p ? p->errCode : SQLITE_NOMEM;
  21501 }
  21502 
  21503 /*
  21504 ** Configure the handle.
  21505 */
  21506 int sqlite3_recover_config(sqlite3_recover *p, int op, void *pArg){
  21507   int rc = SQLITE_OK;
  21508   if( p==0 ){
  21509     rc = SQLITE_NOMEM;
  21510   }else if( p->eState!=RECOVER_STATE_INIT ){
  21511     rc = SQLITE_MISUSE;
  21512   }else{
  21513     switch( op ){
  21514       case 789:
  21515         /* This undocumented magic configuration option is used to set the
  21516         ** name of the auxiliary database that is ATTACH-ed to the database
  21517         ** connection and used to hold state information during the
  21518         ** recovery process.  This option is for debugging use only and
  21519         ** is subject to change or removal at any time. */
  21520         sqlite3_free(p->zStateDb);
  21521         p->zStateDb = recoverMPrintf(p, "%s", (char*)pArg);
  21522         break;
  21523 
  21524       case SQLITE_RECOVER_LOST_AND_FOUND: {
  21525         const char *zArg = (const char*)pArg;
  21526         sqlite3_free(p->zLostAndFound);
  21527         if( zArg ){
  21528           p->zLostAndFound = recoverMPrintf(p, "%s", zArg);
  21529         }else{
  21530           p->zLostAndFound = 0;
  21531         }
  21532         break;
  21533       }
  21534 
  21535       case SQLITE_RECOVER_FREELIST_CORRUPT:
  21536         p->bFreelistCorrupt = *(int*)pArg;
  21537         break;
  21538 
  21539       case SQLITE_RECOVER_ROWIDS:
  21540         p->bRecoverRowid = *(int*)pArg;
  21541         break;
  21542 
  21543       case SQLITE_RECOVER_SLOWINDEXES:
  21544         p->bSlowIndexes = *(int*)pArg;
  21545         break;
  21546 
  21547       default:
  21548         rc = SQLITE_NOTFOUND;
  21549         break;
  21550     }
  21551   }
  21552 
  21553   return rc;
  21554 }
  21555 
  21556 /*
  21557 ** Do a unit of work towards the recovery job. Return SQLITE_OK if
  21558 ** no error has occurred but database recovery is not finished, SQLITE_DONE
  21559 ** if database recovery has been successfully completed, or an SQLite
  21560 ** error code if an error has occurred.
  21561 */
  21562 int sqlite3_recover_step(sqlite3_recover *p){
  21563   if( p==0 ) return SQLITE_NOMEM;
  21564   if( p->errCode==SQLITE_OK ) recoverStep(p);
  21565   if( p->eState==RECOVER_STATE_DONE && p->errCode==SQLITE_OK ){
  21566     return SQLITE_DONE;
  21567   }
  21568   return p->errCode;
  21569 }
  21570 
  21571 /*
  21572 ** Do the configured recovery operation. Return SQLITE_OK if successful, or
  21573 ** else an SQLite error code.
  21574 */
  21575 int sqlite3_recover_run(sqlite3_recover *p){
  21576   while( SQLITE_OK==sqlite3_recover_step(p) );
  21577   return sqlite3_recover_errcode(p);
  21578 }
  21579 
  21580 
  21581 /*
  21582 ** Free all resources associated with the recover handle passed as the only
  21583 ** argument. The results of using a handle with any sqlite3_recover_**
  21584 ** API function after it has been passed to this function are undefined.
  21585 **
  21586 ** A copy of the value returned by the first call made to sqlite3_recover_run()
  21587 ** on this handle is returned, or SQLITE_OK if sqlite3_recover_run() has
  21588 ** not been called on this handle.
  21589 */
  21590 int sqlite3_recover_finish(sqlite3_recover *p){
  21591   int rc;
  21592   if( p==0 ){
  21593     rc = SQLITE_NOMEM;
  21594   }else{
  21595     recoverFinalCleanup(p);
  21596     if( p->bCloseTransaction && sqlite3_get_autocommit(p->dbIn)==0 ){
  21597       rc = sqlite3_exec(p->dbIn, "END", 0, 0, 0);
  21598       if( p->errCode==SQLITE_OK ) p->errCode = rc;
  21599     }
  21600     rc = p->errCode;
  21601     sqlite3_free(p->zErrMsg);
  21602     sqlite3_free(p->zStateDb);
  21603     sqlite3_free(p->zLostAndFound);
  21604     sqlite3_free(p->pPage1Cache);
  21605     sqlite3_free(p);
  21606   }
  21607   return rc;
  21608 }
  21609 
  21610 #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
  21611 
  21612 /************************* End ../ext/recover/sqlite3recover.c ********************/
  21613 # endif /* SQLITE_HAVE_SQLITE3R */
  21614 #endif
  21615 #ifdef SQLITE_SHELL_EXTSRC
  21616 # include SHELL_STRINGIFY(SQLITE_SHELL_EXTSRC)
  21617 #endif
  21618 
  21619 #if defined(SQLITE_ENABLE_SESSION)
  21620 /*
  21621 ** State information for a single open session
  21622 */
  21623 typedef struct OpenSession OpenSession;
  21624 struct OpenSession {
  21625   char *zName;             /* Symbolic name for this session */
  21626   int nFilter;             /* Number of xFilter rejection GLOB patterns */
  21627   char **azFilter;         /* Array of xFilter rejection GLOB patterns */
  21628   sqlite3_session *p;      /* The open session */
  21629 };
  21630 #endif
  21631 
  21632 typedef struct ExpertInfo ExpertInfo;
  21633 struct ExpertInfo {
  21634   sqlite3expert *pExpert;
  21635   int bVerbose;
  21636 };
  21637 
  21638 /* A single line in the EQP output */
  21639 typedef struct EQPGraphRow EQPGraphRow;
  21640 struct EQPGraphRow {
  21641   int iEqpId;           /* ID for this row */
  21642   int iParentId;        /* ID of the parent row */
  21643   EQPGraphRow *pNext;   /* Next row in sequence */
  21644   char zText[1];        /* Text to display for this row */
  21645 };
  21646 
  21647 /* All EQP output is collected into an instance of the following */
  21648 typedef struct EQPGraph EQPGraph;
  21649 struct EQPGraph {
  21650   EQPGraphRow *pRow;    /* Linked list of all rows of the EQP output */
  21651   EQPGraphRow *pLast;   /* Last element of the pRow list */
  21652   char zPrefix[100];    /* Graph prefix */
  21653 };
  21654 
  21655 /* Parameters affecting columnar mode result display (defaulting together) */
  21656 typedef struct ColModeOpts {
  21657   int iWrap;            /* In columnar modes, wrap lines reaching this limit */
  21658   u8 bQuote;            /* Quote results for .mode box and table */
  21659   u8 bWordWrap;         /* In columnar modes, wrap at word boundaries  */
  21660 } ColModeOpts;
  21661 #define ColModeOpts_default { 60, 0, 0 }
  21662 #define ColModeOpts_default_qbox { 60, 1, 0 }
  21663 
  21664 /*
  21665 ** State information about the database connection is contained in an
  21666 ** instance of the following structure.
  21667 */
  21668 typedef struct ShellState ShellState;
  21669 struct ShellState {
  21670   sqlite3 *db;           /* The database */
  21671   u8 autoExplain;        /* Automatically turn on .explain mode */
  21672   u8 autoEQP;            /* Run EXPLAIN QUERY PLAN prior to each SQL stmt */
  21673   u8 autoEQPtest;        /* autoEQP is in test mode */
  21674   u8 autoEQPtrace;       /* autoEQP is in trace mode */
  21675   u8 scanstatsOn;        /* True to display scan stats before each finalize */
  21676   u8 openMode;           /* SHELL_OPEN_NORMAL, _APPENDVFS, or _ZIPFILE */
  21677   u8 doXdgOpen;          /* Invoke start/open/xdg-open in output_reset() */
  21678   u8 nEqpLevel;          /* Depth of the EQP output graph */
  21679   u8 eTraceType;         /* SHELL_TRACE_* value for type of trace */
  21680   u8 bSafeMode;          /* True to prohibit unsafe operations */
  21681   u8 bSafeModePersist;   /* The long-term value of bSafeMode */
  21682   u8 eRestoreState;      /* See comments above doAutoDetectRestore() */
  21683   u8 crlfMode;           /* Do NL-to-CRLF translations when enabled (maybe) */
  21684   u8 eEscMode;           /* Escape mode for text output */
  21685   ColModeOpts cmOpts;    /* Option values affecting columnar mode output */
  21686   unsigned statsOn;      /* True to display memory stats before each finalize */
  21687   unsigned mEqpLines;    /* Mask of vertical lines in the EQP output graph */
  21688   int inputNesting;      /* Track nesting level of .read and other redirects */
  21689   int outCount;          /* Revert to stdout when reaching zero */
  21690   int cnt;               /* Number of records displayed so far */
  21691   int lineno;            /* Line number of last line read from in */
  21692   int openFlags;         /* Additional flags to open.  (SQLITE_OPEN_NOFOLLOW) */
  21693   FILE *in;              /* Read commands from this stream */
  21694   FILE *out;             /* Write results here */
  21695   FILE *traceOut;        /* Output for sqlite3_trace() */
  21696   int nErr;              /* Number of errors seen */
  21697   int mode;              /* An output mode setting */
  21698   int modePrior;         /* Saved mode */
  21699   int cMode;             /* temporary output mode for the current query */
  21700   int normalMode;        /* Output mode before ".explain on" */
  21701   int writableSchema;    /* True if PRAGMA writable_schema=ON */
  21702   int showHeader;        /* True to show column names in List or Column mode */
  21703   int nCheck;            /* Number of ".check" commands run */
  21704   unsigned nProgress;    /* Number of progress callbacks encountered */
  21705   unsigned mxProgress;   /* Maximum progress callbacks before failing */
  21706   unsigned flgProgress;  /* Flags for the progress callback */
  21707   unsigned shellFlgs;    /* Various flags */
  21708   unsigned priorShFlgs;  /* Saved copy of flags */
  21709   sqlite3_int64 szMax;   /* --maxsize argument to .open */
  21710   char *zDestTable;      /* Name of destination table when MODE_Insert */
  21711   char *zTempFile;       /* Temporary file that might need deleting */
  21712   char zTestcase[30];    /* Name of current test case */
  21713   char colSeparator[20]; /* Column separator character for several modes */
  21714   char rowSeparator[20]; /* Row separator character for MODE_Ascii */
  21715   char colSepPrior[20];  /* Saved column separator */
  21716   char rowSepPrior[20];  /* Saved row separator */
  21717   int *colWidth;         /* Requested width of each column in columnar modes */
  21718   int *actualWidth;      /* Actual width of each column */
  21719   int nWidth;            /* Number of slots in colWidth[] and actualWidth[] */
  21720   char nullValue[20];    /* The text to print when a NULL comes back from
  21721                          ** the database */
  21722   char outfile[FILENAME_MAX]; /* Filename for *out */
  21723   sqlite3_stmt *pStmt;   /* Current statement if any. */
  21724   FILE *pLog;            /* Write log output here */
  21725   struct AuxDb {         /* Storage space for auxiliary database connections */
  21726     sqlite3 *db;               /* Connection pointer */
  21727     const char *zDbFilename;   /* Filename used to open the connection */
  21728     char *zFreeOnClose;        /* Free this memory allocation on close */
  21729 #if defined(SQLITE_ENABLE_SESSION)
  21730     int nSession;              /* Number of active sessions */
  21731     OpenSession aSession[4];   /* Array of sessions.  [0] is in focus. */
  21732 #endif
  21733   } aAuxDb[5],           /* Array of all database connections */
  21734     *pAuxDb;             /* Currently active database connection */
  21735   int *aiIndent;         /* Array of indents used in MODE_Explain */
  21736   int nIndent;           /* Size of array aiIndent[] */
  21737   int iIndent;           /* Index of current op in aiIndent[] */
  21738   char *zNonce;          /* Nonce for temporary safe-mode escapes */
  21739   EQPGraph sGraph;       /* Information for the graphical EXPLAIN QUERY PLAN */
  21740   ExpertInfo expert;     /* Valid if previous command was ".expert OPT..." */
  21741 #ifdef SQLITE_SHELL_FIDDLE
  21742   struct {
  21743     const char * zInput; /* Input string from wasm/JS proxy */
  21744     const char * zPos;   /* Cursor pos into zInput */
  21745     const char * zDefaultDbName; /* Default name for db file */
  21746   } wasm;
  21747 #endif
  21748 };
  21749 
  21750 #ifdef SQLITE_SHELL_FIDDLE
  21751 static ShellState shellState;
  21752 #endif
  21753 
  21754 
  21755 /* Allowed values for ShellState.autoEQP
  21756 */
  21757 #define AUTOEQP_off      0           /* Automatic EXPLAIN QUERY PLAN is off */
  21758 #define AUTOEQP_on       1           /* Automatic EQP is on */
  21759 #define AUTOEQP_trigger  2           /* On and also show plans for triggers */
  21760 #define AUTOEQP_full     3           /* Show full EXPLAIN */
  21761 
  21762 /* Allowed values for ShellState.openMode
  21763 */
  21764 #define SHELL_OPEN_UNSPEC      0      /* No open-mode specified */
  21765 #define SHELL_OPEN_NORMAL      1      /* Normal database file */
  21766 #define SHELL_OPEN_APPENDVFS   2      /* Use appendvfs */
  21767 #define SHELL_OPEN_ZIPFILE     3      /* Use the zipfile virtual table */
  21768 #define SHELL_OPEN_READONLY    4      /* Open a normal database read-only */
  21769 #define SHELL_OPEN_DESERIALIZE 5      /* Open using sqlite3_deserialize() */
  21770 #define SHELL_OPEN_HEXDB       6      /* Use "dbtotxt" output as data source */
  21771 
  21772 /* Allowed values for ShellState.eTraceType
  21773 */
  21774 #define SHELL_TRACE_PLAIN      0      /* Show input SQL text */
  21775 #define SHELL_TRACE_EXPANDED   1      /* Show expanded SQL text */
  21776 #define SHELL_TRACE_NORMALIZED 2      /* Show normalized SQL text */
  21777 
  21778 /* Bits in the ShellState.flgProgress variable */
  21779 #define SHELL_PROGRESS_QUIET 0x01  /* Omit announcing every progress callback */
  21780 #define SHELL_PROGRESS_RESET 0x02  /* Reset the count when the progress
  21781                                    ** callback limit is reached, and for each
  21782                                    ** top-level SQL statement */
  21783 #define SHELL_PROGRESS_ONCE  0x04  /* Cancel the --limit after firing once */
  21784 
  21785 /* Allowed values for ShellState.eEscMode.  The default value should
  21786 ** be 0, so to change the default, reorder the names.
  21787 */
  21788 #define SHELL_ESC_ASCII        0      /* Substitute ^Y for X where Y=X+0x40 */
  21789 #define SHELL_ESC_SYMBOL       1      /* Substitute U+2400 graphics */
  21790 #define SHELL_ESC_OFF          2      /* Send characters verbatim */
  21791 
  21792 static const char *shell_EscModeNames[] = { "ascii", "symbol", "off" };
  21793 
  21794 /*
  21795 ** These are the allowed shellFlgs values
  21796 */
  21797 #define SHFLG_Pagecache      0x00000001 /* The --pagecache option is used */
  21798 #define SHFLG_Lookaside      0x00000002 /* Lookaside memory is used */
  21799 #define SHFLG_Backslash      0x00000004 /* The --backslash option is used */
  21800 #define SHFLG_PreserveRowid  0x00000008 /* .dump preserves rowid values */
  21801 #define SHFLG_Newlines       0x00000010 /* .dump --newline flag */
  21802 #define SHFLG_CountChanges   0x00000020 /* .changes setting */
  21803 #define SHFLG_Echo           0x00000040 /* .echo on/off, or --echo setting */
  21804 #define SHFLG_HeaderSet      0x00000080 /* showHeader has been specified */
  21805 #define SHFLG_DumpDataOnly   0x00000100 /* .dump show data only */
  21806 #define SHFLG_DumpNoSys      0x00000200 /* .dump omits system tables */
  21807 #define SHFLG_TestingMode    0x00000400 /* allow unsafe testing features */
  21808 
  21809 /*
  21810 ** Macros for testing and setting shellFlgs
  21811 */
  21812 #define ShellHasFlag(P,X)    (((P)->shellFlgs & (X))!=0)
  21813 #define ShellSetFlag(P,X)    ((P)->shellFlgs|=(X))
  21814 #define ShellClearFlag(P,X)  ((P)->shellFlgs&=(~(X)))
  21815 
  21816 /*
  21817 ** These are the allowed modes.
  21818 */
  21819 #define MODE_Line     0  /* One column per line.  Blank line between records */
  21820 #define MODE_Column   1  /* One record per line in neat columns */
  21821 #define MODE_List     2  /* One record per line with a separator */
  21822 #define MODE_Semi     3  /* Same as MODE_List but append ";" to each line */
  21823 #define MODE_Html     4  /* Generate an XHTML table */
  21824 #define MODE_Insert   5  /* Generate SQL "insert" statements */
  21825 #define MODE_Quote    6  /* Quote values as for SQL */
  21826 #define MODE_Tcl      7  /* Generate ANSI-C or TCL quoted elements */
  21827 #define MODE_Csv      8  /* Quote strings, numbers are plain */
  21828 #define MODE_Explain  9  /* Like MODE_Column, but do not truncate data */
  21829 #define MODE_Ascii   10  /* Use ASCII unit and record separators (0x1F/0x1E) */
  21830 #define MODE_Pretty  11  /* Pretty-print schemas */
  21831 #define MODE_EQP     12  /* Converts EXPLAIN QUERY PLAN output into a graph */
  21832 #define MODE_Json    13  /* Output JSON */
  21833 #define MODE_Markdown 14 /* Markdown formatting */
  21834 #define MODE_Table   15  /* MySQL-style table formatting */
  21835 #define MODE_Box     16  /* Unicode box-drawing characters */
  21836 #define MODE_Count   17  /* Output only a count of the rows of output */
  21837 #define MODE_Off     18  /* No query output shown */
  21838 #define MODE_ScanExp 19  /* Like MODE_Explain, but for ".scanstats vm" */
  21839 #define MODE_Www     20  /* Full web-page output */
  21840 
  21841 static const char *modeDescr[] = {
  21842   "line",
  21843   "column",
  21844   "list",
  21845   "semi",
  21846   "html",
  21847   "insert",
  21848   "quote",
  21849   "tcl",
  21850   "csv",
  21851   "explain",
  21852   "ascii",
  21853   "prettyprint",
  21854   "eqp",
  21855   "json",
  21856   "markdown",
  21857   "table",
  21858   "box",
  21859   "count",
  21860   "off",
  21861   "scanexp",
  21862   "www",
  21863 };
  21864 
  21865 /*
  21866 ** These are the column/row/line separators used by the various
  21867 ** import/export modes.
  21868 */
  21869 #define SEP_Column    "|"
  21870 #define SEP_Row       "\n"
  21871 #define SEP_Tab       "\t"
  21872 #define SEP_Space     " "
  21873 #define SEP_Comma     ","
  21874 #define SEP_CrLf      "\r\n"
  21875 #define SEP_Unit      "\x1F"
  21876 #define SEP_Record    "\x1E"
  21877 
  21878 /*
  21879 ** Limit input nesting via .read or any other input redirect.
  21880 ** It's not too expensive, so a generous allowance can be made.
  21881 */
  21882 #define MAX_INPUT_NESTING 25
  21883 
  21884 /*
  21885 ** A callback for the sqlite3_log() interface.
  21886 */
  21887 static void shellLog(void *pArg, int iErrCode, const char *zMsg){
  21888   ShellState *p = (ShellState*)pArg;
  21889   if( p->pLog==0 ) return;
  21890   sqlite3_fprintf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
  21891   fflush(p->pLog);
  21892 }
  21893 
  21894 /*
  21895 ** SQL function:  shell_putsnl(X)
  21896 **
  21897 ** Write the text X to the screen (or whatever output is being directed)
  21898 ** adding a newline at the end, and then return X.
  21899 */
  21900 static void shellPutsFunc(
  21901   sqlite3_context *pCtx,
  21902   int nVal,
  21903   sqlite3_value **apVal
  21904 ){
  21905   ShellState *p = (ShellState*)sqlite3_user_data(pCtx);
  21906   (void)nVal;
  21907   sqlite3_fprintf(p->out, "%s\n", sqlite3_value_text(apVal[0]));
  21908   sqlite3_result_value(pCtx, apVal[0]);
  21909 }
  21910 
  21911 /*
  21912 ** If in safe mode, print an error message described by the arguments
  21913 ** and exit immediately.
  21914 */
  21915 static void failIfSafeMode(
  21916   ShellState *p,
  21917   const char *zErrMsg,
  21918   ...
  21919 ){
  21920   if( p->bSafeMode ){
  21921     va_list ap;
  21922     char *zMsg;
  21923     va_start(ap, zErrMsg);
  21924     zMsg = sqlite3_vmprintf(zErrMsg, ap);
  21925     va_end(ap);
  21926     sqlite3_fprintf(stderr, "line %d: %s\n", p->lineno, zMsg);
  21927     exit(1);
  21928   }
  21929 }
  21930 
  21931 /*
  21932 ** SQL function:   edit(VALUE)
  21933 **                 edit(VALUE,EDITOR)
  21934 **
  21935 ** These steps:
  21936 **
  21937 **     (1) Write VALUE into a temporary file.
  21938 **     (2) Run program EDITOR on that temporary file.
  21939 **     (3) Read the temporary file back and return its content as the result.
  21940 **     (4) Delete the temporary file
  21941 **
  21942 ** If the EDITOR argument is omitted, use the value in the VISUAL
  21943 ** environment variable.  If still there is no EDITOR, through an error.
  21944 **
  21945 ** Also throw an error if the EDITOR program returns a non-zero exit code.
  21946 */
  21947 #ifndef SQLITE_NOHAVE_SYSTEM
  21948 static void editFunc(
  21949   sqlite3_context *context,
  21950   int argc,
  21951   sqlite3_value **argv
  21952 ){
  21953   const char *zEditor;
  21954   char *zTempFile = 0;
  21955   sqlite3 *db;
  21956   char *zCmd = 0;
  21957   int bBin;
  21958   int rc;
  21959   int hasCRLF = 0;
  21960   FILE *f = 0;
  21961   sqlite3_int64 sz;
  21962   sqlite3_int64 x;
  21963   unsigned char *p = 0;
  21964 
  21965   if( argc==2 ){
  21966     zEditor = (const char*)sqlite3_value_text(argv[1]);
  21967   }else{
  21968     zEditor = getenv("VISUAL");
  21969   }
  21970   if( zEditor==0 ){
  21971     sqlite3_result_error(context, "no editor for edit()", -1);
  21972     return;
  21973   }
  21974   if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
  21975     sqlite3_result_error(context, "NULL input to edit()", -1);
  21976     return;
  21977   }
  21978   db = sqlite3_context_db_handle(context);
  21979   zTempFile = 0;
  21980   sqlite3_file_control(db, 0, SQLITE_FCNTL_TEMPFILENAME, &zTempFile);
  21981   if( zTempFile==0 ){
  21982     sqlite3_uint64 r = 0;
  21983     sqlite3_randomness(sizeof(r), &r);
  21984     zTempFile = sqlite3_mprintf("temp%llx", r);
  21985     if( zTempFile==0 ){
  21986       sqlite3_result_error_nomem(context);
  21987       return;
  21988     }
  21989   }
  21990   bBin = sqlite3_value_type(argv[0])==SQLITE_BLOB;
  21991   /* When writing the file to be edited, do \n to \r\n conversions on systems
  21992   ** that want \r\n line endings */
  21993   f = sqlite3_fopen(zTempFile, bBin ? "wb" : "w");
  21994   if( f==0 ){
  21995     sqlite3_result_error(context, "edit() cannot open temp file", -1);
  21996     goto edit_func_end;
  21997   }
  21998   sz = sqlite3_value_bytes(argv[0]);
  21999   if( bBin ){
  22000     x = fwrite(sqlite3_value_blob(argv[0]), 1, (size_t)sz, f);
  22001   }else{
  22002     const char *z = (const char*)sqlite3_value_text(argv[0]);
  22003     /* Remember whether or not the value originally contained \r\n */
  22004     if( z && strstr(z,"\r\n")!=0 ) hasCRLF = 1;
  22005     x = fwrite(sqlite3_value_text(argv[0]), 1, (size_t)sz, f);
  22006   }
  22007   fclose(f);
  22008   f = 0;
  22009   if( x!=sz ){
  22010     sqlite3_result_error(context, "edit() could not write the whole file", -1);
  22011     goto edit_func_end;
  22012   }
  22013   zCmd = sqlite3_mprintf("%s \"%s\"", zEditor, zTempFile);
  22014   if( zCmd==0 ){
  22015     sqlite3_result_error_nomem(context);
  22016     goto edit_func_end;
  22017   }
  22018   rc = system(zCmd);
  22019   sqlite3_free(zCmd);
  22020   if( rc ){
  22021     sqlite3_result_error(context, "EDITOR returned non-zero", -1);
  22022     goto edit_func_end;
  22023   }
  22024   f = sqlite3_fopen(zTempFile, "rb");
  22025   if( f==0 ){
  22026     sqlite3_result_error(context,
  22027       "edit() cannot reopen temp file after edit", -1);
  22028     goto edit_func_end;
  22029   }
  22030   fseek(f, 0, SEEK_END);
  22031   sz = ftell(f);
  22032   rewind(f);
  22033   p = sqlite3_malloc64( sz+1 );
  22034   if( p==0 ){
  22035     sqlite3_result_error_nomem(context);
  22036     goto edit_func_end;
  22037   }
  22038   x = fread(p, 1, (size_t)sz, f);
  22039   fclose(f);
  22040   f = 0;
  22041   if( x!=sz ){
  22042     sqlite3_result_error(context, "could not read back the whole file", -1);
  22043     goto edit_func_end;
  22044   }
  22045   if( bBin ){
  22046     sqlite3_result_blob64(context, p, sz, sqlite3_free);
  22047   }else{
  22048     sqlite3_int64 i, j;
  22049     if( hasCRLF ){
  22050       /* If the original contains \r\n then do no conversions back to \n */
  22051     }else{
  22052       /* If the file did not originally contain \r\n then convert any new
  22053       ** \r\n back into \n */
  22054       p[sz] = 0;
  22055       for(i=j=0; i<sz; i++){
  22056         if( p[i]=='\r' && p[i+1]=='\n' ) i++;
  22057         p[j++] = p[i];
  22058       }
  22059       sz = j;
  22060       p[sz] = 0;
  22061     }
  22062     sqlite3_result_text64(context, (const char*)p, sz,
  22063                           sqlite3_free, SQLITE_UTF8);
  22064   }
  22065   p = 0;
  22066 
  22067 edit_func_end:
  22068   if( f ) fclose(f);
  22069   unlink(zTempFile);
  22070   sqlite3_free(zTempFile);
  22071   sqlite3_free(p);
  22072 }
  22073 #endif /* SQLITE_NOHAVE_SYSTEM */
  22074 
  22075 /*
  22076 ** Save or restore the current output mode
  22077 */
  22078 static void outputModePush(ShellState *p){
  22079   p->modePrior = p->mode;
  22080   p->priorShFlgs = p->shellFlgs;
  22081   memcpy(p->colSepPrior, p->colSeparator, sizeof(p->colSeparator));
  22082   memcpy(p->rowSepPrior, p->rowSeparator, sizeof(p->rowSeparator));
  22083 }
  22084 static void outputModePop(ShellState *p){
  22085   p->mode = p->modePrior;
  22086   p->shellFlgs = p->priorShFlgs;
  22087   memcpy(p->colSeparator, p->colSepPrior, sizeof(p->colSeparator));
  22088   memcpy(p->rowSeparator, p->rowSepPrior, sizeof(p->rowSeparator));
  22089 }
  22090 
  22091 /*
  22092 ** Set output mode to text or binary for Windows.
  22093 */
  22094 static void setCrlfMode(ShellState *p){
  22095 #ifdef _WIN32
  22096   if( p->crlfMode ){
  22097     sqlite3_fsetmode(p->out, _O_TEXT);
  22098   }else{
  22099     sqlite3_fsetmode(p->out, _O_BINARY);
  22100   }
  22101 #else
  22102   UNUSED_PARAMETER(p);
  22103 #endif    
  22104 }
  22105 
  22106 /*
  22107 ** Output the given string as a hex-encoded blob (eg. X'1234' )
  22108 */
  22109 static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
  22110   int i;
  22111   unsigned char *aBlob = (unsigned char*)pBlob;
  22112 
  22113   char *zStr = sqlite3_malloc(nBlob*2 + 1);
  22114   shell_check_oom(zStr);
  22115 
  22116   for(i=0; i<nBlob; i++){
  22117     static const char aHex[] = {
  22118         '0', '1', '2', '3', '4', '5', '6', '7',
  22119         '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
  22120     };
  22121     zStr[i*2] = aHex[ (aBlob[i] >> 4) ];
  22122     zStr[i*2+1] = aHex[ (aBlob[i] & 0x0F) ];
  22123   }
  22124   zStr[i*2] = '\0';
  22125 
  22126   sqlite3_fprintf(out, "X'%s'", zStr);
  22127   sqlite3_free(zStr);
  22128 }
  22129 
  22130 /*
  22131 ** Output the given string as a quoted string using SQL quoting conventions:
  22132 **
  22133 **   (1)   Single quotes (') within the string are doubled
  22134 **   (2)   The whle string is enclosed in '...'
  22135 **   (3)   Control characters other than \n, \t, and \r\n are escaped
  22136 **         using \u00XX notation and if such substitutions occur,
  22137 **         the whole string is enclosed in unistr('...') instead of '...'.
  22138 **         
  22139 ** Step (3) is omitted if the control-character escape mode is OFF.
  22140 **
  22141 ** See also: output_quoted_escaped_string() which does the same except
  22142 ** that it does not make exceptions for \n, \t, and \r\n in step (3).
  22143 */
  22144 static void output_quoted_string(ShellState *p, const char *zInX){
  22145   int i;
  22146   int needUnistr = 0;
  22147   int needDblQuote = 0;
  22148   const unsigned char *z = (const unsigned char*)zInX;
  22149   unsigned char c;
  22150   FILE *out = p->out;
  22151   sqlite3_fsetmode(out, _O_BINARY);
  22152   if( z==0 ) return;
  22153   for(i=0; (c = z[i])!=0; i++){
  22154     if( c=='\'' ){ needDblQuote = 1; }
  22155     if( c>0x1f ) continue;
  22156     if( c=='\t' || c=='\n' ) continue;
  22157     if( c=='\r' && z[i+1]=='\n' ) continue;
  22158     needUnistr = 1;
  22159     break;
  22160   }
  22161   if( (needDblQuote==0 && needUnistr==0)
  22162    || (needDblQuote==0 && p->eEscMode==SHELL_ESC_OFF)
  22163   ){
  22164     sqlite3_fprintf(out, "'%s'",z);
  22165   }else if( p->eEscMode==SHELL_ESC_OFF ){
  22166     char *zEncoded = sqlite3_mprintf("%Q", z);
  22167     sqlite3_fputs(zEncoded, out);
  22168     sqlite3_free(zEncoded);
  22169   }else{
  22170     if( needUnistr ){
  22171       sqlite3_fputs("unistr('", out);
  22172     }else{
  22173       sqlite3_fputs("'", out);
  22174     }
  22175     while( *z ){
  22176       for(i=0; (c = z[i])!=0; i++){
  22177         if( c=='\'' ) break;
  22178         if( c>0x1f ) continue;
  22179         if( c=='\t' || c=='\n' ) continue;
  22180         if( c=='\r' && z[i+1]=='\n' ) continue;
  22181         break;
  22182       }
  22183       if( i ){
  22184         sqlite3_fprintf(out, "%.*s", i, z);
  22185         z += i;
  22186       }
  22187       if( c==0 ) break;
  22188       if( c=='\'' ){
  22189         sqlite3_fputs("''", out);
  22190       }else{
  22191         sqlite3_fprintf(out, "\\u%04x", c);
  22192       }
  22193       z++;
  22194     }
  22195     if( needUnistr ){
  22196       sqlite3_fputs("')", out);
  22197     }else{
  22198       sqlite3_fputs("'", out);
  22199     }
  22200   }
  22201   setCrlfMode(p);
  22202 }
  22203 
  22204 /*
  22205 ** Output the given string as a quoted string using SQL quoting conventions.
  22206 ** Additionallly , escape the "\n" and "\r" characters so that they do not
  22207 ** get corrupted by end-of-line translation facilities in some operating
  22208 ** systems.
  22209 **
  22210 ** This is like output_quoted_string() but with the addition of the \r\n
  22211 ** escape mechanism.
  22212 */
  22213 static void output_quoted_escaped_string(ShellState *p, const char *z){
  22214   char *zEscaped;
  22215   sqlite3_fsetmode(p->out, _O_BINARY);
  22216   if( p->eEscMode==SHELL_ESC_OFF ){
  22217     zEscaped = sqlite3_mprintf("%Q", z);
  22218   }else{
  22219     zEscaped = sqlite3_mprintf("%#Q", z);
  22220   }
  22221   sqlite3_fputs(zEscaped, p->out);
  22222   sqlite3_free(zEscaped);
  22223   setCrlfMode(p);
  22224 }
  22225 
  22226 /*
  22227 ** Find earliest of chars within s specified in zAny.
  22228 ** With ns == ~0, is like strpbrk(s,zAny) and s must be 0-terminated.
  22229 */
  22230 static const char *anyOfInStr(const char *s, const char *zAny, size_t ns){
  22231   const char *pcFirst = 0;
  22232   if( ns == ~(size_t)0 ) ns = strlen(s);
  22233   while(*zAny){
  22234     const char *pc = (const char*)memchr(s, *zAny&0xff, ns);
  22235     if( pc ){
  22236       pcFirst = pc;
  22237       ns = pcFirst - s;
  22238     }
  22239     ++zAny;
  22240   }
  22241   return pcFirst;
  22242 }
  22243 
  22244 /* Skip over as much z[] input char sequence as is valid UTF-8,
  22245 ** limited per nAccept char's or whole characters and containing
  22246 ** no char cn such that ((1<<cn) & ccm)!=0. On return, the
  22247 ** sequence z:return (inclusive:exclusive) is validated UTF-8.
  22248 ** Limit: nAccept>=0 => char count, nAccept<0 => character
  22249  */
  22250 const char *zSkipValidUtf8(const char *z, int nAccept, long ccm){
  22251   int ng = (nAccept<0)? -nAccept : 0;
  22252   const char *pcLimit = (nAccept>=0)? z+nAccept : 0;
  22253   assert(z!=0);
  22254   while( (pcLimit)? (z<pcLimit) : (ng-- != 0) ){
  22255     unsigned char c = *(u8*)z;
  22256     if( c<0x7f ){
  22257       if( ccm != 0L && c < 0x20 && ((1L<<c) & ccm) != 0 ) return z;
  22258       ++z; /* ASCII */
  22259     }else if( (c & 0xC0) != 0xC0 ) return z; /* not a lead byte */
  22260     else{
  22261       const char *zt = z+1; /* Got lead byte, look at trail bytes.*/
  22262       do{
  22263         if( pcLimit && zt >= pcLimit ) return z;
  22264         else{
  22265           char ct = *zt++;
  22266           if( ct==0 || (zt-z)>4 || (ct & 0xC0)!=0x80 ){
  22267             /* Trailing bytes are too few, too many, or invalid. */
  22268             return z;
  22269           }
  22270         }
  22271       } while( ((c <<= 1) & 0x40) == 0x40 ); /* Eat lead byte's count. */
  22272       z = zt;
  22273     }
  22274   }
  22275   return z;
  22276 }
  22277 
  22278 
  22279 /*
  22280 ** Output the given string as a quoted according to C or TCL quoting rules.
  22281 */
  22282 static void output_c_string(FILE *out, const char *z){
  22283   char c;
  22284   static const char *zq = "\"";
  22285   static long ctrlMask = ~0L;
  22286   static const char *zDQBSRO = "\"\\\x7f"; /* double-quote, backslash, rubout */
  22287   char ace[3] = "\\?";
  22288   char cbsSay;
  22289   sqlite3_fputs(zq, out);
  22290   while( *z!=0 ){
  22291     const char *pcDQBSRO = anyOfInStr(z, zDQBSRO, ~(size_t)0);
  22292     const char *pcPast = zSkipValidUtf8(z, INT_MAX, ctrlMask);
  22293     const char *pcEnd = (pcDQBSRO && pcDQBSRO < pcPast)? pcDQBSRO : pcPast;
  22294     if( pcEnd > z ){
  22295       sqlite3_fprintf(out, "%.*s", (int)(pcEnd-z), z);
  22296     }
  22297     if( (c = *pcEnd)==0 ) break;
  22298     ++pcEnd;
  22299     switch( c ){
  22300     case '\\': case '"':
  22301       cbsSay = (char)c;
  22302       break;
  22303     case '\t': cbsSay = 't'; break;
  22304     case '\n': cbsSay = 'n'; break;
  22305     case '\r': cbsSay = 'r'; break;
  22306     case '\f': cbsSay = 'f'; break;
  22307     default: cbsSay = 0; break;
  22308     }
  22309     if( cbsSay ){
  22310       ace[1] = cbsSay;
  22311       sqlite3_fputs(ace, out);
  22312     }else if( !isprint(c&0xff) ){
  22313       sqlite3_fprintf(out, "\\%03o", c&0xff);
  22314     }else{
  22315       ace[1] = (char)c;
  22316       sqlite3_fputs(ace+1, out);
  22317     }
  22318     z = pcEnd;
  22319   }
  22320   sqlite3_fputs(zq, out);
  22321 }
  22322 
  22323 /*
  22324 ** Output the given string as quoted according to JSON quoting rules.
  22325 */
  22326 static void output_json_string(FILE *out, const char *z, i64 n){
  22327   unsigned char c;
  22328   static const char *zq = "\"";
  22329   static long ctrlMask = ~0L;
  22330   static const char *zDQBS = "\"\\";
  22331   const char *pcLimit;
  22332   char ace[3] = "\\?";
  22333   char cbsSay;
  22334 
  22335   if( z==0 ) z = "";
  22336   pcLimit = z + ((n<0)? strlen(z) : (size_t)n);
  22337   sqlite3_fputs(zq, out);
  22338   while( z < pcLimit ){
  22339     const char *pcDQBS = anyOfInStr(z, zDQBS, pcLimit-z);
  22340     const char *pcPast = zSkipValidUtf8(z, (int)(pcLimit-z), ctrlMask);
  22341     const char *pcEnd = (pcDQBS && pcDQBS < pcPast)? pcDQBS : pcPast;
  22342     if( pcEnd > z ){
  22343       sqlite3_fprintf(out, "%.*s", (int)(pcEnd-z), z);
  22344       z = pcEnd;
  22345     }
  22346     if( z >= pcLimit ) break;
  22347     c = (unsigned char)*(z++);
  22348     switch( c ){
  22349     case '"': case '\\':
  22350       cbsSay = (char)c;
  22351       break;
  22352     case '\b': cbsSay = 'b'; break;
  22353     case '\f': cbsSay = 'f'; break;
  22354     case '\n': cbsSay = 'n'; break;
  22355     case '\r': cbsSay = 'r'; break;
  22356     case '\t': cbsSay = 't'; break;
  22357     default: cbsSay = 0; break;
  22358     }
  22359     if( cbsSay ){
  22360       ace[1] = cbsSay;
  22361       sqlite3_fputs(ace, out);
  22362     }else if( c<=0x1f || c>=0x7f ){
  22363       sqlite3_fprintf(out, "\\u%04x", c);
  22364     }else{
  22365       ace[1] = (char)c;
  22366       sqlite3_fputs(ace+1, out);
  22367     }
  22368   }
  22369   sqlite3_fputs(zq, out);
  22370 }
  22371 
  22372 /*
  22373 ** Escape the input string if it is needed and in accordance with
  22374 ** eEscMode.
  22375 **
  22376 ** Escaping is needed if the string contains any control characters
  22377 ** other than \t, \n, and \r\n
  22378 **
  22379 ** If no escaping is needed (the common case) then set *ppFree to NULL
  22380 ** and return the original string.  If escapingn is needed, write the
  22381 ** escaped string into memory obtained from sqlite3_malloc64() or the
  22382 ** equivalent, and return the new string and set *ppFree to the new string
  22383 ** as well.
  22384 **
  22385 ** The caller is responsible for freeing *ppFree if it is non-NULL in order
  22386 ** to reclaim memory.
  22387 */
  22388 static const char *escapeOutput(
  22389   ShellState *p,
  22390   const char *zInX,
  22391   char **ppFree
  22392 ){
  22393   i64 i, j;
  22394   i64 nCtrl = 0;
  22395   unsigned char *zIn;
  22396   unsigned char c;
  22397   unsigned char *zOut;
  22398 
  22399 
  22400   /* No escaping if disabled */
  22401   if( p->eEscMode==SHELL_ESC_OFF ){
  22402     *ppFree = 0;
  22403      return zInX;
  22404   }
  22405 
  22406   /* Count the number of control characters in the string. */
  22407   zIn = (unsigned char*)zInX;
  22408   for(i=0; (c = zIn[i])!=0; i++){
  22409     if( c<=0x1f
  22410      && c!='\t'
  22411      && c!='\n'
  22412      && (c!='\r' || zIn[i+1]!='\n')
  22413     ){
  22414       nCtrl++;
  22415     }
  22416   }
  22417   if( nCtrl==0 ){
  22418     *ppFree = 0;
  22419     return zInX;
  22420   }
  22421   if( p->eEscMode==SHELL_ESC_SYMBOL ) nCtrl *= 2;
  22422   zOut = sqlite3_malloc64( i + nCtrl + 1 );
  22423   shell_check_oom(zOut);
  22424   for(i=j=0; (c = zIn[i])!=0; i++){
  22425     if( c>0x1f
  22426      || c=='\t'
  22427      || c=='\n'
  22428      || (c=='\r' && zIn[i+1]=='\n')
  22429     ){
  22430       continue;
  22431     }
  22432     if( i>0 ){
  22433       memcpy(&zOut[j], zIn, i);
  22434       j += i;
  22435     }
  22436     zIn += i+1;
  22437     i = -1;
  22438     switch( p->eEscMode ){
  22439       case SHELL_ESC_SYMBOL: 
  22440         zOut[j++] = 0xe2;
  22441         zOut[j++] = 0x90;
  22442         zOut[j++] = 0x80+c;
  22443         break;
  22444       case SHELL_ESC_ASCII:
  22445         zOut[j++] = '^';
  22446         zOut[j++] = 0x40+c;
  22447         break;
  22448     }
  22449   }
  22450   if( i>0 ){
  22451     memcpy(&zOut[j], zIn, i);
  22452     j += i;
  22453   }
  22454   zOut[j] = 0;
  22455   *ppFree = (char*)zOut;
  22456   return (char*)zOut;
  22457 }
  22458 
  22459 /*
  22460 ** Output the given string with characters that are special to
  22461 ** HTML escaped.
  22462 */
  22463 static void output_html_string(FILE *out, const char *z){
  22464   int i;
  22465   if( z==0 ) z = "";
  22466   while( *z ){
  22467     for(i=0;   z[i]
  22468             && z[i]!='<'
  22469             && z[i]!='&'
  22470             && z[i]!='>'
  22471             && z[i]!='\"'
  22472             && z[i]!='\'';
  22473         i++){}
  22474     if( i>0 ){
  22475       sqlite3_fprintf(out, "%.*s",i,z);
  22476     }
  22477     if( z[i]=='<' ){
  22478       sqlite3_fputs("&lt;", out);
  22479     }else if( z[i]=='&' ){
  22480       sqlite3_fputs("&amp;", out);
  22481     }else if( z[i]=='>' ){
  22482       sqlite3_fputs("&gt;", out);
  22483     }else if( z[i]=='\"' ){
  22484       sqlite3_fputs("&quot;", out);
  22485     }else if( z[i]=='\'' ){
  22486       sqlite3_fputs("&#39;", out);
  22487     }else{
  22488       break;
  22489     }
  22490     z += i + 1;
  22491   }
  22492 }
  22493 
  22494 /*
  22495 ** If a field contains any character identified by a 1 in the following
  22496 ** array, then the string must be quoted for CSV.
  22497 */
  22498 static const char needCsvQuote[] = {
  22499   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
  22500   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
  22501   1, 0, 1, 0, 0, 0, 0, 1,   0, 0, 0, 0, 0, 0, 0, 0,
  22502   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
  22503   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
  22504   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
  22505   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
  22506   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 1,
  22507   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
  22508   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
  22509   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
  22510   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
  22511   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
  22512   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
  22513   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
  22514   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
  22515 };
  22516 
  22517 /*
  22518 ** Output a single term of CSV.  Actually, p->colSeparator is used for
  22519 ** the separator, which may or may not be a comma.  p->nullValue is
  22520 ** the null value.  Strings are quoted if necessary.  The separator
  22521 ** is only issued if bSep is true.
  22522 */
  22523 static void output_csv(ShellState *p, const char *z, int bSep){
  22524   if( z==0 ){
  22525     sqlite3_fprintf(p->out, "%s",p->nullValue);
  22526   }else{
  22527     unsigned i;
  22528     for(i=0; z[i]; i++){
  22529       if( needCsvQuote[((unsigned char*)z)[i]] ){
  22530         i = 0;
  22531         break;
  22532       }
  22533     }
  22534     if( i==0 || strstr(z, p->colSeparator)!=0 ){
  22535       char *zQuoted = sqlite3_mprintf("\"%w\"", z);
  22536       shell_check_oom(zQuoted);
  22537       sqlite3_fputs(zQuoted, p->out);
  22538       sqlite3_free(zQuoted);
  22539     }else{
  22540       sqlite3_fputs(z, p->out);
  22541     }
  22542   }
  22543   if( bSep ){
  22544     sqlite3_fputs(p->colSeparator, p->out);
  22545   }
  22546 }
  22547 
  22548 /*
  22549 ** This routine runs when the user presses Ctrl-C
  22550 */
  22551 static void interrupt_handler(int NotUsed){
  22552   UNUSED_PARAMETER(NotUsed);
  22553   if( ++seenInterrupt>1 ) exit(1);
  22554   if( globalDb ) sqlite3_interrupt(globalDb);
  22555 }
  22556 
  22557 #if (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE)
  22558 /*
  22559 ** This routine runs for console events (e.g. Ctrl-C) on Win32
  22560 */
  22561 static BOOL WINAPI ConsoleCtrlHandler(
  22562   DWORD dwCtrlType /* One of the CTRL_*_EVENT constants */
  22563 ){
  22564   if( dwCtrlType==CTRL_C_EVENT ){
  22565     interrupt_handler(0);
  22566     return TRUE;
  22567   }
  22568   return FALSE;
  22569 }
  22570 #endif
  22571 
  22572 #ifndef SQLITE_OMIT_AUTHORIZATION
  22573 /*
  22574 ** This authorizer runs in safe mode.
  22575 */
  22576 static int safeModeAuth(
  22577   void *pClientData,
  22578   int op,
  22579   const char *zA1,
  22580   const char *zA2,
  22581   const char *zA3,
  22582   const char *zA4
  22583 ){
  22584   ShellState *p = (ShellState*)pClientData;
  22585   static const char *azProhibitedFunctions[] = {
  22586     "edit",
  22587     "fts3_tokenizer",
  22588     "load_extension",
  22589     "readfile",
  22590     "writefile",
  22591     "zipfile",
  22592     "zipfile_cds",
  22593   };
  22594   UNUSED_PARAMETER(zA1);
  22595   UNUSED_PARAMETER(zA3);
  22596   UNUSED_PARAMETER(zA4);
  22597   switch( op ){
  22598     case SQLITE_ATTACH: {
  22599 #ifndef SQLITE_SHELL_FIDDLE
  22600       /* In WASM builds the filesystem is a virtual sandbox, so
  22601       ** there's no harm in using ATTACH. */
  22602       failIfSafeMode(p, "cannot run ATTACH in safe mode");
  22603 #endif
  22604       break;
  22605     }
  22606     case SQLITE_FUNCTION: {
  22607       int i;
  22608       for(i=0; i<ArraySize(azProhibitedFunctions); i++){
  22609         if( sqlite3_stricmp(zA2, azProhibitedFunctions[i])==0 ){
  22610           failIfSafeMode(p, "cannot use the %s() function in safe mode",
  22611                          azProhibitedFunctions[i]);
  22612         }
  22613       }
  22614       break;
  22615     }
  22616   }
  22617   return SQLITE_OK;
  22618 }
  22619 
  22620 /*
  22621 ** When the ".auth ON" is set, the following authorizer callback is
  22622 ** invoked.  It always returns SQLITE_OK.
  22623 */
  22624 static int shellAuth(
  22625   void *pClientData,
  22626   int op,
  22627   const char *zA1,
  22628   const char *zA2,
  22629   const char *zA3,
  22630   const char *zA4
  22631 ){
  22632   ShellState *p = (ShellState*)pClientData;
  22633   static const char *azAction[] = { 0,
  22634      "CREATE_INDEX",         "CREATE_TABLE",         "CREATE_TEMP_INDEX",
  22635      "CREATE_TEMP_TABLE",    "CREATE_TEMP_TRIGGER",  "CREATE_TEMP_VIEW",
  22636      "CREATE_TRIGGER",       "CREATE_VIEW",          "DELETE",
  22637      "DROP_INDEX",           "DROP_TABLE",           "DROP_TEMP_INDEX",
  22638      "DROP_TEMP_TABLE",      "DROP_TEMP_TRIGGER",    "DROP_TEMP_VIEW",
  22639      "DROP_TRIGGER",         "DROP_VIEW",            "INSERT",
  22640      "PRAGMA",               "READ",                 "SELECT",
  22641      "TRANSACTION",          "UPDATE",               "ATTACH",
  22642      "DETACH",               "ALTER_TABLE",          "REINDEX",
  22643      "ANALYZE",              "CREATE_VTABLE",        "DROP_VTABLE",
  22644      "FUNCTION",             "SAVEPOINT",            "RECURSIVE"
  22645   };
  22646   int i;
  22647   const char *az[4];
  22648   az[0] = zA1;
  22649   az[1] = zA2;
  22650   az[2] = zA3;
  22651   az[3] = zA4;
  22652   sqlite3_fprintf(p->out, "authorizer: %s", azAction[op]);
  22653   for(i=0; i<4; i++){
  22654     sqlite3_fputs(" ", p->out);
  22655     if( az[i] ){
  22656       output_c_string(p->out, az[i]);
  22657     }else{
  22658       sqlite3_fputs("NULL", p->out);
  22659     }
  22660   }
  22661   sqlite3_fputs("\n", p->out);
  22662   if( p->bSafeMode ) (void)safeModeAuth(pClientData, op, zA1, zA2, zA3, zA4);
  22663   return SQLITE_OK;
  22664 }
  22665 #endif
  22666 
  22667 /*
  22668 ** Print a schema statement.  Part of MODE_Semi and MODE_Pretty output.
  22669 **
  22670 ** This routine converts some CREATE TABLE statements for shadow tables
  22671 ** in FTS3/4/5 into CREATE TABLE IF NOT EXISTS statements.
  22672 **
  22673 ** If the schema statement in z[] contains a start-of-comment and if
  22674 ** sqlite3_complete() returns false, try to terminate the comment before
  22675 ** printing the result.  https://sqlite.org/forum/forumpost/d7be961c5c
  22676 */
  22677 static void printSchemaLine(FILE *out, const char *z, const char *zTail){
  22678   char *zToFree = 0;
  22679   if( z==0 ) return;
  22680   if( zTail==0 ) return;
  22681   if( zTail[0]==';' && (strstr(z, "/*")!=0 || strstr(z,"--")!=0) ){
  22682     const char *zOrig = z;
  22683     static const char *azTerm[] = { "", "*/", "\n" };
  22684     int i;
  22685     for(i=0; i<ArraySize(azTerm); i++){
  22686       char *zNew = sqlite3_mprintf("%s%s;", zOrig, azTerm[i]);
  22687       shell_check_oom(zNew);
  22688       if( sqlite3_complete(zNew) ){
  22689         size_t n = strlen(zNew);
  22690         zNew[n-1] = 0;
  22691         zToFree = zNew;
  22692         z = zNew;
  22693         break;
  22694       }
  22695       sqlite3_free(zNew);
  22696     }
  22697   }
  22698   if( sqlite3_strglob("CREATE TABLE ['\"]*", z)==0 ){
  22699     sqlite3_fprintf(out, "CREATE TABLE IF NOT EXISTS %s%s", z+13, zTail);
  22700   }else{
  22701     sqlite3_fprintf(out, "%s%s", z, zTail);
  22702   }
  22703   sqlite3_free(zToFree);
  22704 }
  22705 static void printSchemaLineN(FILE *out, char *z, int n, const char *zTail){
  22706   char c = z[n];
  22707   z[n] = 0;
  22708   printSchemaLine(out, z, zTail);
  22709   z[n] = c;
  22710 }
  22711 
  22712 /*
  22713 ** Return true if string z[] has nothing but whitespace and comments to the
  22714 ** end of the first line.
  22715 */
  22716 static int wsToEol(const char *z){
  22717   int i;
  22718   for(i=0; z[i]; i++){
  22719     if( z[i]=='\n' ) return 1;
  22720     if( IsSpace(z[i]) ) continue;
  22721     if( z[i]=='-' && z[i+1]=='-' ) return 1;
  22722     return 0;
  22723   }
  22724   return 1;
  22725 }
  22726 
  22727 /*
  22728 ** Add a new entry to the EXPLAIN QUERY PLAN data
  22729 */
  22730 static void eqp_append(ShellState *p, int iEqpId, int p2, const char *zText){
  22731   EQPGraphRow *pNew;
  22732   i64 nText;
  22733   if( zText==0 ) return;
  22734   nText = strlen(zText);
  22735   if( p->autoEQPtest ){
  22736     sqlite3_fprintf(p->out, "%d,%d,%s\n", iEqpId, p2, zText);
  22737   }
  22738   pNew = sqlite3_malloc64( sizeof(*pNew) + nText );
  22739   shell_check_oom(pNew);
  22740   pNew->iEqpId = iEqpId;
  22741   pNew->iParentId = p2;
  22742   memcpy(pNew->zText, zText, nText+1);
  22743   pNew->pNext = 0;
  22744   if( p->sGraph.pLast ){
  22745     p->sGraph.pLast->pNext = pNew;
  22746   }else{
  22747     p->sGraph.pRow = pNew;
  22748   }
  22749   p->sGraph.pLast = pNew;
  22750 }
  22751 
  22752 /*
  22753 ** Free and reset the EXPLAIN QUERY PLAN data that has been collected
  22754 ** in p->sGraph.
  22755 */
  22756 static void eqp_reset(ShellState *p){
  22757   EQPGraphRow *pRow, *pNext;
  22758   for(pRow = p->sGraph.pRow; pRow; pRow = pNext){
  22759     pNext = pRow->pNext;
  22760     sqlite3_free(pRow);
  22761   }
  22762   memset(&p->sGraph, 0, sizeof(p->sGraph));
  22763 }
  22764 
  22765 /* Return the next EXPLAIN QUERY PLAN line with iEqpId that occurs after
  22766 ** pOld, or return the first such line if pOld is NULL
  22767 */
  22768 static EQPGraphRow *eqp_next_row(ShellState *p, int iEqpId, EQPGraphRow *pOld){
  22769   EQPGraphRow *pRow = pOld ? pOld->pNext : p->sGraph.pRow;
  22770   while( pRow && pRow->iParentId!=iEqpId ) pRow = pRow->pNext;
  22771   return pRow;
  22772 }
  22773 
  22774 /* Render a single level of the graph that has iEqpId as its parent.  Called
  22775 ** recursively to render sublevels.
  22776 */
  22777 static void eqp_render_level(ShellState *p, int iEqpId){
  22778   EQPGraphRow *pRow, *pNext;
  22779   i64 n = strlen(p->sGraph.zPrefix);
  22780   char *z;
  22781   for(pRow = eqp_next_row(p, iEqpId, 0); pRow; pRow = pNext){
  22782     pNext = eqp_next_row(p, iEqpId, pRow);
  22783     z = pRow->zText;
  22784     sqlite3_fprintf(p->out, "%s%s%s\n", p->sGraph.zPrefix,
  22785                             pNext ? "|--" : "`--", z);
  22786     if( n<(i64)sizeof(p->sGraph.zPrefix)-7 ){
  22787       memcpy(&p->sGraph.zPrefix[n], pNext ? "|  " : "   ", 4);
  22788       eqp_render_level(p, pRow->iEqpId);
  22789       p->sGraph.zPrefix[n] = 0;
  22790     }
  22791   }
  22792 }
  22793 
  22794 /*
  22795 ** Display and reset the EXPLAIN QUERY PLAN data
  22796 */
  22797 static void eqp_render(ShellState *p, i64 nCycle){
  22798   EQPGraphRow *pRow = p->sGraph.pRow;
  22799   if( pRow ){
  22800     if( pRow->zText[0]=='-' ){
  22801       if( pRow->pNext==0 ){
  22802         eqp_reset(p);
  22803         return;
  22804       }
  22805       sqlite3_fprintf(p->out, "%s\n", pRow->zText+3);
  22806       p->sGraph.pRow = pRow->pNext;
  22807       sqlite3_free(pRow);
  22808     }else if( nCycle>0 ){
  22809       sqlite3_fprintf(p->out, "QUERY PLAN (cycles=%lld [100%%])\n", nCycle);
  22810     }else{
  22811       sqlite3_fputs("QUERY PLAN\n", p->out);
  22812     }
  22813     p->sGraph.zPrefix[0] = 0;
  22814     eqp_render_level(p, 0);
  22815     eqp_reset(p);
  22816   }
  22817 }
  22818 
  22819 #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
  22820 /*
  22821 ** Progress handler callback.
  22822 */
  22823 static int progress_handler(void *pClientData) {
  22824   ShellState *p = (ShellState*)pClientData;
  22825   p->nProgress++;
  22826   if( p->nProgress>=p->mxProgress && p->mxProgress>0 ){
  22827     sqlite3_fprintf(p->out, "Progress limit reached (%u)\n", p->nProgress);
  22828     if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0;
  22829     if( p->flgProgress & SHELL_PROGRESS_ONCE ) p->mxProgress = 0;
  22830     return 1;
  22831   }
  22832   if( (p->flgProgress & SHELL_PROGRESS_QUIET)==0 ){
  22833     sqlite3_fprintf(p->out, "Progress %u\n", p->nProgress);
  22834   }
  22835   return 0;
  22836 }
  22837 #endif /* SQLITE_OMIT_PROGRESS_CALLBACK */
  22838 
  22839 /*
  22840 ** Print N dashes
  22841 */
  22842 static void print_dashes(FILE *out, int N){
  22843   const char zDash[] = "--------------------------------------------------";
  22844   const int nDash = sizeof(zDash) - 1;
  22845   while( N>nDash ){
  22846     sqlite3_fputs(zDash, out);
  22847     N -= nDash;
  22848   }
  22849   sqlite3_fprintf(out, "%.*s", N, zDash);
  22850 }
  22851 
  22852 /*
  22853 ** Print a markdown or table-style row separator using ascii-art
  22854 */
  22855 static void print_row_separator(
  22856   ShellState *p,
  22857   int nArg,
  22858   const char *zSep
  22859 ){
  22860   int i;
  22861   if( nArg>0 ){
  22862     sqlite3_fputs(zSep, p->out);
  22863     print_dashes(p->out, p->actualWidth[0]+2);
  22864     for(i=1; i<nArg; i++){
  22865       sqlite3_fputs(zSep, p->out);
  22866       print_dashes(p->out, p->actualWidth[i]+2);
  22867     }
  22868     sqlite3_fputs(zSep, p->out);
  22869   }
  22870   sqlite3_fputs("\n", p->out);
  22871 }
  22872 
  22873 /*
  22874 ** This is the callback routine that the shell
  22875 ** invokes for each row of a query result.
  22876 */
  22877 static int shell_callback(
  22878   void *pArg,
  22879   int nArg,        /* Number of result columns */
  22880   char **azArg,    /* Text of each result column */
  22881   char **azCol,    /* Column names */
  22882   int *aiType      /* Column types.  Might be NULL */
  22883 ){
  22884   int i;
  22885   ShellState *p = (ShellState*)pArg;
  22886 
  22887   if( azArg==0 ) return 0;
  22888   switch( p->cMode ){
  22889     case MODE_Count:
  22890     case MODE_Off: {
  22891       break;
  22892     }
  22893     case MODE_Line: {
  22894       int w = 5;
  22895       if( azArg==0 ) break;
  22896       for(i=0; i<nArg; i++){
  22897         int len = strlen30(azCol[i] ? azCol[i] : "");
  22898         if( len>w ) w = len;
  22899       }
  22900       if( p->cnt++>0 ) sqlite3_fputs(p->rowSeparator, p->out);
  22901       for(i=0; i<nArg; i++){
  22902         char *pFree = 0;
  22903         const char *pDisplay;
  22904         pDisplay = escapeOutput(p, azArg[i] ? azArg[i] : p->nullValue, &pFree);
  22905         sqlite3_fprintf(p->out, "%*s = %s%s", w, azCol[i],
  22906                         pDisplay, p->rowSeparator);
  22907         if( pFree ) sqlite3_free(pFree);
  22908       }
  22909       break;
  22910     }
  22911     case MODE_ScanExp:
  22912     case MODE_Explain: {
  22913       static const int aExplainWidth[] = {4,       13, 4, 4, 4, 13, 2, 13};
  22914       static const int aExplainMap[] =   {0,       1,  2, 3, 4, 5,  6, 7 };
  22915       static const int aScanExpWidth[] = {4, 15, 6, 13, 4, 4, 4, 13, 2, 13};
  22916       static const int aScanExpMap[] =   {0, 9, 8, 1,  2, 3, 4, 5,  6, 7 };
  22917 
  22918       const int *aWidth = aExplainWidth;
  22919       const int *aMap = aExplainMap;
  22920       int nWidth = ArraySize(aExplainWidth);
  22921       int iIndent = 1;
  22922 
  22923       if( p->cMode==MODE_ScanExp ){
  22924         aWidth = aScanExpWidth;
  22925         aMap = aScanExpMap;
  22926         nWidth = ArraySize(aScanExpWidth);
  22927         iIndent = 3;
  22928       }
  22929       if( nArg>nWidth ) nArg = nWidth;
  22930 
  22931       /* If this is the first row seen, print out the headers */
  22932       if( p->cnt++==0 ){
  22933         for(i=0; i<nArg; i++){
  22934           utf8_width_print(p->out, aWidth[i], azCol[ aMap[i] ]);
  22935           sqlite3_fputs(i==nArg-1 ? "\n" : "  ", p->out);
  22936         }
  22937         for(i=0; i<nArg; i++){
  22938           print_dashes(p->out, aWidth[i]);
  22939           sqlite3_fputs(i==nArg-1 ? "\n" : "  ", p->out);
  22940         }
  22941       }
  22942 
  22943       /* If there is no data, exit early. */
  22944       if( azArg==0 ) break;
  22945 
  22946       for(i=0; i<nArg; i++){
  22947         const char *zSep = "  ";
  22948         int w = aWidth[i];
  22949         const char *zVal = azArg[ aMap[i] ];
  22950         if( i==nArg-1 ) w = 0;
  22951         if( zVal && strlenChar(zVal)>w ){
  22952           w = strlenChar(zVal);
  22953           zSep = " ";
  22954         }
  22955         if( i==iIndent && p->aiIndent && p->pStmt ){
  22956           if( p->iIndent<p->nIndent ){
  22957             sqlite3_fprintf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
  22958           }
  22959           p->iIndent++;
  22960         }
  22961         utf8_width_print(p->out, w, zVal ? zVal : p->nullValue);
  22962         sqlite3_fputs(i==nArg-1 ? "\n" : zSep, p->out);
  22963       }
  22964       break;
  22965     }
  22966     case MODE_Semi: {   /* .schema and .fullschema output */
  22967       printSchemaLine(p->out, azArg[0], ";\n");
  22968       break;
  22969     }
  22970     case MODE_Pretty: {  /* .schema and .fullschema with --indent */
  22971       char *z;
  22972       int j;
  22973       int nParen = 0;
  22974       char cEnd = 0;
  22975       char c;
  22976       int nLine = 0;
  22977       int isIndex;
  22978       int isWhere = 0;
  22979       assert( nArg==1 );
  22980       if( azArg[0]==0 ) break;
  22981       if( sqlite3_strlike("CREATE VIEW%", azArg[0], 0)==0
  22982        || sqlite3_strlike("CREATE TRIG%", azArg[0], 0)==0
  22983       ){
  22984         sqlite3_fprintf(p->out, "%s;\n", azArg[0]);
  22985         break;
  22986       }
  22987       isIndex = sqlite3_strlike("CREATE INDEX%", azArg[0], 0)==0
  22988              || sqlite3_strlike("CREATE UNIQUE INDEX%", azArg[0], 0)==0;
  22989       z = sqlite3_mprintf("%s", azArg[0]);
  22990       shell_check_oom(z);
  22991       j = 0;
  22992       for(i=0; IsSpace(z[i]); i++){}
  22993       for(; (c = z[i])!=0; i++){
  22994         if( IsSpace(c) ){
  22995           if( z[j-1]=='\r' ) z[j-1] = '\n';
  22996           if( IsSpace(z[j-1]) || z[j-1]=='(' ) continue;
  22997         }else if( (c=='(' || c==')') && j>0 && IsSpace(z[j-1]) ){
  22998           j--;
  22999         }
  23000         z[j++] = c;
  23001       }
  23002       while( j>0 && IsSpace(z[j-1]) ){ j--; }
  23003       z[j] = 0;
  23004       if( strlen30(z)>=79 ){
  23005         for(i=j=0; (c = z[i])!=0; i++){ /* Copy from z[i] back to z[j] */
  23006           if( c==cEnd ){
  23007             cEnd = 0;
  23008           }else if( c=='"' || c=='\'' || c=='`' ){
  23009             cEnd = c;
  23010           }else if( c=='[' ){
  23011             cEnd = ']';
  23012           }else if( c=='-' && z[i+1]=='-' ){
  23013             cEnd = '\n';
  23014           }else if( c=='(' ){
  23015             nParen++;
  23016           }else if( c==')' ){
  23017             nParen--;
  23018             if( nLine>0 && nParen==0 && j>0 && !isWhere ){
  23019               printSchemaLineN(p->out, z, j, "\n");
  23020               j = 0;
  23021             }
  23022           }else if( (c=='w' || c=='W')
  23023                  && nParen==0 && isIndex
  23024                  && sqlite3_strnicmp("WHERE",&z[i],5)==0
  23025                  && !IsAlnum(z[i+5]) && z[i+5]!='_' ){
  23026             isWhere = 1;
  23027           }else if( isWhere && (c=='A' || c=='a')
  23028                  && nParen==0
  23029                  && sqlite3_strnicmp("AND",&z[i],3)==0
  23030                  && !IsAlnum(z[i+3]) && z[i+3]!='_' ){
  23031             printSchemaLineN(p->out, z, j, "\n    ");
  23032             j = 0;
  23033           }
  23034           z[j++] = c;
  23035           if( nParen==1 && cEnd==0
  23036            && (c=='(' || c=='\n' || (c==',' && !wsToEol(z+i+1)))
  23037            && !isWhere
  23038           ){
  23039             if( c=='\n' ) j--;
  23040             printSchemaLineN(p->out, z, j, "\n  ");
  23041             j = 0;
  23042             nLine++;
  23043             while( IsSpace(z[i+1]) ){ i++; }
  23044           }
  23045         }
  23046         z[j] = 0;
  23047       }
  23048       printSchemaLine(p->out, z, ";\n");
  23049       sqlite3_free(z);
  23050       break;
  23051     }
  23052     case MODE_List: {
  23053       if( p->cnt++==0 && p->showHeader ){
  23054         for(i=0; i<nArg; i++){
  23055           char *z = azCol[i];
  23056           char *pFree;
  23057           const char *zOut = escapeOutput(p, z, &pFree);
  23058           sqlite3_fprintf(p->out, "%s%s", zOut,
  23059                           i==nArg-1 ? p->rowSeparator : p->colSeparator);
  23060           if( pFree ) sqlite3_free(pFree);
  23061         }
  23062       }
  23063       if( azArg==0 ) break;
  23064       for(i=0; i<nArg; i++){
  23065         char *z = azArg[i];
  23066         char *pFree;
  23067         const char *zOut;
  23068         if( z==0 ) z = p->nullValue;
  23069         zOut = escapeOutput(p, z, &pFree);
  23070         sqlite3_fputs(zOut, p->out);
  23071         if( pFree ) sqlite3_free(pFree);
  23072         sqlite3_fputs((i<nArg-1)? p->colSeparator : p->rowSeparator, p->out);
  23073       }
  23074       break;
  23075     }
  23076     case MODE_Www:
  23077     case MODE_Html: {
  23078       if( p->cnt==0 && p->cMode==MODE_Www ){
  23079         sqlite3_fputs(
  23080           "</PRE>\n"
  23081           "<TABLE border='1' cellspacing='0' cellpadding='2'>\n"
  23082           ,p->out
  23083         );
  23084       }
  23085       if( p->cnt==0 && (p->showHeader || p->cMode==MODE_Www) ){
  23086         sqlite3_fputs("<TR>", p->out);
  23087         for(i=0; i<nArg; i++){
  23088           sqlite3_fputs("<TH>", p->out);
  23089           output_html_string(p->out, azCol[i]);
  23090           sqlite3_fputs("</TH>\n", p->out);
  23091         }
  23092         sqlite3_fputs("</TR>\n", p->out);
  23093       }
  23094       p->cnt++;
  23095       if( azArg==0 ) break;
  23096       sqlite3_fputs("<TR>", p->out);
  23097       for(i=0; i<nArg; i++){
  23098         sqlite3_fputs("<TD>", p->out);
  23099         output_html_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
  23100         sqlite3_fputs("</TD>\n", p->out);
  23101       }
  23102       sqlite3_fputs("</TR>\n", p->out);
  23103       break;
  23104     }
  23105     case MODE_Tcl: {
  23106       if( p->cnt++==0 && p->showHeader ){
  23107         for(i=0; i<nArg; i++){
  23108           output_c_string(p->out, azCol[i] ? azCol[i] : "");
  23109           if(i<nArg-1) sqlite3_fputs(p->colSeparator, p->out);
  23110         }
  23111         sqlite3_fputs(p->rowSeparator, p->out);
  23112       }
  23113       if( azArg==0 ) break;
  23114       for(i=0; i<nArg; i++){
  23115         output_c_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
  23116         if(i<nArg-1) sqlite3_fputs(p->colSeparator, p->out);
  23117       }
  23118       sqlite3_fputs(p->rowSeparator, p->out);
  23119       break;
  23120     }
  23121     case MODE_Csv: {
  23122       sqlite3_fsetmode(p->out, _O_BINARY);
  23123       if( p->cnt++==0 && p->showHeader ){
  23124         for(i=0; i<nArg; i++){
  23125           output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
  23126         }
  23127         sqlite3_fputs(p->rowSeparator, p->out);
  23128       }
  23129       if( nArg>0 ){
  23130         for(i=0; i<nArg; i++){
  23131           output_csv(p, azArg[i], i<nArg-1);
  23132         }
  23133         sqlite3_fputs(p->rowSeparator, p->out);
  23134       }
  23135       setCrlfMode(p);
  23136       break;
  23137     }
  23138     case MODE_Insert: {
  23139       if( azArg==0 ) break;
  23140       sqlite3_fprintf(p->out, "INSERT INTO %s",p->zDestTable);
  23141       if( p->showHeader ){
  23142         sqlite3_fputs("(", p->out);
  23143         for(i=0; i<nArg; i++){
  23144           if( i>0 ) sqlite3_fputs(",", p->out);
  23145           if( quoteChar(azCol[i]) ){
  23146             char *z = sqlite3_mprintf("\"%w\"", azCol[i]);
  23147             shell_check_oom(z);
  23148             sqlite3_fputs(z, p->out);
  23149             sqlite3_free(z);
  23150           }else{
  23151             sqlite3_fprintf(p->out, "%s", azCol[i]);
  23152           }
  23153         }
  23154         sqlite3_fputs(")", p->out);
  23155       }
  23156       p->cnt++;
  23157       for(i=0; i<nArg; i++){
  23158         sqlite3_fputs(i>0 ? "," : " VALUES(", p->out);
  23159         if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
  23160           sqlite3_fputs("NULL", p->out);
  23161         }else if( aiType && aiType[i]==SQLITE_TEXT ){
  23162           if( ShellHasFlag(p, SHFLG_Newlines) ){
  23163             output_quoted_string(p, azArg[i]);
  23164           }else{
  23165             output_quoted_escaped_string(p, azArg[i]);
  23166           }
  23167         }else if( aiType && aiType[i]==SQLITE_INTEGER ){
  23168           sqlite3_fputs(azArg[i], p->out);
  23169         }else if( aiType && aiType[i]==SQLITE_FLOAT ){
  23170           char z[50];
  23171           double r = sqlite3_column_double(p->pStmt, i);
  23172           sqlite3_uint64 ur;
  23173           memcpy(&ur,&r,sizeof(r));
  23174           if( ur==0x7ff0000000000000LL ){
  23175             sqlite3_fputs("9.0e+999", p->out);
  23176           }else if( ur==0xfff0000000000000LL ){
  23177             sqlite3_fputs("-9.0e+999", p->out);
  23178           }else{
  23179             sqlite3_int64 ir = (sqlite3_int64)r;
  23180             if( r==(double)ir ){
  23181               sqlite3_snprintf(50,z,"%lld.0", ir);
  23182             }else{
  23183               sqlite3_snprintf(50,z,"%!.20g", r);
  23184             }
  23185             sqlite3_fputs(z, p->out);
  23186           }
  23187         }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
  23188           const void *pBlob = sqlite3_column_blob(p->pStmt, i);
  23189           int nBlob = sqlite3_column_bytes(p->pStmt, i);
  23190           output_hex_blob(p->out, pBlob, nBlob);
  23191         }else if( isNumber(azArg[i], 0) ){
  23192           sqlite3_fputs(azArg[i], p->out);
  23193         }else if( ShellHasFlag(p, SHFLG_Newlines) ){
  23194           output_quoted_string(p, azArg[i]);
  23195         }else{
  23196           output_quoted_escaped_string(p, azArg[i]);
  23197         }
  23198       }
  23199       sqlite3_fputs(");\n", p->out);
  23200       break;
  23201     }
  23202     case MODE_Json: {
  23203       if( azArg==0 ) break;
  23204       if( p->cnt==0 ){
  23205         sqlite3_fputs("[{", p->out);
  23206       }else{
  23207         sqlite3_fputs(",\n{", p->out);
  23208       }
  23209       p->cnt++;
  23210       for(i=0; i<nArg; i++){
  23211         output_json_string(p->out, azCol[i], -1);
  23212         sqlite3_fputs(":", p->out);
  23213         if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
  23214           sqlite3_fputs("null", p->out);
  23215         }else if( aiType && aiType[i]==SQLITE_FLOAT ){
  23216           char z[50];
  23217           double r = sqlite3_column_double(p->pStmt, i);
  23218           sqlite3_uint64 ur;
  23219           memcpy(&ur,&r,sizeof(r));
  23220           if( ur==0x7ff0000000000000LL ){
  23221             sqlite3_fputs("9.0e+999", p->out);
  23222           }else if( ur==0xfff0000000000000LL ){
  23223             sqlite3_fputs("-9.0e+999", p->out);
  23224           }else{
  23225             sqlite3_snprintf(50,z,"%!.20g", r);
  23226             sqlite3_fputs(z, p->out);
  23227           }
  23228         }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
  23229           const void *pBlob = sqlite3_column_blob(p->pStmt, i);
  23230           int nBlob = sqlite3_column_bytes(p->pStmt, i);
  23231           output_json_string(p->out, pBlob, nBlob);
  23232         }else if( aiType && aiType[i]==SQLITE_TEXT ){
  23233           output_json_string(p->out, azArg[i], -1);
  23234         }else{
  23235           sqlite3_fputs(azArg[i], p->out);
  23236         }
  23237         if( i<nArg-1 ){
  23238           sqlite3_fputs(",", p->out);
  23239         }
  23240       }
  23241       sqlite3_fputs("}", p->out);
  23242       break;
  23243     }
  23244     case MODE_Quote: {
  23245       if( azArg==0 ) break;
  23246       if( p->cnt==0 && p->showHeader ){
  23247         for(i=0; i<nArg; i++){
  23248           if( i>0 ) sqlite3_fputs(p->colSeparator, p->out);
  23249           output_quoted_string(p, azCol[i]);
  23250         }
  23251         sqlite3_fputs(p->rowSeparator, p->out);
  23252       }
  23253       p->cnt++;
  23254       for(i=0; i<nArg; i++){
  23255         if( i>0 ) sqlite3_fputs(p->colSeparator, p->out);
  23256         if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
  23257           sqlite3_fputs("NULL", p->out);
  23258         }else if( aiType && aiType[i]==SQLITE_TEXT ){
  23259           output_quoted_string(p, azArg[i]);
  23260         }else if( aiType && aiType[i]==SQLITE_INTEGER ){
  23261           sqlite3_fputs(azArg[i], p->out);
  23262         }else if( aiType && aiType[i]==SQLITE_FLOAT ){
  23263           char z[50];
  23264           double r = sqlite3_column_double(p->pStmt, i);
  23265           sqlite3_snprintf(50,z,"%!.20g", r);
  23266           sqlite3_fputs(z, p->out);
  23267         }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
  23268           const void *pBlob = sqlite3_column_blob(p->pStmt, i);
  23269           int nBlob = sqlite3_column_bytes(p->pStmt, i);
  23270           output_hex_blob(p->out, pBlob, nBlob);
  23271         }else if( isNumber(azArg[i], 0) ){
  23272           sqlite3_fputs(azArg[i], p->out);
  23273         }else{
  23274           output_quoted_string(p, azArg[i]);
  23275         }
  23276       }
  23277       sqlite3_fputs(p->rowSeparator, p->out);
  23278       break;
  23279     }
  23280     case MODE_Ascii: {
  23281       if( p->cnt++==0 && p->showHeader ){
  23282         for(i=0; i<nArg; i++){
  23283           if( i>0 ) sqlite3_fputs(p->colSeparator, p->out);
  23284           sqlite3_fputs(azCol[i] ? azCol[i] : "", p->out);
  23285         }
  23286         sqlite3_fputs(p->rowSeparator, p->out);
  23287       }
  23288       if( azArg==0 ) break;
  23289       for(i=0; i<nArg; i++){
  23290         if( i>0 ) sqlite3_fputs(p->colSeparator, p->out);
  23291         sqlite3_fputs(azArg[i] ? azArg[i] : p->nullValue, p->out);
  23292       }
  23293       sqlite3_fputs(p->rowSeparator, p->out);
  23294       break;
  23295     }
  23296     case MODE_EQP: {
  23297       eqp_append(p, atoi(azArg[0]), atoi(azArg[1]), azArg[3]);
  23298       break;
  23299     }
  23300   }
  23301   return 0;
  23302 }
  23303 
  23304 /*
  23305 ** This is the callback routine that the SQLite library
  23306 ** invokes for each row of a query result.
  23307 */
  23308 static int callback(void *pArg, int nArg, char **azArg, char **azCol){
  23309   /* since we don't have type info, call the shell_callback with a NULL value */
  23310   return shell_callback(pArg, nArg, azArg, azCol, NULL);
  23311 }
  23312 
  23313 /*
  23314 ** This is the callback routine from sqlite3_exec() that appends all
  23315 ** output onto the end of a ShellText object.
  23316 */
  23317 static int captureOutputCallback(void *pArg, int nArg, char **azArg, char **az){
  23318   ShellText *p = (ShellText*)pArg;
  23319   int i;
  23320   UNUSED_PARAMETER(az);
  23321   if( azArg==0 ) return 0;
  23322   if( p->n ) appendText(p, "|", 0);
  23323   for(i=0; i<nArg; i++){
  23324     if( i ) appendText(p, ",", 0);
  23325     if( azArg[i] ) appendText(p, azArg[i], 0);
  23326   }
  23327   return 0;
  23328 }
  23329 
  23330 /*
  23331 ** Generate an appropriate SELFTEST table in the main database.
  23332 */
  23333 static void createSelftestTable(ShellState *p){
  23334   char *zErrMsg = 0;
  23335   sqlite3_exec(p->db,
  23336     "SAVEPOINT selftest_init;\n"
  23337     "CREATE TABLE IF NOT EXISTS selftest(\n"
  23338     "  tno INTEGER PRIMARY KEY,\n"   /* Test number */
  23339     "  op TEXT,\n"                   /* Operator:  memo run */
  23340     "  cmd TEXT,\n"                  /* Command text */
  23341     "  ans TEXT\n"                   /* Desired answer */
  23342     ");"
  23343     "CREATE TEMP TABLE [_shell$self](op,cmd,ans);\n"
  23344     "INSERT INTO [_shell$self](rowid,op,cmd)\n"
  23345     "  VALUES(coalesce((SELECT (max(tno)+100)/10 FROM selftest),10),\n"
  23346     "         'memo','Tests generated by --init');\n"
  23347     "INSERT INTO [_shell$self]\n"
  23348     "  SELECT 'run',\n"
  23349     "    'SELECT hex(sha3_query(''SELECT type,name,tbl_name,sql "
  23350                                  "FROM sqlite_schema ORDER BY 2'',224))',\n"
  23351     "    hex(sha3_query('SELECT type,name,tbl_name,sql "
  23352                           "FROM sqlite_schema ORDER BY 2',224));\n"
  23353     "INSERT INTO [_shell$self]\n"
  23354     "  SELECT 'run',"
  23355     "    'SELECT hex(sha3_query(''SELECT * FROM \"' ||"
  23356     "        printf('%w',name) || '\" NOT INDEXED'',224))',\n"
  23357     "    hex(sha3_query(printf('SELECT * FROM \"%w\" NOT INDEXED',name),224))\n"
  23358     "  FROM (\n"
  23359     "    SELECT name FROM sqlite_schema\n"
  23360     "     WHERE type='table'\n"
  23361     "       AND name<>'selftest'\n"
  23362     "       AND coalesce(rootpage,0)>0\n"
  23363     "  )\n"
  23364     " ORDER BY name;\n"
  23365     "INSERT INTO [_shell$self]\n"
  23366     "  VALUES('run','PRAGMA integrity_check','ok');\n"
  23367     "INSERT INTO selftest(tno,op,cmd,ans)"
  23368     "  SELECT rowid*10,op,cmd,ans FROM [_shell$self];\n"
  23369     "DROP TABLE [_shell$self];"
  23370     ,0,0,&zErrMsg);
  23371   if( zErrMsg ){
  23372     sqlite3_fprintf(stderr, "SELFTEST initialization failure: %s\n", zErrMsg);
  23373     sqlite3_free(zErrMsg);
  23374   }
  23375   sqlite3_exec(p->db, "RELEASE selftest_init",0,0,0);
  23376 }
  23377 
  23378 
  23379 /*
  23380 ** Set the destination table field of the ShellState structure to
  23381 ** the name of the table given.  Escape any quote characters in the
  23382 ** table name.
  23383 */
  23384 static void set_table_name(ShellState *p, const char *zName){
  23385   int i, n;
  23386   char cQuote;
  23387   char *z;
  23388 
  23389   if( p->zDestTable ){
  23390     free(p->zDestTable);
  23391     p->zDestTable = 0;
  23392   }
  23393   if( zName==0 ) return;
  23394   cQuote = quoteChar(zName);
  23395   n = strlen30(zName);
  23396   if( cQuote ) n += n+2;
  23397   z = p->zDestTable = malloc( n+1 );
  23398   shell_check_oom(z);
  23399   n = 0;
  23400   if( cQuote ) z[n++] = cQuote;
  23401   for(i=0; zName[i]; i++){
  23402     z[n++] = zName[i];
  23403     if( zName[i]==cQuote ) z[n++] = cQuote;
  23404   }
  23405   if( cQuote ) z[n++] = cQuote;
  23406   z[n] = 0;
  23407 }
  23408 
  23409 /*
  23410 ** Maybe construct two lines of text that point out the position of a
  23411 ** syntax error.  Return a pointer to the text, in memory obtained from
  23412 ** sqlite3_malloc().  Or, if the most recent error does not involve a
  23413 ** specific token that we can point to, return an empty string.
  23414 **
  23415 ** In all cases, the memory returned is obtained from sqlite3_malloc64()
  23416 ** and should be released by the caller invoking sqlite3_free().
  23417 */
  23418 static char *shell_error_context(const char *zSql, sqlite3 *db){
  23419   int iOffset;
  23420   size_t len;
  23421   char *zCode;
  23422   char *zMsg;
  23423   int i;
  23424   if( db==0
  23425    || zSql==0
  23426    || (iOffset = sqlite3_error_offset(db))<0
  23427    || iOffset>=(int)strlen(zSql)
  23428   ){
  23429     return sqlite3_mprintf("");
  23430   }
  23431   while( iOffset>50 ){
  23432     iOffset--;
  23433     zSql++;
  23434     while( (zSql[0]&0xc0)==0x80 ){ zSql++; iOffset--; }
  23435   }
  23436   len = strlen(zSql);
  23437   if( len>78 ){
  23438     len = 78;
  23439     while( len>0 && (zSql[len]&0xc0)==0x80 ) len--;
  23440   }
  23441   zCode = sqlite3_mprintf("%.*s", len, zSql);
  23442   shell_check_oom(zCode);
  23443   for(i=0; zCode[i]; i++){ if( IsSpace(zSql[i]) ) zCode[i] = ' '; }
  23444   if( iOffset<25 ){
  23445     zMsg = sqlite3_mprintf("\n  %z\n  %*s^--- error here", zCode,iOffset,"");
  23446   }else{
  23447     zMsg = sqlite3_mprintf("\n  %z\n  %*serror here ---^", zCode,iOffset-14,"");
  23448   }
  23449   return zMsg;
  23450 }
  23451 
  23452 
  23453 /*
  23454 ** Execute a query statement that will generate SQL output.  Print
  23455 ** the result columns, comma-separated, on a line and then add a
  23456 ** semicolon terminator to the end of that line.
  23457 **
  23458 ** If the number of columns is 1 and that column contains text "--"
  23459 ** then write the semicolon on a separate line.  That way, if a
  23460 ** "--" comment occurs at the end of the statement, the comment
  23461 ** won't consume the semicolon terminator.
  23462 */
  23463 static int run_table_dump_query(
  23464   ShellState *p,           /* Query context */
  23465   const char *zSelect      /* SELECT statement to extract content */
  23466 ){
  23467   sqlite3_stmt *pSelect;
  23468   int rc;
  23469   int nResult;
  23470   int i;
  23471   const char *z;
  23472   rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
  23473   if( rc!=SQLITE_OK || !pSelect ){
  23474     char *zContext = shell_error_context(zSelect, p->db);
  23475     sqlite3_fprintf(p->out, "/**** ERROR: (%d) %s *****/\n%s",
  23476           rc, sqlite3_errmsg(p->db), zContext);
  23477     sqlite3_free(zContext);
  23478     if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
  23479     return rc;
  23480   }
  23481   rc = sqlite3_step(pSelect);
  23482   nResult = sqlite3_column_count(pSelect);
  23483   while( rc==SQLITE_ROW ){
  23484     z = (const char*)sqlite3_column_text(pSelect, 0);
  23485     sqlite3_fprintf(p->out, "%s", z);
  23486     for(i=1; i<nResult; i++){
  23487       sqlite3_fprintf(p->out, ",%s", sqlite3_column_text(pSelect, i));
  23488     }
  23489     if( z==0 ) z = "";
  23490     while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
  23491     if( z[0] ){
  23492       sqlite3_fputs("\n;\n", p->out);
  23493     }else{
  23494       sqlite3_fputs(";\n", p->out);
  23495     }
  23496     rc = sqlite3_step(pSelect);
  23497   }
  23498   rc = sqlite3_finalize(pSelect);
  23499   if( rc!=SQLITE_OK ){
  23500     sqlite3_fprintf(p->out, "/**** ERROR: (%d) %s *****/\n",
  23501                     rc, sqlite3_errmsg(p->db));
  23502     if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
  23503   }
  23504   return rc;
  23505 }
  23506 
  23507 /*
  23508 ** Allocate space and save off string indicating current error.
  23509 */
  23510 static char *save_err_msg(
  23511   sqlite3 *db,           /* Database to query */
  23512   const char *zPhase,    /* When the error occurs */
  23513   int rc,                /* Error code returned from API */
  23514   const char *zSql       /* SQL string, or NULL */
  23515 ){
  23516   char *zErr;
  23517   char *zContext;
  23518   sqlite3_str *pStr = sqlite3_str_new(0);
  23519   sqlite3_str_appendf(pStr, "%s, %s", zPhase, sqlite3_errmsg(db));
  23520   if( rc>1 ){
  23521     sqlite3_str_appendf(pStr, " (%d)", rc);
  23522   }
  23523   zContext = shell_error_context(zSql, db);
  23524   if( zContext ){
  23525     sqlite3_str_appendall(pStr, zContext);
  23526     sqlite3_free(zContext);
  23527   }
  23528   zErr = sqlite3_str_finish(pStr);
  23529   shell_check_oom(zErr);
  23530   return zErr;
  23531 }
  23532 
  23533 #ifdef __linux__
  23534 /*
  23535 ** Attempt to display I/O stats on Linux using /proc/PID/io
  23536 */
  23537 static void displayLinuxIoStats(FILE *out){
  23538   FILE *in;
  23539   char z[200];
  23540   sqlite3_snprintf(sizeof(z), z, "/proc/%d/io", getpid());
  23541   in = sqlite3_fopen(z, "rb");
  23542   if( in==0 ) return;
  23543   while( sqlite3_fgets(z, sizeof(z), in)!=0 ){
  23544     static const struct {
  23545       const char *zPattern;
  23546       const char *zDesc;
  23547     } aTrans[] = {
  23548       { "rchar: ",                  "Bytes received by read():" },
  23549       { "wchar: ",                  "Bytes sent to write():"    },
  23550       { "syscr: ",                  "Read() system calls:"      },
  23551       { "syscw: ",                  "Write() system calls:"     },
  23552       { "read_bytes: ",             "Bytes read from storage:"  },
  23553       { "write_bytes: ",            "Bytes written to storage:" },
  23554       { "cancelled_write_bytes: ",  "Cancelled write bytes:"    },
  23555     };
  23556     int i;
  23557     for(i=0; i<ArraySize(aTrans); i++){
  23558       int n = strlen30(aTrans[i].zPattern);
  23559       if( cli_strncmp(aTrans[i].zPattern, z, n)==0 ){
  23560         sqlite3_fprintf(out, "%-36s %s", aTrans[i].zDesc, &z[n]);
  23561         break;
  23562       }
  23563     }
  23564   }
  23565   fclose(in);
  23566 }
  23567 #endif
  23568 
  23569 /*
  23570 ** Display a single line of status using 64-bit values.
  23571 */
  23572 static void displayStatLine(
  23573   FILE *out,                /* Write to this channel */
  23574   char *zLabel,             /* Label for this one line */
  23575   char *zFormat,            /* Format for the result */
  23576   int iStatusCtrl,          /* Which status to display */
  23577   int bReset                /* True to reset the stats */
  23578 ){
  23579   sqlite3_int64 iCur = -1;
  23580   sqlite3_int64 iHiwtr = -1;
  23581   int i, nPercent;
  23582   char zLine[200];
  23583   sqlite3_status64(iStatusCtrl, &iCur, &iHiwtr, bReset);
  23584   for(i=0, nPercent=0; zFormat[i]; i++){
  23585     if( zFormat[i]=='%' ) nPercent++;
  23586   }
  23587   if( nPercent>1 ){
  23588     sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iCur, iHiwtr);
  23589   }else{
  23590     sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iHiwtr);
  23591   }
  23592   sqlite3_fprintf(out, "%-36s %s\n", zLabel, zLine);
  23593 }
  23594 
  23595 /*
  23596 ** Display memory stats.
  23597 */
  23598 static int display_stats(
  23599   sqlite3 *db,                /* Database to query */
  23600   ShellState *pArg,           /* Pointer to ShellState */
  23601   int bReset                  /* True to reset the stats */
  23602 ){
  23603   int iCur;
  23604   int iHiwtr;
  23605   FILE *out;
  23606   if( pArg==0 || pArg->out==0 ) return 0;
  23607   out = pArg->out;
  23608 
  23609   if( pArg->pStmt && pArg->statsOn==2 ){
  23610     int nCol, i, x;
  23611     sqlite3_stmt *pStmt = pArg->pStmt;
  23612     char z[100];
  23613     nCol = sqlite3_column_count(pStmt);
  23614     sqlite3_fprintf(out, "%-36s %d\n", "Number of output columns:", nCol);
  23615     for(i=0; i<nCol; i++){
  23616       sqlite3_snprintf(sizeof(z),z,"Column %d %nname:", i, &x);
  23617       sqlite3_fprintf(out, "%-36s %s\n", z, sqlite3_column_name(pStmt,i));
  23618 #ifndef SQLITE_OMIT_DECLTYPE
  23619       sqlite3_snprintf(30, z+x, "declared type:");
  23620       sqlite3_fprintf(out, "%-36s %s\n", z, sqlite3_column_decltype(pStmt, i));
  23621 #endif
  23622 #ifdef SQLITE_ENABLE_COLUMN_METADATA
  23623       sqlite3_snprintf(30, z+x, "database name:");
  23624       sqlite3_fprintf(out, "%-36s %s\n", z,
  23625                            sqlite3_column_database_name(pStmt,i));
  23626       sqlite3_snprintf(30, z+x, "table name:");
  23627       sqlite3_fprintf(out, "%-36s %s\n", z, sqlite3_column_table_name(pStmt,i));
  23628       sqlite3_snprintf(30, z+x, "origin name:");
  23629       sqlite3_fprintf(out, "%-36s %s\n", z,sqlite3_column_origin_name(pStmt,i));
  23630 #endif
  23631     }
  23632   }
  23633 
  23634   if( pArg->statsOn==3 ){
  23635     if( pArg->pStmt ){
  23636       iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP,bReset);
  23637       sqlite3_fprintf(out, "VM-steps: %d\n", iCur);
  23638     }
  23639     return 0;
  23640   }
  23641 
  23642   displayStatLine(out, "Memory Used:",
  23643      "%lld (max %lld) bytes", SQLITE_STATUS_MEMORY_USED, bReset);
  23644   displayStatLine(out, "Number of Outstanding Allocations:",
  23645      "%lld (max %lld)", SQLITE_STATUS_MALLOC_COUNT, bReset);
  23646   if( pArg->shellFlgs & SHFLG_Pagecache ){
  23647     displayStatLine(out, "Number of Pcache Pages Used:",
  23648        "%lld (max %lld) pages", SQLITE_STATUS_PAGECACHE_USED, bReset);
  23649   }
  23650   displayStatLine(out, "Number of Pcache Overflow Bytes:",
  23651      "%lld (max %lld) bytes", SQLITE_STATUS_PAGECACHE_OVERFLOW, bReset);
  23652   displayStatLine(out, "Largest Allocation:",
  23653      "%lld bytes", SQLITE_STATUS_MALLOC_SIZE, bReset);
  23654   displayStatLine(out, "Largest Pcache Allocation:",
  23655      "%lld bytes", SQLITE_STATUS_PAGECACHE_SIZE, bReset);
  23656 #ifdef YYTRACKMAXSTACKDEPTH
  23657   displayStatLine(out, "Deepest Parser Stack:",
  23658      "%lld (max %lld)", SQLITE_STATUS_PARSER_STACK, bReset);
  23659 #endif
  23660 
  23661   if( db ){
  23662     if( pArg->shellFlgs & SHFLG_Lookaside ){
  23663       iHiwtr = iCur = -1;
  23664       sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED,
  23665                         &iCur, &iHiwtr, bReset);
  23666       sqlite3_fprintf(out, 
  23667            "Lookaside Slots Used:                %d (max %d)\n", iCur, iHiwtr);
  23668       sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT,
  23669                         &iCur, &iHiwtr, bReset);
  23670       sqlite3_fprintf(out,
  23671            "Successful lookaside attempts:       %d\n", iHiwtr);
  23672       sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE,
  23673                         &iCur, &iHiwtr, bReset);
  23674       sqlite3_fprintf(out,
  23675            "Lookaside failures due to size:      %d\n", iHiwtr);
  23676       sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL,
  23677                         &iCur, &iHiwtr, bReset);
  23678       sqlite3_fprintf(out,
  23679            "Lookaside failures due to OOM:       %d\n", iHiwtr);
  23680     }
  23681     iHiwtr = iCur = -1;
  23682     sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
  23683     sqlite3_fprintf(out,
  23684            "Pager Heap Usage:                    %d bytes\n", iCur);
  23685     iHiwtr = iCur = -1;
  23686     sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
  23687     sqlite3_fprintf(out,
  23688            "Page cache hits:                     %d\n", iCur);
  23689     iHiwtr = iCur = -1;
  23690     sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
  23691     sqlite3_fprintf(out,
  23692            "Page cache misses:                   %d\n", iCur);
  23693     iHiwtr = iCur = -1;
  23694     sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
  23695     sqlite3_fprintf(out,
  23696            "Page cache writes:                   %d\n", iCur);
  23697     iHiwtr = iCur = -1;
  23698     sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_SPILL, &iCur, &iHiwtr, 1);
  23699     sqlite3_fprintf(out,
  23700            "Page cache spills:                   %d\n", iCur);
  23701     iHiwtr = iCur = -1;
  23702     sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
  23703     sqlite3_fprintf(out,
  23704            "Schema Heap Usage:                   %d bytes\n", iCur);
  23705     iHiwtr = iCur = -1;
  23706     sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
  23707     sqlite3_fprintf(out,
  23708            "Statement Heap/Lookaside Usage:      %d bytes\n", iCur);
  23709   }
  23710 
  23711   if( pArg->pStmt ){
  23712     int iHit, iMiss;
  23713     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP,
  23714                                bReset);
  23715     sqlite3_fprintf(out,
  23716            "Fullscan Steps:                      %d\n", iCur);
  23717     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
  23718     sqlite3_fprintf(out,
  23719            "Sort Operations:                     %d\n", iCur);
  23720     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset);
  23721     sqlite3_fprintf(out,
  23722            "Autoindex Inserts:                   %d\n", iCur);
  23723     iHit = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FILTER_HIT,
  23724                                bReset);
  23725     iMiss = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FILTER_MISS,
  23726                                 bReset);
  23727     if( iHit || iMiss ){
  23728       sqlite3_fprintf(out,
  23729            "Bloom filter bypass taken:           %d/%d\n", iHit, iHit+iMiss);
  23730     }
  23731     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
  23732     sqlite3_fprintf(out,
  23733            "Virtual Machine Steps:               %d\n", iCur);
  23734     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_REPREPARE,bReset);
  23735     sqlite3_fprintf(out,
  23736            "Reprepare operations:                %d\n", iCur);
  23737     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_RUN, bReset);
  23738     sqlite3_fprintf(out,
  23739            "Number of times run:                 %d\n", iCur);
  23740     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_MEMUSED, bReset);
  23741     sqlite3_fprintf(out,
  23742            "Memory used by prepared stmt:        %d\n", iCur);
  23743   }
  23744 
  23745 #ifdef __linux__
  23746   displayLinuxIoStats(pArg->out);
  23747 #endif
  23748 
  23749   /* Do not remove this machine readable comment: extra-stats-output-here */
  23750 
  23751   return 0;
  23752 }
  23753 
  23754 
  23755 #ifdef SQLITE_ENABLE_STMT_SCANSTATUS
  23756 static int scanStatsHeight(sqlite3_stmt *p, int iEntry){
  23757   int iPid = 0;
  23758   int ret = 1;
  23759   sqlite3_stmt_scanstatus_v2(p, iEntry,
  23760       SQLITE_SCANSTAT_SELECTID, SQLITE_SCANSTAT_COMPLEX, (void*)&iPid
  23761   );
  23762   while( iPid!=0 ){
  23763     int ii;
  23764     for(ii=0; 1; ii++){
  23765       int iId;
  23766       int res;
  23767       res = sqlite3_stmt_scanstatus_v2(p, ii,
  23768           SQLITE_SCANSTAT_SELECTID, SQLITE_SCANSTAT_COMPLEX, (void*)&iId
  23769       );
  23770       if( res ) break;
  23771       if( iId==iPid ){
  23772         sqlite3_stmt_scanstatus_v2(p, ii,
  23773             SQLITE_SCANSTAT_PARENTID, SQLITE_SCANSTAT_COMPLEX, (void*)&iPid
  23774         );
  23775       }
  23776     }
  23777     ret++;
  23778   }
  23779   return ret;
  23780 }
  23781 #endif
  23782 
  23783 #ifdef SQLITE_ENABLE_STMT_SCANSTATUS
  23784 static void display_explain_scanstats(
  23785   sqlite3 *db,                    /* Database to query */
  23786   ShellState *pArg                /* Pointer to ShellState */
  23787 ){
  23788   static const int f = SQLITE_SCANSTAT_COMPLEX;
  23789   sqlite3_stmt *p = pArg->pStmt;
  23790   int ii = 0;
  23791   i64 nTotal = 0;
  23792   int nWidth = 0;
  23793   eqp_reset(pArg);
  23794 
  23795   for(ii=0; 1; ii++){
  23796     const char *z = 0;
  23797     int n = 0;
  23798     if( sqlite3_stmt_scanstatus_v2(p,ii,SQLITE_SCANSTAT_EXPLAIN,f,(void*)&z) ){
  23799       break;
  23800     }
  23801     n = (int)strlen(z) + scanStatsHeight(p, ii)*3;
  23802     if( n>nWidth ) nWidth = n;
  23803   }
  23804   nWidth += 4;
  23805 
  23806   sqlite3_stmt_scanstatus_v2(p, -1, SQLITE_SCANSTAT_NCYCLE, f, (void*)&nTotal);
  23807   for(ii=0; 1; ii++){
  23808     i64 nLoop = 0;
  23809     i64 nRow = 0;
  23810     i64 nCycle = 0;
  23811     int iId = 0;
  23812     int iPid = 0;
  23813     const char *zo = 0;
  23814     const char *zName = 0;
  23815     char *zText = 0;
  23816     double rEst = 0.0;
  23817 
  23818     if( sqlite3_stmt_scanstatus_v2(p,ii,SQLITE_SCANSTAT_EXPLAIN,f,(void*)&zo) ){
  23819       break;
  23820     }
  23821     sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_EST,f,(void*)&rEst);
  23822     sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_NLOOP,f,(void*)&nLoop);
  23823     sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_NVISIT,f,(void*)&nRow);
  23824     sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_NCYCLE,f,(void*)&nCycle);
  23825     sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_SELECTID,f,(void*)&iId);
  23826     sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_PARENTID,f,(void*)&iPid);
  23827     sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_NAME,f,(void*)&zName);
  23828 
  23829     zText = sqlite3_mprintf("%s", zo);
  23830     if( nCycle>=0 || nLoop>=0 || nRow>=0 ){
  23831       char *z = 0;
  23832       if( nCycle>=0 && nTotal>0 ){
  23833         z = sqlite3_mprintf("%zcycles=%lld [%d%%]", z,
  23834             nCycle, ((nCycle*100)+nTotal/2) / nTotal
  23835         );
  23836       }
  23837       if( nLoop>=0 ){
  23838         z = sqlite3_mprintf("%z%sloops=%lld", z, z ? " " : "", nLoop);
  23839       }
  23840       if( nRow>=0 ){
  23841         z = sqlite3_mprintf("%z%srows=%lld", z, z ? " " : "", nRow);
  23842       }
  23843 
  23844       if( zName && pArg->scanstatsOn>1 ){
  23845         double rpl = (double)nRow / (double)nLoop;
  23846         z = sqlite3_mprintf("%z rpl=%.1f est=%.1f", z, rpl, rEst);
  23847       }
  23848 
  23849       zText = sqlite3_mprintf(
  23850           "% *z (%z)", -1*(nWidth-scanStatsHeight(p, ii)*3), zText, z
  23851       );
  23852     }
  23853 
  23854     eqp_append(pArg, iId, iPid, zText);
  23855     sqlite3_free(zText);
  23856   }
  23857 
  23858   eqp_render(pArg, nTotal);
  23859 }
  23860 #endif
  23861 
  23862 
  23863 /*
  23864 ** Parameter azArray points to a zero-terminated array of strings. zStr
  23865 ** points to a single nul-terminated string. Return non-zero if zStr
  23866 ** is equal, according to strcmp(), to any of the strings in the array.
  23867 ** Otherwise, return zero.
  23868 */
  23869 static int str_in_array(const char *zStr, const char **azArray){
  23870   int i;
  23871   for(i=0; azArray[i]; i++){
  23872     if( 0==cli_strcmp(zStr, azArray[i]) ) return 1;
  23873   }
  23874   return 0;
  23875 }
  23876 
  23877 /*
  23878 ** If compiled statement pSql appears to be an EXPLAIN statement, allocate
  23879 ** and populate the ShellState.aiIndent[] array with the number of
  23880 ** spaces each opcode should be indented before it is output.
  23881 **
  23882 ** The indenting rules are:
  23883 **
  23884 **     * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
  23885 **       all opcodes that occur between the p2 jump destination and the opcode
  23886 **       itself by 2 spaces.
  23887 **
  23888 **     * Do the previous for "Return" instructions for when P2 is positive.
  23889 **       See tag-20220407a in wherecode.c and vdbe.c.
  23890 **
  23891 **     * For each "Goto", if the jump destination is earlier in the program
  23892 **       and ends on one of:
  23893 **          Yield  SeekGt  SeekLt  RowSetRead  Rewind
  23894 **       or if the P1 parameter is one instead of zero,
  23895 **       then indent all opcodes between the earlier instruction
  23896 **       and "Goto" by 2 spaces.
  23897 */
  23898 static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){
  23899   int *abYield = 0;               /* True if op is an OP_Yield */
  23900   int nAlloc = 0;                 /* Allocated size of p->aiIndent[], abYield */
  23901   int iOp;                        /* Index of operation in p->aiIndent[] */
  23902 
  23903   const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext",
  23904                            "Return", 0 };
  23905   const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead",
  23906                             "Rewind", 0 };
  23907   const char *azGoto[] = { "Goto", 0 };
  23908 
  23909   /* The caller guarantees that the leftmost 4 columns of the statement
  23910   ** passed to this function are equivalent to the leftmost 4 columns
  23911   ** of EXPLAIN statement output. In practice the statement may be
  23912   ** an EXPLAIN, or it may be a query on the bytecode() virtual table.  */
  23913   assert( sqlite3_column_count(pSql)>=4 );
  23914   assert( 0==sqlite3_stricmp( sqlite3_column_name(pSql, 0), "addr" ) );
  23915   assert( 0==sqlite3_stricmp( sqlite3_column_name(pSql, 1), "opcode" ) );
  23916   assert( 0==sqlite3_stricmp( sqlite3_column_name(pSql, 2), "p1" ) );
  23917   assert( 0==sqlite3_stricmp( sqlite3_column_name(pSql, 3), "p2" ) );
  23918 
  23919   for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
  23920     int i;
  23921     int iAddr = sqlite3_column_int(pSql, 0);
  23922     const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
  23923     int p1 = sqlite3_column_int(pSql, 2);
  23924     int p2 = sqlite3_column_int(pSql, 3);
  23925 
  23926     /* Assuming that p2 is an instruction address, set variable p2op to the
  23927     ** index of that instruction in the aiIndent[] array. p2 and p2op may be
  23928     ** different if the current instruction is part of a sub-program generated
  23929     ** by an SQL trigger or foreign key.  */
  23930     int p2op = (p2 + (iOp-iAddr));
  23931 
  23932     /* Grow the p->aiIndent array as required */
  23933     if( iOp>=nAlloc ){
  23934       nAlloc += 100;
  23935       p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int));
  23936       shell_check_oom(p->aiIndent);
  23937       abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int));
  23938       shell_check_oom(abYield);
  23939     }
  23940 
  23941     abYield[iOp] = str_in_array(zOp, azYield);
  23942     p->aiIndent[iOp] = 0;
  23943     p->nIndent = iOp+1;
  23944     if( str_in_array(zOp, azNext) && p2op>0 ){
  23945       for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
  23946     }
  23947     if( str_in_array(zOp, azGoto) && p2op<iOp && (abYield[p2op] || p1) ){
  23948       for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
  23949     }
  23950   }
  23951 
  23952   p->iIndent = 0;
  23953   sqlite3_free(abYield);
  23954   sqlite3_reset(pSql);
  23955 }
  23956 
  23957 /*
  23958 ** Free the array allocated by explain_data_prepare().
  23959 */
  23960 static void explain_data_delete(ShellState *p){
  23961   sqlite3_free(p->aiIndent);
  23962   p->aiIndent = 0;
  23963   p->nIndent = 0;
  23964   p->iIndent = 0;
  23965 }
  23966 
  23967 static void exec_prepared_stmt(ShellState*, sqlite3_stmt*);
  23968 
  23969 /*
  23970 ** Display scan stats.
  23971 */
  23972 static void display_scanstats(
  23973   sqlite3 *db,                    /* Database to query */
  23974   ShellState *pArg                /* Pointer to ShellState */
  23975 ){
  23976 #ifndef SQLITE_ENABLE_STMT_SCANSTATUS
  23977   UNUSED_PARAMETER(db);
  23978   UNUSED_PARAMETER(pArg);
  23979 #else
  23980   if( pArg->scanstatsOn==3 ){
  23981     const char *zSql =
  23982       "  SELECT addr, opcode, p1, p2, p3, p4, p5, comment, nexec,"
  23983       "   format('% 6s (%.2f%%)',"
  23984       "      CASE WHEN ncycle<100_000 THEN ncycle || ' '"
  23985       "         WHEN ncycle<100_000_000 THEN (ncycle/1_000) || 'K'"
  23986       "         WHEN ncycle<100_000_000_000 THEN (ncycle/1_000_000) || 'M'"
  23987       "         ELSE (ncycle/1000_000_000) || 'G' END,"
  23988       "       ncycle*100.0/(sum(ncycle) OVER ())"
  23989       "   )  AS cycles"
  23990       "   FROM bytecode(?)";
  23991 
  23992     int rc = SQLITE_OK;
  23993     sqlite3_stmt *pStmt = 0;
  23994     rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
  23995     if( rc==SQLITE_OK ){
  23996       sqlite3_stmt *pSave = pArg->pStmt;
  23997       pArg->pStmt = pStmt;
  23998       sqlite3_bind_pointer(pStmt, 1, pSave, "stmt-pointer", 0);
  23999 
  24000       pArg->cnt = 0;
  24001       pArg->cMode = MODE_ScanExp;
  24002       explain_data_prepare(pArg, pStmt);
  24003       exec_prepared_stmt(pArg, pStmt);
  24004       explain_data_delete(pArg);
  24005 
  24006       sqlite3_finalize(pStmt);
  24007       pArg->pStmt = pSave;
  24008     }
  24009   }else{
  24010     display_explain_scanstats(db, pArg);
  24011   }
  24012 #endif
  24013 }
  24014 
  24015 /*
  24016 ** Disable and restore .wheretrace and .treetrace/.selecttrace settings.
  24017 */
  24018 static unsigned int savedSelectTrace;
  24019 static unsigned int savedWhereTrace;
  24020 static void disable_debug_trace_modes(void){
  24021   unsigned int zero = 0;
  24022   sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 0, &savedSelectTrace);
  24023   sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &zero);
  24024   sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 2, &savedWhereTrace);
  24025   sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &zero);
  24026 }
  24027 static void restore_debug_trace_modes(void){
  24028   sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &savedSelectTrace);
  24029   sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &savedWhereTrace);
  24030 }
  24031 
  24032 /* Create the TEMP table used to store parameter bindings */
  24033 static void bind_table_init(ShellState *p){
  24034   int wrSchema = 0;
  24035   int defensiveMode = 0;
  24036   sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, -1, &defensiveMode);
  24037   sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, 0, 0);
  24038   sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, -1, &wrSchema);
  24039   sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, 1, 0);
  24040   sqlite3_exec(p->db,
  24041     "CREATE TABLE IF NOT EXISTS temp.sqlite_parameters(\n"
  24042     "  key TEXT PRIMARY KEY,\n"
  24043     "  value\n"
  24044     ") WITHOUT ROWID;",
  24045     0, 0, 0);
  24046   sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, wrSchema, 0);
  24047   sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, defensiveMode, 0);
  24048 }
  24049 
  24050 /*
  24051 ** Bind parameters on a prepared statement.
  24052 **
  24053 ** Parameter bindings are taken from a TEMP table of the form:
  24054 **
  24055 **    CREATE TEMP TABLE sqlite_parameters(key TEXT PRIMARY KEY, value)
  24056 **    WITHOUT ROWID;
  24057 **
  24058 ** No bindings occur if this table does not exist.  The name of the table
  24059 ** begins with "sqlite_" so that it will not collide with ordinary application
  24060 ** tables.  The table must be in the TEMP schema.
  24061 */
  24062 static void bind_prepared_stmt(ShellState *pArg, sqlite3_stmt *pStmt){
  24063   int nVar;
  24064   int i;
  24065   int rc;
  24066   sqlite3_stmt *pQ = 0;
  24067 
  24068   nVar = sqlite3_bind_parameter_count(pStmt);
  24069   if( nVar==0 ) return;  /* Nothing to do */
  24070   if( sqlite3_table_column_metadata(pArg->db, "TEMP", "sqlite_parameters",
  24071                                     "key", 0, 0, 0, 0, 0)!=SQLITE_OK ){
  24072     rc = SQLITE_NOTFOUND;
  24073     pQ = 0;
  24074   }else{
  24075     rc = sqlite3_prepare_v2(pArg->db,
  24076             "SELECT value FROM temp.sqlite_parameters"
  24077             " WHERE key=?1", -1, &pQ, 0);
  24078   }
  24079   for(i=1; i<=nVar; i++){
  24080     char zNum[30];
  24081     const char *zVar = sqlite3_bind_parameter_name(pStmt, i);
  24082     if( zVar==0 ){
  24083       sqlite3_snprintf(sizeof(zNum),zNum,"?%d",i);
  24084       zVar = zNum;
  24085     }
  24086     sqlite3_bind_text(pQ, 1, zVar, -1, SQLITE_STATIC);
  24087     if( rc==SQLITE_OK && pQ && sqlite3_step(pQ)==SQLITE_ROW ){
  24088       sqlite3_bind_value(pStmt, i, sqlite3_column_value(pQ, 0));
  24089 #ifdef NAN
  24090     }else if( sqlite3_strlike("_NAN", zVar, 0)==0 ){
  24091       sqlite3_bind_double(pStmt, i, NAN);
  24092 #endif
  24093 #ifdef INFINITY
  24094     }else if( sqlite3_strlike("_INF", zVar, 0)==0 ){
  24095       sqlite3_bind_double(pStmt, i, INFINITY);
  24096 #endif
  24097     }else if( strncmp(zVar, "$int_", 5)==0 ){
  24098       sqlite3_bind_int(pStmt, i, atoi(&zVar[5]));
  24099     }else if( strncmp(zVar, "$text_", 6)==0 ){
  24100       size_t szVar = strlen(zVar);
  24101       char *zBuf = sqlite3_malloc64( szVar-5 );
  24102       if( zBuf ){
  24103         memcpy(zBuf, &zVar[6], szVar-5);
  24104         sqlite3_bind_text64(pStmt, i, zBuf, szVar-6, sqlite3_free, SQLITE_UTF8);
  24105       }
  24106     }else{
  24107       sqlite3_bind_null(pStmt, i);
  24108     }
  24109     sqlite3_reset(pQ);
  24110   }
  24111   sqlite3_finalize(pQ);
  24112 }
  24113 
  24114 /*
  24115 ** UTF8 box-drawing characters.  Imagine box lines like this:
  24116 **
  24117 **           1
  24118 **           |
  24119 **       4 --+-- 2
  24120 **           |
  24121 **           3
  24122 **
  24123 ** Each box characters has between 2 and 4 of the lines leading from
  24124 ** the center.  The characters are here identified by the numbers of
  24125 ** their corresponding lines.
  24126 */
  24127 #define BOX_24   "\342\224\200"  /* U+2500 --- */
  24128 #define BOX_13   "\342\224\202"  /* U+2502  |  */
  24129 #define BOX_23   "\342\224\214"  /* U+250c  ,- */
  24130 #define BOX_34   "\342\224\220"  /* U+2510 -,  */
  24131 #define BOX_12   "\342\224\224"  /* U+2514  '- */
  24132 #define BOX_14   "\342\224\230"  /* U+2518 -'  */
  24133 #define BOX_123  "\342\224\234"  /* U+251c  |- */
  24134 #define BOX_134  "\342\224\244"  /* U+2524 -|  */
  24135 #define BOX_234  "\342\224\254"  /* U+252c -,- */
  24136 #define BOX_124  "\342\224\264"  /* U+2534 -'- */
  24137 #define BOX_1234 "\342\224\274"  /* U+253c -|- */
  24138 
  24139 /* Draw horizontal line N characters long using unicode box
  24140 ** characters
  24141 */
  24142 static void print_box_line(FILE *out, int N){
  24143   const char zDash[] =
  24144       BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24
  24145       BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24;
  24146   const int nDash = sizeof(zDash) - 1;
  24147   N *= 3;
  24148   while( N>nDash ){
  24149     sqlite3_fputs(zDash, out);
  24150     N -= nDash;
  24151   }
  24152   sqlite3_fprintf(out, "%.*s", N, zDash);
  24153 }
  24154 
  24155 /*
  24156 ** Draw a horizontal separator for a MODE_Box table.
  24157 */
  24158 static void print_box_row_separator(
  24159   ShellState *p,
  24160   int nArg,
  24161   const char *zSep1,
  24162   const char *zSep2,
  24163   const char *zSep3
  24164 ){
  24165   int i;
  24166   if( nArg>0 ){
  24167     sqlite3_fputs(zSep1, p->out);
  24168     print_box_line(p->out, p->actualWidth[0]+2);
  24169     for(i=1; i<nArg; i++){
  24170       sqlite3_fputs(zSep2, p->out);
  24171       print_box_line(p->out, p->actualWidth[i]+2);
  24172     }
  24173     sqlite3_fputs(zSep3, p->out);
  24174   }
  24175   sqlite3_fputs("\n", p->out);
  24176 }
  24177 
  24178 /*
  24179 ** z[] is a line of text that is to be displayed the .mode box or table or
  24180 ** similar tabular formats.  z[] might contain control characters such
  24181 ** as \n, \t, \f, or \r.
  24182 **
  24183 ** Compute characters to display on the first line of z[].  Stop at the
  24184 ** first \r, \n, or \f.  Expand \t into spaces.  Return a copy (obtained
  24185 ** from malloc()) of that first line, which caller should free sometime.
  24186 ** Write anything to display on the next line into *pzTail.  If this is
  24187 ** the last line, write a NULL into *pzTail. (*pzTail is not allocated.)
  24188 */
  24189 static char *translateForDisplayAndDup(
  24190   ShellState *p,                     /* To access current settings */
  24191   const unsigned char *z,            /* Input text to be transformed */
  24192   const unsigned char **pzTail,      /* OUT: Tail of the input for next line */
  24193   int mxWidth,                       /* Max width.  0 means no limit */
  24194   u8 bWordWrap                       /* If true, avoid breaking mid-word */
  24195 ){
  24196   int i;                 /* Input bytes consumed */
  24197   int j;                 /* Output bytes generated */
  24198   int k;                 /* Input bytes to be displayed */
  24199   int n;                 /* Output column number */
  24200   unsigned char *zOut;   /* Output text */
  24201 
  24202   if( z==0 ){
  24203     *pzTail = 0;
  24204     return 0;
  24205   }
  24206   if( mxWidth<0 ) mxWidth = -mxWidth;
  24207   if( mxWidth==0 ) mxWidth = 1000000;
  24208   i = j = n = 0;
  24209   while( n<mxWidth ){
  24210     unsigned char c = z[i];
  24211     if( c>=0xc0 ){
  24212       int u;
  24213       int len = decodeUtf8(&z[i], &u);
  24214       i += len;
  24215       j += len;
  24216       n += cli_wcwidth(u);
  24217       continue;
  24218     }
  24219     if( c>=' ' ){
  24220       n++;
  24221       i++;
  24222       j++;
  24223       continue;
  24224     }
  24225     if( c==0 || c=='\n' || (c=='\r' && z[i+1]=='\n') ) break;
  24226     if( c=='\t' ){
  24227       do{
  24228         n++;
  24229         j++;
  24230       }while( (n&7)!=0 && n<mxWidth );
  24231       i++;
  24232       continue;
  24233     }
  24234     if( c==0x1b && p->eEscMode==SHELL_ESC_OFF && (k = isVt100(&z[i]))>0 ){
  24235       i += k;
  24236       j += k;
  24237     }else{
  24238       n++;
  24239       j += 3;
  24240       i++;
  24241     }
  24242   }
  24243   if( n>=mxWidth && bWordWrap  ){
  24244     /* Perhaps try to back up to a better place to break the line */
  24245     for(k=i; k>i/2; k--){
  24246       if( IsSpace(z[k-1]) ) break;
  24247     }
  24248     if( k<=i/2 ){
  24249       for(k=i; k>i/2; k--){
  24250         if( IsAlnum(z[k-1])!=IsAlnum(z[k]) && (z[k]&0xc0)!=0x80 ) break;
  24251       }
  24252     }
  24253     if( k<=i/2 ){
  24254       k = i;
  24255     }else{
  24256       i = k;
  24257       while( z[i]==' ' ) i++;
  24258     }
  24259   }else{
  24260     k = i;
  24261   }
  24262   if( n>=mxWidth && z[i]>=' ' ){
  24263    *pzTail = &z[i];
  24264   }else if( z[i]=='\r' && z[i+1]=='\n' ){
  24265     *pzTail = z[i+2] ? &z[i+2] : 0;
  24266   }else if( z[i]==0 || z[i+1]==0 ){
  24267     *pzTail = 0;
  24268   }else{
  24269     *pzTail = &z[i+1];
  24270   }
  24271   zOut = malloc( j+1 );
  24272   shell_check_oom(zOut);
  24273   i = j = n = 0;
  24274   while( i<k ){
  24275     unsigned char c = z[i];
  24276     if( c>=0xc0 ){
  24277       int u;
  24278       int len = decodeUtf8(&z[i], &u);
  24279       do{ zOut[j++] = z[i++]; }while( (--len)>0 );
  24280       n += cli_wcwidth(u);
  24281       continue;
  24282     }
  24283     if( c>=' ' ){
  24284       n++;
  24285       zOut[j++] = z[i++];
  24286       continue;
  24287     }
  24288     if( c==0 ) break;
  24289     if( z[i]=='\t' ){
  24290       do{
  24291         n++;
  24292         zOut[j++] = ' ';
  24293       }while( (n&7)!=0 && n<mxWidth );
  24294       i++;
  24295       continue;
  24296     }
  24297     switch( p->eEscMode ){
  24298       case SHELL_ESC_SYMBOL:
  24299         zOut[j++] = 0xe2;
  24300         zOut[j++] = 0x90;
  24301         zOut[j++] = 0x80 + c;
  24302         break;
  24303       case SHELL_ESC_ASCII:
  24304         zOut[j++] = '^';
  24305         zOut[j++] = 0x40 + c;
  24306         break;
  24307       case SHELL_ESC_OFF: {
  24308         int nn;
  24309         if( c==0x1b && (nn = isVt100(&z[i]))>0 ){
  24310           memcpy(&zOut[j], &z[i], nn);
  24311           j += nn;
  24312           i += nn - 1;
  24313         }else{
  24314           zOut[j++] = c;
  24315         }
  24316         break;
  24317       }
  24318     }
  24319     i++;
  24320   }
  24321   zOut[j] = 0;
  24322   return (char*)zOut;
  24323 }
  24324 
  24325 /* Return true if the text string z[] contains characters that need
  24326 ** unistr() escaping.
  24327 */
  24328 static int needUnistr(const unsigned char *z){
  24329   unsigned char c;
  24330   if( z==0 ) return 0;
  24331   while( (c = *z)>0x1f || c=='\t' || c=='\n' || (c=='\r' && z[1]=='\n') ){ z++; }
  24332   return c!=0;
  24333 }
  24334 
  24335 /* Extract the value of the i-th current column for pStmt as an SQL literal
  24336 ** value.  Memory is obtained from sqlite3_malloc64() and must be freed by
  24337 ** the caller.
  24338 */
  24339 static char *quoted_column(sqlite3_stmt *pStmt, int i){
  24340   switch( sqlite3_column_type(pStmt, i) ){
  24341     case SQLITE_NULL: {
  24342       return sqlite3_mprintf("NULL");
  24343     }
  24344     case SQLITE_INTEGER:
  24345     case SQLITE_FLOAT: {
  24346       return sqlite3_mprintf("%s",sqlite3_column_text(pStmt,i));
  24347     }
  24348     case SQLITE_TEXT: {
  24349       const unsigned char *zText = sqlite3_column_text(pStmt,i);
  24350       return sqlite3_mprintf(needUnistr(zText)?"%#Q":"%Q",zText);
  24351     }
  24352     case SQLITE_BLOB: {
  24353       int j;
  24354       sqlite3_str *pStr = sqlite3_str_new(0);
  24355       const unsigned char *a = sqlite3_column_blob(pStmt,i);
  24356       int n = sqlite3_column_bytes(pStmt,i);
  24357       sqlite3_str_append(pStr, "x'", 2);
  24358       for(j=0; j<n; j++){
  24359         sqlite3_str_appendf(pStr, "%02x", a[j]);
  24360       }
  24361       sqlite3_str_append(pStr, "'", 1);
  24362       return sqlite3_str_finish(pStr);
  24363     }
  24364   }
  24365   return 0; /* Not reached */
  24366 }
  24367 
  24368 /*
  24369 ** Run a prepared statement and output the result in one of the
  24370 ** table-oriented formats: MODE_Column, MODE_Markdown, MODE_Table,
  24371 ** or MODE_Box.
  24372 **
  24373 ** This is different from ordinary exec_prepared_stmt() in that
  24374 ** it has to run the entire query and gather the results into memory
  24375 ** first, in order to determine column widths, before providing
  24376 ** any output.
  24377 */
  24378 static void exec_prepared_stmt_columnar(
  24379   ShellState *p,                        /* Pointer to ShellState */
  24380   sqlite3_stmt *pStmt                   /* Statement to run */
  24381 ){
  24382   sqlite3_int64 nRow = 0;
  24383   int nColumn = 0;
  24384   char **azData = 0;
  24385   sqlite3_int64 nAlloc = 0;
  24386   char *abRowDiv = 0;
  24387   const unsigned char *uz;
  24388   const char *z;
  24389   char **azQuoted = 0;
  24390   int rc;
  24391   sqlite3_int64 i, nData;
  24392   int j, nTotal, w, n;
  24393   const char *colSep = 0;
  24394   const char *rowSep = 0;
  24395   const unsigned char **azNextLine = 0;
  24396   int bNextLine = 0;
  24397   int bMultiLineRowExists = 0;
  24398   int bw = p->cmOpts.bWordWrap;
  24399   const char *zEmpty = "";
  24400   const char *zShowNull = p->nullValue;
  24401 
  24402   rc = sqlite3_step(pStmt);
  24403   if( rc!=SQLITE_ROW ) return;
  24404   nColumn = sqlite3_column_count(pStmt);
  24405   if( nColumn==0 ) goto columnar_end;
  24406   nAlloc = nColumn*4;
  24407   if( nAlloc<=0 ) nAlloc = 1;
  24408   azData = sqlite3_malloc64( nAlloc*sizeof(char*) );
  24409   shell_check_oom(azData);
  24410   azNextLine = sqlite3_malloc64( nColumn*sizeof(char*) );
  24411   shell_check_oom(azNextLine);
  24412   memset((void*)azNextLine, 0, nColumn*sizeof(char*) );
  24413   if( p->cmOpts.bQuote ){
  24414     azQuoted = sqlite3_malloc64( nColumn*sizeof(char*) );
  24415     shell_check_oom(azQuoted);
  24416     memset(azQuoted, 0, nColumn*sizeof(char*) );
  24417   }
  24418   abRowDiv = sqlite3_malloc64( nAlloc/nColumn );
  24419   shell_check_oom(abRowDiv);
  24420   if( nColumn>p->nWidth ){
  24421     p->colWidth = realloc(p->colWidth, (nColumn+1)*2*sizeof(int));
  24422     shell_check_oom(p->colWidth);
  24423     for(i=p->nWidth; i<nColumn; i++) p->colWidth[i] = 0;
  24424     p->nWidth = nColumn;
  24425     p->actualWidth = &p->colWidth[nColumn];
  24426   }
  24427   memset(p->actualWidth, 0, nColumn*sizeof(int));
  24428   for(i=0; i<nColumn; i++){
  24429     w = p->colWidth[i];
  24430     if( w<0 ) w = -w;
  24431     p->actualWidth[i] = w;
  24432   }
  24433   for(i=0; i<nColumn; i++){
  24434     const unsigned char *zNotUsed;
  24435     int wx = p->colWidth[i];
  24436     if( wx==0 ){
  24437       wx = p->cmOpts.iWrap;
  24438     }
  24439     if( wx<0 ) wx = -wx;
  24440     uz = (const unsigned char*)sqlite3_column_name(pStmt,i);
  24441     if( uz==0 ) uz = (u8*)"";
  24442     azData[i] = translateForDisplayAndDup(p, uz, &zNotUsed, wx, bw);
  24443   }
  24444   do{
  24445     int useNextLine = bNextLine;
  24446     bNextLine = 0;
  24447     if( (nRow+2)*nColumn >= nAlloc ){
  24448       nAlloc *= 2;
  24449       azData = sqlite3_realloc64(azData, nAlloc*sizeof(char*));
  24450       shell_check_oom(azData);
  24451       abRowDiv = sqlite3_realloc64(abRowDiv, nAlloc/nColumn);
  24452       shell_check_oom(abRowDiv);
  24453     }
  24454     abRowDiv[nRow] = 1;
  24455     nRow++;
  24456     for(i=0; i<nColumn; i++){
  24457       int wx = p->colWidth[i];
  24458       if( wx==0 ){
  24459         wx = p->cmOpts.iWrap;
  24460       }
  24461       if( wx<0 ) wx = -wx;
  24462       if( useNextLine ){
  24463         uz = azNextLine[i];
  24464         if( uz==0 ) uz = (u8*)zEmpty;
  24465       }else if( p->cmOpts.bQuote ){
  24466         assert( azQuoted!=0 );
  24467         sqlite3_free(azQuoted[i]);
  24468         azQuoted[i] = quoted_column(pStmt,i);
  24469         uz = (const unsigned char*)azQuoted[i];
  24470       }else{
  24471         uz = (const unsigned char*)sqlite3_column_text(pStmt,i);
  24472         if( uz==0 ) uz = (u8*)zShowNull;
  24473       }
  24474       azData[nRow*nColumn + i]
  24475         = translateForDisplayAndDup(p, uz, &azNextLine[i], wx, bw);
  24476       if( azNextLine[i] ){
  24477         bNextLine = 1;
  24478         abRowDiv[nRow-1] = 0;
  24479         bMultiLineRowExists = 1;
  24480       }
  24481     }
  24482   }while( bNextLine || sqlite3_step(pStmt)==SQLITE_ROW );
  24483   nTotal = nColumn*(nRow+1);
  24484   for(i=0; i<nTotal; i++){
  24485     z = azData[i];
  24486     if( z==0 ) z = (char*)zEmpty;
  24487     n = strlenChar(z);
  24488     j = i%nColumn;
  24489     if( n>p->actualWidth[j] ) p->actualWidth[j] = n;
  24490   }
  24491   if( seenInterrupt ) goto columnar_end;
  24492   switch( p->cMode ){
  24493     case MODE_Column: {
  24494       colSep = "  ";
  24495       rowSep = "\n";
  24496       if( p->showHeader ){
  24497         for(i=0; i<nColumn; i++){
  24498           w = p->actualWidth[i];
  24499           if( p->colWidth[i]<0 ) w = -w;
  24500           utf8_width_print(p->out, w, azData[i]);
  24501           sqlite3_fputs(i==nColumn-1?"\n":"  ", p->out);
  24502         }
  24503         for(i=0; i<nColumn; i++){
  24504           print_dashes(p->out, p->actualWidth[i]);
  24505           sqlite3_fputs(i==nColumn-1?"\n":"  ", p->out);
  24506         }
  24507       }
  24508       break;
  24509     }
  24510     case MODE_Table: {
  24511       colSep = " | ";
  24512       rowSep = " |\n";
  24513       print_row_separator(p, nColumn, "+");
  24514       sqlite3_fputs("| ", p->out);
  24515       for(i=0; i<nColumn; i++){
  24516         w = p->actualWidth[i];
  24517         n = strlenChar(azData[i]);
  24518         sqlite3_fprintf(p->out, "%*s%s%*s", (w-n)/2, "",
  24519                         azData[i], (w-n+1)/2, "");
  24520         sqlite3_fputs(i==nColumn-1?" |\n":" | ", p->out);
  24521       }
  24522       print_row_separator(p, nColumn, "+");
  24523       break;
  24524     }
  24525     case MODE_Markdown: {
  24526       colSep = " | ";
  24527       rowSep = " |\n";
  24528       sqlite3_fputs("| ", p->out);
  24529       for(i=0; i<nColumn; i++){
  24530         w = p->actualWidth[i];
  24531         n = strlenChar(azData[i]);
  24532         sqlite3_fprintf(p->out, "%*s%s%*s", (w-n)/2, "",
  24533                         azData[i], (w-n+1)/2, "");
  24534         sqlite3_fputs(i==nColumn-1?" |\n":" | ", p->out);
  24535       }
  24536       print_row_separator(p, nColumn, "|");
  24537       break;
  24538     }
  24539     case MODE_Box: {
  24540       colSep = " " BOX_13 " ";
  24541       rowSep = " " BOX_13 "\n";
  24542       print_box_row_separator(p, nColumn, BOX_23, BOX_234, BOX_34);
  24543       sqlite3_fputs(BOX_13 " ", p->out);
  24544       for(i=0; i<nColumn; i++){
  24545         w = p->actualWidth[i];
  24546         n = strlenChar(azData[i]);
  24547         sqlite3_fprintf(p->out, "%*s%s%*s%s",
  24548               (w-n)/2, "", azData[i], (w-n+1)/2, "",
  24549               i==nColumn-1?" "BOX_13"\n":" "BOX_13" ");
  24550       }
  24551       print_box_row_separator(p, nColumn, BOX_123, BOX_1234, BOX_134);
  24552       break;
  24553     }
  24554   }
  24555   for(i=nColumn, j=0; i<nTotal; i++, j++){
  24556     if( j==0 && p->cMode!=MODE_Column ){
  24557       sqlite3_fputs(p->cMode==MODE_Box?BOX_13" ":"| ", p->out);
  24558     }
  24559     z = azData[i];
  24560     if( z==0 ) z = p->nullValue;
  24561     w = p->actualWidth[j];
  24562     if( p->colWidth[j]<0 ) w = -w;
  24563     utf8_width_print(p->out, w, z);
  24564     if( j==nColumn-1 ){
  24565       sqlite3_fputs(rowSep, p->out);
  24566       if( bMultiLineRowExists && abRowDiv[i/nColumn-1] && i+1<nTotal ){
  24567         if( p->cMode==MODE_Table ){
  24568           print_row_separator(p, nColumn, "+");
  24569         }else if( p->cMode==MODE_Box ){
  24570           print_box_row_separator(p, nColumn, BOX_123, BOX_1234, BOX_134);
  24571         }else if( p->cMode==MODE_Column ){
  24572           sqlite3_fputs("\n", p->out);
  24573         }
  24574       }
  24575       j = -1;
  24576       if( seenInterrupt ) goto columnar_end;
  24577     }else{
  24578       sqlite3_fputs(colSep, p->out);
  24579     }
  24580   }
  24581   if( p->cMode==MODE_Table ){
  24582     print_row_separator(p, nColumn, "+");
  24583   }else if( p->cMode==MODE_Box ){
  24584     print_box_row_separator(p, nColumn, BOX_12, BOX_124, BOX_14);
  24585   }
  24586 columnar_end:
  24587   if( seenInterrupt ){
  24588     sqlite3_fputs("Interrupt\n", p->out);
  24589   }
  24590   nData = (nRow+1)*nColumn;
  24591   for(i=0; i<nData; i++){
  24592     z = azData[i];
  24593     if( z!=zEmpty && z!=zShowNull ) free(azData[i]);
  24594   }
  24595   sqlite3_free(azData);
  24596   sqlite3_free((void*)azNextLine);
  24597   sqlite3_free(abRowDiv);
  24598   if( azQuoted ){
  24599     for(i=0; i<nColumn; i++) sqlite3_free(azQuoted[i]);
  24600     sqlite3_free(azQuoted);
  24601   }
  24602 }
  24603 
  24604 /*
  24605 ** Run a prepared statement
  24606 */
  24607 static void exec_prepared_stmt(
  24608   ShellState *pArg,                                /* Pointer to ShellState */
  24609   sqlite3_stmt *pStmt                              /* Statement to run */
  24610 ){
  24611   int rc;
  24612   sqlite3_uint64 nRow = 0;
  24613 
  24614   if( pArg->cMode==MODE_Column
  24615    || pArg->cMode==MODE_Table
  24616    || pArg->cMode==MODE_Box
  24617    || pArg->cMode==MODE_Markdown
  24618   ){
  24619     exec_prepared_stmt_columnar(pArg, pStmt);
  24620     return;
  24621   }
  24622 
  24623   /* perform the first step.  this will tell us if we
  24624   ** have a result set or not and how wide it is.
  24625   */
  24626   rc = sqlite3_step(pStmt);
  24627   /* if we have a result set... */
  24628   if( SQLITE_ROW == rc ){
  24629     /* allocate space for col name ptr, value ptr, and type */
  24630     int nCol = sqlite3_column_count(pStmt);
  24631     void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1);
  24632     if( !pData ){
  24633       shell_out_of_memory();
  24634     }else{
  24635       char **azCols = (char **)pData;      /* Names of result columns */
  24636       char **azVals = &azCols[nCol];       /* Results */
  24637       int *aiTypes = (int *)&azVals[nCol]; /* Result types */
  24638       int i, x;
  24639       assert(sizeof(int) <= sizeof(char *));
  24640       /* save off ptrs to column names */
  24641       for(i=0; i<nCol; i++){
  24642         azCols[i] = (char *)sqlite3_column_name(pStmt, i);
  24643       }
  24644       do{
  24645         nRow++;
  24646         /* extract the data and data types */
  24647         for(i=0; i<nCol; i++){
  24648           aiTypes[i] = x = sqlite3_column_type(pStmt, i);
  24649           if( x==SQLITE_BLOB
  24650            && pArg
  24651            && (pArg->cMode==MODE_Insert || pArg->cMode==MODE_Quote)
  24652           ){
  24653             azVals[i] = "";
  24654           }else{
  24655             azVals[i] = (char*)sqlite3_column_text(pStmt, i);
  24656           }
  24657           if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
  24658             rc = SQLITE_NOMEM;
  24659             break; /* from for */
  24660           }
  24661         } /* end for */
  24662 
  24663         /* if data and types extracted successfully... */
  24664         if( SQLITE_ROW == rc ){
  24665           /* call the supplied callback with the result row data */
  24666           if( shell_callback(pArg, nCol, azVals, azCols, aiTypes) ){
  24667             rc = SQLITE_ABORT;
  24668           }else{
  24669             rc = sqlite3_step(pStmt);
  24670           }
  24671         }
  24672       } while( SQLITE_ROW == rc );
  24673       sqlite3_free(pData);
  24674       if( pArg->cMode==MODE_Json ){
  24675         sqlite3_fputs("]\n", pArg->out);
  24676       }else if( pArg->cMode==MODE_Www ){
  24677         sqlite3_fputs("</TABLE>\n<PRE>\n", pArg->out);
  24678       }else if( pArg->cMode==MODE_Count ){
  24679         char zBuf[200];
  24680         sqlite3_snprintf(sizeof(zBuf), zBuf, "%llu row%s\n",
  24681                          nRow, nRow!=1 ? "s" : "");
  24682         printf("%s", zBuf);
  24683       }
  24684     }
  24685   }
  24686 }
  24687 
  24688 #ifndef SQLITE_OMIT_VIRTUALTABLE
  24689 /*
  24690 ** This function is called to process SQL if the previous shell command
  24691 ** was ".expert". It passes the SQL in the second argument directly to
  24692 ** the sqlite3expert object.
  24693 **
  24694 ** If successful, SQLITE_OK is returned. Otherwise, an SQLite error
  24695 ** code. In this case, (*pzErr) may be set to point to a buffer containing
  24696 ** an English language error message. It is the responsibility of the
  24697 ** caller to eventually free this buffer using sqlite3_free().
  24698 */
  24699 static int expertHandleSQL(
  24700   ShellState *pState,
  24701   const char *zSql,
  24702   char **pzErr
  24703 ){
  24704   assert( pState->expert.pExpert );
  24705   assert( pzErr==0 || *pzErr==0 );
  24706   return sqlite3_expert_sql(pState->expert.pExpert, zSql, pzErr);
  24707 }
  24708 
  24709 /*
  24710 ** This function is called either to silently clean up the object
  24711 ** created by the ".expert" command (if bCancel==1), or to generate a
  24712 ** report from it and then clean it up (if bCancel==0).
  24713 **
  24714 ** If successful, SQLITE_OK is returned. Otherwise, an SQLite error
  24715 ** code. In this case, (*pzErr) may be set to point to a buffer containing
  24716 ** an English language error message. It is the responsibility of the
  24717 ** caller to eventually free this buffer using sqlite3_free().
  24718 */
  24719 static int expertFinish(
  24720   ShellState *pState,
  24721   int bCancel,
  24722   char **pzErr
  24723 ){
  24724   int rc = SQLITE_OK;
  24725   sqlite3expert *p = pState->expert.pExpert;
  24726   FILE *out = pState->out;
  24727   assert( p );
  24728   assert( bCancel || pzErr==0 || *pzErr==0 );
  24729   if( bCancel==0 ){
  24730     int bVerbose = pState->expert.bVerbose;
  24731 
  24732     rc = sqlite3_expert_analyze(p, pzErr);
  24733     if( rc==SQLITE_OK ){
  24734       int nQuery = sqlite3_expert_count(p);
  24735       int i;
  24736 
  24737       if( bVerbose ){
  24738         const char *zCand = sqlite3_expert_report(p,0,EXPERT_REPORT_CANDIDATES);
  24739         sqlite3_fputs("-- Candidates -----------------------------\n", out);
  24740         sqlite3_fprintf(out, "%s\n", zCand);
  24741       }
  24742       for(i=0; i<nQuery; i++){
  24743         const char *zSql = sqlite3_expert_report(p, i, EXPERT_REPORT_SQL);
  24744         const char *zIdx = sqlite3_expert_report(p, i, EXPERT_REPORT_INDEXES);
  24745         const char *zEQP = sqlite3_expert_report(p, i, EXPERT_REPORT_PLAN);
  24746         if( zIdx==0 ) zIdx = "(no new indexes)\n";
  24747         if( bVerbose ){
  24748           sqlite3_fprintf(out,
  24749               "-- Query %d --------------------------------\n"
  24750               "%s\n\n"
  24751               ,i+1, zSql);
  24752         }
  24753         sqlite3_fprintf(out, "%s\n%s\n", zIdx, zEQP);
  24754       }
  24755     }
  24756   }
  24757   sqlite3_expert_destroy(p);
  24758   pState->expert.pExpert = 0;
  24759   return rc;
  24760 }
  24761 
  24762 /*
  24763 ** Implementation of ".expert" dot command.
  24764 */
  24765 static int expertDotCommand(
  24766   ShellState *pState,             /* Current shell tool state */
  24767   char **azArg,                   /* Array of arguments passed to dot command */
  24768   int nArg                        /* Number of entries in azArg[] */
  24769 ){
  24770   int rc = SQLITE_OK;
  24771   char *zErr = 0;
  24772   int i;
  24773   int iSample = 0;
  24774 
  24775   assert( pState->expert.pExpert==0 );
  24776   memset(&pState->expert, 0, sizeof(ExpertInfo));
  24777 
  24778   for(i=1; rc==SQLITE_OK && i<nArg; i++){
  24779     char *z = azArg[i];
  24780     int n;
  24781     if( z[0]=='-' && z[1]=='-' ) z++;
  24782     n = strlen30(z);
  24783     if( n>=2 && 0==cli_strncmp(z, "-verbose", n) ){
  24784       pState->expert.bVerbose = 1;
  24785     }
  24786     else if( n>=2 && 0==cli_strncmp(z, "-sample", n) ){
  24787       if( i==(nArg-1) ){
  24788         sqlite3_fprintf(stderr, "option requires an argument: %s\n", z);
  24789         rc = SQLITE_ERROR;
  24790       }else{
  24791         iSample = (int)integerValue(azArg[++i]);
  24792         if( iSample<0 || iSample>100 ){
  24793           sqlite3_fprintf(stderr,"value out of range: %s\n", azArg[i]);
  24794           rc = SQLITE_ERROR;
  24795         }
  24796       }
  24797     }
  24798     else{
  24799       sqlite3_fprintf(stderr,"unknown option: %s\n", z);
  24800       rc = SQLITE_ERROR;
  24801     }
  24802   }
  24803 
  24804   if( rc==SQLITE_OK ){
  24805     pState->expert.pExpert = sqlite3_expert_new(pState->db, &zErr);
  24806     if( pState->expert.pExpert==0 ){
  24807       sqlite3_fprintf(stderr,
  24808           "sqlite3_expert_new: %s\n", zErr ? zErr : "out of memory");
  24809       rc = SQLITE_ERROR;
  24810     }else{
  24811       sqlite3_expert_config(
  24812           pState->expert.pExpert, EXPERT_CONFIG_SAMPLE, iSample
  24813       );
  24814     }
  24815   }
  24816   sqlite3_free(zErr);
  24817 
  24818   return rc;
  24819 }
  24820 #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
  24821 
  24822 /*
  24823 ** Execute a statement or set of statements.  Print
  24824 ** any result rows/columns depending on the current mode
  24825 ** set via the supplied callback.
  24826 **
  24827 ** This is very similar to SQLite's built-in sqlite3_exec()
  24828 ** function except it takes a slightly different callback
  24829 ** and callback data argument.
  24830 */
  24831 static int shell_exec(
  24832   ShellState *pArg,                         /* Pointer to ShellState */
  24833   const char *zSql,                         /* SQL to be evaluated */
  24834   char **pzErrMsg                           /* Error msg written here */
  24835 ){
  24836   sqlite3_stmt *pStmt = NULL;     /* Statement to execute. */
  24837   int rc = SQLITE_OK;             /* Return Code */
  24838   int rc2;
  24839   const char *zLeftover;          /* Tail of unprocessed SQL */
  24840   sqlite3 *db = pArg->db;
  24841 
  24842   if( pzErrMsg ){
  24843     *pzErrMsg = NULL;
  24844   }
  24845 
  24846 #ifndef SQLITE_OMIT_VIRTUALTABLE
  24847   if( pArg->expert.pExpert ){
  24848     rc = expertHandleSQL(pArg, zSql, pzErrMsg);
  24849     return expertFinish(pArg, (rc!=SQLITE_OK), pzErrMsg);
  24850   }
  24851 #endif
  24852 
  24853   while( zSql[0] && (SQLITE_OK == rc) ){
  24854     static const char *zStmtSql;
  24855     rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
  24856     if( SQLITE_OK != rc ){
  24857       if( pzErrMsg ){
  24858         *pzErrMsg = save_err_msg(db, "in prepare", rc, zSql);
  24859       }
  24860     }else{
  24861       if( !pStmt ){
  24862         /* this happens for a comment or white-space */
  24863         zSql = zLeftover;
  24864         while( IsSpace(zSql[0]) ) zSql++;
  24865         continue;
  24866       }
  24867       zStmtSql = sqlite3_sql(pStmt);
  24868       if( zStmtSql==0 ) zStmtSql = "";
  24869       while( IsSpace(zStmtSql[0]) ) zStmtSql++;
  24870 
  24871       /* save off the prepared statement handle and reset row count */
  24872       if( pArg ){
  24873         pArg->pStmt = pStmt;
  24874         pArg->cnt = 0;
  24875       }
  24876 
  24877       /* Show the EXPLAIN QUERY PLAN if .eqp is on */
  24878       if( pArg && pArg->autoEQP && sqlite3_stmt_isexplain(pStmt)==0 ){
  24879         sqlite3_stmt *pExplain;
  24880         int triggerEQP = 0;
  24881         disable_debug_trace_modes();
  24882         sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, -1, &triggerEQP);
  24883         if( pArg->autoEQP>=AUTOEQP_trigger ){
  24884           sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 1, 0);
  24885         }
  24886         pExplain = pStmt;
  24887         sqlite3_reset(pExplain);
  24888         rc = sqlite3_stmt_explain(pExplain, 2);
  24889         if( rc==SQLITE_OK ){
  24890           bind_prepared_stmt(pArg, pExplain);
  24891           while( sqlite3_step(pExplain)==SQLITE_ROW ){
  24892             const char *zEQPLine = (const char*)sqlite3_column_text(pExplain,3);
  24893             int iEqpId = sqlite3_column_int(pExplain, 0);
  24894             int iParentId = sqlite3_column_int(pExplain, 1);
  24895             if( zEQPLine==0 ) zEQPLine = "";
  24896             if( zEQPLine[0]=='-' ) eqp_render(pArg, 0);
  24897             eqp_append(pArg, iEqpId, iParentId, zEQPLine);
  24898           }
  24899           eqp_render(pArg, 0);
  24900         }
  24901         if( pArg->autoEQP>=AUTOEQP_full ){
  24902           /* Also do an EXPLAIN for ".eqp full" mode */
  24903           sqlite3_reset(pExplain);
  24904           rc = sqlite3_stmt_explain(pExplain, 1);
  24905           if( rc==SQLITE_OK ){
  24906             pArg->cMode = MODE_Explain;
  24907             assert( sqlite3_stmt_isexplain(pExplain)==1 );
  24908             bind_prepared_stmt(pArg, pExplain);
  24909             explain_data_prepare(pArg, pExplain);
  24910             exec_prepared_stmt(pArg, pExplain);
  24911             explain_data_delete(pArg);
  24912           }
  24913         }
  24914         if( pArg->autoEQP>=AUTOEQP_trigger && triggerEQP==0 ){
  24915           sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 0, 0);
  24916         }
  24917         sqlite3_reset(pStmt);
  24918         sqlite3_stmt_explain(pStmt, 0);
  24919         restore_debug_trace_modes();
  24920       }
  24921 
  24922       if( pArg ){
  24923         int bIsExplain = (sqlite3_stmt_isexplain(pStmt)==1);
  24924         pArg->cMode = pArg->mode;
  24925         if( pArg->autoExplain ){
  24926           if( bIsExplain ){
  24927             pArg->cMode = MODE_Explain;
  24928           }
  24929           if( sqlite3_stmt_isexplain(pStmt)==2 ){
  24930             pArg->cMode = MODE_EQP;
  24931           }
  24932         }
  24933 
  24934         /* If the shell is currently in ".explain" mode, gather the extra
  24935         ** data required to add indents to the output.*/
  24936         if( pArg->cMode==MODE_Explain && bIsExplain ){
  24937           explain_data_prepare(pArg, pStmt);
  24938         }
  24939       }
  24940 
  24941       bind_prepared_stmt(pArg, pStmt);
  24942       exec_prepared_stmt(pArg, pStmt);
  24943       explain_data_delete(pArg);
  24944       eqp_render(pArg, 0);
  24945 
  24946       /* print usage stats if stats on */
  24947       if( pArg && pArg->statsOn ){
  24948         display_stats(db, pArg, 0);
  24949       }
  24950 
  24951       /* print loop-counters if required */
  24952       if( pArg && pArg->scanstatsOn ){
  24953         display_scanstats(db, pArg);
  24954       }
  24955 
  24956       /* Finalize the statement just executed. If this fails, save a
  24957       ** copy of the error message. Otherwise, set zSql to point to the
  24958       ** next statement to execute. */
  24959       rc2 = sqlite3_finalize(pStmt);
  24960       if( rc!=SQLITE_NOMEM ) rc = rc2;
  24961       if( rc==SQLITE_OK ){
  24962         zSql = zLeftover;
  24963         while( IsSpace(zSql[0]) ) zSql++;
  24964       }else if( pzErrMsg ){
  24965         *pzErrMsg = save_err_msg(db, "stepping", rc, 0);
  24966       }
  24967 
  24968       /* clear saved stmt handle */
  24969       if( pArg ){
  24970         pArg->pStmt = NULL;
  24971       }
  24972     }
  24973   } /* end while */
  24974 
  24975   return rc;
  24976 }
  24977 
  24978 /*
  24979 ** Release memory previously allocated by tableColumnList().
  24980 */
  24981 static void freeColumnList(char **azCol){
  24982   int i;
  24983   for(i=1; azCol[i]; i++){
  24984     sqlite3_free(azCol[i]);
  24985   }
  24986   /* azCol[0] is a static string */
  24987   sqlite3_free(azCol);
  24988 }
  24989 
  24990 /*
  24991 ** Return a list of pointers to strings which are the names of all
  24992 ** columns in table zTab.   The memory to hold the names is dynamically
  24993 ** allocated and must be released by the caller using a subsequent call
  24994 ** to freeColumnList().
  24995 **
  24996 ** The azCol[0] entry is usually NULL.  However, if zTab contains a rowid
  24997 ** value that needs to be preserved, then azCol[0] is filled in with the
  24998 ** name of the rowid column.
  24999 **
  25000 ** The first regular column in the table is azCol[1].  The list is terminated
  25001 ** by an entry with azCol[i]==0.
  25002 */
  25003 static char **tableColumnList(ShellState *p, const char *zTab){
  25004   char **azCol = 0;
  25005   sqlite3_stmt *pStmt;
  25006   char *zSql;
  25007   int nCol = 0;
  25008   int nAlloc = 0;
  25009   int nPK = 0;       /* Number of PRIMARY KEY columns seen */
  25010   int isIPK = 0;     /* True if one PRIMARY KEY column of type INTEGER */
  25011   int preserveRowid = ShellHasFlag(p, SHFLG_PreserveRowid);
  25012   int rc;
  25013 
  25014   zSql = sqlite3_mprintf("PRAGMA table_info=%Q", zTab);
  25015   shell_check_oom(zSql);
  25016   rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
  25017   sqlite3_free(zSql);
  25018   if( rc ) return 0;
  25019   while( sqlite3_step(pStmt)==SQLITE_ROW ){
  25020     if( nCol>=nAlloc-2 ){
  25021       nAlloc = nAlloc*2 + nCol + 10;
  25022       azCol = sqlite3_realloc(azCol, nAlloc*sizeof(azCol[0]));
  25023       shell_check_oom(azCol);
  25024     }
  25025     azCol[++nCol] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 1));
  25026     shell_check_oom(azCol[nCol]);
  25027     if( sqlite3_column_int(pStmt, 5) ){
  25028       nPK++;
  25029       if( nPK==1
  25030        && sqlite3_stricmp((const char*)sqlite3_column_text(pStmt,2),
  25031                           "INTEGER")==0
  25032       ){
  25033         isIPK = 1;
  25034       }else{
  25035         isIPK = 0;
  25036       }
  25037     }
  25038   }
  25039   sqlite3_finalize(pStmt);
  25040   if( azCol==0 ) return 0;
  25041   azCol[0] = 0;
  25042   azCol[nCol+1] = 0;
  25043 
  25044   /* The decision of whether or not a rowid really needs to be preserved
  25045   ** is tricky.  We never need to preserve a rowid for a WITHOUT ROWID table
  25046   ** or a table with an INTEGER PRIMARY KEY.  We are unable to preserve
  25047   ** rowids on tables where the rowid is inaccessible because there are other
  25048   ** columns in the table named "rowid", "_rowid_", and "oid".
  25049   */
  25050   if( preserveRowid && isIPK ){
  25051     /* If a single PRIMARY KEY column with type INTEGER was seen, then it
  25052     ** might be an alias for the ROWID.  But it might also be a WITHOUT ROWID
  25053     ** table or a INTEGER PRIMARY KEY DESC column, neither of which are
  25054     ** ROWID aliases.  To distinguish these cases, check to see if
  25055     ** there is a "pk" entry in "PRAGMA index_list".  There will be
  25056     ** no "pk" index if the PRIMARY KEY really is an alias for the ROWID.
  25057     */
  25058     zSql = sqlite3_mprintf("SELECT 1 FROM pragma_index_list(%Q)"
  25059                            " WHERE origin='pk'", zTab);
  25060     shell_check_oom(zSql);
  25061     rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
  25062     sqlite3_free(zSql);
  25063     if( rc ){
  25064       freeColumnList(azCol);
  25065       return 0;
  25066     }
  25067     rc = sqlite3_step(pStmt);
  25068     sqlite3_finalize(pStmt);
  25069     preserveRowid = rc==SQLITE_ROW;
  25070   }
  25071   if( preserveRowid ){
  25072     /* Only preserve the rowid if we can find a name to use for the
  25073     ** rowid */
  25074     static char *azRowid[] = { "rowid", "_rowid_", "oid" };
  25075     int i, j;
  25076     for(j=0; j<3; j++){
  25077       for(i=1; i<=nCol; i++){
  25078         if( sqlite3_stricmp(azRowid[j],azCol[i])==0 ) break;
  25079       }
  25080       if( i>nCol ){
  25081         /* At this point, we know that azRowid[j] is not the name of any
  25082         ** ordinary column in the table.  Verify that azRowid[j] is a valid
  25083         ** name for the rowid before adding it to azCol[0].  WITHOUT ROWID
  25084         ** tables will fail this last check */
  25085         rc = sqlite3_table_column_metadata(p->db,0,zTab,azRowid[j],0,0,0,0,0);
  25086         if( rc==SQLITE_OK ) azCol[0] = azRowid[j];
  25087         break;
  25088       }
  25089     }
  25090   }
  25091   return azCol;
  25092 }
  25093 
  25094 /*
  25095 ** Toggle the reverse_unordered_selects setting.
  25096 */
  25097 static void toggleSelectOrder(sqlite3 *db){
  25098   sqlite3_stmt *pStmt = 0;
  25099   int iSetting = 0;
  25100   char zStmt[100];
  25101   sqlite3_prepare_v2(db, "PRAGMA reverse_unordered_selects", -1, &pStmt, 0);
  25102   if( sqlite3_step(pStmt)==SQLITE_ROW ){
  25103     iSetting = sqlite3_column_int(pStmt, 0);
  25104   }
  25105   sqlite3_finalize(pStmt);
  25106   sqlite3_snprintf(sizeof(zStmt), zStmt,
  25107        "PRAGMA reverse_unordered_selects(%d)", !iSetting);
  25108   sqlite3_exec(db, zStmt, 0, 0, 0);
  25109 }
  25110 
  25111 /*
  25112 ** This is a different callback routine used for dumping the database.
  25113 ** Each row received by this callback consists of a table name,
  25114 ** the table type ("index" or "table") and SQL to create the table.
  25115 ** This routine should print text sufficient to recreate the table.
  25116 */
  25117 static int dump_callback(void *pArg, int nArg, char **azArg, char **azNotUsed){
  25118   int rc;
  25119   const char *zTable;
  25120   const char *zType;
  25121   const char *zSql;
  25122   ShellState *p = (ShellState *)pArg;
  25123   int dataOnly;
  25124   int noSys;
  25125 
  25126   UNUSED_PARAMETER(azNotUsed);
  25127   if( nArg!=3 || azArg==0 ) return 0;
  25128   zTable = azArg[0];
  25129   zType = azArg[1];
  25130   zSql = azArg[2];
  25131   if( zTable==0 ) return 0;
  25132   if( zType==0 ) return 0;
  25133   dataOnly = (p->shellFlgs & SHFLG_DumpDataOnly)!=0;
  25134   noSys    = (p->shellFlgs & SHFLG_DumpNoSys)!=0;
  25135 
  25136   if( cli_strcmp(zTable, "sqlite_sequence")==0 && !noSys ){
  25137     /* no-op */
  25138   }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 && !noSys ){
  25139     if( !dataOnly ) sqlite3_fputs("ANALYZE sqlite_schema;\n", p->out);
  25140   }else if( cli_strncmp(zTable, "sqlite_", 7)==0 ){
  25141     return 0;
  25142   }else if( dataOnly ){
  25143     /* no-op */
  25144   }else if( cli_strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
  25145     char *zIns;
  25146     if( !p->writableSchema ){
  25147       sqlite3_fputs("PRAGMA writable_schema=ON;\n", p->out);
  25148       p->writableSchema = 1;
  25149     }
  25150     zIns = sqlite3_mprintf(
  25151        "INSERT INTO sqlite_schema(type,name,tbl_name,rootpage,sql)"
  25152        "VALUES('table','%q','%q',0,'%q');",
  25153        zTable, zTable, zSql);
  25154     shell_check_oom(zIns);
  25155     sqlite3_fprintf(p->out, "%s\n", zIns);
  25156     sqlite3_free(zIns);
  25157     return 0;
  25158   }else{
  25159     printSchemaLine(p->out, zSql, ";\n");
  25160   }
  25161 
  25162   if( cli_strcmp(zType, "table")==0 ){
  25163     ShellText sSelect;
  25164     ShellText sTable;
  25165     char **azCol;
  25166     int i;
  25167     char *savedDestTable;
  25168     int savedMode;
  25169 
  25170     azCol = tableColumnList(p, zTable);
  25171     if( azCol==0 ){
  25172       p->nErr++;
  25173       return 0;
  25174     }
  25175 
  25176     /* Always quote the table name, even if it appears to be pure ascii,
  25177     ** in case it is a keyword. Ex:  INSERT INTO "table" ... */
  25178     initText(&sTable);
  25179     appendText(&sTable, zTable, quoteChar(zTable));
  25180     /* If preserving the rowid, add a column list after the table name.
  25181     ** In other words:  "INSERT INTO tab(rowid,a,b,c,...) VALUES(...)"
  25182     ** instead of the usual "INSERT INTO tab VALUES(...)".
  25183     */
  25184     if( azCol[0] ){
  25185       appendText(&sTable, "(", 0);
  25186       appendText(&sTable, azCol[0], 0);
  25187       for(i=1; azCol[i]; i++){
  25188         appendText(&sTable, ",", 0);
  25189         appendText(&sTable, azCol[i], quoteChar(azCol[i]));
  25190       }
  25191       appendText(&sTable, ")", 0);
  25192     }
  25193 
  25194     /* Build an appropriate SELECT statement */
  25195     initText(&sSelect);
  25196     appendText(&sSelect, "SELECT ", 0);
  25197     if( azCol[0] ){
  25198       appendText(&sSelect, azCol[0], 0);
  25199       appendText(&sSelect, ",", 0);
  25200     }
  25201     for(i=1; azCol[i]; i++){
  25202       appendText(&sSelect, azCol[i], quoteChar(azCol[i]));
  25203       if( azCol[i+1] ){
  25204         appendText(&sSelect, ",", 0);
  25205       }
  25206     }
  25207     freeColumnList(azCol);
  25208     appendText(&sSelect, " FROM ", 0);
  25209     appendText(&sSelect, zTable, quoteChar(zTable));
  25210 
  25211     savedDestTable = p->zDestTable;
  25212     savedMode = p->mode;
  25213     p->zDestTable = sTable.z;
  25214     p->mode = p->cMode = MODE_Insert;
  25215     rc = shell_exec(p, sSelect.z, 0);
  25216     if( (rc&0xff)==SQLITE_CORRUPT ){
  25217       sqlite3_fputs("/****** CORRUPTION ERROR *******/\n", p->out);
  25218       toggleSelectOrder(p->db);
  25219       shell_exec(p, sSelect.z, 0);
  25220       toggleSelectOrder(p->db);
  25221     }
  25222     p->zDestTable = savedDestTable;
  25223     p->mode = savedMode;
  25224     freeText(&sTable);
  25225     freeText(&sSelect);
  25226     if( rc ) p->nErr++;
  25227   }
  25228   return 0;
  25229 }
  25230 
  25231 /*
  25232 ** Run zQuery.  Use dump_callback() as the callback routine so that
  25233 ** the contents of the query are output as SQL statements.
  25234 **
  25235 ** If we get a SQLITE_CORRUPT error, rerun the query after appending
  25236 ** "ORDER BY rowid DESC" to the end.
  25237 */
  25238 static int run_schema_dump_query(
  25239   ShellState *p,
  25240   const char *zQuery
  25241 ){
  25242   int rc;
  25243   char *zErr = 0;
  25244   rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
  25245   if( rc==SQLITE_CORRUPT ){
  25246     char *zQ2;
  25247     int len = strlen30(zQuery);
  25248     sqlite3_fputs("/****** CORRUPTION ERROR *******/\n", p->out);
  25249     if( zErr ){
  25250       sqlite3_fprintf(p->out, "/****** %s ******/\n", zErr);
  25251       sqlite3_free(zErr);
  25252       zErr = 0;
  25253     }
  25254     zQ2 = malloc( len+100 );
  25255     if( zQ2==0 ) return rc;
  25256     sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
  25257     rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
  25258     if( rc ){
  25259       sqlite3_fprintf(p->out, "/****** ERROR: %s ******/\n", zErr);
  25260     }else{
  25261       rc = SQLITE_CORRUPT;
  25262     }
  25263     free(zQ2);
  25264   }
  25265   sqlite3_free(zErr);
  25266   return rc;
  25267 }
  25268 
  25269 /*
  25270 ** Text of help messages.
  25271 **
  25272 ** The help text for each individual command begins with a line that starts
  25273 ** with ".".  Subsequent lines are supplemental information.
  25274 **
  25275 ** There must be two or more spaces between the end of the command and the
  25276 ** start of the description of what that command does.
  25277 */
  25278 static const char *(azHelp[]) = {
  25279 #if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE) \
  25280   && !defined(SQLITE_SHELL_FIDDLE)
  25281   ".archive ...             Manage SQL archives",
  25282   "   Each command must have exactly one of the following options:",
  25283   "     -c, --create               Create a new archive",
  25284   "     -u, --update               Add or update files with changed mtime",
  25285   "     -i, --insert               Like -u but always add even if unchanged",
  25286   "     -r, --remove               Remove files from archive",
  25287   "     -t, --list                 List contents of archive",
  25288   "     -x, --extract              Extract files from archive",
  25289   "   Optional arguments:",
  25290   "     -v, --verbose              Print each filename as it is processed",
  25291   "     -f FILE, --file FILE       Use archive FILE (default is current db)",
  25292   "     -a FILE, --append FILE     Open FILE using the apndvfs VFS",
  25293   "     -C DIR, --directory DIR    Read/extract files from directory DIR",
  25294   "     -g, --glob                 Use glob matching for names in archive",
  25295   "     -n, --dryrun               Show the SQL that would have occurred",
  25296   "   Examples:",
  25297   "     .ar -cf ARCHIVE foo bar  # Create ARCHIVE from files foo and bar",
  25298   "     .ar -tf ARCHIVE          # List members of ARCHIVE",
  25299   "     .ar -xvf ARCHIVE         # Verbosely extract files from ARCHIVE",
  25300   "   See also:",
  25301   "      http://sqlite.org/cli.html#sqlite_archive_support",
  25302 #endif
  25303 #ifndef SQLITE_OMIT_AUTHORIZATION
  25304   ".auth ON|OFF             Show authorizer callbacks",
  25305 #endif
  25306 #ifndef SQLITE_SHELL_FIDDLE
  25307   ".backup ?DB? FILE        Backup DB (default \"main\") to FILE",
  25308   "   Options:",
  25309   "       --append            Use the appendvfs",
  25310   "       --async             Write to FILE without journal and fsync()",
  25311 #endif
  25312   ".bail on|off             Stop after hitting an error.  Default OFF",
  25313 #ifndef SQLITE_SHELL_FIDDLE
  25314   ".cd DIRECTORY            Change the working directory to DIRECTORY",
  25315 #endif
  25316   ".changes on|off          Show number of rows changed by SQL",
  25317 #ifndef SQLITE_SHELL_FIDDLE
  25318   ".check GLOB              Fail if output since .testcase does not match",
  25319   ".clone NEWDB             Clone data into NEWDB from the existing database",
  25320 #endif
  25321   ".connection [close] [#]  Open or close an auxiliary database connection",
  25322   ".crlf ?on|off?           Whether or not to use \\r\\n line endings",
  25323   ".databases               List names and files of attached databases",
  25324   ".dbconfig ?op? ?val?     List or change sqlite3_db_config() options",
  25325 #if SQLITE_SHELL_HAVE_RECOVER
  25326   ".dbinfo ?DB?             Show status information about the database",
  25327 #endif
  25328   ".dbtotxt                 Hex dump of the database file",
  25329   ".dump ?OBJECTS?          Render database content as SQL",
  25330   "   Options:",
  25331   "     --data-only            Output only INSERT statements",
  25332   "     --newlines             Allow unescaped newline characters in output",
  25333   "     --nosys                Omit system tables (ex: \"sqlite_stat1\")",
  25334   "     --preserve-rowids      Include ROWID values in the output",
  25335   "   OBJECTS is a LIKE pattern for tables, indexes, triggers or views to dump",
  25336   "   Additional LIKE patterns can be given in subsequent arguments",
  25337   ".echo on|off             Turn command echo on or off",
  25338   ".eqp on|off|full|...     Enable or disable automatic EXPLAIN QUERY PLAN",
  25339   "   Other Modes:",
  25340 #ifdef SQLITE_DEBUG
  25341   "      test                  Show raw EXPLAIN QUERY PLAN output",
  25342   "      trace                 Like \"full\" but enable \"PRAGMA vdbe_trace\"",
  25343 #endif
  25344   "      trigger               Like \"full\" but also show trigger bytecode",
  25345 #ifndef SQLITE_SHELL_FIDDLE
  25346   ".excel                   Display the output of next command in spreadsheet",
  25347   "   --bom                   Put a UTF8 byte-order mark on intermediate file",
  25348 #endif
  25349 #ifndef SQLITE_SHELL_FIDDLE
  25350   ".exit ?CODE?             Exit this program with return-code CODE",
  25351 #endif
  25352   ".expert                  EXPERIMENTAL. Suggest indexes for queries",
  25353   ".explain ?on|off|auto?   Change the EXPLAIN formatting mode.  Default: auto",
  25354   ".filectrl CMD ...        Run various sqlite3_file_control() operations",
  25355   "   --schema SCHEMA         Use SCHEMA instead of \"main\"",
  25356   "   --help                  Show CMD details",
  25357   ".fullschema ?--indent?   Show schema and the content of sqlite_stat tables",
  25358   ".headers on|off          Turn display of headers on or off",
  25359   ".help ?-all? ?PATTERN?   Show help text for PATTERN",
  25360 #ifndef SQLITE_SHELL_FIDDLE
  25361   ".import FILE TABLE       Import data from FILE into TABLE",
  25362   "   Options:",
  25363   "     --ascii               Use \\037 and \\036 as column and row separators",
  25364   "     --csv                 Use , and \\n as column and row separators",
  25365   "     --skip N              Skip the first N rows of input",
  25366   "     --schema S            Target table to be S.TABLE",
  25367   "     -v                    \"Verbose\" - increase auxiliary output",
  25368   "   Notes:",
  25369   "     *  If TABLE does not exist, it is created.  The first row of input",
  25370   "        determines the column names.",
  25371   "     *  If neither --csv or --ascii are used, the input mode is derived",
  25372   "        from the \".mode\" output mode",
  25373   "     *  If FILE begins with \"|\" then it is a command that generates the",
  25374   "        input text.",
  25375 #endif
  25376 #ifndef SQLITE_OMIT_TEST_CONTROL
  25377   ",imposter INDEX TABLE    Create imposter table TABLE on index INDEX",
  25378 #endif
  25379   ".indexes ?TABLE?         Show names of indexes",
  25380   "                           If TABLE is specified, only show indexes for",
  25381   "                           tables matching TABLE using the LIKE operator.",
  25382   ".intck ?STEPS_PER_UNLOCK?  Run an incremental integrity check on the db",
  25383 #ifdef SQLITE_ENABLE_IOTRACE
  25384   ",iotrace FILE            Enable I/O diagnostic logging to FILE",
  25385 #endif
  25386   ".limit ?LIMIT? ?VAL?     Display or change the value of an SQLITE_LIMIT",
  25387   ".lint OPTIONS            Report potential schema issues.",
  25388   "     Options:",
  25389   "        fkey-indexes     Find missing foreign key indexes",
  25390 #if !defined(SQLITE_OMIT_LOAD_EXTENSION) && !defined(SQLITE_SHELL_FIDDLE)
  25391   ".load FILE ?ENTRY?       Load an extension library",
  25392 #endif
  25393 #if !defined(SQLITE_SHELL_FIDDLE)
  25394   ".log FILE|on|off         Turn logging on or off.  FILE can be stderr/stdout",
  25395 #else
  25396   ".log on|off              Turn logging on or off.",
  25397 #endif
  25398   ".mode ?MODE? ?OPTIONS?   Set output mode",
  25399   "   MODE is one of:",
  25400   "     ascii       Columns/rows delimited by 0x1F and 0x1E",
  25401   "     box         Tables using unicode box-drawing characters",
  25402   "     csv         Comma-separated values",
  25403   "     column      Output in columns.  (See .width)",
  25404   "     html        HTML <table> code",
  25405   "     insert      SQL insert statements for TABLE",
  25406   "     json        Results in a JSON array",
  25407   "     line        One value per line",
  25408   "     list        Values delimited by \"|\"",
  25409   "     markdown    Markdown table format",
  25410   "     qbox        Shorthand for \"box --wrap 60 --quote\"",
  25411   "     quote       Escape answers as for SQL",
  25412   "     table       ASCII-art table",
  25413   "     tabs        Tab-separated values",
  25414   "     tcl         TCL list elements",
  25415   "   OPTIONS: (for columnar modes or insert mode):",
  25416   "     --escape T     ctrl-char escape; T is one of: symbol, ascii, off",
  25417   "     --wrap N       Wrap output lines to no longer than N characters",
  25418   "     --wordwrap B   Wrap or not at word boundaries per B (on/off)",
  25419   "     --ww           Shorthand for \"--wordwrap 1\"",
  25420   "     --quote        Quote output text as SQL literals",
  25421   "     --noquote      Do not quote output text",
  25422   "     TABLE          The name of SQL table used for \"insert\" mode",
  25423 #ifndef SQLITE_SHELL_FIDDLE
  25424   ".nonce STRING            Suspend safe mode for one command if nonce matches",
  25425 #endif
  25426   ".nullvalue STRING        Use STRING in place of NULL values",
  25427 #ifndef SQLITE_SHELL_FIDDLE
  25428   ".once ?OPTIONS? ?FILE?   Output for the next SQL command only to FILE",
  25429   "     If FILE begins with '|' then open as a pipe",
  25430   "       --bom    Put a UTF8 byte-order mark at the beginning",
  25431   "       -e       Send output to the system text editor",
  25432   "       --plain  Use text/plain output instead of HTML for -w option",
  25433   "       -w       Send output as HTML to a web browser (same as \".www\")",
  25434   "       -x       Send output as CSV to a spreadsheet (same as \".excel\")",
  25435   /* Note that .open is (partially) available in WASM builds but is
  25436   ** currently only intended to be used by the fiddle tool, not
  25437   ** end users, so is "undocumented." */
  25438   ".open ?OPTIONS? ?FILE?   Close existing database and reopen FILE",
  25439   "     Options:",
  25440   "        --append        Use appendvfs to append database to the end of FILE",
  25441 #endif
  25442 #ifndef SQLITE_OMIT_DESERIALIZE
  25443   "        --deserialize   Load into memory using sqlite3_deserialize()",
  25444   "        --hexdb         Load the output of \"dbtotxt\" as an in-memory db",
  25445   "        --maxsize N     Maximum size for --hexdb or --deserialized database",
  25446 #endif
  25447   "        --new           Initialize FILE to an empty database",
  25448   "        --nofollow      Do not follow symbolic links",
  25449   "        --readonly      Open FILE readonly",
  25450   "        --zip           FILE is a ZIP archive",
  25451 #ifndef SQLITE_SHELL_FIDDLE
  25452   ".output ?FILE?           Send output to FILE or stdout if FILE is omitted",
  25453   "   If FILE begins with '|' then open it as a pipe.",
  25454   "   If FILE is 'off' then output is disabled.",
  25455   "   Options:",
  25456   "     --bom                 Prefix output with a UTF8 byte-order mark",
  25457   "     -e                    Send output to the system text editor",
  25458   "     --plain               Use text/plain for -w option",
  25459   "     -w                    Send output to a web browser",
  25460   "     -x                    Send output as CSV to a spreadsheet",
  25461 #endif
  25462   ".parameter CMD ...       Manage SQL parameter bindings",
  25463   "   clear                   Erase all bindings",
  25464   "   init                    Initialize the TEMP table that holds bindings",
  25465   "   list                    List the current parameter bindings",
  25466   "   set PARAMETER VALUE     Given SQL parameter PARAMETER a value of VALUE",
  25467   "                           PARAMETER should start with one of: $ : @ ?",
  25468   "   unset PARAMETER         Remove PARAMETER from the binding table",
  25469   ".print STRING...         Print literal STRING",
  25470 #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
  25471   ".progress N              Invoke progress handler after every N opcodes",
  25472   "   --limit N                 Interrupt after N progress callbacks",
  25473   "   --once                    Do no more than one progress interrupt",
  25474   "   --quiet|-q                No output except at interrupts",
  25475   "   --reset                   Reset the count for each input and interrupt",
  25476 #endif
  25477   ".prompt MAIN CONTINUE    Replace the standard prompts",
  25478 #ifndef SQLITE_SHELL_FIDDLE
  25479   ".quit                    Stop interpreting input stream, exit if primary.",
  25480   ".read FILE               Read input from FILE or command output",
  25481   "    If FILE begins with \"|\", it is a command that generates the input.",
  25482 #endif
  25483 #if SQLITE_SHELL_HAVE_RECOVER
  25484   ".recover                 Recover as much data as possible from corrupt db.",
  25485   "   --ignore-freelist        Ignore pages that appear to be on db freelist",
  25486   "   --lost-and-found TABLE   Alternative name for the lost-and-found table",
  25487   "   --no-rowids              Do not attempt to recover rowid values",
  25488   "                            that are not also INTEGER PRIMARY KEYs",
  25489 #endif
  25490 #ifndef SQLITE_SHELL_FIDDLE
  25491   ".restore ?DB? FILE       Restore content of DB (default \"main\") from FILE",
  25492   ".save ?OPTIONS? FILE     Write database to FILE (an alias for .backup ...)",
  25493 #endif
  25494   ".scanstats on|off|est    Turn sqlite3_stmt_scanstatus() metrics on or off",
  25495   ".schema ?PATTERN?        Show the CREATE statements matching PATTERN",
  25496   "   Options:",
  25497   "      --indent             Try to pretty-print the schema",
  25498   "      --nosys              Omit objects whose names start with \"sqlite_\"",
  25499   ",selftest ?OPTIONS?      Run tests defined in the SELFTEST table",
  25500   "    Options:",
  25501   "       --init               Create a new SELFTEST table",
  25502   "       -v                   Verbose output",
  25503   ".separator COL ?ROW?     Change the column and row separators",
  25504 #if defined(SQLITE_ENABLE_SESSION)
  25505   ".session ?NAME? CMD ...  Create or control sessions",
  25506   "   Subcommands:",
  25507   "     attach TABLE             Attach TABLE",
  25508   "     changeset FILE           Write a changeset into FILE",
  25509   "     close                    Close one session",
  25510   "     enable ?BOOLEAN?         Set or query the enable bit",
  25511   "     filter GLOB...           Reject tables matching GLOBs",
  25512   "     indirect ?BOOLEAN?       Mark or query the indirect status",
  25513   "     isempty                  Query whether the session is empty",
  25514   "     list                     List currently open session names",
  25515   "     open DB NAME             Open a new session on DB",
  25516   "     patchset FILE            Write a patchset into FILE",
  25517   "   If ?NAME? is omitted, the first defined session is used.",
  25518 #endif
  25519   ".sha3sum ...             Compute a SHA3 hash of database content",
  25520   "    Options:",
  25521   "      --schema              Also hash the sqlite_schema table",
  25522   "      --sha3-224            Use the sha3-224 algorithm",
  25523   "      --sha3-256            Use the sha3-256 algorithm (default)",
  25524   "      --sha3-384            Use the sha3-384 algorithm",
  25525   "      --sha3-512            Use the sha3-512 algorithm",
  25526   "    Any other argument is a LIKE pattern for tables to hash",
  25527 #if !defined(SQLITE_NOHAVE_SYSTEM) && !defined(SQLITE_SHELL_FIDDLE)
  25528   ".shell CMD ARGS...       Run CMD ARGS... in a system shell",
  25529 #endif
  25530   ".show                    Show the current values for various settings",
  25531   ".stats ?ARG?             Show stats or turn stats on or off",
  25532   "   off                      Turn off automatic stat display",
  25533   "   on                       Turn on automatic stat display",
  25534   "   stmt                     Show statement stats",
  25535   "   vmstep                   Show the virtual machine step count only",
  25536 #if !defined(SQLITE_NOHAVE_SYSTEM) && !defined(SQLITE_SHELL_FIDDLE)
  25537   ".system CMD ARGS...      Run CMD ARGS... in a system shell",
  25538 #endif
  25539   ".tables ?TABLE?          List names of tables matching LIKE pattern TABLE",
  25540 #ifndef SQLITE_SHELL_FIDDLE
  25541   ",testcase NAME           Begin redirecting output to 'testcase-out.txt'",
  25542 #endif
  25543   ",testctrl CMD ...        Run various sqlite3_test_control() operations",
  25544   "                           Run \".testctrl\" with no arguments for details",
  25545   ".timeout MS              Try opening locked tables for MS milliseconds",
  25546   ".timer on|off            Turn SQL timer on or off",
  25547 #ifndef SQLITE_OMIT_TRACE
  25548   ".trace ?OPTIONS?         Output each SQL statement as it is run",
  25549   "    FILE                    Send output to FILE",
  25550   "    stdout                  Send output to stdout",
  25551   "    stderr                  Send output to stderr",
  25552   "    off                     Disable tracing",
  25553   "    --expanded              Expand query parameters",
  25554 #ifdef SQLITE_ENABLE_NORMALIZE
  25555   "    --normalized            Normal the SQL statements",
  25556 #endif
  25557   "    --plain                 Show SQL as it is input",
  25558   "    --stmt                  Trace statement execution (SQLITE_TRACE_STMT)",
  25559   "    --profile               Profile statements (SQLITE_TRACE_PROFILE)",
  25560   "    --row                   Trace each row (SQLITE_TRACE_ROW)",
  25561   "    --close                 Trace connection close (SQLITE_TRACE_CLOSE)",
  25562 #endif /* SQLITE_OMIT_TRACE */
  25563 #ifdef SQLITE_DEBUG
  25564   ".unmodule NAME ...       Unregister virtual table modules",
  25565   "    --allexcept             Unregister everything except those named",
  25566 #endif
  25567   ".version                 Show source, library and compiler versions",
  25568   ".vfsinfo ?AUX?           Information about the top-level VFS",
  25569   ".vfslist                 List all available VFSes",
  25570   ".vfsname ?AUX?           Print the name of the VFS stack",
  25571   ".width NUM1 NUM2 ...     Set minimum column widths for columnar output",
  25572   "     Negative values right-justify",
  25573 #ifndef SQLITE_SHELL_FIDDLE
  25574   ".www                     Display output of the next command in web browser",
  25575   "    --plain                 Show results as text/plain, not as HTML",
  25576 #endif
  25577 };
  25578 
  25579 /*
  25580 ** Output help text for commands that match zPattern.
  25581 **
  25582 **    *   If zPattern is NULL, then show all documented commands, but
  25583 **        only give a one-line summary of each.
  25584 **
  25585 **    *   If zPattern is "-a" or "-all" or "--all" then show all help text
  25586 **        for all commands except undocumented commands.
  25587 **
  25588 **    *   If zPattern is "0" then show all help for undocumented commands.
  25589 **        Undocumented commands begin with "," instead of "." in the azHelp[]
  25590 **        array.
  25591 **
  25592 **    *   If zPattern is a prefix for one or more documented commands, then
  25593 **        show help for those commands.  If only a single command matches the
  25594 **        prefix, show the full text of the help.  If multiple commands match,
  25595 **        Only show just the first line of each.
  25596 **
  25597 **    *   Otherwise, show the complete text of any documented command for which
  25598 **        zPattern is a LIKE match for any text within that command help
  25599 **        text.
  25600 **
  25601 ** Return the number commands that match zPattern.
  25602 */
  25603 static int showHelp(FILE *out, const char *zPattern){
  25604   int i = 0;
  25605   int j = 0;
  25606   int n = 0;
  25607   char *zPat;
  25608   if( zPattern==0 ){
  25609     /* Show just the first line for all help topics */
  25610     zPattern = "[a-z]";
  25611   }else if( cli_strcmp(zPattern,"-a")==0
  25612          || cli_strcmp(zPattern,"-all")==0
  25613          || cli_strcmp(zPattern,"--all")==0
  25614   ){
  25615     /* Show everything except undocumented commands */
  25616     zPattern = ".";
  25617   }else if( cli_strcmp(zPattern,"0")==0 ){
  25618     /* Show complete help text of undocumented commands */
  25619     int show = 0;
  25620     for(i=0; i<ArraySize(azHelp); i++){
  25621       if( azHelp[i][0]=='.' ){
  25622         show = 0;
  25623       }else if( azHelp[i][0]==',' ){
  25624         show = 1;
  25625         sqlite3_fprintf(out, ".%s\n", &azHelp[i][1]);
  25626         n++;
  25627       }else if( show ){
  25628         sqlite3_fprintf(out, "%s\n", azHelp[i]);
  25629       }
  25630     }
  25631     return n;
  25632   }
  25633 
  25634   /* Seek documented commands for which zPattern is an exact prefix */
  25635   zPat = sqlite3_mprintf(".%s*", zPattern);
  25636   shell_check_oom(zPat);
  25637   for(i=0; i<ArraySize(azHelp); i++){
  25638     if( sqlite3_strglob(zPat, azHelp[i])==0 ){
  25639       sqlite3_fprintf(out, "%s\n", azHelp[i]);
  25640       j = i+1;
  25641       n++;
  25642     }
  25643   }
  25644   sqlite3_free(zPat);
  25645   if( n ){
  25646     if( n==1 ){
  25647       /* when zPattern is a prefix of exactly one command, then include
  25648       ** the details of that command, which should begin at offset j */
  25649       while( j<ArraySize(azHelp)-1 && azHelp[j][0]==' ' ){
  25650         sqlite3_fprintf(out, "%s\n", azHelp[j]);
  25651         j++;
  25652       }
  25653     }
  25654     return n;
  25655   }
  25656 
  25657   /* Look for documented commands that contain zPattern anywhere.
  25658   ** Show complete text of all documented commands that match. */
  25659   zPat = sqlite3_mprintf("%%%s%%", zPattern);
  25660   shell_check_oom(zPat);
  25661   for(i=0; i<ArraySize(azHelp); i++){
  25662     if( azHelp[i][0]==',' ){
  25663       while( i<ArraySize(azHelp)-1 && azHelp[i+1][0]==' ' ) ++i;
  25664       continue;
  25665     }
  25666     if( azHelp[i][0]=='.' ) j = i;
  25667     if( sqlite3_strlike(zPat, azHelp[i], 0)==0 ){
  25668       sqlite3_fprintf(out, "%s\n", azHelp[j]);
  25669       while( j<ArraySize(azHelp)-1 && azHelp[j+1][0]==' ' ){
  25670         j++;
  25671         sqlite3_fprintf(out, "%s\n", azHelp[j]);
  25672       }
  25673       i = j;
  25674       n++;
  25675     }
  25676   }
  25677   sqlite3_free(zPat);
  25678   return n;
  25679 }
  25680 
  25681 /* Forward reference */
  25682 static int process_input(ShellState *p);
  25683 
  25684 /*
  25685 ** Read the content of file zName into memory obtained from sqlite3_malloc64()
  25686 ** and return a pointer to the buffer. The caller is responsible for freeing
  25687 ** the memory.
  25688 **
  25689 ** If parameter pnByte is not NULL, (*pnByte) is set to the number of bytes
  25690 ** read.
  25691 **
  25692 ** For convenience, a nul-terminator byte is always appended to the data read
  25693 ** from the file before the buffer is returned. This byte is not included in
  25694 ** the final value of (*pnByte), if applicable.
  25695 **
  25696 ** NULL is returned if any error is encountered. The final value of *pnByte
  25697 ** is undefined in this case.
  25698 */
  25699 static char *readFile(const char *zName, int *pnByte){
  25700   FILE *in = sqlite3_fopen(zName, "rb");
  25701   long nIn;
  25702   size_t nRead;
  25703   char *pBuf;
  25704   int rc;
  25705   if( in==0 ) return 0;
  25706   rc = fseek(in, 0, SEEK_END);
  25707   if( rc!=0 ){
  25708     sqlite3_fprintf(stderr,"Error: '%s' not seekable\n", zName);
  25709     fclose(in);
  25710     return 0;
  25711   }
  25712   nIn = ftell(in);
  25713   rewind(in);
  25714   pBuf = sqlite3_malloc64( nIn+1 );
  25715   if( pBuf==0 ){
  25716     sqlite3_fputs("Error: out of memory\n", stderr);
  25717     fclose(in);
  25718     return 0;
  25719   }
  25720   nRead = fread(pBuf, nIn, 1, in);
  25721   fclose(in);
  25722   if( nRead!=1 ){
  25723     sqlite3_free(pBuf);
  25724     sqlite3_fprintf(stderr,"Error: cannot read '%s'\n", zName);
  25725     return 0;
  25726   }
  25727   pBuf[nIn] = 0;
  25728   if( pnByte ) *pnByte = nIn;
  25729   return pBuf;
  25730 }
  25731 
  25732 #if defined(SQLITE_ENABLE_SESSION)
  25733 /*
  25734 ** Close a single OpenSession object and release all of its associated
  25735 ** resources.
  25736 */
  25737 static void session_close(OpenSession *pSession){
  25738   int i;
  25739   sqlite3session_delete(pSession->p);
  25740   sqlite3_free(pSession->zName);
  25741   for(i=0; i<pSession->nFilter; i++){
  25742     sqlite3_free(pSession->azFilter[i]);
  25743   }
  25744   sqlite3_free(pSession->azFilter);
  25745   memset(pSession, 0, sizeof(OpenSession));
  25746 }
  25747 #endif
  25748 
  25749 /*
  25750 ** Close all OpenSession objects and release all associated resources.
  25751 */
  25752 #if defined(SQLITE_ENABLE_SESSION)
  25753 static void session_close_all(ShellState *p, int i){
  25754   int j;
  25755   struct AuxDb *pAuxDb = i<0 ? p->pAuxDb : &p->aAuxDb[i];
  25756   for(j=0; j<pAuxDb->nSession; j++){
  25757     session_close(&pAuxDb->aSession[j]);
  25758   }
  25759   pAuxDb->nSession = 0;
  25760 }
  25761 #else
  25762 # define session_close_all(X,Y)
  25763 #endif
  25764 
  25765 /*
  25766 ** Implementation of the xFilter function for an open session.  Omit
  25767 ** any tables named by ".session filter" but let all other table through.
  25768 */
  25769 #if defined(SQLITE_ENABLE_SESSION)
  25770 static int session_filter(void *pCtx, const char *zTab){
  25771   OpenSession *pSession = (OpenSession*)pCtx;
  25772   int i;
  25773   for(i=0; i<pSession->nFilter; i++){
  25774     if( sqlite3_strglob(pSession->azFilter[i], zTab)==0 ) return 0;
  25775   }
  25776   return 1;
  25777 }
  25778 #endif
  25779 
  25780 /*
  25781 ** Try to deduce the type of file for zName based on its content.  Return
  25782 ** one of the SHELL_OPEN_* constants.
  25783 **
  25784 ** If the file does not exist or is empty but its name looks like a ZIP
  25785 ** archive and the dfltZip flag is true, then assume it is a ZIP archive.
  25786 ** Otherwise, assume an ordinary database regardless of the filename if
  25787 ** the type cannot be determined from content.
  25788 */
  25789 int deduceDatabaseType(const char *zName, int dfltZip){
  25790   FILE *f = sqlite3_fopen(zName, "rb");
  25791   size_t n;
  25792   int rc = SHELL_OPEN_UNSPEC;
  25793   char zBuf[100];
  25794   if( f==0 ){
  25795     if( dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){
  25796        return SHELL_OPEN_ZIPFILE;
  25797     }else{
  25798        return SHELL_OPEN_NORMAL;
  25799     }
  25800   }
  25801   n = fread(zBuf, 16, 1, f);
  25802   if( n==1 && memcmp(zBuf, "SQLite format 3", 16)==0 ){
  25803     fclose(f);
  25804     return SHELL_OPEN_NORMAL;
  25805   }
  25806   fseek(f, -25, SEEK_END);
  25807   n = fread(zBuf, 25, 1, f);
  25808   if( n==1 && memcmp(zBuf, "Start-Of-SQLite3-", 17)==0 ){
  25809     rc = SHELL_OPEN_APPENDVFS;
  25810   }else{
  25811     fseek(f, -22, SEEK_END);
  25812     n = fread(zBuf, 22, 1, f);
  25813     if( n==1 && zBuf[0]==0x50 && zBuf[1]==0x4b && zBuf[2]==0x05
  25814        && zBuf[3]==0x06 ){
  25815       rc = SHELL_OPEN_ZIPFILE;
  25816     }else if( n==0 && dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){
  25817       rc = SHELL_OPEN_ZIPFILE;
  25818     }
  25819   }
  25820   fclose(f);
  25821   return rc;
  25822 }
  25823 
  25824 #ifndef SQLITE_OMIT_DESERIALIZE
  25825 /*
  25826 ** Reconstruct an in-memory database using the output from the "dbtotxt"
  25827 ** program.  Read content from the file in p->aAuxDb[].zDbFilename.
  25828 ** If p->aAuxDb[].zDbFilename is 0, then read from standard input.
  25829 */
  25830 static unsigned char *readHexDb(ShellState *p, int *pnData){
  25831   unsigned char *a = 0;
  25832   int nLine;
  25833   int n = 0;
  25834   int pgsz = 0;
  25835   int iOffset = 0;
  25836   int j, k;
  25837   int rc;
  25838   FILE *in;
  25839   const char *zDbFilename = p->pAuxDb->zDbFilename;
  25840   unsigned int x[16];
  25841   char zLine[1000];
  25842   if( zDbFilename ){
  25843     in = sqlite3_fopen(zDbFilename, "r");
  25844     if( in==0 ){
  25845       sqlite3_fprintf(stderr,"cannot open \"%s\" for reading\n", zDbFilename);
  25846       return 0;
  25847     }
  25848     nLine = 0;
  25849   }else{
  25850     in = p->in;
  25851     nLine = p->lineno;
  25852     if( in==0 ) in = stdin;
  25853   }
  25854   *pnData = 0;
  25855   nLine++;
  25856   if( sqlite3_fgets(zLine, sizeof(zLine), in)==0 ) goto readHexDb_error;
  25857   rc = sscanf(zLine, "| size %d pagesize %d", &n, &pgsz);
  25858   if( rc!=2 ) goto readHexDb_error;
  25859   if( n<0 ) goto readHexDb_error;
  25860   if( pgsz<512 || pgsz>65536 || (pgsz&(pgsz-1))!=0 ) goto readHexDb_error;
  25861   n = (n+pgsz-1)&~(pgsz-1);  /* Round n up to the next multiple of pgsz */
  25862   a = sqlite3_malloc( n ? n : 1 );
  25863   shell_check_oom(a);
  25864   memset(a, 0, n);
  25865   if( pgsz<512 || pgsz>65536 || (pgsz & (pgsz-1))!=0 ){
  25866     sqlite3_fputs("invalid pagesize\n", stderr);
  25867     goto readHexDb_error;
  25868   }
  25869   for(nLine++; sqlite3_fgets(zLine, sizeof(zLine), in)!=0; nLine++){
  25870     rc = sscanf(zLine, "| page %d offset %d", &j, &k);
  25871     if( rc==2 ){
  25872       iOffset = k;
  25873       continue;
  25874     }
  25875     if( cli_strncmp(zLine, "| end ", 6)==0 ){
  25876       break;
  25877     }
  25878     rc = sscanf(zLine,"| %d: %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x",
  25879                 &j, &x[0], &x[1], &x[2], &x[3], &x[4], &x[5], &x[6], &x[7],
  25880                 &x[8], &x[9], &x[10], &x[11], &x[12], &x[13], &x[14], &x[15]);
  25881     if( rc==17 ){
  25882       k = iOffset+j;
  25883       if( k+16<=n && k>=0 ){
  25884         int ii;
  25885         for(ii=0; ii<16; ii++) a[k+ii] = x[ii]&0xff;
  25886       }
  25887     }
  25888   }
  25889   *pnData = n;
  25890   if( in!=p->in ){
  25891     fclose(in);
  25892   }else{
  25893     p->lineno = nLine;
  25894   }
  25895   return a;
  25896 
  25897 readHexDb_error:
  25898   if( in!=p->in ){
  25899     fclose(in);
  25900   }else{
  25901     while( sqlite3_fgets(zLine, sizeof(zLine), p->in)!=0 ){
  25902       nLine++;
  25903       if(cli_strncmp(zLine, "| end ", 6)==0 ) break;
  25904     }
  25905     p->lineno = nLine;
  25906   }
  25907   sqlite3_free(a);
  25908   sqlite3_fprintf(stderr,"Error on line %d of --hexdb input\n", nLine);
  25909   return 0;
  25910 }
  25911 #endif /* SQLITE_OMIT_DESERIALIZE */
  25912 
  25913 /*
  25914 ** Scalar function "usleep(X)" invokes sqlite3_sleep(X) and returns X.
  25915 */
  25916 static void shellUSleepFunc(
  25917   sqlite3_context *context,
  25918   int argcUnused,
  25919   sqlite3_value **argv
  25920 ){
  25921   int sleep = sqlite3_value_int(argv[0]);
  25922   (void)argcUnused;
  25923   sqlite3_sleep(sleep/1000);
  25924   sqlite3_result_int(context, sleep);
  25925 }
  25926 
  25927 /*
  25928 ** SQL function:  shell_module_schema(X)
  25929 **
  25930 ** Return a fake schema for the table-valued function or eponymous virtual
  25931 ** table X.
  25932 */
  25933 static void shellModuleSchema(
  25934   sqlite3_context *pCtx,
  25935   int nVal,
  25936   sqlite3_value **apVal
  25937 ){
  25938   const char *zName;
  25939   char *zFake;
  25940   ShellState *p = (ShellState*)sqlite3_user_data(pCtx);
  25941   FILE *pSavedLog = p->pLog;
  25942   UNUSED_PARAMETER(nVal);
  25943   zName = (const char*)sqlite3_value_text(apVal[0]);
  25944 
  25945   /* Temporarily disable the ".log" when calling shellFakeSchema() because
  25946   ** shellFakeSchema() might generate failures for some ephemeral virtual
  25947   ** tables due to missing arguments.  Example: fts4aux.
  25948   ** https://sqlite.org/forum/forumpost/42fe6520b803be51 */
  25949   p->pLog = 0;
  25950   zFake = zName? shellFakeSchema(sqlite3_context_db_handle(pCtx), 0, zName) : 0;
  25951   p->pLog = pSavedLog;
  25952 
  25953   if( zFake ){
  25954     sqlite3_result_text(pCtx, sqlite3_mprintf("/* %s */", zFake),
  25955                         -1, sqlite3_free);
  25956     free(zFake);
  25957   }
  25958 }
  25959 
  25960 /* Flags for open_db().
  25961 **
  25962 ** The default behavior of open_db() is to exit(1) if the database fails to
  25963 ** open.  The OPEN_DB_KEEPALIVE flag changes that so that it prints an error
  25964 ** but still returns without calling exit.
  25965 **
  25966 ** The OPEN_DB_ZIPFILE flag causes open_db() to prefer to open files as a
  25967 ** ZIP archive if the file does not exist or is empty and its name matches
  25968 ** the *.zip pattern.
  25969 */
  25970 #define OPEN_DB_KEEPALIVE   0x001   /* Return after error if true */
  25971 #define OPEN_DB_ZIPFILE     0x002   /* Open as ZIP if name matches *.zip */
  25972 
  25973 /*
  25974 ** Make sure the database is open.  If it is not, then open it.  If
  25975 ** the database fails to open, print an error message and exit.
  25976 */
  25977 static void open_db(ShellState *p, int openFlags){
  25978   if( p->db==0 ){
  25979     const char *zDbFilename = p->pAuxDb->zDbFilename;
  25980     if( p->openMode==SHELL_OPEN_UNSPEC ){
  25981       if( zDbFilename==0 || zDbFilename[0]==0 ){
  25982         p->openMode = SHELL_OPEN_NORMAL;
  25983       }else{
  25984         p->openMode = (u8)deduceDatabaseType(zDbFilename,
  25985                              (openFlags & OPEN_DB_ZIPFILE)!=0);
  25986       }
  25987     }
  25988     switch( p->openMode ){
  25989       case SHELL_OPEN_APPENDVFS: {
  25990         sqlite3_open_v2(zDbFilename, &p->db,
  25991            SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, "apndvfs");
  25992         break;
  25993       }
  25994       case SHELL_OPEN_HEXDB:
  25995       case SHELL_OPEN_DESERIALIZE: {
  25996         sqlite3_open(0, &p->db);
  25997         break;
  25998       }
  25999       case SHELL_OPEN_ZIPFILE: {
  26000         sqlite3_open(":memory:", &p->db);
  26001         break;
  26002       }
  26003       case SHELL_OPEN_READONLY: {
  26004         sqlite3_open_v2(zDbFilename, &p->db,
  26005             SQLITE_OPEN_READONLY|p->openFlags, 0);
  26006         break;
  26007       }
  26008       case SHELL_OPEN_UNSPEC:
  26009       case SHELL_OPEN_NORMAL: {
  26010         sqlite3_open_v2(zDbFilename, &p->db,
  26011            SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, 0);
  26012         break;
  26013       }
  26014     }
  26015     if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){
  26016       sqlite3_fprintf(stderr,"Error: unable to open database \"%s\": %s\n",
  26017             zDbFilename, sqlite3_errmsg(p->db));
  26018       if( (openFlags & OPEN_DB_KEEPALIVE)==0 ){
  26019         exit(1);
  26020       }
  26021       sqlite3_close(p->db);
  26022       sqlite3_open(":memory:", &p->db);
  26023       if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){
  26024         sqlite3_fputs("Also: unable to open substitute in-memory database.\n",
  26025                       stderr);
  26026         exit(1);
  26027       }else{
  26028         sqlite3_fprintf(stderr,
  26029               "Notice: using substitute in-memory database instead of \"%s\"\n",
  26030               zDbFilename);
  26031       }
  26032     }
  26033     globalDb = p->db;
  26034     sqlite3_db_config(p->db, SQLITE_DBCONFIG_STMT_SCANSTATUS, (int)0, (int*)0);
  26035 
  26036     /* Reflect the use or absence of --unsafe-testing invocation. */
  26037     {
  26038       int testmode_on = ShellHasFlag(p,SHFLG_TestingMode);
  26039       sqlite3_db_config(p->db, SQLITE_DBCONFIG_TRUSTED_SCHEMA, testmode_on,0);
  26040       sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, !testmode_on,0);
  26041     }
  26042 
  26043 #ifndef SQLITE_OMIT_LOAD_EXTENSION
  26044     sqlite3_enable_load_extension(p->db, 1);
  26045 #endif
  26046     sqlite3_sha_init(p->db, 0, 0);
  26047     sqlite3_shathree_init(p->db, 0, 0);
  26048     sqlite3_uint_init(p->db, 0, 0);
  26049     sqlite3_stmtrand_init(p->db, 0, 0);
  26050     sqlite3_decimal_init(p->db, 0, 0);
  26051     sqlite3_percentile_init(p->db, 0, 0);
  26052     sqlite3_base64_init(p->db, 0, 0);
  26053     sqlite3_base85_init(p->db, 0, 0);
  26054     sqlite3_regexp_init(p->db, 0, 0);
  26055     sqlite3_ieee_init(p->db, 0, 0);
  26056     sqlite3_series_init(p->db, 0, 0);
  26057 #ifndef SQLITE_SHELL_FIDDLE
  26058     sqlite3_fileio_init(p->db, 0, 0);
  26059     sqlite3_completion_init(p->db, 0, 0);
  26060 #endif
  26061 #ifdef SQLITE_HAVE_ZLIB
  26062     if( !p->bSafeModePersist ){
  26063       sqlite3_zipfile_init(p->db, 0, 0);
  26064       sqlite3_sqlar_init(p->db, 0, 0);
  26065     }
  26066 #endif
  26067 #ifdef SQLITE_SHELL_EXTFUNCS
  26068     /* Create a preprocessing mechanism for extensions to make
  26069      * their own provisions for being built into the shell.
  26070      * This is a short-span macro. See further below for usage.
  26071      */
  26072 #define SHELL_SUB_MACRO(base, variant) base ## _ ## variant
  26073 #define SHELL_SUBMACRO(base, variant) SHELL_SUB_MACRO(base, variant)
  26074     /* Let custom-included extensions get their ..._init() called.
  26075      * The WHATEVER_INIT( db, pzErrorMsg, pApi ) macro should cause
  26076      * the extension's sqlite3_*_init( db, pzErrorMsg, pApi )
  26077      * initialization routine to be called.
  26078      */
  26079     {
  26080       int irc = SHELL_SUBMACRO(SQLITE_SHELL_EXTFUNCS, INIT)(p->db);
  26081     /* Let custom-included extensions expose their functionality.
  26082      * The WHATEVER_EXPOSE( db, pzErrorMsg ) macro should cause
  26083      * the SQL functions, virtual tables, collating sequences or
  26084      * VFS's implemented by the extension to be registered.
  26085      */
  26086       if( irc==SQLITE_OK
  26087           || irc==SQLITE_OK_LOAD_PERMANENTLY ){
  26088         SHELL_SUBMACRO(SQLITE_SHELL_EXTFUNCS, EXPOSE)(p->db, 0);
  26089       }
  26090 #undef SHELL_SUB_MACRO
  26091 #undef SHELL_SUBMACRO
  26092     }
  26093 #endif
  26094 
  26095     sqlite3_create_function(p->db, "strtod", 1, SQLITE_UTF8, 0,
  26096                             shellStrtod, 0, 0);
  26097     sqlite3_create_function(p->db, "dtostr", 1, SQLITE_UTF8, 0,
  26098                             shellDtostr, 0, 0);
  26099     sqlite3_create_function(p->db, "dtostr", 2, SQLITE_UTF8, 0,
  26100                             shellDtostr, 0, 0);
  26101     sqlite3_create_function(p->db, "shell_add_schema", 3, SQLITE_UTF8, 0,
  26102                             shellAddSchemaName, 0, 0);
  26103     sqlite3_create_function(p->db, "shell_module_schema", 1, SQLITE_UTF8, p,
  26104                             shellModuleSchema, 0, 0);
  26105     sqlite3_create_function(p->db, "shell_putsnl", 1, SQLITE_UTF8, p,
  26106                             shellPutsFunc, 0, 0);
  26107     sqlite3_create_function(p->db, "usleep",1,SQLITE_UTF8,0,
  26108                             shellUSleepFunc, 0, 0);
  26109 #ifndef SQLITE_NOHAVE_SYSTEM
  26110     sqlite3_create_function(p->db, "edit", 1, SQLITE_UTF8, 0,
  26111                             editFunc, 0, 0);
  26112     sqlite3_create_function(p->db, "edit", 2, SQLITE_UTF8, 0,
  26113                             editFunc, 0, 0);
  26114 #endif
  26115 
  26116     if( p->openMode==SHELL_OPEN_ZIPFILE ){
  26117       char *zSql = sqlite3_mprintf(
  26118          "CREATE VIRTUAL TABLE zip USING zipfile(%Q);", zDbFilename);
  26119       shell_check_oom(zSql);
  26120       sqlite3_exec(p->db, zSql, 0, 0, 0);
  26121       sqlite3_free(zSql);
  26122     }
  26123 #ifndef SQLITE_OMIT_DESERIALIZE
  26124     else
  26125     if( p->openMode==SHELL_OPEN_DESERIALIZE || p->openMode==SHELL_OPEN_HEXDB ){
  26126       int rc;
  26127       int nData = 0;
  26128       unsigned char *aData;
  26129       if( p->openMode==SHELL_OPEN_DESERIALIZE ){
  26130         aData = (unsigned char*)readFile(zDbFilename, &nData);
  26131       }else{
  26132         aData = readHexDb(p, &nData);
  26133       }
  26134       if( aData==0 ){
  26135         return;
  26136       }
  26137       rc = sqlite3_deserialize(p->db, "main", aData, nData, nData,
  26138                    SQLITE_DESERIALIZE_RESIZEABLE |
  26139                    SQLITE_DESERIALIZE_FREEONCLOSE);
  26140       if( rc ){
  26141         sqlite3_fprintf(stderr,"Error: sqlite3_deserialize() returns %d\n", rc);
  26142       }
  26143       if( p->szMax>0 ){
  26144         sqlite3_file_control(p->db, "main", SQLITE_FCNTL_SIZE_LIMIT, &p->szMax);
  26145       }
  26146     }
  26147 #endif
  26148   }
  26149   if( p->db!=0 ){
  26150     if( p->bSafeModePersist ){
  26151       sqlite3_set_authorizer(p->db, safeModeAuth, p);
  26152     }
  26153     sqlite3_db_config(
  26154         p->db, SQLITE_DBCONFIG_STMT_SCANSTATUS, p->scanstatsOn, (int*)0
  26155     );
  26156   }
  26157 }
  26158 
  26159 /*
  26160 ** Attempt to close the database connection.  Report errors.
  26161 */
  26162 void close_db(sqlite3 *db){
  26163   int rc = sqlite3_close(db);
  26164   if( rc ){
  26165     sqlite3_fprintf(stderr,
  26166         "Error: sqlite3_close() returns %d: %s\n", rc, sqlite3_errmsg(db));
  26167   }
  26168 }
  26169 
  26170 #if (HAVE_READLINE || HAVE_EDITLINE) \
  26171   && !defined(SQLITE_OMIT_READLINE_COMPLETION)
  26172 /*
  26173 ** Readline completion callbacks
  26174 */
  26175 static char *readline_completion_generator(const char *text, int state){
  26176   static sqlite3_stmt *pStmt = 0;
  26177   char *zRet;
  26178   if( state==0 ){
  26179     char *zSql;
  26180     sqlite3_finalize(pStmt);
  26181     zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
  26182                            "  FROM completion(%Q) ORDER BY 1", text);
  26183     shell_check_oom(zSql);
  26184     sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
  26185     sqlite3_free(zSql);
  26186   }
  26187   if( sqlite3_step(pStmt)==SQLITE_ROW ){
  26188     const char *z = (const char*)sqlite3_column_text(pStmt,0);
  26189     zRet = z ? strdup(z) : 0;
  26190   }else{
  26191     sqlite3_finalize(pStmt);
  26192     pStmt = 0;
  26193     zRet = 0;
  26194   }
  26195   return zRet;
  26196 }
  26197 static char **readline_completion(const char *zText, int iStart, int iEnd){
  26198   (void)iStart;
  26199   (void)iEnd;
  26200   rl_attempted_completion_over = 1;
  26201   return rl_completion_matches(zText, readline_completion_generator);
  26202 }
  26203 
  26204 #elif HAVE_LINENOISE
  26205 /*
  26206 ** Linenoise completion callback. Note that the 3rd argument is from
  26207 ** the "msteveb" version of linenoise, not the "antirez" version.
  26208 */
  26209 static void linenoise_completion(
  26210   const char *zLine,
  26211   linenoiseCompletions *lc
  26212 #if HAVE_LINENOISE==2
  26213   ,void *pUserData
  26214 #endif
  26215 ){
  26216   i64 nLine = strlen(zLine);
  26217   i64 i, iStart;
  26218   sqlite3_stmt *pStmt = 0;
  26219   char *zSql;
  26220   char zBuf[1000];
  26221 
  26222 #if HAVE_LINENOISE==2
  26223   UNUSED_PARAMETER(pUserData);
  26224 #endif
  26225   if( nLine>(i64)sizeof(zBuf)-30 ) return;
  26226   if( zLine[0]=='.' || zLine[0]=='#') return;
  26227   for(i=nLine-1; i>=0 && (IsAlnum(zLine[i]) || zLine[i]=='_'); i--){}
  26228   if( i==nLine-1 ) return;
  26229   iStart = i+1;
  26230   memcpy(zBuf, zLine, iStart);
  26231   zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
  26232                          "  FROM completion(%Q,%Q) ORDER BY 1",
  26233                          &zLine[iStart], zLine);
  26234   shell_check_oom(zSql);
  26235   sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
  26236   sqlite3_free(zSql);
  26237   sqlite3_exec(globalDb, "PRAGMA page_count", 0, 0, 0); /* Load the schema */
  26238   while( sqlite3_step(pStmt)==SQLITE_ROW ){
  26239     const char *zCompletion = (const char*)sqlite3_column_text(pStmt, 0);
  26240     int nCompletion = sqlite3_column_bytes(pStmt, 0);
  26241     if( iStart+nCompletion < (i64)sizeof(zBuf)-1 && zCompletion ){
  26242       memcpy(zBuf+iStart, zCompletion, nCompletion+1);
  26243       linenoiseAddCompletion(lc, zBuf);
  26244     }
  26245   }
  26246   sqlite3_finalize(pStmt);
  26247 }
  26248 #endif
  26249 
  26250 /*
  26251 ** Do C-language style dequoting.
  26252 **
  26253 **    \a    -> alarm
  26254 **    \b    -> backspace
  26255 **    \t    -> tab
  26256 **    \n    -> newline
  26257 **    \v    -> vertical tab
  26258 **    \f    -> form feed
  26259 **    \r    -> carriage return
  26260 **    \s    -> space
  26261 **    \"    -> "
  26262 **    \'    -> '
  26263 **    \\    -> backslash
  26264 **    \NNN  -> ascii character NNN in octal
  26265 **    \xHH  -> ascii character HH in hexadecimal
  26266 */
  26267 static void resolve_backslashes(char *z){
  26268   int i, j;
  26269   char c;
  26270   while( *z && *z!='\\' ) z++;
  26271   for(i=j=0; (c = z[i])!=0; i++, j++){
  26272     if( c=='\\' && z[i+1]!=0 ){
  26273       c = z[++i];
  26274       if( c=='a' ){
  26275         c = '\a';
  26276       }else if( c=='b' ){
  26277         c = '\b';
  26278       }else if( c=='t' ){
  26279         c = '\t';
  26280       }else if( c=='n' ){
  26281         c = '\n';
  26282       }else if( c=='v' ){
  26283         c = '\v';
  26284       }else if( c=='f' ){
  26285         c = '\f';
  26286       }else if( c=='r' ){
  26287         c = '\r';
  26288       }else if( c=='"' ){
  26289         c = '"';
  26290       }else if( c=='\'' ){
  26291         c = '\'';
  26292       }else if( c=='\\' ){
  26293         c = '\\';
  26294       }else if( c=='x' ){
  26295         int nhd = 0, hdv;
  26296         u8 hv = 0;
  26297         while( nhd<2 && (c=z[i+1+nhd])!=0 && (hdv=hexDigitValue(c))>=0 ){
  26298           hv = (u8)((hv<<4)|hdv);
  26299           ++nhd;
  26300         }
  26301         i += nhd;
  26302         c = (u8)hv;
  26303       }else if( c>='0' && c<='7' ){
  26304         c -= '0';
  26305         if( z[i+1]>='0' && z[i+1]<='7' ){
  26306           i++;
  26307           c = (c<<3) + z[i] - '0';
  26308           if( z[i+1]>='0' && z[i+1]<='7' ){
  26309             i++;
  26310             c = (c<<3) + z[i] - '0';
  26311           }
  26312         }
  26313       }
  26314     }
  26315     z[j] = c;
  26316   }
  26317   if( j<i ) z[j] = 0;
  26318 }
  26319 
  26320 /*
  26321 ** Interpret zArg as either an integer or a boolean value.  Return 1 or 0
  26322 ** for TRUE and FALSE.  Return the integer value if appropriate.
  26323 */
  26324 static int booleanValue(const char *zArg){
  26325   int i;
  26326   if( zArg[0]=='0' && zArg[1]=='x' ){
  26327     for(i=2; hexDigitValue(zArg[i])>=0; i++){}
  26328   }else{
  26329     for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
  26330   }
  26331   if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
  26332   if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
  26333     return 1;
  26334   }
  26335   if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
  26336     return 0;
  26337   }
  26338   sqlite3_fprintf(stderr,
  26339        "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n", zArg);
  26340   return 0;
  26341 }
  26342 
  26343 /*
  26344 ** Set or clear a shell flag according to a boolean value.
  26345 */
  26346 static void setOrClearFlag(ShellState *p, unsigned mFlag, const char *zArg){
  26347   if( booleanValue(zArg) ){
  26348     ShellSetFlag(p, mFlag);
  26349   }else{
  26350     ShellClearFlag(p, mFlag);
  26351   }
  26352 }
  26353 
  26354 /*
  26355 ** Close an output file, assuming it is not stderr or stdout
  26356 */
  26357 static void output_file_close(FILE *f){
  26358   if( f && f!=stdout && f!=stderr ) fclose(f);
  26359 }
  26360 
  26361 /*
  26362 ** Try to open an output file.   The names "stdout" and "stderr" are
  26363 ** recognized and do the right thing.  NULL is returned if the output
  26364 ** filename is "off".
  26365 */
  26366 static FILE *output_file_open(const char *zFile){
  26367   FILE *f;
  26368   if( cli_strcmp(zFile,"stdout")==0 ){
  26369     f = stdout;
  26370   }else if( cli_strcmp(zFile, "stderr")==0 ){
  26371     f = stderr;
  26372   }else if( cli_strcmp(zFile, "off")==0 ){
  26373     f = 0;
  26374   }else{
  26375     f = sqlite3_fopen(zFile, "w");
  26376     if( f==0 ){
  26377       sqlite3_fprintf(stderr,"Error: cannot open \"%s\"\n", zFile);
  26378     }
  26379   }
  26380   return f;
  26381 }
  26382 
  26383 #ifndef SQLITE_OMIT_TRACE
  26384 /*
  26385 ** A routine for handling output from sqlite3_trace().
  26386 */
  26387 static int sql_trace_callback(
  26388   unsigned mType,         /* The trace type */
  26389   void *pArg,             /* The ShellState pointer */
  26390   void *pP,               /* Usually a pointer to sqlite_stmt */
  26391   void *pX                /* Auxiliary output */
  26392 ){
  26393   ShellState *p = (ShellState*)pArg;
  26394   sqlite3_stmt *pStmt;
  26395   const char *zSql;
  26396   i64 nSql;
  26397   if( p->traceOut==0 ) return 0;
  26398   if( mType==SQLITE_TRACE_CLOSE ){
  26399     sputz(p->traceOut, "-- closing database connection\n");
  26400     return 0;
  26401   }
  26402   if( mType!=SQLITE_TRACE_ROW && pX!=0 && ((const char*)pX)[0]=='-' ){
  26403     zSql = (const char*)pX;
  26404   }else{
  26405     pStmt = (sqlite3_stmt*)pP;
  26406     switch( p->eTraceType ){
  26407       case SHELL_TRACE_EXPANDED: {
  26408         zSql = sqlite3_expanded_sql(pStmt);
  26409         break;
  26410       }
  26411 #ifdef SQLITE_ENABLE_NORMALIZE
  26412       case SHELL_TRACE_NORMALIZED: {
  26413         zSql = sqlite3_normalized_sql(pStmt);
  26414         break;
  26415       }
  26416 #endif
  26417       default: {
  26418         zSql = sqlite3_sql(pStmt);
  26419         break;
  26420       }
  26421     }
  26422   }
  26423   if( zSql==0 ) return 0;
  26424   nSql = strlen(zSql);
  26425   if( nSql>1000000000 ) nSql = 1000000000;
  26426   while( nSql>0 && zSql[nSql-1]==';' ){ nSql--; }
  26427   switch( mType ){
  26428     case SQLITE_TRACE_ROW:
  26429     case SQLITE_TRACE_STMT: {
  26430       sqlite3_fprintf(p->traceOut, "%.*s;\n", (int)nSql, zSql);
  26431       break;
  26432     }
  26433     case SQLITE_TRACE_PROFILE: {
  26434       sqlite3_int64 nNanosec = pX ? *(sqlite3_int64*)pX : 0;
  26435       sqlite3_fprintf(p->traceOut,
  26436                       "%.*s; -- %lld ns\n", (int)nSql, zSql, nNanosec);
  26437       break;
  26438     }
  26439   }
  26440   return 0;
  26441 }
  26442 #endif
  26443 
  26444 /*
  26445 ** A no-op routine that runs with the ".breakpoint" doc-command.  This is
  26446 ** a useful spot to set a debugger breakpoint.
  26447 **
  26448 ** This routine does not do anything practical.  The code are there simply
  26449 ** to prevent the compiler from optimizing this routine out.
  26450 */
  26451 static void test_breakpoint(void){
  26452   static unsigned int nCall = 0;
  26453   if( (nCall++)==0xffffffff ) printf("Many .breakpoints have run\n");
  26454 }
  26455 
  26456 /*
  26457 ** An object used to read a CSV and other files for import.
  26458 */
  26459 typedef struct ImportCtx ImportCtx;
  26460 struct ImportCtx {
  26461   const char *zFile;  /* Name of the input file */
  26462   FILE *in;           /* Read the CSV text from this input stream */
  26463   int (SQLITE_CDECL *xCloser)(FILE*);      /* Func to close in */
  26464   char *z;            /* Accumulated text for a field */
  26465   int n;              /* Number of bytes in z */
  26466   int nAlloc;         /* Space allocated for z[] */
  26467   int nLine;          /* Current line number */
  26468   int nRow;           /* Number of rows imported */
  26469   int nErr;           /* Number of errors encountered */
  26470   int bNotFirst;      /* True if one or more bytes already read */
  26471   int cTerm;          /* Character that terminated the most recent field */
  26472   int cColSep;        /* The column separator character.  (Usually ",") */
  26473   int cRowSep;        /* The row separator character.  (Usually "\n") */
  26474 };
  26475 
  26476 /* Clean up resourced used by an ImportCtx */
  26477 static void import_cleanup(ImportCtx *p){
  26478   if( p->in!=0 && p->xCloser!=0 ){
  26479     p->xCloser(p->in);
  26480     p->in = 0;
  26481   }
  26482   sqlite3_free(p->z);
  26483   p->z = 0;
  26484 }
  26485 
  26486 /* Append a single byte to z[] */
  26487 static void import_append_char(ImportCtx *p, int c){
  26488   if( p->n+1>=p->nAlloc ){
  26489     p->nAlloc += p->nAlloc + 100;
  26490     p->z = sqlite3_realloc64(p->z, p->nAlloc);
  26491     shell_check_oom(p->z);
  26492   }
  26493   p->z[p->n++] = (char)c;
  26494 }
  26495 
  26496 /* Read a single field of CSV text.  Compatible with rfc4180 and extended
  26497 ** with the option of having a separator other than ",".
  26498 **
  26499 **   +  Input comes from p->in.
  26500 **   +  Store results in p->z of length p->n.  Space to hold p->z comes
  26501 **      from sqlite3_malloc64().
  26502 **   +  Use p->cSep as the column separator.  The default is ",".
  26503 **   +  Use p->rSep as the row separator.  The default is "\n".
  26504 **   +  Keep track of the line number in p->nLine.
  26505 **   +  Store the character that terminates the field in p->cTerm.  Store
  26506 **      EOF on end-of-file.
  26507 **   +  Report syntax errors on stderr
  26508 */
  26509 static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){
  26510   int c;
  26511   int cSep = (u8)p->cColSep;
  26512   int rSep = (u8)p->cRowSep;
  26513   p->n = 0;
  26514   c = fgetc(p->in);
  26515   if( c==EOF || seenInterrupt ){
  26516     p->cTerm = EOF;
  26517     return 0;
  26518   }
  26519   if( c=='"' ){
  26520     int pc, ppc;
  26521     int startLine = p->nLine;
  26522     int cQuote = c;
  26523     pc = ppc = 0;
  26524     while( 1 ){
  26525       c = fgetc(p->in);
  26526       if( c==rSep ) p->nLine++;
  26527       if( c==cQuote ){
  26528         if( pc==cQuote ){
  26529           pc = 0;
  26530           continue;
  26531         }
  26532       }
  26533       if( (c==cSep && pc==cQuote)
  26534        || (c==rSep && pc==cQuote)
  26535        || (c==rSep && pc=='\r' && ppc==cQuote)
  26536        || (c==EOF && pc==cQuote)
  26537       ){
  26538         do{ p->n--; }while( p->z[p->n]!=cQuote );
  26539         p->cTerm = c;
  26540         break;
  26541       }
  26542       if( pc==cQuote && c!='\r' ){
  26543         sqlite3_fprintf(stderr,"%s:%d: unescaped %c character\n", 
  26544                         p->zFile, p->nLine, cQuote);
  26545       }
  26546       if( c==EOF ){
  26547         sqlite3_fprintf(stderr,"%s:%d: unterminated %c-quoted field\n",
  26548               p->zFile, startLine, cQuote);
  26549         p->cTerm = c;
  26550         break;
  26551       }
  26552       import_append_char(p, c);
  26553       ppc = pc;
  26554       pc = c;
  26555     }
  26556   }else{
  26557     /* If this is the first field being parsed and it begins with the
  26558     ** UTF-8 BOM  (0xEF BB BF) then skip the BOM */
  26559     if( (c&0xff)==0xef && p->bNotFirst==0 ){
  26560       import_append_char(p, c);
  26561       c = fgetc(p->in);
  26562       if( (c&0xff)==0xbb ){
  26563         import_append_char(p, c);
  26564         c = fgetc(p->in);
  26565         if( (c&0xff)==0xbf ){
  26566           p->bNotFirst = 1;
  26567           p->n = 0;
  26568           return csv_read_one_field(p);
  26569         }
  26570       }
  26571     }
  26572     while( c!=EOF && c!=cSep && c!=rSep ){
  26573       import_append_char(p, c);
  26574       c = fgetc(p->in);
  26575     }
  26576     if( c==rSep ){
  26577       p->nLine++;
  26578       if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
  26579     }
  26580     p->cTerm = c;
  26581   }
  26582   if( p->z ) p->z[p->n] = 0;
  26583   p->bNotFirst = 1;
  26584   return p->z;
  26585 }
  26586 
  26587 /* Read a single field of ASCII delimited text.
  26588 **
  26589 **   +  Input comes from p->in.
  26590 **   +  Store results in p->z of length p->n.  Space to hold p->z comes
  26591 **      from sqlite3_malloc64().
  26592 **   +  Use p->cSep as the column separator.  The default is "\x1F".
  26593 **   +  Use p->rSep as the row separator.  The default is "\x1E".
  26594 **   +  Keep track of the row number in p->nLine.
  26595 **   +  Store the character that terminates the field in p->cTerm.  Store
  26596 **      EOF on end-of-file.
  26597 **   +  Report syntax errors on stderr
  26598 */
  26599 static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){
  26600   int c;
  26601   int cSep = (u8)p->cColSep;
  26602   int rSep = (u8)p->cRowSep;
  26603   p->n = 0;
  26604   c = fgetc(p->in);
  26605   if( c==EOF || seenInterrupt ){
  26606     p->cTerm = EOF;
  26607     return 0;
  26608   }
  26609   while( c!=EOF && c!=cSep && c!=rSep ){
  26610     import_append_char(p, c);
  26611     c = fgetc(p->in);
  26612   }
  26613   if( c==rSep ){
  26614     p->nLine++;
  26615   }
  26616   p->cTerm = c;
  26617   if( p->z ) p->z[p->n] = 0;
  26618   return p->z;
  26619 }
  26620 
  26621 /*
  26622 ** Try to transfer data for table zTable.  If an error is seen while
  26623 ** moving forward, try to go backwards.  The backwards movement won't
  26624 ** work for WITHOUT ROWID tables.
  26625 */
  26626 static void tryToCloneData(
  26627   ShellState *p,
  26628   sqlite3 *newDb,
  26629   const char *zTable
  26630 ){
  26631   sqlite3_stmt *pQuery = 0;
  26632   sqlite3_stmt *pInsert = 0;
  26633   char *zQuery = 0;
  26634   char *zInsert = 0;
  26635   int rc;
  26636   int i, j, n;
  26637   int nTable = strlen30(zTable);
  26638   int k = 0;
  26639   int cnt = 0;
  26640   const int spinRate = 10000;
  26641 
  26642   zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
  26643   shell_check_oom(zQuery);
  26644   rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
  26645   if( rc ){
  26646     sqlite3_fprintf(stderr,"Error %d: %s on [%s]\n",
  26647           sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db), zQuery);
  26648     goto end_data_xfer;
  26649   }
  26650   n = sqlite3_column_count(pQuery);
  26651   zInsert = sqlite3_malloc64(200 + nTable + n*3);
  26652   shell_check_oom(zInsert);
  26653   sqlite3_snprintf(200+nTable,zInsert,
  26654                    "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
  26655   i = strlen30(zInsert);
  26656   for(j=1; j<n; j++){
  26657     memcpy(zInsert+i, ",?", 2);
  26658     i += 2;
  26659   }
  26660   memcpy(zInsert+i, ");", 3);
  26661   rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
  26662   if( rc ){
  26663     sqlite3_fprintf(stderr,"Error %d: %s on [%s]\n",
  26664           sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb), zInsert);
  26665     goto end_data_xfer;
  26666   }
  26667   for(k=0; k<2; k++){
  26668     while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
  26669       for(i=0; i<n; i++){
  26670         switch( sqlite3_column_type(pQuery, i) ){
  26671           case SQLITE_NULL: {
  26672             sqlite3_bind_null(pInsert, i+1);
  26673             break;
  26674           }
  26675           case SQLITE_INTEGER: {
  26676             sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
  26677             break;
  26678           }
  26679           case SQLITE_FLOAT: {
  26680             sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
  26681             break;
  26682           }
  26683           case SQLITE_TEXT: {
  26684             sqlite3_bind_text(pInsert, i+1,
  26685                              (const char*)sqlite3_column_text(pQuery,i),
  26686                              -1, SQLITE_STATIC);
  26687             break;
  26688           }
  26689           case SQLITE_BLOB: {
  26690             sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
  26691                                             sqlite3_column_bytes(pQuery,i),
  26692                                             SQLITE_STATIC);
  26693             break;
  26694           }
  26695         }
  26696       } /* End for */
  26697       rc = sqlite3_step(pInsert);
  26698       if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
  26699         sqlite3_fprintf(stderr,"Error %d: %s\n",
  26700               sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb));
  26701       }
  26702       sqlite3_reset(pInsert);
  26703       cnt++;
  26704       if( (cnt%spinRate)==0 ){
  26705         printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
  26706         fflush(stdout);
  26707       }
  26708     } /* End while */
  26709     if( rc==SQLITE_DONE ) break;
  26710     sqlite3_finalize(pQuery);
  26711     sqlite3_free(zQuery);
  26712     zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
  26713                              zTable);
  26714     shell_check_oom(zQuery);
  26715     rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
  26716     if( rc ){
  26717       sqlite3_fprintf(stderr,"Warning: cannot step \"%s\" backwards", zTable);
  26718       break;
  26719     }
  26720   } /* End for(k=0...) */
  26721 
  26722 end_data_xfer:
  26723   sqlite3_finalize(pQuery);
  26724   sqlite3_finalize(pInsert);
  26725   sqlite3_free(zQuery);
  26726   sqlite3_free(zInsert);
  26727 }
  26728 
  26729 
  26730 /*
  26731 ** Try to transfer all rows of the schema that match zWhere.  For
  26732 ** each row, invoke xForEach() on the object defined by that row.
  26733 ** If an error is encountered while moving forward through the
  26734 ** sqlite_schema table, try again moving backwards.
  26735 */
  26736 static void tryToCloneSchema(
  26737   ShellState *p,
  26738   sqlite3 *newDb,
  26739   const char *zWhere,
  26740   void (*xForEach)(ShellState*,sqlite3*,const char*)
  26741 ){
  26742   sqlite3_stmt *pQuery = 0;
  26743   char *zQuery = 0;
  26744   int rc;
  26745   const unsigned char *zName;
  26746   const unsigned char *zSql;
  26747   char *zErrMsg = 0;
  26748 
  26749   zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema"
  26750                            " WHERE %s ORDER BY rowid ASC", zWhere);
  26751   shell_check_oom(zQuery);
  26752   rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
  26753   if( rc ){
  26754     sqlite3_fprintf(stderr,
  26755           "Error: (%d) %s on [%s]\n", sqlite3_extended_errcode(p->db),
  26756           sqlite3_errmsg(p->db), zQuery);
  26757     goto end_schema_xfer;
  26758   }
  26759   while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
  26760     zName = sqlite3_column_text(pQuery, 0);
  26761     zSql = sqlite3_column_text(pQuery, 1);
  26762     if( zName==0 || zSql==0 ) continue;
  26763     if( sqlite3_stricmp((char*)zName, "sqlite_sequence")!=0 ){
  26764       sqlite3_fprintf(stdout, "%s... ", zName); fflush(stdout);
  26765       sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
  26766       if( zErrMsg ){
  26767         sqlite3_fprintf(stderr,"Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
  26768         sqlite3_free(zErrMsg);
  26769         zErrMsg = 0;
  26770       }
  26771     }
  26772     if( xForEach ){
  26773       xForEach(p, newDb, (const char*)zName);
  26774     }
  26775     sputz(stdout, "done\n");
  26776   }
  26777   if( rc!=SQLITE_DONE ){
  26778     sqlite3_finalize(pQuery);
  26779     sqlite3_free(zQuery);
  26780     zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema"
  26781                              " WHERE %s ORDER BY rowid DESC", zWhere);
  26782     shell_check_oom(zQuery);
  26783     rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
  26784     if( rc ){
  26785       sqlite3_fprintf(stderr,"Error: (%d) %s on [%s]\n",
  26786             sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db), zQuery);
  26787       goto end_schema_xfer;
  26788     }
  26789     while( sqlite3_step(pQuery)==SQLITE_ROW ){
  26790       zName = sqlite3_column_text(pQuery, 0);
  26791       zSql = sqlite3_column_text(pQuery, 1);
  26792       if( zName==0 || zSql==0 ) continue;
  26793       if( sqlite3_stricmp((char*)zName, "sqlite_sequence")==0 ) continue;
  26794       sqlite3_fprintf(stdout, "%s... ", zName); fflush(stdout);
  26795       sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
  26796       if( zErrMsg ){
  26797         sqlite3_fprintf(stderr,"Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
  26798         sqlite3_free(zErrMsg);
  26799         zErrMsg = 0;
  26800       }
  26801       if( xForEach ){
  26802         xForEach(p, newDb, (const char*)zName);
  26803       }
  26804       sputz(stdout, "done\n");
  26805     }
  26806   }
  26807 end_schema_xfer:
  26808   sqlite3_finalize(pQuery);
  26809   sqlite3_free(zQuery);
  26810 }
  26811 
  26812 /*
  26813 ** Open a new database file named "zNewDb".  Try to recover as much information
  26814 ** as possible out of the main database (which might be corrupt) and write it
  26815 ** into zNewDb.
  26816 */
  26817 static void tryToClone(ShellState *p, const char *zNewDb){
  26818   int rc;
  26819   sqlite3 *newDb = 0;
  26820   if( access(zNewDb,0)==0 ){
  26821     sqlite3_fprintf(stderr,"File \"%s\" already exists.\n", zNewDb);
  26822     return;
  26823   }
  26824   rc = sqlite3_open(zNewDb, &newDb);
  26825   if( rc ){
  26826     sqlite3_fprintf(stderr,
  26827         "Cannot create output database: %s\n", sqlite3_errmsg(newDb));
  26828   }else{
  26829     sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
  26830     sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
  26831     tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
  26832     tryToCloneSchema(p, newDb, "type!='table'", 0);
  26833     sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
  26834     sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
  26835   }
  26836   close_db(newDb);
  26837 }
  26838 
  26839 #ifndef SQLITE_SHELL_FIDDLE
  26840 /*
  26841 ** Change the output stream (file or pipe or console) to something else.
  26842 */
  26843 static void output_redir(ShellState *p, FILE *pfNew){
  26844   if( p->out != stdout ){
  26845     sqlite3_fputs("Output already redirected.\n", stderr);
  26846   }else{
  26847     p->out = pfNew;
  26848     setCrlfMode(p);
  26849     if( p->mode==MODE_Www ){
  26850       sqlite3_fputs(
  26851         "<!DOCTYPE html>\n"
  26852         "<HTML><BODY><PRE>\n",
  26853         p->out
  26854       );
  26855     }
  26856   }
  26857 }
  26858 
  26859 /*
  26860 ** Change the output file back to stdout.
  26861 **
  26862 ** If the p->doXdgOpen flag is set, that means the output was being
  26863 ** redirected to a temporary file named by p->zTempFile.  In that case,
  26864 ** launch start/open/xdg-open on that temporary file.
  26865 */
  26866 static void output_reset(ShellState *p){
  26867   if( p->outfile[0]=='|' ){
  26868 #ifndef SQLITE_OMIT_POPEN
  26869     pclose(p->out);
  26870 #endif
  26871   }else{
  26872     if( p->mode==MODE_Www ){
  26873       sqlite3_fputs("</PRE></BODY></HTML>\n", p->out);
  26874     }
  26875     output_file_close(p->out);
  26876 #ifndef SQLITE_NOHAVE_SYSTEM
  26877     if( p->doXdgOpen ){
  26878       const char *zXdgOpenCmd =
  26879 #if defined(_WIN32)
  26880       "start";
  26881 #elif defined(__APPLE__)
  26882       "open";
  26883 #else
  26884       "xdg-open";
  26885 #endif
  26886       char *zCmd;
  26887       zCmd = sqlite3_mprintf("%s %s", zXdgOpenCmd, p->zTempFile);
  26888       if( system(zCmd) ){
  26889         sqlite3_fprintf(stderr,"Failed: [%s]\n", zCmd);
  26890       }else{
  26891         /* Give the start/open/xdg-open command some time to get
  26892         ** going before we continue, and potential delete the
  26893         ** p->zTempFile data file out from under it */
  26894         sqlite3_sleep(2000);
  26895       }
  26896       sqlite3_free(zCmd);
  26897       outputModePop(p);
  26898       p->doXdgOpen = 0;
  26899     }
  26900 #endif /* !defined(SQLITE_NOHAVE_SYSTEM) */
  26901   }
  26902   p->outfile[0] = 0;
  26903   p->out = stdout;
  26904   setCrlfMode(p);
  26905 }
  26906 #else
  26907 # define output_redir(SS,pfO)
  26908 # define output_reset(SS)
  26909 #endif
  26910 
  26911 /*
  26912 ** Run an SQL command and return the single integer result.
  26913 */
  26914 static int db_int(sqlite3 *db, const char *zSql, ...){
  26915   sqlite3_stmt *pStmt;
  26916   int res = 0;
  26917   char *z;
  26918   va_list ap;
  26919   va_start(ap, zSql);
  26920   z = sqlite3_vmprintf(zSql, ap);
  26921   va_end(ap);
  26922   sqlite3_prepare_v2(db, z, -1, &pStmt, 0);
  26923   if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
  26924     res = sqlite3_column_int(pStmt,0);
  26925   }
  26926   sqlite3_finalize(pStmt);
  26927   sqlite3_free(z);
  26928   return res;
  26929 }
  26930 
  26931 #if SQLITE_SHELL_HAVE_RECOVER
  26932 /*
  26933 ** Convert a 2-byte or 4-byte big-endian integer into a native integer
  26934 */
  26935 static unsigned int get2byteInt(unsigned char *a){
  26936   return (a[0]<<8) + a[1];
  26937 }
  26938 static unsigned int get4byteInt(unsigned char *a){
  26939   return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3];
  26940 }
  26941 
  26942 /*
  26943 ** Implementation of the ".dbinfo" command.
  26944 **
  26945 ** Return 1 on error, 2 to exit, and 0 otherwise.
  26946 */
  26947 static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){
  26948   static const struct { const char *zName; int ofst; } aField[] = {
  26949      { "file change counter:",  24  },
  26950      { "database page count:",  28  },
  26951      { "freelist page count:",  36  },
  26952      { "schema cookie:",        40  },
  26953      { "schema format:",        44  },
  26954      { "default cache size:",   48  },
  26955      { "autovacuum top root:",  52  },
  26956      { "incremental vacuum:",   64  },
  26957      { "text encoding:",        56  },
  26958      { "user version:",         60  },
  26959      { "application id:",       68  },
  26960      { "software version:",     96  },
  26961   };
  26962   static const struct { const char *zName; const char *zSql; } aQuery[] = {
  26963      { "number of tables:",
  26964        "SELECT count(*) FROM %s WHERE type='table'" },
  26965      { "number of indexes:",
  26966        "SELECT count(*) FROM %s WHERE type='index'" },
  26967      { "number of triggers:",
  26968        "SELECT count(*) FROM %s WHERE type='trigger'" },
  26969      { "number of views:",
  26970        "SELECT count(*) FROM %s WHERE type='view'" },
  26971      { "schema size:",
  26972        "SELECT total(length(sql)) FROM %s" },
  26973   };
  26974   int i, rc;
  26975   unsigned iDataVersion;
  26976   char *zSchemaTab;
  26977   char *zDb = nArg>=2 ? azArg[1] : "main";
  26978   sqlite3_stmt *pStmt = 0;
  26979   unsigned char aHdr[100];
  26980   open_db(p, 0);
  26981   if( p->db==0 ) return 1;
  26982   rc = sqlite3_prepare_v2(p->db,
  26983              "SELECT data FROM sqlite_dbpage(?1) WHERE pgno=1",
  26984              -1, &pStmt, 0);
  26985   if( rc ){
  26986     sqlite3_fprintf(stderr,"error: %s\n", sqlite3_errmsg(p->db));
  26987     sqlite3_finalize(pStmt);
  26988     return 1;
  26989   }
  26990   sqlite3_bind_text(pStmt, 1, zDb, -1, SQLITE_STATIC);
  26991   if( sqlite3_step(pStmt)==SQLITE_ROW
  26992    && sqlite3_column_bytes(pStmt,0)>100
  26993   ){
  26994     const u8 *pb = sqlite3_column_blob(pStmt,0);
  26995     shell_check_oom(pb);
  26996     memcpy(aHdr, pb, 100);
  26997     sqlite3_finalize(pStmt);
  26998   }else{
  26999     sqlite3_fputs("unable to read database header\n", stderr);
  27000     sqlite3_finalize(pStmt);
  27001     return 1;
  27002   }
  27003   i = get2byteInt(aHdr+16);
  27004   if( i==1 ) i = 65536;
  27005   sqlite3_fprintf(p->out, "%-20s %d\n", "database page size:", i);
  27006   sqlite3_fprintf(p->out, "%-20s %d\n", "write format:", aHdr[18]);
  27007   sqlite3_fprintf(p->out, "%-20s %d\n", "read format:", aHdr[19]);
  27008   sqlite3_fprintf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]);
  27009   for(i=0; i<ArraySize(aField); i++){
  27010     int ofst = aField[i].ofst;
  27011     unsigned int val = get4byteInt(aHdr + ofst);
  27012     sqlite3_fprintf(p->out, "%-20s %u", aField[i].zName, val);
  27013     switch( ofst ){
  27014       case 56: {
  27015         if( val==1 ) sqlite3_fputs(" (utf8)", p->out);
  27016         if( val==2 ) sqlite3_fputs(" (utf16le)", p->out);
  27017         if( val==3 ) sqlite3_fputs(" (utf16be)", p->out);
  27018       }
  27019     }
  27020     sqlite3_fputs("\n", p->out);
  27021   }
  27022   if( zDb==0 ){
  27023     zSchemaTab = sqlite3_mprintf("main.sqlite_schema");
  27024   }else if( cli_strcmp(zDb,"temp")==0 ){
  27025     zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_schema");
  27026   }else{
  27027     zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_schema", zDb);
  27028   }
  27029   for(i=0; i<ArraySize(aQuery); i++){
  27030     int val = db_int(p->db, aQuery[i].zSql, zSchemaTab);
  27031     sqlite3_fprintf(p->out, "%-20s %d\n", aQuery[i].zName, val);
  27032   }
  27033   sqlite3_free(zSchemaTab);
  27034   sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_DATA_VERSION, &iDataVersion);
  27035   sqlite3_fprintf(p->out, "%-20s %u\n", "data version", iDataVersion);
  27036   return 0;
  27037 }
  27038 #endif /* SQLITE_SHELL_HAVE_RECOVER */
  27039 
  27040 /*
  27041 ** Implementation of the ".dbtotxt" command.
  27042 **
  27043 ** Return 1 on error, 2 to exit, and 0 otherwise.
  27044 */
  27045 static int shell_dbtotxt_command(ShellState *p, int nArg, char **azArg){
  27046   sqlite3_stmt *pStmt = 0;
  27047   sqlite3_int64 nPage = 0;
  27048   int pgSz = 0;
  27049   const char *zTail;
  27050   char *zName = 0;
  27051   int rc, i, j;
  27052   unsigned char bShow[256];   /* Characters ok to display */
  27053 
  27054   UNUSED_PARAMETER(nArg);
  27055   UNUSED_PARAMETER(azArg);
  27056   memset(bShow, '.', sizeof(bShow));
  27057   for(i=' '; i<='~'; i++){
  27058     if( i!='{' && i!='}' && i!='"' && i!='\\' ) bShow[i] = (unsigned char)i;
  27059   }
  27060   rc = sqlite3_prepare_v2(p->db, "PRAGMA page_size", -1, &pStmt, 0);
  27061   if( rc ) goto dbtotxt_error;
  27062   rc = 0;
  27063   if( sqlite3_step(pStmt)!=SQLITE_ROW ) goto dbtotxt_error;
  27064   pgSz = sqlite3_column_int(pStmt, 0);
  27065   sqlite3_finalize(pStmt);
  27066   pStmt = 0;
  27067   if( pgSz<512 || pgSz>65536 || (pgSz&(pgSz-1))!=0 ) goto dbtotxt_error;
  27068   rc = sqlite3_prepare_v2(p->db, "PRAGMA page_count", -1, &pStmt, 0);
  27069   if( rc ) goto dbtotxt_error;
  27070   rc = 0;
  27071   if( sqlite3_step(pStmt)!=SQLITE_ROW ) goto dbtotxt_error;
  27072   nPage = sqlite3_column_int64(pStmt, 0);
  27073   sqlite3_finalize(pStmt);
  27074   pStmt = 0;
  27075   if( nPage<1 ) goto dbtotxt_error;
  27076   rc = sqlite3_prepare_v2(p->db, "PRAGMA databases", -1, &pStmt, 0);
  27077   if( rc ) goto dbtotxt_error;
  27078   if( sqlite3_step(pStmt)!=SQLITE_ROW ){
  27079     zTail = "unk.db";
  27080   }else{
  27081     const char *zFilename = (const char*)sqlite3_column_text(pStmt, 2);
  27082     if( zFilename==0 || zFilename[0]==0 ) zFilename = "unk.db";
  27083     zTail = strrchr(zFilename, '/');
  27084 #if defined(_WIN32)
  27085     if( zTail==0 ) zTail = strrchr(zFilename, '\\');
  27086 #endif
  27087   }
  27088   zName = strdup(zTail);
  27089   shell_check_oom(zName);
  27090   sqlite3_fprintf(p->out, "| size %lld pagesize %d filename %s\n",
  27091                   nPage*pgSz, pgSz, zName);
  27092   sqlite3_finalize(pStmt);
  27093   pStmt = 0;
  27094   rc = sqlite3_prepare_v2(p->db,
  27095            "SELECT pgno, data FROM sqlite_dbpage ORDER BY pgno", -1, &pStmt, 0);
  27096   if( rc ) goto dbtotxt_error;
  27097   while( sqlite3_step(pStmt)==SQLITE_ROW ){
  27098     sqlite3_int64 pgno = sqlite3_column_int64(pStmt, 0);
  27099     const u8 *aData = sqlite3_column_blob(pStmt, 1);
  27100     int seenPageLabel = 0;
  27101     for(i=0; i<pgSz; i+=16){
  27102       const u8 *aLine = aData+i;
  27103       for(j=0; j<16 && aLine[j]==0; j++){}
  27104       if( j==16 ) continue;
  27105       if( !seenPageLabel ){
  27106         sqlite3_fprintf(p->out, "| page %lld offset %lld\n",pgno,(pgno-1)*pgSz);
  27107         seenPageLabel = 1;
  27108       }
  27109       sqlite3_fprintf(p->out, "|  %5d:", i);
  27110       for(j=0; j<16; j++) sqlite3_fprintf(p->out, " %02x", aLine[j]);
  27111       sqlite3_fprintf(p->out, "   ");
  27112       for(j=0; j<16; j++){
  27113         unsigned char c = (unsigned char)aLine[j];
  27114         sqlite3_fprintf(p->out, "%c", bShow[c]);
  27115       }
  27116       sqlite3_fprintf(p->out, "\n");
  27117     }
  27118   }
  27119   sqlite3_finalize(pStmt);
  27120   sqlite3_fprintf(p->out, "| end %s\n", zName);
  27121   free(zName);
  27122   return 0;
  27123 
  27124 dbtotxt_error:
  27125   if( rc ){
  27126     sqlite3_fprintf(stderr, "ERROR: %s\n", sqlite3_errmsg(p->db));
  27127   }
  27128   sqlite3_finalize(pStmt);
  27129   free(zName);
  27130   return 1;
  27131 }
  27132 
  27133 /*
  27134 ** Print the given string as an error message.
  27135 */
  27136 static void shellEmitError(const char *zErr){
  27137   sqlite3_fprintf(stderr,"Error: %s\n", zErr);
  27138 }
  27139 /*
  27140 ** Print the current sqlite3_errmsg() value to stderr and return 1.
  27141 */
  27142 static int shellDatabaseError(sqlite3 *db){
  27143   shellEmitError(sqlite3_errmsg(db));
  27144   return 1;
  27145 }
  27146 
  27147 /*
  27148 ** Compare the pattern in zGlob[] against the text in z[].  Return TRUE
  27149 ** if they match and FALSE (0) if they do not match.
  27150 **
  27151 ** Globbing rules:
  27152 **
  27153 **      '*'       Matches any sequence of zero or more characters.
  27154 **
  27155 **      '?'       Matches exactly one character.
  27156 **
  27157 **     [...]      Matches one character from the enclosed list of
  27158 **                characters.
  27159 **
  27160 **     [^...]     Matches one character not in the enclosed list.
  27161 **
  27162 **      '#'       Matches any sequence of one or more digits with an
  27163 **                optional + or - sign in front
  27164 **
  27165 **      ' '       Any span of whitespace matches any other span of
  27166 **                whitespace.
  27167 **
  27168 ** Extra whitespace at the end of z[] is ignored.
  27169 */
  27170 static int testcase_glob(const char *zGlob, const char *z){
  27171   int c, c2;
  27172   int invert;
  27173   int seen;
  27174 
  27175   while( (c = (*(zGlob++)))!=0 ){
  27176     if( IsSpace(c) ){
  27177       if( !IsSpace(*z) ) return 0;
  27178       while( IsSpace(*zGlob) ) zGlob++;
  27179       while( IsSpace(*z) ) z++;
  27180     }else if( c=='*' ){
  27181       while( (c=(*(zGlob++))) == '*' || c=='?' ){
  27182         if( c=='?' && (*(z++))==0 ) return 0;
  27183       }
  27184       if( c==0 ){
  27185         return 1;
  27186       }else if( c=='[' ){
  27187         while( *z && testcase_glob(zGlob-1,z)==0 ){
  27188           z++;
  27189         }
  27190         return (*z)!=0;
  27191       }
  27192       while( (c2 = (*(z++)))!=0 ){
  27193         while( c2!=c ){
  27194           c2 = *(z++);
  27195           if( c2==0 ) return 0;
  27196         }
  27197         if( testcase_glob(zGlob,z) ) return 1;
  27198       }
  27199       return 0;
  27200     }else if( c=='?' ){
  27201       if( (*(z++))==0 ) return 0;
  27202     }else if( c=='[' ){
  27203       int prior_c = 0;
  27204       seen = 0;
  27205       invert = 0;
  27206       c = *(z++);
  27207       if( c==0 ) return 0;
  27208       c2 = *(zGlob++);
  27209       if( c2=='^' ){
  27210         invert = 1;
  27211         c2 = *(zGlob++);
  27212       }
  27213       if( c2==']' ){
  27214         if( c==']' ) seen = 1;
  27215         c2 = *(zGlob++);
  27216       }
  27217       while( c2 && c2!=']' ){
  27218         if( c2=='-' && zGlob[0]!=']' && zGlob[0]!=0 && prior_c>0 ){
  27219           c2 = *(zGlob++);
  27220           if( c>=prior_c && c<=c2 ) seen = 1;
  27221           prior_c = 0;
  27222         }else{
  27223           if( c==c2 ){
  27224             seen = 1;
  27225           }
  27226           prior_c = c2;
  27227         }
  27228         c2 = *(zGlob++);
  27229       }
  27230       if( c2==0 || (seen ^ invert)==0 ) return 0;
  27231     }else if( c=='#' ){
  27232       if( (z[0]=='-' || z[0]=='+') && IsDigit(z[1]) ) z++;
  27233       if( !IsDigit(z[0]) ) return 0;
  27234       z++;
  27235       while( IsDigit(z[0]) ){ z++; }
  27236     }else{
  27237       if( c!=(*(z++)) ) return 0;
  27238     }
  27239   }
  27240   while( IsSpace(*z) ){ z++; }
  27241   return *z==0;
  27242 }
  27243 
  27244 
  27245 /*
  27246 ** Compare the string as a command-line option with either one or two
  27247 ** initial "-" characters.
  27248 */
  27249 static int optionMatch(const char *zStr, const char *zOpt){
  27250   if( zStr[0]!='-' ) return 0;
  27251   zStr++;
  27252   if( zStr[0]=='-' ) zStr++;
  27253   return cli_strcmp(zStr, zOpt)==0;
  27254 }
  27255 
  27256 /*
  27257 ** Delete a file.
  27258 */
  27259 int shellDeleteFile(const char *zFilename){
  27260   int rc;
  27261 #ifdef _WIN32
  27262   wchar_t *z = sqlite3_win32_utf8_to_unicode(zFilename);
  27263   rc = _wunlink(z);
  27264   sqlite3_free(z);
  27265 #else
  27266   rc = unlink(zFilename);
  27267 #endif
  27268   return rc;
  27269 }
  27270 
  27271 /*
  27272 ** Try to delete the temporary file (if there is one) and free the
  27273 ** memory used to hold the name of the temp file.
  27274 */
  27275 static void clearTempFile(ShellState *p){
  27276   if( p->zTempFile==0 ) return;
  27277   if( p->doXdgOpen ) return;
  27278   if( shellDeleteFile(p->zTempFile) ) return;
  27279   sqlite3_free(p->zTempFile);
  27280   p->zTempFile = 0;
  27281 }
  27282 
  27283 /*
  27284 ** Create a new temp file name with the given suffix.
  27285 */
  27286 static void newTempFile(ShellState *p, const char *zSuffix){
  27287   clearTempFile(p);
  27288   sqlite3_free(p->zTempFile);
  27289   p->zTempFile = 0;
  27290   if( p->db ){
  27291     sqlite3_file_control(p->db, 0, SQLITE_FCNTL_TEMPFILENAME, &p->zTempFile);
  27292   }
  27293   if( p->zTempFile==0 ){
  27294     /* If p->db is an in-memory database then the TEMPFILENAME file-control
  27295     ** will not work and we will need to fallback to guessing */
  27296     char *zTemp;
  27297     sqlite3_uint64 r;
  27298     sqlite3_randomness(sizeof(r), &r);
  27299     zTemp = getenv("TEMP");
  27300     if( zTemp==0 ) zTemp = getenv("TMP");
  27301     if( zTemp==0 ){
  27302 #ifdef _WIN32
  27303       zTemp = "\\tmp";
  27304 #else
  27305       zTemp = "/tmp";
  27306 #endif
  27307     }
  27308     p->zTempFile = sqlite3_mprintf("%s/temp%llx.%s", zTemp, r, zSuffix);
  27309   }else{
  27310     p->zTempFile = sqlite3_mprintf("%z.%s", p->zTempFile, zSuffix);
  27311   }
  27312   shell_check_oom(p->zTempFile);
  27313 }
  27314 
  27315 
  27316 /*
  27317 ** The implementation of SQL scalar function fkey_collate_clause(), used
  27318 ** by the ".lint fkey-indexes" command. This scalar function is always
  27319 ** called with four arguments - the parent table name, the parent column name,
  27320 ** the child table name and the child column name.
  27321 **
  27322 **   fkey_collate_clause('parent-tab', 'parent-col', 'child-tab', 'child-col')
  27323 **
  27324 ** If either of the named tables or columns do not exist, this function
  27325 ** returns an empty string. An empty string is also returned if both tables
  27326 ** and columns exist but have the same default collation sequence. Or,
  27327 ** if both exist but the default collation sequences are different, this
  27328 ** function returns the string " COLLATE <parent-collation>", where
  27329 ** <parent-collation> is the default collation sequence of the parent column.
  27330 */
  27331 static void shellFkeyCollateClause(
  27332   sqlite3_context *pCtx,
  27333   int nVal,
  27334   sqlite3_value **apVal
  27335 ){
  27336   sqlite3 *db = sqlite3_context_db_handle(pCtx);
  27337   const char *zParent;
  27338   const char *zParentCol;
  27339   const char *zParentSeq;
  27340   const char *zChild;
  27341   const char *zChildCol;
  27342   const char *zChildSeq = 0;  /* Initialize to avoid false-positive warning */
  27343   int rc;
  27344 
  27345   assert( nVal==4 );
  27346   zParent = (const char*)sqlite3_value_text(apVal[0]);
  27347   zParentCol = (const char*)sqlite3_value_text(apVal[1]);
  27348   zChild = (const char*)sqlite3_value_text(apVal[2]);
  27349   zChildCol = (const char*)sqlite3_value_text(apVal[3]);
  27350 
  27351   sqlite3_result_text(pCtx, "", -1, SQLITE_STATIC);
  27352   rc = sqlite3_table_column_metadata(
  27353       db, "main", zParent, zParentCol, 0, &zParentSeq, 0, 0, 0
  27354   );
  27355   if( rc==SQLITE_OK ){
  27356     rc = sqlite3_table_column_metadata(
  27357         db, "main", zChild, zChildCol, 0, &zChildSeq, 0, 0, 0
  27358     );
  27359   }
  27360 
  27361   if( rc==SQLITE_OK && sqlite3_stricmp(zParentSeq, zChildSeq) ){
  27362     char *z = sqlite3_mprintf(" COLLATE %s", zParentSeq);
  27363     sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT);
  27364     sqlite3_free(z);
  27365   }
  27366 }
  27367 
  27368 
  27369 /*
  27370 ** The implementation of dot-command ".lint fkey-indexes".
  27371 */
  27372 static int lintFkeyIndexes(
  27373   ShellState *pState,             /* Current shell tool state */
  27374   char **azArg,                   /* Array of arguments passed to dot command */
  27375   int nArg                        /* Number of entries in azArg[] */
  27376 ){
  27377   sqlite3 *db = pState->db;       /* Database handle to query "main" db of */
  27378   int bVerbose = 0;               /* If -verbose is present */
  27379   int bGroupByParent = 0;         /* If -groupbyparent is present */
  27380   int i;                          /* To iterate through azArg[] */
  27381   const char *zIndent = "";       /* How much to indent CREATE INDEX by */
  27382   int rc;                         /* Return code */
  27383   sqlite3_stmt *pSql = 0;         /* Compiled version of SQL statement below */
  27384   FILE *out = pState->out;        /* Send output here */
  27385 
  27386   /*
  27387   ** This SELECT statement returns one row for each foreign key constraint
  27388   ** in the schema of the main database. The column values are:
  27389   **
  27390   ** 0. The text of an SQL statement similar to:
  27391   **
  27392   **      "EXPLAIN QUERY PLAN SELECT 1 FROM child_table WHERE child_key=?"
  27393   **
  27394   **    This SELECT is similar to the one that the foreign keys implementation
  27395   **    needs to run internally on child tables. If there is an index that can
  27396   **    be used to optimize this query, then it can also be used by the FK
  27397   **    implementation to optimize DELETE or UPDATE statements on the parent
  27398   **    table.
  27399   **
  27400   ** 1. A GLOB pattern suitable for sqlite3_strglob(). If the plan output by
  27401   **    the EXPLAIN QUERY PLAN command matches this pattern, then the schema
  27402   **    contains an index that can be used to optimize the query.
  27403   **
  27404   ** 2. Human readable text that describes the child table and columns. e.g.
  27405   **
  27406   **       "child_table(child_key1, child_key2)"
  27407   **
  27408   ** 3. Human readable text that describes the parent table and columns. e.g.
  27409   **
  27410   **       "parent_table(parent_key1, parent_key2)"
  27411   **
  27412   ** 4. A full CREATE INDEX statement for an index that could be used to
  27413   **    optimize DELETE or UPDATE statements on the parent table. e.g.
  27414   **
  27415   **       "CREATE INDEX child_table_child_key ON child_table(child_key)"
  27416   **
  27417   ** 5. The name of the parent table.
  27418   **
  27419   ** These six values are used by the C logic below to generate the report.
  27420   */
  27421   const char *zSql =
  27422   "SELECT "
  27423     "     'EXPLAIN QUERY PLAN SELECT 1 FROM ' || quote(s.name) || ' WHERE '"
  27424     "  || group_concat(quote(s.name) || '.' || quote(f.[from]) || '=?' "
  27425     "  || fkey_collate_clause("
  27426     "       f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]),' AND ')"
  27427     ", "
  27428     "     'SEARCH ' || s.name || ' USING COVERING INDEX*('"
  27429     "  || group_concat('*=?', ' AND ') || ')'"
  27430     ", "
  27431     "     s.name  || '(' || group_concat(f.[from],  ', ') || ')'"
  27432     ", "
  27433     "     f.[table] || '(' || group_concat(COALESCE(f.[to], p.[name])) || ')'"
  27434     ", "
  27435     "     'CREATE INDEX ' || quote(s.name ||'_'|| group_concat(f.[from], '_'))"
  27436     "  || ' ON ' || quote(s.name) || '('"
  27437     "  || group_concat(quote(f.[from]) ||"
  27438     "        fkey_collate_clause("
  27439     "          f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]), ', ')"
  27440     "  || ');'"
  27441     ", "
  27442     "     f.[table] "
  27443     "FROM sqlite_schema AS s, pragma_foreign_key_list(s.name) AS f "
  27444     "LEFT JOIN pragma_table_info AS p ON (pk-1=seq AND p.arg=f.[table]) "
  27445     "GROUP BY s.name, f.id "
  27446     "ORDER BY (CASE WHEN ? THEN f.[table] ELSE s.name END)"
  27447   ;
  27448   const char *zGlobIPK = "SEARCH * USING INTEGER PRIMARY KEY (rowid=?)";
  27449 
  27450   for(i=2; i<nArg; i++){
  27451     int n = strlen30(azArg[i]);
  27452     if( n>1 && sqlite3_strnicmp("-verbose", azArg[i], n)==0 ){
  27453       bVerbose = 1;
  27454     }
  27455     else if( n>1 && sqlite3_strnicmp("-groupbyparent", azArg[i], n)==0 ){
  27456       bGroupByParent = 1;
  27457       zIndent = "    ";
  27458     }
  27459     else{
  27460       sqlite3_fprintf(stderr,
  27461            "Usage: %s %s ?-verbose? ?-groupbyparent?\n", azArg[0], azArg[1]);
  27462       return SQLITE_ERROR;
  27463     }
  27464   }
  27465 
  27466   /* Register the fkey_collate_clause() SQL function */
  27467   rc = sqlite3_create_function(db, "fkey_collate_clause", 4, SQLITE_UTF8,
  27468       0, shellFkeyCollateClause, 0, 0
  27469   );
  27470 
  27471 
  27472   if( rc==SQLITE_OK ){
  27473     rc = sqlite3_prepare_v2(db, zSql, -1, &pSql, 0);
  27474   }
  27475   if( rc==SQLITE_OK ){
  27476     sqlite3_bind_int(pSql, 1, bGroupByParent);
  27477   }
  27478 
  27479   if( rc==SQLITE_OK ){
  27480     int rc2;
  27481     char *zPrev = 0;
  27482     while( SQLITE_ROW==sqlite3_step(pSql) ){
  27483       int res = -1;
  27484       sqlite3_stmt *pExplain = 0;
  27485       const char *zEQP = (const char*)sqlite3_column_text(pSql, 0);
  27486       const char *zGlob = (const char*)sqlite3_column_text(pSql, 1);
  27487       const char *zFrom = (const char*)sqlite3_column_text(pSql, 2);
  27488       const char *zTarget = (const char*)sqlite3_column_text(pSql, 3);
  27489       const char *zCI = (const char*)sqlite3_column_text(pSql, 4);
  27490       const char *zParent = (const char*)sqlite3_column_text(pSql, 5);
  27491 
  27492       if( zEQP==0 ) continue;
  27493       if( zGlob==0 ) continue;
  27494       rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
  27495       if( rc!=SQLITE_OK ) break;
  27496       if( SQLITE_ROW==sqlite3_step(pExplain) ){
  27497         const char *zPlan = (const char*)sqlite3_column_text(pExplain, 3);
  27498         res = zPlan!=0 && (  0==sqlite3_strglob(zGlob, zPlan)
  27499                           || 0==sqlite3_strglob(zGlobIPK, zPlan));
  27500       }
  27501       rc = sqlite3_finalize(pExplain);
  27502       if( rc!=SQLITE_OK ) break;
  27503 
  27504       if( res<0 ){
  27505         sqlite3_fputs("Error: internal error", stderr);
  27506         break;
  27507       }else{
  27508         if( bGroupByParent
  27509         && (bVerbose || res==0)
  27510         && (zPrev==0 || sqlite3_stricmp(zParent, zPrev))
  27511         ){
  27512           sqlite3_fprintf(out, "-- Parent table %s\n", zParent);
  27513           sqlite3_free(zPrev);
  27514           zPrev = sqlite3_mprintf("%s", zParent);
  27515         }
  27516 
  27517         if( res==0 ){
  27518           sqlite3_fprintf(out, "%s%s --> %s\n", zIndent, zCI, zTarget);
  27519         }else if( bVerbose ){
  27520           sqlite3_fprintf(out,
  27521                 "%s/* no extra indexes required for %s -> %s */\n",
  27522                 zIndent, zFrom, zTarget
  27523           );
  27524         }
  27525       }
  27526     }
  27527     sqlite3_free(zPrev);
  27528 
  27529     if( rc!=SQLITE_OK ){
  27530       sqlite3_fprintf(stderr,"%s\n", sqlite3_errmsg(db));
  27531     }
  27532 
  27533     rc2 = sqlite3_finalize(pSql);
  27534     if( rc==SQLITE_OK && rc2!=SQLITE_OK ){
  27535       rc = rc2;
  27536       sqlite3_fprintf(stderr,"%s\n", sqlite3_errmsg(db));
  27537     }
  27538   }else{
  27539     sqlite3_fprintf(stderr,"%s\n", sqlite3_errmsg(db));
  27540   }
  27541 
  27542   return rc;
  27543 }
  27544 
  27545 /*
  27546 ** Implementation of ".lint" dot command.
  27547 */
  27548 static int lintDotCommand(
  27549   ShellState *pState,             /* Current shell tool state */
  27550   char **azArg,                   /* Array of arguments passed to dot command */
  27551   int nArg                        /* Number of entries in azArg[] */
  27552 ){
  27553   int n;
  27554   n = (nArg>=2 ? strlen30(azArg[1]) : 0);
  27555   if( n<1 || sqlite3_strnicmp(azArg[1], "fkey-indexes", n) ) goto usage;
  27556   return lintFkeyIndexes(pState, azArg, nArg);
  27557 
  27558  usage:
  27559   sqlite3_fprintf(stderr,"Usage %s sub-command ?switches...?\n", azArg[0]);
  27560   sqlite3_fprintf(stderr, "Where sub-commands are:\n");
  27561   sqlite3_fprintf(stderr, "    fkey-indexes\n");
  27562   return SQLITE_ERROR;
  27563 }
  27564 
  27565 static void shellPrepare(
  27566   sqlite3 *db,
  27567   int *pRc,
  27568   const char *zSql,
  27569   sqlite3_stmt **ppStmt
  27570 ){
  27571   *ppStmt = 0;
  27572   if( *pRc==SQLITE_OK ){
  27573     int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0);
  27574     if( rc!=SQLITE_OK ){
  27575       sqlite3_fprintf(stderr,
  27576          "sql error: %s (%d)\n", sqlite3_errmsg(db), sqlite3_errcode(db));
  27577       *pRc = rc;
  27578     }
  27579   }
  27580 }
  27581 
  27582 /*
  27583 ** Create a prepared statement using printf-style arguments for the SQL.
  27584 */
  27585 static void shellPreparePrintf(
  27586   sqlite3 *db,
  27587   int *pRc,
  27588   sqlite3_stmt **ppStmt,
  27589   const char *zFmt,
  27590   ...
  27591 ){
  27592   *ppStmt = 0;
  27593   if( *pRc==SQLITE_OK ){
  27594     va_list ap;
  27595     char *z;
  27596     va_start(ap, zFmt);
  27597     z = sqlite3_vmprintf(zFmt, ap);
  27598     va_end(ap);
  27599     if( z==0 ){
  27600       *pRc = SQLITE_NOMEM;
  27601     }else{
  27602       shellPrepare(db, pRc, z, ppStmt);
  27603       sqlite3_free(z);
  27604     }
  27605   }
  27606 }
  27607 
  27608 /* 
  27609 ** Finalize the prepared statement created using shellPreparePrintf().
  27610 */
  27611 static void shellFinalize(
  27612   int *pRc,
  27613   sqlite3_stmt *pStmt
  27614 ){
  27615   if( pStmt ){
  27616     sqlite3 *db = sqlite3_db_handle(pStmt);
  27617     int rc = sqlite3_finalize(pStmt);
  27618     if( *pRc==SQLITE_OK ){
  27619       if( rc!=SQLITE_OK ){
  27620         sqlite3_fprintf(stderr,"SQL error: %s\n", sqlite3_errmsg(db));
  27621       }
  27622       *pRc = rc;
  27623     }
  27624   }
  27625 }
  27626 
  27627 #if !defined SQLITE_OMIT_VIRTUALTABLE
  27628 /* Reset the prepared statement created using shellPreparePrintf().
  27629 **
  27630 ** This routine is could be marked "static".  But it is not always used,
  27631 ** depending on compile-time options.  By omitting the "static", we avoid
  27632 ** nuisance compiler warnings about "defined but not used".
  27633 */
  27634 void shellReset(
  27635   int *pRc,
  27636   sqlite3_stmt *pStmt
  27637 ){
  27638   int rc = sqlite3_reset(pStmt);
  27639   if( *pRc==SQLITE_OK ){
  27640     if( rc!=SQLITE_OK ){
  27641       sqlite3 *db = sqlite3_db_handle(pStmt);
  27642       sqlite3_fprintf(stderr,"SQL error: %s\n", sqlite3_errmsg(db));
  27643     }
  27644     *pRc = rc;
  27645   }
  27646 }
  27647 #endif /* !defined SQLITE_OMIT_VIRTUALTABLE */
  27648 
  27649 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
  27650 /******************************************************************************
  27651 ** The ".archive" or ".ar" command.
  27652 */
  27653 /*
  27654 ** Structure representing a single ".ar" command.
  27655 */
  27656 typedef struct ArCommand ArCommand;
  27657 struct ArCommand {
  27658   u8 eCmd;                        /* An AR_CMD_* value */
  27659   u8 bVerbose;                    /* True if --verbose */
  27660   u8 bZip;                        /* True if the archive is a ZIP */
  27661   u8 bDryRun;                     /* True if --dry-run */
  27662   u8 bAppend;                     /* True if --append */
  27663   u8 bGlob;                       /* True if --glob */
  27664   u8 fromCmdLine;                 /* Run from -A instead of .archive */
  27665   int nArg;                       /* Number of command arguments */
  27666   char *zSrcTable;                /* "sqlar", "zipfile($file)" or "zip" */
  27667   const char *zFile;              /* --file argument, or NULL */
  27668   const char *zDir;               /* --directory argument, or NULL */
  27669   char **azArg;                   /* Array of command arguments */
  27670   ShellState *p;                  /* Shell state */
  27671   FILE *out;                      /* Output to this stream */
  27672   sqlite3 *db;                    /* Database containing the archive */
  27673 };
  27674 
  27675 /*
  27676 ** Print a usage message for the .ar command to stderr and return SQLITE_ERROR.
  27677 */
  27678 static int arUsage(FILE *f){
  27679   showHelp(f,"archive");
  27680   return SQLITE_ERROR;
  27681 }
  27682 
  27683 /*
  27684 ** Print an error message for the .ar command to stderr and return
  27685 ** SQLITE_ERROR.
  27686 */
  27687 static int arErrorMsg(ArCommand *pAr, const char *zFmt, ...){
  27688   va_list ap;
  27689   char *z;
  27690   va_start(ap, zFmt);
  27691   z = sqlite3_vmprintf(zFmt, ap);
  27692   va_end(ap);
  27693   shellEmitError(z);
  27694   if( pAr->fromCmdLine ){
  27695     sqlite3_fputs("Use \"-A\" for more help\n", stderr);
  27696   }else{
  27697     sqlite3_fputs("Use \".archive --help\" for more help\n", stderr);
  27698   }
  27699   sqlite3_free(z);
  27700   return SQLITE_ERROR;
  27701 }
  27702 
  27703 /*
  27704 ** Values for ArCommand.eCmd.
  27705 */
  27706 #define AR_CMD_CREATE       1
  27707 #define AR_CMD_UPDATE       2
  27708 #define AR_CMD_INSERT       3
  27709 #define AR_CMD_EXTRACT      4
  27710 #define AR_CMD_LIST         5
  27711 #define AR_CMD_HELP         6
  27712 #define AR_CMD_REMOVE       7
  27713 
  27714 /*
  27715 ** Other (non-command) switches.
  27716 */
  27717 #define AR_SWITCH_VERBOSE     8
  27718 #define AR_SWITCH_FILE        9
  27719 #define AR_SWITCH_DIRECTORY  10
  27720 #define AR_SWITCH_APPEND     11
  27721 #define AR_SWITCH_DRYRUN     12
  27722 #define AR_SWITCH_GLOB       13
  27723 
  27724 static int arProcessSwitch(ArCommand *pAr, int eSwitch, const char *zArg){
  27725   switch( eSwitch ){
  27726     case AR_CMD_CREATE:
  27727     case AR_CMD_EXTRACT:
  27728     case AR_CMD_LIST:
  27729     case AR_CMD_REMOVE:
  27730     case AR_CMD_UPDATE:
  27731     case AR_CMD_INSERT:
  27732     case AR_CMD_HELP:
  27733       if( pAr->eCmd ){
  27734         return arErrorMsg(pAr, "multiple command options");
  27735       }
  27736       pAr->eCmd = eSwitch;
  27737       break;
  27738 
  27739     case AR_SWITCH_DRYRUN:
  27740       pAr->bDryRun = 1;
  27741       break;
  27742     case AR_SWITCH_GLOB:
  27743       pAr->bGlob = 1;
  27744       break;
  27745     case AR_SWITCH_VERBOSE:
  27746       pAr->bVerbose = 1;
  27747       break;
  27748     case AR_SWITCH_APPEND:
  27749       pAr->bAppend = 1;
  27750       deliberate_fall_through; /* FALLTHRU */
  27751     case AR_SWITCH_FILE:
  27752       pAr->zFile = zArg;
  27753       break;
  27754     case AR_SWITCH_DIRECTORY:
  27755       pAr->zDir = zArg;
  27756       break;
  27757   }
  27758 
  27759   return SQLITE_OK;
  27760 }
  27761 
  27762 /*
  27763 ** Parse the command line for an ".ar" command. The results are written into
  27764 ** structure (*pAr). SQLITE_OK is returned if the command line is parsed
  27765 ** successfully, otherwise an error message is written to stderr and
  27766 ** SQLITE_ERROR returned.
  27767 */
  27768 static int arParseCommand(
  27769   char **azArg,                   /* Array of arguments passed to dot command */
  27770   int nArg,                       /* Number of entries in azArg[] */
  27771   ArCommand *pAr                  /* Populate this object */
  27772 ){
  27773   struct ArSwitch {
  27774     const char *zLong;
  27775     char cShort;
  27776     u8 eSwitch;
  27777     u8 bArg;
  27778   } aSwitch[] = {
  27779     { "create",    'c', AR_CMD_CREATE,       0 },
  27780     { "extract",   'x', AR_CMD_EXTRACT,      0 },
  27781     { "insert",    'i', AR_CMD_INSERT,       0 },
  27782     { "list",      't', AR_CMD_LIST,         0 },
  27783     { "remove",    'r', AR_CMD_REMOVE,       0 },
  27784     { "update",    'u', AR_CMD_UPDATE,       0 },
  27785     { "help",      'h', AR_CMD_HELP,         0 },
  27786     { "verbose",   'v', AR_SWITCH_VERBOSE,   0 },
  27787     { "file",      'f', AR_SWITCH_FILE,      1 },
  27788     { "append",    'a', AR_SWITCH_APPEND,    1 },
  27789     { "directory", 'C', AR_SWITCH_DIRECTORY, 1 },
  27790     { "dryrun",    'n', AR_SWITCH_DRYRUN,    0 },
  27791     { "glob",      'g', AR_SWITCH_GLOB,      0 },
  27792   };
  27793   int nSwitch = sizeof(aSwitch) / sizeof(struct ArSwitch);
  27794   struct ArSwitch *pEnd = &aSwitch[nSwitch];
  27795 
  27796   if( nArg<=1 ){
  27797     sqlite3_fprintf(stderr, "Wrong number of arguments.  Usage:\n");
  27798     return arUsage(stderr);
  27799   }else{
  27800     char *z = azArg[1];
  27801     if( z[0]!='-' ){
  27802       /* Traditional style [tar] invocation */
  27803       int i;
  27804       int iArg = 2;
  27805       for(i=0; z[i]; i++){
  27806         const char *zArg = 0;
  27807         struct ArSwitch *pOpt;
  27808         for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
  27809           if( z[i]==pOpt->cShort ) break;
  27810         }
  27811         if( pOpt==pEnd ){
  27812           return arErrorMsg(pAr, "unrecognized option: %c", z[i]);
  27813         }
  27814         if( pOpt->bArg ){
  27815           if( iArg>=nArg ){
  27816             return arErrorMsg(pAr, "option requires an argument: %c",z[i]);
  27817           }
  27818           zArg = azArg[iArg++];
  27819         }
  27820         if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR;
  27821       }
  27822       pAr->nArg = nArg-iArg;
  27823       if( pAr->nArg>0 ){
  27824         pAr->azArg = &azArg[iArg];
  27825       }
  27826     }else{
  27827       /* Non-traditional invocation */
  27828       int iArg;
  27829       for(iArg=1; iArg<nArg; iArg++){
  27830         int n;
  27831         z = azArg[iArg];
  27832         if( z[0]!='-' ){
  27833           /* All remaining command line words are command arguments. */
  27834           pAr->azArg = &azArg[iArg];
  27835           pAr->nArg = nArg-iArg;
  27836           break;
  27837         }
  27838         n = strlen30(z);
  27839 
  27840         if( z[1]!='-' ){
  27841           int i;
  27842           /* One or more short options */
  27843           for(i=1; i<n; i++){
  27844             const char *zArg = 0;
  27845             struct ArSwitch *pOpt;
  27846             for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
  27847               if( z[i]==pOpt->cShort ) break;
  27848             }
  27849             if( pOpt==pEnd ){
  27850               return arErrorMsg(pAr, "unrecognized option: %c", z[i]);
  27851             }
  27852             if( pOpt->bArg ){
  27853               if( i<(n-1) ){
  27854                 zArg = &z[i+1];
  27855                 i = n;
  27856               }else{
  27857                 if( iArg>=(nArg-1) ){
  27858                   return arErrorMsg(pAr, "option requires an argument: %c",
  27859                                     z[i]);
  27860                 }
  27861                 zArg = azArg[++iArg];
  27862               }
  27863             }
  27864             if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR;
  27865           }
  27866         }else if( z[2]=='\0' ){
  27867           /* A -- option, indicating that all remaining command line words
  27868           ** are command arguments.  */
  27869           pAr->azArg = &azArg[iArg+1];
  27870           pAr->nArg = nArg-iArg-1;
  27871           break;
  27872         }else{
  27873           /* A long option */
  27874           const char *zArg = 0;             /* Argument for option, if any */
  27875           struct ArSwitch *pMatch = 0;      /* Matching option */
  27876           struct ArSwitch *pOpt;            /* Iterator */
  27877           for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
  27878             const char *zLong = pOpt->zLong;
  27879             if( (n-2)<=strlen30(zLong) && 0==memcmp(&z[2], zLong, n-2) ){
  27880               if( pMatch ){
  27881                 return arErrorMsg(pAr, "ambiguous option: %s",z);
  27882               }else{
  27883                 pMatch = pOpt;
  27884               }
  27885             }
  27886           }
  27887 
  27888           if( pMatch==0 ){
  27889             return arErrorMsg(pAr, "unrecognized option: %s", z);
  27890           }
  27891           if( pMatch->bArg ){
  27892             if( iArg>=(nArg-1) ){
  27893               return arErrorMsg(pAr, "option requires an argument: %s", z);
  27894             }
  27895             zArg = azArg[++iArg];
  27896           }
  27897           if( arProcessSwitch(pAr, pMatch->eSwitch, zArg) ) return SQLITE_ERROR;
  27898         }
  27899       }
  27900     }
  27901   }
  27902   if( pAr->eCmd==0 ){
  27903     sqlite3_fprintf(stderr, "Required argument missing.  Usage:\n");
  27904     return arUsage(stderr);
  27905   }
  27906   return SQLITE_OK;
  27907 }
  27908 
  27909 /*
  27910 ** This function assumes that all arguments within the ArCommand.azArg[]
  27911 ** array refer to archive members, as for the --extract, --list or --remove
  27912 ** commands. It checks that each of them are "present". If any specified
  27913 ** file is not present in the archive, an error is printed to stderr and an
  27914 ** error code returned. Otherwise, if all specified arguments are present
  27915 ** in the archive, SQLITE_OK is returned. Here, "present" means either an
  27916 ** exact equality when pAr->bGlob is false or a "name GLOB pattern" match
  27917 ** when pAr->bGlob is true.
  27918 **
  27919 ** This function strips any trailing '/' characters from each argument.
  27920 ** This is consistent with the way the [tar] command seems to work on
  27921 ** Linux.
  27922 */
  27923 static int arCheckEntries(ArCommand *pAr){
  27924   int rc = SQLITE_OK;
  27925   if( pAr->nArg ){
  27926     int i, j;
  27927     sqlite3_stmt *pTest = 0;
  27928     const char *zSel = (pAr->bGlob)
  27929       ? "SELECT name FROM %s WHERE glob($name,name)"
  27930       : "SELECT name FROM %s WHERE name=$name";
  27931 
  27932     shellPreparePrintf(pAr->db, &rc, &pTest, zSel, pAr->zSrcTable);
  27933     j = sqlite3_bind_parameter_index(pTest, "$name");
  27934     for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){
  27935       char *z = pAr->azArg[i];
  27936       int n = strlen30(z);
  27937       int bOk = 0;
  27938       while( n>0 && z[n-1]=='/' ) n--;
  27939       z[n] = '\0';
  27940       sqlite3_bind_text(pTest, j, z, -1, SQLITE_STATIC);
  27941       if( SQLITE_ROW==sqlite3_step(pTest) ){
  27942         bOk = 1;
  27943       }
  27944       shellReset(&rc, pTest);
  27945       if( rc==SQLITE_OK && bOk==0 ){
  27946         sqlite3_fprintf(stderr,"not found in archive: %s\n", z);
  27947         rc = SQLITE_ERROR;
  27948       }
  27949     }
  27950     shellFinalize(&rc, pTest);
  27951   }
  27952   return rc;
  27953 }
  27954 
  27955 /*
  27956 ** Format a WHERE clause that can be used against the "sqlar" table to
  27957 ** identify all archive members that match the command arguments held
  27958 ** in (*pAr). Leave this WHERE clause in (*pzWhere) before returning.
  27959 ** The caller is responsible for eventually calling sqlite3_free() on
  27960 ** any non-NULL (*pzWhere) value. Here, "match" means strict equality
  27961 ** when pAr->bGlob is false and GLOB match when pAr->bGlob is true.
  27962 */
  27963 static void arWhereClause(
  27964   int *pRc,
  27965   ArCommand *pAr,
  27966   char **pzWhere                  /* OUT: New WHERE clause */
  27967 ){
  27968   char *zWhere = 0;
  27969   const char *zSameOp = (pAr->bGlob)? "GLOB" : "=";
  27970   if( *pRc==SQLITE_OK ){
  27971     if( pAr->nArg==0 ){
  27972       zWhere = sqlite3_mprintf("1");
  27973     }else{
  27974       int i;
  27975       const char *zSep = "";
  27976       for(i=0; i<pAr->nArg; i++){
  27977         const char *z = pAr->azArg[i];
  27978         zWhere = sqlite3_mprintf(
  27979           "%z%s name %s '%q' OR substr(name,1,%d) %s '%q/'",
  27980           zWhere, zSep, zSameOp, z, strlen30(z)+1, zSameOp, z
  27981         );
  27982         if( zWhere==0 ){
  27983           *pRc = SQLITE_NOMEM;
  27984           break;
  27985         }
  27986         zSep = " OR ";
  27987       }
  27988     }
  27989   }
  27990   *pzWhere = zWhere;
  27991 }
  27992 
  27993 /*
  27994 ** Implementation of .ar "lisT" command.
  27995 */
  27996 static int arListCommand(ArCommand *pAr){
  27997   const char *zSql = "SELECT %s FROM %s WHERE %s";
  27998   const char *azCols[] = {
  27999     "name",
  28000     "lsmode(mode), sz, datetime(mtime, 'unixepoch'), name"
  28001   };
  28002 
  28003   char *zWhere = 0;
  28004   sqlite3_stmt *pSql = 0;
  28005   int rc;
  28006 
  28007   rc = arCheckEntries(pAr);
  28008   arWhereClause(&rc, pAr, &zWhere);
  28009 
  28010   shellPreparePrintf(pAr->db, &rc, &pSql, zSql, azCols[pAr->bVerbose],
  28011                      pAr->zSrcTable, zWhere);
  28012   if( pAr->bDryRun ){
  28013     sqlite3_fprintf(pAr->out, "%s\n", sqlite3_sql(pSql));
  28014   }else{
  28015     while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
  28016       if( pAr->bVerbose ){
  28017         sqlite3_fprintf(pAr->out, "%s % 10d  %s  %s\n",
  28018               sqlite3_column_text(pSql, 0), sqlite3_column_int(pSql, 1),
  28019               sqlite3_column_text(pSql, 2),sqlite3_column_text(pSql, 3));
  28020       }else{
  28021         sqlite3_fprintf(pAr->out, "%s\n", sqlite3_column_text(pSql, 0));
  28022       }
  28023     }
  28024   }
  28025   shellFinalize(&rc, pSql);
  28026   sqlite3_free(zWhere);
  28027   return rc;
  28028 }
  28029 
  28030 /*
  28031 ** Implementation of .ar "Remove" command.
  28032 */
  28033 static int arRemoveCommand(ArCommand *pAr){
  28034   int rc = 0;
  28035   char *zSql = 0;
  28036   char *zWhere = 0;
  28037 
  28038   if( pAr->nArg ){
  28039     /* Verify that args actually exist within the archive before proceeding.
  28040     ** And formulate a WHERE clause to match them.  */
  28041     rc = arCheckEntries(pAr);
  28042     arWhereClause(&rc, pAr, &zWhere);
  28043   }
  28044   if( rc==SQLITE_OK ){
  28045     zSql = sqlite3_mprintf("DELETE FROM %s WHERE %s;",
  28046                            pAr->zSrcTable, zWhere);
  28047     if( pAr->bDryRun ){
  28048       sqlite3_fprintf(pAr->out, "%s\n", zSql);
  28049     }else{
  28050       char *zErr = 0;
  28051       rc = sqlite3_exec(pAr->db, "SAVEPOINT ar;", 0, 0, 0);
  28052       if( rc==SQLITE_OK ){
  28053         rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr);
  28054         if( rc!=SQLITE_OK ){
  28055           sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0);
  28056         }else{
  28057           rc = sqlite3_exec(pAr->db, "RELEASE ar;", 0, 0, 0);
  28058         }
  28059       }
  28060       if( zErr ){
  28061         sqlite3_fprintf(stdout, "ERROR: %s\n", zErr); /* stdout? */
  28062         sqlite3_free(zErr);
  28063       }
  28064     }
  28065   }
  28066   sqlite3_free(zWhere);
  28067   sqlite3_free(zSql);
  28068   return rc;
  28069 }
  28070 
  28071 /*
  28072 ** Implementation of .ar "eXtract" command.
  28073 */
  28074 static int arExtractCommand(ArCommand *pAr){
  28075   const char *zSql1 =
  28076     "SELECT "
  28077     " ($dir || name),"
  28078     " writefile(($dir || name), %s, mode, mtime) "
  28079     "FROM %s WHERE (%s) AND (data IS NULL OR $dirOnly = 0)"
  28080     " AND name NOT GLOB '*..[/\\]*'";
  28081 
  28082   const char *azExtraArg[] = {
  28083     "sqlar_uncompress(data, sz)",
  28084     "data"
  28085   };
  28086 
  28087   sqlite3_stmt *pSql = 0;
  28088   int rc = SQLITE_OK;
  28089   char *zDir = 0;
  28090   char *zWhere = 0;
  28091   int i, j;
  28092 
  28093   /* If arguments are specified, check that they actually exist within
  28094   ** the archive before proceeding. And formulate a WHERE clause to
  28095   ** match them.  */
  28096   rc = arCheckEntries(pAr);
  28097   arWhereClause(&rc, pAr, &zWhere);
  28098 
  28099   if( rc==SQLITE_OK ){
  28100     if( pAr->zDir ){
  28101       zDir = sqlite3_mprintf("%s/", pAr->zDir);
  28102     }else{
  28103       zDir = sqlite3_mprintf("");
  28104     }
  28105     if( zDir==0 ) rc = SQLITE_NOMEM;
  28106   }
  28107 
  28108   shellPreparePrintf(pAr->db, &rc, &pSql, zSql1,
  28109       azExtraArg[pAr->bZip], pAr->zSrcTable, zWhere
  28110   );
  28111 
  28112   if( rc==SQLITE_OK ){
  28113     j = sqlite3_bind_parameter_index(pSql, "$dir");
  28114     sqlite3_bind_text(pSql, j, zDir, -1, SQLITE_STATIC);
  28115 
  28116     /* Run the SELECT statement twice. The first time, writefile() is called
  28117     ** for all archive members that should be extracted. The second time,
  28118     ** only for the directories. This is because the timestamps for
  28119     ** extracted directories must be reset after they are populated (as
  28120     ** populating them changes the timestamp).  */
  28121     for(i=0; i<2; i++){
  28122       j = sqlite3_bind_parameter_index(pSql, "$dirOnly");
  28123       sqlite3_bind_int(pSql, j, i);
  28124       if( pAr->bDryRun ){
  28125         sqlite3_fprintf(pAr->out, "%s\n", sqlite3_sql(pSql));
  28126       }else{
  28127         while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
  28128           if( i==0 && pAr->bVerbose ){
  28129             sqlite3_fprintf(pAr->out, "%s\n", sqlite3_column_text(pSql, 0));
  28130           }
  28131         }
  28132       }
  28133       shellReset(&rc, pSql);
  28134     }
  28135     shellFinalize(&rc, pSql);
  28136   }
  28137 
  28138   sqlite3_free(zDir);
  28139   sqlite3_free(zWhere);
  28140   return rc;
  28141 }
  28142 
  28143 /*
  28144 ** Run the SQL statement in zSql.  Or if doing a --dryrun, merely print it out.
  28145 */
  28146 static int arExecSql(ArCommand *pAr, const char *zSql){
  28147   int rc;
  28148   if( pAr->bDryRun ){
  28149     sqlite3_fprintf(pAr->out, "%s\n", zSql);
  28150     rc = SQLITE_OK;
  28151   }else{
  28152     char *zErr = 0;
  28153     rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr);
  28154     if( zErr ){
  28155       sqlite3_fprintf(stdout, "ERROR: %s\n", zErr);
  28156       sqlite3_free(zErr);
  28157     }
  28158   }
  28159   return rc;
  28160 }
  28161 
  28162 
  28163 /*
  28164 ** Implementation of .ar "create", "insert", and "update" commands.
  28165 **
  28166 **     create    ->     Create a new SQL archive
  28167 **     insert    ->     Insert or reinsert all files listed
  28168 **     update    ->     Insert files that have changed or that were not
  28169 **                      previously in the archive
  28170 **
  28171 ** Create the "sqlar" table in the database if it does not already exist.
  28172 ** Then add each file in the azFile[] array to the archive. Directories
  28173 ** are added recursively. If argument bVerbose is non-zero, a message is
  28174 ** printed on stdout for each file archived.
  28175 **
  28176 ** The create command is the same as update, except that it drops
  28177 ** any existing "sqlar" table before beginning.  The "insert" command
  28178 ** always overwrites every file named on the command-line, where as
  28179 ** "update" only overwrites if the size or mtime or mode has changed.
  28180 */
  28181 static int arCreateOrUpdateCommand(
  28182   ArCommand *pAr,                 /* Command arguments and options */
  28183   int bUpdate,                    /* true for a --create. */
  28184   int bOnlyIfChanged              /* Only update if file has changed */
  28185 ){
  28186   const char *zCreate =
  28187       "CREATE TABLE IF NOT EXISTS sqlar(\n"
  28188       "  name TEXT PRIMARY KEY,  -- name of the file\n"
  28189       "  mode INT,               -- access permissions\n"
  28190       "  mtime INT,              -- last modification time\n"
  28191       "  sz INT,                 -- original file size\n"
  28192       "  data BLOB               -- compressed content\n"
  28193       ")";
  28194   const char *zDrop = "DROP TABLE IF EXISTS sqlar";
  28195   const char *zInsertFmt[2] = {
  28196      "REPLACE INTO %s(name,mode,mtime,sz,data)\n"
  28197      "  SELECT\n"
  28198      "    %s,\n"
  28199      "    mode,\n"
  28200      "    mtime,\n"
  28201      "    CASE substr(lsmode(mode),1,1)\n"
  28202      "      WHEN '-' THEN length(data)\n"
  28203      "      WHEN 'd' THEN 0\n"
  28204      "      ELSE -1 END,\n"
  28205      "    sqlar_compress(data)\n"
  28206      "  FROM fsdir(%Q,%Q) AS disk\n"
  28207      "  WHERE lsmode(mode) NOT LIKE '?%%'%s;"
  28208      ,
  28209      "REPLACE INTO %s(name,mode,mtime,data)\n"
  28210      "  SELECT\n"
  28211      "    %s,\n"
  28212      "    mode,\n"
  28213      "    mtime,\n"
  28214      "    data\n"
  28215      "  FROM fsdir(%Q,%Q) AS disk\n"
  28216      "  WHERE lsmode(mode) NOT LIKE '?%%'%s;"
  28217   };
  28218   int i;                          /* For iterating through azFile[] */
  28219   int rc;                         /* Return code */
  28220   const char *zTab = 0;           /* SQL table into which to insert */
  28221   char *zSql;
  28222   char zTemp[50];
  28223   char *zExists = 0;
  28224 
  28225   arExecSql(pAr, "PRAGMA page_size=512");
  28226   rc = arExecSql(pAr, "SAVEPOINT ar;");
  28227   if( rc!=SQLITE_OK ) return rc;
  28228   zTemp[0] = 0;
  28229   if( pAr->bZip ){
  28230     /* Initialize the zipfile virtual table, if necessary */
  28231     if( pAr->zFile ){
  28232       sqlite3_uint64 r;
  28233       sqlite3_randomness(sizeof(r),&r);
  28234       sqlite3_snprintf(sizeof(zTemp),zTemp,"zip%016llx",r);
  28235       zTab = zTemp;
  28236       zSql = sqlite3_mprintf(
  28237          "CREATE VIRTUAL TABLE temp.%s USING zipfile(%Q)",
  28238          zTab, pAr->zFile
  28239       );
  28240       rc = arExecSql(pAr, zSql);
  28241       sqlite3_free(zSql);
  28242     }else{
  28243       zTab = "zip";
  28244     }
  28245   }else{
  28246     /* Initialize the table for an SQLAR */
  28247     zTab = "sqlar";
  28248     if( bUpdate==0 ){
  28249       rc = arExecSql(pAr, zDrop);
  28250       if( rc!=SQLITE_OK ) goto end_ar_transaction;
  28251     }
  28252     rc = arExecSql(pAr, zCreate);
  28253   }
  28254   if( bOnlyIfChanged ){
  28255     zExists = sqlite3_mprintf(
  28256       " AND NOT EXISTS("
  28257           "SELECT 1 FROM %s AS mem"
  28258           " WHERE mem.name=disk.name"
  28259           " AND mem.mtime=disk.mtime"
  28260           " AND mem.mode=disk.mode)", zTab);
  28261   }else{
  28262     zExists = sqlite3_mprintf("");
  28263   }
  28264   if( zExists==0 ) rc = SQLITE_NOMEM;
  28265   for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){
  28266     char *zSql2 = sqlite3_mprintf(zInsertFmt[pAr->bZip], zTab,
  28267         pAr->bVerbose ? "shell_putsnl(name)" : "name",
  28268         pAr->azArg[i], pAr->zDir, zExists);
  28269     rc = arExecSql(pAr, zSql2);
  28270     sqlite3_free(zSql2);
  28271   }
  28272 end_ar_transaction:
  28273   if( rc!=SQLITE_OK ){
  28274     sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0);
  28275   }else{
  28276     rc = arExecSql(pAr, "RELEASE ar;");
  28277     if( pAr->bZip && pAr->zFile ){
  28278       zSql = sqlite3_mprintf("DROP TABLE %s", zTemp);
  28279       arExecSql(pAr, zSql);
  28280       sqlite3_free(zSql);
  28281     }
  28282   }
  28283   sqlite3_free(zExists);
  28284   return rc;
  28285 }
  28286 
  28287 /*
  28288 ** Implementation of ".ar" dot command.
  28289 */
  28290 static int arDotCommand(
  28291   ShellState *pState,          /* Current shell tool state */
  28292   int fromCmdLine,             /* True if -A command-line option, not .ar cmd */
  28293   char **azArg,                /* Array of arguments passed to dot command */
  28294   int nArg                     /* Number of entries in azArg[] */
  28295 ){
  28296   ArCommand cmd;
  28297   int rc;
  28298   memset(&cmd, 0, sizeof(cmd));
  28299   cmd.fromCmdLine = fromCmdLine;
  28300   rc = arParseCommand(azArg, nArg, &cmd);
  28301   if( rc==SQLITE_OK ){
  28302     int eDbType = SHELL_OPEN_UNSPEC;
  28303     cmd.p = pState;
  28304     cmd.out = pState->out;
  28305     cmd.db = pState->db;
  28306     if( cmd.zFile ){
  28307       eDbType = deduceDatabaseType(cmd.zFile, 1);
  28308     }else{
  28309       eDbType = pState->openMode;
  28310     }
  28311     if( eDbType==SHELL_OPEN_ZIPFILE ){
  28312       if( cmd.eCmd==AR_CMD_EXTRACT || cmd.eCmd==AR_CMD_LIST ){
  28313         if( cmd.zFile==0 ){
  28314           cmd.zSrcTable = sqlite3_mprintf("zip");
  28315         }else{
  28316           cmd.zSrcTable = sqlite3_mprintf("zipfile(%Q)", cmd.zFile);
  28317         }
  28318       }
  28319       cmd.bZip = 1;
  28320     }else if( cmd.zFile ){
  28321       int flags;
  28322       if( cmd.bAppend ) eDbType = SHELL_OPEN_APPENDVFS;
  28323       if( cmd.eCmd==AR_CMD_CREATE || cmd.eCmd==AR_CMD_INSERT
  28324            || cmd.eCmd==AR_CMD_REMOVE || cmd.eCmd==AR_CMD_UPDATE ){
  28325         flags = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE;
  28326       }else{
  28327         flags = SQLITE_OPEN_READONLY;
  28328       }
  28329       cmd.db = 0;
  28330       if( cmd.bDryRun ){
  28331         sqlite3_fprintf(cmd.out, "-- open database '%s'%s\n", cmd.zFile,
  28332               eDbType==SHELL_OPEN_APPENDVFS ? " using 'apndvfs'" : "");
  28333       }
  28334       rc = sqlite3_open_v2(cmd.zFile, &cmd.db, flags,
  28335              eDbType==SHELL_OPEN_APPENDVFS ? "apndvfs" : 0);
  28336       if( rc!=SQLITE_OK ){
  28337         sqlite3_fprintf(stderr, "cannot open file: %s (%s)\n",
  28338                         cmd.zFile, sqlite3_errmsg(cmd.db));
  28339         goto end_ar_command;
  28340       }
  28341       sqlite3_fileio_init(cmd.db, 0, 0);
  28342       sqlite3_sqlar_init(cmd.db, 0, 0);
  28343       sqlite3_create_function(cmd.db, "shell_putsnl", 1, SQLITE_UTF8, cmd.p,
  28344                               shellPutsFunc, 0, 0);
  28345 
  28346     }
  28347     if( cmd.zSrcTable==0 && cmd.bZip==0 && cmd.eCmd!=AR_CMD_HELP ){
  28348       if( cmd.eCmd!=AR_CMD_CREATE
  28349        && sqlite3_table_column_metadata(cmd.db,0,"sqlar","name",0,0,0,0,0)
  28350       ){
  28351         sqlite3_fprintf(stderr, "database does not contain an 'sqlar' table\n");
  28352         rc = SQLITE_ERROR;
  28353         goto end_ar_command;
  28354       }
  28355       cmd.zSrcTable = sqlite3_mprintf("sqlar");
  28356     }
  28357 
  28358     switch( cmd.eCmd ){
  28359       case AR_CMD_CREATE:
  28360         rc = arCreateOrUpdateCommand(&cmd, 0, 0);
  28361         break;
  28362 
  28363       case AR_CMD_EXTRACT:
  28364         rc = arExtractCommand(&cmd);
  28365         break;
  28366 
  28367       case AR_CMD_LIST:
  28368         rc = arListCommand(&cmd);
  28369         break;
  28370 
  28371       case AR_CMD_HELP:
  28372         arUsage(pState->out);
  28373         break;
  28374 
  28375       case AR_CMD_INSERT:
  28376         rc = arCreateOrUpdateCommand(&cmd, 1, 0);
  28377         break;
  28378 
  28379       case AR_CMD_REMOVE:
  28380         rc = arRemoveCommand(&cmd);
  28381         break;
  28382 
  28383       default:
  28384         assert( cmd.eCmd==AR_CMD_UPDATE );
  28385         rc = arCreateOrUpdateCommand(&cmd, 1, 1);
  28386         break;
  28387     }
  28388   }
  28389 end_ar_command:
  28390   if( cmd.db!=pState->db ){
  28391     close_db(cmd.db);
  28392   }
  28393   sqlite3_free(cmd.zSrcTable);
  28394 
  28395   return rc;
  28396 }
  28397 /* End of the ".archive" or ".ar" command logic
  28398 *******************************************************************************/
  28399 #endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) */
  28400 
  28401 #if SQLITE_SHELL_HAVE_RECOVER
  28402 
  28403 /*
  28404 ** This function is used as a callback by the recover extension. Simply
  28405 ** print the supplied SQL statement to stdout.
  28406 */
  28407 static int recoverSqlCb(void *pCtx, const char *zSql){
  28408   ShellState *pState = (ShellState*)pCtx;
  28409   sqlite3_fprintf(pState->out, "%s;\n", zSql);
  28410   return SQLITE_OK;
  28411 }
  28412 
  28413 /*
  28414 ** This function is called to recover data from the database. A script
  28415 ** to construct a new database containing all recovered data is output
  28416 ** on stream pState->out.
  28417 */
  28418 static int recoverDatabaseCmd(ShellState *pState, int nArg, char **azArg){
  28419   int rc = SQLITE_OK;
  28420   const char *zRecoveryDb = "";   /* Name of "recovery" database.  Debug only */
  28421   const char *zLAF = "lost_and_found";
  28422   int bFreelist = 1;              /* 0 if --ignore-freelist is specified */
  28423   int bRowids = 1;                /* 0 if --no-rowids */
  28424   sqlite3_recover *p = 0;
  28425   int i = 0;
  28426 
  28427   for(i=1; i<nArg; i++){
  28428     char *z = azArg[i];
  28429     int n;
  28430     if( z[0]=='-' && z[1]=='-' ) z++;
  28431     n = strlen30(z);
  28432     if( n<=17 && memcmp("-ignore-freelist", z, n)==0 ){
  28433       bFreelist = 0;
  28434     }else
  28435     if( n<=12 && memcmp("-recovery-db", z, n)==0 && i<(nArg-1) ){
  28436       /* This option determines the name of the ATTACH-ed database used
  28437       ** internally by the recovery extension.  The default is "" which
  28438       ** means to use a temporary database that is automatically deleted
  28439       ** when closed.  This option is undocumented and might disappear at
  28440       ** any moment. */
  28441       i++;
  28442       zRecoveryDb = azArg[i];
  28443     }else
  28444     if( n<=15 && memcmp("-lost-and-found", z, n)==0 && i<(nArg-1) ){
  28445       i++;
  28446       zLAF = azArg[i];
  28447     }else
  28448     if( n<=10 && memcmp("-no-rowids", z, n)==0 ){
  28449       bRowids = 0;
  28450     }
  28451     else{
  28452       sqlite3_fprintf(stderr,"unexpected option: %s\n", azArg[i]);
  28453       showHelp(pState->out, azArg[0]);
  28454       return 1;
  28455     }
  28456   }
  28457 
  28458   p = sqlite3_recover_init_sql(
  28459       pState->db, "main", recoverSqlCb, (void*)pState
  28460   );
  28461 
  28462   sqlite3_recover_config(p, 789, (void*)zRecoveryDb);  /* Debug use only */
  28463   sqlite3_recover_config(p, SQLITE_RECOVER_LOST_AND_FOUND, (void*)zLAF);
  28464   sqlite3_recover_config(p, SQLITE_RECOVER_ROWIDS, (void*)&bRowids);
  28465   sqlite3_recover_config(p, SQLITE_RECOVER_FREELIST_CORRUPT,(void*)&bFreelist);
  28466 
  28467   sqlite3_fprintf(pState->out, ".dbconfig defensive off\n");
  28468   sqlite3_recover_run(p);
  28469   if( sqlite3_recover_errcode(p)!=SQLITE_OK ){
  28470     const char *zErr = sqlite3_recover_errmsg(p);
  28471     int errCode = sqlite3_recover_errcode(p);
  28472     sqlite3_fprintf(stderr,"sql error: %s (%d)\n", zErr, errCode);
  28473   }
  28474   rc = sqlite3_recover_finish(p);
  28475   return rc;
  28476 }
  28477 #endif /* SQLITE_SHELL_HAVE_RECOVER */
  28478 
  28479 /*
  28480 ** Implementation of ".intck STEPS_PER_UNLOCK" command.
  28481 */
  28482 static int intckDatabaseCmd(ShellState *pState, i64 nStepPerUnlock){
  28483   sqlite3_intck *p = 0;
  28484   int rc = SQLITE_OK;
  28485 
  28486   rc = sqlite3_intck_open(pState->db, "main", &p);
  28487   if( rc==SQLITE_OK ){
  28488     i64 nStep = 0;
  28489     i64 nError = 0;
  28490     const char *zErr = 0;
  28491     while( SQLITE_OK==sqlite3_intck_step(p) ){
  28492       const char *zMsg = sqlite3_intck_message(p);
  28493       if( zMsg ){
  28494         sqlite3_fprintf(pState->out, "%s\n", zMsg);
  28495         nError++;
  28496       }
  28497       nStep++;
  28498       if( nStepPerUnlock && (nStep % nStepPerUnlock)==0 ){
  28499         sqlite3_intck_unlock(p);
  28500       }
  28501     }
  28502     rc = sqlite3_intck_error(p, &zErr);
  28503     if( zErr ){
  28504       sqlite3_fprintf(stderr,"%s\n", zErr);
  28505     }
  28506     sqlite3_intck_close(p);
  28507 
  28508     sqlite3_fprintf(pState->out, "%lld steps, %lld errors\n", nStep, nError);
  28509   }
  28510 
  28511   return rc;
  28512 }
  28513 
  28514 /*
  28515  * zAutoColumn(zCol, &db, ?) => Maybe init db, add column zCol to it.
  28516  * zAutoColumn(0, &db, ?) => (db!=0) Form columns spec for CREATE TABLE,
  28517  *   close db and set it to 0, and return the columns spec, to later
  28518  *   be sqlite3_free()'ed by the caller.
  28519  * The return is 0 when either:
  28520  *   (a) The db was not initialized and zCol==0 (There are no columns.)
  28521  *   (b) zCol!=0  (Column was added, db initialized as needed.)
  28522  * The 3rd argument, pRenamed, references an out parameter. If the
  28523  * pointer is non-zero, its referent will be set to a summary of renames
  28524  * done if renaming was necessary, or set to 0 if none was done. The out
  28525  * string (if any) must be sqlite3_free()'ed by the caller.
  28526  */
  28527 #ifdef SHELL_DEBUG
  28528 #define rc_err_oom_die(rc) \
  28529   if( rc==SQLITE_NOMEM ) shell_check_oom(0); \
  28530   else if(!(rc==SQLITE_OK||rc==SQLITE_DONE)) \
  28531     sqlite3_fprintf(stderr,"E:%d\n",rc), assert(0)
  28532 #else
  28533 static void rc_err_oom_die(int rc){
  28534   if( rc==SQLITE_NOMEM ) shell_check_oom(0);
  28535   assert(rc==SQLITE_OK||rc==SQLITE_DONE);
  28536 }
  28537 #endif
  28538 
  28539 #ifdef SHELL_COLFIX_DB /* If this is set, the DB can be in a file. */
  28540 static char zCOL_DB[] = SHELL_STRINGIFY(SHELL_COLFIX_DB);
  28541 #else  /* Otherwise, memory is faster/better for the transient DB. */
  28542 static const char *zCOL_DB = ":memory:";
  28543 #endif
  28544 
  28545 /* Define character (as C string) to separate generated column ordinal
  28546  * from protected part of incoming column names. This defaults to "_"
  28547  * so that incoming column identifiers that did not need not be quoted
  28548  * remain usable without being quoted. It must be one character.
  28549  */
  28550 #ifndef SHELL_AUTOCOLUMN_SEP
  28551 # define AUTOCOLUMN_SEP "_"
  28552 #else
  28553 # define AUTOCOLUMN_SEP SHELL_STRINGIFY(SHELL_AUTOCOLUMN_SEP)
  28554 #endif
  28555 
  28556 static char *zAutoColumn(const char *zColNew, sqlite3 **pDb, char **pzRenamed){
  28557   /* Queries and D{D,M}L used here */
  28558   static const char * const zTabMake = "\
  28559 CREATE TABLE ColNames(\
  28560  cpos INTEGER PRIMARY KEY,\
  28561  name TEXT, nlen INT, chop INT, reps INT, suff TEXT);\
  28562 CREATE VIEW RepeatedNames AS \
  28563 SELECT DISTINCT t.name FROM ColNames t \
  28564 WHERE t.name COLLATE NOCASE IN (\
  28565  SELECT o.name FROM ColNames o WHERE o.cpos<>t.cpos\
  28566 );\
  28567 ";
  28568   static const char * const zTabFill = "\
  28569 INSERT INTO ColNames(name,nlen,chop,reps,suff)\
  28570  VALUES(iif(length(?1)>0,?1,'?'),max(length(?1),1),0,0,'')\
  28571 ";
  28572   static const char * const zHasDupes = "\
  28573 SELECT count(DISTINCT (substring(name,1,nlen-chop)||suff) COLLATE NOCASE)\
  28574  <count(name) FROM ColNames\
  28575 ";
  28576 #ifdef SHELL_COLUMN_RENAME_CLEAN
  28577   static const char * const zDedoctor = "\
  28578 UPDATE ColNames SET chop=iif(\
  28579   (substring(name,nlen,1) BETWEEN '0' AND '9')\
  28580   AND (rtrim(name,'0123456790') glob '*"AUTOCOLUMN_SEP"'),\
  28581  nlen-length(rtrim(name, '"AUTOCOLUMN_SEP"0123456789')),\
  28582  0\
  28583 )\
  28584 ";
  28585 #endif
  28586   static const char * const zSetReps = "\
  28587 UPDATE ColNames AS t SET reps=\
  28588 (SELECT count(*) FROM ColNames d \
  28589  WHERE substring(t.name,1,t.nlen-t.chop)=substring(d.name,1,d.nlen-d.chop)\
  28590  COLLATE NOCASE\
  28591 )\
  28592 ";
  28593 #ifdef SQLITE_ENABLE_MATH_FUNCTIONS
  28594   static const char * const zColDigits = "\
  28595 SELECT CAST(ceil(log(count(*)+0.5)) AS INT) FROM ColNames \
  28596 ";
  28597 #else
  28598   /* Counting on SQLITE_MAX_COLUMN < 100,000 here. (32767 is the hard limit.) */
  28599   static const char * const zColDigits = "\
  28600 SELECT CASE WHEN (nc < 10) THEN 1 WHEN (nc < 100) THEN 2 \
  28601  WHEN (nc < 1000) THEN 3 WHEN (nc < 10000) THEN 4 \
  28602  ELSE 5 FROM (SELECT count(*) AS nc FROM ColNames) \
  28603 ";
  28604 #endif
  28605   static const char * const zRenameRank =
  28606 #ifdef SHELL_COLUMN_RENAME_CLEAN
  28607     "UPDATE ColNames AS t SET suff="
  28608     "iif(reps>1, printf('%c%0*d', '"AUTOCOLUMN_SEP"', $1, cpos), '')"
  28609 #else /* ...RENAME_MINIMAL_ONE_PASS */
  28610 "WITH Lzn(nlz) AS (" /* Find minimum extraneous leading 0's for uniqueness */
  28611 "  SELECT 0 AS nlz"
  28612 "  UNION"
  28613 "  SELECT nlz+1 AS nlz FROM Lzn"
  28614 "  WHERE EXISTS("
  28615 "   SELECT 1"
  28616 "   FROM ColNames t, ColNames o"
  28617 "   WHERE"
  28618 "    iif(t.name IN (SELECT * FROM RepeatedNames),"
  28619 "     printf('%s"AUTOCOLUMN_SEP"%s',"
  28620 "      t.name, substring(printf('%.*c%0.*d',nlz+1,'0',$1,t.cpos),2)),"
  28621 "     t.name"
  28622 "    )"
  28623 "    ="
  28624 "    iif(o.name IN (SELECT * FROM RepeatedNames),"
  28625 "     printf('%s"AUTOCOLUMN_SEP"%s',"
  28626 "      o.name, substring(printf('%.*c%0.*d',nlz+1,'0',$1,o.cpos),2)),"
  28627 "     o.name"
  28628 "    )"
  28629 "    COLLATE NOCASE"
  28630 "    AND o.cpos<>t.cpos"
  28631 "   GROUP BY t.cpos"
  28632 "  )"
  28633 ") UPDATE Colnames AS t SET"
  28634 " chop = 0," /* No chopping, never touch incoming names. */
  28635 " suff = iif(name IN (SELECT * FROM RepeatedNames),"
  28636 "  printf('"AUTOCOLUMN_SEP"%s', substring("
  28637 "   printf('%.*c%0.*d',(SELECT max(nlz) FROM Lzn)+1,'0',1,t.cpos),2)),"
  28638 "  ''"
  28639 " )"
  28640 #endif
  28641     ;
  28642   static const char * const zCollectVar = "\
  28643 SELECT\
  28644  '('||x'0a'\
  28645  || group_concat(\
  28646   cname||' TEXT',\
  28647   ','||iif((cpos-1)%4>0, ' ', x'0a'||' '))\
  28648  ||')' AS ColsSpec \
  28649 FROM (\
  28650  SELECT cpos, printf('\"%w\"',printf('%!.*s%s', nlen-chop,name,suff)) AS cname \
  28651  FROM ColNames ORDER BY cpos\
  28652 )";
  28653   static const char * const zRenamesDone =
  28654     "SELECT group_concat("
  28655     " printf('\"%w\" to \"%w\"',name,printf('%!.*s%s', nlen-chop, name, suff)),"
  28656     " ','||x'0a')"
  28657     "FROM ColNames WHERE suff<>'' OR chop!=0"
  28658     ;
  28659   int rc;
  28660   sqlite3_stmt *pStmt = 0;
  28661   assert(pDb!=0);
  28662   if( zColNew ){
  28663     /* Add initial or additional column. Init db if necessary. */
  28664     if( *pDb==0 ){
  28665       if( SQLITE_OK!=sqlite3_open(zCOL_DB, pDb) ) return 0;
  28666 #ifdef SHELL_COLFIX_DB
  28667       if(*zCOL_DB!=':')
  28668         sqlite3_exec(*pDb,"drop table if exists ColNames;"
  28669                      "drop view if exists RepeatedNames;",0,0,0);
  28670 #endif
  28671 #undef SHELL_COLFIX_DB
  28672       rc = sqlite3_exec(*pDb, zTabMake, 0, 0, 0);
  28673       rc_err_oom_die(rc);
  28674     }
  28675     assert(*pDb!=0);
  28676     rc = sqlite3_prepare_v2(*pDb, zTabFill, -1, &pStmt, 0);
  28677     rc_err_oom_die(rc);
  28678     rc = sqlite3_bind_text(pStmt, 1, zColNew, -1, 0);
  28679     rc_err_oom_die(rc);
  28680     rc = sqlite3_step(pStmt);
  28681     rc_err_oom_die(rc);
  28682     sqlite3_finalize(pStmt);
  28683     return 0;
  28684   }else if( *pDb==0 ){
  28685     return 0;
  28686   }else{
  28687     /* Formulate the columns spec, close the DB, zero *pDb. */
  28688     char *zColsSpec = 0;
  28689     int hasDupes = db_int(*pDb, "%s", zHasDupes);
  28690     int nDigits = (hasDupes)? db_int(*pDb, "%s", zColDigits) : 0;
  28691     if( hasDupes ){
  28692 #ifdef SHELL_COLUMN_RENAME_CLEAN
  28693       rc = sqlite3_exec(*pDb, zDedoctor, 0, 0, 0);
  28694       rc_err_oom_die(rc);
  28695 #endif
  28696       rc = sqlite3_exec(*pDb, zSetReps, 0, 0, 0);
  28697       rc_err_oom_die(rc);
  28698       rc = sqlite3_prepare_v2(*pDb, zRenameRank, -1, &pStmt, 0);
  28699       rc_err_oom_die(rc);
  28700       sqlite3_bind_int(pStmt, 1, nDigits);
  28701       rc = sqlite3_step(pStmt);
  28702       sqlite3_finalize(pStmt);
  28703       if( rc!=SQLITE_DONE ) rc_err_oom_die(SQLITE_NOMEM);
  28704     }
  28705     assert(db_int(*pDb, "%s", zHasDupes)==0); /* Consider: remove this */
  28706     rc = sqlite3_prepare_v2(*pDb, zCollectVar, -1, &pStmt, 0);
  28707     rc_err_oom_die(rc);
  28708     rc = sqlite3_step(pStmt);
  28709     if( rc==SQLITE_ROW ){
  28710       zColsSpec = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
  28711     }else{
  28712       zColsSpec = 0;
  28713     }
  28714     if( pzRenamed!=0 ){
  28715       if( !hasDupes ) *pzRenamed = 0;
  28716       else{
  28717         sqlite3_finalize(pStmt);
  28718         if( SQLITE_OK==sqlite3_prepare_v2(*pDb, zRenamesDone, -1, &pStmt, 0)
  28719             && SQLITE_ROW==sqlite3_step(pStmt) ){
  28720           *pzRenamed = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
  28721         }else
  28722           *pzRenamed = 0;
  28723       }
  28724     }
  28725     sqlite3_finalize(pStmt);
  28726     sqlite3_close(*pDb);
  28727     *pDb = 0;
  28728     return zColsSpec;
  28729   }
  28730 }
  28731 
  28732 /*
  28733 ** Check if the sqlite_schema table contains one or more virtual tables. If
  28734 ** parameter zLike is not NULL, then it is an SQL expression that the
  28735 ** sqlite_schema row must also match. If one or more such rows are found,
  28736 ** print the following warning to the output:
  28737 **
  28738 ** WARNING: Script requires that SQLITE_DBCONFIG_DEFENSIVE be disabled
  28739 */
  28740 static int outputDumpWarning(ShellState *p, const char *zLike){
  28741   int rc = SQLITE_OK;
  28742   sqlite3_stmt *pStmt = 0;
  28743   shellPreparePrintf(p->db, &rc, &pStmt,
  28744     "SELECT 1 FROM sqlite_schema o WHERE "
  28745     "sql LIKE 'CREATE VIRTUAL TABLE%%' AND %s", zLike ? zLike : "true"
  28746   );
  28747   if( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
  28748     sqlite3_fputs("/* WARNING: "
  28749           "Script requires that SQLITE_DBCONFIG_DEFENSIVE be disabled */\n",
  28750           p->out
  28751     );
  28752   }
  28753   shellFinalize(&rc, pStmt);
  28754   return rc;
  28755 }
  28756 
  28757 /*
  28758 ** Fault-Simulator state and logic.
  28759 */
  28760 static struct {
  28761   int iId;           /* ID that triggers a simulated fault.  -1 means "any" */
  28762   int iErr;          /* The error code to return on a fault */
  28763   int iCnt;          /* Trigger the fault only if iCnt is already zero */
  28764   int iInterval;     /* Reset iCnt to this value after each fault */
  28765   int eVerbose;      /* When to print output */
  28766   int nHit;          /* Number of hits seen so far */
  28767   int nRepeat;       /* Turn off after this many hits.  0 for never */
  28768   int nSkip;         /* Skip this many before first fault */
  28769 } faultsim_state = {-1, 0, 0, 0, 0, 0, 0, 0};
  28770 
  28771 /*
  28772 ** This is the fault-sim callback
  28773 */
  28774 static int faultsim_callback(int iArg){
  28775   if( faultsim_state.iId>0 && faultsim_state.iId!=iArg ){
  28776     return SQLITE_OK;
  28777   }
  28778   if( faultsim_state.iCnt ){
  28779     if( faultsim_state.iCnt>0 ) faultsim_state.iCnt--;
  28780     if( faultsim_state.eVerbose>=2 ){
  28781       sqlite3_fprintf(stdout, 
  28782          "FAULT-SIM id=%d no-fault (cnt=%d)\n", iArg, faultsim_state.iCnt);
  28783     }
  28784     return SQLITE_OK;
  28785   }
  28786   if( faultsim_state.eVerbose>=1 ){
  28787     sqlite3_fprintf(stdout, 
  28788          "FAULT-SIM id=%d returns %d\n", iArg, faultsim_state.iErr);
  28789   }
  28790   faultsim_state.iCnt = faultsim_state.iInterval;
  28791   faultsim_state.nHit++;
  28792   if( faultsim_state.nRepeat>0 && faultsim_state.nRepeat<=faultsim_state.nHit ){
  28793     faultsim_state.iCnt = -1;
  28794   }
  28795   return faultsim_state.iErr;
  28796 }
  28797 
  28798 /*
  28799 ** If an input line begins with "." then invoke this routine to
  28800 ** process that line.
  28801 **
  28802 ** Return 1 on error, 2 to exit, and 0 otherwise.
  28803 */
  28804 static int do_meta_command(char *zLine, ShellState *p){
  28805   int h = 1;
  28806   int nArg = 0;
  28807   int n, c;
  28808   int rc = 0;
  28809   char *azArg[52];
  28810 
  28811 #ifndef SQLITE_OMIT_VIRTUALTABLE
  28812   if( p->expert.pExpert ){
  28813     expertFinish(p, 1, 0);
  28814   }
  28815 #endif
  28816 
  28817   /* Parse the input line into tokens.
  28818   */
  28819   while( zLine[h] && nArg<ArraySize(azArg)-1 ){
  28820     while( IsSpace(zLine[h]) ){ h++; }
  28821     if( zLine[h]==0 ) break;
  28822     if( zLine[h]=='\'' || zLine[h]=='"' ){
  28823       int delim = zLine[h++];
  28824       azArg[nArg++] = &zLine[h];
  28825       while( zLine[h] && zLine[h]!=delim ){
  28826         if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++;
  28827         h++;
  28828       }
  28829       if( zLine[h]==delim ){
  28830         zLine[h++] = 0;
  28831       }
  28832       if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
  28833     }else{
  28834       azArg[nArg++] = &zLine[h];
  28835       while( zLine[h] && !IsSpace(zLine[h]) ){ h++; }
  28836       if( zLine[h] ) zLine[h++] = 0;
  28837     }
  28838   }
  28839   azArg[nArg] = 0;
  28840 
  28841   /* Process the input line.
  28842   */
  28843   if( nArg==0 ) return 0; /* no tokens, no error */
  28844   n = strlen30(azArg[0]);
  28845   c = azArg[0][0];
  28846   clearTempFile(p);
  28847 
  28848 #ifndef SQLITE_OMIT_AUTHORIZATION
  28849   if( c=='a' && cli_strncmp(azArg[0], "auth", n)==0 ){
  28850     if( nArg!=2 ){
  28851       sqlite3_fprintf(stderr, "Usage: .auth ON|OFF\n");
  28852       rc = 1;
  28853       goto meta_command_exit;
  28854     }
  28855     open_db(p, 0);
  28856     if( booleanValue(azArg[1]) ){
  28857       sqlite3_set_authorizer(p->db, shellAuth, p);
  28858     }else if( p->bSafeModePersist ){
  28859       sqlite3_set_authorizer(p->db, safeModeAuth, p);
  28860     }else{
  28861       sqlite3_set_authorizer(p->db, 0, 0);
  28862     }
  28863   }else
  28864 #endif
  28865 
  28866 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) \
  28867   && !defined(SQLITE_SHELL_FIDDLE)
  28868   if( c=='a' && cli_strncmp(azArg[0], "archive", n)==0 ){
  28869     open_db(p, 0);
  28870     failIfSafeMode(p, "cannot run .archive in safe mode");
  28871     rc = arDotCommand(p, 0, azArg, nArg);
  28872   }else
  28873 #endif
  28874 
  28875 #ifndef SQLITE_SHELL_FIDDLE
  28876   if( (c=='b' && n>=3 && cli_strncmp(azArg[0], "backup", n)==0)
  28877    || (c=='s' && n>=3 && cli_strncmp(azArg[0], "save", n)==0)
  28878   ){
  28879     const char *zDestFile = 0;
  28880     const char *zDb = 0;
  28881     sqlite3 *pDest;
  28882     sqlite3_backup *pBackup;
  28883     int j;
  28884     int bAsync = 0;
  28885     const char *zVfs = 0;
  28886     failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
  28887     for(j=1; j<nArg; j++){
  28888       const char *z = azArg[j];
  28889       if( z[0]=='-' ){
  28890         if( z[1]=='-' ) z++;
  28891         if( cli_strcmp(z, "-append")==0 ){
  28892           zVfs = "apndvfs";
  28893         }else
  28894         if( cli_strcmp(z, "-async")==0 ){
  28895           bAsync = 1;
  28896         }else
  28897         {
  28898           sqlite3_fprintf(stderr,"unknown option: %s\n", azArg[j]);
  28899           return 1;
  28900         }
  28901       }else if( zDestFile==0 ){
  28902         zDestFile = azArg[j];
  28903       }else if( zDb==0 ){
  28904         zDb = zDestFile;
  28905         zDestFile = azArg[j];
  28906       }else{
  28907         sqlite3_fprintf(stderr, "Usage: .backup ?DB? ?OPTIONS? FILENAME\n");
  28908         return 1;
  28909       }
  28910     }
  28911     if( zDestFile==0 ){
  28912       sqlite3_fprintf(stderr, "missing FILENAME argument on .backup\n");
  28913       return 1;
  28914     }
  28915     if( zDb==0 ) zDb = "main";
  28916     rc = sqlite3_open_v2(zDestFile, &pDest,
  28917                   SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, zVfs);
  28918     if( rc!=SQLITE_OK ){
  28919       sqlite3_fprintf(stderr,"Error: cannot open \"%s\"\n", zDestFile);
  28920       close_db(pDest);
  28921       return 1;
  28922     }
  28923     if( bAsync ){
  28924       sqlite3_exec(pDest, "PRAGMA synchronous=OFF; PRAGMA journal_mode=OFF;",
  28925                    0, 0, 0);
  28926     }
  28927     open_db(p, 0);
  28928     pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
  28929     if( pBackup==0 ){
  28930       shellDatabaseError(pDest);
  28931       close_db(pDest);
  28932       return 1;
  28933     }
  28934     while(  (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
  28935     sqlite3_backup_finish(pBackup);
  28936     if( rc==SQLITE_DONE ){
  28937       rc = 0;
  28938     }else{
  28939       shellDatabaseError(pDest);
  28940       rc = 1;
  28941     }
  28942     close_db(pDest);
  28943   }else
  28944 #endif /* !defined(SQLITE_SHELL_FIDDLE) */
  28945 
  28946   if( c=='b' && n>=3 && cli_strncmp(azArg[0], "bail", n)==0 ){
  28947     if( nArg==2 ){
  28948       bail_on_error = booleanValue(azArg[1]);
  28949     }else{
  28950       eputz("Usage: .bail on|off\n");
  28951       rc = 1;
  28952     }
  28953   }else
  28954 
  28955   /* Undocumented.  Legacy only.  See "crlf" below */
  28956   if( c=='b' && n>=3 && cli_strncmp(azArg[0], "binary", n)==0 ){
  28957     eputz("The \".binary\" command is deprecated.\n");
  28958     rc = 1;
  28959   }else
  28960 
  28961   /* The undocumented ".breakpoint" command causes a call to the no-op
  28962   ** routine named test_breakpoint().
  28963   */
  28964   if( c=='b' && n>=3 && cli_strncmp(azArg[0], "breakpoint", n)==0 ){
  28965     test_breakpoint();
  28966   }else
  28967 
  28968 #ifndef SQLITE_SHELL_FIDDLE
  28969   if( c=='c' && cli_strcmp(azArg[0],"cd")==0 ){
  28970     failIfSafeMode(p, "cannot run .cd in safe mode");
  28971     if( nArg==2 ){
  28972 #if defined(_WIN32) || defined(WIN32)
  28973       wchar_t *z = sqlite3_win32_utf8_to_unicode(azArg[1]);
  28974       rc = !SetCurrentDirectoryW(z);
  28975       sqlite3_free(z);
  28976 #else
  28977       rc = chdir(azArg[1]);
  28978 #endif
  28979       if( rc ){
  28980         sqlite3_fprintf(stderr,"Cannot change to directory \"%s\"\n", azArg[1]);
  28981         rc = 1;
  28982       }
  28983     }else{
  28984       eputz("Usage: .cd DIRECTORY\n");
  28985       rc = 1;
  28986     }
  28987   }else
  28988 #endif /* !defined(SQLITE_SHELL_FIDDLE) */
  28989 
  28990   if( c=='c' && n>=3 && cli_strncmp(azArg[0], "changes", n)==0 ){
  28991     if( nArg==2 ){
  28992       setOrClearFlag(p, SHFLG_CountChanges, azArg[1]);
  28993     }else{
  28994       eputz("Usage: .changes on|off\n");
  28995       rc = 1;
  28996     }
  28997   }else
  28998 
  28999 #ifndef SQLITE_SHELL_FIDDLE
  29000   /* Cancel output redirection, if it is currently set (by .testcase)
  29001   ** Then read the content of the testcase-out.txt file and compare against
  29002   ** azArg[1].  If there are differences, report an error and exit.
  29003   */
  29004   if( c=='c' && n>=3 && cli_strncmp(azArg[0], "check", n)==0 ){
  29005     char *zRes = 0;
  29006     output_reset(p);
  29007     if( nArg!=2 ){
  29008       eputz("Usage: .check GLOB-PATTERN\n");
  29009       rc = 2;
  29010     }else if( (zRes = readFile("testcase-out.txt", 0))==0 ){
  29011       rc = 2;
  29012     }else if( testcase_glob(azArg[1],zRes)==0 ){
  29013       sqlite3_fprintf(stderr,
  29014             "testcase-%s FAILED\n Expected: [%s]\n      Got: [%s]\n",
  29015             p->zTestcase, azArg[1], zRes);
  29016       rc = 1;
  29017     }else{
  29018       sqlite3_fprintf(p->out, "testcase-%s ok\n", p->zTestcase);
  29019       p->nCheck++;
  29020     }
  29021     sqlite3_free(zRes);
  29022   }else
  29023 #endif /* !defined(SQLITE_SHELL_FIDDLE) */
  29024 
  29025 #ifndef SQLITE_SHELL_FIDDLE
  29026   if( c=='c' && cli_strncmp(azArg[0], "clone", n)==0 ){
  29027     failIfSafeMode(p, "cannot run .clone in safe mode");
  29028     if( nArg==2 ){
  29029       tryToClone(p, azArg[1]);
  29030     }else{
  29031       eputz("Usage: .clone FILENAME\n");
  29032       rc = 1;
  29033     }
  29034   }else
  29035 #endif /* !defined(SQLITE_SHELL_FIDDLE) */
  29036 
  29037   if( c=='c' && cli_strncmp(azArg[0], "connection", n)==0 ){
  29038     if( nArg==1 ){
  29039       /* List available connections */
  29040       int i;
  29041       for(i=0; i<ArraySize(p->aAuxDb); i++){
  29042         const char *zFile = p->aAuxDb[i].zDbFilename;
  29043         if( p->aAuxDb[i].db==0 && p->pAuxDb!=&p->aAuxDb[i] ){
  29044           zFile = "(not open)";
  29045         }else if( zFile==0 ){
  29046           zFile = "(memory)";
  29047         }else if( zFile[0]==0 ){
  29048           zFile = "(temporary-file)";
  29049         }
  29050         if( p->pAuxDb == &p->aAuxDb[i] ){
  29051           sqlite3_fprintf(stdout, "ACTIVE %d: %s\n", i, zFile);
  29052         }else if( p->aAuxDb[i].db!=0 ){
  29053           sqlite3_fprintf(stdout, "       %d: %s\n", i, zFile);
  29054         }
  29055       }
  29056     }else if( nArg==2 && IsDigit(azArg[1][0]) && azArg[1][1]==0 ){
  29057       int i = azArg[1][0] - '0';
  29058       if( p->pAuxDb != &p->aAuxDb[i] && i>=0 && i<ArraySize(p->aAuxDb) ){
  29059         p->pAuxDb->db = p->db;
  29060         p->pAuxDb = &p->aAuxDb[i];
  29061         globalDb = p->db = p->pAuxDb->db;
  29062         p->pAuxDb->db = 0;
  29063       }
  29064     }else if( nArg==3 && cli_strcmp(azArg[1], "close")==0
  29065            && IsDigit(azArg[2][0]) && azArg[2][1]==0 ){
  29066       int i = azArg[2][0] - '0';
  29067       if( i<0 || i>=ArraySize(p->aAuxDb) ){
  29068         /* No-op */
  29069       }else if( p->pAuxDb == &p->aAuxDb[i] ){
  29070         eputz("cannot close the active database connection\n");
  29071         rc = 1;
  29072       }else if( p->aAuxDb[i].db ){
  29073         session_close_all(p, i);
  29074         close_db(p->aAuxDb[i].db);
  29075         p->aAuxDb[i].db = 0;
  29076       }
  29077     }else{
  29078       eputz("Usage: .connection [close] [CONNECTION-NUMBER]\n");
  29079       rc = 1;
  29080     }
  29081   }else
  29082 
  29083   if( c=='c' && n==4
  29084    && (cli_strncmp(azArg[0], "crlf", n)==0
  29085        || cli_strncmp(azArg[0], "crnl",n)==0)
  29086   ){
  29087     if( nArg==2 ){
  29088 #ifdef _WIN32
  29089       p->crlfMode = booleanValue(azArg[1]);
  29090 #else
  29091       p->crlfMode = 0;
  29092 #endif
  29093     }
  29094     sqlite3_fprintf(stderr, "crlf is %s\n", p->crlfMode ? "ON" : "OFF");
  29095   }else
  29096 
  29097   if( c=='d' && n>1 && cli_strncmp(azArg[0], "databases", n)==0 ){
  29098     char **azName = 0;
  29099     int nName = 0;
  29100     sqlite3_stmt *pStmt;
  29101     int i;
  29102     open_db(p, 0);
  29103     rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
  29104     if( rc ){
  29105       shellDatabaseError(p->db);
  29106       rc = 1;
  29107     }else{
  29108       while( sqlite3_step(pStmt)==SQLITE_ROW ){
  29109         const char *zSchema = (const char *)sqlite3_column_text(pStmt,1);
  29110         const char *zFile = (const char*)sqlite3_column_text(pStmt,2);
  29111         if( zSchema==0 || zFile==0 ) continue;
  29112         azName = sqlite3_realloc(azName, (nName+1)*2*sizeof(char*));
  29113         shell_check_oom(azName);
  29114         azName[nName*2] = strdup(zSchema);
  29115         azName[nName*2+1] = strdup(zFile);
  29116         nName++;
  29117       }
  29118     }
  29119     sqlite3_finalize(pStmt);
  29120     for(i=0; i<nName; i++){
  29121       int eTxn = sqlite3_txn_state(p->db, azName[i*2]);
  29122       int bRdonly = sqlite3_db_readonly(p->db, azName[i*2]);
  29123       const char *z = azName[i*2+1];
  29124       sqlite3_fprintf(p->out, "%s: %s %s%s\n",
  29125             azName[i*2], z && z[0] ? z : "\"\"", bRdonly ? "r/o" : "r/w",
  29126             eTxn==SQLITE_TXN_NONE ? "" :
  29127             eTxn==SQLITE_TXN_READ ? " read-txn" : " write-txn");
  29128       free(azName[i*2]);
  29129       free(azName[i*2+1]);
  29130     }
  29131     sqlite3_free(azName);
  29132   }else
  29133 
  29134   if( c=='d' && n>=3 && cli_strncmp(azArg[0], "dbconfig", n)==0 ){
  29135     static const struct DbConfigChoices {
  29136       const char *zName;
  29137       int op;
  29138     } aDbConfig[] = {
  29139         { "attach_create",      SQLITE_DBCONFIG_ENABLE_ATTACH_CREATE  },
  29140         { "attach_write",       SQLITE_DBCONFIG_ENABLE_ATTACH_WRITE   },
  29141         { "comments",           SQLITE_DBCONFIG_ENABLE_COMMENTS       },
  29142         { "defensive",          SQLITE_DBCONFIG_DEFENSIVE             },
  29143         { "dqs_ddl",            SQLITE_DBCONFIG_DQS_DDL               },
  29144         { "dqs_dml",            SQLITE_DBCONFIG_DQS_DML               },
  29145         { "enable_fkey",        SQLITE_DBCONFIG_ENABLE_FKEY           },
  29146         { "enable_qpsg",        SQLITE_DBCONFIG_ENABLE_QPSG           },
  29147         { "enable_trigger",     SQLITE_DBCONFIG_ENABLE_TRIGGER        },
  29148         { "enable_view",        SQLITE_DBCONFIG_ENABLE_VIEW           },
  29149         { "fts3_tokenizer",     SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER },
  29150         { "legacy_alter_table", SQLITE_DBCONFIG_LEGACY_ALTER_TABLE    },
  29151         { "legacy_file_format", SQLITE_DBCONFIG_LEGACY_FILE_FORMAT    },
  29152         { "load_extension",     SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION },
  29153         { "no_ckpt_on_close",   SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE      },
  29154         { "reset_database",     SQLITE_DBCONFIG_RESET_DATABASE        },
  29155         { "reverse_scanorder",  SQLITE_DBCONFIG_REVERSE_SCANORDER     },
  29156         { "stmt_scanstatus",    SQLITE_DBCONFIG_STMT_SCANSTATUS       },
  29157         { "trigger_eqp",        SQLITE_DBCONFIG_TRIGGER_EQP           },
  29158         { "trusted_schema",     SQLITE_DBCONFIG_TRUSTED_SCHEMA        },
  29159         { "writable_schema",    SQLITE_DBCONFIG_WRITABLE_SCHEMA       },
  29160     };
  29161     int ii, v;
  29162     open_db(p, 0);
  29163     for(ii=0; ii<ArraySize(aDbConfig); ii++){
  29164       if( nArg>1 && cli_strcmp(azArg[1], aDbConfig[ii].zName)!=0 ) continue;
  29165       if( nArg>=3 ){
  29166         sqlite3_db_config(p->db, aDbConfig[ii].op, booleanValue(azArg[2]), 0);
  29167       }
  29168       sqlite3_db_config(p->db, aDbConfig[ii].op, -1, &v);
  29169       sqlite3_fprintf(p->out, "%19s %s\n",
  29170                       aDbConfig[ii].zName, v ? "on" : "off");
  29171       if( nArg>1 ) break;
  29172     }
  29173     if( nArg>1 && ii==ArraySize(aDbConfig) ){
  29174       sqlite3_fprintf(stderr,"Error: unknown dbconfig \"%s\"\n", azArg[1]);
  29175       eputz("Enter \".dbconfig\" with no arguments for a list\n");
  29176     }
  29177   }else
  29178 
  29179 #if SQLITE_SHELL_HAVE_RECOVER
  29180   if( c=='d' && n>=3 && cli_strncmp(azArg[0], "dbinfo", n)==0 ){
  29181     rc = shell_dbinfo_command(p, nArg, azArg);
  29182   }else
  29183 
  29184   if( c=='r' && cli_strncmp(azArg[0], "recover", n)==0 ){
  29185     open_db(p, 0);
  29186     rc = recoverDatabaseCmd(p, nArg, azArg);
  29187   }else
  29188 #endif /* SQLITE_SHELL_HAVE_RECOVER */
  29189 
  29190   if( c=='d' && cli_strncmp(azArg[0], "dump", n)==0 ){
  29191     char *zLike = 0;
  29192     char *zSql;
  29193     int i;
  29194     int savedShowHeader = p->showHeader;
  29195     int savedShellFlags = p->shellFlgs;
  29196     ShellClearFlag(p,
  29197        SHFLG_PreserveRowid|SHFLG_Newlines|SHFLG_Echo
  29198        |SHFLG_DumpDataOnly|SHFLG_DumpNoSys);
  29199     for(i=1; i<nArg; i++){
  29200       if( azArg[i][0]=='-' ){
  29201         const char *z = azArg[i]+1;
  29202         if( z[0]=='-' ) z++;
  29203         if( cli_strcmp(z,"preserve-rowids")==0 ){
  29204 #ifdef SQLITE_OMIT_VIRTUALTABLE
  29205           eputz("The --preserve-rowids option is not compatible"
  29206                 " with SQLITE_OMIT_VIRTUALTABLE\n");
  29207           rc = 1;
  29208           sqlite3_free(zLike);
  29209           goto meta_command_exit;
  29210 #else
  29211           ShellSetFlag(p, SHFLG_PreserveRowid);
  29212 #endif
  29213         }else
  29214         if( cli_strcmp(z,"newlines")==0 ){
  29215           ShellSetFlag(p, SHFLG_Newlines);
  29216         }else
  29217         if( cli_strcmp(z,"data-only")==0 ){
  29218           ShellSetFlag(p, SHFLG_DumpDataOnly);
  29219         }else
  29220         if( cli_strcmp(z,"nosys")==0 ){
  29221           ShellSetFlag(p, SHFLG_DumpNoSys);
  29222         }else
  29223         {
  29224           sqlite3_fprintf(stderr,
  29225                "Unknown option \"%s\" on \".dump\"\n", azArg[i]);
  29226           rc = 1;
  29227           sqlite3_free(zLike);
  29228           goto meta_command_exit;
  29229         }
  29230       }else{
  29231         /* azArg[i] contains a LIKE pattern. This ".dump" request should
  29232         ** only dump data for tables for which either the table name matches
  29233         ** the LIKE pattern, or the table appears to be a shadow table of
  29234         ** a virtual table for which the name matches the LIKE pattern.
  29235         */
  29236         char *zExpr = sqlite3_mprintf(
  29237             "name LIKE %Q ESCAPE '\\' OR EXISTS ("
  29238             "  SELECT 1 FROM sqlite_schema WHERE "
  29239             "    name LIKE %Q ESCAPE '\\' AND"
  29240             "    sql LIKE 'CREATE VIRTUAL TABLE%%' AND"
  29241             "    substr(o.name, 1, length(name)+1) == (name||'_')"
  29242             ")", azArg[i], azArg[i]
  29243         );
  29244 
  29245         if( zLike ){
  29246           zLike = sqlite3_mprintf("%z OR %z", zLike, zExpr);
  29247         }else{
  29248           zLike = zExpr;
  29249         }
  29250       }
  29251     }
  29252 
  29253     open_db(p, 0);
  29254 
  29255     outputDumpWarning(p, zLike);
  29256     if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
  29257       /* When playing back a "dump", the content might appear in an order
  29258       ** which causes immediate foreign key constraints to be violated.
  29259       ** So disable foreign-key constraint enforcement to prevent problems. */
  29260       sqlite3_fputs("PRAGMA foreign_keys=OFF;\n", p->out);
  29261       sqlite3_fputs("BEGIN TRANSACTION;\n", p->out);
  29262     }
  29263     p->writableSchema = 0;
  29264     p->showHeader = 0;
  29265     /* Set writable_schema=ON since doing so forces SQLite to initialize
  29266     ** as much of the schema as it can even if the sqlite_schema table is
  29267     ** corrupt. */
  29268     sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
  29269     p->nErr = 0;
  29270     if( zLike==0 ) zLike = sqlite3_mprintf("true");
  29271     zSql = sqlite3_mprintf(
  29272       "SELECT name, type, sql FROM sqlite_schema AS o "
  29273       "WHERE (%s) AND type=='table'"
  29274       "  AND sql NOT NULL"
  29275       " ORDER BY tbl_name='sqlite_sequence', rowid",
  29276       zLike
  29277     );
  29278     run_schema_dump_query(p,zSql);
  29279     sqlite3_free(zSql);
  29280     if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
  29281       zSql = sqlite3_mprintf(
  29282         "SELECT sql FROM sqlite_schema AS o "
  29283         "WHERE (%s) AND sql NOT NULL"
  29284         "  AND type IN ('index','trigger','view') "
  29285         "ORDER BY type COLLATE NOCASE DESC",
  29286         zLike
  29287       );
  29288       run_table_dump_query(p, zSql);
  29289       sqlite3_free(zSql);
  29290     }
  29291     sqlite3_free(zLike);
  29292     if( p->writableSchema ){
  29293       sqlite3_fputs("PRAGMA writable_schema=OFF;\n", p->out);
  29294       p->writableSchema = 0;
  29295     }
  29296     sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
  29297     sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
  29298     if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
  29299       sqlite3_fputs(p->nErr?"ROLLBACK; -- due to errors\n":"COMMIT;\n", p->out);
  29300     }
  29301     p->showHeader = savedShowHeader;
  29302     p->shellFlgs = savedShellFlags;
  29303   }else
  29304 
  29305   if( c=='e' && cli_strncmp(azArg[0], "echo", n)==0 ){
  29306     if( nArg==2 ){
  29307       setOrClearFlag(p, SHFLG_Echo, azArg[1]);
  29308     }else{
  29309       eputz("Usage: .echo on|off\n");
  29310       rc = 1;
  29311     }
  29312   }else
  29313 
  29314   if( c=='d' && n>=3 && cli_strncmp(azArg[0], "dbtotxt", n)==0 ){
  29315     rc = shell_dbtotxt_command(p, nArg, azArg);
  29316   }else
  29317 
  29318   if( c=='e' && cli_strncmp(azArg[0], "eqp", n)==0 ){
  29319     if( nArg==2 ){
  29320       p->autoEQPtest = 0;
  29321       if( p->autoEQPtrace ){
  29322         if( p->db ) sqlite3_exec(p->db, "PRAGMA vdbe_trace=OFF;", 0, 0, 0);
  29323         p->autoEQPtrace = 0;
  29324       }
  29325       if( cli_strcmp(azArg[1],"full")==0 ){
  29326         p->autoEQP = AUTOEQP_full;
  29327       }else if( cli_strcmp(azArg[1],"trigger")==0 ){
  29328         p->autoEQP = AUTOEQP_trigger;
  29329 #ifdef SQLITE_DEBUG
  29330       }else if( cli_strcmp(azArg[1],"test")==0 ){
  29331         p->autoEQP = AUTOEQP_on;
  29332         p->autoEQPtest = 1;
  29333       }else if( cli_strcmp(azArg[1],"trace")==0 ){
  29334         p->autoEQP = AUTOEQP_full;
  29335         p->autoEQPtrace = 1;
  29336         open_db(p, 0);
  29337         sqlite3_exec(p->db, "SELECT name FROM sqlite_schema LIMIT 1", 0, 0, 0);
  29338         sqlite3_exec(p->db, "PRAGMA vdbe_trace=ON;", 0, 0, 0);
  29339 #endif
  29340       }else{
  29341         p->autoEQP = (u8)booleanValue(azArg[1]);
  29342       }
  29343     }else{
  29344       eputz("Usage: .eqp off|on|trace|trigger|full\n");
  29345       rc = 1;
  29346     }
  29347   }else
  29348 
  29349 #ifndef SQLITE_SHELL_FIDDLE
  29350   if( c=='e' && cli_strncmp(azArg[0], "exit", n)==0 ){
  29351     if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
  29352     rc = 2;
  29353   }else
  29354 #endif
  29355 
  29356   /* The ".explain" command is automatic now.  It is largely pointless.  It
  29357   ** retained purely for backwards compatibility */
  29358   if( c=='e' && cli_strncmp(azArg[0], "explain", n)==0 ){
  29359     int val = 1;
  29360     if( nArg>=2 ){
  29361       if( cli_strcmp(azArg[1],"auto")==0 ){
  29362         val = 99;
  29363       }else{
  29364         val =  booleanValue(azArg[1]);
  29365       }
  29366     }
  29367     if( val==1 && p->mode!=MODE_Explain ){
  29368       p->normalMode = p->mode;
  29369       p->mode = MODE_Explain;
  29370       p->autoExplain = 0;
  29371     }else if( val==0 ){
  29372       if( p->mode==MODE_Explain ) p->mode = p->normalMode;
  29373       p->autoExplain = 0;
  29374     }else if( val==99 ){
  29375       if( p->mode==MODE_Explain ) p->mode = p->normalMode;
  29376       p->autoExplain = 1;
  29377     }
  29378   }else
  29379 
  29380 #ifndef SQLITE_OMIT_VIRTUALTABLE
  29381   if( c=='e' && cli_strncmp(azArg[0], "expert", n)==0 ){
  29382     if( p->bSafeMode ){
  29383       sqlite3_fprintf(stderr,
  29384             "Cannot run experimental commands such as \"%s\" in safe mode\n",
  29385             azArg[0]);
  29386       rc = 1;
  29387     }else{
  29388       open_db(p, 0);
  29389       expertDotCommand(p, azArg, nArg);
  29390     }
  29391   }else
  29392 #endif
  29393 
  29394   if( c=='f' && cli_strncmp(azArg[0], "filectrl", n)==0 ){
  29395     static const struct {
  29396        const char *zCtrlName;   /* Name of a test-control option */
  29397        int ctrlCode;            /* Integer code for that option */
  29398        const char *zUsage;      /* Usage notes */
  29399     } aCtrl[] = {
  29400       { "chunk_size",     SQLITE_FCNTL_CHUNK_SIZE,      "SIZE"           },
  29401       { "data_version",   SQLITE_FCNTL_DATA_VERSION,    ""               },
  29402       { "has_moved",      SQLITE_FCNTL_HAS_MOVED,       ""               },
  29403       { "lock_timeout",   SQLITE_FCNTL_LOCK_TIMEOUT,    "MILLISEC"       },
  29404       { "persist_wal",    SQLITE_FCNTL_PERSIST_WAL,     "[BOOLEAN]"      },
  29405    /* { "pragma",         SQLITE_FCNTL_PRAGMA,          "NAME ARG"       },*/
  29406       { "psow",       SQLITE_FCNTL_POWERSAFE_OVERWRITE, "[BOOLEAN]"      },
  29407       { "reserve_bytes",  SQLITE_FCNTL_RESERVE_BYTES,   "[N]"            },
  29408       { "size_limit",     SQLITE_FCNTL_SIZE_LIMIT,      "[LIMIT]"        },
  29409       { "tempfilename",   SQLITE_FCNTL_TEMPFILENAME,    ""               },
  29410    /* { "win32_av_retry", SQLITE_FCNTL_WIN32_AV_RETRY,  "COUNT DELAY"    },*/
  29411     };
  29412     int filectrl = -1;
  29413     int iCtrl = -1;
  29414     sqlite3_int64 iRes = 0;  /* Integer result to display if rc2==1 */
  29415     int isOk = 0;            /* 0: usage  1: %lld  2: no-result */
  29416     int n2, i;
  29417     const char *zCmd = 0;
  29418     const char *zSchema = 0;
  29419 
  29420     open_db(p, 0);
  29421     zCmd = nArg>=2 ? azArg[1] : "help";
  29422 
  29423     if( zCmd[0]=='-'
  29424      && (cli_strcmp(zCmd,"--schema")==0 || cli_strcmp(zCmd,"-schema")==0)
  29425      && nArg>=4
  29426     ){
  29427       zSchema = azArg[2];
  29428       for(i=3; i<nArg; i++) azArg[i-2] = azArg[i];
  29429       nArg -= 2;
  29430       zCmd = azArg[1];
  29431     }
  29432 
  29433     /* The argument can optionally begin with "-" or "--" */
  29434     if( zCmd[0]=='-' && zCmd[1] ){
  29435       zCmd++;
  29436       if( zCmd[0]=='-' && zCmd[1] ) zCmd++;
  29437     }
  29438 
  29439     /* --help lists all file-controls */
  29440     if( cli_strcmp(zCmd,"help")==0 ){
  29441       sqlite3_fputs("Available file-controls:\n", p->out);
  29442       for(i=0; i<ArraySize(aCtrl); i++){
  29443         sqlite3_fprintf(p->out,
  29444                "  .filectrl %s %s\n", aCtrl[i].zCtrlName, aCtrl[i].zUsage);
  29445       }
  29446       rc = 1;
  29447       goto meta_command_exit;
  29448     }
  29449 
  29450     /* convert filectrl text option to value. allow any unique prefix
  29451     ** of the option name, or a numerical value. */
  29452     n2 = strlen30(zCmd);
  29453     for(i=0; i<ArraySize(aCtrl); i++){
  29454       if( cli_strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){
  29455         if( filectrl<0 ){
  29456           filectrl = aCtrl[i].ctrlCode;
  29457           iCtrl = i;
  29458         }else{
  29459           sqlite3_fprintf(stderr,"Error: ambiguous file-control: \"%s\"\n"
  29460                 "Use \".filectrl --help\" for help\n", zCmd);
  29461           rc = 1;
  29462           goto meta_command_exit;
  29463         }
  29464       }
  29465     }
  29466     if( filectrl<0 ){
  29467       sqlite3_fprintf(stderr,"Error: unknown file-control: %s\n"
  29468             "Use \".filectrl --help\" for help\n", zCmd);
  29469     }else{
  29470       switch(filectrl){
  29471         case SQLITE_FCNTL_SIZE_LIMIT: {
  29472           if( nArg!=2 && nArg!=3 ) break;
  29473           iRes = nArg==3 ? integerValue(azArg[2]) : -1;
  29474           sqlite3_file_control(p->db, zSchema, SQLITE_FCNTL_SIZE_LIMIT, &iRes);
  29475           isOk = 1;
  29476           break;
  29477         }
  29478         case SQLITE_FCNTL_LOCK_TIMEOUT:
  29479         case SQLITE_FCNTL_CHUNK_SIZE: {
  29480           int x;
  29481           if( nArg!=3 ) break;
  29482           x = (int)integerValue(azArg[2]);
  29483           sqlite3_file_control(p->db, zSchema, filectrl, &x);
  29484           isOk = 2;
  29485           break;
  29486         }
  29487         case SQLITE_FCNTL_PERSIST_WAL:
  29488         case SQLITE_FCNTL_POWERSAFE_OVERWRITE: {
  29489           int x;
  29490           if( nArg!=2 && nArg!=3 ) break;
  29491           x = nArg==3 ? booleanValue(azArg[2]) : -1;
  29492           sqlite3_file_control(p->db, zSchema, filectrl, &x);
  29493           iRes = x;
  29494           isOk = 1;
  29495           break;
  29496         }
  29497         case SQLITE_FCNTL_DATA_VERSION:
  29498         case SQLITE_FCNTL_HAS_MOVED: {
  29499           int x;
  29500           if( nArg!=2 ) break;
  29501           sqlite3_file_control(p->db, zSchema, filectrl, &x);
  29502           iRes = x;
  29503           isOk = 1;
  29504           break;
  29505         }
  29506         case SQLITE_FCNTL_TEMPFILENAME: {
  29507           char *z = 0;
  29508           if( nArg!=2 ) break;
  29509           sqlite3_file_control(p->db, zSchema, filectrl, &z);
  29510           if( z ){
  29511             sqlite3_fprintf(p->out, "%s\n", z);
  29512             sqlite3_free(z);
  29513           }
  29514           isOk = 2;
  29515           break;
  29516         }
  29517         case SQLITE_FCNTL_RESERVE_BYTES: {
  29518           int x;
  29519           if( nArg>=3 ){
  29520             x = atoi(azArg[2]);
  29521             sqlite3_file_control(p->db, zSchema, filectrl, &x);
  29522           }
  29523           x = -1;
  29524           sqlite3_file_control(p->db, zSchema, filectrl, &x);
  29525           sqlite3_fprintf(p->out, "%d\n", x);
  29526           isOk = 2;
  29527           break;
  29528         }
  29529       }
  29530     }
  29531     if( isOk==0 && iCtrl>=0 ){
  29532       sqlite3_fprintf(p->out, "Usage: .filectrl %s %s\n",
  29533                       zCmd, aCtrl[iCtrl].zUsage);
  29534       rc = 1;
  29535     }else if( isOk==1 ){
  29536       char zBuf[100];
  29537       sqlite3_snprintf(sizeof(zBuf), zBuf, "%lld", iRes);
  29538       sqlite3_fprintf(p->out, "%s\n", zBuf);
  29539     }
  29540   }else
  29541 
  29542   if( c=='f' && cli_strncmp(azArg[0], "fullschema", n)==0 ){
  29543     ShellState data;
  29544     int doStats = 0;
  29545     memcpy(&data, p, sizeof(data));
  29546     data.showHeader = 0;
  29547     data.cMode = data.mode = MODE_Semi;
  29548     if( nArg==2 && optionMatch(azArg[1], "indent") ){
  29549       data.cMode = data.mode = MODE_Pretty;
  29550       nArg = 1;
  29551     }
  29552     if( nArg!=1 ){
  29553       eputz("Usage: .fullschema ?--indent?\n");
  29554       rc = 1;
  29555       goto meta_command_exit;
  29556     }
  29557     open_db(p, 0);
  29558     rc = sqlite3_exec(p->db,
  29559        "SELECT sql FROM"
  29560        "  (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
  29561        "     FROM sqlite_schema UNION ALL"
  29562        "   SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_schema) "
  29563        "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
  29564        "ORDER BY x",
  29565        callback, &data, 0
  29566     );
  29567     if( rc==SQLITE_OK ){
  29568       sqlite3_stmt *pStmt;
  29569       rc = sqlite3_prepare_v2(p->db,
  29570                "SELECT rowid FROM sqlite_schema"
  29571                " WHERE name GLOB 'sqlite_stat[134]'",
  29572                -1, &pStmt, 0);
  29573       if( rc==SQLITE_OK ){
  29574         doStats = sqlite3_step(pStmt)==SQLITE_ROW;
  29575         sqlite3_finalize(pStmt);
  29576       }
  29577     }
  29578     if( doStats==0 ){
  29579       sqlite3_fputs("/* No STAT tables available */\n", p->out);
  29580     }else{
  29581       sqlite3_fputs("ANALYZE sqlite_schema;\n", p->out);
  29582       data.cMode = data.mode = MODE_Insert;
  29583       data.zDestTable = "sqlite_stat1";
  29584       shell_exec(&data, "SELECT * FROM sqlite_stat1", 0);
  29585       data.zDestTable = "sqlite_stat4";
  29586       shell_exec(&data, "SELECT * FROM sqlite_stat4", 0);
  29587       sqlite3_fputs("ANALYZE sqlite_schema;\n", p->out);
  29588     }
  29589   }else
  29590 
  29591   if( c=='h' && cli_strncmp(azArg[0], "headers", n)==0 ){
  29592     if( nArg==2 ){
  29593       p->showHeader = booleanValue(azArg[1]);
  29594       p->shellFlgs |= SHFLG_HeaderSet;
  29595     }else{
  29596       eputz("Usage: .headers on|off\n");
  29597       rc = 1;
  29598     }
  29599   }else
  29600 
  29601   if( c=='h' && cli_strncmp(azArg[0], "help", n)==0 ){
  29602     if( nArg>=2 ){
  29603       n = showHelp(p->out, azArg[1]);
  29604       if( n==0 ){
  29605         sqlite3_fprintf(p->out, "Nothing matches '%s'\n", azArg[1]);
  29606       }
  29607     }else{
  29608       showHelp(p->out, 0);
  29609     }
  29610   }else
  29611 
  29612 #ifndef SQLITE_SHELL_FIDDLE
  29613   if( c=='i' && cli_strncmp(azArg[0], "import", n)==0 ){
  29614     char *zTable = 0;           /* Insert data into this table */
  29615     char *zSchema = 0;          /* Schema of zTable */
  29616     char *zFile = 0;            /* Name of file to extra content from */
  29617     sqlite3_stmt *pStmt = NULL; /* A statement */
  29618     int nCol;                   /* Number of columns in the table */
  29619     i64 nByte;                  /* Number of bytes in an SQL string */
  29620     int i, j;                   /* Loop counters */
  29621     int needCommit;             /* True to COMMIT or ROLLBACK at end */
  29622     int nSep;                   /* Number of bytes in p->colSeparator[] */
  29623     char *zSql = 0;             /* An SQL statement */
  29624     ImportCtx sCtx;             /* Reader context */
  29625     char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */
  29626     int eVerbose = 0;           /* Larger for more console output */
  29627     int nSkip = 0;              /* Initial lines to skip */
  29628     int useOutputMode = 1;      /* Use output mode to determine separators */
  29629     char *zCreate = 0;          /* CREATE TABLE statement text */
  29630 
  29631     failIfSafeMode(p, "cannot run .import in safe mode");
  29632     memset(&sCtx, 0, sizeof(sCtx));
  29633     if( p->mode==MODE_Ascii ){
  29634       xRead = ascii_read_one_field;
  29635     }else{
  29636       xRead = csv_read_one_field;
  29637     }
  29638     rc = 1;
  29639     for(i=1; i<nArg; i++){
  29640       char *z = azArg[i];
  29641       if( z[0]=='-' && z[1]=='-' ) z++;
  29642       if( z[0]!='-' ){
  29643         if( zFile==0 ){
  29644           zFile = z;
  29645         }else if( zTable==0 ){
  29646           zTable = z;
  29647         }else{
  29648           sqlite3_fprintf(p->out, "ERROR: extra argument: \"%s\". Usage:\n",z);
  29649           showHelp(p->out, "import");
  29650           goto meta_command_exit;
  29651         }
  29652       }else if( cli_strcmp(z,"-v")==0 ){
  29653         eVerbose++;
  29654       }else if( cli_strcmp(z,"-schema")==0 && i<nArg-1 ){
  29655         zSchema = azArg[++i];
  29656       }else if( cli_strcmp(z,"-skip")==0 && i<nArg-1 ){
  29657         nSkip = integerValue(azArg[++i]);
  29658       }else if( cli_strcmp(z,"-ascii")==0 ){
  29659         sCtx.cColSep = SEP_Unit[0];
  29660         sCtx.cRowSep = SEP_Record[0];
  29661         xRead = ascii_read_one_field;
  29662         useOutputMode = 0;
  29663       }else if( cli_strcmp(z,"-csv")==0 ){
  29664         sCtx.cColSep = ',';
  29665         sCtx.cRowSep = '\n';
  29666         xRead = csv_read_one_field;
  29667         useOutputMode = 0;
  29668       }else{
  29669         sqlite3_fprintf(p->out, "ERROR: unknown option: \"%s\".  Usage:\n", z);
  29670         showHelp(p->out, "import");
  29671         goto meta_command_exit;
  29672       }
  29673     }
  29674     if( zTable==0 ){
  29675       sqlite3_fprintf(p->out, "ERROR: missing %s argument. Usage:\n",
  29676             zFile==0 ? "FILE" : "TABLE");
  29677       showHelp(p->out, "import");
  29678       goto meta_command_exit;
  29679     }
  29680     seenInterrupt = 0;
  29681     open_db(p, 0);
  29682     if( useOutputMode ){
  29683       /* If neither the --csv or --ascii options are specified, then set
  29684       ** the column and row separator characters from the output mode. */
  29685       nSep = strlen30(p->colSeparator);
  29686       if( nSep==0 ){
  29687         eputz("Error: non-null column separator required for import\n");
  29688         goto meta_command_exit;
  29689       }
  29690       if( nSep>1 ){
  29691         eputz("Error: multi-character column separators not allowed"
  29692               " for import\n");
  29693         goto meta_command_exit;
  29694       }
  29695       nSep = strlen30(p->rowSeparator);
  29696       if( nSep==0 ){
  29697         eputz("Error: non-null row separator required for import\n");
  29698         goto meta_command_exit;
  29699       }
  29700       if( nSep==2 && p->mode==MODE_Csv
  29701        && cli_strcmp(p->rowSeparator,SEP_CrLf)==0
  29702       ){
  29703         /* When importing CSV (only), if the row separator is set to the
  29704         ** default output row separator, change it to the default input
  29705         ** row separator.  This avoids having to maintain different input
  29706         ** and output row separators. */
  29707         sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
  29708         nSep = strlen30(p->rowSeparator);
  29709       }
  29710       if( nSep>1 ){
  29711         eputz("Error: multi-character row separators not allowed"
  29712               " for import\n");
  29713         goto meta_command_exit;
  29714       }
  29715       sCtx.cColSep = (u8)p->colSeparator[0];
  29716       sCtx.cRowSep = (u8)p->rowSeparator[0];
  29717     }
  29718     sCtx.zFile = zFile;
  29719     sCtx.nLine = 1;
  29720     if( sCtx.zFile[0]=='|' ){
  29721 #ifdef SQLITE_OMIT_POPEN
  29722       eputz("Error: pipes are not supported in this OS\n");
  29723       goto meta_command_exit;
  29724 #else
  29725       sCtx.in = sqlite3_popen(sCtx.zFile+1, "r");
  29726       sCtx.zFile = "<pipe>";
  29727       sCtx.xCloser = pclose;
  29728 #endif
  29729     }else{
  29730       sCtx.in = sqlite3_fopen(sCtx.zFile, "rb");
  29731       sCtx.xCloser = fclose;
  29732     }
  29733     if( sCtx.in==0 ){
  29734       sqlite3_fprintf(stderr,"Error: cannot open \"%s\"\n", zFile);
  29735       goto meta_command_exit;
  29736     }
  29737     if( eVerbose>=2 || (eVerbose>=1 && useOutputMode) ){
  29738       char zSep[2];
  29739       zSep[1] = 0;
  29740       zSep[0] = sCtx.cColSep;
  29741       sqlite3_fputs("Column separator ", p->out);
  29742       output_c_string(p->out, zSep);
  29743       sqlite3_fputs(", row separator ", p->out);
  29744       zSep[0] = sCtx.cRowSep;
  29745       output_c_string(p->out, zSep);
  29746       sqlite3_fputs("\n", p->out);
  29747     }
  29748     sCtx.z = sqlite3_malloc64(120);
  29749     if( sCtx.z==0 ){
  29750       import_cleanup(&sCtx);
  29751       shell_out_of_memory();
  29752     }
  29753     /* Below, resources must be freed before exit. */
  29754     while( (nSkip--)>0 ){
  29755       while( xRead(&sCtx) && sCtx.cTerm==sCtx.cColSep ){}
  29756     }
  29757     import_append_char(&sCtx, 0);    /* To ensure sCtx.z is allocated */
  29758     if( sqlite3_table_column_metadata(p->db, zSchema, zTable,0,0,0,0,0,0) 
  29759      && 0==db_int(p->db, "SELECT count(*) FROM \"%w\".sqlite_schema"
  29760                          " WHERE name=%Q AND type='view'",
  29761                          zSchema ? zSchema : "main", zTable)
  29762     ){
  29763       /* Table does not exist.  Create it. */
  29764       sqlite3 *dbCols = 0;
  29765       char *zRenames = 0;
  29766       char *zColDefs;
  29767       zCreate = sqlite3_mprintf("CREATE TABLE \"%w\".\"%w\"", 
  29768                     zSchema ? zSchema : "main", zTable);
  29769       while( xRead(&sCtx) ){
  29770         zAutoColumn(sCtx.z, &dbCols, 0);
  29771         if( sCtx.cTerm!=sCtx.cColSep ) break;
  29772       }
  29773       zColDefs = zAutoColumn(0, &dbCols, &zRenames);
  29774       if( zRenames!=0 ){
  29775         sqlite3_fprintf((stdin_is_interactive && p->in==stdin)? p->out : stderr,
  29776               "Columns renamed during .import %s due to duplicates:\n"
  29777               "%s\n", sCtx.zFile, zRenames);
  29778         sqlite3_free(zRenames);
  29779       }
  29780       assert(dbCols==0);
  29781       if( zColDefs==0 ){
  29782         sqlite3_fprintf(stderr,"%s: empty file\n", sCtx.zFile);
  29783         import_cleanup(&sCtx);
  29784         rc = 1;
  29785         sqlite3_free(zCreate);
  29786         goto meta_command_exit;
  29787       }
  29788       zCreate = sqlite3_mprintf("%z%z\n", zCreate, zColDefs);
  29789       if( zCreate==0 ){
  29790         import_cleanup(&sCtx);
  29791         shell_out_of_memory();
  29792       }
  29793       if( eVerbose>=1 ){
  29794         sqlite3_fprintf(p->out, "%s\n", zCreate);
  29795       }
  29796       rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
  29797       if( rc ){
  29798         sqlite3_fprintf(stderr,
  29799              "%s failed:\n%s\n", zCreate, sqlite3_errmsg(p->db));
  29800       }
  29801       sqlite3_free(zCreate);
  29802       zCreate = 0;
  29803       if( rc ){
  29804         import_cleanup(&sCtx);
  29805         rc = 1;
  29806         goto meta_command_exit;
  29807       }
  29808     }
  29809     zSql = sqlite3_mprintf("SELECT count(*) FROM pragma_table_info(%Q,%Q);",
  29810                            zTable, zSchema);
  29811     if( zSql==0 ){
  29812       import_cleanup(&sCtx);
  29813       shell_out_of_memory();
  29814     }
  29815     rc =  sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
  29816     sqlite3_free(zSql);
  29817     zSql = 0;
  29818     if( rc ){
  29819       if (pStmt) sqlite3_finalize(pStmt);
  29820       shellDatabaseError(p->db);
  29821       import_cleanup(&sCtx);
  29822       rc = 1;
  29823       goto meta_command_exit;
  29824     }
  29825     if( sqlite3_step(pStmt)==SQLITE_ROW ){
  29826       nCol = sqlite3_column_int(pStmt, 0);
  29827     }else{
  29828       nCol = 0;
  29829     }
  29830     sqlite3_finalize(pStmt);
  29831     pStmt = 0;
  29832     if( nCol==0 ) return 0; /* no columns, no error */
  29833 
  29834     nByte = 64                 /* space for "INSERT INTO", "VALUES(", ")\0" */
  29835           + (zSchema ? strlen(zSchema)*2 + 2: 0)  /* Quoted schema name */
  29836           + strlen(zTable)*2 + 2                  /* Quoted table name */
  29837           + nCol*2;            /* Space for ",?" for each column */
  29838     zSql = sqlite3_malloc64( nByte );
  29839     if( zSql==0 ){
  29840       import_cleanup(&sCtx);
  29841       shell_out_of_memory();
  29842     }
  29843     if( zSchema ){
  29844       sqlite3_snprintf(nByte, zSql, "INSERT INTO \"%w\".\"%w\" VALUES(?", 
  29845                        zSchema, zTable);
  29846     }else{
  29847       sqlite3_snprintf(nByte, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
  29848     }
  29849     j = strlen30(zSql);
  29850     for(i=1; i<nCol; i++){
  29851       zSql[j++] = ',';
  29852       zSql[j++] = '?';
  29853     }
  29854     zSql[j++] = ')';
  29855     zSql[j] = 0;
  29856     assert( j<nByte );
  29857     if( eVerbose>=2 ){
  29858       sqlite3_fprintf(p->out, "Insert using: %s\n", zSql);
  29859     }
  29860     rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
  29861     sqlite3_free(zSql);
  29862     zSql = 0;
  29863     if( rc ){
  29864       shellDatabaseError(p->db);
  29865       if (pStmt) sqlite3_finalize(pStmt);
  29866       import_cleanup(&sCtx);
  29867       rc = 1;
  29868       goto meta_command_exit;
  29869     }
  29870     needCommit = sqlite3_get_autocommit(p->db);
  29871     if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
  29872     do{
  29873       int startLine = sCtx.nLine;
  29874       for(i=0; i<nCol; i++){
  29875         char *z = xRead(&sCtx);
  29876         /*
  29877         ** Did we reach end-of-file before finding any columns?
  29878         ** If so, stop instead of NULL filling the remaining columns.
  29879         */
  29880         if( z==0 && i==0 ) break;
  29881         /*
  29882         ** Did we reach end-of-file OR end-of-line before finding any
  29883         ** columns in ASCII mode?  If so, stop instead of NULL filling
  29884         ** the remaining columns.
  29885         */
  29886         if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break;
  29887         /*
  29888         ** For CSV mode, per RFC 4180, accept EOF in lieu of final
  29889         ** record terminator but only for last field of multi-field row.
  29890         ** (If there are too few fields, it's not valid CSV anyway.)
  29891         */
  29892         if( z==0 && (xRead==csv_read_one_field) && i==nCol-1 && i>0 ){
  29893           z = "";
  29894         }
  29895         sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
  29896         if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){
  29897           sqlite3_fprintf(stderr,"%s:%d: expected %d columns but found %d"
  29898                 " - filling the rest with NULL\n",
  29899                 sCtx.zFile, startLine, nCol, i+1);
  29900           i += 2;
  29901           while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
  29902         }
  29903       }
  29904       if( sCtx.cTerm==sCtx.cColSep ){
  29905         do{
  29906           xRead(&sCtx);
  29907           i++;
  29908         }while( sCtx.cTerm==sCtx.cColSep );
  29909         sqlite3_fprintf(stderr,
  29910               "%s:%d: expected %d columns but found %d - extras ignored\n",
  29911               sCtx.zFile, startLine, nCol, i);
  29912       }
  29913       if( i>=nCol ){
  29914         sqlite3_step(pStmt);
  29915         rc = sqlite3_reset(pStmt);
  29916         if( rc!=SQLITE_OK ){
  29917           sqlite3_fprintf(stderr,"%s:%d: INSERT failed: %s\n",
  29918                 sCtx.zFile, startLine, sqlite3_errmsg(p->db));
  29919           sCtx.nErr++;
  29920         }else{
  29921           sCtx.nRow++;
  29922         }
  29923       }
  29924     }while( sCtx.cTerm!=EOF );
  29925 
  29926     import_cleanup(&sCtx);
  29927     sqlite3_finalize(pStmt);
  29928     if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0);
  29929     if( eVerbose>0 ){
  29930       sqlite3_fprintf(p->out,
  29931             "Added %d rows with %d errors using %d lines of input\n",
  29932             sCtx.nRow, sCtx.nErr, sCtx.nLine-1);
  29933     }
  29934   }else
  29935 #endif /* !defined(SQLITE_SHELL_FIDDLE) */
  29936 
  29937 #ifndef SQLITE_UNTESTABLE
  29938   if( c=='i' && cli_strncmp(azArg[0], "imposter", n)==0 ){
  29939     char *zSql;
  29940     char *zCollist = 0;
  29941     sqlite3_stmt *pStmt;
  29942     int tnum = 0;
  29943     int isWO = 0;  /* True if making an imposter of a WITHOUT ROWID table */
  29944     int lenPK = 0; /* Length of the PRIMARY KEY string for isWO tables */
  29945     int i;
  29946     if( !ShellHasFlag(p,SHFLG_TestingMode) ){
  29947       sqlite3_fprintf(stderr,".%s unavailable without --unsafe-testing\n",
  29948             "imposter");
  29949       rc = 1;
  29950       goto meta_command_exit;
  29951     }
  29952     if( !(nArg==3 || (nArg==2 && sqlite3_stricmp(azArg[1],"off")==0)) ){
  29953       eputz("Usage: .imposter INDEX IMPOSTER\n"
  29954             "       .imposter off\n");
  29955       /* Also allowed, but not documented:
  29956       **
  29957       **    .imposter TABLE IMPOSTER
  29958       **
  29959       ** where TABLE is a WITHOUT ROWID table.  In that case, the
  29960       ** imposter is another WITHOUT ROWID table with the columns in
  29961       ** storage order. */
  29962       rc = 1;
  29963       goto meta_command_exit;
  29964     }
  29965     open_db(p, 0);
  29966     if( nArg==2 ){
  29967       sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 1);
  29968       goto meta_command_exit;
  29969     }
  29970     zSql = sqlite3_mprintf(
  29971       "SELECT rootpage, 0 FROM sqlite_schema"
  29972       " WHERE name='%q' AND type='index'"
  29973       "UNION ALL "
  29974       "SELECT rootpage, 1 FROM sqlite_schema"
  29975       " WHERE name='%q' AND type='table'"
  29976       "   AND sql LIKE '%%without%%rowid%%'",
  29977       azArg[1], azArg[1]
  29978     );
  29979     sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
  29980     sqlite3_free(zSql);
  29981     if( sqlite3_step(pStmt)==SQLITE_ROW ){
  29982       tnum = sqlite3_column_int(pStmt, 0);
  29983       isWO = sqlite3_column_int(pStmt, 1);
  29984     }
  29985     sqlite3_finalize(pStmt);
  29986     zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]);
  29987     rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
  29988     sqlite3_free(zSql);
  29989     i = 0;
  29990     while( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
  29991       char zLabel[20];
  29992       const char *zCol = (const char*)sqlite3_column_text(pStmt,2);
  29993       i++;
  29994       if( zCol==0 ){
  29995         if( sqlite3_column_int(pStmt,1)==-1 ){
  29996           zCol = "_ROWID_";
  29997         }else{
  29998           sqlite3_snprintf(sizeof(zLabel),zLabel,"expr%d",i);
  29999           zCol = zLabel;
  30000         }
  30001       }
  30002       if( isWO && lenPK==0 && sqlite3_column_int(pStmt,5)==0 && zCollist ){
  30003         lenPK = (int)strlen(zCollist);
  30004       }
  30005       if( zCollist==0 ){
  30006         zCollist = sqlite3_mprintf("\"%w\"", zCol);
  30007       }else{
  30008         zCollist = sqlite3_mprintf("%z,\"%w\"", zCollist, zCol);
  30009       }
  30010     }
  30011     sqlite3_finalize(pStmt);
  30012     if( i==0 || tnum==0 ){
  30013       sqlite3_fprintf(stderr,"no such index: \"%s\"\n", azArg[1]);
  30014       rc = 1;
  30015       sqlite3_free(zCollist);
  30016       goto meta_command_exit;
  30017     }
  30018     if( lenPK==0 ) lenPK = 100000;
  30019     zSql = sqlite3_mprintf(
  30020           "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%.*s))WITHOUT ROWID",
  30021           azArg[2], zCollist, lenPK, zCollist);
  30022     sqlite3_free(zCollist);
  30023     rc = sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 1, tnum);
  30024     if( rc==SQLITE_OK ){
  30025       rc = sqlite3_exec(p->db, zSql, 0, 0, 0);
  30026       sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 0);
  30027       if( rc ){
  30028         sqlite3_fprintf(stderr,
  30029               "Error in [%s]: %s\n", zSql, sqlite3_errmsg(p->db));
  30030       }else{
  30031         sqlite3_fprintf(stdout, "%s;\n", zSql);
  30032         sqlite3_fprintf(stdout,
  30033               "WARNING: writing to an imposter table will corrupt"
  30034               " the \"%s\" %s!\n", azArg[1], isWO ? "table" : "index");
  30035       }
  30036     }else{
  30037       sqlite3_fprintf(stderr,"SQLITE_TESTCTRL_IMPOSTER returns %d\n", rc);
  30038       rc = 1;
  30039     }
  30040     sqlite3_free(zSql);
  30041   }else
  30042 #endif /* !defined(SQLITE_OMIT_TEST_CONTROL) */
  30043 
  30044   if( c=='i' && cli_strncmp(azArg[0], "intck", n)==0 ){
  30045     i64 iArg = 0;
  30046     if( nArg==2 ){
  30047       iArg = integerValue(azArg[1]);
  30048       if( iArg==0 ) iArg = -1;
  30049     }
  30050     if( (nArg!=1 && nArg!=2) || iArg<0 ){
  30051       sqlite3_fprintf(stderr,"%s","Usage: .intck STEPS_PER_UNLOCK\n");
  30052       rc = 1;
  30053       goto meta_command_exit;
  30054     }
  30055     open_db(p, 0);
  30056     rc = intckDatabaseCmd(p, iArg);
  30057   }else
  30058 
  30059 #ifdef SQLITE_ENABLE_IOTRACE
  30060   if( c=='i' && cli_strncmp(azArg[0], "iotrace", n)==0 ){
  30061     SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...);
  30062     if( iotrace && iotrace!=stdout ) fclose(iotrace);
  30063     iotrace = 0;
  30064     if( nArg<2 ){
  30065       sqlite3IoTrace = 0;
  30066     }else if( cli_strcmp(azArg[1], "-")==0 ){
  30067       sqlite3IoTrace = iotracePrintf;
  30068       iotrace = stdout;
  30069     }else{
  30070       iotrace = sqlite3_fopen(azArg[1], "w");
  30071       if( iotrace==0 ){
  30072         sqlite3_fprintf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
  30073         sqlite3IoTrace = 0;
  30074         rc = 1;
  30075       }else{
  30076         sqlite3IoTrace = iotracePrintf;
  30077       }
  30078     }
  30079   }else
  30080 #endif
  30081 
  30082   if( c=='l' && n>=5 && cli_strncmp(azArg[0], "limits", n)==0 ){
  30083     static const struct {
  30084        const char *zLimitName;   /* Name of a limit */
  30085        int limitCode;            /* Integer code for that limit */
  30086     } aLimit[] = {
  30087       { "length",                SQLITE_LIMIT_LENGTH                    },
  30088       { "sql_length",            SQLITE_LIMIT_SQL_LENGTH                },
  30089       { "column",                SQLITE_LIMIT_COLUMN                    },
  30090       { "expr_depth",            SQLITE_LIMIT_EXPR_DEPTH                },
  30091       { "compound_select",       SQLITE_LIMIT_COMPOUND_SELECT           },
  30092       { "vdbe_op",               SQLITE_LIMIT_VDBE_OP                   },
  30093       { "function_arg",          SQLITE_LIMIT_FUNCTION_ARG              },
  30094       { "attached",              SQLITE_LIMIT_ATTACHED                  },
  30095       { "like_pattern_length",   SQLITE_LIMIT_LIKE_PATTERN_LENGTH       },
  30096       { "variable_number",       SQLITE_LIMIT_VARIABLE_NUMBER           },
  30097       { "trigger_depth",         SQLITE_LIMIT_TRIGGER_DEPTH             },
  30098       { "worker_threads",        SQLITE_LIMIT_WORKER_THREADS            },
  30099     };
  30100     int i, n2;
  30101     open_db(p, 0);
  30102     if( nArg==1 ){
  30103       for(i=0; i<ArraySize(aLimit); i++){
  30104         sqlite3_fprintf(stdout, "%20s %d\n", aLimit[i].zLimitName,
  30105               sqlite3_limit(p->db, aLimit[i].limitCode, -1));
  30106       }
  30107     }else if( nArg>3 ){
  30108       eputz("Usage: .limit NAME ?NEW-VALUE?\n");
  30109       rc = 1;
  30110       goto meta_command_exit;
  30111     }else{
  30112       int iLimit = -1;
  30113       n2 = strlen30(azArg[1]);
  30114       for(i=0; i<ArraySize(aLimit); i++){
  30115         if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){
  30116           if( iLimit<0 ){
  30117             iLimit = i;
  30118           }else{
  30119             sqlite3_fprintf(stderr,"ambiguous limit: \"%s\"\n", azArg[1]);
  30120             rc = 1;
  30121             goto meta_command_exit;
  30122           }
  30123         }
  30124       }
  30125       if( iLimit<0 ){
  30126         sqlite3_fprintf(stderr,"unknown limit: \"%s\"\n"
  30127               "enter \".limits\" with no arguments for a list.\n",
  30128               azArg[1]);
  30129         rc = 1;
  30130         goto meta_command_exit;
  30131       }
  30132       if( nArg==3 ){
  30133         sqlite3_limit(p->db, aLimit[iLimit].limitCode,
  30134                       (int)integerValue(azArg[2]));
  30135       }
  30136       sqlite3_fprintf(stdout, "%20s %d\n", aLimit[iLimit].zLimitName,
  30137             sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1));
  30138     }
  30139   }else
  30140 
  30141   if( c=='l' && n>2 && cli_strncmp(azArg[0], "lint", n)==0 ){
  30142     open_db(p, 0);
  30143     lintDotCommand(p, azArg, nArg);
  30144   }else
  30145 
  30146 #if !defined(SQLITE_OMIT_LOAD_EXTENSION) && !defined(SQLITE_SHELL_FIDDLE)
  30147   if( c=='l' && cli_strncmp(azArg[0], "load", n)==0 ){
  30148     const char *zFile, *zProc;
  30149     char *zErrMsg = 0;
  30150     failIfSafeMode(p, "cannot run .load in safe mode");
  30151     if( nArg<2 || azArg[1][0]==0 ){
  30152       /* Must have a non-empty FILE. (Will not load self.) */
  30153       eputz("Usage: .load FILE ?ENTRYPOINT?\n");
  30154       rc = 1;
  30155       goto meta_command_exit;
  30156     }
  30157     zFile = azArg[1];
  30158     zProc = nArg>=3 ? azArg[2] : 0;
  30159     open_db(p, 0);
  30160     rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
  30161     if( rc!=SQLITE_OK ){
  30162       shellEmitError(zErrMsg);
  30163       sqlite3_free(zErrMsg);
  30164       rc = 1;
  30165     }
  30166   }else
  30167 #endif
  30168 
  30169   if( c=='l' && cli_strncmp(azArg[0], "log", n)==0 ){
  30170     if( nArg!=2 ){
  30171       eputz("Usage: .log FILENAME\n");
  30172       rc = 1;
  30173     }else{
  30174       const char *zFile = azArg[1];
  30175       if( p->bSafeMode
  30176        && cli_strcmp(zFile,"on")!=0
  30177        && cli_strcmp(zFile,"off")!=0
  30178       ){
  30179         sputz(stdout, "cannot set .log to anything other"
  30180               " than \"on\" or \"off\"\n");
  30181         zFile = "off";
  30182       }
  30183       output_file_close(p->pLog);
  30184       if( cli_strcmp(zFile,"on")==0 ) zFile = "stdout";
  30185       p->pLog = output_file_open(zFile);
  30186     }
  30187   }else
  30188 
  30189   if( c=='m' && cli_strncmp(azArg[0], "mode", n)==0 ){
  30190     const char *zMode = 0;
  30191     const char *zTabname = 0;
  30192     int i, n2;
  30193     int chng = 0;       /* 0x01:  change to cmopts.  0x02:  Any other change */
  30194     ColModeOpts cmOpts = ColModeOpts_default;
  30195     for(i=1; i<nArg; i++){
  30196       const char *z = azArg[i];
  30197       if( optionMatch(z,"wrap") && i+1<nArg ){
  30198         cmOpts.iWrap = integerValue(azArg[++i]);
  30199         chng |= 1;
  30200       }else if( optionMatch(z,"ww") ){
  30201         cmOpts.bWordWrap = 1;
  30202         chng |= 1;
  30203       }else if( optionMatch(z,"wordwrap") && i+1<nArg ){
  30204         cmOpts.bWordWrap = (u8)booleanValue(azArg[++i]);
  30205         chng |= 1;
  30206       }else if( optionMatch(z,"quote") ){
  30207         cmOpts.bQuote = 1;
  30208         chng |= 1;
  30209       }else if( optionMatch(z,"noquote") ){
  30210         cmOpts.bQuote = 0;
  30211         chng |= 1;
  30212       }else if( optionMatch(z,"escape") && i+1<nArg ){
  30213         /* See similar code at tag-20250224-1 */
  30214         const char *zEsc = azArg[++i];
  30215         int k;
  30216         for(k=0; k<ArraySize(shell_EscModeNames); k++){
  30217           if( sqlite3_stricmp(zEsc,shell_EscModeNames[k])==0 ){
  30218             p->eEscMode = k;
  30219             chng |= 2;
  30220             break;
  30221           }
  30222         }
  30223         if( k>=ArraySize(shell_EscModeNames) ){
  30224           sqlite3_fprintf(stderr, "unknown control character escape mode \"%s\""
  30225                                   " - choices:", zEsc);
  30226           for(k=0; k<ArraySize(shell_EscModeNames); k++){
  30227             sqlite3_fprintf(stderr, " %s", shell_EscModeNames[k]);
  30228           }
  30229           sqlite3_fprintf(stderr, "\n");
  30230           rc = 1;
  30231           goto meta_command_exit;
  30232         }
  30233       }else if( zMode==0 ){
  30234         zMode = z;
  30235         /* Apply defaults for qbox pseudo-mode.  If that
  30236          * overwrites already-set values, user was informed of this.
  30237          */
  30238         chng |= 1;
  30239         if( cli_strcmp(z, "qbox")==0 ){
  30240           ColModeOpts cmo = ColModeOpts_default_qbox;
  30241           zMode = "box";
  30242           cmOpts = cmo;
  30243         }
  30244       }else if( zTabname==0 ){
  30245         zTabname = z;
  30246       }else if( z[0]=='-' ){
  30247         sqlite3_fprintf(stderr,"unknown option: %s\n", z);
  30248         eputz("options:\n"
  30249               "  --escape MODE\n"
  30250               "  --noquote\n"
  30251               "  --quote\n"
  30252               "  --wordwrap on/off\n"
  30253               "  --wrap N\n"
  30254               "  --ww\n");
  30255         rc = 1;
  30256         goto meta_command_exit;
  30257       }else{
  30258         sqlite3_fprintf(stderr,"extra argument: \"%s\"\n", z);
  30259         rc = 1;
  30260         goto meta_command_exit;
  30261       }
  30262     }
  30263     if( !chng ){
  30264       if( p->mode==MODE_Column
  30265        || (p->mode>=MODE_Markdown && p->mode<=MODE_Box)
  30266       ){
  30267         sqlite3_fprintf(p->out,
  30268               "current output mode: %s --wrap %d --wordwrap %s "
  30269               "--%squote --escape %s\n",
  30270               modeDescr[p->mode], p->cmOpts.iWrap,
  30271               p->cmOpts.bWordWrap ? "on" : "off",
  30272               p->cmOpts.bQuote ? "" : "no",
  30273               shell_EscModeNames[p->eEscMode]
  30274         );
  30275       }else{
  30276         sqlite3_fprintf(p->out,
  30277               "current output mode: %s --escape %s\n",
  30278               modeDescr[p->mode],
  30279               shell_EscModeNames[p->eEscMode]
  30280         );
  30281       }
  30282     }
  30283     if( zMode==0 ){
  30284       zMode = modeDescr[p->mode];
  30285       if( (chng&1)==0 ) cmOpts = p->cmOpts;
  30286     }
  30287     n2 = strlen30(zMode);
  30288     if( cli_strncmp(zMode,"lines",n2)==0 ){
  30289       p->mode = MODE_Line;
  30290       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
  30291     }else if( cli_strncmp(zMode,"columns",n2)==0 ){
  30292       p->mode = MODE_Column;
  30293       if( (p->shellFlgs & SHFLG_HeaderSet)==0 ){
  30294         p->showHeader = 1;
  30295       }
  30296       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
  30297       p->cmOpts = cmOpts;
  30298     }else if( cli_strncmp(zMode,"list",n2)==0 ){
  30299       p->mode = MODE_List;
  30300       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Column);
  30301       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
  30302     }else if( cli_strncmp(zMode,"html",n2)==0 ){
  30303       p->mode = MODE_Html;
  30304     }else if( cli_strncmp(zMode,"tcl",n2)==0 ){
  30305       p->mode = MODE_Tcl;
  30306       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space);
  30307       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
  30308     }else if( cli_strncmp(zMode,"csv",n2)==0 ){
  30309       p->mode = MODE_Csv;
  30310       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
  30311       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
  30312     }else if( cli_strncmp(zMode,"tabs",n2)==0 ){
  30313       p->mode = MODE_List;
  30314       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab);
  30315     }else if( cli_strncmp(zMode,"insert",n2)==0 ){
  30316       p->mode = MODE_Insert;
  30317       set_table_name(p, zTabname ? zTabname : "table");
  30318       if( p->eEscMode==SHELL_ESC_OFF ){
  30319         ShellSetFlag(p, SHFLG_Newlines);
  30320       }else{
  30321         ShellClearFlag(p, SHFLG_Newlines);
  30322       }
  30323     }else if( cli_strncmp(zMode,"quote",n2)==0 ){
  30324       p->mode = MODE_Quote;
  30325       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
  30326       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
  30327     }else if( cli_strncmp(zMode,"ascii",n2)==0 ){
  30328       p->mode = MODE_Ascii;
  30329       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit);
  30330       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record);
  30331     }else if( cli_strncmp(zMode,"markdown",n2)==0 ){
  30332       p->mode = MODE_Markdown;
  30333       p->cmOpts = cmOpts;
  30334     }else if( cli_strncmp(zMode,"table",n2)==0 ){
  30335       p->mode = MODE_Table;
  30336       p->cmOpts = cmOpts;
  30337     }else if( cli_strncmp(zMode,"box",n2)==0 ){
  30338       p->mode = MODE_Box;
  30339       p->cmOpts = cmOpts;
  30340     }else if( cli_strncmp(zMode,"count",n2)==0 ){
  30341       p->mode = MODE_Count;
  30342     }else if( cli_strncmp(zMode,"off",n2)==0 ){
  30343       p->mode = MODE_Off;
  30344     }else if( cli_strncmp(zMode,"json",n2)==0 ){
  30345       p->mode = MODE_Json;
  30346     }else{
  30347       eputz("Error: mode should be one of: "
  30348             "ascii box column csv html insert json line list markdown "
  30349             "qbox quote table tabs tcl\n");
  30350       rc = 1;
  30351     }
  30352     p->cMode = p->mode;
  30353   }else
  30354 
  30355 #ifndef SQLITE_SHELL_FIDDLE
  30356   if( c=='n' && cli_strcmp(azArg[0], "nonce")==0 ){
  30357     if( nArg!=2 ){
  30358       eputz("Usage: .nonce NONCE\n");
  30359       rc = 1;
  30360     }else if( p->zNonce==0 || cli_strcmp(azArg[1],p->zNonce)!=0 ){
  30361       sqlite3_fprintf(stderr,"line %d: incorrect nonce: \"%s\"\n",
  30362             p->lineno, azArg[1]);
  30363       exit(1);
  30364     }else{
  30365       p->bSafeMode = 0;
  30366       return 0;  /* Return immediately to bypass the safe mode reset
  30367                  ** at the end of this procedure */
  30368     }
  30369   }else
  30370 #endif /* !defined(SQLITE_SHELL_FIDDLE) */
  30371 
  30372   if( c=='n' && cli_strncmp(azArg[0], "nullvalue", n)==0 ){
  30373     if( nArg==2 ){
  30374       sqlite3_snprintf(sizeof(p->nullValue), p->nullValue,
  30375                        "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]);
  30376     }else{
  30377       eputz("Usage: .nullvalue STRING\n");
  30378       rc = 1;
  30379     }
  30380   }else
  30381 
  30382   if( c=='o' && cli_strncmp(azArg[0], "open", n)==0 && n>=2 ){
  30383     const char *zFN = 0;     /* Pointer to constant filename */
  30384     char *zNewFilename = 0;  /* Name of the database file to open */
  30385     int iName = 1;           /* Index in azArg[] of the filename */
  30386     int newFlag = 0;         /* True to delete file before opening */
  30387     int openMode = SHELL_OPEN_UNSPEC;
  30388 
  30389     /* Check for command-line arguments */
  30390     for(iName=1; iName<nArg; iName++){
  30391       const char *z = azArg[iName];
  30392 #ifndef SQLITE_SHELL_FIDDLE
  30393       if( optionMatch(z,"new") ){
  30394         newFlag = 1;
  30395 #ifdef SQLITE_HAVE_ZLIB
  30396       }else if( optionMatch(z, "zip") ){
  30397         openMode = SHELL_OPEN_ZIPFILE;
  30398 #endif
  30399       }else if( optionMatch(z, "append") ){
  30400         openMode = SHELL_OPEN_APPENDVFS;
  30401       }else if( optionMatch(z, "readonly") ){
  30402         openMode = SHELL_OPEN_READONLY;
  30403       }else if( optionMatch(z, "nofollow") ){
  30404         p->openFlags |= SQLITE_OPEN_NOFOLLOW;
  30405 #ifndef SQLITE_OMIT_DESERIALIZE
  30406       }else if( optionMatch(z, "deserialize") ){
  30407         openMode = SHELL_OPEN_DESERIALIZE;
  30408       }else if( optionMatch(z, "hexdb") ){
  30409         openMode = SHELL_OPEN_HEXDB;
  30410       }else if( optionMatch(z, "maxsize") && iName+1<nArg ){
  30411         p->szMax = integerValue(azArg[++iName]);
  30412 #endif /* SQLITE_OMIT_DESERIALIZE */
  30413       }else
  30414 #endif /* !SQLITE_SHELL_FIDDLE */
  30415       if( z[0]=='-' ){
  30416         sqlite3_fprintf(stderr,"unknown option: %s\n", z);
  30417         rc = 1;
  30418         goto meta_command_exit;
  30419       }else if( zFN ){
  30420         sqlite3_fprintf(stderr,"extra argument: \"%s\"\n", z);
  30421         rc = 1;
  30422         goto meta_command_exit;
  30423       }else{
  30424         zFN = z;
  30425       }
  30426     }
  30427 
  30428     /* Close the existing database */
  30429     session_close_all(p, -1);
  30430     close_db(p->db);
  30431     p->db = 0;
  30432     p->pAuxDb->zDbFilename = 0;
  30433     sqlite3_free(p->pAuxDb->zFreeOnClose);
  30434     p->pAuxDb->zFreeOnClose = 0;
  30435     p->openMode = openMode;
  30436     p->openFlags = 0;
  30437     p->szMax = 0;
  30438 
  30439     /* If a filename is specified, try to open it first */
  30440     if( zFN || p->openMode==SHELL_OPEN_HEXDB ){
  30441       if( newFlag && zFN && !p->bSafeMode ) shellDeleteFile(zFN);
  30442 #ifndef SQLITE_SHELL_FIDDLE
  30443       if( p->bSafeMode
  30444        && p->openMode!=SHELL_OPEN_HEXDB
  30445        && zFN
  30446        && cli_strcmp(zFN,":memory:")!=0
  30447       ){
  30448         failIfSafeMode(p, "cannot open disk-based database files in safe mode");
  30449       }
  30450 #else
  30451       /* WASM mode has its own sandboxed pseudo-filesystem. */
  30452 #endif
  30453       if( zFN ){
  30454         zNewFilename = sqlite3_mprintf("%s", zFN);
  30455         shell_check_oom(zNewFilename);
  30456       }else{
  30457         zNewFilename = 0;
  30458       }
  30459       p->pAuxDb->zDbFilename = zNewFilename;
  30460       open_db(p, OPEN_DB_KEEPALIVE);
  30461       if( p->db==0 ){
  30462         sqlite3_fprintf(stderr,"Error: cannot open '%s'\n", zNewFilename);
  30463         sqlite3_free(zNewFilename);
  30464       }else{
  30465         p->pAuxDb->zFreeOnClose = zNewFilename;
  30466       }
  30467     }
  30468     if( p->db==0 ){
  30469       /* As a fall-back open a TEMP database */
  30470       p->pAuxDb->zDbFilename = 0;
  30471       open_db(p, 0);
  30472     }
  30473   }else
  30474 
  30475 #ifndef SQLITE_SHELL_FIDDLE
  30476   if( (c=='o'
  30477         && (cli_strncmp(azArg[0], "output", n)==0
  30478             || cli_strncmp(azArg[0], "once", n)==0))
  30479    || (c=='e' && n==5 && cli_strcmp(azArg[0],"excel")==0)
  30480    || (c=='w' && n==3 && cli_strcmp(azArg[0],"www")==0)
  30481   ){
  30482     char *zFile = 0;
  30483     int i;
  30484     int eMode = 0;          /* 0: .outout/.once, 'x'=.excel, 'w'=.www */
  30485     int bOnce = 0;          /* 0: .output, 1: .once, 2: .excel/.www */
  30486     int bPlain = 0;         /* --plain option */
  30487     static const char *zBomUtf8 = "\357\273\277";
  30488     const char *zBom = 0;
  30489 
  30490     failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
  30491     if( c=='e' ){
  30492       eMode = 'x';
  30493       bOnce = 2;
  30494     }else if( c=='w' ){
  30495       eMode = 'w';
  30496       bOnce = 2;
  30497     }else if( cli_strncmp(azArg[0],"once",n)==0 ){
  30498       bOnce = 1;
  30499     }
  30500     for(i=1; i<nArg; i++){
  30501       char *z = azArg[i];
  30502       if( z[0]=='-' ){
  30503         if( z[1]=='-' ) z++;
  30504         if( cli_strcmp(z,"-bom")==0 ){
  30505           zBom = zBomUtf8;
  30506         }else if( cli_strcmp(z,"-plain")==0 ){
  30507           bPlain = 1;
  30508         }else if( c=='o' && cli_strcmp(z,"-x")==0 ){
  30509           eMode = 'x';  /* spreadsheet */
  30510         }else if( c=='o' && cli_strcmp(z,"-e")==0 ){
  30511           eMode = 'e';  /* text editor */
  30512         }else if( c=='o' && cli_strcmp(z,"-w")==0 ){
  30513           eMode = 'w';  /* Web browser */
  30514         }else{
  30515           sqlite3_fprintf(p->out,
  30516                           "ERROR: unknown option: \"%s\". Usage:\n", azArg[i]);
  30517           showHelp(p->out, azArg[0]);
  30518           rc = 1;
  30519           goto meta_command_exit;
  30520         }
  30521       }else if( zFile==0 && eMode==0 ){
  30522         if( cli_strcmp(z, "off")==0 ){
  30523 #ifdef _WIN32
  30524           zFile = sqlite3_mprintf("nul");
  30525 #else
  30526           zFile = sqlite3_mprintf("/dev/null");
  30527 #endif
  30528         }else{
  30529           zFile = sqlite3_mprintf("%s", z);
  30530         }
  30531         if( zFile && zFile[0]=='|' ){
  30532           while( i+1<nArg ) zFile = sqlite3_mprintf("%z %s", zFile, azArg[++i]);
  30533           break;
  30534         }
  30535       }else{
  30536         sqlite3_fprintf(p->out,
  30537             "ERROR: extra parameter: \"%s\".  Usage:\n", azArg[i]);
  30538         showHelp(p->out, azArg[0]);
  30539         rc = 1;
  30540         sqlite3_free(zFile);
  30541         goto meta_command_exit;
  30542       }
  30543     }
  30544     if( zFile==0 ){
  30545       zFile = sqlite3_mprintf("stdout");
  30546     }
  30547     shell_check_oom(zFile);
  30548     if( bOnce ){
  30549       p->outCount = 2;
  30550     }else{
  30551       p->outCount = 0;
  30552     }
  30553     output_reset(p);
  30554 #ifndef SQLITE_NOHAVE_SYSTEM
  30555     if( eMode=='e' || eMode=='x' || eMode=='w' ){
  30556       p->doXdgOpen = 1;
  30557       outputModePush(p);
  30558       if( eMode=='x' ){
  30559         /* spreadsheet mode.  Output as CSV. */
  30560         newTempFile(p, "csv");
  30561         ShellClearFlag(p, SHFLG_Echo);
  30562         p->mode = MODE_Csv;
  30563         sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
  30564         sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
  30565 #ifdef _WIN32
  30566         zBom = zBomUtf8;  /* Always include the BOM on Windows, as Excel does
  30567                           ** not work without it. */
  30568 #endif
  30569       }else if( eMode=='w' ){
  30570         /* web-browser mode. */
  30571         newTempFile(p, "html");
  30572         if( !bPlain ) p->mode = MODE_Www;
  30573       }else{
  30574         /* text editor mode */
  30575         newTempFile(p, "txt");
  30576       }
  30577       sqlite3_free(zFile);
  30578       zFile = sqlite3_mprintf("%s", p->zTempFile);
  30579     }
  30580 #endif /* SQLITE_NOHAVE_SYSTEM */
  30581     shell_check_oom(zFile);
  30582     if( zFile[0]=='|' ){
  30583 #ifdef SQLITE_OMIT_POPEN
  30584       eputz("Error: pipes are not supported in this OS\n");
  30585       rc = 1;
  30586       output_redir(p, stdout);
  30587 #else
  30588       FILE *pfPipe = sqlite3_popen(zFile + 1, "w");
  30589       if( pfPipe==0 ){
  30590         assert( stderr!=NULL );
  30591         sqlite3_fprintf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
  30592         rc = 1;
  30593       }else{
  30594         output_redir(p, pfPipe);
  30595         if( zBom ) sqlite3_fputs(zBom, pfPipe);
  30596         sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
  30597       }
  30598 #endif
  30599     }else{
  30600       FILE *pfFile = output_file_open(zFile);
  30601       if( pfFile==0 ){
  30602         if( cli_strcmp(zFile,"off")!=0 ){
  30603          assert( stderr!=NULL );
  30604          sqlite3_fprintf(stderr,"Error: cannot write to \"%s\"\n", zFile);
  30605         }
  30606         rc = 1;
  30607       } else {
  30608         output_redir(p, pfFile);
  30609         if( zBom ) sqlite3_fputs(zBom, pfFile);
  30610         if( bPlain && eMode=='w' ){
  30611           sqlite3_fputs(
  30612             "<!DOCTYPE html>\n<BODY>\n<PLAINTEXT>\n",
  30613             pfFile
  30614           );
  30615         }
  30616         sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
  30617       }
  30618     }
  30619     sqlite3_free(zFile);
  30620   }else
  30621 #endif /* !defined(SQLITE_SHELL_FIDDLE) */
  30622 
  30623   if( c=='p' && n>=3 && cli_strncmp(azArg[0], "parameter", n)==0 ){
  30624     open_db(p,0);
  30625     if( nArg<=1 ) goto parameter_syntax_error;
  30626 
  30627     /* .parameter clear
  30628     ** Clear all bind parameters by dropping the TEMP table that holds them.
  30629     */
  30630     if( nArg==2 && cli_strcmp(azArg[1],"clear")==0 ){
  30631       sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp.sqlite_parameters;",
  30632                    0, 0, 0);
  30633     }else
  30634 
  30635     /* .parameter list
  30636     ** List all bind parameters.
  30637     */
  30638     if( nArg==2 && cli_strcmp(azArg[1],"list")==0 ){
  30639       sqlite3_stmt *pStmt = 0;
  30640       int rx;
  30641       int len = 0;
  30642       rx = sqlite3_prepare_v2(p->db,
  30643              "SELECT max(length(key)) "
  30644              "FROM temp.sqlite_parameters;", -1, &pStmt, 0);
  30645       if( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
  30646         len = sqlite3_column_int(pStmt, 0);
  30647         if( len>40 ) len = 40;
  30648       }
  30649       sqlite3_finalize(pStmt);
  30650       pStmt = 0;
  30651       if( len ){
  30652         rx = sqlite3_prepare_v2(p->db,
  30653              "SELECT key, quote(value) "
  30654              "FROM temp.sqlite_parameters;", -1, &pStmt, 0);
  30655         while( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
  30656           sqlite3_fprintf(p->out,
  30657                 "%-*s %s\n", len, sqlite3_column_text(pStmt,0),
  30658                 sqlite3_column_text(pStmt,1));
  30659         }
  30660         sqlite3_finalize(pStmt);
  30661       }
  30662     }else
  30663 
  30664     /* .parameter init
  30665     ** Make sure the TEMP table used to hold bind parameters exists.
  30666     ** Create it if necessary.
  30667     */
  30668     if( nArg==2 && cli_strcmp(azArg[1],"init")==0 ){
  30669       bind_table_init(p);
  30670     }else
  30671 
  30672     /* .parameter set NAME VALUE
  30673     ** Set or reset a bind parameter.  NAME should be the full parameter
  30674     ** name exactly as it appears in the query.  (ex: $abc, @def).  The
  30675     ** VALUE can be in either SQL literal notation, or if not it will be
  30676     ** understood to be a text string.
  30677     */
  30678     if( nArg==4 && cli_strcmp(azArg[1],"set")==0 ){
  30679       int rx;
  30680       char *zSql;
  30681       sqlite3_stmt *pStmt;
  30682       const char *zKey = azArg[2];
  30683       const char *zValue = azArg[3];
  30684       bind_table_init(p);
  30685       zSql = sqlite3_mprintf(
  30686                   "REPLACE INTO temp.sqlite_parameters(key,value)"
  30687                   "VALUES(%Q,%s);", zKey, zValue);
  30688       shell_check_oom(zSql);
  30689       pStmt = 0;
  30690       rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
  30691       sqlite3_free(zSql);
  30692       if( rx!=SQLITE_OK ){
  30693         sqlite3_finalize(pStmt);
  30694         pStmt = 0;
  30695         zSql = sqlite3_mprintf(
  30696                    "REPLACE INTO temp.sqlite_parameters(key,value)"
  30697                    "VALUES(%Q,%Q);", zKey, zValue);
  30698         shell_check_oom(zSql);
  30699         rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
  30700         sqlite3_free(zSql);
  30701         if( rx!=SQLITE_OK ){
  30702           sqlite3_fprintf(p->out, "Error: %s\n", sqlite3_errmsg(p->db));
  30703           sqlite3_finalize(pStmt);
  30704           pStmt = 0;
  30705           rc = 1;
  30706         }
  30707       }
  30708       bind_prepared_stmt(p, pStmt);
  30709       sqlite3_step(pStmt);
  30710       sqlite3_finalize(pStmt);
  30711     }else
  30712 
  30713     /* .parameter unset NAME
  30714     ** Remove the NAME binding from the parameter binding table, if it
  30715     ** exists.
  30716     */
  30717     if( nArg==3 && cli_strcmp(azArg[1],"unset")==0 ){
  30718       char *zSql = sqlite3_mprintf(
  30719           "DELETE FROM temp.sqlite_parameters WHERE key=%Q", azArg[2]);
  30720       shell_check_oom(zSql);
  30721       sqlite3_exec(p->db, zSql, 0, 0, 0);
  30722       sqlite3_free(zSql);
  30723     }else
  30724     /* If no command name matches, show a syntax error */
  30725     parameter_syntax_error:
  30726     showHelp(p->out, "parameter");
  30727   }else
  30728 
  30729   if( c=='p' && n>=3 && cli_strncmp(azArg[0], "print", n)==0 ){
  30730     int i;
  30731     for(i=1; i<nArg; i++){
  30732       if( i>1 ) sqlite3_fputs(" ", p->out);
  30733       sqlite3_fputs(azArg[i], p->out);
  30734     }
  30735     sqlite3_fputs("\n", p->out);
  30736   }else
  30737 
  30738 #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
  30739   if( c=='p' && n>=3 && cli_strncmp(azArg[0], "progress", n)==0 ){
  30740     int i;
  30741     int nn = 0;
  30742     p->flgProgress = 0;
  30743     p->mxProgress = 0;
  30744     p->nProgress = 0;
  30745     for(i=1; i<nArg; i++){
  30746       const char *z = azArg[i];
  30747       if( z[0]=='-' ){
  30748         z++;
  30749         if( z[0]=='-' ) z++;
  30750         if( cli_strcmp(z,"quiet")==0 || cli_strcmp(z,"q")==0 ){
  30751           p->flgProgress |= SHELL_PROGRESS_QUIET;
  30752           continue;
  30753         }
  30754         if( cli_strcmp(z,"reset")==0 ){
  30755           p->flgProgress |= SHELL_PROGRESS_RESET;
  30756           continue;
  30757         }
  30758         if( cli_strcmp(z,"once")==0 ){
  30759           p->flgProgress |= SHELL_PROGRESS_ONCE;
  30760           continue;
  30761         }
  30762         if( cli_strcmp(z,"limit")==0 ){
  30763           if( i+1>=nArg ){
  30764             eputz("Error: missing argument on --limit\n");
  30765             rc = 1;
  30766             goto meta_command_exit;
  30767           }else{
  30768             p->mxProgress = (int)integerValue(azArg[++i]);
  30769           }
  30770           continue;
  30771         }
  30772         sqlite3_fprintf(stderr,"Error: unknown option: \"%s\"\n", azArg[i]);
  30773         rc = 1;
  30774         goto meta_command_exit;
  30775       }else{
  30776         nn = (int)integerValue(z);
  30777       }
  30778     }
  30779     open_db(p, 0);
  30780     sqlite3_progress_handler(p->db, nn, progress_handler, p);
  30781   }else
  30782 #endif /* SQLITE_OMIT_PROGRESS_CALLBACK */
  30783 
  30784   if( c=='p' && cli_strncmp(azArg[0], "prompt", n)==0 ){
  30785     if( nArg >= 2) {
  30786       shell_strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
  30787     }
  30788     if( nArg >= 3) {
  30789       shell_strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
  30790     }
  30791   }else
  30792 
  30793 #ifndef SQLITE_SHELL_FIDDLE
  30794   if( c=='q' && cli_strncmp(azArg[0], "quit", n)==0 ){
  30795     rc = 2;
  30796   }else
  30797 #endif
  30798 
  30799 #ifndef SQLITE_SHELL_FIDDLE
  30800   if( c=='r' && n>=3 && cli_strncmp(azArg[0], "read", n)==0 ){
  30801     FILE *inSaved = p->in;
  30802     int savedLineno = p->lineno;
  30803     failIfSafeMode(p, "cannot run .read in safe mode");
  30804     if( nArg!=2 ){
  30805       eputz("Usage: .read FILE\n");
  30806       rc = 1;
  30807       goto meta_command_exit;
  30808     }
  30809     if( azArg[1][0]=='|' ){
  30810 #ifdef SQLITE_OMIT_POPEN
  30811       eputz("Error: pipes are not supported in this OS\n");
  30812       rc = 1;
  30813 #else
  30814       p->in = sqlite3_popen(azArg[1]+1, "r");
  30815       if( p->in==0 ){
  30816         sqlite3_fprintf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
  30817         rc = 1;
  30818       }else{
  30819         rc = process_input(p);
  30820         pclose(p->in);
  30821       }
  30822 #endif
  30823     }else if( (p->in = openChrSource(azArg[1]))==0 ){
  30824       sqlite3_fprintf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
  30825       rc = 1;
  30826     }else{
  30827       rc = process_input(p);
  30828       fclose(p->in);
  30829     }
  30830     p->in = inSaved;
  30831     p->lineno = savedLineno;
  30832   }else
  30833 #endif /* !defined(SQLITE_SHELL_FIDDLE) */
  30834 
  30835 #ifndef SQLITE_SHELL_FIDDLE
  30836   if( c=='r' && n>=3 && cli_strncmp(azArg[0], "restore", n)==0 ){
  30837     const char *zSrcFile;
  30838     const char *zDb;
  30839     sqlite3 *pSrc;
  30840     sqlite3_backup *pBackup;
  30841     int nTimeout = 0;
  30842 
  30843     failIfSafeMode(p, "cannot run .restore in safe mode");
  30844     if( nArg==2 ){
  30845       zSrcFile = azArg[1];
  30846       zDb = "main";
  30847     }else if( nArg==3 ){
  30848       zSrcFile = azArg[2];
  30849       zDb = azArg[1];
  30850     }else{
  30851       eputz("Usage: .restore ?DB? FILE\n");
  30852       rc = 1;
  30853       goto meta_command_exit;
  30854     }
  30855     rc = sqlite3_open(zSrcFile, &pSrc);
  30856     if( rc!=SQLITE_OK ){
  30857       sqlite3_fprintf(stderr,"Error: cannot open \"%s\"\n", zSrcFile);
  30858       close_db(pSrc);
  30859       return 1;
  30860     }
  30861     open_db(p, 0);
  30862     pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
  30863     if( pBackup==0 ){
  30864       shellDatabaseError(p->db);
  30865       close_db(pSrc);
  30866       return 1;
  30867     }
  30868     while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
  30869           || rc==SQLITE_BUSY  ){
  30870       if( rc==SQLITE_BUSY ){
  30871         if( nTimeout++ >= 3 ) break;
  30872         sqlite3_sleep(100);
  30873       }
  30874     }
  30875     sqlite3_backup_finish(pBackup);
  30876     if( rc==SQLITE_DONE ){
  30877       rc = 0;
  30878     }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
  30879       eputz("Error: source database is busy\n");
  30880       rc = 1;
  30881     }else{
  30882       shellDatabaseError(p->db);
  30883       rc = 1;
  30884     }
  30885     close_db(pSrc);
  30886   }else
  30887 #endif /* !defined(SQLITE_SHELL_FIDDLE) */
  30888 
  30889   if( c=='s' &&
  30890      (cli_strncmp(azArg[0], "scanstats",  n)==0 ||
  30891       cli_strncmp(azArg[0], "scanstatus", n)==0)
  30892   ){
  30893     if( nArg==2 ){
  30894       if( cli_strcmp(azArg[1], "vm")==0 ){
  30895         p->scanstatsOn = 3;
  30896       }else
  30897       if( cli_strcmp(azArg[1], "est")==0 ){
  30898         p->scanstatsOn = 2;
  30899       }else{
  30900         p->scanstatsOn = (u8)booleanValue(azArg[1]);
  30901       }
  30902       open_db(p, 0);
  30903       sqlite3_db_config(
  30904           p->db, SQLITE_DBCONFIG_STMT_SCANSTATUS, p->scanstatsOn, (int*)0
  30905       );
  30906 #if !defined(SQLITE_ENABLE_STMT_SCANSTATUS)
  30907       eputz("Warning: .scanstats not available in this build.\n");
  30908 #elif !defined(SQLITE_ENABLE_BYTECODE_VTAB)
  30909       if( p->scanstatsOn==3 ){
  30910         eputz("Warning: \".scanstats vm\" not available in this build.\n");
  30911       }
  30912 #endif
  30913     }else{
  30914       eputz("Usage: .scanstats on|off|est\n");
  30915       rc = 1;
  30916     }
  30917   }else
  30918 
  30919   if( c=='s' && cli_strncmp(azArg[0], "schema", n)==0 ){
  30920     ShellText sSelect;
  30921     ShellState data;
  30922     char *zErrMsg = 0;
  30923     const char *zDiv = "(";
  30924     const char *zName = 0;
  30925     int iSchema = 0;
  30926     int bDebug = 0;
  30927     int bNoSystemTabs = 0;
  30928     int ii;
  30929 
  30930     open_db(p, 0);
  30931     memcpy(&data, p, sizeof(data));
  30932     data.showHeader = 0;
  30933     data.cMode = data.mode = MODE_Semi;
  30934     initText(&sSelect);
  30935     for(ii=1; ii<nArg; ii++){
  30936       if( optionMatch(azArg[ii],"indent") ){
  30937         data.cMode = data.mode = MODE_Pretty;
  30938       }else if( optionMatch(azArg[ii],"debug") ){
  30939         bDebug = 1;
  30940       }else if( optionMatch(azArg[ii],"nosys") ){
  30941         bNoSystemTabs = 1;
  30942       }else if( azArg[ii][0]=='-' ){
  30943         sqlite3_fprintf(stderr,"Unknown option: \"%s\"\n", azArg[ii]);
  30944         rc = 1;
  30945         goto meta_command_exit;
  30946       }else if( zName==0 ){
  30947         zName = azArg[ii];
  30948       }else{
  30949         eputz("Usage: .schema ?--indent? ?--nosys? ?LIKE-PATTERN?\n");
  30950         rc = 1;
  30951         goto meta_command_exit;
  30952       }
  30953     }
  30954     if( zName!=0 ){
  30955       int isSchema = sqlite3_strlike(zName, "sqlite_master", '\\')==0
  30956                   || sqlite3_strlike(zName, "sqlite_schema", '\\')==0
  30957                   || sqlite3_strlike(zName,"sqlite_temp_master", '\\')==0
  30958                   || sqlite3_strlike(zName,"sqlite_temp_schema", '\\')==0;
  30959       if( isSchema ){
  30960         char *new_argv[2], *new_colv[2];
  30961         new_argv[0] = sqlite3_mprintf(
  30962                       "CREATE TABLE %s (\n"
  30963                       "  type text,\n"
  30964                       "  name text,\n"
  30965                       "  tbl_name text,\n"
  30966                       "  rootpage integer,\n"
  30967                       "  sql text\n"
  30968                       ")", zName);
  30969         shell_check_oom(new_argv[0]);
  30970         new_argv[1] = 0;
  30971         new_colv[0] = "sql";
  30972         new_colv[1] = 0;
  30973         callback(&data, 1, new_argv, new_colv);
  30974         sqlite3_free(new_argv[0]);
  30975       }
  30976     }
  30977     if( zDiv ){
  30978       sqlite3_stmt *pStmt = 0;
  30979       rc = sqlite3_prepare_v2(p->db, "SELECT name FROM pragma_database_list",
  30980                               -1, &pStmt, 0);
  30981       if( rc ){
  30982         shellDatabaseError(p->db);
  30983         sqlite3_finalize(pStmt);
  30984         rc = 1;
  30985         goto meta_command_exit;
  30986       }
  30987       appendText(&sSelect, "SELECT sql FROM", 0);
  30988       iSchema = 0;
  30989       while( sqlite3_step(pStmt)==SQLITE_ROW ){
  30990         const char *zDb = (const char*)sqlite3_column_text(pStmt, 0);
  30991         char zScNum[30];
  30992         sqlite3_snprintf(sizeof(zScNum), zScNum, "%d", ++iSchema);
  30993         appendText(&sSelect, zDiv, 0);
  30994         zDiv = " UNION ALL ";
  30995         appendText(&sSelect, "SELECT shell_add_schema(sql,", 0);
  30996         if( sqlite3_stricmp(zDb, "main")!=0 ){
  30997           appendText(&sSelect, zDb, '\'');
  30998         }else{
  30999           appendText(&sSelect, "NULL", 0);
  31000         }
  31001         appendText(&sSelect, ",name) AS sql, type, tbl_name, name, rowid,", 0);
  31002         appendText(&sSelect, zScNum, 0);
  31003         appendText(&sSelect, " AS snum, ", 0);
  31004         appendText(&sSelect, zDb, '\'');
  31005         appendText(&sSelect, " AS sname FROM ", 0);
  31006         appendText(&sSelect, zDb, quoteChar(zDb));
  31007         appendText(&sSelect, ".sqlite_schema", 0);
  31008       }
  31009       sqlite3_finalize(pStmt);
  31010 #ifndef SQLITE_OMIT_INTROSPECTION_PRAGMAS
  31011       if( zName ){
  31012         appendText(&sSelect,
  31013            " UNION ALL SELECT shell_module_schema(name),"
  31014            " 'table', name, name, name, 9e+99, 'main' FROM pragma_module_list",
  31015         0);
  31016       }
  31017 #endif
  31018       appendText(&sSelect, ") WHERE ", 0);
  31019       if( zName ){
  31020         char *zQarg = sqlite3_mprintf("%Q", zName);
  31021         int bGlob;
  31022         shell_check_oom(zQarg);
  31023         bGlob = strchr(zName, '*') != 0 || strchr(zName, '?') != 0 ||
  31024                 strchr(zName, '[') != 0;
  31025         if( strchr(zName, '.') ){
  31026           appendText(&sSelect, "lower(printf('%s.%s',sname,tbl_name))", 0);
  31027         }else{
  31028           appendText(&sSelect, "lower(tbl_name)", 0);
  31029         }
  31030         appendText(&sSelect, bGlob ? " GLOB " : " LIKE ", 0);
  31031         appendText(&sSelect, zQarg, 0);
  31032         if( !bGlob ){
  31033           appendText(&sSelect, " ESCAPE '\\' ", 0);
  31034         }
  31035         appendText(&sSelect, " AND ", 0);
  31036         sqlite3_free(zQarg);
  31037       }
  31038       if( bNoSystemTabs ){
  31039         appendText(&sSelect, "name NOT LIKE 'sqlite_%%' AND ", 0);
  31040       }
  31041       appendText(&sSelect, "sql IS NOT NULL"
  31042                            " ORDER BY snum, rowid", 0);
  31043       if( bDebug ){
  31044         sqlite3_fprintf(p->out, "SQL: %s;\n", sSelect.z);
  31045       }else{
  31046         rc = sqlite3_exec(p->db, sSelect.z, callback, &data, &zErrMsg);
  31047       }
  31048       freeText(&sSelect);
  31049     }
  31050     if( zErrMsg ){
  31051       shellEmitError(zErrMsg);
  31052       sqlite3_free(zErrMsg);
  31053       rc = 1;
  31054     }else if( rc != SQLITE_OK ){
  31055       eputz("Error: querying schema information\n");
  31056       rc = 1;
  31057     }else{
  31058       rc = 0;
  31059     }
  31060   }else
  31061 
  31062   if( (c=='s' && n==11 && cli_strncmp(azArg[0], "selecttrace", n)==0)
  31063    || (c=='t' && n==9  && cli_strncmp(azArg[0], "treetrace", n)==0)
  31064   ){
  31065     unsigned int x = nArg>=2? (unsigned int)integerValue(azArg[1]) : 0xffffffff;
  31066     sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &x);
  31067   }else
  31068 
  31069 #if defined(SQLITE_ENABLE_SESSION)
  31070   if( c=='s' && cli_strncmp(azArg[0],"session",n)==0 && n>=3 ){
  31071     struct AuxDb *pAuxDb = p->pAuxDb;
  31072     OpenSession *pSession = &pAuxDb->aSession[0];
  31073     char **azCmd = &azArg[1];
  31074     int iSes = 0;
  31075     int nCmd = nArg - 1;
  31076     int i;
  31077     if( nArg<=1 ) goto session_syntax_error;
  31078     open_db(p, 0);
  31079     if( nArg>=3 ){
  31080       for(iSes=0; iSes<pAuxDb->nSession; iSes++){
  31081         if( cli_strcmp(pAuxDb->aSession[iSes].zName, azArg[1])==0 ) break;
  31082       }
  31083       if( iSes<pAuxDb->nSession ){
  31084         pSession = &pAuxDb->aSession[iSes];
  31085         azCmd++;
  31086         nCmd--;
  31087       }else{
  31088         pSession = &pAuxDb->aSession[0];
  31089         iSes = 0;
  31090       }
  31091     }
  31092 
  31093     /* .session attach TABLE
  31094     ** Invoke the sqlite3session_attach() interface to attach a particular
  31095     ** table so that it is never filtered.
  31096     */
  31097     if( cli_strcmp(azCmd[0],"attach")==0 ){
  31098       if( nCmd!=2 ) goto session_syntax_error;
  31099       if( pSession->p==0 ){
  31100         session_not_open:
  31101         eputz("ERROR: No sessions are open\n");
  31102       }else{
  31103         rc = sqlite3session_attach(pSession->p, azCmd[1]);
  31104         if( rc ){
  31105           sqlite3_fprintf(stderr,
  31106                "ERROR: sqlite3session_attach() returns %d\n",rc);
  31107           rc = 0;
  31108         }
  31109       }
  31110     }else
  31111 
  31112     /* .session changeset FILE
  31113     ** .session patchset FILE
  31114     ** Write a changeset or patchset into a file.  The file is overwritten.
  31115     */
  31116     if( cli_strcmp(azCmd[0],"changeset")==0
  31117      || cli_strcmp(azCmd[0],"patchset")==0
  31118     ){
  31119       FILE *out = 0;
  31120       failIfSafeMode(p, "cannot run \".session %s\" in safe mode", azCmd[0]);
  31121       if( nCmd!=2 ) goto session_syntax_error;
  31122       if( pSession->p==0 ) goto session_not_open;
  31123       out = sqlite3_fopen(azCmd[1], "wb");
  31124       if( out==0 ){
  31125         sqlite3_fprintf(stderr,"ERROR: cannot open \"%s\" for writing\n",
  31126               azCmd[1]);
  31127       }else{
  31128         int szChng;
  31129         void *pChng;
  31130         if( azCmd[0][0]=='c' ){
  31131           rc = sqlite3session_changeset(pSession->p, &szChng, &pChng);
  31132         }else{
  31133           rc = sqlite3session_patchset(pSession->p, &szChng, &pChng);
  31134         }
  31135         if( rc ){
  31136           sqlite3_fprintf(stdout, "Error: error code %d\n", rc);
  31137           rc = 0;
  31138         }
  31139         if( pChng
  31140           && fwrite(pChng, szChng, 1, out)!=1 ){
  31141           sqlite3_fprintf(stderr,
  31142               "ERROR: Failed to write entire %d-byte output\n", szChng);
  31143         }
  31144         sqlite3_free(pChng);
  31145         fclose(out);
  31146       }
  31147     }else
  31148 
  31149     /* .session close
  31150     ** Close the identified session
  31151     */
  31152     if( cli_strcmp(azCmd[0], "close")==0 ){
  31153       if( nCmd!=1 ) goto session_syntax_error;
  31154       if( pAuxDb->nSession ){
  31155         session_close(pSession);
  31156         pAuxDb->aSession[iSes] = pAuxDb->aSession[--pAuxDb->nSession];
  31157       }
  31158     }else
  31159 
  31160     /* .session enable ?BOOLEAN?
  31161     ** Query or set the enable flag
  31162     */
  31163     if( cli_strcmp(azCmd[0], "enable")==0 ){
  31164       int ii;
  31165       if( nCmd>2 ) goto session_syntax_error;
  31166       ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
  31167       if( pAuxDb->nSession ){
  31168         ii = sqlite3session_enable(pSession->p, ii);
  31169         sqlite3_fprintf(p->out,
  31170             "session %s enable flag = %d\n", pSession->zName, ii);
  31171       }
  31172     }else
  31173 
  31174     /* .session filter GLOB ....
  31175     ** Set a list of GLOB patterns of table names to be excluded.
  31176     */
  31177     if( cli_strcmp(azCmd[0], "filter")==0 ){
  31178       int ii, nByte;
  31179       if( nCmd<2 ) goto session_syntax_error;
  31180       if( pAuxDb->nSession ){
  31181         for(ii=0; ii<pSession->nFilter; ii++){
  31182           sqlite3_free(pSession->azFilter[ii]);
  31183         }
  31184         sqlite3_free(pSession->azFilter);
  31185         nByte = sizeof(pSession->azFilter[0])*(nCmd-1);
  31186         pSession->azFilter = sqlite3_malloc( nByte );
  31187         shell_check_oom( pSession->azFilter );
  31188         for(ii=1; ii<nCmd; ii++){
  31189           char *x = pSession->azFilter[ii-1] = sqlite3_mprintf("%s", azCmd[ii]);
  31190           shell_check_oom(x);
  31191         }
  31192         pSession->nFilter = ii-1;
  31193       }
  31194     }else
  31195 
  31196     /* .session indirect ?BOOLEAN?
  31197     ** Query or set the indirect flag
  31198     */
  31199     if( cli_strcmp(azCmd[0], "indirect")==0 ){
  31200       int ii;
  31201       if( nCmd>2 ) goto session_syntax_error;
  31202       ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
  31203       if( pAuxDb->nSession ){
  31204         ii = sqlite3session_indirect(pSession->p, ii);
  31205         sqlite3_fprintf(p->out,
  31206             "session %s indirect flag = %d\n", pSession->zName, ii);
  31207       }
  31208     }else
  31209 
  31210     /* .session isempty
  31211     ** Determine if the session is empty
  31212     */
  31213     if( cli_strcmp(azCmd[0], "isempty")==0 ){
  31214       int ii;
  31215       if( nCmd!=1 ) goto session_syntax_error;
  31216       if( pAuxDb->nSession ){
  31217         ii = sqlite3session_isempty(pSession->p);
  31218         sqlite3_fprintf(p->out,
  31219              "session %s isempty flag = %d\n", pSession->zName, ii);
  31220       }
  31221     }else
  31222 
  31223     /* .session list
  31224     ** List all currently open sessions
  31225     */
  31226     if( cli_strcmp(azCmd[0],"list")==0 ){
  31227       for(i=0; i<pAuxDb->nSession; i++){
  31228         sqlite3_fprintf(p->out, "%d %s\n", i, pAuxDb->aSession[i].zName);
  31229       }
  31230     }else
  31231 
  31232     /* .session open DB NAME
  31233     ** Open a new session called NAME on the attached database DB.
  31234     ** DB is normally "main".
  31235     */
  31236     if( cli_strcmp(azCmd[0],"open")==0 ){
  31237       char *zName;
  31238       if( nCmd!=3 ) goto session_syntax_error;
  31239       zName = azCmd[2];
  31240       if( zName[0]==0 ) goto session_syntax_error;
  31241       for(i=0; i<pAuxDb->nSession; i++){
  31242         if( cli_strcmp(pAuxDb->aSession[i].zName,zName)==0 ){
  31243           sqlite3_fprintf(stderr,"Session \"%s\" already exists\n", zName);
  31244           goto meta_command_exit;
  31245         }
  31246       }
  31247       if( pAuxDb->nSession>=ArraySize(pAuxDb->aSession) ){
  31248         sqlite3_fprintf(stderr,
  31249            "Maximum of %d sessions\n", ArraySize(pAuxDb->aSession));
  31250         goto meta_command_exit;
  31251       }
  31252       pSession = &pAuxDb->aSession[pAuxDb->nSession];
  31253       rc = sqlite3session_create(p->db, azCmd[1], &pSession->p);
  31254       if( rc ){
  31255         sqlite3_fprintf(stderr,"Cannot open session: error code=%d\n", rc);
  31256         rc = 0;
  31257         goto meta_command_exit;
  31258       }
  31259       pSession->nFilter = 0;
  31260       sqlite3session_table_filter(pSession->p, session_filter, pSession);
  31261       pAuxDb->nSession++;
  31262       pSession->zName = sqlite3_mprintf("%s", zName);
  31263       shell_check_oom(pSession->zName);
  31264     }else
  31265     /* If no command name matches, show a syntax error */
  31266     session_syntax_error:
  31267     showHelp(p->out, "session");
  31268   }else
  31269 #endif
  31270 
  31271 #ifdef SQLITE_DEBUG
  31272   /* Undocumented commands for internal testing.  Subject to change
  31273   ** without notice. */
  31274   if( c=='s' && n>=10 && cli_strncmp(azArg[0], "selftest-", 9)==0 ){
  31275     if( cli_strncmp(azArg[0]+9, "boolean", n-9)==0 ){
  31276       int i, v;
  31277       for(i=1; i<nArg; i++){
  31278         v = booleanValue(azArg[i]);
  31279         sqlite3_fprintf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
  31280       }
  31281     }
  31282     if( cli_strncmp(azArg[0]+9, "integer", n-9)==0 ){
  31283       int i; sqlite3_int64 v;
  31284       for(i=1; i<nArg; i++){
  31285         char zBuf[200];
  31286         v = integerValue(azArg[i]);
  31287         sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
  31288         sqlite3_fputs(zBuf, p->out);
  31289       }
  31290     }
  31291   }else
  31292 #endif
  31293 
  31294   if( c=='s' && n>=4 && cli_strncmp(azArg[0],"selftest",n)==0 ){
  31295     int bIsInit = 0;         /* True to initialize the SELFTEST table */
  31296     int bVerbose = 0;        /* Verbose output */
  31297     int bSelftestExists;     /* True if SELFTEST already exists */
  31298     int i, k;                /* Loop counters */
  31299     int nTest = 0;           /* Number of tests runs */
  31300     int nErr = 0;            /* Number of errors seen */
  31301     ShellText str;           /* Answer for a query */
  31302     sqlite3_stmt *pStmt = 0; /* Query against the SELFTEST table */
  31303 
  31304     open_db(p,0);
  31305     for(i=1; i<nArg; i++){
  31306       const char *z = azArg[i];
  31307       if( z[0]=='-' && z[1]=='-' ) z++;
  31308       if( cli_strcmp(z,"-init")==0 ){
  31309         bIsInit = 1;
  31310       }else
  31311       if( cli_strcmp(z,"-v")==0 ){
  31312         bVerbose++;
  31313       }else
  31314       {
  31315         sqlite3_fprintf(stderr,
  31316               "Unknown option \"%s\" on \"%s\"\n", azArg[i], azArg[0]);
  31317         sqlite3_fputs("Should be one of: --init -v\n", stderr);
  31318         rc = 1;
  31319         goto meta_command_exit;
  31320       }
  31321     }
  31322     if( sqlite3_table_column_metadata(p->db,"main","selftest",0,0,0,0,0,0)
  31323            != SQLITE_OK ){
  31324       bSelftestExists = 0;
  31325     }else{
  31326       bSelftestExists = 1;
  31327     }
  31328     if( bIsInit ){
  31329       createSelftestTable(p);
  31330       bSelftestExists = 1;
  31331     }
  31332     initText(&str);
  31333     appendText(&str, "x", 0);
  31334     for(k=bSelftestExists; k>=0; k--){
  31335       if( k==1 ){
  31336         rc = sqlite3_prepare_v2(p->db,
  31337             "SELECT tno,op,cmd,ans FROM selftest ORDER BY tno",
  31338             -1, &pStmt, 0);
  31339       }else{
  31340         rc = sqlite3_prepare_v2(p->db,
  31341           "VALUES(0,'memo','Missing SELFTEST table - default checks only',''),"
  31342           "      (1,'run','PRAGMA integrity_check','ok')",
  31343           -1, &pStmt, 0);
  31344       }
  31345       if( rc ){
  31346         eputz("Error querying the selftest table\n");
  31347         rc = 1;
  31348         sqlite3_finalize(pStmt);
  31349         goto meta_command_exit;
  31350       }
  31351       for(i=1; sqlite3_step(pStmt)==SQLITE_ROW; i++){
  31352         int tno = sqlite3_column_int(pStmt, 0);
  31353         const char *zOp = (const char*)sqlite3_column_text(pStmt, 1);
  31354         const char *zSql = (const char*)sqlite3_column_text(pStmt, 2);
  31355         const char *zAns = (const char*)sqlite3_column_text(pStmt, 3);
  31356 
  31357         if( zOp==0 ) continue;
  31358         if( zSql==0 ) continue;
  31359         if( zAns==0 ) continue;
  31360         k = 0;
  31361         if( bVerbose>0 ){
  31362           sqlite3_fprintf(stdout, "%d: %s %s\n", tno, zOp, zSql);
  31363         }
  31364         if( cli_strcmp(zOp,"memo")==0 ){
  31365           sqlite3_fprintf(p->out, "%s\n", zSql);
  31366         }else
  31367         if( cli_strcmp(zOp,"run")==0 ){
  31368           char *zErrMsg = 0;
  31369           str.n = 0;
  31370           str.z[0] = 0;
  31371           rc = sqlite3_exec(p->db, zSql, captureOutputCallback, &str, &zErrMsg);
  31372           nTest++;
  31373           if( bVerbose ){
  31374             sqlite3_fprintf(p->out, "Result: %s\n", str.z);
  31375           }
  31376           if( rc || zErrMsg ){
  31377             nErr++;
  31378             rc = 1;
  31379             sqlite3_fprintf(p->out, "%d: error-code-%d: %s\n", tno, rc,zErrMsg);
  31380             sqlite3_free(zErrMsg);
  31381           }else if( cli_strcmp(zAns,str.z)!=0 ){
  31382             nErr++;
  31383             rc = 1;
  31384             sqlite3_fprintf(p->out, "%d: Expected: [%s]\n", tno, zAns);
  31385             sqlite3_fprintf(p->out, "%d:      Got: [%s]\n", tno, str.z);
  31386           }
  31387         }
  31388         else{
  31389           sqlite3_fprintf(stderr,
  31390                 "Unknown operation \"%s\" on selftest line %d\n", zOp, tno);
  31391           rc = 1;
  31392           break;
  31393         }
  31394       } /* End loop over rows of content from SELFTEST */
  31395       sqlite3_finalize(pStmt);
  31396     } /* End loop over k */
  31397     freeText(&str);
  31398     sqlite3_fprintf(p->out, "%d errors out of %d tests\n", nErr, nTest);
  31399   }else
  31400 
  31401   if( c=='s' && cli_strncmp(azArg[0], "separator", n)==0 ){
  31402     if( nArg<2 || nArg>3 ){
  31403       eputz("Usage: .separator COL ?ROW?\n");
  31404       rc = 1;
  31405     }
  31406     if( nArg>=2 ){
  31407       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator,
  31408                        "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]);
  31409     }
  31410     if( nArg>=3 ){
  31411       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator,
  31412                        "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]);
  31413     }
  31414   }else
  31415 
  31416   if( c=='s' && n>=4 && cli_strncmp(azArg[0],"sha3sum",n)==0 ){
  31417     const char *zLike = 0;   /* Which table to checksum. 0 means everything */
  31418     int i;                   /* Loop counter */
  31419     int bSchema = 0;         /* Also hash the schema */
  31420     int bSeparate = 0;       /* Hash each table separately */
  31421     int iSize = 224;         /* Hash algorithm to use */
  31422     int bDebug = 0;          /* Only show the query that would have run */
  31423     sqlite3_stmt *pStmt;     /* For querying tables names */
  31424     char *zSql;              /* SQL to be run */
  31425     char *zSep;              /* Separator */
  31426     ShellText sSql;          /* Complete SQL for the query to run the hash */
  31427     ShellText sQuery;        /* Set of queries used to read all content */
  31428     open_db(p, 0);
  31429     for(i=1; i<nArg; i++){
  31430       const char *z = azArg[i];
  31431       if( z[0]=='-' ){
  31432         z++;
  31433         if( z[0]=='-' ) z++;
  31434         if( cli_strcmp(z,"schema")==0 ){
  31435           bSchema = 1;
  31436         }else
  31437         if( cli_strcmp(z,"sha3-224")==0 || cli_strcmp(z,"sha3-256")==0
  31438          || cli_strcmp(z,"sha3-384")==0 || cli_strcmp(z,"sha3-512")==0
  31439         ){
  31440           iSize = atoi(&z[5]);
  31441         }else
  31442         if( cli_strcmp(z,"debug")==0 ){
  31443           bDebug = 1;
  31444         }else
  31445         {
  31446           sqlite3_fprintf(stderr,
  31447                   "Unknown option \"%s\" on \"%s\"\n", azArg[i], azArg[0]);
  31448           showHelp(p->out, azArg[0]);
  31449           rc = 1;
  31450           goto meta_command_exit;
  31451         }
  31452       }else if( zLike ){
  31453         eputz("Usage: .sha3sum ?OPTIONS? ?LIKE-PATTERN?\n");
  31454         rc = 1;
  31455         goto meta_command_exit;
  31456       }else{
  31457         zLike = z;
  31458         bSeparate = 1;
  31459         if( sqlite3_strlike("sqlite\\_%", zLike, '\\')==0 ) bSchema = 1;
  31460       }
  31461     }
  31462     if( bSchema ){
  31463       zSql = "SELECT lower(name) as tname FROM sqlite_schema"
  31464              " WHERE type='table' AND coalesce(rootpage,0)>1"
  31465              " UNION ALL SELECT 'sqlite_schema'"
  31466              " ORDER BY 1 collate nocase";
  31467     }else{
  31468       zSql = "SELECT lower(name) as tname FROM sqlite_schema"
  31469              " WHERE type='table' AND coalesce(rootpage,0)>1"
  31470              " AND name NOT LIKE 'sqlite_%'"
  31471              " ORDER BY 1 collate nocase";
  31472     }
  31473     sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
  31474     initText(&sQuery);
  31475     initText(&sSql);
  31476     appendText(&sSql, "WITH [sha3sum$query](a,b) AS(",0);
  31477     zSep = "VALUES(";
  31478     while( SQLITE_ROW==sqlite3_step(pStmt) ){
  31479       const char *zTab = (const char*)sqlite3_column_text(pStmt,0);
  31480       if( zTab==0 ) continue;
  31481       if( zLike && sqlite3_strlike(zLike, zTab, 0)!=0 ) continue;
  31482       if( cli_strncmp(zTab, "sqlite_",7)!=0 ){
  31483         appendText(&sQuery,"SELECT * FROM ", 0);
  31484         appendText(&sQuery,zTab,'"');
  31485         appendText(&sQuery," NOT INDEXED;", 0);
  31486       }else if( cli_strcmp(zTab, "sqlite_schema")==0 ){
  31487         appendText(&sQuery,"SELECT type,name,tbl_name,sql FROM sqlite_schema"
  31488                            " ORDER BY name;", 0);
  31489       }else if( cli_strcmp(zTab, "sqlite_sequence")==0 ){
  31490         appendText(&sQuery,"SELECT name,seq FROM sqlite_sequence"
  31491                            " ORDER BY name;", 0);
  31492       }else if( cli_strcmp(zTab, "sqlite_stat1")==0 ){
  31493         appendText(&sQuery,"SELECT tbl,idx,stat FROM sqlite_stat1"
  31494                            " ORDER BY tbl,idx;", 0);
  31495       }else if( cli_strcmp(zTab, "sqlite_stat4")==0 ){
  31496         appendText(&sQuery, "SELECT * FROM ", 0);
  31497         appendText(&sQuery, zTab, 0);
  31498         appendText(&sQuery, " ORDER BY tbl, idx, rowid;\n", 0);
  31499       }
  31500       appendText(&sSql, zSep, 0);
  31501       appendText(&sSql, sQuery.z, '\'');
  31502       sQuery.n = 0;
  31503       appendText(&sSql, ",", 0);
  31504       appendText(&sSql, zTab, '\'');
  31505       zSep = "),(";
  31506     }
  31507     sqlite3_finalize(pStmt);
  31508     if( bSeparate ){
  31509       zSql = sqlite3_mprintf(
  31510           "%s))"
  31511           " SELECT lower(hex(sha3_query(a,%d))) AS hash, b AS label"
  31512           "   FROM [sha3sum$query]",
  31513           sSql.z, iSize);
  31514     }else{
  31515       zSql = sqlite3_mprintf(
  31516           "%s))"
  31517           " SELECT lower(hex(sha3_query(group_concat(a,''),%d))) AS hash"
  31518           "   FROM [sha3sum$query]",
  31519           sSql.z, iSize);
  31520     }
  31521     shell_check_oom(zSql);
  31522     freeText(&sQuery);
  31523     freeText(&sSql);
  31524     if( bDebug ){
  31525       sqlite3_fprintf(p->out, "%s\n", zSql);
  31526     }else{
  31527       shell_exec(p, zSql, 0);
  31528     }
  31529 #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) && !defined(SQLITE_OMIT_VIRTUALTABLE)
  31530     {
  31531       int lrc;
  31532       char *zRevText = /* Query for reversible to-blob-to-text check */
  31533         "SELECT lower(name) as tname FROM sqlite_schema\n"
  31534         "WHERE type='table' AND coalesce(rootpage,0)>1\n"
  31535         "AND name NOT LIKE 'sqlite_%%'%s\n"
  31536         "ORDER BY 1 collate nocase";
  31537       zRevText = sqlite3_mprintf(zRevText, zLike? " AND name LIKE $tspec" : "");
  31538       zRevText = sqlite3_mprintf(
  31539           /* lower-case query is first run, producing upper-case query. */
  31540           "with tabcols as materialized(\n"
  31541           "select tname, cname\n"
  31542           "from ("
  31543           " select printf('\"%%w\"',ss.tname) as tname,"
  31544           " printf('\"%%w\"',ti.name) as cname\n"
  31545           " from (%z) ss\n inner join pragma_table_info(tname) ti))\n"
  31546           "select 'SELECT total(bad_text_count) AS bad_text_count\n"
  31547           "FROM ('||group_concat(query, ' UNION ALL ')||')' as btc_query\n"
  31548           " from (select 'SELECT COUNT(*) AS bad_text_count\n"
  31549           "FROM '||tname||' WHERE '\n"
  31550           "||group_concat('CAST(CAST('||cname||' AS BLOB) AS TEXT)<>'||cname\n"
  31551           "|| ' AND typeof('||cname||')=''text'' ',\n"
  31552           "' OR ') as query, tname from tabcols group by tname)"
  31553           , zRevText);
  31554       shell_check_oom(zRevText);
  31555       if( bDebug ) sqlite3_fprintf(p->out, "%s\n", zRevText);
  31556       lrc = sqlite3_prepare_v2(p->db, zRevText, -1, &pStmt, 0);
  31557       if( lrc!=SQLITE_OK ){
  31558         /* assert(lrc==SQLITE_NOMEM); // might also be SQLITE_ERROR if the
  31559         ** user does cruel and unnatural things like ".limit expr_depth 0". */
  31560         rc = 1;
  31561       }else{
  31562         if( zLike ) sqlite3_bind_text(pStmt,1,zLike,-1,SQLITE_STATIC);
  31563         lrc = SQLITE_ROW==sqlite3_step(pStmt);
  31564         if( lrc ){
  31565           const char *zGenQuery = (char*)sqlite3_column_text(pStmt,0);
  31566           sqlite3_stmt *pCheckStmt;
  31567           lrc = sqlite3_prepare_v2(p->db, zGenQuery, -1, &pCheckStmt, 0);
  31568           if( bDebug ) sqlite3_fprintf(p->out, "%s\n", zGenQuery);
  31569           if( lrc!=SQLITE_OK ){
  31570             rc = 1;
  31571           }else{
  31572             if( SQLITE_ROW==sqlite3_step(pCheckStmt) ){
  31573               double countIrreversible = sqlite3_column_double(pCheckStmt, 0);
  31574               if( countIrreversible>0 ){
  31575                 int sz = (int)(countIrreversible + 0.5);
  31576                 sqlite3_fprintf(stderr,
  31577                       "Digest includes %d invalidly encoded text field%s.\n",
  31578                       sz, (sz>1)? "s": "");
  31579               }
  31580             }
  31581             sqlite3_finalize(pCheckStmt);
  31582           }
  31583           sqlite3_finalize(pStmt);
  31584         }
  31585       }
  31586       if( rc ) eputz(".sha3sum failed.\n");
  31587       sqlite3_free(zRevText);
  31588     }
  31589 #endif /* !defined(*_OMIT_SCHEMA_PRAGMAS) && !defined(*_OMIT_VIRTUALTABLE) */
  31590     sqlite3_free(zSql);
  31591   }else
  31592 
  31593 #if !defined(SQLITE_NOHAVE_SYSTEM) && !defined(SQLITE_SHELL_FIDDLE)
  31594   if( c=='s'
  31595    && (cli_strncmp(azArg[0], "shell", n)==0
  31596        || cli_strncmp(azArg[0],"system",n)==0)
  31597   ){
  31598     char *zCmd;
  31599     int i, x;
  31600     failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
  31601     if( nArg<2 ){
  31602       eputz("Usage: .system COMMAND\n");
  31603       rc = 1;
  31604       goto meta_command_exit;
  31605     }
  31606     zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
  31607     for(i=2; i<nArg && zCmd!=0; i++){
  31608       zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
  31609                              zCmd, azArg[i]);
  31610     }
  31611     /*consoleRestore();*/
  31612     x = zCmd!=0 ? system(zCmd) : 1;
  31613     /*consoleRenewSetup();*/
  31614     sqlite3_free(zCmd);
  31615     if( x ) sqlite3_fprintf(stderr,"System command returns %d\n", x);
  31616   }else
  31617 #endif /* !defined(SQLITE_NOHAVE_SYSTEM) && !defined(SQLITE_SHELL_FIDDLE) */
  31618 
  31619   if( c=='s' && cli_strncmp(azArg[0], "show", n)==0 ){
  31620     static const char *azBool[] = { "off", "on", "trigger", "full"};
  31621     const char *zOut;
  31622     int i;
  31623     if( nArg!=1 ){
  31624       eputz("Usage: .show\n");
  31625       rc = 1;
  31626       goto meta_command_exit;
  31627     }
  31628     sqlite3_fprintf(p->out, "%12.12s: %s\n","echo",
  31629           azBool[ShellHasFlag(p, SHFLG_Echo)]);
  31630     sqlite3_fprintf(p->out, "%12.12s: %s\n","eqp", azBool[p->autoEQP&3]);
  31631     sqlite3_fprintf(p->out, "%12.12s: %s\n","explain",
  31632           p->mode==MODE_Explain ? "on" : p->autoExplain ? "auto" : "off");
  31633     sqlite3_fprintf(p->out, "%12.12s: %s\n","headers",
  31634           azBool[p->showHeader!=0]);
  31635     if( p->mode==MODE_Column
  31636      || (p->mode>=MODE_Markdown && p->mode<=MODE_Box)
  31637     ){
  31638       sqlite3_fprintf(p->out,
  31639             "%12.12s: %s --wrap %d --wordwrap %s --%squote\n", "mode",
  31640             modeDescr[p->mode], p->cmOpts.iWrap,
  31641             p->cmOpts.bWordWrap ? "on" : "off",
  31642             p->cmOpts.bQuote ? "" : "no");
  31643     }else{
  31644       sqlite3_fprintf(p->out, "%12.12s: %s\n","mode", modeDescr[p->mode]);
  31645     }
  31646     sqlite3_fprintf(p->out, "%12.12s: ", "nullvalue");
  31647     output_c_string(p->out, p->nullValue);
  31648     sqlite3_fputs("\n", p->out);
  31649     sqlite3_fprintf(p->out, "%12.12s: %s\n","output",
  31650           strlen30(p->outfile) ? p->outfile : "stdout");
  31651     sqlite3_fprintf(p->out, "%12.12s: ", "colseparator");
  31652     output_c_string(p->out, p->colSeparator);
  31653     sqlite3_fputs("\n", p->out);
  31654     sqlite3_fprintf(p->out, "%12.12s: ", "rowseparator");
  31655     output_c_string(p->out, p->rowSeparator);
  31656     sqlite3_fputs("\n", p->out);
  31657     switch( p->statsOn ){
  31658       case 0:  zOut = "off";     break;
  31659       default: zOut = "on";      break;
  31660       case 2:  zOut = "stmt";    break;
  31661       case 3:  zOut = "vmstep";  break;
  31662     }
  31663     sqlite3_fprintf(p->out, "%12.12s: %s\n","stats", zOut);
  31664     sqlite3_fprintf(p->out, "%12.12s: ", "width");
  31665     for (i=0;i<p->nWidth;i++) {
  31666       sqlite3_fprintf(p->out, "%d ", p->colWidth[i]);
  31667     }
  31668     sqlite3_fputs("\n", p->out);
  31669     sqlite3_fprintf(p->out, "%12.12s: %s\n", "filename",
  31670           p->pAuxDb->zDbFilename ? p->pAuxDb->zDbFilename : "");
  31671   }else
  31672 
  31673   if( c=='s' && cli_strncmp(azArg[0], "stats", n)==0 ){
  31674     if( nArg==2 ){
  31675       if( cli_strcmp(azArg[1],"stmt")==0 ){
  31676         p->statsOn = 2;
  31677       }else if( cli_strcmp(azArg[1],"vmstep")==0 ){
  31678         p->statsOn = 3;
  31679       }else{
  31680         p->statsOn = (u8)booleanValue(azArg[1]);
  31681       }
  31682     }else if( nArg==1 ){
  31683       display_stats(p->db, p, 0);
  31684     }else{
  31685       eputz("Usage: .stats ?on|off|stmt|vmstep?\n");
  31686       rc = 1;
  31687     }
  31688   }else
  31689 
  31690   if( (c=='t' && n>1 && cli_strncmp(azArg[0], "tables", n)==0)
  31691    || (c=='i' && (cli_strncmp(azArg[0], "indices", n)==0
  31692                  || cli_strncmp(azArg[0], "indexes", n)==0) )
  31693   ){
  31694     sqlite3_stmt *pStmt;
  31695     char **azResult;
  31696     int nRow, nAlloc;
  31697     int ii;
  31698     ShellText s;
  31699     initText(&s);
  31700     open_db(p, 0);
  31701     rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
  31702     if( rc ){
  31703       sqlite3_finalize(pStmt);
  31704       return shellDatabaseError(p->db);
  31705     }
  31706 
  31707     if( nArg>2 && c=='i' ){
  31708       /* It is an historical accident that the .indexes command shows an error
  31709       ** when called with the wrong number of arguments whereas the .tables
  31710       ** command does not. */
  31711       eputz("Usage: .indexes ?LIKE-PATTERN?\n");
  31712       rc = 1;
  31713       sqlite3_finalize(pStmt);
  31714       goto meta_command_exit;
  31715     }
  31716     for(ii=0; sqlite3_step(pStmt)==SQLITE_ROW; ii++){
  31717       const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
  31718       if( zDbName==0 ) continue;
  31719       if( s.z && s.z[0] ) appendText(&s, " UNION ALL ", 0);
  31720       if( sqlite3_stricmp(zDbName, "main")==0 ){
  31721         appendText(&s, "SELECT name FROM ", 0);
  31722       }else{
  31723         appendText(&s, "SELECT ", 0);
  31724         appendText(&s, zDbName, '\'');
  31725         appendText(&s, "||'.'||name FROM ", 0);
  31726       }
  31727       appendText(&s, zDbName, '"');
  31728       appendText(&s, ".sqlite_schema ", 0);
  31729       if( c=='t' ){
  31730         appendText(&s," WHERE type IN ('table','view')"
  31731                       "   AND name NOT LIKE 'sqlite_%'"
  31732                       "   AND name LIKE ?1", 0);
  31733       }else{
  31734         appendText(&s," WHERE type='index'"
  31735                       "   AND tbl_name LIKE ?1", 0);
  31736       }
  31737     }
  31738     rc = sqlite3_finalize(pStmt);
  31739     if( rc==SQLITE_OK ){
  31740       appendText(&s, " ORDER BY 1", 0);
  31741       rc = sqlite3_prepare_v2(p->db, s.z, -1, &pStmt, 0);
  31742     }
  31743     freeText(&s);
  31744     if( rc ) return shellDatabaseError(p->db);
  31745 
  31746     /* Run the SQL statement prepared by the above block. Store the results
  31747     ** as an array of nul-terminated strings in azResult[].  */
  31748     nRow = nAlloc = 0;
  31749     azResult = 0;
  31750     if( nArg>1 ){
  31751       sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
  31752     }else{
  31753       sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
  31754     }
  31755     while( sqlite3_step(pStmt)==SQLITE_ROW ){
  31756       if( nRow>=nAlloc ){
  31757         char **azNew;
  31758         int n2 = nAlloc*2 + 10;
  31759         azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2);
  31760         shell_check_oom(azNew);
  31761         nAlloc = n2;
  31762         azResult = azNew;
  31763       }
  31764       azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
  31765       shell_check_oom(azResult[nRow]);
  31766       nRow++;
  31767     }
  31768     if( sqlite3_finalize(pStmt)!=SQLITE_OK ){
  31769       rc = shellDatabaseError(p->db);
  31770     }
  31771 
  31772     /* Pretty-print the contents of array azResult[] to the output */
  31773     if( rc==0 && nRow>0 ){
  31774       int len, maxlen = 0;
  31775       int i, j;
  31776       int nPrintCol, nPrintRow;
  31777       for(i=0; i<nRow; i++){
  31778         len = strlen30(azResult[i]);
  31779         if( len>maxlen ) maxlen = len;
  31780       }
  31781       nPrintCol = 80/(maxlen+2);
  31782       if( nPrintCol<1 ) nPrintCol = 1;
  31783       nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
  31784       for(i=0; i<nPrintRow; i++){
  31785         for(j=i; j<nRow; j+=nPrintRow){
  31786           char *zSp = j<nPrintRow ? "" : "  ";
  31787           sqlite3_fprintf(p->out,
  31788                "%s%-*s", zSp, maxlen, azResult[j] ? azResult[j]:"");
  31789         }
  31790         sqlite3_fputs("\n", p->out);
  31791       }
  31792     }
  31793 
  31794     for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
  31795     sqlite3_free(azResult);
  31796   }else
  31797 
  31798 #ifndef SQLITE_SHELL_FIDDLE
  31799   /* Begin redirecting output to the file "testcase-out.txt" */
  31800   if( c=='t' && cli_strcmp(azArg[0],"testcase")==0 ){
  31801     output_reset(p);
  31802     p->out = output_file_open("testcase-out.txt");
  31803     if( p->out==0 ){
  31804       eputz("Error: cannot open 'testcase-out.txt'\n");
  31805     }
  31806     if( nArg>=2 ){
  31807       sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "%s", azArg[1]);
  31808     }else{
  31809       sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "?");
  31810     }
  31811   }else
  31812 #endif /* !defined(SQLITE_SHELL_FIDDLE) */
  31813 
  31814 #ifndef SQLITE_UNTESTABLE
  31815   if( c=='t' && n>=8 && cli_strncmp(azArg[0], "testctrl", n)==0 ){
  31816     static const struct {
  31817        const char *zCtrlName;   /* Name of a test-control option */
  31818        int ctrlCode;            /* Integer code for that option */
  31819        int unSafe;              /* Not valid unless --unsafe-testing */
  31820        const char *zUsage;      /* Usage notes */
  31821     } aCtrl[] = {
  31822     {"always",             SQLITE_TESTCTRL_ALWAYS, 1,     "BOOLEAN"         },
  31823     {"assert",             SQLITE_TESTCTRL_ASSERT, 1,     "BOOLEAN"         },
  31824   /*{"benign_malloc_hooks",SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS,1, ""        },*/
  31825   /*{"bitvec_test",        SQLITE_TESTCTRL_BITVEC_TEST, 1,  ""              },*/
  31826     {"byteorder",          SQLITE_TESTCTRL_BYTEORDER, 0,  ""                },
  31827     {"extra_schema_checks",SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS,0,"BOOLEAN"  },
  31828     {"fault_install",      SQLITE_TESTCTRL_FAULT_INSTALL, 1,"args..."       },
  31829     {"fk_no_action",       SQLITE_TESTCTRL_FK_NO_ACTION, 0, "BOOLEAN"       },
  31830     {"imposter",         SQLITE_TESTCTRL_IMPOSTER,1,"SCHEMA ON/OFF ROOTPAGE"},
  31831     {"internal_functions", SQLITE_TESTCTRL_INTERNAL_FUNCTIONS,0,""          },
  31832     {"json_selfcheck",     SQLITE_TESTCTRL_JSON_SELFCHECK ,0,"BOOLEAN"      },
  31833     {"localtime_fault",    SQLITE_TESTCTRL_LOCALTIME_FAULT,0,"BOOLEAN"      },
  31834     {"never_corrupt",      SQLITE_TESTCTRL_NEVER_CORRUPT,1, "BOOLEAN"       },
  31835     {"optimizations",      SQLITE_TESTCTRL_OPTIMIZATIONS,0,"DISABLE-MASK ..."},
  31836 #ifdef YYCOVERAGE
  31837     {"parser_coverage",    SQLITE_TESTCTRL_PARSER_COVERAGE,0,""             },
  31838 #endif
  31839     {"pending_byte",       SQLITE_TESTCTRL_PENDING_BYTE,1, "OFFSET  "       },
  31840     {"prng_restore",       SQLITE_TESTCTRL_PRNG_RESTORE,0, ""               },
  31841     {"prng_save",          SQLITE_TESTCTRL_PRNG_SAVE,   0, ""               },
  31842     {"prng_seed",          SQLITE_TESTCTRL_PRNG_SEED,   0, "SEED ?db?"      },
  31843     {"seek_count",         SQLITE_TESTCTRL_SEEK_COUNT,  0, ""               },
  31844     {"sorter_mmap",        SQLITE_TESTCTRL_SORTER_MMAP, 0, "NMAX"           },
  31845     {"tune",               SQLITE_TESTCTRL_TUNE,        1, "ID VALUE"       },
  31846     };
  31847     int testctrl = -1;
  31848     int iCtrl = -1;
  31849     int rc2 = 0;    /* 0: usage.  1: %d  2: %x  3: no-output */
  31850     int isOk = 0;
  31851     int i, n2;
  31852     const char *zCmd = 0;
  31853 
  31854     open_db(p, 0);
  31855     zCmd = nArg>=2 ? azArg[1] : "help";
  31856 
  31857     /* The argument can optionally begin with "-" or "--" */
  31858     if( zCmd[0]=='-' && zCmd[1] ){
  31859       zCmd++;
  31860       if( zCmd[0]=='-' && zCmd[1] ) zCmd++;
  31861     }
  31862 
  31863     /* --help lists all test-controls */
  31864     if( cli_strcmp(zCmd,"help")==0 ){
  31865       sqlite3_fputs("Available test-controls:\n", p->out);
  31866       for(i=0; i<ArraySize(aCtrl); i++){
  31867         if( aCtrl[i].unSafe && !ShellHasFlag(p,SHFLG_TestingMode) ) continue;
  31868         sqlite3_fprintf(p->out, "  .testctrl %s %s\n",
  31869               aCtrl[i].zCtrlName, aCtrl[i].zUsage);
  31870       }
  31871       rc = 1;
  31872       goto meta_command_exit;
  31873     }
  31874 
  31875     /* convert testctrl text option to value. allow any unique prefix
  31876     ** of the option name, or a numerical value. */
  31877     n2 = strlen30(zCmd);
  31878     for(i=0; i<ArraySize(aCtrl); i++){
  31879       if( aCtrl[i].unSafe && !ShellHasFlag(p,SHFLG_TestingMode) ) continue;
  31880       if( cli_strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){
  31881         if( testctrl<0 ){
  31882           testctrl = aCtrl[i].ctrlCode;
  31883           iCtrl = i;
  31884         }else{
  31885           sqlite3_fprintf(stderr,"Error: ambiguous test-control: \"%s\"\n"
  31886                 "Use \".testctrl --help\" for help\n", zCmd);
  31887           rc = 1;
  31888           goto meta_command_exit;
  31889         }
  31890       }
  31891     }
  31892     if( testctrl<0 ){
  31893       sqlite3_fprintf(stderr,"Error: unknown test-control: %s\n"
  31894             "Use \".testctrl --help\" for help\n", zCmd);
  31895     }else{
  31896       switch(testctrl){
  31897 
  31898         /* Special processing for .testctrl opt MASK ...
  31899         ** Each MASK argument can be one of:
  31900         **
  31901         **      +LABEL       Enable the named optimization 
  31902         **
  31903         **      -LABEL       Disable the named optimization
  31904         **
  31905         **      INTEGER      Mask of optimizations to disable
  31906         */
  31907         case SQLITE_TESTCTRL_OPTIMIZATIONS: {
  31908           static const struct {
  31909              unsigned int mask;    /* Mask for this optimization */
  31910              unsigned int bDsply;  /* Display this on output */
  31911              const char *zLabel;   /* Name of optimization */
  31912           } aLabel[] = {
  31913             { 0x00000001, 1, "QueryFlattener" },
  31914             { 0x00000001, 0, "Flatten" },
  31915             { 0x00000002, 1, "WindowFunc" },
  31916             { 0x00000004, 1, "GroupByOrder" },
  31917             { 0x00000008, 1, "FactorOutConst" },
  31918             { 0x00000010, 1, "DistinctOpt" },
  31919             { 0x00000020, 1, "CoverIdxScan" },
  31920             { 0x00000040, 1, "OrderByIdxJoin" },
  31921             { 0x00000080, 1, "Transitive" },
  31922             { 0x00000100, 1, "OmitNoopJoin" },
  31923             { 0x00000200, 1, "CountOfView" },
  31924             { 0x00000400, 1, "CurosrHints" },
  31925             { 0x00000800, 1, "Stat4" },
  31926             { 0x00001000, 1, "PushDown" },
  31927             { 0x00002000, 1, "SimplifyJoin" },
  31928             { 0x00004000, 1, "SkipScan" },
  31929             { 0x00008000, 1, "PropagateConst" },
  31930             { 0x00010000, 1, "MinMaxOpt" },
  31931             { 0x00020000, 1, "SeekScan" },
  31932             { 0x00040000, 1, "OmitOrderBy" },
  31933             { 0x00080000, 1, "BloomFilter" },
  31934             { 0x00100000, 1, "BloomPulldown" },
  31935             { 0x00200000, 1, "BalancedMerge" },
  31936             { 0x00400000, 1, "ReleaseReg" },
  31937             { 0x00800000, 1, "FlttnUnionAll" },
  31938             { 0x01000000, 1, "IndexedEXpr" },
  31939             { 0x02000000, 1, "Coroutines" },
  31940             { 0x04000000, 1, "NullUnusedCols" },
  31941             { 0x08000000, 1, "OnePass" },
  31942             { 0x10000000, 1, "OrderBySubq" },
  31943             { 0x20000000, 1, "StarQuery" },
  31944             { 0xffffffff, 0, "All" },
  31945           };
  31946           unsigned int curOpt;
  31947           unsigned int newOpt;
  31948           unsigned int m;
  31949           int ii;
  31950           int nOff;
  31951           sqlite3_test_control(SQLITE_TESTCTRL_GETOPT, p->db, &curOpt);
  31952           newOpt = curOpt;
  31953           for(ii=2; ii<nArg; ii++){
  31954             const char *z = azArg[ii];
  31955             int useLabel = 0;
  31956             const char *zLabel = 0;
  31957             if( (z[0]=='+'|| z[0]=='-') && !IsDigit(z[1]) ){
  31958               useLabel = z[0];
  31959               zLabel = &z[1];
  31960             }else if( !IsDigit(z[0]) && z[0]!=0 && !IsDigit(z[1]) ){
  31961               useLabel = '+';
  31962               zLabel = z;
  31963             }else{
  31964               newOpt = (unsigned int)strtol(z,0,0);
  31965             }
  31966             if( useLabel ){
  31967               int jj;
  31968               for(jj=0; jj<ArraySize(aLabel); jj++){
  31969                 if( sqlite3_stricmp(zLabel, aLabel[jj].zLabel)==0 ) break;
  31970               }
  31971               if( jj>=ArraySize(aLabel) ){
  31972                 sqlite3_fprintf(stderr,
  31973                     "Error: no such optimization: \"%s\"\n", zLabel);
  31974                 sqlite3_fputs("Should be one of:", stderr);
  31975                 for(jj=0; jj<ArraySize(aLabel); jj++){
  31976                   sqlite3_fprintf(stderr," %s", aLabel[jj].zLabel);
  31977                 }
  31978                 sqlite3_fputs("\n", stderr);
  31979                 rc = 1;
  31980                 goto meta_command_exit;
  31981               }
  31982               if( useLabel=='+' ){
  31983                 newOpt &= ~aLabel[jj].mask;
  31984               }else{
  31985                 newOpt |= aLabel[jj].mask;
  31986               }
  31987             }
  31988           }
  31989           if( curOpt!=newOpt ){
  31990             sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS,p->db,newOpt);
  31991           }
  31992           for(ii=nOff=0, m=1; ii<32; ii++, m <<= 1){
  31993             if( m & newOpt ) nOff++;
  31994           }
  31995           if( nOff<12 ){
  31996             sqlite3_fputs("+All", p->out);
  31997             for(ii=0; ii<ArraySize(aLabel); ii++){
  31998               if( !aLabel[ii].bDsply  ) continue;
  31999               if( (newOpt & aLabel[ii].mask)!=0 ){
  32000                 sqlite3_fprintf(p->out, " -%s", aLabel[ii].zLabel);
  32001               }
  32002             }
  32003           }else{
  32004             sqlite3_fputs("-All", p->out);
  32005             for(ii=0; ii<ArraySize(aLabel); ii++){
  32006               if( !aLabel[ii].bDsply  ) continue;
  32007               if( (newOpt & aLabel[ii].mask)==0 ){
  32008                 sqlite3_fprintf(p->out, " +%s", aLabel[ii].zLabel);
  32009               }
  32010             }
  32011           }
  32012           sqlite3_fputs("\n", p->out);
  32013           rc2 = isOk = 3;
  32014           break;
  32015         }
  32016 
  32017         /* sqlite3_test_control(int, db, int) */
  32018         case SQLITE_TESTCTRL_FK_NO_ACTION:
  32019           if( nArg==3 ){
  32020             unsigned int opt = (unsigned int)strtol(azArg[2], 0, 0);
  32021             rc2 = sqlite3_test_control(testctrl, p->db, opt);
  32022             isOk = 3;
  32023           }
  32024           break;
  32025 
  32026         /* sqlite3_test_control(int) */
  32027         case SQLITE_TESTCTRL_PRNG_SAVE:
  32028         case SQLITE_TESTCTRL_PRNG_RESTORE:
  32029         case SQLITE_TESTCTRL_BYTEORDER:
  32030           if( nArg==2 ){
  32031             rc2 = sqlite3_test_control(testctrl);
  32032             isOk = testctrl==SQLITE_TESTCTRL_BYTEORDER ? 1 : 3;
  32033           }
  32034           break;
  32035 
  32036         /* sqlite3_test_control(int, uint) */
  32037         case SQLITE_TESTCTRL_PENDING_BYTE:
  32038           if( nArg==3 ){
  32039             unsigned int opt = (unsigned int)integerValue(azArg[2]);
  32040             rc2 = sqlite3_test_control(testctrl, opt);
  32041             isOk = 3;
  32042           }
  32043           break;
  32044 
  32045         /* sqlite3_test_control(int, int, sqlite3*) */
  32046         case SQLITE_TESTCTRL_PRNG_SEED:
  32047           if( nArg==3 || nArg==4 ){
  32048             int ii = (int)integerValue(azArg[2]);
  32049             sqlite3 *db;
  32050             if( ii==0 && cli_strcmp(azArg[2],"random")==0 ){
  32051               sqlite3_randomness(sizeof(ii),&ii);
  32052               sqlite3_fprintf(stdout, "-- random seed: %d\n", ii);
  32053             }
  32054             if( nArg==3 ){
  32055               db = 0;
  32056             }else{
  32057               db = p->db;
  32058               /* Make sure the schema has been loaded */
  32059               sqlite3_table_column_metadata(db, 0, "x", 0, 0, 0, 0, 0, 0);
  32060             }
  32061             rc2 = sqlite3_test_control(testctrl, ii, db);
  32062             isOk = 3;
  32063           }
  32064           break;
  32065 
  32066         /* sqlite3_test_control(int, int) */
  32067         case SQLITE_TESTCTRL_ASSERT:
  32068         case SQLITE_TESTCTRL_ALWAYS:
  32069           if( nArg==3 ){
  32070             int opt = booleanValue(azArg[2]);
  32071             rc2 = sqlite3_test_control(testctrl, opt);
  32072             isOk = 1;
  32073           }
  32074           break;
  32075 
  32076         /* sqlite3_test_control(int, int) */
  32077         case SQLITE_TESTCTRL_LOCALTIME_FAULT:
  32078         case SQLITE_TESTCTRL_NEVER_CORRUPT:
  32079           if( nArg==3 ){
  32080             int opt = booleanValue(azArg[2]);
  32081             rc2 = sqlite3_test_control(testctrl, opt);
  32082             isOk = 3;
  32083           }
  32084           break;
  32085 
  32086         /* sqlite3_test_control(sqlite3*) */
  32087         case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS:
  32088           rc2 = sqlite3_test_control(testctrl, p->db);
  32089           isOk = 3;
  32090           break;
  32091 
  32092         case SQLITE_TESTCTRL_IMPOSTER:
  32093           if( nArg==5 ){
  32094             rc2 = sqlite3_test_control(testctrl, p->db,
  32095                           azArg[2],
  32096                           integerValue(azArg[3]),
  32097                           integerValue(azArg[4]));
  32098             isOk = 3;
  32099           }
  32100           break;
  32101 
  32102         case SQLITE_TESTCTRL_SEEK_COUNT: {
  32103           u64 x = 0;
  32104           rc2 = sqlite3_test_control(testctrl, p->db, &x);
  32105           sqlite3_fprintf(p->out, "%llu\n", x);
  32106           isOk = 3;
  32107           break;
  32108         }
  32109 
  32110 #ifdef YYCOVERAGE
  32111         case SQLITE_TESTCTRL_PARSER_COVERAGE: {
  32112           if( nArg==2 ){
  32113             sqlite3_test_control(testctrl, p->out);
  32114             isOk = 3;
  32115           }
  32116           break;
  32117         }
  32118 #endif
  32119 #ifdef SQLITE_DEBUG
  32120         case SQLITE_TESTCTRL_TUNE: {
  32121           if( nArg==4 ){
  32122             int id = (int)integerValue(azArg[2]);
  32123             int val = (int)integerValue(azArg[3]);
  32124             sqlite3_test_control(testctrl, id, &val);
  32125             isOk = 3;
  32126           }else if( nArg==3 ){
  32127             int id = (int)integerValue(azArg[2]);
  32128             sqlite3_test_control(testctrl, -id, &rc2);
  32129             isOk = 1;
  32130           }else if( nArg==2 ){
  32131             int id = 1;
  32132             while(1){
  32133               int val = 0;
  32134               rc2 = sqlite3_test_control(testctrl, -id, &val);
  32135               if( rc2!=SQLITE_OK ) break;
  32136               if( id>1 ) sqlite3_fputs("  ", p->out);
  32137               sqlite3_fprintf(p->out, "%d: %d", id, val);
  32138               id++;
  32139             }
  32140             if( id>1 ) sqlite3_fputs("\n", p->out);
  32141             isOk = 3;
  32142           }
  32143           break;
  32144         }
  32145 #endif
  32146         case SQLITE_TESTCTRL_SORTER_MMAP:
  32147           if( nArg==3 ){
  32148             int opt = (unsigned int)integerValue(azArg[2]);
  32149             rc2 = sqlite3_test_control(testctrl, p->db, opt);
  32150             isOk = 3;
  32151           }
  32152           break;
  32153         case SQLITE_TESTCTRL_JSON_SELFCHECK:
  32154           if( nArg==2 ){
  32155             rc2 = -1;
  32156             isOk = 1;
  32157           }else{
  32158             rc2 = booleanValue(azArg[2]);
  32159             isOk = 3;
  32160           }
  32161           sqlite3_test_control(testctrl, &rc2);
  32162           break;
  32163         case SQLITE_TESTCTRL_FAULT_INSTALL: {
  32164           int kk;
  32165           int bShowHelp = nArg<=2;
  32166           isOk = 3;
  32167           for(kk=2; kk<nArg; kk++){
  32168             const char *z = azArg[kk];
  32169             if( z[0]=='-' && z[1]=='-' ) z++;
  32170             if( cli_strcmp(z,"off")==0 ){
  32171               sqlite3_test_control(testctrl, 0);
  32172             }else if( cli_strcmp(z,"on")==0 ){
  32173               faultsim_state.iCnt = faultsim_state.nSkip;
  32174               if( faultsim_state.iErr==0 ) faultsim_state.iErr = 1;
  32175               faultsim_state.nHit = 0;
  32176               sqlite3_test_control(testctrl, faultsim_callback);
  32177             }else if( cli_strcmp(z,"reset")==0 ){
  32178               faultsim_state.iCnt = faultsim_state.nSkip;
  32179               faultsim_state.nHit = 0;
  32180               sqlite3_test_control(testctrl, faultsim_callback);
  32181             }else if( cli_strcmp(z,"status")==0 ){
  32182               sqlite3_fprintf(p->out, "faultsim.iId:       %d\n",
  32183                               faultsim_state.iId);
  32184               sqlite3_fprintf(p->out, "faultsim.iErr:      %d\n",
  32185                               faultsim_state.iErr);
  32186               sqlite3_fprintf(p->out, "faultsim.iCnt:      %d\n",
  32187                               faultsim_state.iCnt);
  32188               sqlite3_fprintf(p->out, "faultsim.nHit:      %d\n",
  32189                               faultsim_state.nHit);
  32190               sqlite3_fprintf(p->out, "faultsim.iInterval: %d\n",
  32191                               faultsim_state.iInterval);
  32192               sqlite3_fprintf(p->out, "faultsim.eVerbose:  %d\n",
  32193                               faultsim_state.eVerbose);
  32194               sqlite3_fprintf(p->out, "faultsim.nRepeat:   %d\n",
  32195                               faultsim_state.nRepeat);
  32196               sqlite3_fprintf(p->out, "faultsim.nSkip:     %d\n",
  32197                               faultsim_state.nSkip);
  32198             }else if( cli_strcmp(z,"-v")==0 ){
  32199               if( faultsim_state.eVerbose<2 ) faultsim_state.eVerbose++;
  32200             }else if( cli_strcmp(z,"-q")==0 ){
  32201               if( faultsim_state.eVerbose>0 ) faultsim_state.eVerbose--;
  32202             }else if( cli_strcmp(z,"-id")==0 && kk+1<nArg ){
  32203               faultsim_state.iId = atoi(azArg[++kk]);
  32204             }else if( cli_strcmp(z,"-errcode")==0 && kk+1<nArg ){
  32205               faultsim_state.iErr = atoi(azArg[++kk]);
  32206             }else if( cli_strcmp(z,"-interval")==0 && kk+1<nArg ){
  32207               faultsim_state.iInterval = atoi(azArg[++kk]);
  32208             }else if( cli_strcmp(z,"-repeat")==0 && kk+1<nArg ){
  32209               faultsim_state.nRepeat = atoi(azArg[++kk]);
  32210            }else if( cli_strcmp(z,"-skip")==0 && kk+1<nArg ){
  32211               faultsim_state.nSkip = atoi(azArg[++kk]);
  32212             }else if( cli_strcmp(z,"-?")==0 || sqlite3_strglob("*help*",z)==0){
  32213               bShowHelp = 1;
  32214             }else{
  32215               sqlite3_fprintf(stderr,
  32216                   "Unrecognized fault_install argument: \"%s\"\n",
  32217                   azArg[kk]);
  32218               rc = 1;
  32219               bShowHelp = 1;
  32220               break;
  32221             }
  32222           }
  32223           if( bShowHelp ){
  32224             sqlite3_fputs(
  32225                "Usage: .testctrl fault_install ARGS\n"
  32226                "Possible arguments:\n"
  32227                "   off               Disable faultsim\n"
  32228                "   on                Activate faultsim\n"
  32229                "   reset             Reset the trigger counter\n"
  32230                "   status            Show current status\n"
  32231                "   -v                Increase verbosity\n"
  32232                "   -q                Decrease verbosity\n"
  32233                "   --errcode N       When triggered, return N as error code\n"
  32234                "   --id ID           Trigger only for the ID specified\n"
  32235                "   --interval N      Trigger only after every N-th call\n"
  32236                "   --repeat N        Turn off after N hits.  0 means never\n"
  32237                "   --skip N          Skip the first N encounters\n"
  32238                ,p->out
  32239             );
  32240           }
  32241           break;
  32242         }
  32243       }
  32244     }
  32245     if( isOk==0 && iCtrl>=0 ){
  32246       sqlite3_fprintf(p->out,
  32247           "Usage: .testctrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage);
  32248       rc = 1;
  32249     }else if( isOk==1 ){
  32250       sqlite3_fprintf(p->out, "%d\n", rc2);
  32251     }else if( isOk==2 ){
  32252       sqlite3_fprintf(p->out, "0x%08x\n", rc2);
  32253     }
  32254   }else
  32255 #endif /* !defined(SQLITE_UNTESTABLE) */
  32256 
  32257   if( c=='t' && n>4 && cli_strncmp(azArg[0], "timeout", n)==0 ){
  32258     open_db(p, 0);
  32259     sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
  32260   }else
  32261 
  32262   if( c=='t' && n>=5 && cli_strncmp(azArg[0], "timer", n)==0 ){
  32263     if( nArg==2 ){
  32264       enableTimer = booleanValue(azArg[1]);
  32265       if( enableTimer && !HAS_TIMER ){
  32266         eputz("Error: timer not available on this system.\n");
  32267         enableTimer = 0;
  32268       }
  32269     }else{
  32270       eputz("Usage: .timer on|off\n");
  32271       rc = 1;
  32272     }
  32273   }else
  32274 
  32275 #ifndef SQLITE_OMIT_TRACE
  32276   if( c=='t' && cli_strncmp(azArg[0], "trace", n)==0 ){
  32277     int mType = 0;
  32278     int jj;
  32279     open_db(p, 0);
  32280     for(jj=1; jj<nArg; jj++){
  32281       const char *z = azArg[jj];
  32282       if( z[0]=='-' ){
  32283         if( optionMatch(z, "expanded") ){
  32284           p->eTraceType = SHELL_TRACE_EXPANDED;
  32285         }
  32286 #ifdef SQLITE_ENABLE_NORMALIZE
  32287         else if( optionMatch(z, "normalized") ){
  32288           p->eTraceType = SHELL_TRACE_NORMALIZED;
  32289         }
  32290 #endif
  32291         else if( optionMatch(z, "plain") ){
  32292           p->eTraceType = SHELL_TRACE_PLAIN;
  32293         }
  32294         else if( optionMatch(z, "profile") ){
  32295           mType |= SQLITE_TRACE_PROFILE;
  32296         }
  32297         else if( optionMatch(z, "row") ){
  32298           mType |= SQLITE_TRACE_ROW;
  32299         }
  32300         else if( optionMatch(z, "stmt") ){
  32301           mType |= SQLITE_TRACE_STMT;
  32302         }
  32303         else if( optionMatch(z, "close") ){
  32304           mType |= SQLITE_TRACE_CLOSE;
  32305         }
  32306         else {
  32307           sqlite3_fprintf(stderr,"Unknown option \"%s\" on \".trace\"\n", z);
  32308           rc = 1;
  32309           goto meta_command_exit;
  32310         }
  32311       }else{
  32312         output_file_close(p->traceOut);
  32313         p->traceOut = output_file_open(z);
  32314       }
  32315     }
  32316     if( p->traceOut==0 ){
  32317       sqlite3_trace_v2(p->db, 0, 0, 0);
  32318     }else{
  32319       if( mType==0 ) mType = SQLITE_TRACE_STMT;
  32320       sqlite3_trace_v2(p->db, mType, sql_trace_callback, p);
  32321     }
  32322   }else
  32323 #endif /* !defined(SQLITE_OMIT_TRACE) */
  32324 
  32325 #if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_VIRTUALTABLE)
  32326   if( c=='u' && cli_strncmp(azArg[0], "unmodule", n)==0 ){
  32327     int ii;
  32328     int lenOpt;
  32329     char *zOpt;
  32330     if( nArg<2 ){
  32331       eputz("Usage: .unmodule [--allexcept] NAME ...\n");
  32332       rc = 1;
  32333       goto meta_command_exit;
  32334     }
  32335     open_db(p, 0);
  32336     zOpt = azArg[1];
  32337     if( zOpt[0]=='-' && zOpt[1]=='-' && zOpt[2]!=0 ) zOpt++;
  32338     lenOpt = (int)strlen(zOpt);
  32339     if( lenOpt>=3 && cli_strncmp(zOpt, "-allexcept",lenOpt)==0 ){
  32340       assert( azArg[nArg]==0 );
  32341       sqlite3_drop_modules(p->db, nArg>2 ? (const char**)(azArg+2) : 0);
  32342     }else{
  32343       for(ii=1; ii<nArg; ii++){
  32344         sqlite3_create_module(p->db, azArg[ii], 0, 0);
  32345       }
  32346     }
  32347   }else
  32348 #endif
  32349 
  32350   if( c=='v' && cli_strncmp(azArg[0], "version", n)==0 ){
  32351     char *zPtrSz = sizeof(void*)==8 ? "64-bit" : "32-bit";
  32352     sqlite3_fprintf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
  32353           sqlite3_libversion(), sqlite3_sourceid());
  32354 #if SQLITE_HAVE_ZLIB
  32355     sqlite3_fprintf(p->out, "zlib version %s\n", zlibVersion());
  32356 #endif
  32357 #define CTIMEOPT_VAL_(opt) #opt
  32358 #define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt)
  32359 #if defined(__clang__) && defined(__clang_major__)
  32360     sqlite3_fprintf(p->out, "clang-" CTIMEOPT_VAL(__clang_major__) "."
  32361           CTIMEOPT_VAL(__clang_minor__) "."
  32362           CTIMEOPT_VAL(__clang_patchlevel__) " (%s)\n", zPtrSz);
  32363 #elif defined(_MSC_VER)
  32364     sqlite3_fprintf(p->out, "msvc-" CTIMEOPT_VAL(_MSC_VER) " (%s)\n", zPtrSz);
  32365 #elif defined(__GNUC__) && defined(__VERSION__)
  32366     sqlite3_fprintf(p->out, "gcc-" __VERSION__ " (%s)\n", zPtrSz);
  32367 #endif
  32368   }else
  32369 
  32370   if( c=='v' && cli_strncmp(azArg[0], "vfsinfo", n)==0 ){
  32371     const char *zDbName = nArg==2 ? azArg[1] : "main";
  32372     sqlite3_vfs *pVfs = 0;
  32373     if( p->db ){
  32374       sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFS_POINTER, &pVfs);
  32375       if( pVfs ){
  32376         sqlite3_fprintf(p->out, "vfs.zName      = \"%s\"\n", pVfs->zName);
  32377         sqlite3_fprintf(p->out, "vfs.iVersion   = %d\n", pVfs->iVersion);
  32378         sqlite3_fprintf(p->out, "vfs.szOsFile   = %d\n", pVfs->szOsFile);
  32379         sqlite3_fprintf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
  32380       }
  32381     }
  32382   }else
  32383 
  32384   if( c=='v' && cli_strncmp(azArg[0], "vfslist", n)==0 ){
  32385     sqlite3_vfs *pVfs;
  32386     sqlite3_vfs *pCurrent = 0;
  32387     if( p->db ){
  32388       sqlite3_file_control(p->db, "main", SQLITE_FCNTL_VFS_POINTER, &pCurrent);
  32389     }
  32390     for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){
  32391       sqlite3_fprintf(p->out, "vfs.zName      = \"%s\"%s\n", pVfs->zName,
  32392             pVfs==pCurrent ? "  <--- CURRENT" : "");
  32393       sqlite3_fprintf(p->out, "vfs.iVersion   = %d\n", pVfs->iVersion);
  32394       sqlite3_fprintf(p->out, "vfs.szOsFile   = %d\n", pVfs->szOsFile);
  32395       sqlite3_fprintf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
  32396       if( pVfs->pNext ){
  32397         sqlite3_fputs("-----------------------------------\n", p->out);
  32398       }
  32399     }
  32400   }else
  32401 
  32402   if( c=='v' && cli_strncmp(azArg[0], "vfsname", n)==0 ){
  32403     const char *zDbName = nArg==2 ? azArg[1] : "main";
  32404     char *zVfsName = 0;
  32405     if( p->db ){
  32406       sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
  32407       if( zVfsName ){
  32408         sqlite3_fprintf(p->out, "%s\n", zVfsName);
  32409         sqlite3_free(zVfsName);
  32410       }
  32411     }
  32412   }else
  32413 
  32414   if( c=='w' && cli_strncmp(azArg[0], "wheretrace", n)==0 ){
  32415     unsigned int x = nArg>=2? (unsigned int)integerValue(azArg[1]) : 0xffffffff;
  32416     sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &x);
  32417   }else
  32418 
  32419   if( c=='w' && cli_strncmp(azArg[0], "width", n)==0 ){
  32420     int j;
  32421     assert( nArg<=ArraySize(azArg) );
  32422     p->nWidth = nArg-1;
  32423     p->colWidth = realloc(p->colWidth, (p->nWidth+1)*sizeof(int)*2);
  32424     if( p->colWidth==0 && p->nWidth>0 ) shell_out_of_memory();
  32425     if( p->nWidth ) p->actualWidth = &p->colWidth[p->nWidth];
  32426     for(j=1; j<nArg; j++){
  32427       p->colWidth[j-1] = (int)integerValue(azArg[j]);
  32428     }
  32429   }else
  32430 
  32431   {
  32432     sqlite3_fprintf(stderr,"Error: unknown command or invalid arguments: "
  32433           " \"%s\". Enter \".help\" for help\n", azArg[0]);
  32434     rc = 1;
  32435   }
  32436 
  32437 meta_command_exit:
  32438   if( p->outCount ){
  32439     p->outCount--;
  32440     if( p->outCount==0 ) output_reset(p);
  32441   }
  32442   p->bSafeMode = p->bSafeModePersist;
  32443   return rc;
  32444 }
  32445 
  32446 /* Line scan result and intermediate states (supporting scan resumption)
  32447 */
  32448 #ifndef CHAR_BIT
  32449 # define CHAR_BIT 8
  32450 #endif
  32451 typedef enum {
  32452   QSS_HasDark = 1<<CHAR_BIT, QSS_EndingSemi = 2<<CHAR_BIT,
  32453   QSS_CharMask = (1<<CHAR_BIT)-1, QSS_ScanMask = 3<<CHAR_BIT,
  32454   QSS_Start = 0
  32455 } QuickScanState;
  32456 #define QSS_SETV(qss, newst) ((newst) | ((qss) & QSS_ScanMask))
  32457 #define QSS_INPLAIN(qss) (((qss)&QSS_CharMask)==QSS_Start)
  32458 #define QSS_PLAINWHITE(qss) (((qss)&~QSS_EndingSemi)==QSS_Start)
  32459 #define QSS_PLAINDARK(qss) (((qss)&~QSS_EndingSemi)==QSS_HasDark)
  32460 #define QSS_SEMITERM(qss) (((qss)&~QSS_HasDark)==QSS_EndingSemi)
  32461 
  32462 /*
  32463 ** Scan line for classification to guide shell's handling.
  32464 ** The scan is resumable for subsequent lines when prior
  32465 ** return values are passed as the 2nd argument.
  32466 */
  32467 static QuickScanState quickscan(char *zLine, QuickScanState qss,
  32468                                 SCAN_TRACKER_REFTYPE pst){
  32469   char cin;
  32470   char cWait = (char)qss; /* intentional narrowing loss */
  32471   if( cWait==0 ){
  32472   PlainScan:
  32473     while( (cin = *zLine++)!=0 ){
  32474       if( IsSpace(cin) )
  32475         continue;
  32476       switch (cin){
  32477       case '-':
  32478         if( *zLine!='-' )
  32479           break;
  32480         while((cin = *++zLine)!=0 )
  32481           if( cin=='\n')
  32482             goto PlainScan;
  32483         return qss;
  32484       case ';':
  32485         qss |= QSS_EndingSemi;
  32486         continue;
  32487       case '/':
  32488         if( *zLine=='*' ){
  32489           ++zLine;
  32490           cWait = '*';
  32491           CONTINUE_PROMPT_AWAITS(pst, "/*");
  32492           qss = QSS_SETV(qss, cWait);
  32493           goto TermScan;
  32494         }
  32495         break;
  32496       case '[':
  32497         cin = ']';
  32498         deliberate_fall_through; /* FALLTHRU */
  32499       case '`': case '\'': case '"':
  32500         cWait = cin;
  32501         qss = QSS_HasDark | cWait;
  32502         CONTINUE_PROMPT_AWAITC(pst, cin);
  32503         goto TermScan;
  32504       case '(':
  32505         CONTINUE_PAREN_INCR(pst, 1);
  32506         break;
  32507       case ')':
  32508         CONTINUE_PAREN_INCR(pst, -1);
  32509         break;
  32510       default:
  32511         break;
  32512       }
  32513       qss = (qss & ~QSS_EndingSemi) | QSS_HasDark;
  32514     }
  32515   }else{
  32516   TermScan:
  32517     while( (cin = *zLine++)!=0 ){
  32518       if( cin==cWait ){
  32519         switch( cWait ){
  32520         case '*':
  32521           if( *zLine != '/' )
  32522             continue;
  32523           ++zLine;
  32524           CONTINUE_PROMPT_AWAITC(pst, 0);
  32525           qss = QSS_SETV(qss, 0);
  32526           goto PlainScan;
  32527         case '`': case '\'': case '"':
  32528           if(*zLine==cWait){
  32529             /* Swallow doubled end-delimiter.*/
  32530             ++zLine;
  32531             continue;
  32532           }
  32533           deliberate_fall_through; /* FALLTHRU */
  32534         case ']':
  32535           CONTINUE_PROMPT_AWAITC(pst, 0);
  32536           qss = QSS_SETV(qss, 0);
  32537           goto PlainScan;
  32538         default: assert(0);
  32539         }
  32540       }
  32541     }
  32542   }
  32543   return qss;
  32544 }
  32545 
  32546 /*
  32547 ** Return TRUE if the line typed in is an SQL command terminator other
  32548 ** than a semi-colon.  The SQL Server style "go" command is understood
  32549 ** as is the Oracle "/".
  32550 */
  32551 static int line_is_command_terminator(char *zLine){
  32552   while( IsSpace(zLine[0]) ){ zLine++; };
  32553   if( zLine[0]=='/' )
  32554     zLine += 1; /* Oracle */
  32555   else if ( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o' )
  32556     zLine += 2; /* SQL Server */
  32557   else
  32558     return 0;
  32559   return quickscan(zLine, QSS_Start, 0)==QSS_Start;
  32560 }
  32561 
  32562 /*
  32563 ** The CLI needs a working sqlite3_complete() to work properly.  So error
  32564 ** out of the build if compiling with SQLITE_OMIT_COMPLETE.
  32565 */
  32566 #ifdef SQLITE_OMIT_COMPLETE
  32567 # error the CLI application is incompatible with SQLITE_OMIT_COMPLETE.
  32568 #endif
  32569 
  32570 /*
  32571 ** Return true if zSql is a complete SQL statement.  Return false if it
  32572 ** ends in the middle of a string literal or C-style comment.
  32573 */
  32574 static int line_is_complete(char *zSql, int nSql){
  32575   int rc;
  32576   if( zSql==0 ) return 1;
  32577   zSql[nSql] = ';';
  32578   zSql[nSql+1] = 0;
  32579   rc = sqlite3_complete(zSql);
  32580   zSql[nSql] = 0;
  32581   return rc;
  32582 }
  32583 
  32584 /*
  32585 ** This function is called after processing each line of SQL in the
  32586 ** runOneSqlLine() function. Its purpose is to detect scenarios where
  32587 ** defensive mode should be automatically turned off. Specifically, when
  32588 **
  32589 **   1. The first line of input is "PRAGMA foreign_keys=OFF;",
  32590 **   2. The second line of input is "BEGIN TRANSACTION;",
  32591 **   3. The database is empty, and
  32592 **   4. The shell is not running in --safe mode.
  32593 ** 
  32594 ** The implementation uses the ShellState.eRestoreState to maintain state:
  32595 **
  32596 **    0: Have not seen any SQL.
  32597 **    1: Have seen "PRAGMA foreign_keys=OFF;".
  32598 **    2-6: Currently running .dump transaction. If the "2" bit is set,
  32599 **         disable DEFENSIVE when done. If "4" is set, disable DQS_DDL.
  32600 **    7: Nothing left to do. This function becomes a no-op.
  32601 */
  32602 static int doAutoDetectRestore(ShellState *p, const char *zSql){
  32603   int rc = SQLITE_OK;
  32604 
  32605   if( p->eRestoreState<7 ){
  32606     switch( p->eRestoreState ){
  32607       case 0: {
  32608         const char *zExpect = "PRAGMA foreign_keys=OFF;";
  32609         assert( strlen(zExpect)==24 );
  32610         if( p->bSafeMode==0
  32611          && strlen(zSql)>=24
  32612          && memcmp(zSql, zExpect, 25)==0
  32613         ){
  32614           p->eRestoreState = 1;
  32615         }else{
  32616           p->eRestoreState = 7;
  32617         }
  32618         break;
  32619       };
  32620   
  32621       case 1: {
  32622         int bIsDump = 0;
  32623         const char *zExpect = "BEGIN TRANSACTION;";
  32624         assert( strlen(zExpect)==18 );
  32625         if( memcmp(zSql, zExpect, 19)==0 ){
  32626           /* Now check if the database is empty. */
  32627           const char *zQuery = "SELECT 1 FROM sqlite_schema LIMIT 1";
  32628           sqlite3_stmt *pStmt = 0;
  32629   
  32630           bIsDump = 1;
  32631           shellPrepare(p->db, &rc, zQuery, &pStmt);
  32632           if( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
  32633             bIsDump = 0;
  32634           }
  32635           shellFinalize(&rc, pStmt);
  32636         }
  32637         if( bIsDump && rc==SQLITE_OK ){
  32638           int bDefense = 0;
  32639           int bDqsDdl = 0;
  32640           sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, -1, &bDefense);
  32641           sqlite3_db_config(p->db, SQLITE_DBCONFIG_DQS_DDL, -1, &bDqsDdl);
  32642           sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, 0, 0);
  32643           sqlite3_db_config(p->db, SQLITE_DBCONFIG_DQS_DDL, 1, 0);
  32644           p->eRestoreState = (bDefense ? 2 : 0) + (bDqsDdl ? 4 : 0);
  32645         }else{
  32646           p->eRestoreState = 7;
  32647         }
  32648         break;
  32649       }
  32650   
  32651       default: {
  32652         if( sqlite3_get_autocommit(p->db) ){
  32653           if( (p->eRestoreState & 2) ){
  32654             sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, 1, 0);
  32655           }
  32656           if( (p->eRestoreState & 4) ){
  32657             sqlite3_db_config(p->db, SQLITE_DBCONFIG_DQS_DDL, 0, 0);
  32658           }
  32659           p->eRestoreState = 7;
  32660         }
  32661         break;
  32662       }
  32663     }
  32664   }
  32665 
  32666   return rc;
  32667 }
  32668 
  32669 /*
  32670 ** Run a single line of SQL.  Return the number of errors.
  32671 */
  32672 static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){
  32673   int rc;
  32674   char *zErrMsg = 0;
  32675 
  32676   open_db(p, 0);
  32677   if( ShellHasFlag(p,SHFLG_Backslash) ) resolve_backslashes(zSql);
  32678   if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0;
  32679   BEGIN_TIMER;
  32680   rc = shell_exec(p, zSql, &zErrMsg);
  32681   END_TIMER(p->out);
  32682   if( rc || zErrMsg ){
  32683     char zPrefix[100];
  32684     const char *zErrorTail;
  32685     const char *zErrorType;
  32686     if( zErrMsg==0 ){
  32687       zErrorType = "Error";
  32688       zErrorTail = sqlite3_errmsg(p->db);
  32689     }else if( cli_strncmp(zErrMsg, "in prepare, ",12)==0 ){
  32690       zErrorType = "Parse error";
  32691       zErrorTail = &zErrMsg[12];
  32692     }else if( cli_strncmp(zErrMsg, "stepping, ", 10)==0 ){
  32693       zErrorType = "Runtime error";
  32694       zErrorTail = &zErrMsg[10];
  32695     }else{
  32696       zErrorType = "Error";
  32697       zErrorTail = zErrMsg;
  32698     }
  32699     if( in!=0 || !stdin_is_interactive ){
  32700       sqlite3_snprintf(sizeof(zPrefix), zPrefix,
  32701                        "%s near line %d:", zErrorType, startline);
  32702     }else{
  32703       sqlite3_snprintf(sizeof(zPrefix), zPrefix, "%s:", zErrorType);
  32704     }
  32705     sqlite3_fprintf(stderr,"%s %s\n", zPrefix, zErrorTail);
  32706     sqlite3_free(zErrMsg);
  32707     zErrMsg = 0;
  32708     return 1;
  32709   }else if( ShellHasFlag(p, SHFLG_CountChanges) ){
  32710     char zLineBuf[2000];
  32711     sqlite3_snprintf(sizeof(zLineBuf), zLineBuf,
  32712             "changes: %lld   total_changes: %lld",
  32713             sqlite3_changes64(p->db), sqlite3_total_changes64(p->db));
  32714     sqlite3_fprintf(p->out, "%s\n", zLineBuf);
  32715   }
  32716 
  32717   if( doAutoDetectRestore(p, zSql) ) return 1;
  32718   return 0;
  32719 }
  32720 
  32721 static void echo_group_input(ShellState *p, const char *zDo){
  32722   if( ShellHasFlag(p, SHFLG_Echo) ){
  32723     sqlite3_fprintf(p->out, "%s\n", zDo);
  32724     fflush(p->out);
  32725   }
  32726 }
  32727 
  32728 #ifdef SQLITE_SHELL_FIDDLE
  32729 /*
  32730 ** Alternate one_input_line() impl for wasm mode. This is not in the primary
  32731 ** impl because we need the global shellState and cannot access it from that
  32732 ** function without moving lots of code around (creating a larger/messier diff).
  32733 */
  32734 static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
  32735   /* Parse the next line from shellState.wasm.zInput. */
  32736   const char *zBegin = shellState.wasm.zPos;
  32737   const char *z = zBegin;
  32738   char *zLine = 0;
  32739   i64 nZ = 0;
  32740 
  32741   UNUSED_PARAMETER(in);
  32742   UNUSED_PARAMETER(isContinuation);
  32743   if(!z || !*z){
  32744     return 0;
  32745   }
  32746   while(*z && IsSpace(*z)) ++z;
  32747   zBegin = z;
  32748   for(; *z && '\n'!=*z; ++nZ, ++z){}
  32749   if(nZ>0 && '\r'==zBegin[nZ-1]){
  32750     --nZ;
  32751   }
  32752   shellState.wasm.zPos = z;
  32753   zLine = realloc(zPrior, nZ+1);
  32754   shell_check_oom(zLine);
  32755   memcpy(zLine, zBegin, nZ);
  32756   zLine[nZ] = 0;
  32757   return zLine;
  32758 }
  32759 #endif /* SQLITE_SHELL_FIDDLE */
  32760 
  32761 /*
  32762 ** Read input from *in and process it.  If *in==0 then input
  32763 ** is interactive - the user is typing it it.  Otherwise, input
  32764 ** is coming from a file or device.  A prompt is issued and history
  32765 ** is saved only if input is interactive.  An interrupt signal will
  32766 ** cause this routine to exit immediately, unless input is interactive.
  32767 **
  32768 ** Return the number of errors.
  32769 */
  32770 static int process_input(ShellState *p){
  32771   char *zLine = 0;          /* A single input line */
  32772   char *zSql = 0;           /* Accumulated SQL text */
  32773   i64 nLine;                /* Length of current line */
  32774   i64 nSql = 0;             /* Bytes of zSql[] used */
  32775   i64 nAlloc = 0;           /* Allocated zSql[] space */
  32776   int rc;                   /* Error code */
  32777   int errCnt = 0;           /* Number of errors seen */
  32778   i64 startline = 0;        /* Line number for start of current input */
  32779   QuickScanState qss = QSS_Start; /* Accumulated line status (so far) */
  32780 
  32781   if( p->inputNesting==MAX_INPUT_NESTING ){
  32782     /* This will be more informative in a later version. */
  32783     sqlite3_fprintf(stderr,"Input nesting limit (%d) reached at line %d."
  32784           " Check recursion.\n", MAX_INPUT_NESTING, p->lineno);
  32785     return 1;
  32786   }
  32787   ++p->inputNesting;
  32788   p->lineno = 0;
  32789   CONTINUE_PROMPT_RESET;
  32790   while( errCnt==0 || !bail_on_error || (p->in==0 && stdin_is_interactive) ){
  32791     fflush(p->out);
  32792     zLine = one_input_line(p->in, zLine, nSql>0);
  32793     if( zLine==0 ){
  32794       /* End of input */
  32795       if( p->in==0 && stdin_is_interactive ) sqlite3_fputs("\n", p->out);
  32796       break;
  32797     }
  32798     if( seenInterrupt ){
  32799       if( p->in!=0 ) break;
  32800       seenInterrupt = 0;
  32801     }
  32802     p->lineno++;
  32803     if( QSS_INPLAIN(qss)
  32804         && line_is_command_terminator(zLine)
  32805         && line_is_complete(zSql, nSql) ){
  32806       memcpy(zLine,";",2);
  32807     }
  32808     qss = quickscan(zLine, qss, CONTINUE_PROMPT_PSTATE);
  32809     if( QSS_PLAINWHITE(qss) && nSql==0 ){
  32810       /* Just swallow single-line whitespace */
  32811       echo_group_input(p, zLine);
  32812       qss = QSS_Start;
  32813       continue;
  32814     }
  32815     if( zLine && (zLine[0]=='.' || zLine[0]=='#') && nSql==0 ){
  32816       CONTINUE_PROMPT_RESET;
  32817       echo_group_input(p, zLine);
  32818       if( zLine[0]=='.' ){
  32819         rc = do_meta_command(zLine, p);
  32820         if( rc==2 ){ /* exit requested */
  32821           break;
  32822         }else if( rc ){
  32823           errCnt++;
  32824         }
  32825       }
  32826       qss = QSS_Start;
  32827       continue;
  32828     }
  32829     /* No single-line dispositions remain; accumulate line(s). */
  32830     nLine = strlen(zLine);
  32831     if( nSql+nLine+2>=nAlloc ){
  32832       /* Grow buffer by half-again increments when big. */
  32833       nAlloc = nSql+(nSql>>1)+nLine+100;
  32834       zSql = realloc(zSql, nAlloc);
  32835       shell_check_oom(zSql);
  32836     }
  32837     if( nSql==0 ){
  32838       i64 i;
  32839       for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
  32840       assert( nAlloc>0 && zSql!=0 );
  32841       memcpy(zSql, zLine+i, nLine+1-i);
  32842       startline = p->lineno;
  32843       nSql = nLine-i;
  32844     }else{
  32845       zSql[nSql++] = '\n';
  32846       memcpy(zSql+nSql, zLine, nLine+1);
  32847       nSql += nLine;
  32848     }
  32849     if( nSql && QSS_SEMITERM(qss) && sqlite3_complete(zSql) ){
  32850       echo_group_input(p, zSql);
  32851       errCnt += runOneSqlLine(p, zSql, p->in, startline);
  32852       CONTINUE_PROMPT_RESET;
  32853       nSql = 0;
  32854       if( p->outCount ){
  32855         output_reset(p);
  32856         p->outCount = 0;
  32857       }else{
  32858         clearTempFile(p);
  32859       }
  32860       p->bSafeMode = p->bSafeModePersist;
  32861       qss = QSS_Start;
  32862     }else if( nSql && QSS_PLAINWHITE(qss) ){
  32863       echo_group_input(p, zSql);
  32864       nSql = 0;
  32865       qss = QSS_Start;
  32866     }
  32867   }
  32868   if( nSql ){
  32869     /* This may be incomplete. Let the SQL parser deal with that. */
  32870     echo_group_input(p, zSql);
  32871     errCnt += runOneSqlLine(p, zSql, p->in, startline);
  32872     CONTINUE_PROMPT_RESET;
  32873   }
  32874   free(zSql);
  32875   free(zLine);
  32876   --p->inputNesting;
  32877   return errCnt>0;
  32878 }
  32879 
  32880 /*
  32881 ** Return a pathname which is the user's home directory.  A
  32882 ** 0 return indicates an error of some kind.
  32883 */
  32884 static char *find_home_dir(int clearFlag){
  32885   static char *home_dir = NULL;
  32886   if( clearFlag ){
  32887     free(home_dir);
  32888     home_dir = 0;
  32889     return 0;
  32890   }
  32891   if( home_dir ) return home_dir;
  32892 
  32893 #if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \
  32894      && !defined(__RTP__) && !defined(_WRS_KERNEL) && !defined(SQLITE_WASI)
  32895   {
  32896     struct passwd *pwent;
  32897     uid_t uid = getuid();
  32898     if( (pwent=getpwuid(uid)) != NULL) {
  32899       home_dir = pwent->pw_dir;
  32900     }
  32901   }
  32902 #endif
  32903 
  32904 #if defined(_WIN32_WCE)
  32905   /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
  32906    */
  32907   home_dir = "/";
  32908 #else
  32909 
  32910 #if defined(_WIN32) || defined(WIN32)
  32911   if (!home_dir) {
  32912     home_dir = getenv("USERPROFILE");
  32913   }
  32914 #endif
  32915 
  32916   if (!home_dir) {
  32917     home_dir = getenv("HOME");
  32918   }
  32919 
  32920 #if defined(_WIN32) || defined(WIN32)
  32921   if (!home_dir) {
  32922     char *zDrive, *zPath;
  32923     int n;
  32924     zDrive = getenv("HOMEDRIVE");
  32925     zPath = getenv("HOMEPATH");
  32926     if( zDrive && zPath ){
  32927       n = strlen30(zDrive) + strlen30(zPath) + 1;
  32928       home_dir = malloc( n );
  32929       if( home_dir==0 ) return 0;
  32930       sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
  32931       return home_dir;
  32932     }
  32933     home_dir = "c:\\";
  32934   }
  32935 #endif
  32936 
  32937 #endif /* !_WIN32_WCE */
  32938 
  32939   if( home_dir ){
  32940     i64 n = strlen(home_dir) + 1;
  32941     char *z = malloc( n );
  32942     if( z ) memcpy(z, home_dir, n);
  32943     home_dir = z;
  32944   }
  32945 
  32946   return home_dir;
  32947 }
  32948 
  32949 /*
  32950 ** On non-Windows platforms, look for $XDG_CONFIG_HOME.
  32951 ** If ${XDG_CONFIG_HOME}/sqlite3/sqliterc is found, return
  32952 ** the path to it.  If there is no $(XDG_CONFIG_HOME) then
  32953 ** look for $(HOME)/.config/sqlite3/sqliterc and if found
  32954 ** return that.  If none of these are found, return 0.
  32955 **
  32956 ** The string returned is obtained from sqlite3_malloc() and
  32957 ** should be freed by the caller.
  32958 */
  32959 static char *find_xdg_config(void){
  32960 #if defined(_WIN32) || defined(WIN32) || defined(_WIN32_WCE) \
  32961      || defined(__RTP__) || defined(_WRS_KERNEL)
  32962   return 0;
  32963 #else
  32964   char *zConfig = 0;
  32965   const char *zXdgHome;
  32966 
  32967   zXdgHome = getenv("XDG_CONFIG_HOME");
  32968   if( zXdgHome==0 ){
  32969     const char *zHome = getenv("HOME");
  32970     if( zHome==0 ) return 0;
  32971     zConfig = sqlite3_mprintf("%s/.config/sqlite3/sqliterc", zHome);
  32972   }else{
  32973     zConfig = sqlite3_mprintf("%s/sqlite3/sqliterc", zXdgHome);
  32974   }
  32975   shell_check_oom(zConfig);
  32976   if( access(zConfig,0)!=0 ){
  32977     sqlite3_free(zConfig);
  32978     zConfig = 0;
  32979   }
  32980   return zConfig;
  32981 #endif
  32982 }
  32983 
  32984 /*
  32985 ** Read input from the file given by sqliterc_override.  Or if that
  32986 ** parameter is NULL, take input from the first of find_xdg_config()
  32987 ** or ~/.sqliterc which is found.
  32988 **
  32989 ** Returns the number of errors.
  32990 */
  32991 static void process_sqliterc(
  32992   ShellState *p,                  /* Configuration data */
  32993   const char *sqliterc_override   /* Name of config file. NULL to use default */
  32994 ){
  32995   char *home_dir = NULL;
  32996   const char *sqliterc = sqliterc_override;
  32997   char *zBuf = 0;
  32998   FILE *inSaved = p->in;
  32999   int savedLineno = p->lineno;
  33000 
  33001   if( sqliterc == NULL ){
  33002     sqliterc = zBuf = find_xdg_config();
  33003   }
  33004   if( sqliterc == NULL ){
  33005     home_dir = find_home_dir(0);
  33006     if( home_dir==0 ){
  33007       eputz("-- warning: cannot find home directory;"
  33008             " cannot read ~/.sqliterc\n");
  33009       return;
  33010     }
  33011     zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
  33012     shell_check_oom(zBuf);
  33013     sqliterc = zBuf;
  33014   }
  33015   p->in = sqlite3_fopen(sqliterc,"rb");
  33016   if( p->in ){
  33017     if( stdin_is_interactive ){
  33018       sqlite3_fprintf(stderr,"-- Loading resources from %s\n", sqliterc);
  33019     }
  33020     if( process_input(p) && bail_on_error ) exit(1);
  33021     fclose(p->in);
  33022   }else if( sqliterc_override!=0 ){
  33023     sqlite3_fprintf(stderr,"cannot open: \"%s\"\n", sqliterc);
  33024     if( bail_on_error ) exit(1);
  33025   }
  33026   p->in = inSaved;
  33027   p->lineno = savedLineno;
  33028   sqlite3_free(zBuf);
  33029 }
  33030 
  33031 /*
  33032 ** Show available command line options
  33033 */
  33034 static const char zOptions[] =
  33035   "   --                   treat no subsequent arguments as options\n"
  33036 #if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE)
  33037   "   -A ARGS...           run \".archive ARGS\" and exit\n"
  33038 #endif
  33039   "   -append              append the database to the end of the file\n"
  33040   "   -ascii               set output mode to 'ascii'\n"
  33041   "   -bail                stop after hitting an error\n"
  33042   "   -batch               force batch I/O\n"
  33043   "   -box                 set output mode to 'box'\n"
  33044   "   -column              set output mode to 'column'\n"
  33045   "   -cmd COMMAND         run \"COMMAND\" before reading stdin\n"
  33046   "   -csv                 set output mode to 'csv'\n"
  33047 #if !defined(SQLITE_OMIT_DESERIALIZE)
  33048   "   -deserialize         open the database using sqlite3_deserialize()\n"
  33049 #endif
  33050   "   -echo                print inputs before execution\n"
  33051   "   -escape T            ctrl-char escape; T is one of: symbol, ascii, off\n"
  33052   "   -init FILENAME       read/process named file\n"
  33053   "   -[no]header          turn headers on or off\n"
  33054 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
  33055   "   -heap SIZE           Size of heap for memsys3 or memsys5\n"
  33056 #endif
  33057   "   -help                show this message\n"
  33058   "   -html                set output mode to HTML\n"
  33059   "   -interactive         force interactive I/O\n"
  33060   "   -json                set output mode to 'json'\n"
  33061   "   -line                set output mode to 'line'\n"
  33062   "   -list                set output mode to 'list'\n"
  33063   "   -lookaside SIZE N    use N entries of SZ bytes for lookaside memory\n"
  33064   "   -markdown            set output mode to 'markdown'\n"
  33065 #if !defined(SQLITE_OMIT_DESERIALIZE)
  33066   "   -maxsize N           maximum size for a --deserialize database\n"
  33067 #endif
  33068   "   -memtrace            trace all memory allocations and deallocations\n"
  33069   "   -mmap N              default mmap size set to N\n"
  33070 #ifdef SQLITE_ENABLE_MULTIPLEX
  33071   "   -multiplex           enable the multiplexor VFS\n"
  33072 #endif
  33073   "   -newline SEP         set output row separator. Default: '\\n'\n"
  33074   "   -nofollow            refuse to open symbolic links to database files\n"
  33075   "   -nonce STRING        set the safe-mode escape nonce\n"
  33076   "   -no-rowid-in-view    Disable rowid-in-view using sqlite3_config()\n"
  33077   "   -nullvalue TEXT      set text string for NULL values. Default ''\n"
  33078   "   -pagecache SIZE N    use N slots of SZ bytes each for page cache memory\n"
  33079   "   -pcachetrace         trace all page cache operations\n"
  33080   "   -quote               set output mode to 'quote'\n"
  33081   "   -readonly            open the database read-only\n"
  33082   "   -safe                enable safe-mode\n"
  33083   "   -separator SEP       set output column separator. Default: '|'\n"
  33084 #ifdef SQLITE_ENABLE_SORTER_REFERENCES
  33085   "   -sorterref SIZE      sorter references threshold size\n"
  33086 #endif
  33087   "   -stats               print memory stats before each finalize\n"
  33088   "   -table               set output mode to 'table'\n"
  33089   "   -tabs                set output mode to 'tabs'\n"
  33090   "   -unsafe-testing      allow unsafe commands and modes for testing\n"
  33091   "   -version             show SQLite version\n"
  33092   "   -vfs NAME            use NAME as the default VFS\n"
  33093   "   -vfstrace            enable tracing of all VFS calls\n"
  33094 #ifdef SQLITE_HAVE_ZLIB
  33095   "   -zip                 open the file as a ZIP Archive\n"
  33096 #endif
  33097 ;
  33098 static void usage(int showDetail){
  33099   sqlite3_fprintf(stderr,"Usage: %s [OPTIONS] [FILENAME [SQL...]]\n"
  33100        "FILENAME is the name of an SQLite database. A new database is created\n"
  33101        "if the file does not previously exist. Defaults to :memory:.\n", Argv0);
  33102   if( showDetail ){
  33103     sqlite3_fprintf(stderr,"OPTIONS include:\n%s", zOptions);
  33104   }else{
  33105     eputz("Use the -help option for additional information\n");
  33106   }
  33107   exit(0);
  33108 }
  33109 
  33110 /*
  33111 ** Internal check:  Verify that the SQLite is uninitialized.  Print a
  33112 ** error message if it is initialized.
  33113 */
  33114 static void verify_uninitialized(void){
  33115   if( sqlite3_config(-1)==SQLITE_MISUSE ){
  33116     sputz(stdout, "WARNING: attempt to configure SQLite after"
  33117           " initialization.\n");
  33118   }
  33119 }
  33120 
  33121 /*
  33122 ** Initialize the state information in data
  33123 */
  33124 static void main_init(ShellState *data) {
  33125   memset(data, 0, sizeof(*data));
  33126   data->normalMode = data->cMode = data->mode = MODE_List;
  33127   data->autoExplain = 1;
  33128 #ifdef _WIN32
  33129   data->crlfMode = 1;
  33130 #endif
  33131   data->pAuxDb = &data->aAuxDb[0];
  33132   memcpy(data->colSeparator,SEP_Column, 2);
  33133   memcpy(data->rowSeparator,SEP_Row, 2);
  33134   data->showHeader = 0;
  33135   data->shellFlgs = SHFLG_Lookaside;
  33136   sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
  33137 #if !defined(SQLITE_SHELL_FIDDLE)
  33138   verify_uninitialized();
  33139 #endif
  33140   sqlite3_config(SQLITE_CONFIG_URI, 1);
  33141   sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
  33142   sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
  33143   sqlite3_snprintf(sizeof(continuePrompt), continuePrompt,"   ...> ");
  33144 }
  33145 
  33146 /*
  33147 ** Output text to the console in a font that attracts extra attention.
  33148 */
  33149 #if defined(_WIN32) || defined(WIN32)
  33150 static void printBold(const char *zText){
  33151 #if !SQLITE_OS_WINRT
  33152   HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
  33153   CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
  33154   GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
  33155   SetConsoleTextAttribute(out,
  33156          FOREGROUND_RED|FOREGROUND_INTENSITY
  33157   );
  33158 #endif
  33159   sputz(stdout, zText);
  33160 #if !SQLITE_OS_WINRT
  33161   SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
  33162 #endif
  33163 }
  33164 #else
  33165 static void printBold(const char *zText){
  33166   sqlite3_fprintf(stdout, "\033[1m%s\033[0m", zText);
  33167 }
  33168 #endif
  33169 
  33170 /*
  33171 ** Get the argument to an --option.  Throw an error and die if no argument
  33172 ** is available.
  33173 */
  33174 static char *cmdline_option_value(int argc, char **argv, int i){
  33175   if( i==argc ){
  33176     sqlite3_fprintf(stderr,
  33177             "%s: Error: missing argument to %s\n", argv[0], argv[argc-1]);
  33178     exit(1);
  33179   }
  33180   return argv[i];
  33181 }
  33182 
  33183 static void sayAbnormalExit(void){
  33184   if( seenInterrupt ) eputz("Program interrupted.\n");
  33185 }
  33186 
  33187 /* Routine to output from vfstrace
  33188 */
  33189 static int vfstraceOut(const char *z, void *pArg){
  33190   ShellState *p = (ShellState*)pArg;
  33191   sqlite3_fputs(z, p->out);
  33192   fflush(p->out);
  33193   return 1;
  33194 }
  33195 
  33196 #ifndef SQLITE_SHELL_IS_UTF8
  33197 #  if (defined(_WIN32) || defined(WIN32)) \
  33198    && (defined(_MSC_VER) || (defined(UNICODE) && defined(__GNUC__)))
  33199 #    define SQLITE_SHELL_IS_UTF8          (0)
  33200 #  else
  33201 #    define SQLITE_SHELL_IS_UTF8          (1)
  33202 #  endif
  33203 #endif
  33204 
  33205 #ifdef SQLITE_SHELL_FIDDLE
  33206 #  define main fiddle_main
  33207 #endif
  33208 
  33209 #if SQLITE_SHELL_IS_UTF8
  33210 int SQLITE_CDECL main(int argc, char **argv){
  33211 #else
  33212 int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
  33213   char **argv;
  33214 #endif
  33215 #ifdef SQLITE_DEBUG
  33216   sqlite3_int64 mem_main_enter = 0;
  33217 #endif
  33218   char *zErrMsg = 0;
  33219 #ifdef SQLITE_SHELL_FIDDLE
  33220 #  define data shellState
  33221 #else
  33222   ShellState data;
  33223 #endif
  33224   const char *zInitFile = 0;
  33225   int i;
  33226   int rc = 0;
  33227   int warnInmemoryDb = 0;
  33228   int readStdin = 1;
  33229   int nCmd = 0;
  33230   int nOptsEnd = argc;
  33231   int bEnableVfstrace = 0;
  33232   char **azCmd = 0;
  33233   const char *zVfs = 0;           /* Value of -vfs command-line option */
  33234 #if !SQLITE_SHELL_IS_UTF8
  33235   char **argvToFree = 0;
  33236   int argcToFree = 0;
  33237 #endif
  33238   setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */
  33239 
  33240 #ifdef SQLITE_SHELL_FIDDLE
  33241   stdin_is_interactive = 0;
  33242   stdout_is_console = 1;
  33243   data.wasm.zDefaultDbName = "/fiddle.sqlite3";
  33244 #else
  33245   stdin_is_interactive = isatty(0);
  33246   stdout_is_console = isatty(1);
  33247 #endif
  33248   atexit(sayAbnormalExit);
  33249 #ifdef SQLITE_DEBUG
  33250   mem_main_enter = sqlite3_memory_used();
  33251 #endif
  33252 #if !defined(_WIN32_WCE)
  33253   if( getenv("SQLITE_DEBUG_BREAK") ){
  33254     if( isatty(0) && isatty(2) ){
  33255       char zLine[100];
  33256       sqlite3_fprintf(stderr,
  33257             "attach debugger to process %d and press ENTER to continue...",
  33258             GETPID());
  33259       if( sqlite3_fgets(zLine, sizeof(zLine), stdin)!=0
  33260        && cli_strcmp(zLine,"stop")==0
  33261       ){
  33262         exit(1);
  33263       }
  33264     }else{
  33265 #if defined(_WIN32) || defined(WIN32)
  33266 #if SQLITE_OS_WINRT
  33267       __debugbreak();
  33268 #else
  33269       DebugBreak();
  33270 #endif
  33271 #elif defined(SIGTRAP)
  33272       raise(SIGTRAP);
  33273 #endif
  33274     }
  33275   }
  33276 #endif
  33277   /* Register a valid signal handler early, before much else is done. */
  33278 #ifdef SIGINT
  33279   signal(SIGINT, interrupt_handler);
  33280 #elif (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE)
  33281   if( !SetConsoleCtrlHandler(ConsoleCtrlHandler, TRUE) ){
  33282     eputz("No ^C handler.\n");
  33283   }
  33284 #endif
  33285 
  33286 #if USE_SYSTEM_SQLITE+0!=1
  33287   if( cli_strncmp(sqlite3_sourceid(),SQLITE_SOURCE_ID,60)!=0 ){
  33288     sqlite3_fprintf(stderr,
  33289           "SQLite header and source version mismatch\n%s\n%s\n",
  33290           sqlite3_sourceid(), SQLITE_SOURCE_ID);
  33291     exit(1);
  33292   }
  33293 #endif
  33294   main_init(&data);
  33295 
  33296   /* On Windows, we must translate command-line arguments into UTF-8.
  33297   ** The SQLite memory allocator subsystem has to be enabled in order to
  33298   ** do this.  But we want to run an sqlite3_shutdown() afterwards so that
  33299   ** subsequent sqlite3_config() calls will work.  So copy all results into
  33300   ** memory that does not come from the SQLite memory allocator.
  33301   */
  33302 #if !SQLITE_SHELL_IS_UTF8
  33303   sqlite3_initialize();
  33304   argvToFree = malloc(sizeof(argv[0])*argc*2);
  33305   shell_check_oom(argvToFree);
  33306   argcToFree = argc;
  33307   argv = argvToFree + argc;
  33308   for(i=0; i<argc; i++){
  33309     char *z = sqlite3_win32_unicode_to_utf8(wargv[i]);
  33310     i64 n;
  33311     shell_check_oom(z);
  33312     n = strlen(z);
  33313     argv[i] = malloc( n+1 );
  33314     shell_check_oom(argv[i]);
  33315     memcpy(argv[i], z, n+1);
  33316     argvToFree[i] = argv[i];
  33317     sqlite3_free(z);
  33318   }
  33319   sqlite3_shutdown();
  33320 #endif
  33321 
  33322   assert( argc>=1 && argv && argv[0] );
  33323   Argv0 = argv[0];
  33324 
  33325 #ifdef SQLITE_SHELL_DBNAME_PROC
  33326   {
  33327     /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name
  33328     ** of a C-function that will provide the name of the database file.  Use
  33329     ** this compile-time option to embed this shell program in larger
  33330     ** applications. */
  33331     extern void SQLITE_SHELL_DBNAME_PROC(const char**);
  33332     SQLITE_SHELL_DBNAME_PROC(&data.pAuxDb->zDbFilename);
  33333     warnInmemoryDb = 0;
  33334   }
  33335 #endif
  33336 
  33337   /* Do an initial pass through the command-line argument to locate
  33338   ** the name of the database file, the name of the initialization file,
  33339   ** the size of the alternative malloc heap, options affecting commands
  33340   ** or SQL run from the command line, and the first command to execute.
  33341   */
  33342 #ifndef SQLITE_SHELL_FIDDLE
  33343   verify_uninitialized();
  33344 #endif
  33345   for(i=1; i<argc; i++){
  33346     char *z;
  33347     z = argv[i];
  33348     if( z[0]!='-' || i>nOptsEnd ){
  33349       if( data.aAuxDb->zDbFilename==0 ){
  33350         data.aAuxDb->zDbFilename = z;
  33351       }else{
  33352         /* Excess arguments are interpreted as SQL (or dot-commands) and
  33353         ** mean that nothing is read from stdin */
  33354         readStdin = 0;
  33355         nCmd++;
  33356         azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd);
  33357         shell_check_oom(azCmd);
  33358         azCmd[nCmd-1] = z;
  33359       }
  33360       continue;
  33361     }
  33362     if( z[1]=='-' ) z++;
  33363     if( cli_strcmp(z, "-")==0 ){
  33364       nOptsEnd = i;
  33365       continue;
  33366     }else if( cli_strcmp(z,"-separator")==0
  33367      || cli_strcmp(z,"-nullvalue")==0
  33368      || cli_strcmp(z,"-newline")==0
  33369      || cli_strcmp(z,"-cmd")==0
  33370     ){
  33371       (void)cmdline_option_value(argc, argv, ++i);
  33372     }else if( cli_strcmp(z,"-init")==0 ){
  33373       zInitFile = cmdline_option_value(argc, argv, ++i);
  33374     }else if( cli_strcmp(z,"-interactive")==0 ){
  33375     }else if( cli_strcmp(z,"-batch")==0 ){
  33376       /* Need to check for batch mode here to so we can avoid printing
  33377       ** informational messages (like from process_sqliterc) before
  33378       ** we do the actual processing of arguments later in a second pass.
  33379       */
  33380       stdin_is_interactive = 0;
  33381     }else if( cli_strcmp(z,"-utf8")==0 ){
  33382     }else if( cli_strcmp(z,"-no-utf8")==0 ){
  33383     }else if( cli_strcmp(z,"-no-rowid-in-view")==0 ){
  33384       int val = 0;
  33385       sqlite3_config(SQLITE_CONFIG_ROWID_IN_VIEW, &val);
  33386       assert( val==0 );
  33387     }else if( cli_strcmp(z,"-heap")==0 ){
  33388 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
  33389       const char *zSize;
  33390       sqlite3_int64 szHeap;
  33391 
  33392       zSize = cmdline_option_value(argc, argv, ++i);
  33393       szHeap = integerValue(zSize);
  33394       if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
  33395       verify_uninitialized();
  33396       sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
  33397 #else
  33398       (void)cmdline_option_value(argc, argv, ++i);
  33399 #endif
  33400     }else if( cli_strcmp(z,"-pagecache")==0 ){
  33401       sqlite3_int64 n, sz;
  33402       sz = integerValue(cmdline_option_value(argc,argv,++i));
  33403       if( sz>70000 ) sz = 70000;
  33404       if( sz<0 ) sz = 0;
  33405       n = integerValue(cmdline_option_value(argc,argv,++i));
  33406       if( sz>0 && n>0 && 0xffffffffffffLL/sz<n ){
  33407         n = 0xffffffffffffLL/sz;
  33408       }
  33409       verify_uninitialized();
  33410       sqlite3_config(SQLITE_CONFIG_PAGECACHE,
  33411                     (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n);
  33412       data.shellFlgs |= SHFLG_Pagecache;
  33413     }else if( cli_strcmp(z,"-lookaside")==0 ){
  33414       int n, sz;
  33415       sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
  33416       if( sz<0 ) sz = 0;
  33417       n = (int)integerValue(cmdline_option_value(argc,argv,++i));
  33418       if( n<0 ) n = 0;
  33419       verify_uninitialized();
  33420       sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n);
  33421       if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
  33422     }else if( cli_strcmp(z,"-threadsafe")==0 ){
  33423       int n;
  33424       n = (int)integerValue(cmdline_option_value(argc,argv,++i));
  33425       verify_uninitialized();
  33426       switch( n ){
  33427          case 0:  sqlite3_config(SQLITE_CONFIG_SINGLETHREAD);  break;
  33428          case 2:  sqlite3_config(SQLITE_CONFIG_MULTITHREAD);   break;
  33429          default: sqlite3_config(SQLITE_CONFIG_SERIALIZED);    break;
  33430       }
  33431     }else if( cli_strcmp(z,"-vfstrace")==0 ){
  33432       bEnableVfstrace = 1;
  33433 #ifdef SQLITE_ENABLE_MULTIPLEX
  33434     }else if( cli_strcmp(z,"-multiplex")==0 ){
  33435       extern int sqlite3_multiplex_initialize(const char*,int);
  33436       sqlite3_multiplex_initialize(0, 1);
  33437 #endif
  33438     }else if( cli_strcmp(z,"-mmap")==0 ){
  33439       sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
  33440       verify_uninitialized();
  33441       sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
  33442 #if defined(SQLITE_ENABLE_SORTER_REFERENCES)
  33443     }else if( cli_strcmp(z,"-sorterref")==0 ){
  33444       sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
  33445       verify_uninitialized();
  33446       sqlite3_config(SQLITE_CONFIG_SORTERREF_SIZE, (int)sz);
  33447 #endif
  33448     }else if( cli_strcmp(z,"-vfs")==0 ){
  33449       zVfs = cmdline_option_value(argc, argv, ++i);
  33450 #ifdef SQLITE_HAVE_ZLIB
  33451     }else if( cli_strcmp(z,"-zip")==0 ){
  33452       data.openMode = SHELL_OPEN_ZIPFILE;
  33453 #endif
  33454     }else if( cli_strcmp(z,"-append")==0 ){
  33455       data.openMode = SHELL_OPEN_APPENDVFS;
  33456 #ifndef SQLITE_OMIT_DESERIALIZE
  33457     }else if( cli_strcmp(z,"-deserialize")==0 ){
  33458       data.openMode = SHELL_OPEN_DESERIALIZE;
  33459     }else if( cli_strcmp(z,"-maxsize")==0 && i+1<argc ){
  33460       data.szMax = integerValue(argv[++i]);
  33461 #endif
  33462     }else if( cli_strcmp(z,"-readonly")==0 ){
  33463       data.openMode = SHELL_OPEN_READONLY;
  33464     }else if( cli_strcmp(z,"-nofollow")==0 ){
  33465       data.openFlags = SQLITE_OPEN_NOFOLLOW;
  33466 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
  33467     }else if( cli_strncmp(z, "-A",2)==0 ){
  33468       /* All remaining command-line arguments are passed to the ".archive"
  33469       ** command, so ignore them */
  33470       break;
  33471 #endif
  33472     }else if( cli_strcmp(z, "-memtrace")==0 ){
  33473       sqlite3MemTraceActivate(stderr);
  33474     }else if( cli_strcmp(z, "-pcachetrace")==0 ){
  33475       sqlite3PcacheTraceActivate(stderr);
  33476     }else if( cli_strcmp(z,"-bail")==0 ){
  33477       bail_on_error = 1;
  33478     }else if( cli_strcmp(z,"-nonce")==0 ){
  33479       free(data.zNonce);
  33480       data.zNonce = strdup(cmdline_option_value(argc, argv, ++i));
  33481     }else if( cli_strcmp(z,"-unsafe-testing")==0 ){
  33482       ShellSetFlag(&data,SHFLG_TestingMode);
  33483     }else if( cli_strcmp(z,"-safe")==0 ){
  33484       /* no-op - catch this on the second pass */
  33485     }else if( cli_strcmp(z,"-escape")==0 && i+1<argc ){
  33486       /* skip over the argument */
  33487       i++;
  33488     }
  33489   }
  33490 #ifndef SQLITE_SHELL_FIDDLE
  33491   if( !bEnableVfstrace ) verify_uninitialized();
  33492 #endif
  33493 
  33494 
  33495 #ifdef SQLITE_SHELL_INIT_PROC
  33496   {
  33497     /* If the SQLITE_SHELL_INIT_PROC macro is defined, then it is the name
  33498     ** of a C-function that will perform initialization actions on SQLite that
  33499     ** occur just before or after sqlite3_initialize(). Use this compile-time
  33500     ** option to embed this shell program in larger applications. */
  33501     extern void SQLITE_SHELL_INIT_PROC(void);
  33502     SQLITE_SHELL_INIT_PROC();
  33503   }
  33504 #else
  33505   /* All the sqlite3_config() calls have now been made. So it is safe
  33506   ** to call sqlite3_initialize() and process any command line -vfs option. */
  33507   sqlite3_initialize();
  33508 #endif
  33509 
  33510   if( zVfs ){
  33511     sqlite3_vfs *pVfs = sqlite3_vfs_find(zVfs);
  33512     if( pVfs ){
  33513       sqlite3_vfs_register(pVfs, 1);
  33514     }else{
  33515       sqlite3_fprintf(stderr,"no such VFS: \"%s\"\n", zVfs);
  33516       exit(1);
  33517     }
  33518   }
  33519 
  33520   if( data.pAuxDb->zDbFilename==0 ){
  33521 #ifndef SQLITE_OMIT_MEMORYDB
  33522     data.pAuxDb->zDbFilename = ":memory:";
  33523     warnInmemoryDb = argc==1;
  33524 #else
  33525     sqlite3_fprintf(stderr,
  33526                     "%s: Error: no database filename specified\n", Argv0);
  33527     return 1;
  33528 #endif
  33529   }
  33530   data.out = stdout;
  33531   if( bEnableVfstrace ){
  33532     vfstrace_register("trace",0,vfstraceOut, &data, 1);
  33533   }
  33534 #ifndef SQLITE_SHELL_FIDDLE
  33535   sqlite3_appendvfs_init(0,0,0);
  33536 #endif
  33537 
  33538   /* Go ahead and open the database file if it already exists.  If the
  33539   ** file does not exist, delay opening it.  This prevents empty database
  33540   ** files from being created if a user mistypes the database name argument
  33541   ** to the sqlite command-line tool.
  33542   */
  33543   if( access(data.pAuxDb->zDbFilename, 0)==0 ){
  33544     open_db(&data, 0);
  33545   }
  33546 
  33547   /* Process the initialization file if there is one.  If no -init option
  33548   ** is given on the command line, look for a file named ~/.sqliterc and
  33549   ** try to process it.
  33550   */
  33551   process_sqliterc(&data,zInitFile);
  33552 
  33553   /* Make a second pass through the command-line argument and set
  33554   ** options.  This second pass is delayed until after the initialization
  33555   ** file is processed so that the command-line arguments will override
  33556   ** settings in the initialization file.
  33557   */
  33558   for(i=1; i<argc; i++){
  33559     char *z = argv[i];
  33560     if( z[0]!='-' || i>=nOptsEnd ) continue;
  33561     if( z[1]=='-' ){ z++; }
  33562     if( cli_strcmp(z,"-init")==0 ){
  33563       i++;
  33564     }else if( cli_strcmp(z,"-html")==0 ){
  33565       data.mode = MODE_Html;
  33566     }else if( cli_strcmp(z,"-list")==0 ){
  33567       data.mode = MODE_List;
  33568     }else if( cli_strcmp(z,"-quote")==0 ){
  33569       data.mode = MODE_Quote;
  33570       sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Comma);
  33571       sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Row);
  33572     }else if( cli_strcmp(z,"-line")==0 ){
  33573       data.mode = MODE_Line;
  33574     }else if( cli_strcmp(z,"-column")==0 ){
  33575       data.mode = MODE_Column;
  33576     }else if( cli_strcmp(z,"-json")==0 ){
  33577       data.mode = MODE_Json;
  33578     }else if( cli_strcmp(z,"-markdown")==0 ){
  33579       data.mode = MODE_Markdown;
  33580     }else if( cli_strcmp(z,"-table")==0 ){
  33581       data.mode = MODE_Table;
  33582     }else if( cli_strcmp(z,"-box")==0 ){
  33583       data.mode = MODE_Box;
  33584     }else if( cli_strcmp(z,"-csv")==0 ){
  33585       data.mode = MODE_Csv;
  33586       memcpy(data.colSeparator,",",2);
  33587     }else if( cli_strcmp(z,"-escape")==0 && i+1<argc ){
  33588       /* See similar code at tag-20250224-1 */
  33589       const char *zEsc = argv[++i];
  33590       int k;
  33591       for(k=0; k<ArraySize(shell_EscModeNames); k++){
  33592         if( sqlite3_stricmp(zEsc,shell_EscModeNames[k])==0 ){
  33593           data.eEscMode = k;
  33594           break;
  33595         }
  33596       }
  33597       if( k>=ArraySize(shell_EscModeNames) ){
  33598         sqlite3_fprintf(stderr, "unknown control character escape mode \"%s\""
  33599                                 " - choices:", zEsc);
  33600         for(k=0; k<ArraySize(shell_EscModeNames); k++){
  33601           sqlite3_fprintf(stderr, " %s", shell_EscModeNames[k]);
  33602         }
  33603         sqlite3_fprintf(stderr, "\n");
  33604         exit(1);
  33605       }
  33606 #ifdef SQLITE_HAVE_ZLIB
  33607     }else if( cli_strcmp(z,"-zip")==0 ){
  33608       data.openMode = SHELL_OPEN_ZIPFILE;
  33609 #endif
  33610     }else if( cli_strcmp(z,"-append")==0 ){
  33611       data.openMode = SHELL_OPEN_APPENDVFS;
  33612 #ifndef SQLITE_OMIT_DESERIALIZE
  33613     }else if( cli_strcmp(z,"-deserialize")==0 ){
  33614       data.openMode = SHELL_OPEN_DESERIALIZE;
  33615     }else if( cli_strcmp(z,"-maxsize")==0 && i+1<argc ){
  33616       data.szMax = integerValue(argv[++i]);
  33617 #endif
  33618     }else if( cli_strcmp(z,"-readonly")==0 ){
  33619       data.openMode = SHELL_OPEN_READONLY;
  33620     }else if( cli_strcmp(z,"-nofollow")==0 ){
  33621       data.openFlags |= SQLITE_OPEN_NOFOLLOW;
  33622     }else if( cli_strcmp(z,"-ascii")==0 ){
  33623       data.mode = MODE_Ascii;
  33624       sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,SEP_Unit);
  33625       sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,SEP_Record);
  33626     }else if( cli_strcmp(z,"-tabs")==0 ){
  33627       data.mode = MODE_List;
  33628       sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,SEP_Tab);
  33629       sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,SEP_Row);
  33630     }else if( cli_strcmp(z,"-separator")==0 ){
  33631       sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
  33632                        "%s",cmdline_option_value(argc,argv,++i));
  33633     }else if( cli_strcmp(z,"-newline")==0 ){
  33634       sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
  33635                        "%s",cmdline_option_value(argc,argv,++i));
  33636     }else if( cli_strcmp(z,"-nullvalue")==0 ){
  33637       sqlite3_snprintf(sizeof(data.nullValue), data.nullValue,
  33638                        "%s",cmdline_option_value(argc,argv,++i));
  33639     }else if( cli_strcmp(z,"-header")==0 ){
  33640       data.showHeader = 1;
  33641       ShellSetFlag(&data, SHFLG_HeaderSet);
  33642      }else if( cli_strcmp(z,"-noheader")==0 ){
  33643       data.showHeader = 0;
  33644       ShellSetFlag(&data, SHFLG_HeaderSet);
  33645     }else if( cli_strcmp(z,"-echo")==0 ){
  33646       ShellSetFlag(&data, SHFLG_Echo);
  33647     }else if( cli_strcmp(z,"-eqp")==0 ){
  33648       data.autoEQP = AUTOEQP_on;
  33649     }else if( cli_strcmp(z,"-eqpfull")==0 ){
  33650       data.autoEQP = AUTOEQP_full;
  33651     }else if( cli_strcmp(z,"-stats")==0 ){
  33652       data.statsOn = 1;
  33653     }else if( cli_strcmp(z,"-scanstats")==0 ){
  33654       data.scanstatsOn = 1;
  33655     }else if( cli_strcmp(z,"-backslash")==0 ){
  33656       /* Undocumented command-line option: -backslash
  33657       ** Causes C-style backslash escapes to be evaluated in SQL statements
  33658       ** prior to sending the SQL into SQLite.  Useful for injecting
  33659       ** crazy bytes in the middle of SQL statements for testing and debugging.
  33660       */
  33661       ShellSetFlag(&data, SHFLG_Backslash);
  33662     }else if( cli_strcmp(z,"-bail")==0 ){
  33663       /* No-op.  The bail_on_error flag should already be set. */
  33664     }else if( cli_strcmp(z,"-version")==0 ){
  33665       sqlite3_fprintf(stdout, "%s %s (%d-bit)\n",
  33666             sqlite3_libversion(), sqlite3_sourceid(), 8*(int)sizeof(char*));
  33667       return 0;
  33668     }else if( cli_strcmp(z,"-interactive")==0 ){
  33669       /* Need to check for interactive override here to so that it can
  33670       ** affect console setup (for Windows only) and testing thereof.
  33671       */
  33672       stdin_is_interactive = 1;
  33673     }else if( cli_strcmp(z,"-batch")==0 ){
  33674       /* already handled */
  33675     }else if( cli_strcmp(z,"-utf8")==0 ){
  33676       /* already handled */
  33677     }else if( cli_strcmp(z,"-no-utf8")==0 ){
  33678       /* already handled */
  33679     }else if( cli_strcmp(z,"-no-rowid-in-view")==0 ){
  33680       /* already handled */
  33681     }else if( cli_strcmp(z,"-heap")==0 ){
  33682       i++;
  33683     }else if( cli_strcmp(z,"-pagecache")==0 ){
  33684       i+=2;
  33685     }else if( cli_strcmp(z,"-lookaside")==0 ){
  33686       i+=2;
  33687     }else if( cli_strcmp(z,"-threadsafe")==0 ){
  33688       i+=2;
  33689     }else if( cli_strcmp(z,"-nonce")==0 ){
  33690       i += 2;
  33691     }else if( cli_strcmp(z,"-mmap")==0 ){
  33692       i++;
  33693     }else if( cli_strcmp(z,"-memtrace")==0 ){
  33694       i++;
  33695     }else if( cli_strcmp(z,"-pcachetrace")==0 ){
  33696       i++;
  33697 #ifdef SQLITE_ENABLE_SORTER_REFERENCES
  33698     }else if( cli_strcmp(z,"-sorterref")==0 ){
  33699       i++;
  33700 #endif
  33701     }else if( cli_strcmp(z,"-vfs")==0 ){
  33702       i++;
  33703     }else if( cli_strcmp(z,"-vfstrace")==0 ){
  33704       i++;
  33705 #ifdef SQLITE_ENABLE_MULTIPLEX
  33706     }else if( cli_strcmp(z,"-multiplex")==0 ){
  33707       i++;
  33708 #endif
  33709     }else if( cli_strcmp(z,"-help")==0 ){
  33710       usage(1);
  33711     }else if( cli_strcmp(z,"-cmd")==0 ){
  33712       /* Run commands that follow -cmd first and separately from commands
  33713       ** that simply appear on the command-line.  This seems goofy.  It would
  33714       ** be better if all commands ran in the order that they appear.  But
  33715       ** we retain the goofy behavior for historical compatibility. */
  33716       if( i==argc-1 ) break;
  33717       z = cmdline_option_value(argc,argv,++i);
  33718       if( z[0]=='.' ){
  33719         rc = do_meta_command(z, &data);
  33720         if( rc && bail_on_error ) return rc==2 ? 0 : rc;
  33721       }else{
  33722         open_db(&data, 0);
  33723         rc = shell_exec(&data, z, &zErrMsg);
  33724         if( zErrMsg!=0 ){
  33725           shellEmitError(zErrMsg);
  33726           if( bail_on_error ) return rc!=0 ? rc : 1;
  33727         }else if( rc!=0 ){
  33728           sqlite3_fprintf(stderr,"Error: unable to process SQL \"%s\"\n", z);
  33729           if( bail_on_error ) return rc;
  33730         }
  33731       }
  33732 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
  33733     }else if( cli_strncmp(z, "-A", 2)==0 ){
  33734       if( nCmd>0 ){
  33735         sqlite3_fprintf(stderr,"Error: cannot mix regular SQL or dot-commands"
  33736               " with \"%s\"\n", z);
  33737         return 1;
  33738       }
  33739       open_db(&data, OPEN_DB_ZIPFILE);
  33740       if( z[2] ){
  33741         argv[i] = &z[2];
  33742         arDotCommand(&data, 1, argv+(i-1), argc-(i-1));
  33743       }else{
  33744         arDotCommand(&data, 1, argv+i, argc-i);
  33745       }
  33746       readStdin = 0;
  33747       break;
  33748 #endif
  33749     }else if( cli_strcmp(z,"-safe")==0 ){
  33750       data.bSafeMode = data.bSafeModePersist = 1;
  33751     }else if( cli_strcmp(z,"-unsafe-testing")==0 ){
  33752       /* Acted upon in first pass. */
  33753     }else{
  33754       sqlite3_fprintf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
  33755       eputz("Use -help for a list of options.\n");
  33756       return 1;
  33757     }
  33758     data.cMode = data.mode;
  33759   }
  33760 
  33761   if( !readStdin ){
  33762     /* Run all arguments that do not begin with '-' as if they were separate
  33763     ** command-line inputs, except for the argToSkip argument which contains
  33764     ** the database filename.
  33765     */
  33766     for(i=0; i<nCmd; i++){
  33767       echo_group_input(&data, azCmd[i]);
  33768       if( azCmd[i][0]=='.' ){
  33769         rc = do_meta_command(azCmd[i], &data);
  33770         if( rc ){
  33771           if( rc==2 ) rc = 0;
  33772           goto shell_main_exit;
  33773         }
  33774       }else{
  33775         open_db(&data, 0);
  33776         rc = shell_exec(&data, azCmd[i], &zErrMsg);
  33777         if( zErrMsg || rc ){
  33778           if( zErrMsg!=0 ){
  33779             shellEmitError(zErrMsg);
  33780           }else{
  33781             sqlite3_fprintf(stderr,
  33782                             "Error: unable to process SQL: %s\n", azCmd[i]);
  33783           }
  33784           sqlite3_free(zErrMsg);
  33785           if( rc==0 ) rc = 1;
  33786           goto shell_main_exit;
  33787         }
  33788       }
  33789     }
  33790   }else{
  33791     /* Run commands received from standard input
  33792     */
  33793     if( stdin_is_interactive ){
  33794       char *zHome;
  33795       char *zHistory;
  33796       int nHistory;
  33797       sqlite3_fprintf(stdout,
  33798             "SQLite version %s %.19s\n" /*extra-version-info*/
  33799             "Enter \".help\" for usage hints.\n",
  33800             sqlite3_libversion(), sqlite3_sourceid());
  33801       if( warnInmemoryDb ){
  33802         sputz(stdout, "Connected to a ");
  33803         printBold("transient in-memory database");
  33804         sputz(stdout, ".\nUse \".open FILENAME\" to reopen on a"
  33805               " persistent database.\n");
  33806       }
  33807       zHistory = getenv("SQLITE_HISTORY");
  33808       if( zHistory ){
  33809         zHistory = strdup(zHistory);
  33810       }else if( (zHome = find_home_dir(0))!=0 ){
  33811         nHistory = strlen30(zHome) + 20;
  33812         if( (zHistory = malloc(nHistory))!=0 ){
  33813           sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
  33814         }
  33815       }
  33816       if( zHistory ){ shell_read_history(zHistory); }
  33817 #if (HAVE_READLINE || HAVE_EDITLINE) && !defined(SQLITE_OMIT_READLINE_COMPLETION)
  33818       rl_attempted_completion_function = readline_completion;
  33819 #elif HAVE_LINENOISE==1
  33820       linenoiseSetCompletionCallback(linenoise_completion);
  33821 #elif HAVE_LINENOISE==2
  33822       linenoiseSetCompletionCallback(linenoise_completion, NULL);
  33823 #endif
  33824       data.in = 0;
  33825       rc = process_input(&data);
  33826       if( zHistory ){
  33827         shell_stifle_history(2000);
  33828         shell_write_history(zHistory);
  33829         free(zHistory);
  33830       }
  33831     }else{
  33832       data.in = stdin;
  33833       rc = process_input(&data);
  33834     }
  33835   }
  33836 #ifndef SQLITE_SHELL_FIDDLE
  33837   /* In WASM mode we have to leave the db state in place so that
  33838   ** client code can "push" SQL into it after this call returns. */
  33839 #ifndef SQLITE_OMIT_VIRTUALTABLE
  33840   if( data.expert.pExpert ){
  33841     expertFinish(&data, 1, 0);
  33842   }
  33843 #endif
  33844  shell_main_exit:
  33845   free(azCmd);
  33846   set_table_name(&data, 0);
  33847   if( data.db ){
  33848     session_close_all(&data, -1);
  33849     close_db(data.db);
  33850   }
  33851   for(i=0; i<ArraySize(data.aAuxDb); i++){
  33852     sqlite3_free(data.aAuxDb[i].zFreeOnClose);
  33853     if( data.aAuxDb[i].db ){
  33854       session_close_all(&data, i);
  33855       close_db(data.aAuxDb[i].db);
  33856     }
  33857   }
  33858   find_home_dir(1);
  33859   output_reset(&data);
  33860   data.doXdgOpen = 0;
  33861   clearTempFile(&data);
  33862 #if !SQLITE_SHELL_IS_UTF8
  33863   for(i=0; i<argcToFree; i++) free(argvToFree[i]);
  33864   free(argvToFree);
  33865 #endif
  33866   free(data.colWidth);
  33867   free(data.zNonce);
  33868   /* Clear the global data structure so that valgrind will detect memory
  33869   ** leaks */
  33870   memset(&data, 0, sizeof(data));
  33871   if( bEnableVfstrace ){
  33872     vfstrace_unregister("trace");
  33873   }
  33874 #ifdef SQLITE_DEBUG
  33875   if( sqlite3_memory_used()>mem_main_enter ){
  33876     sqlite3_fprintf(stderr,"Memory leaked: %u bytes\n",
  33877           (unsigned int)(sqlite3_memory_used()-mem_main_enter));
  33878   }
  33879 #endif
  33880 #else /* SQLITE_SHELL_FIDDLE... */
  33881   shell_main_exit:
  33882 #endif
  33883   return rc;
  33884 }
  33885 
  33886 
  33887 #ifdef SQLITE_SHELL_FIDDLE
  33888 /* Only for emcc experimentation purposes. */
  33889 int fiddle_experiment(int a,int b){
  33890   return a + b;
  33891 }
  33892 
  33893 /*
  33894 ** Returns a pointer to the current DB handle.
  33895 */
  33896 sqlite3 * fiddle_db_handle(){
  33897   return globalDb;
  33898 }
  33899 
  33900 /*
  33901 ** Returns a pointer to the given DB name's VFS. If zDbName is 0 then
  33902 ** "main" is assumed. Returns 0 if no db with the given name is
  33903 ** open.
  33904 */
  33905 sqlite3_vfs * fiddle_db_vfs(const char *zDbName){
  33906   sqlite3_vfs * pVfs = 0;
  33907   if(globalDb){
  33908     sqlite3_file_control(globalDb, zDbName ? zDbName : "main",
  33909                          SQLITE_FCNTL_VFS_POINTER, &pVfs);
  33910   }
  33911   return pVfs;
  33912 }
  33913 
  33914 /* Only for emcc experimentation purposes. */
  33915 sqlite3 * fiddle_db_arg(sqlite3 *arg){
  33916     sqlite3_fprintf(stdout, "fiddle_db_arg(%p)\n", (const void*)arg);
  33917     return arg;
  33918 }
  33919 
  33920 /*
  33921 ** Intended to be called via a SharedWorker() while a separate
  33922 ** SharedWorker() (which manages the wasm module) is performing work
  33923 ** which should be interrupted. Unfortunately, SharedWorker is not
  33924 ** portable enough to make real use of.
  33925 */
  33926 void fiddle_interrupt(void){
  33927   if( globalDb ) sqlite3_interrupt(globalDb);
  33928 }
  33929 
  33930 /*
  33931 ** Returns the filename of the given db name, assuming "main" if
  33932 ** zDbName is NULL. Returns NULL if globalDb is not opened.
  33933 */
  33934 const char * fiddle_db_filename(const char * zDbName){
  33935     return globalDb
  33936       ? sqlite3_db_filename(globalDb, zDbName ? zDbName : "main")
  33937       : NULL;
  33938 }
  33939 
  33940 /*
  33941 ** Completely wipes out the contents of the currently-opened database
  33942 ** but leaves its storage intact for reuse. If any transactions are
  33943 ** active, they are forcibly rolled back.
  33944 */
  33945 void fiddle_reset_db(void){
  33946   if( globalDb ){
  33947     int rc;
  33948     while( sqlite3_txn_state(globalDb,0)>0 ){
  33949       /*
  33950       ** Resolve problem reported in
  33951       ** https://sqlite.org/forum/forumpost/0b41a25d65
  33952       */
  33953       sqlite3_fputs("Rolling back in-progress transaction.\n", stdout);
  33954       sqlite3_exec(globalDb,"ROLLBACK", 0, 0, 0);
  33955     }
  33956     rc = sqlite3_db_config(globalDb, SQLITE_DBCONFIG_RESET_DATABASE, 1, 0);
  33957     if( 0==rc ) sqlite3_exec(globalDb, "VACUUM", 0, 0, 0);
  33958     sqlite3_db_config(globalDb, SQLITE_DBCONFIG_RESET_DATABASE, 0, 0);
  33959   }
  33960 }
  33961 
  33962 /*
  33963 ** Uses the current database's VFS xRead to stream the db file's
  33964 ** contents out to the given callback. The callback gets a single
  33965 ** chunk of size n (its 2nd argument) on each call and must return 0
  33966 ** on success, non-0 on error. This function returns 0 on success,
  33967 ** SQLITE_NOTFOUND if no db is open, or propagates any other non-0
  33968 ** code from the callback. Note that this is not thread-friendly: it
  33969 ** expects that it will be the only thread reading the db file and
  33970 ** takes no measures to ensure that is the case.
  33971 */
  33972 int fiddle_export_db( int (*xCallback)(unsigned const char *zOut, int n) ){
  33973   sqlite3_int64 nSize = 0;
  33974   sqlite3_int64 nPos = 0;
  33975   sqlite3_file * pFile = 0;
  33976   unsigned char buf[1024 * 8];
  33977   int nBuf = (int)sizeof(buf);
  33978   int rc = shellState.db
  33979     ? sqlite3_file_control(shellState.db, "main",
  33980                            SQLITE_FCNTL_FILE_POINTER, &pFile)
  33981     : SQLITE_NOTFOUND;
  33982   if( rc ) return rc;
  33983   rc = pFile->pMethods->xFileSize(pFile, &nSize);
  33984   if( rc ) return rc;
  33985   if(nSize % nBuf){
  33986     /* DB size is not an even multiple of the buffer size. Reduce
  33987     ** buffer size so that we do not unduly inflate the db size when
  33988     ** exporting. */
  33989     if(0 == nSize % 4096) nBuf = 4096;
  33990     else if(0 == nSize % 2048) nBuf = 2048;
  33991     else if(0 == nSize % 1024) nBuf = 1024;
  33992     else nBuf = 512;
  33993   }
  33994   for( ; 0==rc && nPos<nSize; nPos += nBuf ){
  33995     rc = pFile->pMethods->xRead(pFile, buf, nBuf, nPos);
  33996     if(SQLITE_IOERR_SHORT_READ == rc){
  33997       rc = (nPos + nBuf) < nSize ? rc : 0/*assume EOF*/;
  33998     }
  33999     if( 0==rc ) rc = xCallback(buf, nBuf);
  34000   }
  34001   return rc;
  34002 }
  34003 
  34004 /*
  34005 ** Trivial exportable function for emscripten. It processes zSql as if
  34006 ** it were input to the sqlite3 shell and redirects all output to the
  34007 ** wasm binding. fiddle_main() must have been called before this
  34008 ** is called, or results are undefined.
  34009 */
  34010 void fiddle_exec(const char * zSql){
  34011   if(zSql && *zSql){
  34012     if('.'==*zSql) puts(zSql);
  34013     shellState.wasm.zInput = zSql;
  34014     shellState.wasm.zPos = zSql;
  34015     process_input(&shellState);
  34016     shellState.wasm.zInput = shellState.wasm.zPos = 0;
  34017   }
  34018 }
  34019 #endif /* SQLITE_SHELL_FIDDLE */