github.com/tailscale/sqlite@v0.0.0-20240515181108-c667cbe57c66/cgosqlite/shell.c.disabled (about)

     1  /* DO NOT EDIT!
     2  ** This file is automatically generated by the script in the canonical
     3  ** SQLite source tree at tool/mkshellc.tcl.  That script combines source
     4  ** code from various constituent source files of SQLite into this single
     5  ** "shell.c" file used to implement the SQLite command-line shell.
     6  **
     7  ** Most of the code found below comes from the "src/shell.c.in" file in
     8  ** the canonical SQLite source tree.  That main file contains "INCLUDE"
     9  ** lines that specify other files in the canonical source tree that are
    10  ** inserted to getnerate this complete program source file.
    11  **
    12  ** The code from multiple files is combined into this single "shell.c"
    13  ** source file to help make the command-line program easier to compile.
    14  **
    15  ** To modify this program, get a copy of the canonical SQLite source tree,
    16  ** edit the src/shell.c.in" and/or some of the other files that are included
    17  ** by "src/shell.c.in", then rerun the tool/mkshellc.tcl script.
    18  */
    19  /*
    20  ** 2001 September 15
    21  **
    22  ** The author disclaims copyright to this source code.  In place of
    23  ** a legal notice, here is a blessing:
    24  **
    25  **    May you do good and not evil.
    26  **    May you find forgiveness for yourself and forgive others.
    27  **    May you share freely, never taking more than you give.
    28  **
    29  *************************************************************************
    30  ** This file contains code to implement the "sqlite" command line
    31  ** utility for accessing SQLite databases.
    32  */
    33  #if (defined(_WIN32) || defined(WIN32)) && !defined(_CRT_SECURE_NO_WARNINGS)
    34  /* This needs to come before any includes for MSVC compiler */
    35  #define _CRT_SECURE_NO_WARNINGS
    36  #endif
    37  typedef unsigned int u32;
    38  typedef unsigned short int u16;
    39  
    40  /*
    41  ** Optionally #include a user-defined header, whereby compilation options
    42  ** may be set prior to where they take effect, but after platform setup.
    43  ** If SQLITE_CUSTOM_INCLUDE=? is defined, its value names the #include
    44  ** file. Note that this macro has a like effect on sqlite3.c compilation.
    45  */
    46  # define SHELL_STRINGIFY_(f) #f
    47  # define SHELL_STRINGIFY(f) SHELL_STRINGIFY_(f)
    48  #ifdef SQLITE_CUSTOM_INCLUDE
    49  # include SHELL_STRINGIFY(SQLITE_CUSTOM_INCLUDE)
    50  #endif
    51  
    52  /*
    53  ** Determine if we are dealing with WinRT, which provides only a subset of
    54  ** the full Win32 API.
    55  */
    56  #if !defined(SQLITE_OS_WINRT)
    57  # define SQLITE_OS_WINRT 0
    58  #endif
    59  
    60  /*
    61  ** If SQLITE_SHELL_FIDDLE is defined then the shell is modified
    62  ** somewhat for use as a WASM module in a web browser. This flag
    63  ** should only be used when building the "fiddle" web application, as
    64  ** the browser-mode build has much different user input requirements
    65  ** and this build mode rewires the user input subsystem to account for
    66  ** that.
    67  */
    68  
    69  /*
    70  ** Warning pragmas copied from msvc.h in the core.
    71  */
    72  #if defined(_MSC_VER)
    73  #pragma warning(disable : 4054)
    74  #pragma warning(disable : 4055)
    75  #pragma warning(disable : 4100)
    76  #pragma warning(disable : 4127)
    77  #pragma warning(disable : 4130)
    78  #pragma warning(disable : 4152)
    79  #pragma warning(disable : 4189)
    80  #pragma warning(disable : 4206)
    81  #pragma warning(disable : 4210)
    82  #pragma warning(disable : 4232)
    83  #pragma warning(disable : 4244)
    84  #pragma warning(disable : 4305)
    85  #pragma warning(disable : 4306)
    86  #pragma warning(disable : 4702)
    87  #pragma warning(disable : 4706)
    88  #endif /* defined(_MSC_VER) */
    89  
    90  /*
    91  ** No support for loadable extensions in VxWorks.
    92  */
    93  #if (defined(__RTP__) || defined(_WRS_KERNEL)) && !SQLITE_OMIT_LOAD_EXTENSION
    94  # define SQLITE_OMIT_LOAD_EXTENSION 1
    95  #endif
    96  
    97  /*
    98  ** Enable large-file support for fopen() and friends on unix.
    99  */
   100  #ifndef SQLITE_DISABLE_LFS
   101  # define _LARGE_FILE       1
   102  # ifndef _FILE_OFFSET_BITS
   103  #   define _FILE_OFFSET_BITS 64
   104  # endif
   105  # define _LARGEFILE_SOURCE 1
   106  #endif
   107  
   108  #if defined(SQLITE_SHELL_FIDDLE) && !defined(_POSIX_SOURCE)
   109  /*
   110  ** emcc requires _POSIX_SOURCE (or one of several similar defines)
   111  ** to expose strdup().
   112  */
   113  # define _POSIX_SOURCE
   114  #endif
   115  
   116  #include <stdlib.h>
   117  #include <string.h>
   118  #include <stdio.h>
   119  #include <assert.h>
   120  #include <math.h>
   121  #include "sqlite3.h"
   122  typedef sqlite3_int64 i64;
   123  typedef sqlite3_uint64 u64;
   124  typedef unsigned char u8;
   125  #if SQLITE_USER_AUTHENTICATION
   126  # include "sqlite3userauth.h"
   127  #endif
   128  #include <ctype.h>
   129  #include <stdarg.h>
   130  
   131  #if !defined(_WIN32) && !defined(WIN32)
   132  # include <signal.h>
   133  # if !defined(__RTP__) && !defined(_WRS_KERNEL) && !defined(SQLITE_WASI)
   134  #  include <pwd.h>
   135  # endif
   136  #endif
   137  #if (!defined(_WIN32) && !defined(WIN32)) || defined(__MINGW32__)
   138  # include <unistd.h>
   139  # include <dirent.h>
   140  # define GETPID getpid
   141  # if defined(__MINGW32__)
   142  #  define DIRENT dirent
   143  #  ifndef S_ISLNK
   144  #   define S_ISLNK(mode) (0)
   145  #  endif
   146  # endif
   147  #else
   148  # define GETPID (int)GetCurrentProcessId
   149  #endif
   150  #include <sys/types.h>
   151  #include <sys/stat.h>
   152  
   153  #if HAVE_READLINE
   154  # include <readline/readline.h>
   155  # include <readline/history.h>
   156  #endif
   157  
   158  #if HAVE_EDITLINE
   159  # include <editline/readline.h>
   160  #endif
   161  
   162  #if HAVE_EDITLINE || HAVE_READLINE
   163  
   164  # define shell_add_history(X) add_history(X)
   165  # define shell_read_history(X) read_history(X)
   166  # define shell_write_history(X) write_history(X)
   167  # define shell_stifle_history(X) stifle_history(X)
   168  # define shell_readline(X) readline(X)
   169  
   170  #elif HAVE_LINENOISE
   171  
   172  # include "linenoise.h"
   173  # define shell_add_history(X) linenoiseHistoryAdd(X)
   174  # define shell_read_history(X) linenoiseHistoryLoad(X)
   175  # define shell_write_history(X) linenoiseHistorySave(X)
   176  # define shell_stifle_history(X) linenoiseHistorySetMaxLen(X)
   177  # define shell_readline(X) linenoise(X)
   178  
   179  #else
   180  
   181  # define shell_read_history(X)
   182  # define shell_write_history(X)
   183  # define shell_stifle_history(X)
   184  
   185  # define SHELL_USE_LOCAL_GETLINE 1
   186  #endif
   187  
   188  #ifndef deliberate_fall_through
   189  /* Quiet some compilers about some of our intentional code. */
   190  # if defined(GCC_VERSION) && GCC_VERSION>=7000000
   191  #  define deliberate_fall_through __attribute__((fallthrough));
   192  # else
   193  #  define deliberate_fall_through
   194  # endif
   195  #endif
   196  
   197  #if defined(_WIN32) || defined(WIN32)
   198  # if SQLITE_OS_WINRT
   199  #  define SQLITE_OMIT_POPEN 1
   200  # else
   201  #  include <io.h>
   202  #  include <fcntl.h>
   203  #  define isatty(h) _isatty(h)
   204  #  ifndef access
   205  #   define access(f,m) _access((f),(m))
   206  #  endif
   207  #  ifndef unlink
   208  #   define unlink _unlink
   209  #  endif
   210  #  ifndef strdup
   211  #   define strdup _strdup
   212  #  endif
   213  #  undef popen
   214  #  define popen _popen
   215  #  undef pclose
   216  #  define pclose _pclose
   217  # endif
   218  #else
   219   /* Make sure isatty() has a prototype. */
   220   extern int isatty(int);
   221  
   222  # if !defined(__RTP__) && !defined(_WRS_KERNEL) && !defined(SQLITE_WASI)
   223    /* popen and pclose are not C89 functions and so are
   224    ** sometimes omitted from the <stdio.h> header */
   225     extern FILE *popen(const char*,const char*);
   226     extern int pclose(FILE*);
   227  # else
   228  #  define SQLITE_OMIT_POPEN 1
   229  # endif
   230  #endif
   231  
   232  #if defined(_WIN32_WCE)
   233  /* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
   234   * thus we always assume that we have a console. That can be
   235   * overridden with the -batch command line option.
   236   */
   237  #define isatty(x) 1
   238  #endif
   239  
   240  /* ctype macros that work with signed characters */
   241  #define IsSpace(X)  isspace((unsigned char)X)
   242  #define IsDigit(X)  isdigit((unsigned char)X)
   243  #define ToLower(X)  (char)tolower((unsigned char)X)
   244  
   245  #if defined(_WIN32) || defined(WIN32)
   246  #if SQLITE_OS_WINRT
   247  #include <intrin.h>
   248  #endif
   249  #undef WIN32_LEAN_AND_MEAN
   250  #define WIN32_LEAN_AND_MEAN
   251  #include <windows.h>
   252  
   253  /* string conversion routines only needed on Win32 */
   254  extern char *sqlite3_win32_unicode_to_utf8(LPCWSTR);
   255  extern char *sqlite3_win32_mbcs_to_utf8_v2(const char *, int);
   256  extern char *sqlite3_win32_utf8_to_mbcs_v2(const char *, int);
   257  extern LPWSTR sqlite3_win32_utf8_to_unicode(const char *zText);
   258  #endif
   259  
   260  /* On Windows, we normally run with output mode of TEXT so that \n characters
   261  ** are automatically translated into \r\n.  However, this behavior needs
   262  ** to be disabled in some cases (ex: when generating CSV output and when
   263  ** rendering quoted strings that contain \n characters).  The following
   264  ** routines take care of that.
   265  */
   266  #if (defined(_WIN32) || defined(WIN32)) && !SQLITE_OS_WINRT
   267  static void setBinaryMode(FILE *file, int isOutput){
   268    if( isOutput ) fflush(file);
   269    _setmode(_fileno(file), _O_BINARY);
   270  }
   271  static void setTextMode(FILE *file, int isOutput){
   272    if( isOutput ) fflush(file);
   273    _setmode(_fileno(file), _O_TEXT);
   274  }
   275  #else
   276  # define setBinaryMode(X,Y)
   277  # define setTextMode(X,Y)
   278  #endif
   279  
   280  /* True if the timer is enabled */
   281  static int enableTimer = 0;
   282  
   283  /* A version of strcmp() that works with NULL values */
   284  static int cli_strcmp(const char *a, const char *b){
   285    if( a==0 ) a = "";
   286    if( b==0 ) b = "";
   287    return strcmp(a,b);
   288  }
   289  static int cli_strncmp(const char *a, const char *b, size_t n){
   290    if( a==0 ) a = "";
   291    if( b==0 ) b = "";
   292    return strncmp(a,b,n);
   293  }
   294  
   295  /* Return the current wall-clock time */
   296  static sqlite3_int64 timeOfDay(void){
   297    static sqlite3_vfs *clockVfs = 0;
   298    sqlite3_int64 t;
   299    if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
   300    if( clockVfs==0 ) return 0;  /* Never actually happens */
   301    if( clockVfs->iVersion>=2 && clockVfs->xCurrentTimeInt64!=0 ){
   302      clockVfs->xCurrentTimeInt64(clockVfs, &t);
   303    }else{
   304      double r;
   305      clockVfs->xCurrentTime(clockVfs, &r);
   306      t = (sqlite3_int64)(r*86400000.0);
   307    }
   308    return t;
   309  }
   310  
   311  #if !defined(_WIN32) && !defined(WIN32) && !defined(__minux)
   312  #include <sys/time.h>
   313  #include <sys/resource.h>
   314  
   315  /* VxWorks does not support getrusage() as far as we can determine */
   316  #if defined(_WRS_KERNEL) || defined(__RTP__)
   317  struct rusage {
   318    struct timeval ru_utime; /* user CPU time used */
   319    struct timeval ru_stime; /* system CPU time used */
   320  };
   321  #define getrusage(A,B) memset(B,0,sizeof(*B))
   322  #endif
   323  
   324  /* Saved resource information for the beginning of an operation */
   325  static struct rusage sBegin;  /* CPU time at start */
   326  static sqlite3_int64 iBegin;  /* Wall-clock time at start */
   327  
   328  /*
   329  ** Begin timing an operation
   330  */
   331  static void beginTimer(void){
   332    if( enableTimer ){
   333      getrusage(RUSAGE_SELF, &sBegin);
   334      iBegin = timeOfDay();
   335    }
   336  }
   337  
   338  /* Return the difference of two time_structs in seconds */
   339  static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
   340    return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
   341           (double)(pEnd->tv_sec - pStart->tv_sec);
   342  }
   343  
   344  /*
   345  ** Print the timing results.
   346  */
   347  static void endTimer(void){
   348    if( enableTimer ){
   349      sqlite3_int64 iEnd = timeOfDay();
   350      struct rusage sEnd;
   351      getrusage(RUSAGE_SELF, &sEnd);
   352      printf("Run Time: real %.3f user %f sys %f\n",
   353         (iEnd - iBegin)*0.001,
   354         timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
   355         timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
   356    }
   357  }
   358  
   359  #define BEGIN_TIMER beginTimer()
   360  #define END_TIMER endTimer()
   361  #define HAS_TIMER 1
   362  
   363  #elif (defined(_WIN32) || defined(WIN32))
   364  
   365  /* Saved resource information for the beginning of an operation */
   366  static HANDLE hProcess;
   367  static FILETIME ftKernelBegin;
   368  static FILETIME ftUserBegin;
   369  static sqlite3_int64 ftWallBegin;
   370  typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME,
   371                                      LPFILETIME, LPFILETIME);
   372  static GETPROCTIMES getProcessTimesAddr = NULL;
   373  
   374  /*
   375  ** Check to see if we have timer support.  Return 1 if necessary
   376  ** support found (or found previously).
   377  */
   378  static int hasTimer(void){
   379    if( getProcessTimesAddr ){
   380      return 1;
   381    } else {
   382  #if !SQLITE_OS_WINRT
   383      /* GetProcessTimes() isn't supported in WIN95 and some other Windows
   384      ** versions. See if the version we are running on has it, and if it
   385      ** does, save off a pointer to it and the current process handle.
   386      */
   387      hProcess = GetCurrentProcess();
   388      if( hProcess ){
   389        HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
   390        if( NULL != hinstLib ){
   391          getProcessTimesAddr =
   392              (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
   393          if( NULL != getProcessTimesAddr ){
   394            return 1;
   395          }
   396          FreeLibrary(hinstLib);
   397        }
   398      }
   399  #endif
   400    }
   401    return 0;
   402  }
   403  
   404  /*
   405  ** Begin timing an operation
   406  */
   407  static void beginTimer(void){
   408    if( enableTimer && getProcessTimesAddr ){
   409      FILETIME ftCreation, ftExit;
   410      getProcessTimesAddr(hProcess,&ftCreation,&ftExit,
   411                          &ftKernelBegin,&ftUserBegin);
   412      ftWallBegin = timeOfDay();
   413    }
   414  }
   415  
   416  /* Return the difference of two FILETIME structs in seconds */
   417  static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
   418    sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
   419    sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
   420    return (double) ((i64End - i64Start) / 10000000.0);
   421  }
   422  
   423  /*
   424  ** Print the timing results.
   425  */
   426  static void endTimer(void){
   427    if( enableTimer && getProcessTimesAddr){
   428      FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
   429      sqlite3_int64 ftWallEnd = timeOfDay();
   430      getProcessTimesAddr(hProcess,&ftCreation,&ftExit,&ftKernelEnd,&ftUserEnd);
   431      printf("Run Time: real %.3f user %f sys %f\n",
   432         (ftWallEnd - ftWallBegin)*0.001,
   433         timeDiff(&ftUserBegin, &ftUserEnd),
   434         timeDiff(&ftKernelBegin, &ftKernelEnd));
   435    }
   436  }
   437  
   438  #define BEGIN_TIMER beginTimer()
   439  #define END_TIMER endTimer()
   440  #define HAS_TIMER hasTimer()
   441  
   442  #else
   443  #define BEGIN_TIMER
   444  #define END_TIMER
   445  #define HAS_TIMER 0
   446  #endif
   447  
   448  /*
   449  ** Used to prevent warnings about unused parameters
   450  */
   451  #define UNUSED_PARAMETER(x) (void)(x)
   452  
   453  /*
   454  ** Number of elements in an array
   455  */
   456  #define ArraySize(X)  (int)(sizeof(X)/sizeof(X[0]))
   457  
   458  /*
   459  ** If the following flag is set, then command execution stops
   460  ** at an error if we are not interactive.
   461  */
   462  static int bail_on_error = 0;
   463  
   464  /*
   465  ** Treat stdin as an interactive input if the following variable
   466  ** is true.  Otherwise, assume stdin is connected to a file or pipe.
   467  */
   468  static int stdin_is_interactive = 1;
   469  
   470  #if (defined(_WIN32) || defined(WIN32)) && SHELL_USE_LOCAL_GETLINE \
   471    && !defined(SHELL_OMIT_WIN_UTF8)
   472  # define SHELL_WIN_UTF8_OPT 1
   473  #else
   474  # define SHELL_WIN_UTF8_OPT 0
   475  #endif
   476  
   477  #if SHELL_WIN_UTF8_OPT
   478  /*
   479  ** Setup console for UTF-8 input/output when following variable true.
   480  */
   481  static int console_utf8 = 0;
   482  #endif
   483  
   484  /*
   485  ** On Windows systems we have to know if standard output is a console
   486  ** in order to translate UTF-8 into MBCS.  The following variable is
   487  ** true if translation is required.
   488  */
   489  static int stdout_is_console = 1;
   490  
   491  /*
   492  ** The following is the open SQLite database.  We make a pointer
   493  ** to this database a static variable so that it can be accessed
   494  ** by the SIGINT handler to interrupt database processing.
   495  */
   496  static sqlite3 *globalDb = 0;
   497  
   498  /*
   499  ** True if an interrupt (Control-C) has been received.
   500  */
   501  static volatile int seenInterrupt = 0;
   502  
   503  /*
   504  ** This is the name of our program. It is set in main(), used
   505  ** in a number of other places, mostly for error messages.
   506  */
   507  static char *Argv0;
   508  
   509  /*
   510  ** Prompt strings. Initialized in main. Settable with
   511  **   .prompt main continue
   512  */
   513  #define PROMPT_LEN_MAX 20
   514  /* First line prompt.   default: "sqlite> " */
   515  static char mainPrompt[PROMPT_LEN_MAX];
   516  /* Continuation prompt. default: "   ...> " */
   517  static char continuePrompt[PROMPT_LEN_MAX];
   518  
   519  /* This is variant of the standard-library strncpy() routine with the
   520  ** one change that the destination string is always zero-terminated, even
   521  ** if there is no zero-terminator in the first n-1 characters of the source
   522  ** string.
   523  */
   524  static char *shell_strncpy(char *dest, const char *src, size_t n){
   525    size_t i;
   526    for(i=0; i<n-1 && src[i]!=0; i++) dest[i] = src[i];
   527    dest[i] = 0;
   528    return dest;
   529  }
   530  
   531  /*
   532  ** Optionally disable dynamic continuation prompt.
   533  ** Unless disabled, the continuation prompt shows open SQL lexemes if any,
   534  ** or open parentheses level if non-zero, or continuation prompt as set.
   535  ** This facility interacts with the scanner and process_input() where the
   536  ** below 5 macros are used.
   537  */
   538  #ifdef SQLITE_OMIT_DYNAPROMPT
   539  # define CONTINUATION_PROMPT continuePrompt
   540  # define CONTINUE_PROMPT_RESET
   541  # define CONTINUE_PROMPT_AWAITS(p,s)
   542  # define CONTINUE_PROMPT_AWAITC(p,c)
   543  # define CONTINUE_PAREN_INCR(p,n)
   544  # define CONTINUE_PROMPT_PSTATE 0
   545  typedef void *t_NoDynaPrompt;
   546  # define SCAN_TRACKER_REFTYPE t_NoDynaPrompt
   547  #else
   548  # define CONTINUATION_PROMPT dynamicContinuePrompt()
   549  # define CONTINUE_PROMPT_RESET \
   550    do {setLexemeOpen(&dynPrompt,0,0); trackParenLevel(&dynPrompt,0);} while(0)
   551  # define CONTINUE_PROMPT_AWAITS(p,s) \
   552    if(p && stdin_is_interactive) setLexemeOpen(p, s, 0)
   553  # define CONTINUE_PROMPT_AWAITC(p,c) \
   554    if(p && stdin_is_interactive) setLexemeOpen(p, 0, c)
   555  # define CONTINUE_PAREN_INCR(p,n) \
   556    if(p && stdin_is_interactive) (trackParenLevel(p,n))
   557  # define CONTINUE_PROMPT_PSTATE (&dynPrompt)
   558  typedef struct DynaPrompt *t_DynaPromptRef;
   559  # define SCAN_TRACKER_REFTYPE t_DynaPromptRef
   560  
   561  static struct DynaPrompt {
   562    char dynamicPrompt[PROMPT_LEN_MAX];
   563    char acAwait[2];
   564    int inParenLevel;
   565    char *zScannerAwaits;
   566  } dynPrompt = { {0}, {0}, 0, 0 };
   567  
   568  /* Record parenthesis nesting level change, or force level to 0. */
   569  static void trackParenLevel(struct DynaPrompt *p, int ni){
   570    p->inParenLevel += ni;
   571    if( ni==0 ) p->inParenLevel = 0;
   572    p->zScannerAwaits = 0;
   573  }
   574  
   575  /* Record that a lexeme is opened, or closed with args==0. */
   576  static void setLexemeOpen(struct DynaPrompt *p, char *s, char c){
   577    if( s!=0 || c==0 ){
   578      p->zScannerAwaits = s;
   579      p->acAwait[0] = 0;
   580    }else{
   581      p->acAwait[0] = c;
   582      p->zScannerAwaits = p->acAwait;
   583    }
   584  }
   585  
   586  /* Upon demand, derive the continuation prompt to display. */
   587  static char *dynamicContinuePrompt(void){
   588    if( continuePrompt[0]==0
   589        || (dynPrompt.zScannerAwaits==0 && dynPrompt.inParenLevel == 0) ){
   590      return continuePrompt;
   591    }else{
   592      if( dynPrompt.zScannerAwaits ){
   593        size_t ncp = strlen(continuePrompt);
   594        size_t ndp = strlen(dynPrompt.zScannerAwaits);
   595        if( ndp > ncp-3 ) return continuePrompt;
   596        strcpy(dynPrompt.dynamicPrompt, dynPrompt.zScannerAwaits);
   597        while( ndp<3 ) dynPrompt.dynamicPrompt[ndp++] = ' ';
   598        shell_strncpy(dynPrompt.dynamicPrompt+3, continuePrompt+3,
   599                PROMPT_LEN_MAX-4);
   600      }else{
   601        if( dynPrompt.inParenLevel>9 ){
   602          shell_strncpy(dynPrompt.dynamicPrompt, "(..", 4);
   603        }else if( dynPrompt.inParenLevel<0 ){
   604          shell_strncpy(dynPrompt.dynamicPrompt, ")x!", 4);
   605        }else{
   606          shell_strncpy(dynPrompt.dynamicPrompt, "(x.", 4);
   607          dynPrompt.dynamicPrompt[2] = (char)('0'+dynPrompt.inParenLevel);
   608        }
   609        shell_strncpy(dynPrompt.dynamicPrompt+3, continuePrompt+3, PROMPT_LEN_MAX-4);
   610      }
   611    }
   612    return dynPrompt.dynamicPrompt;
   613  }
   614  #endif /* !defined(SQLITE_OMIT_DYNAPROMPT) */
   615  
   616  #if SHELL_WIN_UTF8_OPT
   617  /* Following struct is used for -utf8 operation. */
   618  static struct ConsoleState {
   619    int stdinEof;      /* EOF has been seen on console input */
   620    int infsMode;      /* Input file stream mode upon shell start */
   621    UINT inCodePage;   /* Input code page upon shell start */
   622    UINT outCodePage;  /* Output code page upon shell start */
   623    HANDLE hConsoleIn; /* Console input handle */
   624    DWORD consoleMode; /* Console mode upon shell start */
   625  } conState = { 0, 0, 0, 0, INVALID_HANDLE_VALUE, 0 };
   626  
   627  #ifndef _O_U16TEXT /* For build environments lacking this constant: */
   628  # define _O_U16TEXT 0x20000
   629  #endif
   630  
   631  /*
   632  ** Prepare console, (if known to be a WIN32 console), for UTF-8
   633  ** input (from either typing or suitable paste operations) and for
   634  ** UTF-8 rendering. This may "fail" with a message to stderr, where
   635  ** the preparation is not done and common "code page" issues occur.
   636  */
   637  static void console_prepare(void){
   638    HANDLE hCI = GetStdHandle(STD_INPUT_HANDLE);
   639    DWORD consoleMode = 0;
   640    if( isatty(0) && GetFileType(hCI)==FILE_TYPE_CHAR
   641        && GetConsoleMode( hCI, &consoleMode) ){
   642      if( !IsValidCodePage(CP_UTF8) ){
   643        fprintf(stderr, "Cannot use UTF-8 code page.\n");
   644        console_utf8 = 0;
   645        return;
   646      }
   647      conState.hConsoleIn = hCI;
   648      conState.consoleMode = consoleMode;
   649      conState.inCodePage = GetConsoleCP();
   650      conState.outCodePage = GetConsoleOutputCP();
   651      SetConsoleCP(CP_UTF8);
   652      SetConsoleOutputCP(CP_UTF8);
   653      consoleMode |= ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT;
   654      SetConsoleMode(conState.hConsoleIn, consoleMode);
   655      conState.infsMode = _setmode(_fileno(stdin), _O_U16TEXT);
   656      console_utf8 = 1;
   657    }else{
   658      console_utf8 = 0;
   659    }
   660  }
   661  
   662  /*
   663  ** Undo the effects of console_prepare(), if any.
   664  */
   665  static void SQLITE_CDECL console_restore(void){
   666    if( console_utf8 && conState.inCodePage!=0
   667        && conState.hConsoleIn!=INVALID_HANDLE_VALUE ){
   668      _setmode(_fileno(stdin), conState.infsMode);
   669      SetConsoleCP(conState.inCodePage);
   670      SetConsoleOutputCP(conState.outCodePage);
   671      SetConsoleMode(conState.hConsoleIn, conState.consoleMode);
   672      /* Avoid multiple calls. */
   673      conState.hConsoleIn = INVALID_HANDLE_VALUE;
   674      conState.consoleMode = 0;
   675      console_utf8 = 0;
   676    }
   677  }
   678  
   679  /*
   680  ** Collect input like fgets(...) with special provisions for input
   681  ** from the Windows console to get around its strange coding issues.
   682  ** Defers to plain fgets() when input is not interactive or when the
   683  ** startup option, -utf8, has not been provided or taken effect.
   684  */
   685  static char* utf8_fgets(char *buf, int ncmax, FILE *fin){
   686    if( fin==0 ) fin = stdin;
   687    if( fin==stdin && stdin_is_interactive && console_utf8 ){
   688  # define SQLITE_IALIM 150
   689      wchar_t wbuf[SQLITE_IALIM];
   690      int lend = 0;
   691      int noc = 0;
   692      if( ncmax==0 || conState.stdinEof ) return 0;
   693      buf[0] = 0;
   694      while( noc<ncmax-7-1 && !lend ){
   695        /* There is room for at least 2 more characters and a 0-terminator. */
   696        int na = (ncmax > SQLITE_IALIM*4+1 + noc)
   697          ? SQLITE_IALIM : (ncmax-1 - noc)/4;
   698  # undef SQLITE_IALIM
   699        DWORD nbr = 0;
   700        BOOL bRC = ReadConsoleW(conState.hConsoleIn, wbuf, na, &nbr, 0);
   701        if( !bRC || (noc==0 && nbr==0) ) return 0;
   702        if( nbr > 0 ){
   703          int nmb = WideCharToMultiByte(CP_UTF8,WC_COMPOSITECHECK|WC_DEFAULTCHAR,
   704                                        wbuf,nbr,0,0,0,0);
   705          if( nmb !=0 && noc+nmb <= ncmax ){
   706            int iseg = noc;
   707            nmb = WideCharToMultiByte(CP_UTF8,WC_COMPOSITECHECK|WC_DEFAULTCHAR,
   708                                      wbuf,nbr,buf+noc,nmb,0,0);
   709            noc += nmb;
   710            /* Fixup line-ends as coded by Windows for CR (or "Enter".)*/
   711            if( noc > 0 ){
   712              if( buf[noc-1]=='\n' ){
   713                lend = 1;
   714                if( noc > 1 && buf[noc-2]=='\r' ){
   715                  buf[noc-2] = '\n';
   716                  --noc;
   717                }
   718              }
   719            }
   720            /* Check for ^Z (anywhere in line) too. */
   721            while( iseg < noc ){
   722              if( buf[iseg]==0x1a ){
   723                conState.stdinEof = 1;
   724                noc = iseg; /* Chop ^Z and anything following. */
   725                break;
   726              }
   727              ++iseg;
   728            }
   729          }else break; /* Drop apparent garbage in. (Could assert.) */
   730        }else break;
   731      }
   732      /* If got nothing, (after ^Z chop), must be at end-of-file. */
   733      if( noc == 0 ) return 0;
   734      buf[noc] = 0;
   735      return buf;
   736    }else{
   737      return fgets(buf, ncmax, fin);
   738    }
   739  }
   740  
   741  # define fgets(b,n,f) utf8_fgets(b,n,f)
   742  #endif /* SHELL_WIN_UTF8_OPT */
   743  
   744  /*
   745  ** Render output like fprintf().  Except, if the output is going to the
   746  ** console and if this is running on a Windows machine, and if the -utf8
   747  ** option is unavailable or (available and inactive), translate the
   748  ** output from UTF-8 into MBCS for output through 8-bit stdout stream.
   749  ** (With -utf8 active, no translation is needed and must not be done.)
   750  */
   751  #if defined(_WIN32) || defined(WIN32)
   752  void utf8_printf(FILE *out, const char *zFormat, ...){
   753    va_list ap;
   754    va_start(ap, zFormat);
   755    if( stdout_is_console && (out==stdout || out==stderr)
   756  # if SHELL_WIN_UTF8_OPT
   757        && !console_utf8
   758  # endif
   759    ){
   760      char *z1 = sqlite3_vmprintf(zFormat, ap);
   761      char *z2 = sqlite3_win32_utf8_to_mbcs_v2(z1, 0);
   762      sqlite3_free(z1);
   763      fputs(z2, out);
   764      sqlite3_free(z2);
   765    }else{
   766      vfprintf(out, zFormat, ap);
   767    }
   768    va_end(ap);
   769  }
   770  #elif !defined(utf8_printf)
   771  # define utf8_printf fprintf
   772  #endif
   773  
   774  /*
   775  ** Render output like fprintf().  This should not be used on anything that
   776  ** includes string formatting (e.g. "%s").
   777  */
   778  #if !defined(raw_printf)
   779  # define raw_printf fprintf
   780  #endif
   781  
   782  /* Indicate out-of-memory and exit. */
   783  static void shell_out_of_memory(void){
   784    raw_printf(stderr,"Error: out of memory\n");
   785    exit(1);
   786  }
   787  
   788  /* Check a pointer to see if it is NULL.  If it is NULL, exit with an
   789  ** out-of-memory error.
   790  */
   791  static void shell_check_oom(const void *p){
   792    if( p==0 ) shell_out_of_memory();
   793  }
   794  
   795  /*
   796  ** Write I/O traces to the following stream.
   797  */
   798  #ifdef SQLITE_ENABLE_IOTRACE
   799  static FILE *iotrace = 0;
   800  #endif
   801  
   802  /*
   803  ** This routine works like printf in that its first argument is a
   804  ** format string and subsequent arguments are values to be substituted
   805  ** in place of % fields.  The result of formatting this string
   806  ** is written to iotrace.
   807  */
   808  #ifdef SQLITE_ENABLE_IOTRACE
   809  static void SQLITE_CDECL iotracePrintf(const char *zFormat, ...){
   810    va_list ap;
   811    char *z;
   812    if( iotrace==0 ) return;
   813    va_start(ap, zFormat);
   814    z = sqlite3_vmprintf(zFormat, ap);
   815    va_end(ap);
   816    utf8_printf(iotrace, "%s", z);
   817    sqlite3_free(z);
   818  }
   819  #endif
   820  
   821  /*
   822  ** Output string zUtf to stream pOut as w characters.  If w is negative,
   823  ** then right-justify the text.  W is the width in UTF-8 characters, not
   824  ** in bytes.  This is different from the %*.*s specification in printf
   825  ** since with %*.*s the width is measured in bytes, not characters.
   826  */
   827  static void utf8_width_print(FILE *pOut, int w, const char *zUtf){
   828    int i;
   829    int n;
   830    int aw = w<0 ? -w : w;
   831    if( zUtf==0 ) zUtf = "";
   832    for(i=n=0; zUtf[i]; i++){
   833      if( (zUtf[i]&0xc0)!=0x80 ){
   834        n++;
   835        if( n==aw ){
   836          do{ i++; }while( (zUtf[i]&0xc0)==0x80 );
   837          break;
   838        }
   839      }
   840    }
   841    if( n>=aw ){
   842      utf8_printf(pOut, "%.*s", i, zUtf);
   843    }else if( w<0 ){
   844      utf8_printf(pOut, "%*s%s", aw-n, "", zUtf);
   845    }else{
   846      utf8_printf(pOut, "%s%*s", zUtf, aw-n, "");
   847    }
   848  }
   849  
   850  
   851  /*
   852  ** Determines if a string is a number of not.
   853  */
   854  static int isNumber(const char *z, int *realnum){
   855    if( *z=='-' || *z=='+' ) z++;
   856    if( !IsDigit(*z) ){
   857      return 0;
   858    }
   859    z++;
   860    if( realnum ) *realnum = 0;
   861    while( IsDigit(*z) ){ z++; }
   862    if( *z=='.' ){
   863      z++;
   864      if( !IsDigit(*z) ) return 0;
   865      while( IsDigit(*z) ){ z++; }
   866      if( realnum ) *realnum = 1;
   867    }
   868    if( *z=='e' || *z=='E' ){
   869      z++;
   870      if( *z=='+' || *z=='-' ) z++;
   871      if( !IsDigit(*z) ) return 0;
   872      while( IsDigit(*z) ){ z++; }
   873      if( realnum ) *realnum = 1;
   874    }
   875    return *z==0;
   876  }
   877  
   878  /*
   879  ** Compute a string length that is limited to what can be stored in
   880  ** lower 30 bits of a 32-bit signed integer.
   881  */
   882  static int strlen30(const char *z){
   883    const char *z2 = z;
   884    while( *z2 ){ z2++; }
   885    return 0x3fffffff & (int)(z2 - z);
   886  }
   887  
   888  /*
   889  ** Return the length of a string in characters.  Multibyte UTF8 characters
   890  ** count as a single character.
   891  */
   892  static int strlenChar(const char *z){
   893    int n = 0;
   894    while( *z ){
   895      if( (0xc0&*(z++))!=0x80 ) n++;
   896    }
   897    return n;
   898  }
   899  
   900  /*
   901  ** Return open FILE * if zFile exists, can be opened for read
   902  ** and is an ordinary file or a character stream source.
   903  ** Otherwise return 0.
   904  */
   905  static FILE * openChrSource(const char *zFile){
   906  #ifdef _WIN32
   907    struct _stat x = {0};
   908  # define STAT_CHR_SRC(mode) ((mode & (_S_IFCHR|_S_IFIFO|_S_IFREG))!=0)
   909    /* On Windows, open first, then check the stream nature. This order
   910    ** is necessary because _stat() and sibs, when checking a named pipe,
   911    ** effectively break the pipe as its supplier sees it. */
   912    FILE *rv = fopen(zFile, "rb");
   913    if( rv==0 ) return 0;
   914    if( _fstat(_fileno(rv), &x) != 0
   915        || !STAT_CHR_SRC(x.st_mode)){
   916      fclose(rv);
   917      rv = 0;
   918    }
   919    return rv;
   920  #else
   921    struct stat x = {0};
   922    int rc = stat(zFile, &x);
   923  # define STAT_CHR_SRC(mode) (S_ISREG(mode)||S_ISFIFO(mode)||S_ISCHR(mode))
   924    if( rc!=0 ) return 0;
   925    if( STAT_CHR_SRC(x.st_mode) ){
   926      return fopen(zFile, "rb");
   927    }else{
   928      return 0;
   929    }
   930  #endif
   931  #undef STAT_CHR_SRC
   932  }
   933  
   934  /*
   935  ** This routine reads a line of text from FILE in, stores
   936  ** the text in memory obtained from malloc() and returns a pointer
   937  ** to the text.  NULL is returned at end of file, or if malloc()
   938  ** fails.
   939  **
   940  ** If zLine is not NULL then it is a malloced buffer returned from
   941  ** a previous call to this routine that may be reused.
   942  */
   943  static char *local_getline(char *zLine, FILE *in){
   944    int nLine = zLine==0 ? 0 : 100;
   945    int n = 0;
   946  
   947    while( 1 ){
   948      if( n+100>nLine ){
   949        nLine = nLine*2 + 100;
   950        zLine = realloc(zLine, nLine);
   951        shell_check_oom(zLine);
   952      }
   953      if( fgets(&zLine[n], nLine - n, in)==0 ){
   954        if( n==0 ){
   955          free(zLine);
   956          return 0;
   957        }
   958        zLine[n] = 0;
   959        break;
   960      }
   961      while( zLine[n] ) n++;
   962      if( n>0 && zLine[n-1]=='\n' ){
   963        n--;
   964        if( n>0 && zLine[n-1]=='\r' ) n--;
   965        zLine[n] = 0;
   966        break;
   967      }
   968    }
   969  #if defined(_WIN32) || defined(WIN32)
   970    /* For interactive input on Windows systems, without -utf8,
   971    ** translate the multi-byte characterset characters into UTF-8.
   972    ** This is the translation that predates the -utf8 option. */
   973    if( stdin_is_interactive && in==stdin
   974  # if SHELL_WIN_UTF8_OPT
   975        && !console_utf8
   976  # endif /* SHELL_WIN_UTF8_OPT */
   977    ){
   978      char *zTrans = sqlite3_win32_mbcs_to_utf8_v2(zLine, 0);
   979      if( zTrans ){
   980        i64 nTrans = strlen(zTrans)+1;
   981        if( nTrans>nLine ){
   982          zLine = realloc(zLine, nTrans);
   983          shell_check_oom(zLine);
   984        }
   985        memcpy(zLine, zTrans, nTrans);
   986        sqlite3_free(zTrans);
   987      }
   988    }
   989  #endif /* defined(_WIN32) || defined(WIN32) */
   990    return zLine;
   991  }
   992  
   993  /*
   994  ** Retrieve a single line of input text.
   995  **
   996  ** If in==0 then read from standard input and prompt before each line.
   997  ** If isContinuation is true, then a continuation prompt is appropriate.
   998  ** If isContinuation is zero, then the main prompt should be used.
   999  **
  1000  ** If zPrior is not NULL then it is a buffer from a prior call to this
  1001  ** routine that can be reused.
  1002  **
  1003  ** The result is stored in space obtained from malloc() and must either
  1004  ** be freed by the caller or else passed back into this routine via the
  1005  ** zPrior argument for reuse.
  1006  */
  1007  #ifndef SQLITE_SHELL_FIDDLE
  1008  static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
  1009    char *zPrompt;
  1010    char *zResult;
  1011    if( in!=0 ){
  1012      zResult = local_getline(zPrior, in);
  1013    }else{
  1014      zPrompt = isContinuation ? CONTINUATION_PROMPT : mainPrompt;
  1015  #if SHELL_USE_LOCAL_GETLINE
  1016      printf("%s", zPrompt);
  1017      fflush(stdout);
  1018      do{
  1019        zResult = local_getline(zPrior, stdin);
  1020        zPrior = 0;
  1021        /* ^C trap creates a false EOF, so let "interrupt" thread catch up. */
  1022        if( zResult==0 ) sqlite3_sleep(50);
  1023      }while( zResult==0 && seenInterrupt>0 );
  1024  #else
  1025      free(zPrior);
  1026      zResult = shell_readline(zPrompt);
  1027      while( zResult==0 ){
  1028        /* ^C trap creates a false EOF, so let "interrupt" thread catch up. */
  1029        sqlite3_sleep(50);
  1030        if( seenInterrupt==0 ) break;
  1031        zResult = shell_readline("");
  1032      }
  1033      if( zResult && *zResult ) shell_add_history(zResult);
  1034  #endif
  1035    }
  1036    return zResult;
  1037  }
  1038  #endif /* !SQLITE_SHELL_FIDDLE */
  1039  
  1040  /*
  1041  ** Return the value of a hexadecimal digit.  Return -1 if the input
  1042  ** is not a hex digit.
  1043  */
  1044  static int hexDigitValue(char c){
  1045    if( c>='0' && c<='9' ) return c - '0';
  1046    if( c>='a' && c<='f' ) return c - 'a' + 10;
  1047    if( c>='A' && c<='F' ) return c - 'A' + 10;
  1048    return -1;
  1049  }
  1050  
  1051  /*
  1052  ** Interpret zArg as an integer value, possibly with suffixes.
  1053  */
  1054  static sqlite3_int64 integerValue(const char *zArg){
  1055    sqlite3_int64 v = 0;
  1056    static const struct { char *zSuffix; int iMult; } aMult[] = {
  1057      { "KiB", 1024 },
  1058      { "MiB", 1024*1024 },
  1059      { "GiB", 1024*1024*1024 },
  1060      { "KB",  1000 },
  1061      { "MB",  1000000 },
  1062      { "GB",  1000000000 },
  1063      { "K",   1000 },
  1064      { "M",   1000000 },
  1065      { "G",   1000000000 },
  1066    };
  1067    int i;
  1068    int isNeg = 0;
  1069    if( zArg[0]=='-' ){
  1070      isNeg = 1;
  1071      zArg++;
  1072    }else if( zArg[0]=='+' ){
  1073      zArg++;
  1074    }
  1075    if( zArg[0]=='0' && zArg[1]=='x' ){
  1076      int x;
  1077      zArg += 2;
  1078      while( (x = hexDigitValue(zArg[0]))>=0 ){
  1079        v = (v<<4) + x;
  1080        zArg++;
  1081      }
  1082    }else{
  1083      while( IsDigit(zArg[0]) ){
  1084        v = v*10 + zArg[0] - '0';
  1085        zArg++;
  1086      }
  1087    }
  1088    for(i=0; i<ArraySize(aMult); i++){
  1089      if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
  1090        v *= aMult[i].iMult;
  1091        break;
  1092      }
  1093    }
  1094    return isNeg? -v : v;
  1095  }
  1096  
  1097  /*
  1098  ** A variable length string to which one can append text.
  1099  */
  1100  typedef struct ShellText ShellText;
  1101  struct ShellText {
  1102    char *z;
  1103    int n;
  1104    int nAlloc;
  1105  };
  1106  
  1107  /*
  1108  ** Initialize and destroy a ShellText object
  1109  */
  1110  static void initText(ShellText *p){
  1111    memset(p, 0, sizeof(*p));
  1112  }
  1113  static void freeText(ShellText *p){
  1114    free(p->z);
  1115    initText(p);
  1116  }
  1117  
  1118  /* zIn is either a pointer to a NULL-terminated string in memory obtained
  1119  ** from malloc(), or a NULL pointer. The string pointed to by zAppend is
  1120  ** added to zIn, and the result returned in memory obtained from malloc().
  1121  ** zIn, if it was not NULL, is freed.
  1122  **
  1123  ** If the third argument, quote, is not '\0', then it is used as a
  1124  ** quote character for zAppend.
  1125  */
  1126  static void appendText(ShellText *p, const char *zAppend, char quote){
  1127    i64 len;
  1128    i64 i;
  1129    i64 nAppend = strlen30(zAppend);
  1130  
  1131    len = nAppend+p->n+1;
  1132    if( quote ){
  1133      len += 2;
  1134      for(i=0; i<nAppend; i++){
  1135        if( zAppend[i]==quote ) len++;
  1136      }
  1137    }
  1138  
  1139    if( p->z==0 || p->n+len>=p->nAlloc ){
  1140      p->nAlloc = p->nAlloc*2 + len + 20;
  1141      p->z = realloc(p->z, p->nAlloc);
  1142      shell_check_oom(p->z);
  1143    }
  1144  
  1145    if( quote ){
  1146      char *zCsr = p->z+p->n;
  1147      *zCsr++ = quote;
  1148      for(i=0; i<nAppend; i++){
  1149        *zCsr++ = zAppend[i];
  1150        if( zAppend[i]==quote ) *zCsr++ = quote;
  1151      }
  1152      *zCsr++ = quote;
  1153      p->n = (int)(zCsr - p->z);
  1154      *zCsr = '\0';
  1155    }else{
  1156      memcpy(p->z+p->n, zAppend, nAppend);
  1157      p->n += nAppend;
  1158      p->z[p->n] = '\0';
  1159    }
  1160  }
  1161  
  1162  /*
  1163  ** Attempt to determine if identifier zName needs to be quoted, either
  1164  ** because it contains non-alphanumeric characters, or because it is an
  1165  ** SQLite keyword.  Be conservative in this estimate:  When in doubt assume
  1166  ** that quoting is required.
  1167  **
  1168  ** Return '"' if quoting is required.  Return 0 if no quoting is required.
  1169  */
  1170  static char quoteChar(const char *zName){
  1171    int i;
  1172    if( zName==0 ) return '"';
  1173    if( !isalpha((unsigned char)zName[0]) && zName[0]!='_' ) return '"';
  1174    for(i=0; zName[i]; i++){
  1175      if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ) return '"';
  1176    }
  1177    return sqlite3_keyword_check(zName, i) ? '"' : 0;
  1178  }
  1179  
  1180  /*
  1181  ** Construct a fake object name and column list to describe the structure
  1182  ** of the view, virtual table, or table valued function zSchema.zName.
  1183  */
  1184  static char *shellFakeSchema(
  1185    sqlite3 *db,            /* The database connection containing the vtab */
  1186    const char *zSchema,    /* Schema of the database holding the vtab */
  1187    const char *zName       /* The name of the virtual table */
  1188  ){
  1189    sqlite3_stmt *pStmt = 0;
  1190    char *zSql;
  1191    ShellText s;
  1192    char cQuote;
  1193    char *zDiv = "(";
  1194    int nRow = 0;
  1195  
  1196    zSql = sqlite3_mprintf("PRAGMA \"%w\".table_info=%Q;",
  1197                           zSchema ? zSchema : "main", zName);
  1198    shell_check_oom(zSql);
  1199    sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
  1200    sqlite3_free(zSql);
  1201    initText(&s);
  1202    if( zSchema ){
  1203      cQuote = quoteChar(zSchema);
  1204      if( cQuote && sqlite3_stricmp(zSchema,"temp")==0 ) cQuote = 0;
  1205      appendText(&s, zSchema, cQuote);
  1206      appendText(&s, ".", 0);
  1207    }
  1208    cQuote = quoteChar(zName);
  1209    appendText(&s, zName, cQuote);
  1210    while( sqlite3_step(pStmt)==SQLITE_ROW ){
  1211      const char *zCol = (const char*)sqlite3_column_text(pStmt, 1);
  1212      nRow++;
  1213      appendText(&s, zDiv, 0);
  1214      zDiv = ",";
  1215      if( zCol==0 ) zCol = "";
  1216      cQuote = quoteChar(zCol);
  1217      appendText(&s, zCol, cQuote);
  1218    }
  1219    appendText(&s, ")", 0);
  1220    sqlite3_finalize(pStmt);
  1221    if( nRow==0 ){
  1222      freeText(&s);
  1223      s.z = 0;
  1224    }
  1225    return s.z;
  1226  }
  1227  
  1228  /*
  1229  ** SQL function:  strtod(X)
  1230  **
  1231  ** Use the C-library strtod() function to convert string X into a double.
  1232  ** Used for comparing the accuracy of SQLite's internal text-to-float conversion
  1233  ** routines against the C-library.
  1234  */
  1235  static void shellStrtod(
  1236    sqlite3_context *pCtx,
  1237    int nVal,
  1238    sqlite3_value **apVal
  1239  ){
  1240    char *z = (char*)sqlite3_value_text(apVal[0]);
  1241    UNUSED_PARAMETER(nVal);
  1242    if( z==0 ) return;
  1243    sqlite3_result_double(pCtx, strtod(z,0));
  1244  }
  1245  
  1246  /*
  1247  ** SQL function:  dtostr(X)
  1248  **
  1249  ** Use the C-library printf() function to convert real value X into a string.
  1250  ** Used for comparing the accuracy of SQLite's internal float-to-text conversion
  1251  ** routines against the C-library.
  1252  */
  1253  static void shellDtostr(
  1254    sqlite3_context *pCtx,
  1255    int nVal,
  1256    sqlite3_value **apVal
  1257  ){
  1258    double r = sqlite3_value_double(apVal[0]);
  1259    int n = nVal>=2 ? sqlite3_value_int(apVal[1]) : 26;
  1260    char z[400];
  1261    if( n<1 ) n = 1;
  1262    if( n>350 ) n = 350;
  1263    sprintf(z, "%#+.*e", n, r);
  1264    sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT);
  1265  }
  1266  
  1267  
  1268  /*
  1269  ** SQL function:  shell_module_schema(X)
  1270  **
  1271  ** Return a fake schema for the table-valued function or eponymous virtual
  1272  ** table X.
  1273  */
  1274  static void shellModuleSchema(
  1275    sqlite3_context *pCtx,
  1276    int nVal,
  1277    sqlite3_value **apVal
  1278  ){
  1279    const char *zName;
  1280    char *zFake;
  1281    UNUSED_PARAMETER(nVal);
  1282    zName = (const char*)sqlite3_value_text(apVal[0]);
  1283    zFake = zName? shellFakeSchema(sqlite3_context_db_handle(pCtx), 0, zName) : 0;
  1284    if( zFake ){
  1285      sqlite3_result_text(pCtx, sqlite3_mprintf("/* %s */", zFake),
  1286                          -1, sqlite3_free);
  1287      free(zFake);
  1288    }
  1289  }
  1290  
  1291  /*
  1292  ** SQL function:  shell_add_schema(S,X)
  1293  **
  1294  ** Add the schema name X to the CREATE statement in S and return the result.
  1295  ** Examples:
  1296  **
  1297  **    CREATE TABLE t1(x)   ->   CREATE TABLE xyz.t1(x);
  1298  **
  1299  ** Also works on
  1300  **
  1301  **    CREATE INDEX
  1302  **    CREATE UNIQUE INDEX
  1303  **    CREATE VIEW
  1304  **    CREATE TRIGGER
  1305  **    CREATE VIRTUAL TABLE
  1306  **
  1307  ** This UDF is used by the .schema command to insert the schema name of
  1308  ** attached databases into the middle of the sqlite_schema.sql field.
  1309  */
  1310  static void shellAddSchemaName(
  1311    sqlite3_context *pCtx,
  1312    int nVal,
  1313    sqlite3_value **apVal
  1314  ){
  1315    static const char *aPrefix[] = {
  1316       "TABLE",
  1317       "INDEX",
  1318       "UNIQUE INDEX",
  1319       "VIEW",
  1320       "TRIGGER",
  1321       "VIRTUAL TABLE"
  1322    };
  1323    int i = 0;
  1324    const char *zIn = (const char*)sqlite3_value_text(apVal[0]);
  1325    const char *zSchema = (const char*)sqlite3_value_text(apVal[1]);
  1326    const char *zName = (const char*)sqlite3_value_text(apVal[2]);
  1327    sqlite3 *db = sqlite3_context_db_handle(pCtx);
  1328    UNUSED_PARAMETER(nVal);
  1329    if( zIn!=0 && cli_strncmp(zIn, "CREATE ", 7)==0 ){
  1330      for(i=0; i<ArraySize(aPrefix); i++){
  1331        int n = strlen30(aPrefix[i]);
  1332        if( cli_strncmp(zIn+7, aPrefix[i], n)==0 && zIn[n+7]==' ' ){
  1333          char *z = 0;
  1334          char *zFake = 0;
  1335          if( zSchema ){
  1336            char cQuote = quoteChar(zSchema);
  1337            if( cQuote && sqlite3_stricmp(zSchema,"temp")!=0 ){
  1338              z = sqlite3_mprintf("%.*s \"%w\".%s", n+7, zIn, zSchema, zIn+n+8);
  1339            }else{
  1340              z = sqlite3_mprintf("%.*s %s.%s", n+7, zIn, zSchema, zIn+n+8);
  1341            }
  1342          }
  1343          if( zName
  1344           && aPrefix[i][0]=='V'
  1345           && (zFake = shellFakeSchema(db, zSchema, zName))!=0
  1346          ){
  1347            if( z==0 ){
  1348              z = sqlite3_mprintf("%s\n/* %s */", zIn, zFake);
  1349            }else{
  1350              z = sqlite3_mprintf("%z\n/* %s */", z, zFake);
  1351            }
  1352            free(zFake);
  1353          }
  1354          if( z ){
  1355            sqlite3_result_text(pCtx, z, -1, sqlite3_free);
  1356            return;
  1357          }
  1358        }
  1359      }
  1360    }
  1361    sqlite3_result_value(pCtx, apVal[0]);
  1362  }
  1363  
  1364  /*
  1365  ** The source code for several run-time loadable extensions is inserted
  1366  ** below by the ../tool/mkshellc.tcl script.  Before processing that included
  1367  ** code, we need to override some macros to make the included program code
  1368  ** work here in the middle of this regular program.
  1369  */
  1370  #define SQLITE_EXTENSION_INIT1
  1371  #define SQLITE_EXTENSION_INIT2(X) (void)(X)
  1372  
  1373  #if defined(_WIN32) && defined(_MSC_VER)
  1374  /************************* Begin test_windirent.h ******************/
  1375  /*
  1376  ** 2015 November 30
  1377  **
  1378  ** The author disclaims copyright to this source code.  In place of
  1379  ** a legal notice, here is a blessing:
  1380  **
  1381  **    May you do good and not evil.
  1382  **    May you find forgiveness for yourself and forgive others.
  1383  **    May you share freely, never taking more than you give.
  1384  **
  1385  *************************************************************************
  1386  ** This file contains declarations for most of the opendir() family of
  1387  ** POSIX functions on Win32 using the MSVCRT.
  1388  */
  1389  
  1390  #if defined(_WIN32) && defined(_MSC_VER) && !defined(SQLITE_WINDIRENT_H)
  1391  #define SQLITE_WINDIRENT_H
  1392  
  1393  /*
  1394  ** We need several data types from the Windows SDK header.
  1395  */
  1396  
  1397  #ifndef WIN32_LEAN_AND_MEAN
  1398  #define WIN32_LEAN_AND_MEAN
  1399  #endif
  1400  
  1401  #include "windows.h"
  1402  
  1403  /*
  1404  ** We need several support functions from the SQLite core.
  1405  */
  1406  
  1407  /* #include "sqlite3.h" */
  1408  
  1409  /*
  1410  ** We need several things from the ANSI and MSVCRT headers.
  1411  */
  1412  
  1413  #include <stdio.h>
  1414  #include <stdlib.h>
  1415  #include <errno.h>
  1416  #include <io.h>
  1417  #include <limits.h>
  1418  #include <sys/types.h>
  1419  #include <sys/stat.h>
  1420  
  1421  /*
  1422  ** We may need several defines that should have been in "sys/stat.h".
  1423  */
  1424  
  1425  #ifndef S_ISREG
  1426  #define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG)
  1427  #endif
  1428  
  1429  #ifndef S_ISDIR
  1430  #define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
  1431  #endif
  1432  
  1433  #ifndef S_ISLNK
  1434  #define S_ISLNK(mode) (0)
  1435  #endif
  1436  
  1437  /*
  1438  ** We may need to provide the "mode_t" type.
  1439  */
  1440  
  1441  #ifndef MODE_T_DEFINED
  1442    #define MODE_T_DEFINED
  1443    typedef unsigned short mode_t;
  1444  #endif
  1445  
  1446  /*
  1447  ** We may need to provide the "ino_t" type.
  1448  */
  1449  
  1450  #ifndef INO_T_DEFINED
  1451    #define INO_T_DEFINED
  1452    typedef unsigned short ino_t;
  1453  #endif
  1454  
  1455  /*
  1456  ** We need to define "NAME_MAX" if it was not present in "limits.h".
  1457  */
  1458  
  1459  #ifndef NAME_MAX
  1460  #  ifdef FILENAME_MAX
  1461  #    define NAME_MAX (FILENAME_MAX)
  1462  #  else
  1463  #    define NAME_MAX (260)
  1464  #  endif
  1465  #endif
  1466  
  1467  /*
  1468  ** We need to define "NULL_INTPTR_T" and "BAD_INTPTR_T".
  1469  */
  1470  
  1471  #ifndef NULL_INTPTR_T
  1472  #  define NULL_INTPTR_T ((intptr_t)(0))
  1473  #endif
  1474  
  1475  #ifndef BAD_INTPTR_T
  1476  #  define BAD_INTPTR_T ((intptr_t)(-1))
  1477  #endif
  1478  
  1479  /*
  1480  ** We need to provide the necessary structures and related types.
  1481  */
  1482  
  1483  #ifndef DIRENT_DEFINED
  1484  #define DIRENT_DEFINED
  1485  typedef struct DIRENT DIRENT;
  1486  typedef DIRENT *LPDIRENT;
  1487  struct DIRENT {
  1488    ino_t d_ino;               /* Sequence number, do not use. */
  1489    unsigned d_attributes;     /* Win32 file attributes. */
  1490    char d_name[NAME_MAX + 1]; /* Name within the directory. */
  1491  };
  1492  #endif
  1493  
  1494  #ifndef DIR_DEFINED
  1495  #define DIR_DEFINED
  1496  typedef struct DIR DIR;
  1497  typedef DIR *LPDIR;
  1498  struct DIR {
  1499    intptr_t d_handle; /* Value returned by "_findfirst". */
  1500    DIRENT d_first;    /* DIRENT constructed based on "_findfirst". */
  1501    DIRENT d_next;     /* DIRENT constructed based on "_findnext". */
  1502  };
  1503  #endif
  1504  
  1505  /*
  1506  ** Provide a macro, for use by the implementation, to determine if a
  1507  ** particular directory entry should be skipped over when searching for
  1508  ** the next directory entry that should be returned by the readdir() or
  1509  ** readdir_r() functions.
  1510  */
  1511  
  1512  #ifndef is_filtered
  1513  #  define is_filtered(a) ((((a).attrib)&_A_HIDDEN) || (((a).attrib)&_A_SYSTEM))
  1514  #endif
  1515  
  1516  /*
  1517  ** Provide the function prototype for the POSIX compatible getenv()
  1518  ** function.  This function is not thread-safe.
  1519  */
  1520  
  1521  extern const char *windirent_getenv(const char *name);
  1522  
  1523  /*
  1524  ** Finally, we can provide the function prototypes for the opendir(),
  1525  ** readdir(), readdir_r(), and closedir() POSIX functions.
  1526  */
  1527  
  1528  extern LPDIR opendir(const char *dirname);
  1529  extern LPDIRENT readdir(LPDIR dirp);
  1530  extern INT readdir_r(LPDIR dirp, LPDIRENT entry, LPDIRENT *result);
  1531  extern INT closedir(LPDIR dirp);
  1532  
  1533  #endif /* defined(WIN32) && defined(_MSC_VER) */
  1534  
  1535  /************************* End test_windirent.h ********************/
  1536  /************************* Begin test_windirent.c ******************/
  1537  /*
  1538  ** 2015 November 30
  1539  **
  1540  ** The author disclaims copyright to this source code.  In place of
  1541  ** a legal notice, here is a blessing:
  1542  **
  1543  **    May you do good and not evil.
  1544  **    May you find forgiveness for yourself and forgive others.
  1545  **    May you share freely, never taking more than you give.
  1546  **
  1547  *************************************************************************
  1548  ** This file contains code to implement most of the opendir() family of
  1549  ** POSIX functions on Win32 using the MSVCRT.
  1550  */
  1551  
  1552  #if defined(_WIN32) && defined(_MSC_VER)
  1553  /* #include "test_windirent.h" */
  1554  
  1555  /*
  1556  ** Implementation of the POSIX getenv() function using the Win32 API.
  1557  ** This function is not thread-safe.
  1558  */
  1559  const char *windirent_getenv(
  1560    const char *name
  1561  ){
  1562    static char value[32768]; /* Maximum length, per MSDN */
  1563    DWORD dwSize = sizeof(value) / sizeof(char); /* Size in chars */
  1564    DWORD dwRet; /* Value returned by GetEnvironmentVariableA() */
  1565  
  1566    memset(value, 0, sizeof(value));
  1567    dwRet = GetEnvironmentVariableA(name, value, dwSize);
  1568    if( dwRet==0 || dwRet>dwSize ){
  1569      /*
  1570      ** The function call to GetEnvironmentVariableA() failed -OR-
  1571      ** the buffer is not large enough.  Either way, return NULL.
  1572      */
  1573      return 0;
  1574    }else{
  1575      /*
  1576      ** The function call to GetEnvironmentVariableA() succeeded
  1577      ** -AND- the buffer contains the entire value.
  1578      */
  1579      return value;
  1580    }
  1581  }
  1582  
  1583  /*
  1584  ** Implementation of the POSIX opendir() function using the MSVCRT.
  1585  */
  1586  LPDIR opendir(
  1587    const char *dirname
  1588  ){
  1589    struct _finddata_t data;
  1590    LPDIR dirp = (LPDIR)sqlite3_malloc(sizeof(DIR));
  1591    SIZE_T namesize = sizeof(data.name) / sizeof(data.name[0]);
  1592  
  1593    if( dirp==NULL ) return NULL;
  1594    memset(dirp, 0, sizeof(DIR));
  1595  
  1596    /* TODO: Remove this if Unix-style root paths are not used. */
  1597    if( sqlite3_stricmp(dirname, "/")==0 ){
  1598      dirname = windirent_getenv("SystemDrive");
  1599    }
  1600  
  1601    memset(&data, 0, sizeof(struct _finddata_t));
  1602    _snprintf(data.name, namesize, "%s\\*", dirname);
  1603    dirp->d_handle = _findfirst(data.name, &data);
  1604  
  1605    if( dirp->d_handle==BAD_INTPTR_T ){
  1606      closedir(dirp);
  1607      return NULL;
  1608    }
  1609  
  1610    /* TODO: Remove this block to allow hidden and/or system files. */
  1611    if( is_filtered(data) ){
  1612  next:
  1613  
  1614      memset(&data, 0, sizeof(struct _finddata_t));
  1615      if( _findnext(dirp->d_handle, &data)==-1 ){
  1616        closedir(dirp);
  1617        return NULL;
  1618      }
  1619  
  1620      /* TODO: Remove this block to allow hidden and/or system files. */
  1621      if( is_filtered(data) ) goto next;
  1622    }
  1623  
  1624    dirp->d_first.d_attributes = data.attrib;
  1625    strncpy(dirp->d_first.d_name, data.name, NAME_MAX);
  1626    dirp->d_first.d_name[NAME_MAX] = '\0';
  1627  
  1628    return dirp;
  1629  }
  1630  
  1631  /*
  1632  ** Implementation of the POSIX readdir() function using the MSVCRT.
  1633  */
  1634  LPDIRENT readdir(
  1635    LPDIR dirp
  1636  ){
  1637    struct _finddata_t data;
  1638  
  1639    if( dirp==NULL ) return NULL;
  1640  
  1641    if( dirp->d_first.d_ino==0 ){
  1642      dirp->d_first.d_ino++;
  1643      dirp->d_next.d_ino++;
  1644  
  1645      return &dirp->d_first;
  1646    }
  1647  
  1648  next:
  1649  
  1650    memset(&data, 0, sizeof(struct _finddata_t));
  1651    if( _findnext(dirp->d_handle, &data)==-1 ) return NULL;
  1652  
  1653    /* TODO: Remove this block to allow hidden and/or system files. */
  1654    if( is_filtered(data) ) goto next;
  1655  
  1656    dirp->d_next.d_ino++;
  1657    dirp->d_next.d_attributes = data.attrib;
  1658    strncpy(dirp->d_next.d_name, data.name, NAME_MAX);
  1659    dirp->d_next.d_name[NAME_MAX] = '\0';
  1660  
  1661    return &dirp->d_next;
  1662  }
  1663  
  1664  /*
  1665  ** Implementation of the POSIX readdir_r() function using the MSVCRT.
  1666  */
  1667  INT readdir_r(
  1668    LPDIR dirp,
  1669    LPDIRENT entry,
  1670    LPDIRENT *result
  1671  ){
  1672    struct _finddata_t data;
  1673  
  1674    if( dirp==NULL ) return EBADF;
  1675  
  1676    if( dirp->d_first.d_ino==0 ){
  1677      dirp->d_first.d_ino++;
  1678      dirp->d_next.d_ino++;
  1679  
  1680      entry->d_ino = dirp->d_first.d_ino;
  1681      entry->d_attributes = dirp->d_first.d_attributes;
  1682      strncpy(entry->d_name, dirp->d_first.d_name, NAME_MAX);
  1683      entry->d_name[NAME_MAX] = '\0';
  1684  
  1685      *result = entry;
  1686      return 0;
  1687    }
  1688  
  1689  next:
  1690  
  1691    memset(&data, 0, sizeof(struct _finddata_t));
  1692    if( _findnext(dirp->d_handle, &data)==-1 ){
  1693      *result = NULL;
  1694      return ENOENT;
  1695    }
  1696  
  1697    /* TODO: Remove this block to allow hidden and/or system files. */
  1698    if( is_filtered(data) ) goto next;
  1699  
  1700    entry->d_ino = (ino_t)-1; /* not available */
  1701    entry->d_attributes = data.attrib;
  1702    strncpy(entry->d_name, data.name, NAME_MAX);
  1703    entry->d_name[NAME_MAX] = '\0';
  1704  
  1705    *result = entry;
  1706    return 0;
  1707  }
  1708  
  1709  /*
  1710  ** Implementation of the POSIX closedir() function using the MSVCRT.
  1711  */
  1712  INT closedir(
  1713    LPDIR dirp
  1714  ){
  1715    INT result = 0;
  1716  
  1717    if( dirp==NULL ) return EINVAL;
  1718  
  1719    if( dirp->d_handle!=NULL_INTPTR_T && dirp->d_handle!=BAD_INTPTR_T ){
  1720      result = _findclose(dirp->d_handle);
  1721    }
  1722  
  1723    sqlite3_free(dirp);
  1724    return result;
  1725  }
  1726  
  1727  #endif /* defined(WIN32) && defined(_MSC_VER) */
  1728  
  1729  /************************* End test_windirent.c ********************/
  1730  #define dirent DIRENT
  1731  #endif
  1732  /************************* Begin ../ext/misc/memtrace.c ******************/
  1733  /*
  1734  ** 2019-01-21
  1735  **
  1736  ** The author disclaims copyright to this source code.  In place of
  1737  ** a legal notice, here is a blessing:
  1738  **
  1739  **    May you do good and not evil.
  1740  **    May you find forgiveness for yourself and forgive others.
  1741  **    May you share freely, never taking more than you give.
  1742  **
  1743  *************************************************************************
  1744  **
  1745  ** This file implements an extension that uses the SQLITE_CONFIG_MALLOC
  1746  ** mechanism to add a tracing layer on top of SQLite.  If this extension
  1747  ** is registered prior to sqlite3_initialize(), it will cause all memory
  1748  ** allocation activities to be logged on standard output, or to some other
  1749  ** FILE specified by the initializer.
  1750  **
  1751  ** This file needs to be compiled into the application that uses it.
  1752  **
  1753  ** This extension is used to implement the --memtrace option of the
  1754  ** command-line shell.
  1755  */
  1756  #include <assert.h>
  1757  #include <string.h>
  1758  #include <stdio.h>
  1759  
  1760  /* The original memory allocation routines */
  1761  static sqlite3_mem_methods memtraceBase;
  1762  static FILE *memtraceOut;
  1763  
  1764  /* Methods that trace memory allocations */
  1765  static void *memtraceMalloc(int n){
  1766    if( memtraceOut ){
  1767      fprintf(memtraceOut, "MEMTRACE: allocate %d bytes\n", 
  1768              memtraceBase.xRoundup(n));
  1769    }
  1770    return memtraceBase.xMalloc(n);
  1771  }
  1772  static void memtraceFree(void *p){
  1773    if( p==0 ) return;
  1774    if( memtraceOut ){
  1775      fprintf(memtraceOut, "MEMTRACE: free %d bytes\n", memtraceBase.xSize(p));
  1776    }
  1777    memtraceBase.xFree(p);
  1778  }
  1779  static void *memtraceRealloc(void *p, int n){
  1780    if( p==0 ) return memtraceMalloc(n);
  1781    if( n==0 ){
  1782      memtraceFree(p);
  1783      return 0;
  1784    }
  1785    if( memtraceOut ){
  1786      fprintf(memtraceOut, "MEMTRACE: resize %d -> %d bytes\n",
  1787              memtraceBase.xSize(p), memtraceBase.xRoundup(n));
  1788    }
  1789    return memtraceBase.xRealloc(p, n);
  1790  }
  1791  static int memtraceSize(void *p){
  1792    return memtraceBase.xSize(p);
  1793  }
  1794  static int memtraceRoundup(int n){
  1795    return memtraceBase.xRoundup(n);
  1796  }
  1797  static int memtraceInit(void *p){
  1798    return memtraceBase.xInit(p);
  1799  }
  1800  static void memtraceShutdown(void *p){
  1801    memtraceBase.xShutdown(p);
  1802  }
  1803  
  1804  /* The substitute memory allocator */
  1805  static sqlite3_mem_methods ersaztMethods = {
  1806    memtraceMalloc,
  1807    memtraceFree,
  1808    memtraceRealloc,
  1809    memtraceSize,
  1810    memtraceRoundup,
  1811    memtraceInit,
  1812    memtraceShutdown,
  1813    0
  1814  };
  1815  
  1816  /* Begin tracing memory allocations to out. */
  1817  int sqlite3MemTraceActivate(FILE *out){
  1818    int rc = SQLITE_OK;
  1819    if( memtraceBase.xMalloc==0 ){
  1820      rc = sqlite3_config(SQLITE_CONFIG_GETMALLOC, &memtraceBase);
  1821      if( rc==SQLITE_OK ){
  1822        rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &ersaztMethods);
  1823      }
  1824    }
  1825    memtraceOut = out;
  1826    return rc;
  1827  }
  1828  
  1829  /* Deactivate memory tracing */
  1830  int sqlite3MemTraceDeactivate(void){
  1831    int rc = SQLITE_OK;
  1832    if( memtraceBase.xMalloc!=0 ){
  1833      rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &memtraceBase);
  1834      if( rc==SQLITE_OK ){
  1835        memset(&memtraceBase, 0, sizeof(memtraceBase));
  1836      }
  1837    }
  1838    memtraceOut = 0;
  1839    return rc;
  1840  }
  1841  
  1842  /************************* End ../ext/misc/memtrace.c ********************/
  1843  /************************* Begin ../ext/misc/pcachetrace.c ******************/
  1844  /*
  1845  ** 2023-06-21
  1846  **
  1847  ** The author disclaims copyright to this source code.  In place of
  1848  ** a legal notice, here is a blessing:
  1849  **
  1850  **    May you do good and not evil.
  1851  **    May you find forgiveness for yourself and forgive others.
  1852  **    May you share freely, never taking more than you give.
  1853  **
  1854  *************************************************************************
  1855  **
  1856  ** This file implements an extension that uses the SQLITE_CONFIG_PCACHE2
  1857  ** mechanism to add a tracing layer on top of pluggable page cache of
  1858  ** SQLite.  If this extension is registered prior to sqlite3_initialize(),
  1859  ** it will cause all page cache activities to be logged on standard output,
  1860  ** or to some other FILE specified by the initializer.
  1861  **
  1862  ** This file needs to be compiled into the application that uses it.
  1863  **
  1864  ** This extension is used to implement the --pcachetrace option of the
  1865  ** command-line shell.
  1866  */
  1867  #include <assert.h>
  1868  #include <string.h>
  1869  #include <stdio.h>
  1870  
  1871  /* The original page cache routines */
  1872  static sqlite3_pcache_methods2 pcacheBase;
  1873  static FILE *pcachetraceOut;
  1874  
  1875  /* Methods that trace pcache activity */
  1876  static int pcachetraceInit(void *pArg){
  1877    int nRes;
  1878    if( pcachetraceOut ){
  1879      fprintf(pcachetraceOut, "PCACHETRACE: xInit(%p)\n", pArg);
  1880    }
  1881    nRes = pcacheBase.xInit(pArg);
  1882    if( pcachetraceOut ){
  1883      fprintf(pcachetraceOut, "PCACHETRACE: xInit(%p) -> %d\n", pArg, nRes);
  1884    }
  1885    return nRes;
  1886  }
  1887  static void pcachetraceShutdown(void *pArg){
  1888    if( pcachetraceOut ){
  1889      fprintf(pcachetraceOut, "PCACHETRACE: xShutdown(%p)\n", pArg);
  1890    }
  1891    pcacheBase.xShutdown(pArg);
  1892  }
  1893  static sqlite3_pcache *pcachetraceCreate(int szPage, int szExtra, int bPurge){
  1894    sqlite3_pcache *pRes;
  1895    if( pcachetraceOut ){
  1896      fprintf(pcachetraceOut, "PCACHETRACE: xCreate(%d,%d,%d)\n",
  1897              szPage, szExtra, bPurge);
  1898    }
  1899    pRes = pcacheBase.xCreate(szPage, szExtra, bPurge);
  1900    if( pcachetraceOut ){
  1901      fprintf(pcachetraceOut, "PCACHETRACE: xCreate(%d,%d,%d) -> %p\n",
  1902              szPage, szExtra, bPurge, pRes);
  1903    }
  1904    return pRes;
  1905  }
  1906  static void pcachetraceCachesize(sqlite3_pcache *p, int nCachesize){
  1907    if( pcachetraceOut ){
  1908      fprintf(pcachetraceOut, "PCACHETRACE: xCachesize(%p, %d)\n", p, nCachesize);
  1909    }
  1910    pcacheBase.xCachesize(p, nCachesize);
  1911  }
  1912  static int pcachetracePagecount(sqlite3_pcache *p){
  1913    int nRes;
  1914    if( pcachetraceOut ){
  1915      fprintf(pcachetraceOut, "PCACHETRACE: xPagecount(%p)\n", p);
  1916    }
  1917    nRes = pcacheBase.xPagecount(p);
  1918    if( pcachetraceOut ){
  1919      fprintf(pcachetraceOut, "PCACHETRACE: xPagecount(%p) -> %d\n", p, nRes);
  1920    }
  1921    return nRes;
  1922  }
  1923  static sqlite3_pcache_page *pcachetraceFetch(
  1924    sqlite3_pcache *p,
  1925    unsigned key,
  1926    int crFg
  1927  ){
  1928    sqlite3_pcache_page *pRes;
  1929    if( pcachetraceOut ){
  1930      fprintf(pcachetraceOut, "PCACHETRACE: xFetch(%p,%u,%d)\n", p, key, crFg);
  1931    }
  1932    pRes = pcacheBase.xFetch(p, key, crFg);
  1933    if( pcachetraceOut ){
  1934      fprintf(pcachetraceOut, "PCACHETRACE: xFetch(%p,%u,%d) -> %p\n",
  1935              p, key, crFg, pRes);
  1936    }
  1937    return pRes;
  1938  }
  1939  static void pcachetraceUnpin(
  1940    sqlite3_pcache *p,
  1941    sqlite3_pcache_page *pPg,
  1942    int bDiscard
  1943  ){
  1944    if( pcachetraceOut ){
  1945      fprintf(pcachetraceOut, "PCACHETRACE: xUnpin(%p, %p, %d)\n",
  1946              p, pPg, bDiscard);
  1947    }
  1948    pcacheBase.xUnpin(p, pPg, bDiscard);
  1949  }
  1950  static void pcachetraceRekey(
  1951    sqlite3_pcache *p,
  1952    sqlite3_pcache_page *pPg,
  1953    unsigned oldKey,
  1954    unsigned newKey
  1955  ){
  1956    if( pcachetraceOut ){
  1957      fprintf(pcachetraceOut, "PCACHETRACE: xRekey(%p, %p, %u, %u)\n",
  1958          p, pPg, oldKey, newKey);
  1959    }
  1960    pcacheBase.xRekey(p, pPg, oldKey, newKey);
  1961  }
  1962  static void pcachetraceTruncate(sqlite3_pcache *p, unsigned n){
  1963    if( pcachetraceOut ){
  1964      fprintf(pcachetraceOut, "PCACHETRACE: xTruncate(%p, %u)\n", p, n);
  1965    }
  1966    pcacheBase.xTruncate(p, n);
  1967  }
  1968  static void pcachetraceDestroy(sqlite3_pcache *p){
  1969    if( pcachetraceOut ){
  1970      fprintf(pcachetraceOut, "PCACHETRACE: xDestroy(%p)\n", p);
  1971    }
  1972    pcacheBase.xDestroy(p);
  1973  }
  1974  static void pcachetraceShrink(sqlite3_pcache *p){
  1975    if( pcachetraceOut ){
  1976      fprintf(pcachetraceOut, "PCACHETRACE: xShrink(%p)\n", p);
  1977    }
  1978    pcacheBase.xShrink(p);
  1979  }
  1980  
  1981  /* The substitute pcache methods */
  1982  static sqlite3_pcache_methods2 ersaztPcacheMethods = {
  1983    0,
  1984    0,
  1985    pcachetraceInit,
  1986    pcachetraceShutdown,
  1987    pcachetraceCreate,
  1988    pcachetraceCachesize,
  1989    pcachetracePagecount,
  1990    pcachetraceFetch,
  1991    pcachetraceUnpin,
  1992    pcachetraceRekey,
  1993    pcachetraceTruncate,
  1994    pcachetraceDestroy,
  1995    pcachetraceShrink
  1996  };
  1997  
  1998  /* Begin tracing memory allocations to out. */
  1999  int sqlite3PcacheTraceActivate(FILE *out){
  2000    int rc = SQLITE_OK;
  2001    if( pcacheBase.xFetch==0 ){
  2002      rc = sqlite3_config(SQLITE_CONFIG_GETPCACHE2, &pcacheBase);
  2003      if( rc==SQLITE_OK ){
  2004        rc = sqlite3_config(SQLITE_CONFIG_PCACHE2, &ersaztPcacheMethods);
  2005      }
  2006    }
  2007    pcachetraceOut = out;
  2008    return rc;
  2009  }
  2010  
  2011  /* Deactivate memory tracing */
  2012  int sqlite3PcacheTraceDeactivate(void){
  2013    int rc = SQLITE_OK;
  2014    if( pcacheBase.xFetch!=0 ){
  2015      rc = sqlite3_config(SQLITE_CONFIG_PCACHE2, &pcacheBase);
  2016      if( rc==SQLITE_OK ){
  2017        memset(&pcacheBase, 0, sizeof(pcacheBase));
  2018      }
  2019    }
  2020    pcachetraceOut = 0;
  2021    return rc;
  2022  }
  2023  
  2024  /************************* End ../ext/misc/pcachetrace.c ********************/
  2025  /************************* Begin ../ext/misc/shathree.c ******************/
  2026  /*
  2027  ** 2017-03-08
  2028  **
  2029  ** The author disclaims copyright to this source code.  In place of
  2030  ** a legal notice, here is a blessing:
  2031  **
  2032  **    May you do good and not evil.
  2033  **    May you find forgiveness for yourself and forgive others.
  2034  **    May you share freely, never taking more than you give.
  2035  **
  2036  ******************************************************************************
  2037  **
  2038  ** This SQLite extension implements functions that compute SHA3 hashes
  2039  ** in the way described by the (U.S.) NIST FIPS 202 SHA-3 Standard.
  2040  ** Two SQL functions are implemented:
  2041  **
  2042  **     sha3(X,SIZE)
  2043  **     sha3_query(Y,SIZE)
  2044  **
  2045  ** The sha3(X) function computes the SHA3 hash of the input X, or NULL if
  2046  ** X is NULL.
  2047  **
  2048  ** The sha3_query(Y) function evaluates all queries in the SQL statements of Y
  2049  ** and returns a hash of their results.
  2050  **
  2051  ** The SIZE argument is optional.  If omitted, the SHA3-256 hash algorithm
  2052  ** is used.  If SIZE is included it must be one of the integers 224, 256,
  2053  ** 384, or 512, to determine SHA3 hash variant that is computed.
  2054  */
  2055  /* #include "sqlite3ext.h" */
  2056  SQLITE_EXTENSION_INIT1
  2057  #include <assert.h>
  2058  #include <string.h>
  2059  #include <stdarg.h>
  2060  
  2061  #ifndef SQLITE_AMALGAMATION
  2062  /* typedef sqlite3_uint64 u64; */
  2063  #endif /* SQLITE_AMALGAMATION */
  2064  
  2065  /******************************************************************************
  2066  ** The Hash Engine
  2067  */
  2068  /*
  2069  ** Macros to determine whether the machine is big or little endian,
  2070  ** and whether or not that determination is run-time or compile-time.
  2071  **
  2072  ** For best performance, an attempt is made to guess at the byte-order
  2073  ** using C-preprocessor macros.  If that is unsuccessful, or if
  2074  ** -DSHA3_BYTEORDER=0 is set, then byte-order is determined
  2075  ** at run-time.
  2076  */
  2077  #ifndef SHA3_BYTEORDER
  2078  # if defined(i386)     || defined(__i386__)   || defined(_M_IX86) ||    \
  2079       defined(__x86_64) || defined(__x86_64__) || defined(_M_X64)  ||    \
  2080       defined(_M_AMD64) || defined(_M_ARM)     || defined(__x86)   ||    \
  2081       defined(__arm__)
  2082  #   define SHA3_BYTEORDER    1234
  2083  # elif defined(sparc)    || defined(__ppc__)
  2084  #   define SHA3_BYTEORDER    4321
  2085  # else
  2086  #   define SHA3_BYTEORDER 0
  2087  # endif
  2088  #endif
  2089  
  2090  
  2091  /*
  2092  ** State structure for a SHA3 hash in progress
  2093  */
  2094  typedef struct SHA3Context SHA3Context;
  2095  struct SHA3Context {
  2096    union {
  2097      u64 s[25];                /* Keccak state. 5x5 lines of 64 bits each */
  2098      unsigned char x[1600];    /* ... or 1600 bytes */
  2099    } u;
  2100    unsigned nRate;        /* Bytes of input accepted per Keccak iteration */
  2101    unsigned nLoaded;      /* Input bytes loaded into u.x[] so far this cycle */
  2102    unsigned ixMask;       /* Insert next input into u.x[nLoaded^ixMask]. */
  2103  };
  2104  
  2105  /*
  2106  ** A single step of the Keccak mixing function for a 1600-bit state
  2107  */
  2108  static void KeccakF1600Step(SHA3Context *p){
  2109    int i;
  2110    u64 b0, b1, b2, b3, b4;
  2111    u64 c0, c1, c2, c3, c4;
  2112    u64 d0, d1, d2, d3, d4;
  2113    static const u64 RC[] = {
  2114      0x0000000000000001ULL,  0x0000000000008082ULL,
  2115      0x800000000000808aULL,  0x8000000080008000ULL,
  2116      0x000000000000808bULL,  0x0000000080000001ULL,
  2117      0x8000000080008081ULL,  0x8000000000008009ULL,
  2118      0x000000000000008aULL,  0x0000000000000088ULL,
  2119      0x0000000080008009ULL,  0x000000008000000aULL,
  2120      0x000000008000808bULL,  0x800000000000008bULL,
  2121      0x8000000000008089ULL,  0x8000000000008003ULL,
  2122      0x8000000000008002ULL,  0x8000000000000080ULL,
  2123      0x000000000000800aULL,  0x800000008000000aULL,
  2124      0x8000000080008081ULL,  0x8000000000008080ULL,
  2125      0x0000000080000001ULL,  0x8000000080008008ULL
  2126    };
  2127  # define a00 (p->u.s[0])
  2128  # define a01 (p->u.s[1])
  2129  # define a02 (p->u.s[2])
  2130  # define a03 (p->u.s[3])
  2131  # define a04 (p->u.s[4])
  2132  # define a10 (p->u.s[5])
  2133  # define a11 (p->u.s[6])
  2134  # define a12 (p->u.s[7])
  2135  # define a13 (p->u.s[8])
  2136  # define a14 (p->u.s[9])
  2137  # define a20 (p->u.s[10])
  2138  # define a21 (p->u.s[11])
  2139  # define a22 (p->u.s[12])
  2140  # define a23 (p->u.s[13])
  2141  # define a24 (p->u.s[14])
  2142  # define a30 (p->u.s[15])
  2143  # define a31 (p->u.s[16])
  2144  # define a32 (p->u.s[17])
  2145  # define a33 (p->u.s[18])
  2146  # define a34 (p->u.s[19])
  2147  # define a40 (p->u.s[20])
  2148  # define a41 (p->u.s[21])
  2149  # define a42 (p->u.s[22])
  2150  # define a43 (p->u.s[23])
  2151  # define a44 (p->u.s[24])
  2152  # define ROL64(a,x) ((a<<x)|(a>>(64-x)))
  2153  
  2154    for(i=0; i<24; i+=4){
  2155      c0 = a00^a10^a20^a30^a40;
  2156      c1 = a01^a11^a21^a31^a41;
  2157      c2 = a02^a12^a22^a32^a42;
  2158      c3 = a03^a13^a23^a33^a43;
  2159      c4 = a04^a14^a24^a34^a44;
  2160      d0 = c4^ROL64(c1, 1);
  2161      d1 = c0^ROL64(c2, 1);
  2162      d2 = c1^ROL64(c3, 1);
  2163      d3 = c2^ROL64(c4, 1);
  2164      d4 = c3^ROL64(c0, 1);
  2165  
  2166      b0 = (a00^d0);
  2167      b1 = ROL64((a11^d1), 44);
  2168      b2 = ROL64((a22^d2), 43);
  2169      b3 = ROL64((a33^d3), 21);
  2170      b4 = ROL64((a44^d4), 14);
  2171      a00 =   b0 ^((~b1)&  b2 );
  2172      a00 ^= RC[i];
  2173      a11 =   b1 ^((~b2)&  b3 );
  2174      a22 =   b2 ^((~b3)&  b4 );
  2175      a33 =   b3 ^((~b4)&  b0 );
  2176      a44 =   b4 ^((~b0)&  b1 );
  2177  
  2178      b2 = ROL64((a20^d0), 3);
  2179      b3 = ROL64((a31^d1), 45);
  2180      b4 = ROL64((a42^d2), 61);
  2181      b0 = ROL64((a03^d3), 28);
  2182      b1 = ROL64((a14^d4), 20);
  2183      a20 =   b0 ^((~b1)&  b2 );
  2184      a31 =   b1 ^((~b2)&  b3 );
  2185      a42 =   b2 ^((~b3)&  b4 );
  2186      a03 =   b3 ^((~b4)&  b0 );
  2187      a14 =   b4 ^((~b0)&  b1 );
  2188  
  2189      b4 = ROL64((a40^d0), 18);
  2190      b0 = ROL64((a01^d1), 1);
  2191      b1 = ROL64((a12^d2), 6);
  2192      b2 = ROL64((a23^d3), 25);
  2193      b3 = ROL64((a34^d4), 8);
  2194      a40 =   b0 ^((~b1)&  b2 );
  2195      a01 =   b1 ^((~b2)&  b3 );
  2196      a12 =   b2 ^((~b3)&  b4 );
  2197      a23 =   b3 ^((~b4)&  b0 );
  2198      a34 =   b4 ^((~b0)&  b1 );
  2199  
  2200      b1 = ROL64((a10^d0), 36);
  2201      b2 = ROL64((a21^d1), 10);
  2202      b3 = ROL64((a32^d2), 15);
  2203      b4 = ROL64((a43^d3), 56);
  2204      b0 = ROL64((a04^d4), 27);
  2205      a10 =   b0 ^((~b1)&  b2 );
  2206      a21 =   b1 ^((~b2)&  b3 );
  2207      a32 =   b2 ^((~b3)&  b4 );
  2208      a43 =   b3 ^((~b4)&  b0 );
  2209      a04 =   b4 ^((~b0)&  b1 );
  2210  
  2211      b3 = ROL64((a30^d0), 41);
  2212      b4 = ROL64((a41^d1), 2);
  2213      b0 = ROL64((a02^d2), 62);
  2214      b1 = ROL64((a13^d3), 55);
  2215      b2 = ROL64((a24^d4), 39);
  2216      a30 =   b0 ^((~b1)&  b2 );
  2217      a41 =   b1 ^((~b2)&  b3 );
  2218      a02 =   b2 ^((~b3)&  b4 );
  2219      a13 =   b3 ^((~b4)&  b0 );
  2220      a24 =   b4 ^((~b0)&  b1 );
  2221  
  2222      c0 = a00^a20^a40^a10^a30;
  2223      c1 = a11^a31^a01^a21^a41;
  2224      c2 = a22^a42^a12^a32^a02;
  2225      c3 = a33^a03^a23^a43^a13;
  2226      c4 = a44^a14^a34^a04^a24;
  2227      d0 = c4^ROL64(c1, 1);
  2228      d1 = c0^ROL64(c2, 1);
  2229      d2 = c1^ROL64(c3, 1);
  2230      d3 = c2^ROL64(c4, 1);
  2231      d4 = c3^ROL64(c0, 1);
  2232  
  2233      b0 = (a00^d0);
  2234      b1 = ROL64((a31^d1), 44);
  2235      b2 = ROL64((a12^d2), 43);
  2236      b3 = ROL64((a43^d3), 21);
  2237      b4 = ROL64((a24^d4), 14);
  2238      a00 =   b0 ^((~b1)&  b2 );
  2239      a00 ^= RC[i+1];
  2240      a31 =   b1 ^((~b2)&  b3 );
  2241      a12 =   b2 ^((~b3)&  b4 );
  2242      a43 =   b3 ^((~b4)&  b0 );
  2243      a24 =   b4 ^((~b0)&  b1 );
  2244  
  2245      b2 = ROL64((a40^d0), 3);
  2246      b3 = ROL64((a21^d1), 45);
  2247      b4 = ROL64((a02^d2), 61);
  2248      b0 = ROL64((a33^d3), 28);
  2249      b1 = ROL64((a14^d4), 20);
  2250      a40 =   b0 ^((~b1)&  b2 );
  2251      a21 =   b1 ^((~b2)&  b3 );
  2252      a02 =   b2 ^((~b3)&  b4 );
  2253      a33 =   b3 ^((~b4)&  b0 );
  2254      a14 =   b4 ^((~b0)&  b1 );
  2255  
  2256      b4 = ROL64((a30^d0), 18);
  2257      b0 = ROL64((a11^d1), 1);
  2258      b1 = ROL64((a42^d2), 6);
  2259      b2 = ROL64((a23^d3), 25);
  2260      b3 = ROL64((a04^d4), 8);
  2261      a30 =   b0 ^((~b1)&  b2 );
  2262      a11 =   b1 ^((~b2)&  b3 );
  2263      a42 =   b2 ^((~b3)&  b4 );
  2264      a23 =   b3 ^((~b4)&  b0 );
  2265      a04 =   b4 ^((~b0)&  b1 );
  2266  
  2267      b1 = ROL64((a20^d0), 36);
  2268      b2 = ROL64((a01^d1), 10);
  2269      b3 = ROL64((a32^d2), 15);
  2270      b4 = ROL64((a13^d3), 56);
  2271      b0 = ROL64((a44^d4), 27);
  2272      a20 =   b0 ^((~b1)&  b2 );
  2273      a01 =   b1 ^((~b2)&  b3 );
  2274      a32 =   b2 ^((~b3)&  b4 );
  2275      a13 =   b3 ^((~b4)&  b0 );
  2276      a44 =   b4 ^((~b0)&  b1 );
  2277  
  2278      b3 = ROL64((a10^d0), 41);
  2279      b4 = ROL64((a41^d1), 2);
  2280      b0 = ROL64((a22^d2), 62);
  2281      b1 = ROL64((a03^d3), 55);
  2282      b2 = ROL64((a34^d4), 39);
  2283      a10 =   b0 ^((~b1)&  b2 );
  2284      a41 =   b1 ^((~b2)&  b3 );
  2285      a22 =   b2 ^((~b3)&  b4 );
  2286      a03 =   b3 ^((~b4)&  b0 );
  2287      a34 =   b4 ^((~b0)&  b1 );
  2288  
  2289      c0 = a00^a40^a30^a20^a10;
  2290      c1 = a31^a21^a11^a01^a41;
  2291      c2 = a12^a02^a42^a32^a22;
  2292      c3 = a43^a33^a23^a13^a03;
  2293      c4 = a24^a14^a04^a44^a34;
  2294      d0 = c4^ROL64(c1, 1);
  2295      d1 = c0^ROL64(c2, 1);
  2296      d2 = c1^ROL64(c3, 1);
  2297      d3 = c2^ROL64(c4, 1);
  2298      d4 = c3^ROL64(c0, 1);
  2299  
  2300      b0 = (a00^d0);
  2301      b1 = ROL64((a21^d1), 44);
  2302      b2 = ROL64((a42^d2), 43);
  2303      b3 = ROL64((a13^d3), 21);
  2304      b4 = ROL64((a34^d4), 14);
  2305      a00 =   b0 ^((~b1)&  b2 );
  2306      a00 ^= RC[i+2];
  2307      a21 =   b1 ^((~b2)&  b3 );
  2308      a42 =   b2 ^((~b3)&  b4 );
  2309      a13 =   b3 ^((~b4)&  b0 );
  2310      a34 =   b4 ^((~b0)&  b1 );
  2311  
  2312      b2 = ROL64((a30^d0), 3);
  2313      b3 = ROL64((a01^d1), 45);
  2314      b4 = ROL64((a22^d2), 61);
  2315      b0 = ROL64((a43^d3), 28);
  2316      b1 = ROL64((a14^d4), 20);
  2317      a30 =   b0 ^((~b1)&  b2 );
  2318      a01 =   b1 ^((~b2)&  b3 );
  2319      a22 =   b2 ^((~b3)&  b4 );
  2320      a43 =   b3 ^((~b4)&  b0 );
  2321      a14 =   b4 ^((~b0)&  b1 );
  2322  
  2323      b4 = ROL64((a10^d0), 18);
  2324      b0 = ROL64((a31^d1), 1);
  2325      b1 = ROL64((a02^d2), 6);
  2326      b2 = ROL64((a23^d3), 25);
  2327      b3 = ROL64((a44^d4), 8);
  2328      a10 =   b0 ^((~b1)&  b2 );
  2329      a31 =   b1 ^((~b2)&  b3 );
  2330      a02 =   b2 ^((~b3)&  b4 );
  2331      a23 =   b3 ^((~b4)&  b0 );
  2332      a44 =   b4 ^((~b0)&  b1 );
  2333  
  2334      b1 = ROL64((a40^d0), 36);
  2335      b2 = ROL64((a11^d1), 10);
  2336      b3 = ROL64((a32^d2), 15);
  2337      b4 = ROL64((a03^d3), 56);
  2338      b0 = ROL64((a24^d4), 27);
  2339      a40 =   b0 ^((~b1)&  b2 );
  2340      a11 =   b1 ^((~b2)&  b3 );
  2341      a32 =   b2 ^((~b3)&  b4 );
  2342      a03 =   b3 ^((~b4)&  b0 );
  2343      a24 =   b4 ^((~b0)&  b1 );
  2344  
  2345      b3 = ROL64((a20^d0), 41);
  2346      b4 = ROL64((a41^d1), 2);
  2347      b0 = ROL64((a12^d2), 62);
  2348      b1 = ROL64((a33^d3), 55);
  2349      b2 = ROL64((a04^d4), 39);
  2350      a20 =   b0 ^((~b1)&  b2 );
  2351      a41 =   b1 ^((~b2)&  b3 );
  2352      a12 =   b2 ^((~b3)&  b4 );
  2353      a33 =   b3 ^((~b4)&  b0 );
  2354      a04 =   b4 ^((~b0)&  b1 );
  2355  
  2356      c0 = a00^a30^a10^a40^a20;
  2357      c1 = a21^a01^a31^a11^a41;
  2358      c2 = a42^a22^a02^a32^a12;
  2359      c3 = a13^a43^a23^a03^a33;
  2360      c4 = a34^a14^a44^a24^a04;
  2361      d0 = c4^ROL64(c1, 1);
  2362      d1 = c0^ROL64(c2, 1);
  2363      d2 = c1^ROL64(c3, 1);
  2364      d3 = c2^ROL64(c4, 1);
  2365      d4 = c3^ROL64(c0, 1);
  2366  
  2367      b0 = (a00^d0);
  2368      b1 = ROL64((a01^d1), 44);
  2369      b2 = ROL64((a02^d2), 43);
  2370      b3 = ROL64((a03^d3), 21);
  2371      b4 = ROL64((a04^d4), 14);
  2372      a00 =   b0 ^((~b1)&  b2 );
  2373      a00 ^= RC[i+3];
  2374      a01 =   b1 ^((~b2)&  b3 );
  2375      a02 =   b2 ^((~b3)&  b4 );
  2376      a03 =   b3 ^((~b4)&  b0 );
  2377      a04 =   b4 ^((~b0)&  b1 );
  2378  
  2379      b2 = ROL64((a10^d0), 3);
  2380      b3 = ROL64((a11^d1), 45);
  2381      b4 = ROL64((a12^d2), 61);
  2382      b0 = ROL64((a13^d3), 28);
  2383      b1 = ROL64((a14^d4), 20);
  2384      a10 =   b0 ^((~b1)&  b2 );
  2385      a11 =   b1 ^((~b2)&  b3 );
  2386      a12 =   b2 ^((~b3)&  b4 );
  2387      a13 =   b3 ^((~b4)&  b0 );
  2388      a14 =   b4 ^((~b0)&  b1 );
  2389  
  2390      b4 = ROL64((a20^d0), 18);
  2391      b0 = ROL64((a21^d1), 1);
  2392      b1 = ROL64((a22^d2), 6);
  2393      b2 = ROL64((a23^d3), 25);
  2394      b3 = ROL64((a24^d4), 8);
  2395      a20 =   b0 ^((~b1)&  b2 );
  2396      a21 =   b1 ^((~b2)&  b3 );
  2397      a22 =   b2 ^((~b3)&  b4 );
  2398      a23 =   b3 ^((~b4)&  b0 );
  2399      a24 =   b4 ^((~b0)&  b1 );
  2400  
  2401      b1 = ROL64((a30^d0), 36);
  2402      b2 = ROL64((a31^d1), 10);
  2403      b3 = ROL64((a32^d2), 15);
  2404      b4 = ROL64((a33^d3), 56);
  2405      b0 = ROL64((a34^d4), 27);
  2406      a30 =   b0 ^((~b1)&  b2 );
  2407      a31 =   b1 ^((~b2)&  b3 );
  2408      a32 =   b2 ^((~b3)&  b4 );
  2409      a33 =   b3 ^((~b4)&  b0 );
  2410      a34 =   b4 ^((~b0)&  b1 );
  2411  
  2412      b3 = ROL64((a40^d0), 41);
  2413      b4 = ROL64((a41^d1), 2);
  2414      b0 = ROL64((a42^d2), 62);
  2415      b1 = ROL64((a43^d3), 55);
  2416      b2 = ROL64((a44^d4), 39);
  2417      a40 =   b0 ^((~b1)&  b2 );
  2418      a41 =   b1 ^((~b2)&  b3 );
  2419      a42 =   b2 ^((~b3)&  b4 );
  2420      a43 =   b3 ^((~b4)&  b0 );
  2421      a44 =   b4 ^((~b0)&  b1 );
  2422    }
  2423  }
  2424  
  2425  /*
  2426  ** Initialize a new hash.  iSize determines the size of the hash
  2427  ** in bits and should be one of 224, 256, 384, or 512.  Or iSize
  2428  ** can be zero to use the default hash size of 256 bits.
  2429  */
  2430  static void SHA3Init(SHA3Context *p, int iSize){
  2431    memset(p, 0, sizeof(*p));
  2432    if( iSize>=128 && iSize<=512 ){
  2433      p->nRate = (1600 - ((iSize + 31)&~31)*2)/8;
  2434    }else{
  2435      p->nRate = (1600 - 2*256)/8;
  2436    }
  2437  #if SHA3_BYTEORDER==1234
  2438    /* Known to be little-endian at compile-time. No-op */
  2439  #elif SHA3_BYTEORDER==4321
  2440    p->ixMask = 7;  /* Big-endian */
  2441  #else
  2442    {
  2443      static unsigned int one = 1;
  2444      if( 1==*(unsigned char*)&one ){
  2445        /* Little endian.  No byte swapping. */
  2446        p->ixMask = 0;
  2447      }else{
  2448        /* Big endian.  Byte swap. */
  2449        p->ixMask = 7;
  2450      }
  2451    }
  2452  #endif
  2453  }
  2454  
  2455  /*
  2456  ** Make consecutive calls to the SHA3Update function to add new content
  2457  ** to the hash
  2458  */
  2459  static void SHA3Update(
  2460    SHA3Context *p,
  2461    const unsigned char *aData,
  2462    unsigned int nData
  2463  ){
  2464    unsigned int i = 0;
  2465    if( aData==0 ) return;
  2466  #if SHA3_BYTEORDER==1234
  2467    if( (p->nLoaded % 8)==0 && ((aData - (const unsigned char*)0)&7)==0 ){
  2468      for(; i+7<nData; i+=8){
  2469        p->u.s[p->nLoaded/8] ^= *(u64*)&aData[i];
  2470        p->nLoaded += 8;
  2471        if( p->nLoaded>=p->nRate ){
  2472          KeccakF1600Step(p);
  2473          p->nLoaded = 0;
  2474        }
  2475      }
  2476    }
  2477  #endif
  2478    for(; i<nData; i++){
  2479  #if SHA3_BYTEORDER==1234
  2480      p->u.x[p->nLoaded] ^= aData[i];
  2481  #elif SHA3_BYTEORDER==4321
  2482      p->u.x[p->nLoaded^0x07] ^= aData[i];
  2483  #else
  2484      p->u.x[p->nLoaded^p->ixMask] ^= aData[i];
  2485  #endif
  2486      p->nLoaded++;
  2487      if( p->nLoaded==p->nRate ){
  2488        KeccakF1600Step(p);
  2489        p->nLoaded = 0;
  2490      }
  2491    }
  2492  }
  2493  
  2494  /*
  2495  ** After all content has been added, invoke SHA3Final() to compute
  2496  ** the final hash.  The function returns a pointer to the binary
  2497  ** hash value.
  2498  */
  2499  static unsigned char *SHA3Final(SHA3Context *p){
  2500    unsigned int i;
  2501    if( p->nLoaded==p->nRate-1 ){
  2502      const unsigned char c1 = 0x86;
  2503      SHA3Update(p, &c1, 1);
  2504    }else{
  2505      const unsigned char c2 = 0x06;
  2506      const unsigned char c3 = 0x80;
  2507      SHA3Update(p, &c2, 1);
  2508      p->nLoaded = p->nRate - 1;
  2509      SHA3Update(p, &c3, 1);
  2510    }
  2511    for(i=0; i<p->nRate; i++){
  2512      p->u.x[i+p->nRate] = p->u.x[i^p->ixMask];
  2513    }
  2514    return &p->u.x[p->nRate];
  2515  }
  2516  /* End of the hashing logic
  2517  *****************************************************************************/
  2518  
  2519  /*
  2520  ** Implementation of the sha3(X,SIZE) function.
  2521  **
  2522  ** Return a BLOB which is the SIZE-bit SHA3 hash of X.  The default
  2523  ** size is 256.  If X is a BLOB, it is hashed as is.  
  2524  ** For all other non-NULL types of input, X is converted into a UTF-8 string
  2525  ** and the string is hashed without the trailing 0x00 terminator.  The hash
  2526  ** of a NULL value is NULL.
  2527  */
  2528  static void sha3Func(
  2529    sqlite3_context *context,
  2530    int argc,
  2531    sqlite3_value **argv
  2532  ){
  2533    SHA3Context cx;
  2534    int eType = sqlite3_value_type(argv[0]);
  2535    int nByte = sqlite3_value_bytes(argv[0]);
  2536    int iSize;
  2537    if( argc==1 ){
  2538      iSize = 256;
  2539    }else{
  2540      iSize = sqlite3_value_int(argv[1]);
  2541      if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){
  2542        sqlite3_result_error(context, "SHA3 size should be one of: 224 256 "
  2543                                      "384 512", -1);
  2544        return;
  2545      }
  2546    }
  2547    if( eType==SQLITE_NULL ) return;
  2548    SHA3Init(&cx, iSize);
  2549    if( eType==SQLITE_BLOB ){
  2550      SHA3Update(&cx, sqlite3_value_blob(argv[0]), nByte);
  2551    }else{
  2552      SHA3Update(&cx, sqlite3_value_text(argv[0]), nByte);
  2553    }
  2554    sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT);
  2555  }
  2556  
  2557  /* Compute a string using sqlite3_vsnprintf() with a maximum length
  2558  ** of 50 bytes and add it to the hash.
  2559  */
  2560  static void sha3_step_vformat(
  2561    SHA3Context *p,                 /* Add content to this context */
  2562    const char *zFormat,
  2563    ...
  2564  ){
  2565    va_list ap;
  2566    int n;
  2567    char zBuf[50];
  2568    va_start(ap, zFormat);
  2569    sqlite3_vsnprintf(sizeof(zBuf),zBuf,zFormat,ap);
  2570    va_end(ap);
  2571    n = (int)strlen(zBuf);
  2572    SHA3Update(p, (unsigned char*)zBuf, n);
  2573  }
  2574  
  2575  /*
  2576  ** Implementation of the sha3_query(SQL,SIZE) function.
  2577  **
  2578  ** This function compiles and runs the SQL statement(s) given in the
  2579  ** argument. The results are hashed using a SIZE-bit SHA3.  The default
  2580  ** size is 256.
  2581  **
  2582  ** The format of the byte stream that is hashed is summarized as follows:
  2583  **
  2584  **       S<n>:<sql>
  2585  **       R
  2586  **       N
  2587  **       I<int>
  2588  **       F<ieee-float>
  2589  **       B<size>:<bytes>
  2590  **       T<size>:<text>
  2591  **
  2592  ** <sql> is the original SQL text for each statement run and <n> is
  2593  ** the size of that text.  The SQL text is UTF-8.  A single R character
  2594  ** occurs before the start of each row.  N means a NULL value.
  2595  ** I mean an 8-byte little-endian integer <int>.  F is a floating point
  2596  ** number with an 8-byte little-endian IEEE floating point value <ieee-float>.
  2597  ** B means blobs of <size> bytes.  T means text rendered as <size>
  2598  ** bytes of UTF-8.  The <n> and <size> values are expressed as an ASCII
  2599  ** text integers.
  2600  **
  2601  ** For each SQL statement in the X input, there is one S segment.  Each
  2602  ** S segment is followed by zero or more R segments, one for each row in the
  2603  ** result set.  After each R, there are one or more N, I, F, B, or T segments,
  2604  ** one for each column in the result set.  Segments are concatentated directly
  2605  ** with no delimiters of any kind.
  2606  */
  2607  static void sha3QueryFunc(
  2608    sqlite3_context *context,
  2609    int argc,
  2610    sqlite3_value **argv
  2611  ){
  2612    sqlite3 *db = sqlite3_context_db_handle(context);
  2613    const char *zSql = (const char*)sqlite3_value_text(argv[0]);
  2614    sqlite3_stmt *pStmt = 0;
  2615    int nCol;                   /* Number of columns in the result set */
  2616    int i;                      /* Loop counter */
  2617    int rc;
  2618    int n;
  2619    const char *z;
  2620    SHA3Context cx;
  2621    int iSize;
  2622  
  2623    if( argc==1 ){
  2624      iSize = 256;
  2625    }else{
  2626      iSize = sqlite3_value_int(argv[1]);
  2627      if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){
  2628        sqlite3_result_error(context, "SHA3 size should be one of: 224 256 "
  2629                                      "384 512", -1);
  2630        return;
  2631      }
  2632    }
  2633    if( zSql==0 ) return;
  2634    SHA3Init(&cx, iSize);
  2635    while( zSql[0] ){
  2636      rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zSql);
  2637      if( rc ){
  2638        char *zMsg = sqlite3_mprintf("error SQL statement [%s]: %s",
  2639                                     zSql, sqlite3_errmsg(db));
  2640        sqlite3_finalize(pStmt);
  2641        sqlite3_result_error(context, zMsg, -1);
  2642        sqlite3_free(zMsg);
  2643        return;
  2644      }
  2645      if( !sqlite3_stmt_readonly(pStmt) ){
  2646        char *zMsg = sqlite3_mprintf("non-query: [%s]", sqlite3_sql(pStmt));
  2647        sqlite3_finalize(pStmt);
  2648        sqlite3_result_error(context, zMsg, -1);
  2649        sqlite3_free(zMsg);
  2650        return;
  2651      }
  2652      nCol = sqlite3_column_count(pStmt);
  2653      z = sqlite3_sql(pStmt);
  2654      if( z ){
  2655        n = (int)strlen(z);
  2656        sha3_step_vformat(&cx,"S%d:",n);
  2657        SHA3Update(&cx,(unsigned char*)z,n);
  2658      }
  2659  
  2660      /* Compute a hash over the result of the query */
  2661      while( SQLITE_ROW==sqlite3_step(pStmt) ){
  2662        SHA3Update(&cx,(const unsigned char*)"R",1);
  2663        for(i=0; i<nCol; i++){
  2664          switch( sqlite3_column_type(pStmt,i) ){
  2665            case SQLITE_NULL: {
  2666              SHA3Update(&cx, (const unsigned char*)"N",1);
  2667              break;
  2668            }
  2669            case SQLITE_INTEGER: {
  2670              sqlite3_uint64 u;
  2671              int j;
  2672              unsigned char x[9];
  2673              sqlite3_int64 v = sqlite3_column_int64(pStmt,i);
  2674              memcpy(&u, &v, 8);
  2675              for(j=8; j>=1; j--){
  2676                x[j] = u & 0xff;
  2677                u >>= 8;
  2678              }
  2679              x[0] = 'I';
  2680              SHA3Update(&cx, x, 9);
  2681              break;
  2682            }
  2683            case SQLITE_FLOAT: {
  2684              sqlite3_uint64 u;
  2685              int j;
  2686              unsigned char x[9];
  2687              double r = sqlite3_column_double(pStmt,i);
  2688              memcpy(&u, &r, 8);
  2689              for(j=8; j>=1; j--){
  2690                x[j] = u & 0xff;
  2691                u >>= 8;
  2692              }
  2693              x[0] = 'F';
  2694              SHA3Update(&cx,x,9);
  2695              break;
  2696            }
  2697            case SQLITE_TEXT: {
  2698              int n2 = sqlite3_column_bytes(pStmt, i);
  2699              const unsigned char *z2 = sqlite3_column_text(pStmt, i);
  2700              sha3_step_vformat(&cx,"T%d:",n2);
  2701              SHA3Update(&cx, z2, n2);
  2702              break;
  2703            }
  2704            case SQLITE_BLOB: {
  2705              int n2 = sqlite3_column_bytes(pStmt, i);
  2706              const unsigned char *z2 = sqlite3_column_blob(pStmt, i);
  2707              sha3_step_vformat(&cx,"B%d:",n2);
  2708              SHA3Update(&cx, z2, n2);
  2709              break;
  2710            }
  2711          }
  2712        }
  2713      }
  2714      sqlite3_finalize(pStmt);
  2715    }
  2716    sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT);
  2717  }
  2718  
  2719  
  2720  #ifdef _WIN32
  2721  
  2722  #endif
  2723  int sqlite3_shathree_init(
  2724    sqlite3 *db,
  2725    char **pzErrMsg,
  2726    const sqlite3_api_routines *pApi
  2727  ){
  2728    int rc = SQLITE_OK;
  2729    SQLITE_EXTENSION_INIT2(pApi);
  2730    (void)pzErrMsg;  /* Unused parameter */
  2731    rc = sqlite3_create_function(db, "sha3", 1,
  2732                        SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC,
  2733                        0, sha3Func, 0, 0);
  2734    if( rc==SQLITE_OK ){
  2735      rc = sqlite3_create_function(db, "sha3", 2,
  2736                        SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC,
  2737                        0, sha3Func, 0, 0);
  2738    }
  2739    if( rc==SQLITE_OK ){
  2740      rc = sqlite3_create_function(db, "sha3_query", 1,
  2741                        SQLITE_UTF8 | SQLITE_DIRECTONLY,
  2742                        0, sha3QueryFunc, 0, 0);
  2743    }
  2744    if( rc==SQLITE_OK ){
  2745      rc = sqlite3_create_function(db, "sha3_query", 2,
  2746                        SQLITE_UTF8 | SQLITE_DIRECTONLY,
  2747                        0, sha3QueryFunc, 0, 0);
  2748    }
  2749    return rc;
  2750  }
  2751  
  2752  /************************* End ../ext/misc/shathree.c ********************/
  2753  /************************* Begin ../ext/misc/uint.c ******************/
  2754  /*
  2755  ** 2020-04-14
  2756  **
  2757  ** The author disclaims copyright to this source code.  In place of
  2758  ** a legal notice, here is a blessing:
  2759  **
  2760  **    May you do good and not evil.
  2761  **    May you find forgiveness for yourself and forgive others.
  2762  **    May you share freely, never taking more than you give.
  2763  **
  2764  ******************************************************************************
  2765  **
  2766  ** This SQLite extension implements the UINT collating sequence.
  2767  **
  2768  ** UINT works like BINARY for text, except that embedded strings
  2769  ** of digits compare in numeric order.
  2770  **
  2771  **     *   Leading zeros are handled properly, in the sense that
  2772  **         they do not mess of the maginitude comparison of embedded
  2773  **         strings of digits.  "x00123y" is equal to "x123y".
  2774  **
  2775  **     *   Only unsigned integers are recognized.  Plus and minus
  2776  **         signs are ignored.  Decimal points and exponential notation
  2777  **         are ignored.
  2778  **
  2779  **     *   Embedded integers can be of arbitrary length.  Comparison
  2780  **         is *not* limited integers that can be expressed as a
  2781  **         64-bit machine integer.
  2782  */
  2783  /* #include "sqlite3ext.h" */
  2784  SQLITE_EXTENSION_INIT1
  2785  #include <assert.h>
  2786  #include <string.h>
  2787  #include <ctype.h>
  2788  
  2789  /*
  2790  ** Compare text in lexicographic order, except strings of digits
  2791  ** compare in numeric order.
  2792  */
  2793  static int uintCollFunc(
  2794    void *notUsed,
  2795    int nKey1, const void *pKey1,
  2796    int nKey2, const void *pKey2
  2797  ){
  2798    const unsigned char *zA = (const unsigned char*)pKey1;
  2799    const unsigned char *zB = (const unsigned char*)pKey2;
  2800    int i=0, j=0, x;
  2801    (void)notUsed;
  2802    while( i<nKey1 && j<nKey2 ){
  2803      x = zA[i] - zB[j];
  2804      if( isdigit(zA[i]) ){
  2805        int k;
  2806        if( !isdigit(zB[j]) ) return x;
  2807        while( i<nKey1 && zA[i]=='0' ){ i++; }
  2808        while( j<nKey2 && zB[j]=='0' ){ j++; }
  2809        k = 0;
  2810        while( i+k<nKey1 && isdigit(zA[i+k])
  2811               && j+k<nKey2 && isdigit(zB[j+k]) ){
  2812          k++;
  2813        }
  2814        if( i+k<nKey1 && isdigit(zA[i+k]) ){
  2815          return +1;
  2816        }else if( j+k<nKey2 && isdigit(zB[j+k]) ){
  2817          return -1;
  2818        }else{
  2819          x = memcmp(zA+i, zB+j, k);
  2820          if( x ) return x;
  2821          i += k;
  2822          j += k;
  2823        }
  2824      }else if( x ){
  2825        return x;
  2826      }else{
  2827        i++;
  2828        j++;
  2829      }
  2830    }
  2831    return (nKey1 - i) - (nKey2 - j);
  2832  }
  2833  
  2834  #ifdef _WIN32
  2835  
  2836  #endif
  2837  int sqlite3_uint_init(
  2838    sqlite3 *db, 
  2839    char **pzErrMsg, 
  2840    const sqlite3_api_routines *pApi
  2841  ){
  2842    SQLITE_EXTENSION_INIT2(pApi);
  2843    (void)pzErrMsg;  /* Unused parameter */
  2844    return sqlite3_create_collation(db, "uint", SQLITE_UTF8, 0, uintCollFunc);
  2845  }
  2846  
  2847  /************************* End ../ext/misc/uint.c ********************/
  2848  /************************* Begin ../ext/misc/decimal.c ******************/
  2849  /*
  2850  ** 2020-06-22
  2851  **
  2852  ** The author disclaims copyright to this source code.  In place of
  2853  ** a legal notice, here is a blessing:
  2854  **
  2855  **    May you do good and not evil.
  2856  **    May you find forgiveness for yourself and forgive others.
  2857  **    May you share freely, never taking more than you give.
  2858  **
  2859  ******************************************************************************
  2860  **
  2861  ** Routines to implement arbitrary-precision decimal math.
  2862  **
  2863  ** The focus here is on simplicity and correctness, not performance.
  2864  */
  2865  /* #include "sqlite3ext.h" */
  2866  SQLITE_EXTENSION_INIT1
  2867  #include <assert.h>
  2868  #include <string.h>
  2869  #include <ctype.h>
  2870  #include <stdlib.h>
  2871  
  2872  /* Mark a function parameter as unused, to suppress nuisance compiler
  2873  ** warnings. */
  2874  #ifndef UNUSED_PARAMETER
  2875  # define UNUSED_PARAMETER(X)  (void)(X)
  2876  #endif
  2877  
  2878  
  2879  /* A decimal object */
  2880  typedef struct Decimal Decimal;
  2881  struct Decimal {
  2882    char sign;        /* 0 for positive, 1 for negative */
  2883    char oom;         /* True if an OOM is encountered */
  2884    char isNull;      /* True if holds a NULL rather than a number */
  2885    char isInit;      /* True upon initialization */
  2886    int nDigit;       /* Total number of digits */
  2887    int nFrac;        /* Number of digits to the right of the decimal point */
  2888    signed char *a;   /* Array of digits.  Most significant first. */
  2889  };
  2890  
  2891  /*
  2892  ** Release memory held by a Decimal, but do not free the object itself.
  2893  */
  2894  static void decimal_clear(Decimal *p){
  2895    sqlite3_free(p->a);
  2896  }
  2897  
  2898  /*
  2899  ** Destroy a Decimal object
  2900  */
  2901  static void decimal_free(Decimal *p){
  2902    if( p ){
  2903      decimal_clear(p);
  2904      sqlite3_free(p);
  2905    }
  2906  }
  2907  
  2908  /*
  2909  ** Allocate a new Decimal object initialized to the text in zIn[].
  2910  ** Return NULL if any kind of error occurs.
  2911  */
  2912  static Decimal *decimalNewFromText(const char *zIn, int n){
  2913    Decimal *p = 0;
  2914    int i;
  2915    int iExp = 0;
  2916  
  2917    p = sqlite3_malloc( sizeof(*p) );
  2918    if( p==0 ) goto new_from_text_failed;
  2919    p->sign = 0;
  2920    p->oom = 0;
  2921    p->isInit = 1;
  2922    p->isNull = 0;
  2923    p->nDigit = 0;
  2924    p->nFrac = 0;
  2925    p->a = sqlite3_malloc64( n+1 );
  2926    if( p->a==0 ) goto new_from_text_failed;
  2927    for(i=0; isspace(zIn[i]); i++){}
  2928    if( zIn[i]=='-' ){
  2929      p->sign = 1;
  2930      i++;
  2931    }else if( zIn[i]=='+' ){
  2932      i++;
  2933    }
  2934    while( i<n && zIn[i]=='0' ) i++;
  2935    while( i<n ){
  2936      char c = zIn[i];
  2937      if( c>='0' && c<='9' ){
  2938        p->a[p->nDigit++] = c - '0';
  2939      }else if( c=='.' ){
  2940        p->nFrac = p->nDigit + 1;
  2941      }else if( c=='e' || c=='E' ){
  2942        int j = i+1;
  2943        int neg = 0;
  2944        if( j>=n ) break;
  2945        if( zIn[j]=='-' ){
  2946          neg = 1;
  2947          j++;
  2948        }else if( zIn[j]=='+' ){
  2949          j++;
  2950        }
  2951        while( j<n && iExp<1000000 ){
  2952          if( zIn[j]>='0' && zIn[j]<='9' ){
  2953            iExp = iExp*10 + zIn[j] - '0';
  2954          }
  2955          j++;
  2956        }
  2957        if( neg ) iExp = -iExp;
  2958        break;
  2959      }
  2960      i++;
  2961    }
  2962    if( p->nFrac ){
  2963      p->nFrac = p->nDigit - (p->nFrac - 1);
  2964    }
  2965    if( iExp>0 ){
  2966      if( p->nFrac>0 ){
  2967        if( iExp<=p->nFrac ){
  2968          p->nFrac -= iExp;
  2969          iExp = 0;
  2970        }else{
  2971          iExp -= p->nFrac;
  2972          p->nFrac = 0;
  2973        }
  2974      }
  2975      if( iExp>0 ){   
  2976        p->a = sqlite3_realloc64(p->a, p->nDigit + iExp + 1 );
  2977        if( p->a==0 ) goto new_from_text_failed;
  2978        memset(p->a+p->nDigit, 0, iExp);
  2979        p->nDigit += iExp;
  2980      }
  2981    }else if( iExp<0 ){
  2982      int nExtra;
  2983      iExp = -iExp;
  2984      nExtra = p->nDigit - p->nFrac - 1;
  2985      if( nExtra ){
  2986        if( nExtra>=iExp ){
  2987          p->nFrac += iExp;
  2988          iExp  = 0;
  2989        }else{
  2990          iExp -= nExtra;
  2991          p->nFrac = p->nDigit - 1;
  2992        }
  2993      }
  2994      if( iExp>0 ){
  2995        p->a = sqlite3_realloc64(p->a, p->nDigit + iExp + 1 );
  2996        if( p->a==0 ) goto new_from_text_failed;
  2997        memmove(p->a+iExp, p->a, p->nDigit);
  2998        memset(p->a, 0, iExp);
  2999        p->nDigit += iExp;
  3000        p->nFrac += iExp;
  3001      }
  3002    }
  3003    return p;
  3004  
  3005  new_from_text_failed:
  3006    if( p ){
  3007      if( p->a ) sqlite3_free(p->a);
  3008      sqlite3_free(p);
  3009    }
  3010    return 0;
  3011  }
  3012  
  3013  /* Forward reference */
  3014  static Decimal *decimalFromDouble(double);
  3015  
  3016  /*
  3017  ** Allocate a new Decimal object from an sqlite3_value.  Return a pointer
  3018  ** to the new object, or NULL if there is an error.  If the pCtx argument
  3019  ** is not NULL, then errors are reported on it as well.
  3020  **
  3021  ** If the pIn argument is SQLITE_TEXT or SQLITE_INTEGER, it is converted
  3022  ** directly into a Decimal.  For SQLITE_FLOAT or for SQLITE_BLOB of length
  3023  ** 8 bytes, the resulting double value is expanded into its decimal equivalent.
  3024  ** If pIn is NULL or if it is a BLOB that is not exactly 8 bytes in length,
  3025  ** then NULL is returned.
  3026  */
  3027  static Decimal *decimal_new(
  3028    sqlite3_context *pCtx,       /* Report error here, if not null */
  3029    sqlite3_value *pIn,          /* Construct the decimal object from this */
  3030    int bTextOnly                /* Always interpret pIn as text if true */
  3031  ){
  3032    Decimal *p = 0;
  3033    int eType = sqlite3_value_type(pIn);
  3034    if( bTextOnly && (eType==SQLITE_FLOAT || eType==SQLITE_BLOB) ){
  3035      eType = SQLITE_TEXT;
  3036    }
  3037    switch( eType ){
  3038      case SQLITE_TEXT:
  3039      case SQLITE_INTEGER: {
  3040        const char *zIn = (const char*)sqlite3_value_text(pIn);
  3041        int n = sqlite3_value_bytes(pIn);
  3042        p = decimalNewFromText(zIn, n);
  3043        if( p==0 ) goto new_failed;
  3044        break;
  3045      }
  3046  
  3047      case SQLITE_FLOAT: {
  3048        p = decimalFromDouble(sqlite3_value_double(pIn));
  3049        break;
  3050      }
  3051  
  3052      case SQLITE_BLOB: {
  3053        const unsigned char *x;
  3054        unsigned int i;
  3055        sqlite3_uint64 v = 0;
  3056        double r;
  3057  
  3058        if( sqlite3_value_bytes(pIn)!=sizeof(r) ) break;
  3059        x = sqlite3_value_blob(pIn);
  3060        for(i=0; i<sizeof(r); i++){
  3061          v = (v<<8) | x[i];
  3062        }
  3063        memcpy(&r, &v, sizeof(r));
  3064        p = decimalFromDouble(r);
  3065        break;
  3066      }
  3067  
  3068      case SQLITE_NULL: {
  3069        break;
  3070      }
  3071    }
  3072    return p;
  3073  
  3074  new_failed:
  3075    if( pCtx ) sqlite3_result_error_nomem(pCtx);
  3076    sqlite3_free(p);
  3077    return 0;
  3078  }
  3079  
  3080  /*
  3081  ** Make the given Decimal the result.
  3082  */
  3083  static void decimal_result(sqlite3_context *pCtx, Decimal *p){
  3084    char *z;
  3085    int i, j;
  3086    int n;
  3087    if( p==0 || p->oom ){
  3088      sqlite3_result_error_nomem(pCtx);
  3089      return;
  3090    }
  3091    if( p->isNull ){
  3092      sqlite3_result_null(pCtx);
  3093      return;
  3094    }
  3095    z = sqlite3_malloc( p->nDigit+4 );
  3096    if( z==0 ){
  3097      sqlite3_result_error_nomem(pCtx);
  3098      return;
  3099    }
  3100    i = 0;
  3101    if( p->nDigit==0 || (p->nDigit==1 && p->a[0]==0) ){
  3102      p->sign = 0;
  3103    }
  3104    if( p->sign ){
  3105      z[0] = '-';
  3106      i = 1;
  3107    }
  3108    n = p->nDigit - p->nFrac;
  3109    if( n<=0 ){
  3110      z[i++] = '0';
  3111    }
  3112    j = 0;
  3113    while( n>1 && p->a[j]==0 ){
  3114      j++;
  3115      n--;
  3116    }
  3117    while( n>0  ){
  3118      z[i++] = p->a[j] + '0';
  3119      j++;
  3120      n--;
  3121    }
  3122    if( p->nFrac ){
  3123      z[i++] = '.';
  3124      do{
  3125        z[i++] = p->a[j] + '0';
  3126        j++;
  3127      }while( j<p->nDigit );
  3128    }
  3129    z[i] = 0;
  3130    sqlite3_result_text(pCtx, z, i, sqlite3_free);
  3131  }
  3132  
  3133  /*
  3134  ** Make the given Decimal the result in an format similar to  '%+#e'.
  3135  ** In other words, show exponential notation with leading and trailing
  3136  ** zeros omitted.
  3137  */
  3138  static void decimal_result_sci(sqlite3_context *pCtx, Decimal *p){
  3139    char *z;       /* The output buffer */
  3140    int i;         /* Loop counter */
  3141    int nZero;     /* Number of leading zeros */
  3142    int nDigit;    /* Number of digits not counting trailing zeros */
  3143    int nFrac;     /* Digits to the right of the decimal point */
  3144    int exp;       /* Exponent value */
  3145    signed char zero;     /* Zero value */
  3146    signed char *a;       /* Array of digits */
  3147  
  3148    if( p==0 || p->oom ){
  3149      sqlite3_result_error_nomem(pCtx);
  3150      return;
  3151    }
  3152    if( p->isNull ){
  3153      sqlite3_result_null(pCtx);
  3154      return;
  3155    }
  3156    for(nDigit=p->nDigit; nDigit>0 && p->a[nDigit-1]==0; nDigit--){}
  3157    for(nZero=0; nZero<nDigit && p->a[nZero]==0; nZero++){}
  3158    nFrac = p->nFrac + (nDigit - p->nDigit);
  3159    nDigit -= nZero;
  3160    z = sqlite3_malloc( nDigit+20 );
  3161    if( z==0 ){
  3162      sqlite3_result_error_nomem(pCtx);
  3163      return;
  3164    }
  3165    if( nDigit==0 ){
  3166      zero = 0;
  3167      a = &zero;
  3168      nDigit = 1;
  3169      nFrac = 0;
  3170    }else{
  3171      a = &p->a[nZero];
  3172    }
  3173    if( p->sign && nDigit>0 ){
  3174      z[0] = '-';
  3175    }else{
  3176      z[0] = '+';
  3177    }
  3178    z[1] = a[0]+'0';
  3179    z[2] = '.';
  3180    if( nDigit==1 ){
  3181      z[3] = '0';
  3182      i = 4;
  3183    }else{
  3184      for(i=1; i<nDigit; i++){
  3185        z[2+i] = a[i]+'0';
  3186      }
  3187      i = nDigit+2;
  3188    }
  3189    exp = nDigit - nFrac - 1;
  3190    sqlite3_snprintf(nDigit+20-i, &z[i], "e%+03d", exp);
  3191    sqlite3_result_text(pCtx, z, -1, sqlite3_free);
  3192  }
  3193  
  3194  /*
  3195  ** Compare to Decimal objects.  Return negative, 0, or positive if the
  3196  ** first object is less than, equal to, or greater than the second.
  3197  **
  3198  ** Preconditions for this routine:
  3199  **
  3200  **    pA!=0
  3201  **    pA->isNull==0
  3202  **    pB!=0
  3203  **    pB->isNull==0
  3204  */
  3205  static int decimal_cmp(const Decimal *pA, const Decimal *pB){
  3206    int nASig, nBSig, rc, n;
  3207    if( pA->sign!=pB->sign ){
  3208      return pA->sign ? -1 : +1;
  3209    }
  3210    if( pA->sign ){
  3211      const Decimal *pTemp = pA;
  3212      pA = pB;
  3213      pB = pTemp;
  3214    }
  3215    nASig = pA->nDigit - pA->nFrac;
  3216    nBSig = pB->nDigit - pB->nFrac;
  3217    if( nASig!=nBSig ){
  3218      return nASig - nBSig;
  3219    }
  3220    n = pA->nDigit;
  3221    if( n>pB->nDigit ) n = pB->nDigit;
  3222    rc = memcmp(pA->a, pB->a, n);
  3223    if( rc==0 ){
  3224      rc = pA->nDigit - pB->nDigit;
  3225    }
  3226    return rc;
  3227  }
  3228  
  3229  /*
  3230  ** SQL Function:   decimal_cmp(X, Y)
  3231  **
  3232  ** Return negative, zero, or positive if X is less then, equal to, or
  3233  ** greater than Y.
  3234  */
  3235  static void decimalCmpFunc(
  3236    sqlite3_context *context,
  3237    int argc,
  3238    sqlite3_value **argv
  3239  ){
  3240    Decimal *pA = 0, *pB = 0;
  3241    int rc;
  3242  
  3243    UNUSED_PARAMETER(argc);
  3244    pA = decimal_new(context, argv[0], 1);
  3245    if( pA==0 || pA->isNull ) goto cmp_done;
  3246    pB = decimal_new(context, argv[1], 1);
  3247    if( pB==0 || pB->isNull ) goto cmp_done;
  3248    rc = decimal_cmp(pA, pB);
  3249    if( rc<0 ) rc = -1;
  3250    else if( rc>0 ) rc = +1;
  3251    sqlite3_result_int(context, rc);
  3252  cmp_done:
  3253    decimal_free(pA);
  3254    decimal_free(pB);
  3255  }
  3256  
  3257  /*
  3258  ** Expand the Decimal so that it has a least nDigit digits and nFrac
  3259  ** digits to the right of the decimal point.
  3260  */
  3261  static void decimal_expand(Decimal *p, int nDigit, int nFrac){
  3262    int nAddSig;
  3263    int nAddFrac;
  3264    if( p==0 ) return;
  3265    nAddFrac = nFrac - p->nFrac;
  3266    nAddSig = (nDigit - p->nDigit) - nAddFrac;
  3267    if( nAddFrac==0 && nAddSig==0 ) return;
  3268    p->a = sqlite3_realloc64(p->a, nDigit+1);
  3269    if( p->a==0 ){
  3270      p->oom = 1;
  3271      return;
  3272    }
  3273    if( nAddSig ){
  3274      memmove(p->a+nAddSig, p->a, p->nDigit);
  3275      memset(p->a, 0, nAddSig);
  3276      p->nDigit += nAddSig;
  3277    }
  3278    if( nAddFrac ){
  3279      memset(p->a+p->nDigit, 0, nAddFrac);
  3280      p->nDigit += nAddFrac;
  3281      p->nFrac += nAddFrac;
  3282    }
  3283  }
  3284  
  3285  /*
  3286  ** Add the value pB into pA.   A := A + B.
  3287  **
  3288  ** Both pA and pB might become denormalized by this routine.
  3289  */
  3290  static void decimal_add(Decimal *pA, Decimal *pB){
  3291    int nSig, nFrac, nDigit;
  3292    int i, rc;
  3293    if( pA==0 ){
  3294      return;
  3295    }
  3296    if( pA->oom || pB==0 || pB->oom ){
  3297      pA->oom = 1;
  3298      return;
  3299    }
  3300    if( pA->isNull || pB->isNull ){
  3301      pA->isNull = 1;
  3302      return;
  3303    }
  3304    nSig = pA->nDigit - pA->nFrac;
  3305    if( nSig && pA->a[0]==0 ) nSig--;
  3306    if( nSig<pB->nDigit-pB->nFrac ){
  3307      nSig = pB->nDigit - pB->nFrac;
  3308    }
  3309    nFrac = pA->nFrac;
  3310    if( nFrac<pB->nFrac ) nFrac = pB->nFrac;
  3311    nDigit = nSig + nFrac + 1;
  3312    decimal_expand(pA, nDigit, nFrac);
  3313    decimal_expand(pB, nDigit, nFrac);
  3314    if( pA->oom || pB->oom ){
  3315      pA->oom = 1;
  3316    }else{
  3317      if( pA->sign==pB->sign ){
  3318        int carry = 0;
  3319        for(i=nDigit-1; i>=0; i--){
  3320          int x = pA->a[i] + pB->a[i] + carry;
  3321          if( x>=10 ){
  3322            carry = 1;
  3323            pA->a[i] = x - 10;
  3324          }else{
  3325            carry = 0;
  3326            pA->a[i] = x;
  3327          }
  3328        }
  3329      }else{
  3330        signed char *aA, *aB;
  3331        int borrow = 0;
  3332        rc = memcmp(pA->a, pB->a, nDigit);
  3333        if( rc<0 ){
  3334          aA = pB->a;
  3335          aB = pA->a;
  3336          pA->sign = !pA->sign;
  3337        }else{
  3338          aA = pA->a;
  3339          aB = pB->a;
  3340        }
  3341        for(i=nDigit-1; i>=0; i--){
  3342          int x = aA[i] - aB[i] - borrow;
  3343          if( x<0 ){
  3344            pA->a[i] = x+10;
  3345            borrow = 1;
  3346          }else{
  3347            pA->a[i] = x;
  3348            borrow = 0;
  3349          }
  3350        }
  3351      }
  3352    }
  3353  }
  3354  
  3355  /*
  3356  ** Multiply A by B.   A := A * B
  3357  **
  3358  ** All significant digits after the decimal point are retained.
  3359  ** Trailing zeros after the decimal point are omitted as long as
  3360  ** the number of digits after the decimal point is no less than
  3361  ** either the number of digits in either input.
  3362  */
  3363  static void decimalMul(Decimal *pA, Decimal *pB){
  3364    signed char *acc = 0;
  3365    int i, j, k;
  3366    int minFrac;
  3367  
  3368    if( pA==0 || pA->oom || pA->isNull
  3369     || pB==0 || pB->oom || pB->isNull 
  3370    ){
  3371      goto mul_end;
  3372    }
  3373    acc = sqlite3_malloc64( pA->nDigit + pB->nDigit + 2 );
  3374    if( acc==0 ){
  3375      pA->oom = 1;
  3376      goto mul_end;
  3377    }
  3378    memset(acc, 0, pA->nDigit + pB->nDigit + 2);
  3379    minFrac = pA->nFrac;
  3380    if( pB->nFrac<minFrac ) minFrac = pB->nFrac;
  3381    for(i=pA->nDigit-1; i>=0; i--){
  3382      signed char f = pA->a[i];
  3383      int carry = 0, x;
  3384      for(j=pB->nDigit-1, k=i+j+3; j>=0; j--, k--){
  3385        x = acc[k] + f*pB->a[j] + carry;
  3386        acc[k] = x%10;
  3387        carry = x/10;
  3388      }
  3389      x = acc[k] + carry;
  3390      acc[k] = x%10;
  3391      acc[k-1] += x/10;
  3392    }
  3393    sqlite3_free(pA->a);
  3394    pA->a = acc;
  3395    acc = 0;
  3396    pA->nDigit += pB->nDigit + 2;
  3397    pA->nFrac += pB->nFrac;
  3398    pA->sign ^= pB->sign;
  3399    while( pA->nFrac>minFrac && pA->a[pA->nDigit-1]==0 ){
  3400      pA->nFrac--;
  3401      pA->nDigit--;
  3402    }
  3403  
  3404  mul_end:
  3405    sqlite3_free(acc);
  3406  }
  3407  
  3408  /*
  3409  ** Create a new Decimal object that contains an integer power of 2.
  3410  */
  3411  static Decimal *decimalPow2(int N){
  3412    Decimal *pA = 0;      /* The result to be returned */
  3413    Decimal *pX = 0;      /* Multiplier */
  3414    if( N<-20000 || N>20000 ) goto pow2_fault;
  3415    pA = decimalNewFromText("1.0", 3);
  3416    if( pA==0 || pA->oom ) goto pow2_fault;
  3417    if( N==0 ) return pA;
  3418    if( N>0 ){
  3419      pX = decimalNewFromText("2.0", 3);
  3420    }else{
  3421      N = -N;
  3422      pX = decimalNewFromText("0.5", 3);
  3423    }
  3424    if( pX==0 || pX->oom ) goto pow2_fault;
  3425    while( 1 /* Exit by break */ ){
  3426      if( N & 1 ){
  3427        decimalMul(pA, pX);
  3428        if( pA->oom ) goto pow2_fault;
  3429      }
  3430      N >>= 1;
  3431      if( N==0 ) break;
  3432      decimalMul(pX, pX);
  3433    }
  3434    decimal_free(pX);
  3435    return pA;
  3436  
  3437  pow2_fault:
  3438    decimal_free(pA);
  3439    decimal_free(pX);
  3440    return 0;
  3441  }
  3442  
  3443  /*
  3444  ** Use an IEEE754 binary64 ("double") to generate a new Decimal object.
  3445  */
  3446  static Decimal *decimalFromDouble(double r){
  3447    sqlite3_int64 m, a;
  3448    int e;
  3449    int isNeg;
  3450    Decimal *pA;
  3451    Decimal *pX;
  3452    char zNum[100];
  3453    if( r<0.0 ){
  3454      isNeg = 1;
  3455      r = -r;
  3456    }else{
  3457      isNeg = 0;
  3458    }
  3459    memcpy(&a,&r,sizeof(a));
  3460    if( a==0 ){
  3461      e = 0;
  3462      m = 0;
  3463    }else{
  3464      e = a>>52;
  3465      m = a & ((((sqlite3_int64)1)<<52)-1);
  3466      if( e==0 ){
  3467        m <<= 1;
  3468      }else{
  3469        m |= ((sqlite3_int64)1)<<52;
  3470      }
  3471      while( e<1075 && m>0 && (m&1)==0 ){
  3472        m >>= 1;
  3473        e++;
  3474      }
  3475      if( isNeg ) m = -m;
  3476      e = e - 1075;
  3477      if( e>971 ){
  3478        return 0;  /* A NaN or an Infinity */
  3479      }
  3480    }
  3481  
  3482    /* At this point m is the integer significand and e is the exponent */
  3483    sqlite3_snprintf(sizeof(zNum), zNum, "%lld", m);
  3484    pA = decimalNewFromText(zNum, (int)strlen(zNum));
  3485    pX = decimalPow2(e);
  3486    decimalMul(pA, pX);
  3487    decimal_free(pX);
  3488    return pA;
  3489  }
  3490  
  3491  /*
  3492  ** SQL Function:   decimal(X)
  3493  ** OR:             decimal_exp(X)
  3494  **
  3495  ** Convert input X into decimal and then back into text.
  3496  **
  3497  ** If X is originally a float, then a full decimal expansion of that floating
  3498  ** point value is done.  Or if X is an 8-byte blob, it is interpreted
  3499  ** as a float and similarly expanded.
  3500  **
  3501  ** The decimal_exp(X) function returns the result in exponential notation.
  3502  ** decimal(X) returns a complete decimal, without the e+NNN at the end.
  3503  */
  3504  static void decimalFunc(
  3505    sqlite3_context *context,
  3506    int argc,
  3507    sqlite3_value **argv
  3508  ){
  3509    Decimal *p =  decimal_new(context, argv[0], 0);
  3510    UNUSED_PARAMETER(argc);
  3511    if( p ){
  3512      if( sqlite3_user_data(context)!=0 ){
  3513        decimal_result_sci(context, p);
  3514      }else{
  3515        decimal_result(context, p);
  3516      }
  3517      decimal_free(p);
  3518    }
  3519  }
  3520  
  3521  /*
  3522  ** Compare text in decimal order.
  3523  */
  3524  static int decimalCollFunc(
  3525    void *notUsed,
  3526    int nKey1, const void *pKey1,
  3527    int nKey2, const void *pKey2
  3528  ){
  3529    const unsigned char *zA = (const unsigned char*)pKey1;
  3530    const unsigned char *zB = (const unsigned char*)pKey2;
  3531    Decimal *pA = decimalNewFromText((const char*)zA, nKey1);
  3532    Decimal *pB = decimalNewFromText((const char*)zB, nKey2);
  3533    int rc;
  3534    UNUSED_PARAMETER(notUsed);
  3535    if( pA==0 || pB==0 ){
  3536      rc = 0;
  3537    }else{
  3538      rc = decimal_cmp(pA, pB);
  3539    }
  3540    decimal_free(pA);
  3541    decimal_free(pB);
  3542    return rc;
  3543  }
  3544  
  3545  
  3546  /*
  3547  ** SQL Function:   decimal_add(X, Y)
  3548  **                 decimal_sub(X, Y)
  3549  **
  3550  ** Return the sum or difference of X and Y.
  3551  */
  3552  static void decimalAddFunc(
  3553    sqlite3_context *context,
  3554    int argc,
  3555    sqlite3_value **argv
  3556  ){
  3557    Decimal *pA = decimal_new(context, argv[0], 1);
  3558    Decimal *pB = decimal_new(context, argv[1], 1);
  3559    UNUSED_PARAMETER(argc);
  3560    decimal_add(pA, pB);
  3561    decimal_result(context, pA);
  3562    decimal_free(pA);
  3563    decimal_free(pB);
  3564  }
  3565  static void decimalSubFunc(
  3566    sqlite3_context *context,
  3567    int argc,
  3568    sqlite3_value **argv
  3569  ){
  3570    Decimal *pA = decimal_new(context, argv[0], 1);
  3571    Decimal *pB = decimal_new(context, argv[1], 1);
  3572    UNUSED_PARAMETER(argc);
  3573    if( pB ){
  3574      pB->sign = !pB->sign;
  3575      decimal_add(pA, pB);
  3576      decimal_result(context, pA);
  3577    }
  3578    decimal_free(pA);
  3579    decimal_free(pB);
  3580  }
  3581  
  3582  /* Aggregate funcion:   decimal_sum(X)
  3583  **
  3584  ** Works like sum() except that it uses decimal arithmetic for unlimited
  3585  ** precision.
  3586  */
  3587  static void decimalSumStep(
  3588    sqlite3_context *context,
  3589    int argc,
  3590    sqlite3_value **argv
  3591  ){
  3592    Decimal *p;
  3593    Decimal *pArg;
  3594    UNUSED_PARAMETER(argc);
  3595    p = sqlite3_aggregate_context(context, sizeof(*p));
  3596    if( p==0 ) return;
  3597    if( !p->isInit ){
  3598      p->isInit = 1;
  3599      p->a = sqlite3_malloc(2);
  3600      if( p->a==0 ){
  3601        p->oom = 1;
  3602      }else{
  3603        p->a[0] = 0;
  3604      }
  3605      p->nDigit = 1;
  3606      p->nFrac = 0;
  3607    }
  3608    if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
  3609    pArg = decimal_new(context, argv[0], 1);
  3610    decimal_add(p, pArg);
  3611    decimal_free(pArg);
  3612  }
  3613  static void decimalSumInverse(
  3614    sqlite3_context *context,
  3615    int argc,
  3616    sqlite3_value **argv
  3617  ){
  3618    Decimal *p;
  3619    Decimal *pArg;
  3620    UNUSED_PARAMETER(argc);
  3621    p = sqlite3_aggregate_context(context, sizeof(*p));
  3622    if( p==0 ) return;
  3623    if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
  3624    pArg = decimal_new(context, argv[0], 1);
  3625    if( pArg ) pArg->sign = !pArg->sign;
  3626    decimal_add(p, pArg);
  3627    decimal_free(pArg);
  3628  }
  3629  static void decimalSumValue(sqlite3_context *context){
  3630    Decimal *p = sqlite3_aggregate_context(context, 0);
  3631    if( p==0 ) return;
  3632    decimal_result(context, p);
  3633  }
  3634  static void decimalSumFinalize(sqlite3_context *context){
  3635    Decimal *p = sqlite3_aggregate_context(context, 0);
  3636    if( p==0 ) return;
  3637    decimal_result(context, p);
  3638    decimal_clear(p);
  3639  }
  3640  
  3641  /*
  3642  ** SQL Function:   decimal_mul(X, Y)
  3643  **
  3644  ** Return the product of X and Y.
  3645  */
  3646  static void decimalMulFunc(
  3647    sqlite3_context *context,
  3648    int argc,
  3649    sqlite3_value **argv
  3650  ){
  3651    Decimal *pA = decimal_new(context, argv[0], 1);
  3652    Decimal *pB = decimal_new(context, argv[1], 1);
  3653    UNUSED_PARAMETER(argc);
  3654    if( pA==0 || pA->oom || pA->isNull
  3655     || pB==0 || pB->oom || pB->isNull 
  3656    ){
  3657      goto mul_end;
  3658    }
  3659    decimalMul(pA, pB);
  3660    if( pA->oom ){
  3661      goto mul_end;
  3662    }
  3663    decimal_result(context, pA);
  3664  
  3665  mul_end:
  3666    decimal_free(pA);
  3667    decimal_free(pB);
  3668  }
  3669  
  3670  /*
  3671  ** SQL Function:   decimal_pow2(N)
  3672  **
  3673  ** Return the N-th power of 2.  N must be an integer.
  3674  */
  3675  static void decimalPow2Func(
  3676    sqlite3_context *context,
  3677    int argc,
  3678    sqlite3_value **argv
  3679  ){
  3680    UNUSED_PARAMETER(argc);
  3681    if( sqlite3_value_type(argv[0])==SQLITE_INTEGER ){
  3682      Decimal *pA = decimalPow2(sqlite3_value_int(argv[0]));
  3683      decimal_result_sci(context, pA);
  3684      decimal_free(pA);
  3685    }
  3686  }
  3687  
  3688  #ifdef _WIN32
  3689  
  3690  #endif
  3691  int sqlite3_decimal_init(
  3692    sqlite3 *db, 
  3693    char **pzErrMsg, 
  3694    const sqlite3_api_routines *pApi
  3695  ){
  3696    int rc = SQLITE_OK;
  3697    static const struct {
  3698      const char *zFuncName;
  3699      int nArg;
  3700      int iArg;
  3701      void (*xFunc)(sqlite3_context*,int,sqlite3_value**);
  3702    } aFunc[] = {
  3703      { "decimal",       1, 0,  decimalFunc        },
  3704      { "decimal_exp",   1, 1,  decimalFunc        },
  3705      { "decimal_cmp",   2, 0,  decimalCmpFunc     },
  3706      { "decimal_add",   2, 0,  decimalAddFunc     },
  3707      { "decimal_sub",   2, 0,  decimalSubFunc     },
  3708      { "decimal_mul",   2, 0,  decimalMulFunc     },
  3709      { "decimal_pow2",  1, 0,  decimalPow2Func    },
  3710    };
  3711    unsigned int i;
  3712    (void)pzErrMsg;  /* Unused parameter */
  3713  
  3714    SQLITE_EXTENSION_INIT2(pApi);
  3715  
  3716    for(i=0; i<(int)(sizeof(aFunc)/sizeof(aFunc[0])) && rc==SQLITE_OK; i++){
  3717      rc = sqlite3_create_function(db, aFunc[i].zFuncName, aFunc[i].nArg,
  3718                     SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC,
  3719                     aFunc[i].iArg ? db : 0, aFunc[i].xFunc, 0, 0);
  3720    }
  3721    if( rc==SQLITE_OK ){
  3722      rc = sqlite3_create_window_function(db, "decimal_sum", 1,
  3723                     SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC, 0,
  3724                     decimalSumStep, decimalSumFinalize,
  3725                     decimalSumValue, decimalSumInverse, 0);
  3726    }
  3727    if( rc==SQLITE_OK ){
  3728      rc = sqlite3_create_collation(db, "decimal", SQLITE_UTF8,
  3729                                    0, decimalCollFunc);
  3730    }
  3731    return rc;
  3732  }
  3733  
  3734  /************************* End ../ext/misc/decimal.c ********************/
  3735  #undef sqlite3_base_init
  3736  #define sqlite3_base_init sqlite3_base64_init
  3737  /************************* Begin ../ext/misc/base64.c ******************/
  3738  /*
  3739  ** 2022-11-18
  3740  **
  3741  ** The author disclaims copyright to this source code.  In place of
  3742  ** a legal notice, here is a blessing:
  3743  **
  3744  **    May you do good and not evil.
  3745  **    May you find forgiveness for yourself and forgive others.
  3746  **    May you share freely, never taking more than you give.
  3747  **
  3748  *************************************************************************
  3749  **
  3750  ** This is a SQLite extension for converting in either direction
  3751  ** between a (binary) blob and base64 text. Base64 can transit a
  3752  ** sane USASCII channel unmolested. It also plays nicely in CSV or
  3753  ** written as TCL brace-enclosed literals or SQL string literals,
  3754  ** and can be used unmodified in XML-like documents.
  3755  **
  3756  ** This is an independent implementation of conversions specified in
  3757  ** RFC 4648, done on the above date by the author (Larry Brasfield)
  3758  ** who thereby has the right to put this into the public domain.
  3759  **
  3760  ** The conversions meet RFC 4648 requirements, provided that this
  3761  ** C source specifies that line-feeds are included in the encoded
  3762  ** data to limit visible line lengths to 72 characters and to
  3763  ** terminate any encoded blob having non-zero length.
  3764  **
  3765  ** Length limitations are not imposed except that the runtime
  3766  ** SQLite string or blob length limits are respected. Otherwise,
  3767  ** any length binary sequence can be represented and recovered.
  3768  ** Generated base64 sequences, with their line-feeds included,
  3769  ** can be concatenated; the result converted back to binary will
  3770  ** be the concatenation of the represented binary sequences.
  3771  **
  3772  ** This SQLite3 extension creates a function, base64(x), which
  3773  ** either: converts text x containing base64 to a returned blob;
  3774  ** or converts a blob x to returned text containing base64. An
  3775  ** error will be thrown for other input argument types.
  3776  **
  3777  ** This code relies on UTF-8 encoding only with respect to the
  3778  ** meaning of the first 128 (7-bit) codes matching that of USASCII.
  3779  ** It will fail miserably if somehow made to try to convert EBCDIC.
  3780  ** Because it is table-driven, it could be enhanced to handle that,
  3781  ** but the world and SQLite have moved on from that anachronism.
  3782  **
  3783  ** To build the extension:
  3784  ** Set shell variable SQDIR=<your favorite SQLite checkout directory>
  3785  ** *Nix: gcc -O2 -shared -I$SQDIR -fPIC -o base64.so base64.c
  3786  ** OSX: gcc -O2 -dynamiclib -fPIC -I$SQDIR -o base64.dylib base64.c
  3787  ** Win32: gcc -O2 -shared -I%SQDIR% -o base64.dll base64.c
  3788  ** Win32: cl /Os -I%SQDIR% base64.c -link -dll -out:base64.dll
  3789  */
  3790  
  3791  #include <assert.h>
  3792  
  3793  /* #include "sqlite3ext.h" */
  3794  
  3795  #ifndef deliberate_fall_through
  3796  /* Quiet some compilers about some of our intentional code. */
  3797  # if GCC_VERSION>=7000000
  3798  #  define deliberate_fall_through __attribute__((fallthrough));
  3799  # else
  3800  #  define deliberate_fall_through
  3801  # endif
  3802  #endif
  3803  
  3804  SQLITE_EXTENSION_INIT1;
  3805  
  3806  #define PC 0x80 /* pad character */
  3807  #define WS 0x81 /* whitespace */
  3808  #define ND 0x82 /* Not above or digit-value */
  3809  #define PAD_CHAR '='
  3810  
  3811  #ifndef U8_TYPEDEF
  3812  /* typedef unsigned char u8; */
  3813  #define U8_TYPEDEF
  3814  #endif
  3815  
  3816  /* Decoding table, ASCII (7-bit) value to base 64 digit value or other */
  3817  static const u8 b64DigitValues[128] = {
  3818    /*                             HT LF VT  FF CR       */
  3819      ND,ND,ND,ND, ND,ND,ND,ND, ND,WS,WS,WS, WS,WS,ND,ND,
  3820    /*                                                US */
  3821      ND,ND,ND,ND, ND,ND,ND,ND, ND,ND,ND,ND, ND,ND,ND,ND,
  3822    /*sp                                  +            / */
  3823      WS,ND,ND,ND, ND,ND,ND,ND, ND,ND,ND,62, ND,ND,ND,63,
  3824    /* 0  1            5            9            =       */
  3825      52,53,54,55, 56,57,58,59, 60,61,ND,ND, ND,PC,ND,ND,
  3826    /*    A                                            O */
  3827      ND, 0, 1, 2,  3, 4, 5, 6,  7, 8, 9,10, 11,12,13,14,
  3828    /* P                               Z                 */
  3829      15,16,17,18, 19,20,21,22, 23,24,25,ND, ND,ND,ND,ND,
  3830    /*    a                                            o */
  3831      ND,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40,
  3832    /* p                               z                 */
  3833      41,42,43,44, 45,46,47,48, 49,50,51,ND, ND,ND,ND,ND
  3834  };
  3835  
  3836  static const char b64Numerals[64+1]
  3837  = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  3838  
  3839  #define BX_DV_PROTO(c) \
  3840    ((((u8)(c))<0x80)? (u8)(b64DigitValues[(u8)(c)]) : 0x80)
  3841  #define IS_BX_DIGIT(bdp) (((u8)(bdp))<0x80)
  3842  #define IS_BX_WS(bdp) ((bdp)==WS)
  3843  #define IS_BX_PAD(bdp) ((bdp)==PC)
  3844  #define BX_NUMERAL(dv) (b64Numerals[(u8)(dv)])
  3845  /* Width of base64 lines. Should be an integer multiple of 4. */
  3846  #define B64_DARK_MAX 72
  3847  
  3848  /* Encode a byte buffer into base64 text with linefeeds appended to limit
  3849  ** encoded group lengths to B64_DARK_MAX or to terminate the last group.
  3850  */
  3851  static char* toBase64( u8 *pIn, int nbIn, char *pOut ){
  3852    int nCol = 0;
  3853    while( nbIn >= 3 ){
  3854      /* Do the bit-shuffle, exploiting unsigned input to avoid masking. */
  3855      pOut[0] = BX_NUMERAL(pIn[0]>>2);
  3856      pOut[1] = BX_NUMERAL(((pIn[0]<<4)|(pIn[1]>>4))&0x3f);
  3857      pOut[2] = BX_NUMERAL(((pIn[1]&0xf)<<2)|(pIn[2]>>6));
  3858      pOut[3] = BX_NUMERAL(pIn[2]&0x3f);
  3859      pOut += 4;
  3860      nbIn -= 3;
  3861      pIn += 3;
  3862      if( (nCol += 4)>=B64_DARK_MAX || nbIn<=0 ){
  3863        *pOut++ = '\n';
  3864        nCol = 0;
  3865      }
  3866    }
  3867    if( nbIn > 0 ){
  3868      signed char nco = nbIn+1;
  3869      int nbe;
  3870      unsigned long qv = *pIn++;
  3871      for( nbe=1; nbe<3; ++nbe ){
  3872        qv <<= 8;
  3873        if( nbe<nbIn ) qv |= *pIn++;
  3874      }
  3875      for( nbe=3; nbe>=0; --nbe ){
  3876        char ce = (nbe<nco)? BX_NUMERAL((u8)(qv & 0x3f)) : PAD_CHAR;
  3877        qv >>= 6;
  3878        pOut[nbe] = ce;
  3879      }
  3880      pOut += 4;
  3881      *pOut++ = '\n';
  3882    }
  3883    *pOut = 0;
  3884    return pOut;
  3885  }
  3886  
  3887  /* Skip over text which is not base64 numeral(s). */
  3888  static char * skipNonB64( char *s, int nc ){
  3889    char c;
  3890    while( nc-- > 0 && (c = *s) && !IS_BX_DIGIT(BX_DV_PROTO(c)) ) ++s;
  3891    return s;
  3892  }
  3893  
  3894  /* Decode base64 text into a byte buffer. */
  3895  static u8* fromBase64( char *pIn, int ncIn, u8 *pOut ){
  3896    if( ncIn>0 && pIn[ncIn-1]=='\n' ) --ncIn;
  3897    while( ncIn>0 && *pIn!=PAD_CHAR ){
  3898      static signed char nboi[] = { 0, 0, 1, 2, 3 };
  3899      char *pUse = skipNonB64(pIn, ncIn);
  3900      unsigned long qv = 0L;
  3901      int nti, nbo, nac;
  3902      ncIn -= (pUse - pIn);
  3903      pIn = pUse;
  3904      nti = (ncIn>4)? 4 : ncIn;
  3905      ncIn -= nti;
  3906      nbo = nboi[nti];
  3907      if( nbo==0 ) break;
  3908      for( nac=0; nac<4; ++nac ){
  3909        char c = (nac<nti)? *pIn++ : b64Numerals[0];
  3910        u8 bdp = BX_DV_PROTO(c);
  3911        switch( bdp ){
  3912        case ND:
  3913          /*  Treat dark non-digits as pad, but they terminate decode too. */
  3914          ncIn = 0;
  3915          deliberate_fall_through;
  3916        case WS:
  3917          /* Treat whitespace as pad and terminate this group.*/
  3918          nti = nac;
  3919          deliberate_fall_through;
  3920        case PC:
  3921          bdp = 0;
  3922          --nbo;
  3923          deliberate_fall_through;
  3924        default: /* bdp is the digit value. */
  3925          qv = qv<<6 | bdp;
  3926          break;
  3927        }
  3928      }
  3929      switch( nbo ){
  3930      case 3:
  3931        pOut[2] = (qv) & 0xff;
  3932      case 2:
  3933        pOut[1] = (qv>>8) & 0xff;
  3934      case 1:
  3935        pOut[0] = (qv>>16) & 0xff;
  3936      }
  3937      pOut += nbo;
  3938    }
  3939    return pOut;
  3940  }
  3941  
  3942  /* This function does the work for the SQLite base64(x) UDF. */
  3943  static void base64(sqlite3_context *context, int na, sqlite3_value *av[]){
  3944    int nb, nc, nv = sqlite3_value_bytes(av[0]);
  3945    int nvMax = sqlite3_limit(sqlite3_context_db_handle(context),
  3946                              SQLITE_LIMIT_LENGTH, -1);
  3947    char *cBuf;
  3948    u8 *bBuf;
  3949    assert(na==1);
  3950    switch( sqlite3_value_type(av[0]) ){
  3951    case SQLITE_BLOB:
  3952      nb = nv;
  3953      nc = 4*(nv+2/3); /* quads needed */
  3954      nc += (nc+(B64_DARK_MAX-1))/B64_DARK_MAX + 1; /* LFs and a 0-terminator */
  3955      if( nvMax < nc ){
  3956        sqlite3_result_error(context, "blob expanded to base64 too big", -1);
  3957        return;
  3958      }
  3959      bBuf = (u8*)sqlite3_value_blob(av[0]);
  3960      if( !bBuf ){
  3961        if( SQLITE_NOMEM==sqlite3_errcode(sqlite3_context_db_handle(context)) ){
  3962          goto memFail;
  3963        }
  3964        sqlite3_result_text(context,"",-1,SQLITE_STATIC);
  3965        break;
  3966      }
  3967      cBuf = sqlite3_malloc(nc);
  3968      if( !cBuf ) goto memFail;
  3969      nc = (int)(toBase64(bBuf, nb, cBuf) - cBuf);
  3970      sqlite3_result_text(context, cBuf, nc, sqlite3_free);
  3971      break;
  3972    case SQLITE_TEXT:
  3973      nc = nv;
  3974      nb = 3*((nv+3)/4); /* may overestimate due to LF and padding */
  3975      if( nvMax < nb ){
  3976        sqlite3_result_error(context, "blob from base64 may be too big", -1);
  3977        return;
  3978      }else if( nb<1 ){
  3979        nb = 1;
  3980      }
  3981      cBuf = (char *)sqlite3_value_text(av[0]);
  3982      if( !cBuf ){
  3983        if( SQLITE_NOMEM==sqlite3_errcode(sqlite3_context_db_handle(context)) ){
  3984          goto memFail;
  3985        }
  3986        sqlite3_result_zeroblob(context, 0);
  3987        break;
  3988      }
  3989      bBuf = sqlite3_malloc(nb);
  3990      if( !bBuf ) goto memFail;
  3991      nb = (int)(fromBase64(cBuf, nc, bBuf) - bBuf);
  3992      sqlite3_result_blob(context, bBuf, nb, sqlite3_free);
  3993      break;
  3994    default:
  3995      sqlite3_result_error(context, "base64 accepts only blob or text", -1);
  3996      return;
  3997    }
  3998    return;
  3999   memFail:
  4000    sqlite3_result_error(context, "base64 OOM", -1);
  4001  }
  4002  
  4003  /*
  4004  ** Establish linkage to running SQLite library.
  4005  */
  4006  #ifndef SQLITE_SHELL_EXTFUNCS
  4007  #ifdef _WIN32
  4008  
  4009  #endif
  4010  int sqlite3_base_init
  4011  #else
  4012  static int sqlite3_base64_init
  4013  #endif
  4014  (sqlite3 *db, char **pzErr, const sqlite3_api_routines *pApi){
  4015    SQLITE_EXTENSION_INIT2(pApi);
  4016    (void)pzErr;
  4017    return sqlite3_create_function
  4018      (db, "base64", 1,
  4019       SQLITE_DETERMINISTIC|SQLITE_INNOCUOUS|SQLITE_DIRECTONLY|SQLITE_UTF8,
  4020       0, base64, 0, 0);
  4021  }
  4022  
  4023  /*
  4024  ** Define some macros to allow this extension to be built into the shell
  4025  ** conveniently, in conjunction with use of SQLITE_SHELL_EXTFUNCS. This
  4026  ** allows shell.c, as distributed, to have this extension built in.
  4027  */
  4028  #define BASE64_INIT(db) sqlite3_base64_init(db, 0, 0)
  4029  #define BASE64_EXPOSE(db, pzErr) /* Not needed, ..._init() does this. */
  4030  
  4031  /************************* End ../ext/misc/base64.c ********************/
  4032  #undef sqlite3_base_init
  4033  #define sqlite3_base_init sqlite3_base85_init
  4034  #define OMIT_BASE85_CHECKER
  4035  /************************* Begin ../ext/misc/base85.c ******************/
  4036  /*
  4037  ** 2022-11-16
  4038  **
  4039  ** The author disclaims copyright to this source code.  In place of
  4040  ** a legal notice, here is a blessing:
  4041  **
  4042  **    May you do good and not evil.
  4043  **    May you find forgiveness for yourself and forgive others.
  4044  **    May you share freely, never taking more than you give.
  4045  **
  4046  *************************************************************************
  4047  **
  4048  ** This is a utility for converting binary to base85 or vice-versa.
  4049  ** It can be built as a standalone program or an SQLite3 extension.
  4050  **
  4051  ** Much like base64 representations, base85 can be sent through a
  4052  ** sane USASCII channel unmolested. It also plays nicely in CSV or
  4053  ** written as TCL brace-enclosed literals or SQL string literals.
  4054  ** It is not suited for unmodified use in XML-like documents.
  4055  **
  4056  ** The encoding used resembles Ascii85, but was devised by the author
  4057  ** (Larry Brasfield) before Mozilla, Adobe, ZMODEM or other Ascii85
  4058  ** variant sources existed, in the 1984 timeframe on a VAX mainframe.
  4059  ** Further, this is an independent implementation of a base85 system.
  4060  ** Hence, the author has rightfully put this into the public domain.
  4061  **
  4062  ** Base85 numerals are taken from the set of 7-bit USASCII codes,
  4063  ** excluding control characters and Space ! " ' ( ) { | } ~ Del
  4064  ** in code order representing digit values 0 to 84 (base 10.)
  4065  **
  4066  ** Groups of 4 bytes, interpreted as big-endian 32-bit values,
  4067  ** are represented as 5-digit base85 numbers with MS to LS digit
  4068  ** order. Groups of 1-3 bytes are represented with 2-4 digits,
  4069  ** still big-endian but 8-24 bit values. (Using big-endian yields
  4070  ** the simplest transition to byte groups smaller than 4 bytes.
  4071  ** These byte groups can also be considered base-256 numbers.)
  4072  ** Groups of 0 bytes are represented with 0 digits and vice-versa.
  4073  ** No pad characters are used; Encoded base85 numeral sequence
  4074  ** (aka "group") length maps 1-to-1 to the decoded binary length.
  4075  **
  4076  ** Any character not in the base85 numeral set delimits groups.
  4077  ** When base85 is streamed or stored in containers of indefinite
  4078  ** size, newline is used to separate it into sub-sequences of no
  4079  ** more than 80 digits so that fgets() can be used to read it.
  4080  **
  4081  ** Length limitations are not imposed except that the runtime
  4082  ** SQLite string or blob length limits are respected. Otherwise,
  4083  ** any length binary sequence can be represented and recovered.
  4084  ** Base85 sequences can be concatenated by separating them with
  4085  ** a non-base85 character; the conversion to binary will then
  4086  ** be the concatenation of the represented binary sequences.
  4087  
  4088  ** The standalone program either converts base85 on stdin to create
  4089  ** a binary file or converts a binary file to base85 on stdout.
  4090  ** Read or make it blurt its help for invocation details.
  4091  **
  4092  ** The SQLite3 extension creates a function, base85(x), which will
  4093  ** either convert text base85 to a blob or a blob to text base85
  4094  ** and return the result (or throw an error for other types.)
  4095  ** Unless built with OMIT_BASE85_CHECKER defined, it also creates a
  4096  ** function, is_base85(t), which returns 1 iff the text t contains
  4097  ** nothing other than base85 numerals and whitespace, or 0 otherwise.
  4098  **
  4099  ** To build the extension:
  4100  ** Set shell variable SQDIR=<your favorite SQLite checkout directory>
  4101  ** and variable OPTS to -DOMIT_BASE85_CHECKER if is_base85() unwanted.
  4102  ** *Nix: gcc -O2 -shared -I$SQDIR $OPTS -fPIC -o base85.so base85.c
  4103  ** OSX: gcc -O2 -dynamiclib -fPIC -I$SQDIR $OPTS -o base85.dylib base85.c
  4104  ** Win32: gcc -O2 -shared -I%SQDIR% %OPTS% -o base85.dll base85.c
  4105  ** Win32: cl /Os -I%SQDIR% %OPTS% base85.c -link -dll -out:base85.dll
  4106  **
  4107  ** To build the standalone program, define PP symbol BASE85_STANDALONE. Eg.
  4108  ** *Nix or OSX: gcc -O2 -DBASE85_STANDALONE base85.c -o base85
  4109  ** Win32: gcc -O2 -DBASE85_STANDALONE -o base85.exe base85.c
  4110  ** Win32: cl /Os /MD -DBASE85_STANDALONE base85.c
  4111  */
  4112  
  4113  #include <stdio.h>
  4114  #include <memory.h>
  4115  #include <string.h>
  4116  #include <assert.h>
  4117  #ifndef OMIT_BASE85_CHECKER
  4118  # include <ctype.h>
  4119  #endif
  4120  
  4121  #ifndef BASE85_STANDALONE
  4122  
  4123  /* # include "sqlite3ext.h" */
  4124  
  4125  SQLITE_EXTENSION_INIT1;
  4126  
  4127  #else
  4128  
  4129  # ifdef _WIN32
  4130  #  include <io.h>
  4131  #  include <fcntl.h>
  4132  # else
  4133  #  define setmode(fd,m)
  4134  # endif
  4135  
  4136  static char *zHelp =
  4137    "Usage: base85 <dirFlag> <binFile>\n"
  4138    " <dirFlag> is either -r to read or -w to write <binFile>,\n"
  4139    "   content to be converted to/from base85 on stdout/stdin.\n"
  4140    " <binFile> names a binary file to be rendered or created.\n"
  4141    "   Or, the name '-' refers to the stdin or stdout stream.\n"
  4142    ;
  4143  
  4144  static void sayHelp(){
  4145    printf("%s", zHelp);
  4146  }
  4147  #endif
  4148  
  4149  #ifndef U8_TYPEDEF
  4150  /* typedef unsigned char u8; */
  4151  #define U8_TYPEDEF
  4152  #endif
  4153  
  4154  /* Classify c according to interval within USASCII set w.r.t. base85
  4155   * Values of 1 and 3 are base85 numerals. Values of 0, 2, or 4 are not.
  4156   */
  4157  #define B85_CLASS( c ) (((c)>='#')+((c)>'&')+((c)>='*')+((c)>'z'))
  4158  
  4159  /* Provide digitValue to b85Numeral offset as a function of above class. */
  4160  static u8 b85_cOffset[] = { 0, '#', 0, '*'-4, 0 };
  4161  #define B85_DNOS( c ) b85_cOffset[B85_CLASS(c)]
  4162  
  4163  /* Say whether c is a base85 numeral. */
  4164  #define IS_B85( c ) (B85_CLASS(c) & 1)
  4165  
  4166  #if 0 /* Not used, */
  4167  static u8 base85DigitValue( char c ){
  4168    u8 dv = (u8)(c - '#');
  4169    if( dv>87 ) return 0xff;
  4170    return (dv > 3)? dv-3 : dv;
  4171  }
  4172  #endif
  4173  
  4174  /* Width of base64 lines. Should be an integer multiple of 5. */
  4175  #define B85_DARK_MAX 80
  4176  
  4177  
  4178  static char * skipNonB85( char *s, int nc ){
  4179    char c;
  4180    while( nc-- > 0 && (c = *s) && !IS_B85(c) ) ++s;
  4181    return s;
  4182  }
  4183  
  4184  /* Convert small integer, known to be in 0..84 inclusive, to base85 numeral.
  4185   * Do not use the macro form with argument expression having a side-effect.*/
  4186  #if 0
  4187  static char base85Numeral( u8 b ){
  4188    return (b < 4)? (char)(b + '#') : (char)(b - 4 + '*');
  4189  }
  4190  #else
  4191  # define base85Numeral( dn )\
  4192    ((char)(((dn) < 4)? (char)((dn) + '#') : (char)((dn) - 4 + '*')))
  4193  #endif
  4194  
  4195  static char *putcs(char *pc, char *s){
  4196    char c;
  4197    while( (c = *s++)!=0 ) *pc++ = c;
  4198    return pc;
  4199  }
  4200  
  4201  /* Encode a byte buffer into base85 text. If pSep!=0, it's a C string
  4202  ** to be appended to encoded groups to limit their length to B85_DARK_MAX
  4203  ** or to terminate the last group (to aid concatenation.)
  4204  */
  4205  static char* toBase85( u8 *pIn, int nbIn, char *pOut, char *pSep ){
  4206    int nCol = 0;
  4207    while( nbIn >= 4 ){
  4208      int nco = 5;
  4209      unsigned long qbv = (((unsigned long)pIn[0])<<24) |
  4210                          (pIn[1]<<16) | (pIn[2]<<8) | pIn[3];
  4211      while( nco > 0 ){
  4212        unsigned nqv = (unsigned)(qbv/85UL);
  4213        unsigned char dv = qbv - 85UL*nqv;
  4214        qbv = nqv;
  4215        pOut[--nco] = base85Numeral(dv);
  4216      }
  4217      nbIn -= 4;
  4218      pIn += 4;
  4219      pOut += 5;
  4220      if( pSep && (nCol += 5)>=B85_DARK_MAX ){
  4221        pOut = putcs(pOut, pSep);
  4222        nCol = 0;
  4223      }
  4224    }
  4225    if( nbIn > 0 ){
  4226      int nco = nbIn + 1;
  4227      unsigned long qv = *pIn++;
  4228      int nbe = 1;
  4229      while( nbe++ < nbIn ){
  4230        qv = (qv<<8) | *pIn++;
  4231      }
  4232      nCol += nco;
  4233      while( nco > 0 ){
  4234        u8 dv = (u8)(qv % 85);
  4235        qv /= 85;
  4236        pOut[--nco] = base85Numeral(dv);
  4237      }
  4238      pOut += (nbIn+1);
  4239    }
  4240    if( pSep && nCol>0 ) pOut = putcs(pOut, pSep);
  4241    *pOut = 0;
  4242    return pOut;
  4243  }
  4244  
  4245  /* Decode base85 text into a byte buffer. */
  4246  static u8* fromBase85( char *pIn, int ncIn, u8 *pOut ){
  4247    if( ncIn>0 && pIn[ncIn-1]=='\n' ) --ncIn;
  4248    while( ncIn>0 ){
  4249      static signed char nboi[] = { 0, 0, 1, 2, 3, 4 };
  4250      char *pUse = skipNonB85(pIn, ncIn);
  4251      unsigned long qv = 0L;
  4252      int nti, nbo;
  4253      ncIn -= (pUse - pIn);
  4254      pIn = pUse;
  4255      nti = (ncIn>5)? 5 : ncIn;
  4256      nbo = nboi[nti];
  4257      if( nbo==0 ) break;
  4258      while( nti>0 ){
  4259        char c = *pIn++;
  4260        u8 cdo = B85_DNOS(c);
  4261        --ncIn;
  4262        if( cdo==0 ) break;
  4263        qv = 85 * qv + (c - cdo);
  4264        --nti;
  4265      }
  4266      nbo -= nti; /* Adjust for early (non-digit) end of group. */
  4267      switch( nbo ){
  4268      case 4:
  4269        *pOut++ = (qv >> 24)&0xff;
  4270      case 3:
  4271        *pOut++ = (qv >> 16)&0xff;
  4272      case 2:
  4273        *pOut++ = (qv >> 8)&0xff;
  4274      case 1:
  4275        *pOut++ = qv&0xff;
  4276      case 0:
  4277        break;
  4278      }
  4279    }
  4280    return pOut;
  4281  }
  4282  
  4283  #ifndef OMIT_BASE85_CHECKER
  4284  /* Say whether input char sequence is all (base85 and/or whitespace).*/
  4285  static int allBase85( char *p, int len ){
  4286    char c;
  4287    while( len-- > 0 && (c = *p++) != 0 ){
  4288      if( !IS_B85(c) && !isspace(c) ) return 0;
  4289    }
  4290    return 1;
  4291  }
  4292  #endif
  4293  
  4294  #ifndef BASE85_STANDALONE
  4295  
  4296  # ifndef OMIT_BASE85_CHECKER
  4297  /* This function does the work for the SQLite is_base85(t) UDF. */
  4298  static void is_base85(sqlite3_context *context, int na, sqlite3_value *av[]){
  4299    assert(na==1);
  4300    switch( sqlite3_value_type(av[0]) ){
  4301    case SQLITE_TEXT:
  4302      {
  4303        int rv = allBase85( (char *)sqlite3_value_text(av[0]),
  4304                            sqlite3_value_bytes(av[0]) );
  4305        sqlite3_result_int(context, rv);
  4306      }
  4307      break;
  4308    case SQLITE_NULL:
  4309      sqlite3_result_null(context);
  4310      break;
  4311    default:
  4312      sqlite3_result_error(context, "is_base85 accepts only text or NULL", -1);
  4313      return;
  4314    }
  4315  }
  4316  # endif
  4317  
  4318  /* This function does the work for the SQLite base85(x) UDF. */
  4319  static void base85(sqlite3_context *context, int na, sqlite3_value *av[]){
  4320    int nb, nc, nv = sqlite3_value_bytes(av[0]);
  4321    int nvMax = sqlite3_limit(sqlite3_context_db_handle(context),
  4322                              SQLITE_LIMIT_LENGTH, -1);
  4323    char *cBuf;
  4324    u8 *bBuf;
  4325    assert(na==1);
  4326    switch( sqlite3_value_type(av[0]) ){
  4327    case SQLITE_BLOB:
  4328      nb = nv;
  4329      /*    ulongs    tail   newlines  tailenc+nul*/
  4330      nc = 5*(nv/4) + nv%4 + nv/64+1 + 2;
  4331      if( nvMax < nc ){
  4332        sqlite3_result_error(context, "blob expanded to base85 too big", -1);
  4333        return;
  4334      }
  4335      bBuf = (u8*)sqlite3_value_blob(av[0]);
  4336      if( !bBuf ){
  4337        if( SQLITE_NOMEM==sqlite3_errcode(sqlite3_context_db_handle(context)) ){
  4338          goto memFail;
  4339        }
  4340        sqlite3_result_text(context,"",-1,SQLITE_STATIC);
  4341        break;
  4342      }
  4343      cBuf = sqlite3_malloc(nc);
  4344      if( !cBuf ) goto memFail;
  4345      nc = (int)(toBase85(bBuf, nb, cBuf, "\n") - cBuf);
  4346      sqlite3_result_text(context, cBuf, nc, sqlite3_free);
  4347      break;
  4348    case SQLITE_TEXT:
  4349      nc = nv;
  4350      nb = 4*(nv/5) + nv%5; /* may overestimate */
  4351      if( nvMax < nb ){
  4352        sqlite3_result_error(context, "blob from base85 may be too big", -1);
  4353        return;
  4354      }else if( nb<1 ){
  4355        nb = 1;
  4356      }
  4357      cBuf = (char *)sqlite3_value_text(av[0]);
  4358      if( !cBuf ){
  4359        if( SQLITE_NOMEM==sqlite3_errcode(sqlite3_context_db_handle(context)) ){
  4360          goto memFail;
  4361        }
  4362        sqlite3_result_zeroblob(context, 0);
  4363        break;
  4364      }
  4365      bBuf = sqlite3_malloc(nb);
  4366      if( !bBuf ) goto memFail;
  4367      nb = (int)(fromBase85(cBuf, nc, bBuf) - bBuf);
  4368      sqlite3_result_blob(context, bBuf, nb, sqlite3_free);
  4369      break;
  4370    default:
  4371      sqlite3_result_error(context, "base85 accepts only blob or text.", -1);
  4372      return;
  4373    }
  4374    return;
  4375   memFail:
  4376    sqlite3_result_error(context, "base85 OOM", -1);
  4377  }
  4378  
  4379  /*
  4380  ** Establish linkage to running SQLite library.
  4381  */
  4382  #ifndef SQLITE_SHELL_EXTFUNCS
  4383  #ifdef _WIN32
  4384  
  4385  #endif
  4386  int sqlite3_base_init
  4387  #else
  4388  static int sqlite3_base85_init
  4389  #endif
  4390  (sqlite3 *db, char **pzErr, const sqlite3_api_routines *pApi){
  4391    SQLITE_EXTENSION_INIT2(pApi);
  4392    (void)pzErr;
  4393  # ifndef OMIT_BASE85_CHECKER
  4394    {
  4395      int rc = sqlite3_create_function
  4396        (db, "is_base85", 1,
  4397         SQLITE_DETERMINISTIC|SQLITE_INNOCUOUS|SQLITE_UTF8,
  4398         0, is_base85, 0, 0);
  4399      if( rc!=SQLITE_OK ) return rc;
  4400    }
  4401  # endif
  4402    return sqlite3_create_function
  4403      (db, "base85", 1,
  4404       SQLITE_DETERMINISTIC|SQLITE_INNOCUOUS|SQLITE_DIRECTONLY|SQLITE_UTF8,
  4405       0, base85, 0, 0);
  4406  }
  4407  
  4408  /*
  4409  ** Define some macros to allow this extension to be built into the shell
  4410  ** conveniently, in conjunction with use of SQLITE_SHELL_EXTFUNCS. This
  4411  ** allows shell.c, as distributed, to have this extension built in.
  4412  */
  4413  # define BASE85_INIT(db) sqlite3_base85_init(db, 0, 0)
  4414  # define BASE85_EXPOSE(db, pzErr) /* Not needed, ..._init() does this. */
  4415  
  4416  #else /* standalone program */
  4417  
  4418  int main(int na, char *av[]){
  4419    int cin;
  4420    int rc = 0;
  4421    u8 bBuf[4*(B85_DARK_MAX/5)];
  4422    char cBuf[5*(sizeof(bBuf)/4)+2];
  4423    size_t nio;
  4424  # ifndef OMIT_BASE85_CHECKER
  4425    int b85Clean = 1;
  4426  # endif
  4427    char rw;
  4428    FILE *fb = 0, *foc = 0;
  4429    char fmode[3] = "xb";
  4430    if( na < 3 || av[1][0]!='-' || (rw = av[1][1])==0 || (rw!='r' && rw!='w') ){
  4431      sayHelp();
  4432      return 0;
  4433    }
  4434    fmode[0] = rw;
  4435    if( av[2][0]=='-' && av[2][1]==0 ){
  4436      switch( rw ){
  4437      case 'r':
  4438        fb = stdin;
  4439        setmode(fileno(stdin), O_BINARY);
  4440        break;
  4441      case 'w':
  4442        fb = stdout;
  4443        setmode(fileno(stdout), O_BINARY);
  4444        break;
  4445      }
  4446    }else{
  4447      fb = fopen(av[2], fmode);
  4448      foc = fb;
  4449    }
  4450    if( !fb ){
  4451      fprintf(stderr, "Cannot open %s for %c\n", av[2], rw);
  4452      rc = 1;
  4453    }else{
  4454      switch( rw ){
  4455      case 'r':
  4456        while( (nio = fread( bBuf, 1, sizeof(bBuf), fb))>0 ){
  4457          toBase85( bBuf, (int)nio, cBuf, 0 );
  4458          fprintf(stdout, "%s\n", cBuf);
  4459        }
  4460        break;
  4461      case 'w':
  4462        while( 0 != fgets(cBuf, sizeof(cBuf), stdin) ){
  4463          int nc = strlen(cBuf);
  4464          size_t nbo = fromBase85( cBuf, nc, bBuf ) - bBuf;
  4465          if( 1 != fwrite(bBuf, nbo, 1, fb) ) rc = 1;
  4466  # ifndef OMIT_BASE85_CHECKER
  4467          b85Clean &= allBase85( cBuf, nc );
  4468  # endif
  4469        }
  4470        break;
  4471      default:
  4472        sayHelp();
  4473        rc = 1;
  4474      }
  4475      if( foc ) fclose(foc);
  4476    }
  4477  # ifndef OMIT_BASE85_CHECKER
  4478    if( !b85Clean ){
  4479      fprintf(stderr, "Base85 input had non-base85 dark or control content.\n");
  4480    }
  4481  # endif
  4482    return rc;
  4483  }
  4484  
  4485  #endif
  4486  
  4487  /************************* End ../ext/misc/base85.c ********************/
  4488  /************************* Begin ../ext/misc/ieee754.c ******************/
  4489  /*
  4490  ** 2013-04-17
  4491  **
  4492  ** The author disclaims copyright to this source code.  In place of
  4493  ** a legal notice, here is a blessing:
  4494  **
  4495  **    May you do good and not evil.
  4496  **    May you find forgiveness for yourself and forgive others.
  4497  **    May you share freely, never taking more than you give.
  4498  **
  4499  ******************************************************************************
  4500  **
  4501  ** This SQLite extension implements functions for the exact display
  4502  ** and input of IEEE754 Binary64 floating-point numbers.
  4503  **
  4504  **   ieee754(X)
  4505  **   ieee754(Y,Z)
  4506  **
  4507  ** In the first form, the value X should be a floating-point number.
  4508  ** The function will return a string of the form 'ieee754(Y,Z)' where
  4509  ** Y and Z are integers such that X==Y*pow(2,Z).
  4510  **
  4511  ** In the second form, Y and Z are integers which are the mantissa and
  4512  ** base-2 exponent of a new floating point number.  The function returns
  4513  ** a floating-point value equal to Y*pow(2,Z).
  4514  **
  4515  ** Examples:
  4516  **
  4517  **     ieee754(2.0)             ->     'ieee754(2,0)'
  4518  **     ieee754(45.25)           ->     'ieee754(181,-2)'
  4519  **     ieee754(2, 0)            ->     2.0
  4520  **     ieee754(181, -2)         ->     45.25
  4521  **
  4522  ** Two additional functions break apart the one-argument ieee754()
  4523  ** result into separate integer values:
  4524  **
  4525  **     ieee754_mantissa(45.25)  ->     181
  4526  **     ieee754_exponent(45.25)  ->     -2
  4527  **
  4528  ** These functions convert binary64 numbers into blobs and back again.
  4529  **
  4530  **     ieee754_from_blob(x'3ff0000000000000')  ->  1.0
  4531  **     ieee754_to_blob(1.0)                    ->  x'3ff0000000000000'
  4532  **
  4533  ** In all single-argument functions, if the argument is an 8-byte blob
  4534  ** then that blob is interpreted as a big-endian binary64 value.
  4535  **
  4536  **
  4537  ** EXACT DECIMAL REPRESENTATION OF BINARY64 VALUES
  4538  ** -----------------------------------------------
  4539  **
  4540  ** This extension in combination with the separate 'decimal' extension
  4541  ** can be used to compute the exact decimal representation of binary64
  4542  ** values.  To begin, first compute a table of exponent values:
  4543  **
  4544  **    CREATE TABLE pow2(x INTEGER PRIMARY KEY, v TEXT);
  4545  **    WITH RECURSIVE c(x,v) AS (
  4546  **      VALUES(0,'1')
  4547  **      UNION ALL
  4548  **      SELECT x+1, decimal_mul(v,'2') FROM c WHERE x+1<=971
  4549  **    ) INSERT INTO pow2(x,v) SELECT x, v FROM c;
  4550  **    WITH RECURSIVE c(x,v) AS (
  4551  **      VALUES(-1,'0.5')
  4552  **      UNION ALL
  4553  **      SELECT x-1, decimal_mul(v,'0.5') FROM c WHERE x-1>=-1075
  4554  **    ) INSERT INTO pow2(x,v) SELECT x, v FROM c;
  4555  **
  4556  ** Then, to compute the exact decimal representation of a floating
  4557  ** point value (the value 47.49 is used in the example) do:
  4558  **
  4559  **    WITH c(n) AS (VALUES(47.49))
  4560  **          ---------------^^^^^---- Replace with whatever you want
  4561  **    SELECT decimal_mul(ieee754_mantissa(c.n),pow2.v)
  4562  **      FROM pow2, c WHERE pow2.x=ieee754_exponent(c.n);
  4563  **
  4564  ** Here is a query to show various boundry values for the binary64
  4565  ** number format:
  4566  **
  4567  **    WITH c(name,bin) AS (VALUES
  4568  **       ('minimum positive value',        x'0000000000000001'),
  4569  **       ('maximum subnormal value',       x'000fffffffffffff'),
  4570  **       ('mininum positive nornal value', x'0010000000000000'),
  4571  **       ('maximum value',                 x'7fefffffffffffff'))
  4572  **    SELECT c.name, decimal_mul(ieee754_mantissa(c.bin),pow2.v)
  4573  **      FROM pow2, c WHERE pow2.x=ieee754_exponent(c.bin);
  4574  **
  4575  */
  4576  /* #include "sqlite3ext.h" */
  4577  SQLITE_EXTENSION_INIT1
  4578  #include <assert.h>
  4579  #include <string.h>
  4580  
  4581  /* Mark a function parameter as unused, to suppress nuisance compiler
  4582  ** warnings. */
  4583  #ifndef UNUSED_PARAMETER
  4584  # define UNUSED_PARAMETER(X)  (void)(X)
  4585  #endif
  4586  
  4587  /*
  4588  ** Implementation of the ieee754() function
  4589  */
  4590  static void ieee754func(
  4591    sqlite3_context *context,
  4592    int argc,
  4593    sqlite3_value **argv
  4594  ){
  4595    if( argc==1 ){
  4596      sqlite3_int64 m, a;
  4597      double r;
  4598      int e;
  4599      int isNeg;
  4600      char zResult[100];
  4601      assert( sizeof(m)==sizeof(r) );
  4602      if( sqlite3_value_type(argv[0])==SQLITE_BLOB
  4603       && sqlite3_value_bytes(argv[0])==sizeof(r)
  4604      ){
  4605        const unsigned char *x = sqlite3_value_blob(argv[0]);
  4606        unsigned int i;
  4607        sqlite3_uint64 v = 0;
  4608        for(i=0; i<sizeof(r); i++){
  4609          v = (v<<8) | x[i];
  4610        }
  4611        memcpy(&r, &v, sizeof(r));
  4612      }else{
  4613        r = sqlite3_value_double(argv[0]);
  4614      }
  4615      if( r<0.0 ){
  4616        isNeg = 1;
  4617        r = -r;
  4618      }else{
  4619        isNeg = 0;
  4620      }
  4621      memcpy(&a,&r,sizeof(a));
  4622      if( a==0 ){
  4623        e = 0;
  4624        m = 0;
  4625      }else{
  4626        e = a>>52;
  4627        m = a & ((((sqlite3_int64)1)<<52)-1);
  4628        if( e==0 ){
  4629          m <<= 1;
  4630        }else{
  4631          m |= ((sqlite3_int64)1)<<52;
  4632        }
  4633        while( e<1075 && m>0 && (m&1)==0 ){
  4634          m >>= 1;
  4635          e++;
  4636        }
  4637        if( isNeg ) m = -m;
  4638      }
  4639      switch( *(int*)sqlite3_user_data(context) ){
  4640        case 0:
  4641          sqlite3_snprintf(sizeof(zResult), zResult, "ieee754(%lld,%d)",
  4642                           m, e-1075);
  4643          sqlite3_result_text(context, zResult, -1, SQLITE_TRANSIENT);
  4644          break;
  4645        case 1:
  4646          sqlite3_result_int64(context, m);
  4647          break;
  4648        case 2:
  4649          sqlite3_result_int(context, e-1075);
  4650          break;
  4651      }
  4652    }else{
  4653      sqlite3_int64 m, e, a;
  4654      double r;
  4655      int isNeg = 0;
  4656      m = sqlite3_value_int64(argv[0]);
  4657      e = sqlite3_value_int64(argv[1]);
  4658  
  4659      /* Limit the range of e.  Ticket 22dea1cfdb9151e4 2021-03-02 */
  4660      if( e>10000 ){
  4661        e = 10000;
  4662      }else if( e<-10000 ){
  4663        e = -10000;
  4664      }
  4665  
  4666      if( m<0 ){
  4667        isNeg = 1;
  4668        m = -m;
  4669        if( m<0 ) return;
  4670      }else if( m==0 && e>-1000 && e<1000 ){
  4671        sqlite3_result_double(context, 0.0);
  4672        return;
  4673      }
  4674      while( (m>>32)&0xffe00000 ){
  4675        m >>= 1;
  4676        e++;
  4677      }
  4678      while( m!=0 && ((m>>32)&0xfff00000)==0 ){
  4679        m <<= 1;
  4680        e--;
  4681      }
  4682      e += 1075;
  4683      if( e<=0 ){
  4684        /* Subnormal */
  4685        if( 1-e >= 64 ){
  4686          m = 0;
  4687        }else{
  4688          m >>= 1-e;
  4689        }
  4690        e = 0;
  4691      }else if( e>0x7ff ){
  4692        e = 0x7ff;
  4693      }
  4694      a = m & ((((sqlite3_int64)1)<<52)-1);
  4695      a |= e<<52;
  4696      if( isNeg ) a |= ((sqlite3_uint64)1)<<63;
  4697      memcpy(&r, &a, sizeof(r));
  4698      sqlite3_result_double(context, r);
  4699    }
  4700  }
  4701  
  4702  /*
  4703  ** Functions to convert between blobs and floats.
  4704  */
  4705  static void ieee754func_from_blob(
  4706    sqlite3_context *context,
  4707    int argc,
  4708    sqlite3_value **argv
  4709  ){
  4710    UNUSED_PARAMETER(argc);
  4711    if( sqlite3_value_type(argv[0])==SQLITE_BLOB
  4712     && sqlite3_value_bytes(argv[0])==sizeof(double)
  4713    ){
  4714      double r;
  4715      const unsigned char *x = sqlite3_value_blob(argv[0]);
  4716      unsigned int i;
  4717      sqlite3_uint64 v = 0;
  4718      for(i=0; i<sizeof(r); i++){
  4719        v = (v<<8) | x[i];
  4720      }
  4721      memcpy(&r, &v, sizeof(r));
  4722      sqlite3_result_double(context, r);
  4723    }
  4724  }
  4725  static void ieee754func_to_blob(
  4726    sqlite3_context *context,
  4727    int argc,
  4728    sqlite3_value **argv
  4729  ){
  4730    UNUSED_PARAMETER(argc);
  4731    if( sqlite3_value_type(argv[0])==SQLITE_FLOAT
  4732     || sqlite3_value_type(argv[0])==SQLITE_INTEGER
  4733    ){
  4734      double r = sqlite3_value_double(argv[0]);
  4735      sqlite3_uint64 v;
  4736      unsigned char a[sizeof(r)];
  4737      unsigned int i;
  4738      memcpy(&v, &r, sizeof(r));
  4739      for(i=1; i<=sizeof(r); i++){
  4740        a[sizeof(r)-i] = v&0xff;
  4741        v >>= 8;
  4742      }
  4743      sqlite3_result_blob(context, a, sizeof(r), SQLITE_TRANSIENT);
  4744    }
  4745  }
  4746  
  4747  /*
  4748  ** SQL Function:   ieee754_inc(r,N)
  4749  **
  4750  ** Move the floating point value r by N quantums and return the new
  4751  ** values.
  4752  **
  4753  ** Behind the scenes: this routine merely casts r into a 64-bit unsigned
  4754  ** integer, adds N, then casts the value back into float.
  4755  **
  4756  ** Example:  To find the smallest positive number:
  4757  **
  4758  **     SELECT ieee754_inc(0.0,+1);
  4759  */
  4760  static void ieee754inc(
  4761    sqlite3_context *context,
  4762    int argc,
  4763    sqlite3_value **argv
  4764  ){
  4765    double r;
  4766    sqlite3_int64 N;
  4767    sqlite3_uint64 m1, m2;
  4768    double r2;
  4769    UNUSED_PARAMETER(argc);
  4770    r = sqlite3_value_double(argv[0]);
  4771    N = sqlite3_value_int64(argv[1]);
  4772    memcpy(&m1, &r, 8);
  4773    m2 = m1 + N;
  4774    memcpy(&r2, &m2, 8);
  4775    sqlite3_result_double(context, r2);
  4776  }
  4777  
  4778  
  4779  #ifdef _WIN32
  4780  
  4781  #endif
  4782  int sqlite3_ieee_init(
  4783    sqlite3 *db, 
  4784    char **pzErrMsg, 
  4785    const sqlite3_api_routines *pApi
  4786  ){
  4787    static const struct {
  4788      char *zFName;
  4789      int nArg;
  4790      int iAux;
  4791      void (*xFunc)(sqlite3_context*,int,sqlite3_value**);
  4792    } aFunc[] = {
  4793      { "ieee754",           1,   0, ieee754func },
  4794      { "ieee754",           2,   0, ieee754func },
  4795      { "ieee754_mantissa",  1,   1, ieee754func },
  4796      { "ieee754_exponent",  1,   2, ieee754func },
  4797      { "ieee754_to_blob",   1,   0, ieee754func_to_blob },
  4798      { "ieee754_from_blob", 1,   0, ieee754func_from_blob },
  4799      { "ieee754_inc",       2,   0, ieee754inc  },
  4800    };
  4801    unsigned int i;
  4802    int rc = SQLITE_OK;
  4803    SQLITE_EXTENSION_INIT2(pApi);
  4804    (void)pzErrMsg;  /* Unused parameter */
  4805    for(i=0; i<sizeof(aFunc)/sizeof(aFunc[0]) && rc==SQLITE_OK; i++){
  4806      rc = sqlite3_create_function(db, aFunc[i].zFName, aFunc[i].nArg,
  4807                                 SQLITE_UTF8|SQLITE_INNOCUOUS,
  4808                                 (void*)&aFunc[i].iAux,
  4809                                 aFunc[i].xFunc, 0, 0);
  4810    }
  4811    return rc;
  4812  }
  4813  
  4814  /************************* End ../ext/misc/ieee754.c ********************/
  4815  /************************* Begin ../ext/misc/series.c ******************/
  4816  /*
  4817  ** 2015-08-18, 2023-04-28
  4818  **
  4819  ** The author disclaims copyright to this source code.  In place of
  4820  ** a legal notice, here is a blessing:
  4821  **
  4822  **    May you do good and not evil.
  4823  **    May you find forgiveness for yourself and forgive others.
  4824  **    May you share freely, never taking more than you give.
  4825  **
  4826  *************************************************************************
  4827  **
  4828  ** This file demonstrates how to create a table-valued-function using
  4829  ** a virtual table.  This demo implements the generate_series() function
  4830  ** which gives the same results as the eponymous function in PostgreSQL,
  4831  ** within the limitation that its arguments are signed 64-bit integers.
  4832  **
  4833  ** Considering its equivalents to generate_series(start,stop,step): A
  4834  ** value V[n] sequence is produced for integer n ascending from 0 where
  4835  **  ( V[n] == start + n * step  &&  sgn(V[n] - stop) * sgn(step) >= 0 )
  4836  ** for each produced value (independent of production time ordering.)
  4837  **
  4838  ** All parameters must be either integer or convertable to integer.
  4839  ** The start parameter is required.
  4840  ** The stop parameter defaults to (1<<32)-1 (aka 4294967295 or 0xffffffff)
  4841  ** The step parameter defaults to 1 and 0 is treated as 1.
  4842  **
  4843  ** Examples:
  4844  **
  4845  **      SELECT * FROM generate_series(0,100,5);
  4846  **
  4847  ** The query above returns integers from 0 through 100 counting by steps
  4848  ** of 5.
  4849  **
  4850  **      SELECT * FROM generate_series(0,100);
  4851  **
  4852  ** Integers from 0 through 100 with a step size of 1.
  4853  **
  4854  **      SELECT * FROM generate_series(20) LIMIT 10;
  4855  **
  4856  ** Integers 20 through 29.
  4857  **
  4858  **      SELECT * FROM generate_series(0,-100,-5);
  4859  **
  4860  ** Integers 0 -5 -10 ... -100.
  4861  **
  4862  **      SELECT * FROM generate_series(0,-1);
  4863  **
  4864  ** Empty sequence.
  4865  **
  4866  ** HOW IT WORKS
  4867  **
  4868  ** The generate_series "function" is really a virtual table with the
  4869  ** following schema:
  4870  **
  4871  **     CREATE TABLE generate_series(
  4872  **       value,
  4873  **       start HIDDEN,
  4874  **       stop HIDDEN,
  4875  **       step HIDDEN
  4876  **     );
  4877  **
  4878  ** The virtual table also has a rowid, logically equivalent to n+1 where
  4879  ** "n" is the ascending integer in the aforesaid production definition.
  4880  **
  4881  ** Function arguments in queries against this virtual table are translated
  4882  ** into equality constraints against successive hidden columns.  In other
  4883  ** words, the following pairs of queries are equivalent to each other:
  4884  **
  4885  **    SELECT * FROM generate_series(0,100,5);
  4886  **    SELECT * FROM generate_series WHERE start=0 AND stop=100 AND step=5;
  4887  **
  4888  **    SELECT * FROM generate_series(0,100);
  4889  **    SELECT * FROM generate_series WHERE start=0 AND stop=100;
  4890  **
  4891  **    SELECT * FROM generate_series(20) LIMIT 10;
  4892  **    SELECT * FROM generate_series WHERE start=20 LIMIT 10;
  4893  **
  4894  ** The generate_series virtual table implementation leaves the xCreate method
  4895  ** set to NULL.  This means that it is not possible to do a CREATE VIRTUAL
  4896  ** TABLE command with "generate_series" as the USING argument.  Instead, there
  4897  ** is a single generate_series virtual table that is always available without
  4898  ** having to be created first.
  4899  **
  4900  ** The xBestIndex method looks for equality constraints against the hidden
  4901  ** start, stop, and step columns, and if present, it uses those constraints
  4902  ** to bound the sequence of generated values.  If the equality constraints
  4903  ** are missing, it uses 0 for start, 4294967295 for stop, and 1 for step.
  4904  ** xBestIndex returns a small cost when both start and stop are available,
  4905  ** and a very large cost if either start or stop are unavailable.  This
  4906  ** encourages the query planner to order joins such that the bounds of the
  4907  ** series are well-defined.
  4908  */
  4909  /* #include "sqlite3ext.h" */
  4910  SQLITE_EXTENSION_INIT1
  4911  #include <assert.h>
  4912  #include <string.h>
  4913  #include <limits.h>
  4914  
  4915  #ifndef SQLITE_OMIT_VIRTUALTABLE
  4916  /*
  4917  ** Return that member of a generate_series(...) sequence whose 0-based
  4918  ** index is ix. The 0th member is given by smBase. The sequence members
  4919  ** progress per ix increment by smStep.
  4920  */
  4921  static sqlite3_int64 genSeqMember(sqlite3_int64 smBase,
  4922                                    sqlite3_int64 smStep,
  4923                                    sqlite3_uint64 ix){
  4924    if( ix>=(sqlite3_uint64)LLONG_MAX ){
  4925      /* Get ix into signed i64 range. */
  4926      ix -= (sqlite3_uint64)LLONG_MAX;
  4927      /* With 2's complement ALU, this next can be 1 step, but is split into
  4928       * 2 for UBSAN's satisfaction (and hypothetical 1's complement ALUs.) */
  4929      smBase += (LLONG_MAX/2) * smStep;
  4930      smBase += (LLONG_MAX - LLONG_MAX/2) * smStep;
  4931    }
  4932    /* Under UBSAN (or on 1's complement machines), must do this last term
  4933     * in steps to avoid the dreaded (and harmless) signed multiply overlow. */
  4934    if( ix>=2 ){
  4935      sqlite3_int64 ix2 = (sqlite3_int64)ix/2;
  4936      smBase += ix2*smStep;
  4937      ix -= ix2;
  4938    }
  4939    return smBase + ((sqlite3_int64)ix)*smStep;
  4940  }
  4941  
  4942  /* typedef unsigned char u8; */
  4943  
  4944  typedef struct SequenceSpec {
  4945    sqlite3_int64 iBase;         /* Starting value ("start") */
  4946    sqlite3_int64 iTerm;         /* Given terminal value ("stop") */
  4947    sqlite3_int64 iStep;         /* Increment ("step") */
  4948    sqlite3_uint64 uSeqIndexMax; /* maximum sequence index (aka "n") */
  4949    sqlite3_uint64 uSeqIndexNow; /* Current index during generation */
  4950    sqlite3_int64 iValueNow;     /* Current value during generation */
  4951    u8 isNotEOF;                 /* Sequence generation not exhausted */
  4952    u8 isReversing;              /* Sequence is being reverse generated */
  4953  } SequenceSpec;
  4954  
  4955  /*
  4956  ** Prepare a SequenceSpec for use in generating an integer series
  4957  ** given initialized iBase, iTerm and iStep values. Sequence is
  4958  ** initialized per given isReversing. Other members are computed.
  4959  */
  4960  static void setupSequence( SequenceSpec *pss ){
  4961    int bSameSigns;
  4962    pss->uSeqIndexMax = 0;
  4963    pss->isNotEOF = 0;
  4964    bSameSigns = (pss->iBase < 0)==(pss->iTerm < 0);
  4965    if( pss->iTerm < pss->iBase ){
  4966      sqlite3_uint64 nuspan = 0;
  4967      if( bSameSigns ){
  4968        nuspan = (sqlite3_uint64)(pss->iBase - pss->iTerm);
  4969      }else{
  4970        /* Under UBSAN (or on 1's complement machines), must do this in steps.
  4971         * In this clause, iBase>=0 and iTerm<0 . */
  4972        nuspan = 1;
  4973        nuspan += pss->iBase;
  4974        nuspan += -(pss->iTerm+1);
  4975      }
  4976      if( pss->iStep<0 ){
  4977        pss->isNotEOF = 1;
  4978        if( nuspan==ULONG_MAX ){
  4979          pss->uSeqIndexMax = ( pss->iStep>LLONG_MIN )? nuspan/-pss->iStep : 1;
  4980        }else if( pss->iStep>LLONG_MIN ){
  4981          pss->uSeqIndexMax = nuspan/-pss->iStep;
  4982        }
  4983      }
  4984    }else if( pss->iTerm > pss->iBase ){
  4985      sqlite3_uint64 puspan = 0;
  4986      if( bSameSigns ){
  4987        puspan = (sqlite3_uint64)(pss->iTerm - pss->iBase);
  4988      }else{
  4989        /* Under UBSAN (or on 1's complement machines), must do this in steps.
  4990         * In this clause, iTerm>=0 and iBase<0 . */
  4991        puspan = 1;
  4992        puspan += pss->iTerm;
  4993        puspan += -(pss->iBase+1);
  4994      }
  4995      if( pss->iStep>0 ){
  4996        pss->isNotEOF = 1;
  4997        pss->uSeqIndexMax = puspan/pss->iStep;
  4998      }
  4999    }else if( pss->iTerm == pss->iBase ){
  5000        pss->isNotEOF = 1;
  5001        pss->uSeqIndexMax = 0;
  5002    }
  5003    pss->uSeqIndexNow = (pss->isReversing)? pss->uSeqIndexMax : 0;
  5004    pss->iValueNow = (pss->isReversing)
  5005      ? genSeqMember(pss->iBase, pss->iStep, pss->uSeqIndexMax)
  5006      : pss->iBase;
  5007  }
  5008  
  5009  /*
  5010  ** Progress sequence generator to yield next value, if any.
  5011  ** Leave its state to either yield next value or be at EOF.
  5012  ** Return whether there is a next value, or 0 at EOF.
  5013  */
  5014  static int progressSequence( SequenceSpec *pss ){
  5015    if( !pss->isNotEOF ) return 0;
  5016    if( pss->isReversing ){
  5017      if( pss->uSeqIndexNow > 0 ){
  5018        pss->uSeqIndexNow--;
  5019        pss->iValueNow -= pss->iStep;
  5020      }else{
  5021        pss->isNotEOF = 0;
  5022      }
  5023    }else{
  5024      if( pss->uSeqIndexNow < pss->uSeqIndexMax ){
  5025        pss->uSeqIndexNow++;
  5026        pss->iValueNow += pss->iStep;
  5027      }else{
  5028        pss->isNotEOF = 0;
  5029      }
  5030    }
  5031    return pss->isNotEOF;
  5032  }
  5033  
  5034  /* series_cursor is a subclass of sqlite3_vtab_cursor which will
  5035  ** serve as the underlying representation of a cursor that scans
  5036  ** over rows of the result
  5037  */
  5038  typedef struct series_cursor series_cursor;
  5039  struct series_cursor {
  5040    sqlite3_vtab_cursor base;  /* Base class - must be first */
  5041    SequenceSpec ss;           /* (this) Derived class data */
  5042  };
  5043  
  5044  /*
  5045  ** The seriesConnect() method is invoked to create a new
  5046  ** series_vtab that describes the generate_series virtual table.
  5047  **
  5048  ** Think of this routine as the constructor for series_vtab objects.
  5049  **
  5050  ** All this routine needs to do is:
  5051  **
  5052  **    (1) Allocate the series_vtab object and initialize all fields.
  5053  **
  5054  **    (2) Tell SQLite (via the sqlite3_declare_vtab() interface) what the
  5055  **        result set of queries against generate_series will look like.
  5056  */
  5057  static int seriesConnect(
  5058    sqlite3 *db,
  5059    void *pUnused,
  5060    int argcUnused, const char *const*argvUnused,
  5061    sqlite3_vtab **ppVtab,
  5062    char **pzErrUnused
  5063  ){
  5064    sqlite3_vtab *pNew;
  5065    int rc;
  5066  
  5067  /* Column numbers */
  5068  #define SERIES_COLUMN_VALUE 0
  5069  #define SERIES_COLUMN_START 1
  5070  #define SERIES_COLUMN_STOP  2
  5071  #define SERIES_COLUMN_STEP  3
  5072  
  5073    (void)pUnused;
  5074    (void)argcUnused;
  5075    (void)argvUnused;
  5076    (void)pzErrUnused;
  5077    rc = sqlite3_declare_vtab(db,
  5078       "CREATE TABLE x(value,start hidden,stop hidden,step hidden)");
  5079    if( rc==SQLITE_OK ){
  5080      pNew = *ppVtab = sqlite3_malloc( sizeof(*pNew) );
  5081      if( pNew==0 ) return SQLITE_NOMEM;
  5082      memset(pNew, 0, sizeof(*pNew));
  5083      sqlite3_vtab_config(db, SQLITE_VTAB_INNOCUOUS);
  5084    }
  5085    return rc;
  5086  }
  5087  
  5088  /*
  5089  ** This method is the destructor for series_cursor objects.
  5090  */
  5091  static int seriesDisconnect(sqlite3_vtab *pVtab){
  5092    sqlite3_free(pVtab);
  5093    return SQLITE_OK;
  5094  }
  5095  
  5096  /*
  5097  ** Constructor for a new series_cursor object.
  5098  */
  5099  static int seriesOpen(sqlite3_vtab *pUnused, sqlite3_vtab_cursor **ppCursor){
  5100    series_cursor *pCur;
  5101    (void)pUnused;
  5102    pCur = sqlite3_malloc( sizeof(*pCur) );
  5103    if( pCur==0 ) return SQLITE_NOMEM;
  5104    memset(pCur, 0, sizeof(*pCur));
  5105    *ppCursor = &pCur->base;
  5106    return SQLITE_OK;
  5107  }
  5108  
  5109  /*
  5110  ** Destructor for a series_cursor.
  5111  */
  5112  static int seriesClose(sqlite3_vtab_cursor *cur){
  5113    sqlite3_free(cur);
  5114    return SQLITE_OK;
  5115  }
  5116  
  5117  
  5118  /*
  5119  ** Advance a series_cursor to its next row of output.
  5120  */
  5121  static int seriesNext(sqlite3_vtab_cursor *cur){
  5122    series_cursor *pCur = (series_cursor*)cur;
  5123    progressSequence( & pCur->ss );
  5124    return SQLITE_OK;
  5125  }
  5126  
  5127  /*
  5128  ** Return values of columns for the row at which the series_cursor
  5129  ** is currently pointing.
  5130  */
  5131  static int seriesColumn(
  5132    sqlite3_vtab_cursor *cur,   /* The cursor */
  5133    sqlite3_context *ctx,       /* First argument to sqlite3_result_...() */
  5134    int i                       /* Which column to return */
  5135  ){
  5136    series_cursor *pCur = (series_cursor*)cur;
  5137    sqlite3_int64 x = 0;
  5138    switch( i ){
  5139      case SERIES_COLUMN_START:  x = pCur->ss.iBase; break;
  5140      case SERIES_COLUMN_STOP:   x = pCur->ss.iTerm; break;
  5141      case SERIES_COLUMN_STEP:   x = pCur->ss.iStep;   break;
  5142      default:                   x = pCur->ss.iValueNow;  break;
  5143    }
  5144    sqlite3_result_int64(ctx, x);
  5145    return SQLITE_OK;
  5146  }
  5147  
  5148  #ifndef LARGEST_UINT64
  5149  #define LARGEST_UINT64 (0xffffffff|(((sqlite3_uint64)0xffffffff)<<32))
  5150  #endif
  5151  
  5152  /*
  5153  ** Return the rowid for the current row, logically equivalent to n+1 where
  5154  ** "n" is the ascending integer in the aforesaid production definition.
  5155  */
  5156  static int seriesRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
  5157    series_cursor *pCur = (series_cursor*)cur;
  5158    sqlite3_uint64 n = pCur->ss.uSeqIndexNow;
  5159    *pRowid = (sqlite3_int64)((n<LARGEST_UINT64)? n+1 : 0);
  5160    return SQLITE_OK;
  5161  }
  5162  
  5163  /*
  5164  ** Return TRUE if the cursor has been moved off of the last
  5165  ** row of output.
  5166  */
  5167  static int seriesEof(sqlite3_vtab_cursor *cur){
  5168    series_cursor *pCur = (series_cursor*)cur;
  5169    return !pCur->ss.isNotEOF;
  5170  }
  5171  
  5172  /* True to cause run-time checking of the start=, stop=, and/or step=
  5173  ** parameters.  The only reason to do this is for testing the
  5174  ** constraint checking logic for virtual tables in the SQLite core.
  5175  */
  5176  #ifndef SQLITE_SERIES_CONSTRAINT_VERIFY
  5177  # define SQLITE_SERIES_CONSTRAINT_VERIFY 0
  5178  #endif
  5179  
  5180  /*
  5181  ** This method is called to "rewind" the series_cursor object back
  5182  ** to the first row of output.  This method is always called at least
  5183  ** once prior to any call to seriesColumn() or seriesRowid() or
  5184  ** seriesEof().
  5185  **
  5186  ** The query plan selected by seriesBestIndex is passed in the idxNum
  5187  ** parameter.  (idxStr is not used in this implementation.)  idxNum
  5188  ** is a bitmask showing which constraints are available:
  5189  **
  5190  **    1:    start=VALUE
  5191  **    2:    stop=VALUE
  5192  **    4:    step=VALUE
  5193  **
  5194  ** Also, if bit 8 is set, that means that the series should be output
  5195  ** in descending order rather than in ascending order.  If bit 16 is
  5196  ** set, then output must appear in ascending order.
  5197  **
  5198  ** This routine should initialize the cursor and position it so that it
  5199  ** is pointing at the first row, or pointing off the end of the table
  5200  ** (so that seriesEof() will return true) if the table is empty.
  5201  */
  5202  static int seriesFilter(
  5203    sqlite3_vtab_cursor *pVtabCursor,
  5204    int idxNum, const char *idxStrUnused,
  5205    int argc, sqlite3_value **argv
  5206  ){
  5207    series_cursor *pCur = (series_cursor *)pVtabCursor;
  5208    int i = 0;
  5209    (void)idxStrUnused;
  5210    if( idxNum & 1 ){
  5211      pCur->ss.iBase = sqlite3_value_int64(argv[i++]);
  5212    }else{
  5213      pCur->ss.iBase = 0;
  5214    }
  5215    if( idxNum & 2 ){
  5216      pCur->ss.iTerm = sqlite3_value_int64(argv[i++]);
  5217    }else{
  5218      pCur->ss.iTerm = 0xffffffff;
  5219    }
  5220    if( idxNum & 4 ){
  5221      pCur->ss.iStep = sqlite3_value_int64(argv[i++]);
  5222      if( pCur->ss.iStep==0 ){
  5223        pCur->ss.iStep = 1;
  5224      }else if( pCur->ss.iStep<0 ){
  5225        if( (idxNum & 16)==0 ) idxNum |= 8;
  5226      }
  5227    }else{
  5228      pCur->ss.iStep = 1;
  5229    }
  5230    for(i=0; i<argc; i++){
  5231      if( sqlite3_value_type(argv[i])==SQLITE_NULL ){
  5232        /* If any of the constraints have a NULL value, then return no rows.
  5233        ** See ticket https://www.sqlite.org/src/info/fac496b61722daf2 */
  5234        pCur->ss.iBase = 1;
  5235        pCur->ss.iTerm = 0;
  5236        pCur->ss.iStep = 1;
  5237        break;
  5238      }
  5239    }
  5240    if( idxNum & 8 ){
  5241      pCur->ss.isReversing = pCur->ss.iStep > 0;
  5242    }else{
  5243      pCur->ss.isReversing = pCur->ss.iStep < 0;
  5244    }
  5245    setupSequence( &pCur->ss );
  5246    return SQLITE_OK;
  5247  }
  5248  
  5249  /*
  5250  ** SQLite will invoke this method one or more times while planning a query
  5251  ** that uses the generate_series virtual table.  This routine needs to create
  5252  ** a query plan for each invocation and compute an estimated cost for that
  5253  ** plan.
  5254  **
  5255  ** In this implementation idxNum is used to represent the
  5256  ** query plan.  idxStr is unused.
  5257  **
  5258  ** The query plan is represented by bits in idxNum:
  5259  **
  5260  **  (1)  start = $value  -- constraint exists
  5261  **  (2)  stop = $value   -- constraint exists
  5262  **  (4)  step = $value   -- constraint exists
  5263  **  (8)  output in descending order
  5264  */
  5265  static int seriesBestIndex(
  5266    sqlite3_vtab *pVTab,
  5267    sqlite3_index_info *pIdxInfo
  5268  ){
  5269    int i, j;              /* Loop over constraints */
  5270    int idxNum = 0;        /* The query plan bitmask */
  5271    int bStartSeen = 0;    /* EQ constraint seen on the START column */
  5272    int unusableMask = 0;  /* Mask of unusable constraints */
  5273    int nArg = 0;          /* Number of arguments that seriesFilter() expects */
  5274    int aIdx[3];           /* Constraints on start, stop, and step */
  5275    const struct sqlite3_index_constraint *pConstraint;
  5276  
  5277    /* This implementation assumes that the start, stop, and step columns
  5278    ** are the last three columns in the virtual table. */
  5279    assert( SERIES_COLUMN_STOP == SERIES_COLUMN_START+1 );
  5280    assert( SERIES_COLUMN_STEP == SERIES_COLUMN_START+2 );
  5281  
  5282    aIdx[0] = aIdx[1] = aIdx[2] = -1;
  5283    pConstraint = pIdxInfo->aConstraint;
  5284    for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
  5285      int iCol;    /* 0 for start, 1 for stop, 2 for step */
  5286      int iMask;   /* bitmask for those column */
  5287      if( pConstraint->iColumn<SERIES_COLUMN_START ) continue;
  5288      iCol = pConstraint->iColumn - SERIES_COLUMN_START;
  5289      assert( iCol>=0 && iCol<=2 );
  5290      iMask = 1 << iCol;
  5291      if( iCol==0 ) bStartSeen = 1;
  5292      if( pConstraint->usable==0 ){
  5293        unusableMask |=  iMask;
  5294        continue;
  5295      }else if( pConstraint->op==SQLITE_INDEX_CONSTRAINT_EQ ){
  5296        idxNum |= iMask;
  5297        aIdx[iCol] = i;
  5298      }
  5299    }
  5300    for(i=0; i<3; i++){
  5301      if( (j = aIdx[i])>=0 ){
  5302        pIdxInfo->aConstraintUsage[j].argvIndex = ++nArg;
  5303        pIdxInfo->aConstraintUsage[j].omit = !SQLITE_SERIES_CONSTRAINT_VERIFY;
  5304      }
  5305    }
  5306    /* The current generate_column() implementation requires at least one
  5307    ** argument (the START value).  Legacy versions assumed START=0 if the
  5308    ** first argument was omitted.  Compile with -DZERO_ARGUMENT_GENERATE_SERIES
  5309    ** to obtain the legacy behavior */
  5310  #ifndef ZERO_ARGUMENT_GENERATE_SERIES
  5311    if( !bStartSeen ){
  5312      sqlite3_free(pVTab->zErrMsg);
  5313      pVTab->zErrMsg = sqlite3_mprintf(
  5314          "first argument to \"generate_series()\" missing or unusable");
  5315      return SQLITE_ERROR;
  5316    }
  5317  #endif
  5318    if( (unusableMask & ~idxNum)!=0 ){
  5319      /* The start, stop, and step columns are inputs.  Therefore if there
  5320      ** are unusable constraints on any of start, stop, or step then
  5321      ** this plan is unusable */
  5322      return SQLITE_CONSTRAINT;
  5323    }
  5324    if( (idxNum & 3)==3 ){
  5325      /* Both start= and stop= boundaries are available.  This is the 
  5326      ** the preferred case */
  5327      pIdxInfo->estimatedCost = (double)(2 - ((idxNum&4)!=0));
  5328      pIdxInfo->estimatedRows = 1000;
  5329      if( pIdxInfo->nOrderBy>=1 && pIdxInfo->aOrderBy[0].iColumn==0 ){
  5330        if( pIdxInfo->aOrderBy[0].desc ){
  5331          idxNum |= 8;
  5332        }else{
  5333          idxNum |= 16;
  5334        }
  5335        pIdxInfo->orderByConsumed = 1;
  5336      }
  5337    }else{
  5338      /* If either boundary is missing, we have to generate a huge span
  5339      ** of numbers.  Make this case very expensive so that the query
  5340      ** planner will work hard to avoid it. */
  5341      pIdxInfo->estimatedRows = 2147483647;
  5342    }
  5343    pIdxInfo->idxNum = idxNum;
  5344    return SQLITE_OK;
  5345  }
  5346  
  5347  /*
  5348  ** This following structure defines all the methods for the 
  5349  ** generate_series virtual table.
  5350  */
  5351  static sqlite3_module seriesModule = {
  5352    0,                         /* iVersion */
  5353    0,                         /* xCreate */
  5354    seriesConnect,             /* xConnect */
  5355    seriesBestIndex,           /* xBestIndex */
  5356    seriesDisconnect,          /* xDisconnect */
  5357    0,                         /* xDestroy */
  5358    seriesOpen,                /* xOpen - open a cursor */
  5359    seriesClose,               /* xClose - close a cursor */
  5360    seriesFilter,              /* xFilter - configure scan constraints */
  5361    seriesNext,                /* xNext - advance a cursor */
  5362    seriesEof,                 /* xEof - check for end of scan */
  5363    seriesColumn,              /* xColumn - read data */
  5364    seriesRowid,               /* xRowid - read data */
  5365    0,                         /* xUpdate */
  5366    0,                         /* xBegin */
  5367    0,                         /* xSync */
  5368    0,                         /* xCommit */
  5369    0,                         /* xRollback */
  5370    0,                         /* xFindMethod */
  5371    0,                         /* xRename */
  5372    0,                         /* xSavepoint */
  5373    0,                         /* xRelease */
  5374    0,                         /* xRollbackTo */
  5375    0                          /* xShadowName */
  5376  };
  5377  
  5378  #endif /* SQLITE_OMIT_VIRTUALTABLE */
  5379  
  5380  #ifdef _WIN32
  5381  
  5382  #endif
  5383  int sqlite3_series_init(
  5384    sqlite3 *db, 
  5385    char **pzErrMsg, 
  5386    const sqlite3_api_routines *pApi
  5387  ){
  5388    int rc = SQLITE_OK;
  5389    SQLITE_EXTENSION_INIT2(pApi);
  5390  #ifndef SQLITE_OMIT_VIRTUALTABLE
  5391    if( sqlite3_libversion_number()<3008012 && pzErrMsg!=0 ){
  5392      *pzErrMsg = sqlite3_mprintf(
  5393          "generate_series() requires SQLite 3.8.12 or later");
  5394      return SQLITE_ERROR;
  5395    }
  5396    rc = sqlite3_create_module(db, "generate_series", &seriesModule, 0);
  5397  #endif
  5398    return rc;
  5399  }
  5400  
  5401  /************************* End ../ext/misc/series.c ********************/
  5402  /************************* Begin ../ext/misc/regexp.c ******************/
  5403  /*
  5404  ** 2012-11-13
  5405  **
  5406  ** The author disclaims copyright to this source code.  In place of
  5407  ** a legal notice, here is a blessing:
  5408  **
  5409  **    May you do good and not evil.
  5410  **    May you find forgiveness for yourself and forgive others.
  5411  **    May you share freely, never taking more than you give.
  5412  **
  5413  ******************************************************************************
  5414  **
  5415  ** The code in this file implements a compact but reasonably
  5416  ** efficient regular-expression matcher for posix extended regular
  5417  ** expressions against UTF8 text.
  5418  **
  5419  ** This file is an SQLite extension.  It registers a single function
  5420  ** named "regexp(A,B)" where A is the regular expression and B is the
  5421  ** string to be matched.  By registering this function, SQLite will also
  5422  ** then implement the "B regexp A" operator.  Note that with the function
  5423  ** the regular expression comes first, but with the operator it comes
  5424  ** second.
  5425  **
  5426  **  The following regular expression syntax is supported:
  5427  **
  5428  **     X*      zero or more occurrences of X
  5429  **     X+      one or more occurrences of X
  5430  **     X?      zero or one occurrences of X
  5431  **     X{p,q}  between p and q occurrences of X
  5432  **     (X)     match X
  5433  **     X|Y     X or Y
  5434  **     ^X      X occurring at the beginning of the string
  5435  **     X$      X occurring at the end of the string
  5436  **     .       Match any single character
  5437  **     \c      Character c where c is one of \{}()[]|*+?.
  5438  **     \c      C-language escapes for c in afnrtv.  ex: \t or \n
  5439  **     \uXXXX  Where XXXX is exactly 4 hex digits, unicode value XXXX
  5440  **     \xXX    Where XX is exactly 2 hex digits, unicode value XX
  5441  **     [abc]   Any single character from the set abc
  5442  **     [^abc]  Any single character not in the set abc
  5443  **     [a-z]   Any single character in the range a-z
  5444  **     [^a-z]  Any single character not in the range a-z
  5445  **     \b      Word boundary
  5446  **     \w      Word character.  [A-Za-z0-9_]
  5447  **     \W      Non-word character
  5448  **     \d      Digit
  5449  **     \D      Non-digit
  5450  **     \s      Whitespace character
  5451  **     \S      Non-whitespace character
  5452  **
  5453  ** A nondeterministic finite automaton (NFA) is used for matching, so the
  5454  ** performance is bounded by O(N*M) where N is the size of the regular
  5455  ** expression and M is the size of the input string.  The matcher never
  5456  ** exhibits exponential behavior.  Note that the X{p,q} operator expands
  5457  ** to p copies of X following by q-p copies of X? and that the size of the
  5458  ** regular expression in the O(N*M) performance bound is computed after
  5459  ** this expansion.
  5460  */
  5461  #include <string.h>
  5462  #include <stdlib.h>
  5463  /* #include "sqlite3ext.h" */
  5464  SQLITE_EXTENSION_INIT1
  5465  
  5466  /*
  5467  ** The following #defines change the names of some functions implemented in
  5468  ** this file to prevent name collisions with C-library functions of the
  5469  ** same name.
  5470  */
  5471  #define re_match   sqlite3re_match
  5472  #define re_compile sqlite3re_compile
  5473  #define re_free    sqlite3re_free
  5474  
  5475  /* The end-of-input character */
  5476  #define RE_EOF            0    /* End of input */
  5477  #define RE_START  0xfffffff    /* Start of input - larger than an UTF-8 */
  5478  
  5479  /* The NFA is implemented as sequence of opcodes taken from the following
  5480  ** set.  Each opcode has a single integer argument.
  5481  */
  5482  #define RE_OP_MATCH       1    /* Match the one character in the argument */
  5483  #define RE_OP_ANY         2    /* Match any one character.  (Implements ".") */
  5484  #define RE_OP_ANYSTAR     3    /* Special optimized version of .* */
  5485  #define RE_OP_FORK        4    /* Continue to both next and opcode at iArg */
  5486  #define RE_OP_GOTO        5    /* Jump to opcode at iArg */
  5487  #define RE_OP_ACCEPT      6    /* Halt and indicate a successful match */
  5488  #define RE_OP_CC_INC      7    /* Beginning of a [...] character class */
  5489  #define RE_OP_CC_EXC      8    /* Beginning of a [^...] character class */
  5490  #define RE_OP_CC_VALUE    9    /* Single value in a character class */
  5491  #define RE_OP_CC_RANGE   10    /* Range of values in a character class */
  5492  #define RE_OP_WORD       11    /* Perl word character [A-Za-z0-9_] */
  5493  #define RE_OP_NOTWORD    12    /* Not a perl word character */
  5494  #define RE_OP_DIGIT      13    /* digit:  [0-9] */
  5495  #define RE_OP_NOTDIGIT   14    /* Not a digit */
  5496  #define RE_OP_SPACE      15    /* space:  [ \t\n\r\v\f] */
  5497  #define RE_OP_NOTSPACE   16    /* Not a digit */
  5498  #define RE_OP_BOUNDARY   17    /* Boundary between word and non-word */
  5499  #define RE_OP_ATSTART    18    /* Currently at the start of the string */
  5500  
  5501  #if defined(SQLITE_DEBUG)
  5502  /* Opcode names used for symbolic debugging */
  5503  static const char *ReOpName[] = {
  5504    "EOF",
  5505    "MATCH",
  5506    "ANY",
  5507    "ANYSTAR",
  5508    "FORK",
  5509    "GOTO",
  5510    "ACCEPT",
  5511    "CC_INC",
  5512    "CC_EXC",
  5513    "CC_VALUE",
  5514    "CC_RANGE",
  5515    "WORD",
  5516    "NOTWORD",
  5517    "DIGIT",
  5518    "NOTDIGIT",
  5519    "SPACE",
  5520    "NOTSPACE",
  5521    "BOUNDARY",
  5522    "ATSTART",
  5523  };
  5524  #endif /* SQLITE_DEBUG */
  5525  
  5526  
  5527  /* Each opcode is a "state" in the NFA */
  5528  typedef unsigned short ReStateNumber;
  5529  
  5530  /* Because this is an NFA and not a DFA, multiple states can be active at
  5531  ** once.  An instance of the following object records all active states in
  5532  ** the NFA.  The implementation is optimized for the common case where the
  5533  ** number of actives states is small.
  5534  */
  5535  typedef struct ReStateSet {
  5536    unsigned nState;            /* Number of current states */
  5537    ReStateNumber *aState;      /* Current states */
  5538  } ReStateSet;
  5539  
  5540  /* An input string read one character at a time.
  5541  */
  5542  typedef struct ReInput ReInput;
  5543  struct ReInput {
  5544    const unsigned char *z;  /* All text */
  5545    int i;                   /* Next byte to read */
  5546    int mx;                  /* EOF when i>=mx */
  5547  };
  5548  
  5549  /* A compiled NFA (or an NFA that is in the process of being compiled) is
  5550  ** an instance of the following object.
  5551  */
  5552  typedef struct ReCompiled ReCompiled;
  5553  struct ReCompiled {
  5554    ReInput sIn;                /* Regular expression text */
  5555    const char *zErr;           /* Error message to return */
  5556    char *aOp;                  /* Operators for the virtual machine */
  5557    int *aArg;                  /* Arguments to each operator */
  5558    unsigned (*xNextChar)(ReInput*);  /* Next character function */
  5559    unsigned char zInit[12];    /* Initial text to match */
  5560    int nInit;                  /* Number of bytes in zInit */
  5561    unsigned nState;            /* Number of entries in aOp[] and aArg[] */
  5562    unsigned nAlloc;            /* Slots allocated for aOp[] and aArg[] */
  5563  };
  5564  
  5565  /* Add a state to the given state set if it is not already there */
  5566  static void re_add_state(ReStateSet *pSet, int newState){
  5567    unsigned i;
  5568    for(i=0; i<pSet->nState; i++) if( pSet->aState[i]==newState ) return;
  5569    pSet->aState[pSet->nState++] = (ReStateNumber)newState;
  5570  }
  5571  
  5572  /* Extract the next unicode character from *pzIn and return it.  Advance
  5573  ** *pzIn to the first byte past the end of the character returned.  To
  5574  ** be clear:  this routine converts utf8 to unicode.  This routine is 
  5575  ** optimized for the common case where the next character is a single byte.
  5576  */
  5577  static unsigned re_next_char(ReInput *p){
  5578    unsigned c;
  5579    if( p->i>=p->mx ) return 0;
  5580    c = p->z[p->i++];
  5581    if( c>=0x80 ){
  5582      if( (c&0xe0)==0xc0 && p->i<p->mx && (p->z[p->i]&0xc0)==0x80 ){
  5583        c = (c&0x1f)<<6 | (p->z[p->i++]&0x3f);
  5584        if( c<0x80 ) c = 0xfffd;
  5585      }else if( (c&0xf0)==0xe0 && p->i+1<p->mx && (p->z[p->i]&0xc0)==0x80
  5586             && (p->z[p->i+1]&0xc0)==0x80 ){
  5587        c = (c&0x0f)<<12 | ((p->z[p->i]&0x3f)<<6) | (p->z[p->i+1]&0x3f);
  5588        p->i += 2;
  5589        if( c<=0x7ff || (c>=0xd800 && c<=0xdfff) ) c = 0xfffd;
  5590      }else if( (c&0xf8)==0xf0 && p->i+2<p->mx && (p->z[p->i]&0xc0)==0x80
  5591             && (p->z[p->i+1]&0xc0)==0x80 && (p->z[p->i+2]&0xc0)==0x80 ){
  5592        c = (c&0x07)<<18 | ((p->z[p->i]&0x3f)<<12) | ((p->z[p->i+1]&0x3f)<<6)
  5593                         | (p->z[p->i+2]&0x3f);
  5594        p->i += 3;
  5595        if( c<=0xffff || c>0x10ffff ) c = 0xfffd;
  5596      }else{
  5597        c = 0xfffd;
  5598      }
  5599    }
  5600    return c;
  5601  }
  5602  static unsigned re_next_char_nocase(ReInput *p){
  5603    unsigned c = re_next_char(p);
  5604    if( c>='A' && c<='Z' ) c += 'a' - 'A';
  5605    return c;
  5606  }
  5607  
  5608  /* Return true if c is a perl "word" character:  [A-Za-z0-9_] */
  5609  static int re_word_char(int c){
  5610    return (c>='0' && c<='9') || (c>='a' && c<='z')
  5611        || (c>='A' && c<='Z') || c=='_';
  5612  }
  5613  
  5614  /* Return true if c is a "digit" character:  [0-9] */
  5615  static int re_digit_char(int c){
  5616    return (c>='0' && c<='9');
  5617  }
  5618  
  5619  /* Return true if c is a perl "space" character:  [ \t\r\n\v\f] */
  5620  static int re_space_char(int c){
  5621    return c==' ' || c=='\t' || c=='\n' || c=='\r' || c=='\v' || c=='\f';
  5622  }
  5623  
  5624  /* Run a compiled regular expression on the zero-terminated input
  5625  ** string zIn[].  Return true on a match and false if there is no match.
  5626  */
  5627  static int re_match(ReCompiled *pRe, const unsigned char *zIn, int nIn){
  5628    ReStateSet aStateSet[2], *pThis, *pNext;
  5629    ReStateNumber aSpace[100];
  5630    ReStateNumber *pToFree;
  5631    unsigned int i = 0;
  5632    unsigned int iSwap = 0;
  5633    int c = RE_START;
  5634    int cPrev = 0;
  5635    int rc = 0;
  5636    ReInput in;
  5637  
  5638    in.z = zIn;
  5639    in.i = 0;
  5640    in.mx = nIn>=0 ? nIn : (int)strlen((char const*)zIn);
  5641  
  5642    /* Look for the initial prefix match, if there is one. */
  5643    if( pRe->nInit ){
  5644      unsigned char x = pRe->zInit[0];
  5645      while( in.i+pRe->nInit<=in.mx 
  5646       && (zIn[in.i]!=x ||
  5647           strncmp((const char*)zIn+in.i, (const char*)pRe->zInit, pRe->nInit)!=0)
  5648      ){
  5649        in.i++;
  5650      }
  5651      if( in.i+pRe->nInit>in.mx ) return 0;
  5652      c = RE_START-1;
  5653    }
  5654  
  5655    if( pRe->nState<=(sizeof(aSpace)/(sizeof(aSpace[0])*2)) ){
  5656      pToFree = 0;
  5657      aStateSet[0].aState = aSpace;
  5658    }else{
  5659      pToFree = sqlite3_malloc64( sizeof(ReStateNumber)*2*pRe->nState );
  5660      if( pToFree==0 ) return -1;
  5661      aStateSet[0].aState = pToFree;
  5662    }
  5663    aStateSet[1].aState = &aStateSet[0].aState[pRe->nState];
  5664    pNext = &aStateSet[1];
  5665    pNext->nState = 0;
  5666    re_add_state(pNext, 0);
  5667    while( c!=RE_EOF && pNext->nState>0 ){
  5668      cPrev = c;
  5669      c = pRe->xNextChar(&in);
  5670      pThis = pNext;
  5671      pNext = &aStateSet[iSwap];
  5672      iSwap = 1 - iSwap;
  5673      pNext->nState = 0;
  5674      for(i=0; i<pThis->nState; i++){
  5675        int x = pThis->aState[i];
  5676        switch( pRe->aOp[x] ){
  5677          case RE_OP_MATCH: {
  5678            if( pRe->aArg[x]==c ) re_add_state(pNext, x+1);
  5679            break;
  5680          }
  5681          case RE_OP_ATSTART: {
  5682            if( cPrev==RE_START ) re_add_state(pThis, x+1);
  5683            break;
  5684          }
  5685          case RE_OP_ANY: {
  5686            if( c!=0 ) re_add_state(pNext, x+1);
  5687            break;
  5688          }
  5689          case RE_OP_WORD: {
  5690            if( re_word_char(c) ) re_add_state(pNext, x+1);
  5691            break;
  5692          }
  5693          case RE_OP_NOTWORD: {
  5694            if( !re_word_char(c) && c!=0 ) re_add_state(pNext, x+1);
  5695            break;
  5696          }
  5697          case RE_OP_DIGIT: {
  5698            if( re_digit_char(c) ) re_add_state(pNext, x+1);
  5699            break;
  5700          }
  5701          case RE_OP_NOTDIGIT: {
  5702            if( !re_digit_char(c) && c!=0 ) re_add_state(pNext, x+1);
  5703            break;
  5704          }
  5705          case RE_OP_SPACE: {
  5706            if( re_space_char(c) ) re_add_state(pNext, x+1);
  5707            break;
  5708          }
  5709          case RE_OP_NOTSPACE: {
  5710            if( !re_space_char(c) && c!=0 ) re_add_state(pNext, x+1);
  5711            break;
  5712          }
  5713          case RE_OP_BOUNDARY: {
  5714            if( re_word_char(c)!=re_word_char(cPrev) ) re_add_state(pThis, x+1);
  5715            break;
  5716          }
  5717          case RE_OP_ANYSTAR: {
  5718            re_add_state(pNext, x);
  5719            re_add_state(pThis, x+1);
  5720            break;
  5721          }
  5722          case RE_OP_FORK: {
  5723            re_add_state(pThis, x+pRe->aArg[x]);
  5724            re_add_state(pThis, x+1);
  5725            break;
  5726          }
  5727          case RE_OP_GOTO: {
  5728            re_add_state(pThis, x+pRe->aArg[x]);
  5729            break;
  5730          }
  5731          case RE_OP_ACCEPT: {
  5732            rc = 1;
  5733            goto re_match_end;
  5734          }
  5735          case RE_OP_CC_EXC: {
  5736            if( c==0 ) break;
  5737            /* fall-through */ goto re_op_cc_inc;
  5738          }
  5739          case RE_OP_CC_INC: re_op_cc_inc: {
  5740            int j = 1;
  5741            int n = pRe->aArg[x];
  5742            int hit = 0;
  5743            for(j=1; j>0 && j<n; j++){
  5744              if( pRe->aOp[x+j]==RE_OP_CC_VALUE ){
  5745                if( pRe->aArg[x+j]==c ){
  5746                  hit = 1;
  5747                  j = -1;
  5748                }
  5749              }else{
  5750                if( pRe->aArg[x+j]<=c && pRe->aArg[x+j+1]>=c ){
  5751                  hit = 1;
  5752                  j = -1;
  5753                }else{
  5754                  j++;
  5755                }
  5756              }
  5757            }
  5758            if( pRe->aOp[x]==RE_OP_CC_EXC ) hit = !hit;
  5759            if( hit ) re_add_state(pNext, x+n);
  5760            break;
  5761          }
  5762        }
  5763      }
  5764    }
  5765    for(i=0; i<pNext->nState; i++){
  5766      int x = pNext->aState[i];
  5767      while( pRe->aOp[x]==RE_OP_GOTO ) x += pRe->aArg[x];
  5768      if( pRe->aOp[x]==RE_OP_ACCEPT ){ rc = 1; break; }
  5769    }
  5770  re_match_end:
  5771    sqlite3_free(pToFree);
  5772    return rc;
  5773  }
  5774  
  5775  /* Resize the opcode and argument arrays for an RE under construction.
  5776  */
  5777  static int re_resize(ReCompiled *p, int N){
  5778    char *aOp;
  5779    int *aArg;
  5780    aOp = sqlite3_realloc64(p->aOp, N*sizeof(p->aOp[0]));
  5781    if( aOp==0 ) return 1;
  5782    p->aOp = aOp;
  5783    aArg = sqlite3_realloc64(p->aArg, N*sizeof(p->aArg[0]));
  5784    if( aArg==0 ) return 1;
  5785    p->aArg = aArg;
  5786    p->nAlloc = N;
  5787    return 0;
  5788  }
  5789  
  5790  /* Insert a new opcode and argument into an RE under construction.  The
  5791  ** insertion point is just prior to existing opcode iBefore.
  5792  */
  5793  static int re_insert(ReCompiled *p, int iBefore, int op, int arg){
  5794    int i;
  5795    if( p->nAlloc<=p->nState && re_resize(p, p->nAlloc*2) ) return 0;
  5796    for(i=p->nState; i>iBefore; i--){
  5797      p->aOp[i] = p->aOp[i-1];
  5798      p->aArg[i] = p->aArg[i-1];
  5799    }
  5800    p->nState++;
  5801    p->aOp[iBefore] = (char)op;
  5802    p->aArg[iBefore] = arg;
  5803    return iBefore;
  5804  }
  5805  
  5806  /* Append a new opcode and argument to the end of the RE under construction.
  5807  */
  5808  static int re_append(ReCompiled *p, int op, int arg){
  5809    return re_insert(p, p->nState, op, arg);
  5810  }
  5811  
  5812  /* Make a copy of N opcodes starting at iStart onto the end of the RE
  5813  ** under construction.
  5814  */
  5815  static void re_copy(ReCompiled *p, int iStart, int N){
  5816    if( p->nState+N>=p->nAlloc && re_resize(p, p->nAlloc*2+N) ) return;
  5817    memcpy(&p->aOp[p->nState], &p->aOp[iStart], N*sizeof(p->aOp[0]));
  5818    memcpy(&p->aArg[p->nState], &p->aArg[iStart], N*sizeof(p->aArg[0]));
  5819    p->nState += N;
  5820  }
  5821  
  5822  /* Return true if c is a hexadecimal digit character:  [0-9a-fA-F]
  5823  ** If c is a hex digit, also set *pV = (*pV)*16 + valueof(c).  If
  5824  ** c is not a hex digit *pV is unchanged.
  5825  */
  5826  static int re_hex(int c, int *pV){
  5827    if( c>='0' && c<='9' ){
  5828      c -= '0';
  5829    }else if( c>='a' && c<='f' ){
  5830      c -= 'a' - 10;
  5831    }else if( c>='A' && c<='F' ){
  5832      c -= 'A' - 10;
  5833    }else{
  5834      return 0;
  5835    }
  5836    *pV = (*pV)*16 + (c & 0xff);
  5837    return 1;
  5838  }
  5839  
  5840  /* A backslash character has been seen, read the next character and
  5841  ** return its interpretation.
  5842  */
  5843  static unsigned re_esc_char(ReCompiled *p){
  5844    static const char zEsc[] = "afnrtv\\()*.+?[$^{|}]";
  5845    static const char zTrans[] = "\a\f\n\r\t\v";
  5846    int i, v = 0;
  5847    char c;
  5848    if( p->sIn.i>=p->sIn.mx ) return 0;
  5849    c = p->sIn.z[p->sIn.i];
  5850    if( c=='u' && p->sIn.i+4<p->sIn.mx ){
  5851      const unsigned char *zIn = p->sIn.z + p->sIn.i;
  5852      if( re_hex(zIn[1],&v)
  5853       && re_hex(zIn[2],&v)
  5854       && re_hex(zIn[3],&v)
  5855       && re_hex(zIn[4],&v)
  5856      ){
  5857        p->sIn.i += 5;
  5858        return v;
  5859      }
  5860    }
  5861    if( c=='x' && p->sIn.i+2<p->sIn.mx ){
  5862      const unsigned char *zIn = p->sIn.z + p->sIn.i;
  5863      if( re_hex(zIn[1],&v)
  5864       && re_hex(zIn[2],&v)
  5865      ){
  5866        p->sIn.i += 3;
  5867        return v;
  5868      }
  5869    }
  5870    for(i=0; zEsc[i] && zEsc[i]!=c; i++){}
  5871    if( zEsc[i] ){
  5872      if( i<6 ) c = zTrans[i];
  5873      p->sIn.i++;
  5874    }else{
  5875      p->zErr = "unknown \\ escape";
  5876    }
  5877    return c;
  5878  }
  5879  
  5880  /* Forward declaration */
  5881  static const char *re_subcompile_string(ReCompiled*);
  5882  
  5883  /* Peek at the next byte of input */
  5884  static unsigned char rePeek(ReCompiled *p){
  5885    return p->sIn.i<p->sIn.mx ? p->sIn.z[p->sIn.i] : 0;
  5886  }
  5887  
  5888  /* Compile RE text into a sequence of opcodes.  Continue up to the
  5889  ** first unmatched ")" character, then return.  If an error is found,
  5890  ** return a pointer to the error message string.
  5891  */
  5892  static const char *re_subcompile_re(ReCompiled *p){
  5893    const char *zErr;
  5894    int iStart, iEnd, iGoto;
  5895    iStart = p->nState;
  5896    zErr = re_subcompile_string(p);
  5897    if( zErr ) return zErr;
  5898    while( rePeek(p)=='|' ){
  5899      iEnd = p->nState;
  5900      re_insert(p, iStart, RE_OP_FORK, iEnd + 2 - iStart);
  5901      iGoto = re_append(p, RE_OP_GOTO, 0);
  5902      p->sIn.i++;
  5903      zErr = re_subcompile_string(p);
  5904      if( zErr ) return zErr;
  5905      p->aArg[iGoto] = p->nState - iGoto;
  5906    }
  5907    return 0;
  5908  }
  5909  
  5910  /* Compile an element of regular expression text (anything that can be
  5911  ** an operand to the "|" operator).  Return NULL on success or a pointer
  5912  ** to the error message if there is a problem.
  5913  */
  5914  static const char *re_subcompile_string(ReCompiled *p){
  5915    int iPrev = -1;
  5916    int iStart;
  5917    unsigned c;
  5918    const char *zErr;
  5919    while( (c = p->xNextChar(&p->sIn))!=0 ){
  5920      iStart = p->nState;
  5921      switch( c ){
  5922        case '|':
  5923        case ')': {
  5924          p->sIn.i--;
  5925          return 0;
  5926        }
  5927        case '(': {
  5928          zErr = re_subcompile_re(p);
  5929          if( zErr ) return zErr;
  5930          if( rePeek(p)!=')' ) return "unmatched '('";
  5931          p->sIn.i++;
  5932          break;
  5933        }
  5934        case '.': {
  5935          if( rePeek(p)=='*' ){
  5936            re_append(p, RE_OP_ANYSTAR, 0);
  5937            p->sIn.i++;
  5938          }else{
  5939            re_append(p, RE_OP_ANY, 0);
  5940          }
  5941          break;
  5942        }
  5943        case '*': {
  5944          if( iPrev<0 ) return "'*' without operand";
  5945          re_insert(p, iPrev, RE_OP_GOTO, p->nState - iPrev + 1);
  5946          re_append(p, RE_OP_FORK, iPrev - p->nState + 1);
  5947          break;
  5948        }
  5949        case '+': {
  5950          if( iPrev<0 ) return "'+' without operand";
  5951          re_append(p, RE_OP_FORK, iPrev - p->nState);
  5952          break;
  5953        }
  5954        case '?': {
  5955          if( iPrev<0 ) return "'?' without operand";
  5956          re_insert(p, iPrev, RE_OP_FORK, p->nState - iPrev+1);
  5957          break;
  5958        }
  5959        case '$': {
  5960          re_append(p, RE_OP_MATCH, RE_EOF);
  5961          break;
  5962        }
  5963        case '^': {
  5964          re_append(p, RE_OP_ATSTART, 0);
  5965          break;
  5966        }
  5967        case '{': {
  5968          int m = 0, n = 0;
  5969          int sz, j;
  5970          if( iPrev<0 ) return "'{m,n}' without operand";
  5971          while( (c=rePeek(p))>='0' && c<='9' ){ m = m*10 + c - '0'; p->sIn.i++; }
  5972          n = m;
  5973          if( c==',' ){
  5974            p->sIn.i++;
  5975            n = 0;
  5976            while( (c=rePeek(p))>='0' && c<='9' ){ n = n*10 + c-'0'; p->sIn.i++; }
  5977          }
  5978          if( c!='}' ) return "unmatched '{'";
  5979          if( n>0 && n<m ) return "n less than m in '{m,n}'";
  5980          p->sIn.i++;
  5981          sz = p->nState - iPrev;
  5982          if( m==0 ){
  5983            if( n==0 ) return "both m and n are zero in '{m,n}'";
  5984            re_insert(p, iPrev, RE_OP_FORK, sz+1);
  5985            iPrev++;
  5986            n--;
  5987          }else{
  5988            for(j=1; j<m; j++) re_copy(p, iPrev, sz);
  5989          }
  5990          for(j=m; j<n; j++){
  5991            re_append(p, RE_OP_FORK, sz+1);
  5992            re_copy(p, iPrev, sz);
  5993          }
  5994          if( n==0 && m>0 ){
  5995            re_append(p, RE_OP_FORK, -sz);
  5996          }
  5997          break;
  5998        }
  5999        case '[': {
  6000          unsigned int iFirst = p->nState;
  6001          if( rePeek(p)=='^' ){
  6002            re_append(p, RE_OP_CC_EXC, 0);
  6003            p->sIn.i++;
  6004          }else{
  6005            re_append(p, RE_OP_CC_INC, 0);
  6006          }
  6007          while( (c = p->xNextChar(&p->sIn))!=0 ){
  6008            if( c=='[' && rePeek(p)==':' ){
  6009              return "POSIX character classes not supported";
  6010            }
  6011            if( c=='\\' ) c = re_esc_char(p);
  6012            if( rePeek(p)=='-' ){
  6013              re_append(p, RE_OP_CC_RANGE, c);
  6014              p->sIn.i++;
  6015              c = p->xNextChar(&p->sIn);
  6016              if( c=='\\' ) c = re_esc_char(p);
  6017              re_append(p, RE_OP_CC_RANGE, c);
  6018            }else{
  6019              re_append(p, RE_OP_CC_VALUE, c);
  6020            }
  6021            if( rePeek(p)==']' ){ p->sIn.i++; break; }
  6022          }
  6023          if( c==0 ) return "unclosed '['";
  6024          if( p->nState>iFirst ) p->aArg[iFirst] = p->nState - iFirst;
  6025          break;
  6026        }
  6027        case '\\': {
  6028          int specialOp = 0;
  6029          switch( rePeek(p) ){
  6030            case 'b': specialOp = RE_OP_BOUNDARY;   break;
  6031            case 'd': specialOp = RE_OP_DIGIT;      break;
  6032            case 'D': specialOp = RE_OP_NOTDIGIT;   break;
  6033            case 's': specialOp = RE_OP_SPACE;      break;
  6034            case 'S': specialOp = RE_OP_NOTSPACE;   break;
  6035            case 'w': specialOp = RE_OP_WORD;       break;
  6036            case 'W': specialOp = RE_OP_NOTWORD;    break;
  6037          }
  6038          if( specialOp ){
  6039            p->sIn.i++;
  6040            re_append(p, specialOp, 0);
  6041          }else{
  6042            c = re_esc_char(p);
  6043            re_append(p, RE_OP_MATCH, c);
  6044          }
  6045          break;
  6046        }
  6047        default: {
  6048          re_append(p, RE_OP_MATCH, c);
  6049          break;
  6050        }
  6051      }
  6052      iPrev = iStart;
  6053    }
  6054    return 0;
  6055  }
  6056  
  6057  /* Free and reclaim all the memory used by a previously compiled
  6058  ** regular expression.  Applications should invoke this routine once
  6059  ** for every call to re_compile() to avoid memory leaks.
  6060  */
  6061  static void re_free(ReCompiled *pRe){
  6062    if( pRe ){
  6063      sqlite3_free(pRe->aOp);
  6064      sqlite3_free(pRe->aArg);
  6065      sqlite3_free(pRe);
  6066    }
  6067  }
  6068  
  6069  /*
  6070  ** Compile a textual regular expression in zIn[] into a compiled regular
  6071  ** expression suitable for us by re_match() and return a pointer to the
  6072  ** compiled regular expression in *ppRe.  Return NULL on success or an
  6073  ** error message if something goes wrong.
  6074  */
  6075  static const char *re_compile(ReCompiled **ppRe, const char *zIn, int noCase){
  6076    ReCompiled *pRe;
  6077    const char *zErr;
  6078    int i, j;
  6079  
  6080    *ppRe = 0;
  6081    pRe = sqlite3_malloc( sizeof(*pRe) );
  6082    if( pRe==0 ){
  6083      return "out of memory";
  6084    }
  6085    memset(pRe, 0, sizeof(*pRe));
  6086    pRe->xNextChar = noCase ? re_next_char_nocase : re_next_char;
  6087    if( re_resize(pRe, 30) ){
  6088      re_free(pRe);
  6089      return "out of memory";
  6090    }
  6091    if( zIn[0]=='^' ){
  6092      zIn++;
  6093    }else{
  6094      re_append(pRe, RE_OP_ANYSTAR, 0);
  6095    }
  6096    pRe->sIn.z = (unsigned char*)zIn;
  6097    pRe->sIn.i = 0;
  6098    pRe->sIn.mx = (int)strlen(zIn);
  6099    zErr = re_subcompile_re(pRe);
  6100    if( zErr ){
  6101      re_free(pRe);
  6102      return zErr;
  6103    }
  6104    if( pRe->sIn.i>=pRe->sIn.mx ){
  6105      re_append(pRe, RE_OP_ACCEPT, 0);
  6106      *ppRe = pRe;
  6107    }else{
  6108      re_free(pRe);
  6109      return "unrecognized character";
  6110    }
  6111  
  6112    /* The following is a performance optimization.  If the regex begins with
  6113    ** ".*" (if the input regex lacks an initial "^") and afterwards there are
  6114    ** one or more matching characters, enter those matching characters into
  6115    ** zInit[].  The re_match() routine can then search ahead in the input 
  6116    ** string looking for the initial match without having to run the whole
  6117    ** regex engine over the string.  Do not worry about trying to match
  6118    ** unicode characters beyond plane 0 - those are very rare and this is
  6119    ** just an optimization. */
  6120    if( pRe->aOp[0]==RE_OP_ANYSTAR && !noCase ){
  6121      for(j=0, i=1; j<(int)sizeof(pRe->zInit)-2 && pRe->aOp[i]==RE_OP_MATCH; i++){
  6122        unsigned x = pRe->aArg[i];
  6123        if( x<=0x7f ){
  6124          pRe->zInit[j++] = (unsigned char)x;
  6125        }else if( x<=0x7ff ){
  6126          pRe->zInit[j++] = (unsigned char)(0xc0 | (x>>6));
  6127          pRe->zInit[j++] = 0x80 | (x&0x3f);
  6128        }else if( x<=0xffff ){
  6129          pRe->zInit[j++] = (unsigned char)(0xe0 | (x>>12));
  6130          pRe->zInit[j++] = 0x80 | ((x>>6)&0x3f);
  6131          pRe->zInit[j++] = 0x80 | (x&0x3f);
  6132        }else{
  6133          break;
  6134        }
  6135      }
  6136      if( j>0 && pRe->zInit[j-1]==0 ) j--;
  6137      pRe->nInit = j;
  6138    }
  6139    return pRe->zErr;
  6140  }
  6141  
  6142  /*
  6143  ** Implementation of the regexp() SQL function.  This function implements
  6144  ** the build-in REGEXP operator.  The first argument to the function is the
  6145  ** pattern and the second argument is the string.  So, the SQL statements:
  6146  **
  6147  **       A REGEXP B
  6148  **
  6149  ** is implemented as regexp(B,A).
  6150  */
  6151  static void re_sql_func(
  6152    sqlite3_context *context,
  6153    int argc,
  6154    sqlite3_value **argv
  6155  ){
  6156    ReCompiled *pRe;          /* Compiled regular expression */
  6157    const char *zPattern;     /* The regular expression */
  6158    const unsigned char *zStr;/* String being searched */
  6159    const char *zErr;         /* Compile error message */
  6160    int setAux = 0;           /* True to invoke sqlite3_set_auxdata() */
  6161  
  6162    (void)argc;  /* Unused */
  6163    pRe = sqlite3_get_auxdata(context, 0);
  6164    if( pRe==0 ){
  6165      zPattern = (const char*)sqlite3_value_text(argv[0]);
  6166      if( zPattern==0 ) return;
  6167      zErr = re_compile(&pRe, zPattern, sqlite3_user_data(context)!=0);
  6168      if( zErr ){
  6169        re_free(pRe);
  6170        sqlite3_result_error(context, zErr, -1);
  6171        return;
  6172      }
  6173      if( pRe==0 ){
  6174        sqlite3_result_error_nomem(context);
  6175        return;
  6176      }
  6177      setAux = 1;
  6178    }
  6179    zStr = (const unsigned char*)sqlite3_value_text(argv[1]);
  6180    if( zStr!=0 ){
  6181      sqlite3_result_int(context, re_match(pRe, zStr, -1));
  6182    }
  6183    if( setAux ){
  6184      sqlite3_set_auxdata(context, 0, pRe, (void(*)(void*))re_free);
  6185    }
  6186  }
  6187  
  6188  #if defined(SQLITE_DEBUG)
  6189  /*
  6190  ** This function is used for testing and debugging only.  It is only available
  6191  ** if the SQLITE_DEBUG compile-time option is used.
  6192  **
  6193  ** Compile a regular expression and then convert the compiled expression into
  6194  ** text and return that text.
  6195  */
  6196  static void re_bytecode_func(
  6197    sqlite3_context *context,
  6198    int argc,
  6199    sqlite3_value **argv
  6200  ){
  6201    const char *zPattern;
  6202    const char *zErr;
  6203    ReCompiled *pRe;
  6204    sqlite3_str *pStr;
  6205    int i;
  6206    int n;
  6207    char *z;
  6208    (void)argc;
  6209  
  6210    zPattern = (const char*)sqlite3_value_text(argv[0]);
  6211    if( zPattern==0 ) return;
  6212    zErr = re_compile(&pRe, zPattern, sqlite3_user_data(context)!=0);
  6213    if( zErr ){
  6214      re_free(pRe);
  6215      sqlite3_result_error(context, zErr, -1);
  6216      return;
  6217    }
  6218    if( pRe==0 ){
  6219      sqlite3_result_error_nomem(context);
  6220      return;
  6221    }
  6222    pStr = sqlite3_str_new(0);
  6223    if( pStr==0 ) goto re_bytecode_func_err;
  6224    if( pRe->nInit>0 ){
  6225      sqlite3_str_appendf(pStr, "INIT     ");
  6226      for(i=0; i<pRe->nInit; i++){
  6227        sqlite3_str_appendf(pStr, "%02x", pRe->zInit[i]);
  6228      }
  6229      sqlite3_str_appendf(pStr, "\n");
  6230    }
  6231    for(i=0; (unsigned)i<pRe->nState; i++){
  6232      sqlite3_str_appendf(pStr, "%-8s %4d\n",
  6233           ReOpName[(unsigned char)pRe->aOp[i]], pRe->aArg[i]);
  6234    }
  6235    n = sqlite3_str_length(pStr);
  6236    z = sqlite3_str_finish(pStr);
  6237    if( n==0 ){
  6238      sqlite3_free(z);
  6239    }else{
  6240      sqlite3_result_text(context, z, n-1, sqlite3_free);
  6241    }
  6242  
  6243  re_bytecode_func_err:
  6244    re_free(pRe);
  6245  }
  6246  
  6247  #endif /* SQLITE_DEBUG */
  6248  
  6249  
  6250  /*
  6251  ** Invoke this routine to register the regexp() function with the
  6252  ** SQLite database connection.
  6253  */
  6254  #ifdef _WIN32
  6255  
  6256  #endif
  6257  int sqlite3_regexp_init(
  6258    sqlite3 *db, 
  6259    char **pzErrMsg, 
  6260    const sqlite3_api_routines *pApi
  6261  ){
  6262    int rc = SQLITE_OK;
  6263    SQLITE_EXTENSION_INIT2(pApi);
  6264    (void)pzErrMsg;  /* Unused */
  6265    rc = sqlite3_create_function(db, "regexp", 2, 
  6266                              SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC,
  6267                              0, re_sql_func, 0, 0);
  6268    if( rc==SQLITE_OK ){
  6269      /* The regexpi(PATTERN,STRING) function is a case-insensitive version
  6270      ** of regexp(PATTERN,STRING). */
  6271      rc = sqlite3_create_function(db, "regexpi", 2,
  6272                              SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC,
  6273                              (void*)db, re_sql_func, 0, 0);
  6274  #if defined(SQLITE_DEBUG)
  6275      if( rc==SQLITE_OK ){
  6276        rc = sqlite3_create_function(db, "regexp_bytecode", 1,
  6277                              SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC,
  6278                              0, re_bytecode_func, 0, 0);
  6279      }
  6280  #endif /* SQLITE_DEBUG */
  6281    }
  6282    return rc;
  6283  }
  6284  
  6285  /************************* End ../ext/misc/regexp.c ********************/
  6286  #ifndef SQLITE_SHELL_FIDDLE
  6287  /************************* Begin ../ext/misc/fileio.c ******************/
  6288  /*
  6289  ** 2014-06-13
  6290  **
  6291  ** The author disclaims copyright to this source code.  In place of
  6292  ** a legal notice, here is a blessing:
  6293  **
  6294  **    May you do good and not evil.
  6295  **    May you find forgiveness for yourself and forgive others.
  6296  **    May you share freely, never taking more than you give.
  6297  **
  6298  ******************************************************************************
  6299  **
  6300  ** This SQLite extension implements SQL functions readfile() and
  6301  ** writefile(), and eponymous virtual type "fsdir".
  6302  **
  6303  ** WRITEFILE(FILE, DATA [, MODE [, MTIME]]):
  6304  **
  6305  **   If neither of the optional arguments is present, then this UDF
  6306  **   function writes blob DATA to file FILE. If successful, the number
  6307  **   of bytes written is returned. If an error occurs, NULL is returned.
  6308  **
  6309  **   If the first option argument - MODE - is present, then it must
  6310  **   be passed an integer value that corresponds to a POSIX mode
  6311  **   value (file type + permissions, as returned in the stat.st_mode
  6312  **   field by the stat() system call). Three types of files may
  6313  **   be written/created:
  6314  **
  6315  **     regular files:  (mode & 0170000)==0100000
  6316  **     symbolic links: (mode & 0170000)==0120000
  6317  **     directories:    (mode & 0170000)==0040000
  6318  **
  6319  **   For a directory, the DATA is ignored. For a symbolic link, it is
  6320  **   interpreted as text and used as the target of the link. For a
  6321  **   regular file, it is interpreted as a blob and written into the
  6322  **   named file. Regardless of the type of file, its permissions are
  6323  **   set to (mode & 0777) before returning.
  6324  **
  6325  **   If the optional MTIME argument is present, then it is interpreted
  6326  **   as an integer - the number of seconds since the unix epoch. The
  6327  **   modification-time of the target file is set to this value before
  6328  **   returning.
  6329  **
  6330  **   If three or more arguments are passed to this function and an
  6331  **   error is encountered, an exception is raised.
  6332  **
  6333  ** READFILE(FILE):
  6334  **
  6335  **   Read and return the contents of file FILE (type blob) from disk.
  6336  **
  6337  ** FSDIR:
  6338  **
  6339  **   Used as follows:
  6340  **
  6341  **     SELECT * FROM fsdir($path [, $dir]);
  6342  **
  6343  **   Parameter $path is an absolute or relative pathname. If the file that it
  6344  **   refers to does not exist, it is an error. If the path refers to a regular
  6345  **   file or symbolic link, it returns a single row. Or, if the path refers
  6346  **   to a directory, it returns one row for the directory, and one row for each
  6347  **   file within the hierarchy rooted at $path.
  6348  **
  6349  **   Each row has the following columns:
  6350  **
  6351  **     name:  Path to file or directory (text value).
  6352  **     mode:  Value of stat.st_mode for directory entry (an integer).
  6353  **     mtime: Value of stat.st_mtime for directory entry (an integer).
  6354  **     data:  For a regular file, a blob containing the file data. For a
  6355  **            symlink, a text value containing the text of the link. For a
  6356  **            directory, NULL.
  6357  **
  6358  **   If a non-NULL value is specified for the optional $dir parameter and
  6359  **   $path is a relative path, then $path is interpreted relative to $dir. 
  6360  **   And the paths returned in the "name" column of the table are also 
  6361  **   relative to directory $dir.
  6362  **
  6363  ** Notes on building this extension for Windows:
  6364  **   Unless linked statically with the SQLite library, a preprocessor
  6365  **   symbol, FILEIO_WIN32_DLL, must be #define'd to create a stand-alone
  6366  **   DLL form of this extension for WIN32. See its use below for details.
  6367  */
  6368  /* #include "sqlite3ext.h" */
  6369  SQLITE_EXTENSION_INIT1
  6370  #include <stdio.h>
  6371  #include <string.h>
  6372  #include <assert.h>
  6373  
  6374  #include <sys/types.h>
  6375  #include <sys/stat.h>
  6376  #include <fcntl.h>
  6377  #if !defined(_WIN32) && !defined(WIN32)
  6378  #  include <unistd.h>
  6379  #  include <dirent.h>
  6380  #  include <utime.h>
  6381  #  include <sys/time.h>
  6382  #else
  6383  #  include "windows.h"
  6384  #  include <io.h>
  6385  #  include <direct.h>
  6386  /* #  include "test_windirent.h" */
  6387  #  define dirent DIRENT
  6388  #  ifndef chmod
  6389  #    define chmod _chmod
  6390  #  endif
  6391  #  ifndef stat
  6392  #    define stat _stat
  6393  #  endif
  6394  #  define mkdir(path,mode) _mkdir(path)
  6395  #  define lstat(path,buf) stat(path,buf)
  6396  #endif
  6397  #include <time.h>
  6398  #include <errno.h>
  6399  
  6400  
  6401  /*
  6402  ** Structure of the fsdir() table-valued function
  6403  */
  6404                   /*    0    1    2     3    4           5             */
  6405  #define FSDIR_SCHEMA "(name,mode,mtime,data,path HIDDEN,dir HIDDEN)"
  6406  #define FSDIR_COLUMN_NAME     0     /* Name of the file */
  6407  #define FSDIR_COLUMN_MODE     1     /* Access mode */
  6408  #define FSDIR_COLUMN_MTIME    2     /* Last modification time */
  6409  #define FSDIR_COLUMN_DATA     3     /* File content */
  6410  #define FSDIR_COLUMN_PATH     4     /* Path to top of search */
  6411  #define FSDIR_COLUMN_DIR      5     /* Path is relative to this directory */
  6412  
  6413  
  6414  /*
  6415  ** Set the result stored by context ctx to a blob containing the 
  6416  ** contents of file zName.  Or, leave the result unchanged (NULL)
  6417  ** if the file does not exist or is unreadable.
  6418  **
  6419  ** If the file exceeds the SQLite blob size limit, through an
  6420  ** SQLITE_TOOBIG error.
  6421  **
  6422  ** Throw an SQLITE_IOERR if there are difficulties pulling the file
  6423  ** off of disk.
  6424  */
  6425  static void readFileContents(sqlite3_context *ctx, const char *zName){
  6426    FILE *in;
  6427    sqlite3_int64 nIn;
  6428    void *pBuf;
  6429    sqlite3 *db;
  6430    int mxBlob;
  6431  
  6432    in = fopen(zName, "rb");
  6433    if( in==0 ){
  6434      /* File does not exist or is unreadable. Leave the result set to NULL. */
  6435      return;
  6436    }
  6437    fseek(in, 0, SEEK_END);
  6438    nIn = ftell(in);
  6439    rewind(in);
  6440    db = sqlite3_context_db_handle(ctx);
  6441    mxBlob = sqlite3_limit(db, SQLITE_LIMIT_LENGTH, -1);
  6442    if( nIn>mxBlob ){
  6443      sqlite3_result_error_code(ctx, SQLITE_TOOBIG);
  6444      fclose(in);
  6445      return;
  6446    }
  6447    pBuf = sqlite3_malloc64( nIn ? nIn : 1 );
  6448    if( pBuf==0 ){
  6449      sqlite3_result_error_nomem(ctx);
  6450      fclose(in);
  6451      return;
  6452    }
  6453    if( nIn==(sqlite3_int64)fread(pBuf, 1, (size_t)nIn, in) ){
  6454      sqlite3_result_blob64(ctx, pBuf, nIn, sqlite3_free);
  6455    }else{
  6456      sqlite3_result_error_code(ctx, SQLITE_IOERR);
  6457      sqlite3_free(pBuf);
  6458    }
  6459    fclose(in);
  6460  }
  6461  
  6462  /*
  6463  ** Implementation of the "readfile(X)" SQL function.  The entire content
  6464  ** of the file named X is read and returned as a BLOB.  NULL is returned
  6465  ** if the file does not exist or is unreadable.
  6466  */
  6467  static void readfileFunc(
  6468    sqlite3_context *context,
  6469    int argc,
  6470    sqlite3_value **argv
  6471  ){
  6472    const char *zName;
  6473    (void)(argc);  /* Unused parameter */
  6474    zName = (const char*)sqlite3_value_text(argv[0]);
  6475    if( zName==0 ) return;
  6476    readFileContents(context, zName);
  6477  }
  6478  
  6479  /*
  6480  ** Set the error message contained in context ctx to the results of
  6481  ** vprintf(zFmt, ...).
  6482  */
  6483  static void ctxErrorMsg(sqlite3_context *ctx, const char *zFmt, ...){
  6484    char *zMsg = 0;
  6485    va_list ap;
  6486    va_start(ap, zFmt);
  6487    zMsg = sqlite3_vmprintf(zFmt, ap);
  6488    sqlite3_result_error(ctx, zMsg, -1);
  6489    sqlite3_free(zMsg);
  6490    va_end(ap);
  6491  }
  6492  
  6493  #if defined(_WIN32)
  6494  /*
  6495  ** This function is designed to convert a Win32 FILETIME structure into the
  6496  ** number of seconds since the Unix Epoch (1970-01-01 00:00:00 UTC).
  6497  */
  6498  static sqlite3_uint64 fileTimeToUnixTime(
  6499    LPFILETIME pFileTime
  6500  ){
  6501    SYSTEMTIME epochSystemTime;
  6502    ULARGE_INTEGER epochIntervals;
  6503    FILETIME epochFileTime;
  6504    ULARGE_INTEGER fileIntervals;
  6505  
  6506    memset(&epochSystemTime, 0, sizeof(SYSTEMTIME));
  6507    epochSystemTime.wYear = 1970;
  6508    epochSystemTime.wMonth = 1;
  6509    epochSystemTime.wDay = 1;
  6510    SystemTimeToFileTime(&epochSystemTime, &epochFileTime);
  6511    epochIntervals.LowPart = epochFileTime.dwLowDateTime;
  6512    epochIntervals.HighPart = epochFileTime.dwHighDateTime;
  6513  
  6514    fileIntervals.LowPart = pFileTime->dwLowDateTime;
  6515    fileIntervals.HighPart = pFileTime->dwHighDateTime;
  6516  
  6517    return (fileIntervals.QuadPart - epochIntervals.QuadPart) / 10000000;
  6518  }
  6519  
  6520  
  6521  #if defined(FILEIO_WIN32_DLL) && (defined(_WIN32) || defined(WIN32))
  6522  #  /* To allow a standalone DLL, use this next replacement function: */
  6523  #  undef sqlite3_win32_utf8_to_unicode
  6524  #  define sqlite3_win32_utf8_to_unicode utf8_to_utf16
  6525  #
  6526  LPWSTR utf8_to_utf16(const char *z){
  6527    int nAllot = MultiByteToWideChar(CP_UTF8, 0, z, -1, NULL, 0);
  6528    LPWSTR rv = sqlite3_malloc(nAllot * sizeof(WCHAR));
  6529    if( rv!=0 && 0 < MultiByteToWideChar(CP_UTF8, 0, z, -1, rv, nAllot) )
  6530      return rv;
  6531    sqlite3_free(rv);
  6532    return 0;
  6533  }
  6534  #endif
  6535  
  6536  /*
  6537  ** This function attempts to normalize the time values found in the stat()
  6538  ** buffer to UTC.  This is necessary on Win32, where the runtime library
  6539  ** appears to return these values as local times.
  6540  */
  6541  static void statTimesToUtc(
  6542    const char *zPath,
  6543    struct stat *pStatBuf
  6544  ){
  6545    HANDLE hFindFile;
  6546    WIN32_FIND_DATAW fd;
  6547    LPWSTR zUnicodeName;
  6548    extern LPWSTR sqlite3_win32_utf8_to_unicode(const char*);
  6549    zUnicodeName = sqlite3_win32_utf8_to_unicode(zPath);
  6550    if( zUnicodeName ){
  6551      memset(&fd, 0, sizeof(WIN32_FIND_DATAW));
  6552      hFindFile = FindFirstFileW(zUnicodeName, &fd);
  6553      if( hFindFile!=NULL ){
  6554        pStatBuf->st_ctime = (time_t)fileTimeToUnixTime(&fd.ftCreationTime);
  6555        pStatBuf->st_atime = (time_t)fileTimeToUnixTime(&fd.ftLastAccessTime);
  6556        pStatBuf->st_mtime = (time_t)fileTimeToUnixTime(&fd.ftLastWriteTime);
  6557        FindClose(hFindFile);
  6558      }
  6559      sqlite3_free(zUnicodeName);
  6560    }
  6561  }
  6562  #endif
  6563  
  6564  /*
  6565  ** This function is used in place of stat().  On Windows, special handling
  6566  ** is required in order for the included time to be returned as UTC.  On all
  6567  ** other systems, this function simply calls stat().
  6568  */
  6569  static int fileStat(
  6570    const char *zPath,
  6571    struct stat *pStatBuf
  6572  ){
  6573  #if defined(_WIN32)
  6574    int rc = stat(zPath, pStatBuf);
  6575    if( rc==0 ) statTimesToUtc(zPath, pStatBuf);
  6576    return rc;
  6577  #else
  6578    return stat(zPath, pStatBuf);
  6579  #endif
  6580  }
  6581  
  6582  /*
  6583  ** This function is used in place of lstat().  On Windows, special handling
  6584  ** is required in order for the included time to be returned as UTC.  On all
  6585  ** other systems, this function simply calls lstat().
  6586  */
  6587  static int fileLinkStat(
  6588    const char *zPath,
  6589    struct stat *pStatBuf
  6590  ){
  6591  #if defined(_WIN32)
  6592    int rc = lstat(zPath, pStatBuf);
  6593    if( rc==0 ) statTimesToUtc(zPath, pStatBuf);
  6594    return rc;
  6595  #else
  6596    return lstat(zPath, pStatBuf);
  6597  #endif
  6598  }
  6599  
  6600  /*
  6601  ** Argument zFile is the name of a file that will be created and/or written
  6602  ** by SQL function writefile(). This function ensures that the directory
  6603  ** zFile will be written to exists, creating it if required. The permissions
  6604  ** for any path components created by this function are set in accordance
  6605  ** with the current umask.
  6606  **
  6607  ** If an OOM condition is encountered, SQLITE_NOMEM is returned. Otherwise,
  6608  ** SQLITE_OK is returned if the directory is successfully created, or
  6609  ** SQLITE_ERROR otherwise.
  6610  */
  6611  static int makeDirectory(
  6612    const char *zFile
  6613  ){
  6614    char *zCopy = sqlite3_mprintf("%s", zFile);
  6615    int rc = SQLITE_OK;
  6616  
  6617    if( zCopy==0 ){
  6618      rc = SQLITE_NOMEM;
  6619    }else{
  6620      int nCopy = (int)strlen(zCopy);
  6621      int i = 1;
  6622  
  6623      while( rc==SQLITE_OK ){
  6624        struct stat sStat;
  6625        int rc2;
  6626  
  6627        for(; zCopy[i]!='/' && i<nCopy; i++);
  6628        if( i==nCopy ) break;
  6629        zCopy[i] = '\0';
  6630  
  6631        rc2 = fileStat(zCopy, &sStat);
  6632        if( rc2!=0 ){
  6633          if( mkdir(zCopy, 0777) ) rc = SQLITE_ERROR;
  6634        }else{
  6635          if( !S_ISDIR(sStat.st_mode) ) rc = SQLITE_ERROR;
  6636        }
  6637        zCopy[i] = '/';
  6638        i++;
  6639      }
  6640  
  6641      sqlite3_free(zCopy);
  6642    }
  6643  
  6644    return rc;
  6645  }
  6646  
  6647  /*
  6648  ** This function does the work for the writefile() UDF. Refer to 
  6649  ** header comments at the top of this file for details.
  6650  */
  6651  static int writeFile(
  6652    sqlite3_context *pCtx,          /* Context to return bytes written in */
  6653    const char *zFile,              /* File to write */
  6654    sqlite3_value *pData,           /* Data to write */
  6655    mode_t mode,                    /* MODE parameter passed to writefile() */
  6656    sqlite3_int64 mtime             /* MTIME parameter (or -1 to not set time) */
  6657  ){
  6658    if( zFile==0 ) return 1;
  6659  #if !defined(_WIN32) && !defined(WIN32)
  6660    if( S_ISLNK(mode) ){
  6661      const char *zTo = (const char*)sqlite3_value_text(pData);
  6662      if( zTo==0 || symlink(zTo, zFile)<0 ) return 1;
  6663    }else
  6664  #endif
  6665    {
  6666      if( S_ISDIR(mode) ){
  6667        if( mkdir(zFile, mode) ){
  6668          /* The mkdir() call to create the directory failed. This might not
  6669          ** be an error though - if there is already a directory at the same
  6670          ** path and either the permissions already match or can be changed
  6671          ** to do so using chmod(), it is not an error.  */
  6672          struct stat sStat;
  6673          if( errno!=EEXIST
  6674           || 0!=fileStat(zFile, &sStat)
  6675           || !S_ISDIR(sStat.st_mode)
  6676           || ((sStat.st_mode&0777)!=(mode&0777) && 0!=chmod(zFile, mode&0777))
  6677          ){
  6678            return 1;
  6679          }
  6680        }
  6681      }else{
  6682        sqlite3_int64 nWrite = 0;
  6683        const char *z;
  6684        int rc = 0;
  6685        FILE *out = fopen(zFile, "wb");
  6686        if( out==0 ) return 1;
  6687        z = (const char*)sqlite3_value_blob(pData);
  6688        if( z ){
  6689          sqlite3_int64 n = fwrite(z, 1, sqlite3_value_bytes(pData), out);
  6690          nWrite = sqlite3_value_bytes(pData);
  6691          if( nWrite!=n ){
  6692            rc = 1;
  6693          }
  6694        }
  6695        fclose(out);
  6696        if( rc==0 && mode && chmod(zFile, mode & 0777) ){
  6697          rc = 1;
  6698        }
  6699        if( rc ) return 2;
  6700        sqlite3_result_int64(pCtx, nWrite);
  6701      }
  6702    }
  6703  
  6704    if( mtime>=0 ){
  6705  #if defined(_WIN32)
  6706  #if !SQLITE_OS_WINRT
  6707      /* Windows */
  6708      FILETIME lastAccess;
  6709      FILETIME lastWrite;
  6710      SYSTEMTIME currentTime;
  6711      LONGLONG intervals;
  6712      HANDLE hFile;
  6713      LPWSTR zUnicodeName;
  6714      extern LPWSTR sqlite3_win32_utf8_to_unicode(const char*);
  6715  
  6716      GetSystemTime(&currentTime);
  6717      SystemTimeToFileTime(&currentTime, &lastAccess);
  6718      intervals = Int32x32To64(mtime, 10000000) + 116444736000000000;
  6719      lastWrite.dwLowDateTime = (DWORD)intervals;
  6720      lastWrite.dwHighDateTime = intervals >> 32;
  6721      zUnicodeName = sqlite3_win32_utf8_to_unicode(zFile);
  6722      if( zUnicodeName==0 ){
  6723        return 1;
  6724      }
  6725      hFile = CreateFileW(
  6726        zUnicodeName, FILE_WRITE_ATTRIBUTES, 0, NULL, OPEN_EXISTING,
  6727        FILE_FLAG_BACKUP_SEMANTICS, NULL
  6728      );
  6729      sqlite3_free(zUnicodeName);
  6730      if( hFile!=INVALID_HANDLE_VALUE ){
  6731        BOOL bResult = SetFileTime(hFile, NULL, &lastAccess, &lastWrite);
  6732        CloseHandle(hFile);
  6733        return !bResult;
  6734      }else{
  6735        return 1;
  6736      }
  6737  #endif
  6738  #elif defined(AT_FDCWD) && 0 /* utimensat() is not universally available */
  6739      /* Recent unix */
  6740      struct timespec times[2];
  6741      times[0].tv_nsec = times[1].tv_nsec = 0;
  6742      times[0].tv_sec = time(0);
  6743      times[1].tv_sec = mtime;
  6744      if( utimensat(AT_FDCWD, zFile, times, AT_SYMLINK_NOFOLLOW) ){
  6745        return 1;
  6746      }
  6747  #else
  6748      /* Legacy unix */
  6749      struct timeval times[2];
  6750      times[0].tv_usec = times[1].tv_usec = 0;
  6751      times[0].tv_sec = time(0);
  6752      times[1].tv_sec = mtime;
  6753      if( utimes(zFile, times) ){
  6754        return 1;
  6755      }
  6756  #endif
  6757    }
  6758  
  6759    return 0;
  6760  }
  6761  
  6762  /*
  6763  ** Implementation of the "writefile(W,X[,Y[,Z]]])" SQL function.  
  6764  ** Refer to header comments at the top of this file for details.
  6765  */
  6766  static void writefileFunc(
  6767    sqlite3_context *context,
  6768    int argc,
  6769    sqlite3_value **argv
  6770  ){
  6771    const char *zFile;
  6772    mode_t mode = 0;
  6773    int res;
  6774    sqlite3_int64 mtime = -1;
  6775  
  6776    if( argc<2 || argc>4 ){
  6777      sqlite3_result_error(context, 
  6778          "wrong number of arguments to function writefile()", -1
  6779      );
  6780      return;
  6781    }
  6782  
  6783    zFile = (const char*)sqlite3_value_text(argv[0]);
  6784    if( zFile==0 ) return;
  6785    if( argc>=3 ){
  6786      mode = (mode_t)sqlite3_value_int(argv[2]);
  6787    }
  6788    if( argc==4 ){
  6789      mtime = sqlite3_value_int64(argv[3]);
  6790    }
  6791  
  6792    res = writeFile(context, zFile, argv[1], mode, mtime);
  6793    if( res==1 && errno==ENOENT ){
  6794      if( makeDirectory(zFile)==SQLITE_OK ){
  6795        res = writeFile(context, zFile, argv[1], mode, mtime);
  6796      }
  6797    }
  6798  
  6799    if( argc>2 && res!=0 ){
  6800      if( S_ISLNK(mode) ){
  6801        ctxErrorMsg(context, "failed to create symlink: %s", zFile);
  6802      }else if( S_ISDIR(mode) ){
  6803        ctxErrorMsg(context, "failed to create directory: %s", zFile);
  6804      }else{
  6805        ctxErrorMsg(context, "failed to write file: %s", zFile);
  6806      }
  6807    }
  6808  }
  6809  
  6810  /*
  6811  ** SQL function:   lsmode(MODE)
  6812  **
  6813  ** Given a numberic st_mode from stat(), convert it into a human-readable
  6814  ** text string in the style of "ls -l".
  6815  */
  6816  static void lsModeFunc(
  6817    sqlite3_context *context,
  6818    int argc,
  6819    sqlite3_value **argv
  6820  ){
  6821    int i;
  6822    int iMode = sqlite3_value_int(argv[0]);
  6823    char z[16];
  6824    (void)argc;
  6825    if( S_ISLNK(iMode) ){
  6826      z[0] = 'l';
  6827    }else if( S_ISREG(iMode) ){
  6828      z[0] = '-';
  6829    }else if( S_ISDIR(iMode) ){
  6830      z[0] = 'd';
  6831    }else{
  6832      z[0] = '?';
  6833    }
  6834    for(i=0; i<3; i++){
  6835      int m = (iMode >> ((2-i)*3));
  6836      char *a = &z[1 + i*3];
  6837      a[0] = (m & 0x4) ? 'r' : '-';
  6838      a[1] = (m & 0x2) ? 'w' : '-';
  6839      a[2] = (m & 0x1) ? 'x' : '-';
  6840    }
  6841    z[10] = '\0';
  6842    sqlite3_result_text(context, z, -1, SQLITE_TRANSIENT);
  6843  }
  6844  
  6845  #ifndef SQLITE_OMIT_VIRTUALTABLE
  6846  
  6847  /* 
  6848  ** Cursor type for recursively iterating through a directory structure.
  6849  */
  6850  typedef struct fsdir_cursor fsdir_cursor;
  6851  typedef struct FsdirLevel FsdirLevel;
  6852  
  6853  struct FsdirLevel {
  6854    DIR *pDir;                 /* From opendir() */
  6855    char *zDir;                /* Name of directory (nul-terminated) */
  6856  };
  6857  
  6858  struct fsdir_cursor {
  6859    sqlite3_vtab_cursor base;  /* Base class - must be first */
  6860  
  6861    int nLvl;                  /* Number of entries in aLvl[] array */
  6862    int iLvl;                  /* Index of current entry */
  6863    FsdirLevel *aLvl;          /* Hierarchy of directories being traversed */
  6864  
  6865    const char *zBase;
  6866    int nBase;
  6867  
  6868    struct stat sStat;         /* Current lstat() results */
  6869    char *zPath;               /* Path to current entry */
  6870    sqlite3_int64 iRowid;      /* Current rowid */
  6871  };
  6872  
  6873  typedef struct fsdir_tab fsdir_tab;
  6874  struct fsdir_tab {
  6875    sqlite3_vtab base;         /* Base class - must be first */
  6876  };
  6877  
  6878  /*
  6879  ** Construct a new fsdir virtual table object.
  6880  */
  6881  static int fsdirConnect(
  6882    sqlite3 *db,
  6883    void *pAux,
  6884    int argc, const char *const*argv,
  6885    sqlite3_vtab **ppVtab,
  6886    char **pzErr
  6887  ){
  6888    fsdir_tab *pNew = 0;
  6889    int rc;
  6890    (void)pAux;
  6891    (void)argc;
  6892    (void)argv;
  6893    (void)pzErr;
  6894    rc = sqlite3_declare_vtab(db, "CREATE TABLE x" FSDIR_SCHEMA);
  6895    if( rc==SQLITE_OK ){
  6896      pNew = (fsdir_tab*)sqlite3_malloc( sizeof(*pNew) );
  6897      if( pNew==0 ) return SQLITE_NOMEM;
  6898      memset(pNew, 0, sizeof(*pNew));
  6899      sqlite3_vtab_config(db, SQLITE_VTAB_DIRECTONLY);
  6900    }
  6901    *ppVtab = (sqlite3_vtab*)pNew;
  6902    return rc;
  6903  }
  6904  
  6905  /*
  6906  ** This method is the destructor for fsdir vtab objects.
  6907  */
  6908  static int fsdirDisconnect(sqlite3_vtab *pVtab){
  6909    sqlite3_free(pVtab);
  6910    return SQLITE_OK;
  6911  }
  6912  
  6913  /*
  6914  ** Constructor for a new fsdir_cursor object.
  6915  */
  6916  static int fsdirOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
  6917    fsdir_cursor *pCur;
  6918    (void)p;
  6919    pCur = sqlite3_malloc( sizeof(*pCur) );
  6920    if( pCur==0 ) return SQLITE_NOMEM;
  6921    memset(pCur, 0, sizeof(*pCur));
  6922    pCur->iLvl = -1;
  6923    *ppCursor = &pCur->base;
  6924    return SQLITE_OK;
  6925  }
  6926  
  6927  /*
  6928  ** Reset a cursor back to the state it was in when first returned
  6929  ** by fsdirOpen().
  6930  */
  6931  static void fsdirResetCursor(fsdir_cursor *pCur){
  6932    int i;
  6933    for(i=0; i<=pCur->iLvl; i++){
  6934      FsdirLevel *pLvl = &pCur->aLvl[i];
  6935      if( pLvl->pDir ) closedir(pLvl->pDir);
  6936      sqlite3_free(pLvl->zDir);
  6937    }
  6938    sqlite3_free(pCur->zPath);
  6939    sqlite3_free(pCur->aLvl);
  6940    pCur->aLvl = 0;
  6941    pCur->zPath = 0;
  6942    pCur->zBase = 0;
  6943    pCur->nBase = 0;
  6944    pCur->nLvl = 0;
  6945    pCur->iLvl = -1;
  6946    pCur->iRowid = 1;
  6947  }
  6948  
  6949  /*
  6950  ** Destructor for an fsdir_cursor.
  6951  */
  6952  static int fsdirClose(sqlite3_vtab_cursor *cur){
  6953    fsdir_cursor *pCur = (fsdir_cursor*)cur;
  6954  
  6955    fsdirResetCursor(pCur);
  6956    sqlite3_free(pCur);
  6957    return SQLITE_OK;
  6958  }
  6959  
  6960  /*
  6961  ** Set the error message for the virtual table associated with cursor
  6962  ** pCur to the results of vprintf(zFmt, ...).
  6963  */
  6964  static void fsdirSetErrmsg(fsdir_cursor *pCur, const char *zFmt, ...){
  6965    va_list ap;
  6966    va_start(ap, zFmt);
  6967    pCur->base.pVtab->zErrMsg = sqlite3_vmprintf(zFmt, ap);
  6968    va_end(ap);
  6969  }
  6970  
  6971  
  6972  /*
  6973  ** Advance an fsdir_cursor to its next row of output.
  6974  */
  6975  static int fsdirNext(sqlite3_vtab_cursor *cur){
  6976    fsdir_cursor *pCur = (fsdir_cursor*)cur;
  6977    mode_t m = pCur->sStat.st_mode;
  6978  
  6979    pCur->iRowid++;
  6980    if( S_ISDIR(m) ){
  6981      /* Descend into this directory */
  6982      int iNew = pCur->iLvl + 1;
  6983      FsdirLevel *pLvl;
  6984      if( iNew>=pCur->nLvl ){
  6985        int nNew = iNew+1;
  6986        sqlite3_int64 nByte = nNew*sizeof(FsdirLevel);
  6987        FsdirLevel *aNew = (FsdirLevel*)sqlite3_realloc64(pCur->aLvl, nByte);
  6988        if( aNew==0 ) return SQLITE_NOMEM;
  6989        memset(&aNew[pCur->nLvl], 0, sizeof(FsdirLevel)*(nNew-pCur->nLvl));
  6990        pCur->aLvl = aNew;
  6991        pCur->nLvl = nNew;
  6992      }
  6993      pCur->iLvl = iNew;
  6994      pLvl = &pCur->aLvl[iNew];
  6995      
  6996      pLvl->zDir = pCur->zPath;
  6997      pCur->zPath = 0;
  6998      pLvl->pDir = opendir(pLvl->zDir);
  6999      if( pLvl->pDir==0 ){
  7000        fsdirSetErrmsg(pCur, "cannot read directory: %s", pCur->zPath);
  7001        return SQLITE_ERROR;
  7002      }
  7003    }
  7004  
  7005    while( pCur->iLvl>=0 ){
  7006      FsdirLevel *pLvl = &pCur->aLvl[pCur->iLvl];
  7007      struct dirent *pEntry = readdir(pLvl->pDir);
  7008      if( pEntry ){
  7009        if( pEntry->d_name[0]=='.' ){
  7010         if( pEntry->d_name[1]=='.' && pEntry->d_name[2]=='\0' ) continue;
  7011         if( pEntry->d_name[1]=='\0' ) continue;
  7012        }
  7013        sqlite3_free(pCur->zPath);
  7014        pCur->zPath = sqlite3_mprintf("%s/%s", pLvl->zDir, pEntry->d_name);
  7015        if( pCur->zPath==0 ) return SQLITE_NOMEM;
  7016        if( fileLinkStat(pCur->zPath, &pCur->sStat) ){
  7017          fsdirSetErrmsg(pCur, "cannot stat file: %s", pCur->zPath);
  7018          return SQLITE_ERROR;
  7019        }
  7020        return SQLITE_OK;
  7021      }
  7022      closedir(pLvl->pDir);
  7023      sqlite3_free(pLvl->zDir);
  7024      pLvl->pDir = 0;
  7025      pLvl->zDir = 0;
  7026      pCur->iLvl--;
  7027    }
  7028  
  7029    /* EOF */
  7030    sqlite3_free(pCur->zPath);
  7031    pCur->zPath = 0;
  7032    return SQLITE_OK;
  7033  }
  7034  
  7035  /*
  7036  ** Return values of columns for the row at which the series_cursor
  7037  ** is currently pointing.
  7038  */
  7039  static int fsdirColumn(
  7040    sqlite3_vtab_cursor *cur,   /* The cursor */
  7041    sqlite3_context *ctx,       /* First argument to sqlite3_result_...() */
  7042    int i                       /* Which column to return */
  7043  ){
  7044    fsdir_cursor *pCur = (fsdir_cursor*)cur;
  7045    switch( i ){
  7046      case FSDIR_COLUMN_NAME: {
  7047        sqlite3_result_text(ctx, &pCur->zPath[pCur->nBase], -1, SQLITE_TRANSIENT);
  7048        break;
  7049      }
  7050  
  7051      case FSDIR_COLUMN_MODE:
  7052        sqlite3_result_int64(ctx, pCur->sStat.st_mode);
  7053        break;
  7054  
  7055      case FSDIR_COLUMN_MTIME:
  7056        sqlite3_result_int64(ctx, pCur->sStat.st_mtime);
  7057        break;
  7058  
  7059      case FSDIR_COLUMN_DATA: {
  7060        mode_t m = pCur->sStat.st_mode;
  7061        if( S_ISDIR(m) ){
  7062          sqlite3_result_null(ctx);
  7063  #if !defined(_WIN32) && !defined(WIN32)
  7064        }else if( S_ISLNK(m) ){
  7065          char aStatic[64];
  7066          char *aBuf = aStatic;
  7067          sqlite3_int64 nBuf = 64;
  7068          int n;
  7069  
  7070          while( 1 ){
  7071            n = readlink(pCur->zPath, aBuf, nBuf);
  7072            if( n<nBuf ) break;
  7073            if( aBuf!=aStatic ) sqlite3_free(aBuf);
  7074            nBuf = nBuf*2;
  7075            aBuf = sqlite3_malloc64(nBuf);
  7076            if( aBuf==0 ){
  7077              sqlite3_result_error_nomem(ctx);
  7078              return SQLITE_NOMEM;
  7079            }
  7080          }
  7081  
  7082          sqlite3_result_text(ctx, aBuf, n, SQLITE_TRANSIENT);
  7083          if( aBuf!=aStatic ) sqlite3_free(aBuf);
  7084  #endif
  7085        }else{
  7086          readFileContents(ctx, pCur->zPath);
  7087        }
  7088      }
  7089      case FSDIR_COLUMN_PATH:
  7090      default: {
  7091        /* The FSDIR_COLUMN_PATH and FSDIR_COLUMN_DIR are input parameters.
  7092        ** always return their values as NULL */
  7093        break;
  7094      }
  7095    }
  7096    return SQLITE_OK;
  7097  }
  7098  
  7099  /*
  7100  ** Return the rowid for the current row. In this implementation, the
  7101  ** first row returned is assigned rowid value 1, and each subsequent
  7102  ** row a value 1 more than that of the previous.
  7103  */
  7104  static int fsdirRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
  7105    fsdir_cursor *pCur = (fsdir_cursor*)cur;
  7106    *pRowid = pCur->iRowid;
  7107    return SQLITE_OK;
  7108  }
  7109  
  7110  /*
  7111  ** Return TRUE if the cursor has been moved off of the last
  7112  ** row of output.
  7113  */
  7114  static int fsdirEof(sqlite3_vtab_cursor *cur){
  7115    fsdir_cursor *pCur = (fsdir_cursor*)cur;
  7116    return (pCur->zPath==0);
  7117  }
  7118  
  7119  /*
  7120  ** xFilter callback.
  7121  **
  7122  ** idxNum==1   PATH parameter only
  7123  ** idxNum==2   Both PATH and DIR supplied
  7124  */
  7125  static int fsdirFilter(
  7126    sqlite3_vtab_cursor *cur, 
  7127    int idxNum, const char *idxStr,
  7128    int argc, sqlite3_value **argv
  7129  ){
  7130    const char *zDir = 0;
  7131    fsdir_cursor *pCur = (fsdir_cursor*)cur;
  7132    (void)idxStr;
  7133    fsdirResetCursor(pCur);
  7134  
  7135    if( idxNum==0 ){
  7136      fsdirSetErrmsg(pCur, "table function fsdir requires an argument");
  7137      return SQLITE_ERROR;
  7138    }
  7139  
  7140    assert( argc==idxNum && (argc==1 || argc==2) );
  7141    zDir = (const char*)sqlite3_value_text(argv[0]);
  7142    if( zDir==0 ){
  7143      fsdirSetErrmsg(pCur, "table function fsdir requires a non-NULL argument");
  7144      return SQLITE_ERROR;
  7145    }
  7146    if( argc==2 ){
  7147      pCur->zBase = (const char*)sqlite3_value_text(argv[1]);
  7148    }
  7149    if( pCur->zBase ){
  7150      pCur->nBase = (int)strlen(pCur->zBase)+1;
  7151      pCur->zPath = sqlite3_mprintf("%s/%s", pCur->zBase, zDir);
  7152    }else{
  7153      pCur->zPath = sqlite3_mprintf("%s", zDir);
  7154    }
  7155  
  7156    if( pCur->zPath==0 ){
  7157      return SQLITE_NOMEM;
  7158    }
  7159    if( fileLinkStat(pCur->zPath, &pCur->sStat) ){
  7160      fsdirSetErrmsg(pCur, "cannot stat file: %s", pCur->zPath);
  7161      return SQLITE_ERROR;
  7162    }
  7163  
  7164    return SQLITE_OK;
  7165  }
  7166  
  7167  /*
  7168  ** SQLite will invoke this method one or more times while planning a query
  7169  ** that uses the generate_series virtual table.  This routine needs to create
  7170  ** a query plan for each invocation and compute an estimated cost for that
  7171  ** plan.
  7172  **
  7173  ** In this implementation idxNum is used to represent the
  7174  ** query plan.  idxStr is unused.
  7175  **
  7176  ** The query plan is represented by values of idxNum:
  7177  **
  7178  **  (1)  The path value is supplied by argv[0]
  7179  **  (2)  Path is in argv[0] and dir is in argv[1]
  7180  */
  7181  static int fsdirBestIndex(
  7182    sqlite3_vtab *tab,
  7183    sqlite3_index_info *pIdxInfo
  7184  ){
  7185    int i;                 /* Loop over constraints */
  7186    int idxPath = -1;      /* Index in pIdxInfo->aConstraint of PATH= */
  7187    int idxDir = -1;       /* Index in pIdxInfo->aConstraint of DIR= */
  7188    int seenPath = 0;      /* True if an unusable PATH= constraint is seen */
  7189    int seenDir = 0;       /* True if an unusable DIR= constraint is seen */
  7190    const struct sqlite3_index_constraint *pConstraint;
  7191  
  7192    (void)tab;
  7193    pConstraint = pIdxInfo->aConstraint;
  7194    for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
  7195      if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue;
  7196      switch( pConstraint->iColumn ){
  7197        case FSDIR_COLUMN_PATH: {
  7198          if( pConstraint->usable ){
  7199            idxPath = i;
  7200            seenPath = 0;
  7201          }else if( idxPath<0 ){
  7202            seenPath = 1;
  7203          }
  7204          break;
  7205        }
  7206        case FSDIR_COLUMN_DIR: {
  7207          if( pConstraint->usable ){
  7208            idxDir = i;
  7209            seenDir = 0;
  7210          }else if( idxDir<0 ){
  7211            seenDir = 1;
  7212          }
  7213          break;
  7214        }
  7215      } 
  7216    }
  7217    if( seenPath || seenDir ){
  7218      /* If input parameters are unusable, disallow this plan */
  7219      return SQLITE_CONSTRAINT;
  7220    }
  7221  
  7222    if( idxPath<0 ){
  7223      pIdxInfo->idxNum = 0;
  7224      /* The pIdxInfo->estimatedCost should have been initialized to a huge
  7225      ** number.  Leave it unchanged. */
  7226      pIdxInfo->estimatedRows = 0x7fffffff;
  7227    }else{
  7228      pIdxInfo->aConstraintUsage[idxPath].omit = 1;
  7229      pIdxInfo->aConstraintUsage[idxPath].argvIndex = 1;
  7230      if( idxDir>=0 ){
  7231        pIdxInfo->aConstraintUsage[idxDir].omit = 1;
  7232        pIdxInfo->aConstraintUsage[idxDir].argvIndex = 2;
  7233        pIdxInfo->idxNum = 2;
  7234        pIdxInfo->estimatedCost = 10.0;
  7235      }else{
  7236        pIdxInfo->idxNum = 1;
  7237        pIdxInfo->estimatedCost = 100.0;
  7238      }
  7239    }
  7240  
  7241    return SQLITE_OK;
  7242  }
  7243  
  7244  /*
  7245  ** Register the "fsdir" virtual table.
  7246  */
  7247  static int fsdirRegister(sqlite3 *db){
  7248    static sqlite3_module fsdirModule = {
  7249      0,                         /* iVersion */
  7250      0,                         /* xCreate */
  7251      fsdirConnect,              /* xConnect */
  7252      fsdirBestIndex,            /* xBestIndex */
  7253      fsdirDisconnect,           /* xDisconnect */
  7254      0,                         /* xDestroy */
  7255      fsdirOpen,                 /* xOpen - open a cursor */
  7256      fsdirClose,                /* xClose - close a cursor */
  7257      fsdirFilter,               /* xFilter - configure scan constraints */
  7258      fsdirNext,                 /* xNext - advance a cursor */
  7259      fsdirEof,                  /* xEof - check for end of scan */
  7260      fsdirColumn,               /* xColumn - read data */
  7261      fsdirRowid,                /* xRowid - read data */
  7262      0,                         /* xUpdate */
  7263      0,                         /* xBegin */
  7264      0,                         /* xSync */
  7265      0,                         /* xCommit */
  7266      0,                         /* xRollback */
  7267      0,                         /* xFindMethod */
  7268      0,                         /* xRename */
  7269      0,                         /* xSavepoint */
  7270      0,                         /* xRelease */
  7271      0,                         /* xRollbackTo */
  7272      0,                         /* xShadowName */
  7273    };
  7274  
  7275    int rc = sqlite3_create_module(db, "fsdir", &fsdirModule, 0);
  7276    return rc;
  7277  }
  7278  #else         /* SQLITE_OMIT_VIRTUALTABLE */
  7279  # define fsdirRegister(x) SQLITE_OK
  7280  #endif
  7281  
  7282  #ifdef _WIN32
  7283  
  7284  #endif
  7285  int sqlite3_fileio_init(
  7286    sqlite3 *db, 
  7287    char **pzErrMsg, 
  7288    const sqlite3_api_routines *pApi
  7289  ){
  7290    int rc = SQLITE_OK;
  7291    SQLITE_EXTENSION_INIT2(pApi);
  7292    (void)pzErrMsg;  /* Unused parameter */
  7293    rc = sqlite3_create_function(db, "readfile", 1, 
  7294                                 SQLITE_UTF8|SQLITE_DIRECTONLY, 0,
  7295                                 readfileFunc, 0, 0);
  7296    if( rc==SQLITE_OK ){
  7297      rc = sqlite3_create_function(db, "writefile", -1,
  7298                                   SQLITE_UTF8|SQLITE_DIRECTONLY, 0,
  7299                                   writefileFunc, 0, 0);
  7300    }
  7301    if( rc==SQLITE_OK ){
  7302      rc = sqlite3_create_function(db, "lsmode", 1, SQLITE_UTF8, 0,
  7303                                   lsModeFunc, 0, 0);
  7304    }
  7305    if( rc==SQLITE_OK ){
  7306      rc = fsdirRegister(db);
  7307    }
  7308    return rc;
  7309  }
  7310  
  7311  #if defined(FILEIO_WIN32_DLL) && (defined(_WIN32) || defined(WIN32))
  7312  /* To allow a standalone DLL, make test_windirent.c use the same
  7313   * redefined SQLite API calls as the above extension code does.
  7314   * Just pull in this .c to accomplish this. As a beneficial side
  7315   * effect, this extension becomes a single translation unit. */
  7316  #  include "test_windirent.c"
  7317  #endif
  7318  
  7319  /************************* End ../ext/misc/fileio.c ********************/
  7320  /************************* Begin ../ext/misc/completion.c ******************/
  7321  /*
  7322  ** 2017-07-10
  7323  **
  7324  ** The author disclaims copyright to this source code.  In place of
  7325  ** a legal notice, here is a blessing:
  7326  **
  7327  **    May you do good and not evil.
  7328  **    May you find forgiveness for yourself and forgive others.
  7329  **    May you share freely, never taking more than you give.
  7330  **
  7331  *************************************************************************
  7332  **
  7333  ** This file implements an eponymous virtual table that returns suggested
  7334  ** completions for a partial SQL input.
  7335  **
  7336  ** Suggested usage:
  7337  **
  7338  **     SELECT DISTINCT candidate COLLATE nocase
  7339  **       FROM completion($prefix,$wholeline)
  7340  **      ORDER BY 1;
  7341  **
  7342  ** The two query parameters are optional.  $prefix is the text of the
  7343  ** current word being typed and that is to be completed.  $wholeline is
  7344  ** the complete input line, used for context.
  7345  **
  7346  ** The raw completion() table might return the same candidate multiple
  7347  ** times, for example if the same column name is used to two or more
  7348  ** tables.  And the candidates are returned in an arbitrary order.  Hence,
  7349  ** the DISTINCT and ORDER BY are recommended.
  7350  **
  7351  ** This virtual table operates at the speed of human typing, and so there
  7352  ** is no attempt to make it fast.  Even a slow implementation will be much
  7353  ** faster than any human can type.
  7354  **
  7355  */
  7356  /* #include "sqlite3ext.h" */
  7357  SQLITE_EXTENSION_INIT1
  7358  #include <assert.h>
  7359  #include <string.h>
  7360  #include <ctype.h>
  7361  
  7362  #ifndef SQLITE_OMIT_VIRTUALTABLE
  7363  
  7364  /* completion_vtab is a subclass of sqlite3_vtab which will
  7365  ** serve as the underlying representation of a completion virtual table
  7366  */
  7367  typedef struct completion_vtab completion_vtab;
  7368  struct completion_vtab {
  7369    sqlite3_vtab base;  /* Base class - must be first */
  7370    sqlite3 *db;        /* Database connection for this completion vtab */
  7371  };
  7372  
  7373  /* completion_cursor is a subclass of sqlite3_vtab_cursor which will
  7374  ** serve as the underlying representation of a cursor that scans
  7375  ** over rows of the result
  7376  */
  7377  typedef struct completion_cursor completion_cursor;
  7378  struct completion_cursor {
  7379    sqlite3_vtab_cursor base;  /* Base class - must be first */
  7380    sqlite3 *db;               /* Database connection for this cursor */
  7381    int nPrefix, nLine;        /* Number of bytes in zPrefix and zLine */
  7382    char *zPrefix;             /* The prefix for the word we want to complete */
  7383    char *zLine;               /* The whole that we want to complete */
  7384    const char *zCurrentRow;   /* Current output row */
  7385    int szRow;                 /* Length of the zCurrentRow string */
  7386    sqlite3_stmt *pStmt;       /* Current statement */
  7387    sqlite3_int64 iRowid;      /* The rowid */
  7388    int ePhase;                /* Current phase */
  7389    int j;                     /* inter-phase counter */
  7390  };
  7391  
  7392  /* Values for ePhase:
  7393  */
  7394  #define COMPLETION_FIRST_PHASE   1
  7395  #define COMPLETION_KEYWORDS      1
  7396  #define COMPLETION_PRAGMAS       2
  7397  #define COMPLETION_FUNCTIONS     3
  7398  #define COMPLETION_COLLATIONS    4
  7399  #define COMPLETION_INDEXES       5
  7400  #define COMPLETION_TRIGGERS      6
  7401  #define COMPLETION_DATABASES     7
  7402  #define COMPLETION_TABLES        8    /* Also VIEWs and TRIGGERs */
  7403  #define COMPLETION_COLUMNS       9
  7404  #define COMPLETION_MODULES       10
  7405  #define COMPLETION_EOF           11
  7406  
  7407  /*
  7408  ** The completionConnect() method is invoked to create a new
  7409  ** completion_vtab that describes the completion virtual table.
  7410  **
  7411  ** Think of this routine as the constructor for completion_vtab objects.
  7412  **
  7413  ** All this routine needs to do is:
  7414  **
  7415  **    (1) Allocate the completion_vtab object and initialize all fields.
  7416  **
  7417  **    (2) Tell SQLite (via the sqlite3_declare_vtab() interface) what the
  7418  **        result set of queries against completion will look like.
  7419  */
  7420  static int completionConnect(
  7421    sqlite3 *db,
  7422    void *pAux,
  7423    int argc, const char *const*argv,
  7424    sqlite3_vtab **ppVtab,
  7425    char **pzErr
  7426  ){
  7427    completion_vtab *pNew;
  7428    int rc;
  7429  
  7430    (void)(pAux);    /* Unused parameter */
  7431    (void)(argc);    /* Unused parameter */
  7432    (void)(argv);    /* Unused parameter */
  7433    (void)(pzErr);   /* Unused parameter */
  7434  
  7435  /* Column numbers */
  7436  #define COMPLETION_COLUMN_CANDIDATE 0  /* Suggested completion of the input */
  7437  #define COMPLETION_COLUMN_PREFIX    1  /* Prefix of the word to be completed */
  7438  #define COMPLETION_COLUMN_WHOLELINE 2  /* Entire line seen so far */
  7439  #define COMPLETION_COLUMN_PHASE     3  /* ePhase - used for debugging only */
  7440  
  7441    sqlite3_vtab_config(db, SQLITE_VTAB_INNOCUOUS);
  7442    rc = sqlite3_declare_vtab(db,
  7443        "CREATE TABLE x("
  7444        "  candidate TEXT,"
  7445        "  prefix TEXT HIDDEN,"
  7446        "  wholeline TEXT HIDDEN,"
  7447        "  phase INT HIDDEN"        /* Used for debugging only */
  7448        ")");
  7449    if( rc==SQLITE_OK ){
  7450      pNew = sqlite3_malloc( sizeof(*pNew) );
  7451      *ppVtab = (sqlite3_vtab*)pNew;
  7452      if( pNew==0 ) return SQLITE_NOMEM;
  7453      memset(pNew, 0, sizeof(*pNew));
  7454      pNew->db = db;
  7455    }
  7456    return rc;
  7457  }
  7458  
  7459  /*
  7460  ** This method is the destructor for completion_cursor objects.
  7461  */
  7462  static int completionDisconnect(sqlite3_vtab *pVtab){
  7463    sqlite3_free(pVtab);
  7464    return SQLITE_OK;
  7465  }
  7466  
  7467  /*
  7468  ** Constructor for a new completion_cursor object.
  7469  */
  7470  static int completionOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
  7471    completion_cursor *pCur;
  7472    pCur = sqlite3_malloc( sizeof(*pCur) );
  7473    if( pCur==0 ) return SQLITE_NOMEM;
  7474    memset(pCur, 0, sizeof(*pCur));
  7475    pCur->db = ((completion_vtab*)p)->db;
  7476    *ppCursor = &pCur->base;
  7477    return SQLITE_OK;
  7478  }
  7479  
  7480  /*
  7481  ** Reset the completion_cursor.
  7482  */
  7483  static void completionCursorReset(completion_cursor *pCur){
  7484    sqlite3_free(pCur->zPrefix);   pCur->zPrefix = 0;  pCur->nPrefix = 0;
  7485    sqlite3_free(pCur->zLine);     pCur->zLine = 0;    pCur->nLine = 0;
  7486    sqlite3_finalize(pCur->pStmt); pCur->pStmt = 0;
  7487    pCur->j = 0;
  7488  }
  7489  
  7490  /*
  7491  ** Destructor for a completion_cursor.
  7492  */
  7493  static int completionClose(sqlite3_vtab_cursor *cur){
  7494    completionCursorReset((completion_cursor*)cur);
  7495    sqlite3_free(cur);
  7496    return SQLITE_OK;
  7497  }
  7498  
  7499  /*
  7500  ** Advance a completion_cursor to its next row of output.
  7501  **
  7502  ** The ->ePhase, ->j, and ->pStmt fields of the completion_cursor object
  7503  ** record the current state of the scan.  This routine sets ->zCurrentRow
  7504  ** to the current row of output and then returns.  If no more rows remain,
  7505  ** then ->ePhase is set to COMPLETION_EOF which will signal the virtual
  7506  ** table that has reached the end of its scan.
  7507  **
  7508  ** The current implementation just lists potential identifiers and
  7509  ** keywords and filters them by zPrefix.  Future enhancements should
  7510  ** take zLine into account to try to restrict the set of identifiers and
  7511  ** keywords based on what would be legal at the current point of input.
  7512  */
  7513  static int completionNext(sqlite3_vtab_cursor *cur){
  7514    completion_cursor *pCur = (completion_cursor*)cur;
  7515    int eNextPhase = 0;  /* Next phase to try if current phase reaches end */
  7516    int iCol = -1;       /* If >=0, step pCur->pStmt and use the i-th column */
  7517    pCur->iRowid++;
  7518    while( pCur->ePhase!=COMPLETION_EOF ){
  7519      switch( pCur->ePhase ){
  7520        case COMPLETION_KEYWORDS: {
  7521          if( pCur->j >= sqlite3_keyword_count() ){
  7522            pCur->zCurrentRow = 0;
  7523            pCur->ePhase = COMPLETION_DATABASES;
  7524          }else{
  7525            sqlite3_keyword_name(pCur->j++, &pCur->zCurrentRow, &pCur->szRow);
  7526          }
  7527          iCol = -1;
  7528          break;
  7529        }
  7530        case COMPLETION_DATABASES: {
  7531          if( pCur->pStmt==0 ){
  7532            sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1,
  7533                               &pCur->pStmt, 0);
  7534          }
  7535          iCol = 1;
  7536          eNextPhase = COMPLETION_TABLES;
  7537          break;
  7538        }
  7539        case COMPLETION_TABLES: {
  7540          if( pCur->pStmt==0 ){
  7541            sqlite3_stmt *pS2;
  7542            char *zSql = 0;
  7543            const char *zSep = "";
  7544            sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1, &pS2, 0);
  7545            while( sqlite3_step(pS2)==SQLITE_ROW ){
  7546              const char *zDb = (const char*)sqlite3_column_text(pS2, 1);
  7547              zSql = sqlite3_mprintf(
  7548                 "%z%s"
  7549                 "SELECT name FROM \"%w\".sqlite_schema",
  7550                 zSql, zSep, zDb
  7551              );
  7552              if( zSql==0 ) return SQLITE_NOMEM;
  7553              zSep = " UNION ";
  7554            }
  7555            sqlite3_finalize(pS2);
  7556            sqlite3_prepare_v2(pCur->db, zSql, -1, &pCur->pStmt, 0);
  7557            sqlite3_free(zSql);
  7558          }
  7559          iCol = 0;
  7560          eNextPhase = COMPLETION_COLUMNS;
  7561          break;
  7562        }
  7563        case COMPLETION_COLUMNS: {
  7564          if( pCur->pStmt==0 ){
  7565            sqlite3_stmt *pS2;
  7566            char *zSql = 0;
  7567            const char *zSep = "";
  7568            sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1, &pS2, 0);
  7569            while( sqlite3_step(pS2)==SQLITE_ROW ){
  7570              const char *zDb = (const char*)sqlite3_column_text(pS2, 1);
  7571              zSql = sqlite3_mprintf(
  7572                 "%z%s"
  7573                 "SELECT pti.name FROM \"%w\".sqlite_schema AS sm"
  7574                         " JOIN pragma_table_info(sm.name,%Q) AS pti"
  7575                 " WHERE sm.type='table'",
  7576                 zSql, zSep, zDb, zDb
  7577              );
  7578              if( zSql==0 ) return SQLITE_NOMEM;
  7579              zSep = " UNION ";
  7580            }
  7581            sqlite3_finalize(pS2);
  7582            sqlite3_prepare_v2(pCur->db, zSql, -1, &pCur->pStmt, 0);
  7583            sqlite3_free(zSql);
  7584          }
  7585          iCol = 0;
  7586          eNextPhase = COMPLETION_EOF;
  7587          break;
  7588        }
  7589      }
  7590      if( iCol<0 ){
  7591        /* This case is when the phase presets zCurrentRow */
  7592        if( pCur->zCurrentRow==0 ) continue;
  7593      }else{
  7594        if( sqlite3_step(pCur->pStmt)==SQLITE_ROW ){
  7595          /* Extract the next row of content */
  7596          pCur->zCurrentRow = (const char*)sqlite3_column_text(pCur->pStmt, iCol);
  7597          pCur->szRow = sqlite3_column_bytes(pCur->pStmt, iCol);
  7598        }else{
  7599          /* When all rows are finished, advance to the next phase */
  7600          sqlite3_finalize(pCur->pStmt);
  7601          pCur->pStmt = 0;
  7602          pCur->ePhase = eNextPhase;
  7603          continue;
  7604        }
  7605      }
  7606      if( pCur->nPrefix==0 ) break;
  7607      if( pCur->nPrefix<=pCur->szRow
  7608       && sqlite3_strnicmp(pCur->zPrefix, pCur->zCurrentRow, pCur->nPrefix)==0
  7609      ){
  7610        break;
  7611      }
  7612    }
  7613  
  7614    return SQLITE_OK;
  7615  }
  7616  
  7617  /*
  7618  ** Return values of columns for the row at which the completion_cursor
  7619  ** is currently pointing.
  7620  */
  7621  static int completionColumn(
  7622    sqlite3_vtab_cursor *cur,   /* The cursor */
  7623    sqlite3_context *ctx,       /* First argument to sqlite3_result_...() */
  7624    int i                       /* Which column to return */
  7625  ){
  7626    completion_cursor *pCur = (completion_cursor*)cur;
  7627    switch( i ){
  7628      case COMPLETION_COLUMN_CANDIDATE: {
  7629        sqlite3_result_text(ctx, pCur->zCurrentRow, pCur->szRow,SQLITE_TRANSIENT);
  7630        break;
  7631      }
  7632      case COMPLETION_COLUMN_PREFIX: {
  7633        sqlite3_result_text(ctx, pCur->zPrefix, -1, SQLITE_TRANSIENT);
  7634        break;
  7635      }
  7636      case COMPLETION_COLUMN_WHOLELINE: {
  7637        sqlite3_result_text(ctx, pCur->zLine, -1, SQLITE_TRANSIENT);
  7638        break;
  7639      }
  7640      case COMPLETION_COLUMN_PHASE: {
  7641        sqlite3_result_int(ctx, pCur->ePhase);
  7642        break;
  7643      }
  7644    }
  7645    return SQLITE_OK;
  7646  }
  7647  
  7648  /*
  7649  ** Return the rowid for the current row.  In this implementation, the
  7650  ** rowid is the same as the output value.
  7651  */
  7652  static int completionRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
  7653    completion_cursor *pCur = (completion_cursor*)cur;
  7654    *pRowid = pCur->iRowid;
  7655    return SQLITE_OK;
  7656  }
  7657  
  7658  /*
  7659  ** Return TRUE if the cursor has been moved off of the last
  7660  ** row of output.
  7661  */
  7662  static int completionEof(sqlite3_vtab_cursor *cur){
  7663    completion_cursor *pCur = (completion_cursor*)cur;
  7664    return pCur->ePhase >= COMPLETION_EOF;
  7665  }
  7666  
  7667  /*
  7668  ** This method is called to "rewind" the completion_cursor object back
  7669  ** to the first row of output.  This method is always called at least
  7670  ** once prior to any call to completionColumn() or completionRowid() or 
  7671  ** completionEof().
  7672  */
  7673  static int completionFilter(
  7674    sqlite3_vtab_cursor *pVtabCursor, 
  7675    int idxNum, const char *idxStr,
  7676    int argc, sqlite3_value **argv
  7677  ){
  7678    completion_cursor *pCur = (completion_cursor *)pVtabCursor;
  7679    int iArg = 0;
  7680    (void)(idxStr);   /* Unused parameter */
  7681    (void)(argc);     /* Unused parameter */
  7682    completionCursorReset(pCur);
  7683    if( idxNum & 1 ){
  7684      pCur->nPrefix = sqlite3_value_bytes(argv[iArg]);
  7685      if( pCur->nPrefix>0 ){
  7686        pCur->zPrefix = sqlite3_mprintf("%s", sqlite3_value_text(argv[iArg]));
  7687        if( pCur->zPrefix==0 ) return SQLITE_NOMEM;
  7688      }
  7689      iArg = 1;
  7690    }
  7691    if( idxNum & 2 ){
  7692      pCur->nLine = sqlite3_value_bytes(argv[iArg]);
  7693      if( pCur->nLine>0 ){
  7694        pCur->zLine = sqlite3_mprintf("%s", sqlite3_value_text(argv[iArg]));
  7695        if( pCur->zLine==0 ) return SQLITE_NOMEM;
  7696      }
  7697    }
  7698    if( pCur->zLine!=0 && pCur->zPrefix==0 ){
  7699      int i = pCur->nLine;
  7700      while( i>0 && (isalnum(pCur->zLine[i-1]) || pCur->zLine[i-1]=='_') ){
  7701        i--;
  7702      }
  7703      pCur->nPrefix = pCur->nLine - i;
  7704      if( pCur->nPrefix>0 ){
  7705        pCur->zPrefix = sqlite3_mprintf("%.*s", pCur->nPrefix, pCur->zLine + i);
  7706        if( pCur->zPrefix==0 ) return SQLITE_NOMEM;
  7707      }
  7708    }
  7709    pCur->iRowid = 0;
  7710    pCur->ePhase = COMPLETION_FIRST_PHASE;
  7711    return completionNext(pVtabCursor);
  7712  }
  7713  
  7714  /*
  7715  ** SQLite will invoke this method one or more times while planning a query
  7716  ** that uses the completion virtual table.  This routine needs to create
  7717  ** a query plan for each invocation and compute an estimated cost for that
  7718  ** plan.
  7719  **
  7720  ** There are two hidden parameters that act as arguments to the table-valued
  7721  ** function:  "prefix" and "wholeline".  Bit 0 of idxNum is set if "prefix"
  7722  ** is available and bit 1 is set if "wholeline" is available.
  7723  */
  7724  static int completionBestIndex(
  7725    sqlite3_vtab *tab,
  7726    sqlite3_index_info *pIdxInfo
  7727  ){
  7728    int i;                 /* Loop over constraints */
  7729    int idxNum = 0;        /* The query plan bitmask */
  7730    int prefixIdx = -1;    /* Index of the start= constraint, or -1 if none */
  7731    int wholelineIdx = -1; /* Index of the stop= constraint, or -1 if none */
  7732    int nArg = 0;          /* Number of arguments that completeFilter() expects */
  7733    const struct sqlite3_index_constraint *pConstraint;
  7734  
  7735    (void)(tab);    /* Unused parameter */
  7736    pConstraint = pIdxInfo->aConstraint;
  7737    for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
  7738      if( pConstraint->usable==0 ) continue;
  7739      if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue;
  7740      switch( pConstraint->iColumn ){
  7741        case COMPLETION_COLUMN_PREFIX:
  7742          prefixIdx = i;
  7743          idxNum |= 1;
  7744          break;
  7745        case COMPLETION_COLUMN_WHOLELINE:
  7746          wholelineIdx = i;
  7747          idxNum |= 2;
  7748          break;
  7749      }
  7750    }
  7751    if( prefixIdx>=0 ){
  7752      pIdxInfo->aConstraintUsage[prefixIdx].argvIndex = ++nArg;
  7753      pIdxInfo->aConstraintUsage[prefixIdx].omit = 1;
  7754    }
  7755    if( wholelineIdx>=0 ){
  7756      pIdxInfo->aConstraintUsage[wholelineIdx].argvIndex = ++nArg;
  7757      pIdxInfo->aConstraintUsage[wholelineIdx].omit = 1;
  7758    }
  7759    pIdxInfo->idxNum = idxNum;
  7760    pIdxInfo->estimatedCost = (double)5000 - 1000*nArg;
  7761    pIdxInfo->estimatedRows = 500 - 100*nArg;
  7762    return SQLITE_OK;
  7763  }
  7764  
  7765  /*
  7766  ** This following structure defines all the methods for the 
  7767  ** completion virtual table.
  7768  */
  7769  static sqlite3_module completionModule = {
  7770    0,                         /* iVersion */
  7771    0,                         /* xCreate */
  7772    completionConnect,         /* xConnect */
  7773    completionBestIndex,       /* xBestIndex */
  7774    completionDisconnect,      /* xDisconnect */
  7775    0,                         /* xDestroy */
  7776    completionOpen,            /* xOpen - open a cursor */
  7777    completionClose,           /* xClose - close a cursor */
  7778    completionFilter,          /* xFilter - configure scan constraints */
  7779    completionNext,            /* xNext - advance a cursor */
  7780    completionEof,             /* xEof - check for end of scan */
  7781    completionColumn,          /* xColumn - read data */
  7782    completionRowid,           /* xRowid - read data */
  7783    0,                         /* xUpdate */
  7784    0,                         /* xBegin */
  7785    0,                         /* xSync */
  7786    0,                         /* xCommit */
  7787    0,                         /* xRollback */
  7788    0,                         /* xFindMethod */
  7789    0,                         /* xRename */
  7790    0,                         /* xSavepoint */
  7791    0,                         /* xRelease */
  7792    0,                         /* xRollbackTo */
  7793    0                          /* xShadowName */
  7794  };
  7795  
  7796  #endif /* SQLITE_OMIT_VIRTUALTABLE */
  7797  
  7798  int sqlite3CompletionVtabInit(sqlite3 *db){
  7799    int rc = SQLITE_OK;
  7800  #ifndef SQLITE_OMIT_VIRTUALTABLE
  7801    rc = sqlite3_create_module(db, "completion", &completionModule, 0);
  7802  #endif
  7803    return rc;
  7804  }
  7805  
  7806  #ifdef _WIN32
  7807  
  7808  #endif
  7809  int sqlite3_completion_init(
  7810    sqlite3 *db, 
  7811    char **pzErrMsg, 
  7812    const sqlite3_api_routines *pApi
  7813  ){
  7814    int rc = SQLITE_OK;
  7815    SQLITE_EXTENSION_INIT2(pApi);
  7816    (void)(pzErrMsg);  /* Unused parameter */
  7817  #ifndef SQLITE_OMIT_VIRTUALTABLE
  7818    rc = sqlite3CompletionVtabInit(db);
  7819  #endif
  7820    return rc;
  7821  }
  7822  
  7823  /************************* End ../ext/misc/completion.c ********************/
  7824  /************************* Begin ../ext/misc/appendvfs.c ******************/
  7825  /*
  7826  ** 2017-10-20
  7827  **
  7828  ** The author disclaims copyright to this source code.  In place of
  7829  ** a legal notice, here is a blessing:
  7830  **
  7831  **    May you do good and not evil.
  7832  **    May you find forgiveness for yourself and forgive others.
  7833  **    May you share freely, never taking more than you give.
  7834  **
  7835  ******************************************************************************
  7836  **
  7837  ** This file implements a VFS shim that allows an SQLite database to be
  7838  ** appended onto the end of some other file, such as an executable.
  7839  **
  7840  ** A special record must appear at the end of the file that identifies the
  7841  ** file as an appended database and provides the offset to the first page
  7842  ** of the exposed content. (Or, it is the length of the content prefix.)
  7843  ** For best performance page 1 should be located at a disk page boundary,
  7844  ** though that is not required.
  7845  **
  7846  ** When opening a database using this VFS, the connection might treat
  7847  ** the file as an ordinary SQLite database, or it might treat it as a
  7848  ** database appended onto some other file.  The decision is made by
  7849  ** applying the following rules in order:
  7850  **
  7851  **  (1)  An empty file is an ordinary database.
  7852  **
  7853  **  (2)  If the file ends with the appendvfs trailer string
  7854  **       "Start-Of-SQLite3-NNNNNNNN" that file is an appended database.
  7855  **
  7856  **  (3)  If the file begins with the standard SQLite prefix string
  7857  **       "SQLite format 3", that file is an ordinary database.
  7858  **
  7859  **  (4)  If none of the above apply and the SQLITE_OPEN_CREATE flag is
  7860  **       set, then a new database is appended to the already existing file.
  7861  **
  7862  **  (5)  Otherwise, SQLITE_CANTOPEN is returned.
  7863  **
  7864  ** To avoid unnecessary complications with the PENDING_BYTE, the size of
  7865  ** the file containing the database is limited to 1GiB. (1073741824 bytes)
  7866  ** This VFS will not read or write past the 1GiB mark.  This restriction
  7867  ** might be lifted in future versions.  For now, if you need a larger
  7868  ** database, then keep it in a separate file.
  7869  **
  7870  ** If the file being opened is a plain database (not an appended one), then
  7871  ** this shim is a pass-through into the default underlying VFS. (rule 3)
  7872  **/
  7873  /* #include "sqlite3ext.h" */
  7874  SQLITE_EXTENSION_INIT1
  7875  #include <string.h>
  7876  #include <assert.h>
  7877  
  7878  /* The append mark at the end of the database is:
  7879  **
  7880  **     Start-Of-SQLite3-NNNNNNNN
  7881  **     123456789 123456789 12345
  7882  **
  7883  ** The NNNNNNNN represents a 64-bit big-endian unsigned integer which is
  7884  ** the offset to page 1, and also the length of the prefix content.
  7885  */
  7886  #define APND_MARK_PREFIX     "Start-Of-SQLite3-"
  7887  #define APND_MARK_PREFIX_SZ  17
  7888  #define APND_MARK_FOS_SZ      8
  7889  #define APND_MARK_SIZE       (APND_MARK_PREFIX_SZ+APND_MARK_FOS_SZ)
  7890  
  7891  /*
  7892  ** Maximum size of the combined prefix + database + append-mark.  This
  7893  ** must be less than 0x40000000 to avoid locking issues on Windows.
  7894  */
  7895  #define APND_MAX_SIZE  (0x40000000)
  7896  
  7897  /*
  7898  ** Try to align the database to an even multiple of APND_ROUNDUP bytes.
  7899  */
  7900  #ifndef APND_ROUNDUP
  7901  #define APND_ROUNDUP 4096
  7902  #endif
  7903  #define APND_ALIGN_MASK         ((sqlite3_int64)(APND_ROUNDUP-1))
  7904  #define APND_START_ROUNDUP(fsz) (((fsz)+APND_ALIGN_MASK) & ~APND_ALIGN_MASK)
  7905  
  7906  /*
  7907  ** Forward declaration of objects used by this utility
  7908  */
  7909  typedef struct sqlite3_vfs ApndVfs;
  7910  typedef struct ApndFile ApndFile;
  7911  
  7912  /* Access to a lower-level VFS that (might) implement dynamic loading,
  7913  ** access to randomness, etc.
  7914  */
  7915  #define ORIGVFS(p)  ((sqlite3_vfs*)((p)->pAppData))
  7916  #define ORIGFILE(p) ((sqlite3_file*)(((ApndFile*)(p))+1))
  7917  
  7918  /* An open appendvfs file
  7919  **
  7920  ** An instance of this structure describes the appended database file.
  7921  ** A separate sqlite3_file object is always appended. The appended
  7922  ** sqlite3_file object (which can be accessed using ORIGFILE()) describes
  7923  ** the entire file, including the prefix, the database, and the
  7924  ** append-mark.
  7925  **
  7926  ** The structure of an AppendVFS database is like this:
  7927  **
  7928  **   +-------------+---------+----------+-------------+
  7929  **   | prefix-file | padding | database | append-mark |
  7930  **   +-------------+---------+----------+-------------+
  7931  **                           ^          ^
  7932  **                           |          |
  7933  **                         iPgOne      iMark
  7934  **
  7935  **
  7936  ** "prefix file" -  file onto which the database has been appended.
  7937  ** "padding"     -  zero or more bytes inserted so that "database"
  7938  **                  starts on an APND_ROUNDUP boundary
  7939  ** "database"    -  The SQLite database file
  7940  ** "append-mark" -  The 25-byte "Start-Of-SQLite3-NNNNNNNN" that indicates
  7941  **                  the offset from the start of prefix-file to the start
  7942  **                  of "database".
  7943  **
  7944  ** The size of the database is iMark - iPgOne.
  7945  **
  7946  ** The NNNNNNNN in the "Start-Of-SQLite3-NNNNNNNN" suffix is the value
  7947  ** of iPgOne stored as a big-ending 64-bit integer.
  7948  **
  7949  ** iMark will be the size of the underlying file minus 25 (APND_MARKSIZE).
  7950  ** Or, iMark is -1 to indicate that it has not yet been written.
  7951  */
  7952  struct ApndFile {
  7953    sqlite3_file base;        /* Subclass.  MUST BE FIRST! */
  7954    sqlite3_int64 iPgOne;     /* Offset to the start of the database */
  7955    sqlite3_int64 iMark;      /* Offset of the append mark.  -1 if unwritten */
  7956    /* Always followed by another sqlite3_file that describes the whole file */
  7957  };
  7958  
  7959  /*
  7960  ** Methods for ApndFile
  7961  */
  7962  static int apndClose(sqlite3_file*);
  7963  static int apndRead(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst);
  7964  static int apndWrite(sqlite3_file*,const void*,int iAmt, sqlite3_int64 iOfst);
  7965  static int apndTruncate(sqlite3_file*, sqlite3_int64 size);
  7966  static int apndSync(sqlite3_file*, int flags);
  7967  static int apndFileSize(sqlite3_file*, sqlite3_int64 *pSize);
  7968  static int apndLock(sqlite3_file*, int);
  7969  static int apndUnlock(sqlite3_file*, int);
  7970  static int apndCheckReservedLock(sqlite3_file*, int *pResOut);
  7971  static int apndFileControl(sqlite3_file*, int op, void *pArg);
  7972  static int apndSectorSize(sqlite3_file*);
  7973  static int apndDeviceCharacteristics(sqlite3_file*);
  7974  static int apndShmMap(sqlite3_file*, int iPg, int pgsz, int, void volatile**);
  7975  static int apndShmLock(sqlite3_file*, int offset, int n, int flags);
  7976  static void apndShmBarrier(sqlite3_file*);
  7977  static int apndShmUnmap(sqlite3_file*, int deleteFlag);
  7978  static int apndFetch(sqlite3_file*, sqlite3_int64 iOfst, int iAmt, void **pp);
  7979  static int apndUnfetch(sqlite3_file*, sqlite3_int64 iOfst, void *p);
  7980  
  7981  /*
  7982  ** Methods for ApndVfs
  7983  */
  7984  static int apndOpen(sqlite3_vfs*, const char *, sqlite3_file*, int , int *);
  7985  static int apndDelete(sqlite3_vfs*, const char *zName, int syncDir);
  7986  static int apndAccess(sqlite3_vfs*, const char *zName, int flags, int *);
  7987  static int apndFullPathname(sqlite3_vfs*, const char *zName, int, char *zOut);
  7988  static void *apndDlOpen(sqlite3_vfs*, const char *zFilename);
  7989  static void apndDlError(sqlite3_vfs*, int nByte, char *zErrMsg);
  7990  static void (*apndDlSym(sqlite3_vfs *pVfs, void *p, const char*zSym))(void);
  7991  static void apndDlClose(sqlite3_vfs*, void*);
  7992  static int apndRandomness(sqlite3_vfs*, int nByte, char *zOut);
  7993  static int apndSleep(sqlite3_vfs*, int microseconds);
  7994  static int apndCurrentTime(sqlite3_vfs*, double*);
  7995  static int apndGetLastError(sqlite3_vfs*, int, char *);
  7996  static int apndCurrentTimeInt64(sqlite3_vfs*, sqlite3_int64*);
  7997  static int apndSetSystemCall(sqlite3_vfs*, const char*,sqlite3_syscall_ptr);
  7998  static sqlite3_syscall_ptr apndGetSystemCall(sqlite3_vfs*, const char *z);
  7999  static const char *apndNextSystemCall(sqlite3_vfs*, const char *zName);
  8000  
  8001  static sqlite3_vfs apnd_vfs = {
  8002    3,                            /* iVersion (set when registered) */
  8003    0,                            /* szOsFile (set when registered) */
  8004    1024,                         /* mxPathname */
  8005    0,                            /* pNext */
  8006    "apndvfs",                    /* zName */
  8007    0,                            /* pAppData (set when registered) */ 
  8008    apndOpen,                     /* xOpen */
  8009    apndDelete,                   /* xDelete */
  8010    apndAccess,                   /* xAccess */
  8011    apndFullPathname,             /* xFullPathname */
  8012    apndDlOpen,                   /* xDlOpen */
  8013    apndDlError,                  /* xDlError */
  8014    apndDlSym,                    /* xDlSym */
  8015    apndDlClose,                  /* xDlClose */
  8016    apndRandomness,               /* xRandomness */
  8017    apndSleep,                    /* xSleep */
  8018    apndCurrentTime,              /* xCurrentTime */
  8019    apndGetLastError,             /* xGetLastError */
  8020    apndCurrentTimeInt64,         /* xCurrentTimeInt64 */
  8021    apndSetSystemCall,            /* xSetSystemCall */
  8022    apndGetSystemCall,            /* xGetSystemCall */
  8023    apndNextSystemCall            /* xNextSystemCall */
  8024  };
  8025  
  8026  static const sqlite3_io_methods apnd_io_methods = {
  8027    3,                              /* iVersion */
  8028    apndClose,                      /* xClose */
  8029    apndRead,                       /* xRead */
  8030    apndWrite,                      /* xWrite */
  8031    apndTruncate,                   /* xTruncate */
  8032    apndSync,                       /* xSync */
  8033    apndFileSize,                   /* xFileSize */
  8034    apndLock,                       /* xLock */
  8035    apndUnlock,                     /* xUnlock */
  8036    apndCheckReservedLock,          /* xCheckReservedLock */
  8037    apndFileControl,                /* xFileControl */
  8038    apndSectorSize,                 /* xSectorSize */
  8039    apndDeviceCharacteristics,      /* xDeviceCharacteristics */
  8040    apndShmMap,                     /* xShmMap */
  8041    apndShmLock,                    /* xShmLock */
  8042    apndShmBarrier,                 /* xShmBarrier */
  8043    apndShmUnmap,                   /* xShmUnmap */
  8044    apndFetch,                      /* xFetch */
  8045    apndUnfetch                     /* xUnfetch */
  8046  };
  8047  
  8048  /*
  8049  ** Close an apnd-file.
  8050  */
  8051  static int apndClose(sqlite3_file *pFile){
  8052    pFile = ORIGFILE(pFile);
  8053    return pFile->pMethods->xClose(pFile);
  8054  }
  8055  
  8056  /*
  8057  ** Read data from an apnd-file.
  8058  */
  8059  static int apndRead(
  8060    sqlite3_file *pFile, 
  8061    void *zBuf, 
  8062    int iAmt, 
  8063    sqlite_int64 iOfst
  8064  ){
  8065    ApndFile *paf = (ApndFile *)pFile;
  8066    pFile = ORIGFILE(pFile);
  8067    return pFile->pMethods->xRead(pFile, zBuf, iAmt, paf->iPgOne+iOfst);
  8068  }
  8069  
  8070  /*
  8071  ** Add the append-mark onto what should become the end of the file.
  8072  *  If and only if this succeeds, internal ApndFile.iMark is updated.
  8073  *  Parameter iWriteEnd is the appendvfs-relative offset of the new mark.
  8074  */
  8075  static int apndWriteMark(
  8076    ApndFile *paf,
  8077    sqlite3_file *pFile,
  8078    sqlite_int64 iWriteEnd
  8079  ){
  8080    sqlite_int64 iPgOne = paf->iPgOne;
  8081    unsigned char a[APND_MARK_SIZE];
  8082    int i = APND_MARK_FOS_SZ;
  8083    int rc;
  8084    assert(pFile == ORIGFILE(paf));
  8085    memcpy(a, APND_MARK_PREFIX, APND_MARK_PREFIX_SZ);
  8086    while( --i >= 0 ){
  8087      a[APND_MARK_PREFIX_SZ+i] = (unsigned char)(iPgOne & 0xff);
  8088      iPgOne >>= 8;
  8089    }
  8090    iWriteEnd += paf->iPgOne;
  8091    if( SQLITE_OK==(rc = pFile->pMethods->xWrite
  8092                    (pFile, a, APND_MARK_SIZE, iWriteEnd)) ){
  8093      paf->iMark = iWriteEnd;
  8094    }
  8095    return rc;
  8096  }
  8097  
  8098  /*
  8099  ** Write data to an apnd-file.
  8100  */
  8101  static int apndWrite(
  8102    sqlite3_file *pFile,
  8103    const void *zBuf,
  8104    int iAmt,
  8105    sqlite_int64 iOfst
  8106  ){
  8107    ApndFile *paf = (ApndFile *)pFile;
  8108    sqlite_int64 iWriteEnd = iOfst + iAmt;
  8109    if( iWriteEnd>=APND_MAX_SIZE ) return SQLITE_FULL;
  8110    pFile = ORIGFILE(pFile);
  8111    /* If append-mark is absent or will be overwritten, write it. */
  8112    if( paf->iMark < 0 || paf->iPgOne + iWriteEnd > paf->iMark ){
  8113      int rc = apndWriteMark(paf, pFile, iWriteEnd);
  8114      if( SQLITE_OK!=rc ) return rc;
  8115    }
  8116    return pFile->pMethods->xWrite(pFile, zBuf, iAmt, paf->iPgOne+iOfst);
  8117  }
  8118  
  8119  /*
  8120  ** Truncate an apnd-file.
  8121  */
  8122  static int apndTruncate(sqlite3_file *pFile, sqlite_int64 size){
  8123    ApndFile *paf = (ApndFile *)pFile;
  8124    pFile = ORIGFILE(pFile);
  8125    /* The append mark goes out first so truncate failure does not lose it. */
  8126    if( SQLITE_OK!=apndWriteMark(paf, pFile, size) ) return SQLITE_IOERR;
  8127    /* Truncate underlying file just past append mark */
  8128    return pFile->pMethods->xTruncate(pFile, paf->iMark+APND_MARK_SIZE);
  8129  }
  8130  
  8131  /*
  8132  ** Sync an apnd-file.
  8133  */
  8134  static int apndSync(sqlite3_file *pFile, int flags){
  8135    pFile = ORIGFILE(pFile);
  8136    return pFile->pMethods->xSync(pFile, flags);
  8137  }
  8138  
  8139  /*
  8140  ** Return the current file-size of an apnd-file.
  8141  ** If the append mark is not yet there, the file-size is 0.
  8142  */
  8143  static int apndFileSize(sqlite3_file *pFile, sqlite_int64 *pSize){
  8144    ApndFile *paf = (ApndFile *)pFile;
  8145    *pSize = ( paf->iMark >= 0 )? (paf->iMark - paf->iPgOne) : 0;
  8146    return SQLITE_OK;
  8147  }
  8148  
  8149  /*
  8150  ** Lock an apnd-file.
  8151  */
  8152  static int apndLock(sqlite3_file *pFile, int eLock){
  8153    pFile = ORIGFILE(pFile);
  8154    return pFile->pMethods->xLock(pFile, eLock);
  8155  }
  8156  
  8157  /*
  8158  ** Unlock an apnd-file.
  8159  */
  8160  static int apndUnlock(sqlite3_file *pFile, int eLock){
  8161    pFile = ORIGFILE(pFile);
  8162    return pFile->pMethods->xUnlock(pFile, eLock);
  8163  }
  8164  
  8165  /*
  8166  ** Check if another file-handle holds a RESERVED lock on an apnd-file.
  8167  */
  8168  static int apndCheckReservedLock(sqlite3_file *pFile, int *pResOut){
  8169    pFile = ORIGFILE(pFile);
  8170    return pFile->pMethods->xCheckReservedLock(pFile, pResOut);
  8171  }
  8172  
  8173  /*
  8174  ** File control method. For custom operations on an apnd-file.
  8175  */
  8176  static int apndFileControl(sqlite3_file *pFile, int op, void *pArg){
  8177    ApndFile *paf = (ApndFile *)pFile;
  8178    int rc;
  8179    pFile = ORIGFILE(pFile);
  8180    if( op==SQLITE_FCNTL_SIZE_HINT ) *(sqlite3_int64*)pArg += paf->iPgOne;
  8181    rc = pFile->pMethods->xFileControl(pFile, op, pArg);
  8182    if( rc==SQLITE_OK && op==SQLITE_FCNTL_VFSNAME ){
  8183      *(char**)pArg = sqlite3_mprintf("apnd(%lld)/%z", paf->iPgOne,*(char**)pArg);
  8184    }
  8185    return rc;
  8186  }
  8187  
  8188  /*
  8189  ** Return the sector-size in bytes for an apnd-file.
  8190  */
  8191  static int apndSectorSize(sqlite3_file *pFile){
  8192    pFile = ORIGFILE(pFile);
  8193    return pFile->pMethods->xSectorSize(pFile);
  8194  }
  8195  
  8196  /*
  8197  ** Return the device characteristic flags supported by an apnd-file.
  8198  */
  8199  static int apndDeviceCharacteristics(sqlite3_file *pFile){
  8200    pFile = ORIGFILE(pFile);
  8201    return pFile->pMethods->xDeviceCharacteristics(pFile);
  8202  }
  8203  
  8204  /* Create a shared memory file mapping */
  8205  static int apndShmMap(
  8206    sqlite3_file *pFile,
  8207    int iPg,
  8208    int pgsz,
  8209    int bExtend,
  8210    void volatile **pp
  8211  ){
  8212    pFile = ORIGFILE(pFile);
  8213    return pFile->pMethods->xShmMap(pFile,iPg,pgsz,bExtend,pp);
  8214  }
  8215  
  8216  /* Perform locking on a shared-memory segment */
  8217  static int apndShmLock(sqlite3_file *pFile, int offset, int n, int flags){
  8218    pFile = ORIGFILE(pFile);
  8219    return pFile->pMethods->xShmLock(pFile,offset,n,flags);
  8220  }
  8221  
  8222  /* Memory barrier operation on shared memory */
  8223  static void apndShmBarrier(sqlite3_file *pFile){
  8224    pFile = ORIGFILE(pFile);
  8225    pFile->pMethods->xShmBarrier(pFile);
  8226  }
  8227  
  8228  /* Unmap a shared memory segment */
  8229  static int apndShmUnmap(sqlite3_file *pFile, int deleteFlag){
  8230    pFile = ORIGFILE(pFile);
  8231    return pFile->pMethods->xShmUnmap(pFile,deleteFlag);
  8232  }
  8233  
  8234  /* Fetch a page of a memory-mapped file */
  8235  static int apndFetch(
  8236    sqlite3_file *pFile,
  8237    sqlite3_int64 iOfst,
  8238    int iAmt,
  8239    void **pp
  8240  ){
  8241    ApndFile *p = (ApndFile *)pFile;
  8242    if( p->iMark < 0 || iOfst+iAmt > p->iMark ){
  8243      return SQLITE_IOERR; /* Cannot read what is not yet there. */
  8244    }
  8245    pFile = ORIGFILE(pFile);
  8246    return pFile->pMethods->xFetch(pFile, iOfst+p->iPgOne, iAmt, pp);
  8247  }
  8248  
  8249  /* Release a memory-mapped page */
  8250  static int apndUnfetch(sqlite3_file *pFile, sqlite3_int64 iOfst, void *pPage){
  8251    ApndFile *p = (ApndFile *)pFile;
  8252    pFile = ORIGFILE(pFile);
  8253    return pFile->pMethods->xUnfetch(pFile, iOfst+p->iPgOne, pPage);
  8254  }
  8255  
  8256  /*
  8257  ** Try to read the append-mark off the end of a file.  Return the
  8258  ** start of the appended database if the append-mark is present.
  8259  ** If there is no valid append-mark, return -1;
  8260  **
  8261  ** An append-mark is only valid if the NNNNNNNN start-of-database offset
  8262  ** indicates that the appended database contains at least one page.  The
  8263  ** start-of-database value must be a multiple of 512.
  8264  */
  8265  static sqlite3_int64 apndReadMark(sqlite3_int64 sz, sqlite3_file *pFile){
  8266    int rc, i;
  8267    sqlite3_int64 iMark;
  8268    int msbs = 8 * (APND_MARK_FOS_SZ-1);
  8269    unsigned char a[APND_MARK_SIZE];
  8270  
  8271    if( APND_MARK_SIZE!=(sz & 0x1ff) ) return -1;
  8272    rc = pFile->pMethods->xRead(pFile, a, APND_MARK_SIZE, sz-APND_MARK_SIZE);
  8273    if( rc ) return -1;
  8274    if( memcmp(a, APND_MARK_PREFIX, APND_MARK_PREFIX_SZ)!=0 ) return -1;
  8275    iMark = ((sqlite3_int64)(a[APND_MARK_PREFIX_SZ] & 0x7f)) << msbs;
  8276    for(i=1; i<8; i++){
  8277      msbs -= 8;
  8278      iMark |= (sqlite3_int64)a[APND_MARK_PREFIX_SZ+i]<<msbs;
  8279    }
  8280    if( iMark > (sz - APND_MARK_SIZE - 512) ) return -1;
  8281    if( iMark & 0x1ff ) return -1;
  8282    return iMark;
  8283  }
  8284  
  8285  static const char apvfsSqliteHdr[] = "SQLite format 3";
  8286  /*
  8287  ** Check to see if the file is an appendvfs SQLite database file.
  8288  ** Return true iff it is such. Parameter sz is the file's size.
  8289  */
  8290  static int apndIsAppendvfsDatabase(sqlite3_int64 sz, sqlite3_file *pFile){
  8291    int rc;
  8292    char zHdr[16];
  8293    sqlite3_int64 iMark = apndReadMark(sz, pFile);
  8294    if( iMark>=0 ){
  8295      /* If file has the correct end-marker, the expected odd size, and the
  8296      ** SQLite DB type marker where the end-marker puts it, then it
  8297      ** is an appendvfs database.
  8298      */
  8299      rc = pFile->pMethods->xRead(pFile, zHdr, sizeof(zHdr), iMark);
  8300      if( SQLITE_OK==rc
  8301       && memcmp(zHdr, apvfsSqliteHdr, sizeof(zHdr))==0
  8302       && (sz & 0x1ff) == APND_MARK_SIZE
  8303       && sz>=512+APND_MARK_SIZE
  8304      ){
  8305        return 1; /* It's an appendvfs database */
  8306      }
  8307    }
  8308    return 0;
  8309  }
  8310  
  8311  /*
  8312  ** Check to see if the file is an ordinary SQLite database file.
  8313  ** Return true iff so. Parameter sz is the file's size.
  8314  */
  8315  static int apndIsOrdinaryDatabaseFile(sqlite3_int64 sz, sqlite3_file *pFile){
  8316    char zHdr[16];
  8317    if( apndIsAppendvfsDatabase(sz, pFile) /* rule 2 */
  8318     || (sz & 0x1ff) != 0
  8319     || SQLITE_OK!=pFile->pMethods->xRead(pFile, zHdr, sizeof(zHdr), 0)
  8320     || memcmp(zHdr, apvfsSqliteHdr, sizeof(zHdr))!=0
  8321    ){
  8322      return 0;
  8323    }else{
  8324      return 1;
  8325    }
  8326  }
  8327  
  8328  /*
  8329  ** Open an apnd file handle.
  8330  */
  8331  static int apndOpen(
  8332    sqlite3_vfs *pApndVfs,
  8333    const char *zName,
  8334    sqlite3_file *pFile,
  8335    int flags,
  8336    int *pOutFlags
  8337  ){
  8338    ApndFile *pApndFile = (ApndFile*)pFile;
  8339    sqlite3_file *pBaseFile = ORIGFILE(pFile);
  8340    sqlite3_vfs *pBaseVfs = ORIGVFS(pApndVfs);
  8341    int rc;
  8342    sqlite3_int64 sz = 0;
  8343    if( (flags & SQLITE_OPEN_MAIN_DB)==0 ){
  8344      /* The appendvfs is not to be used for transient or temporary databases.
  8345      ** Just use the base VFS open to initialize the given file object and
  8346      ** open the underlying file. (Appendvfs is then unused for this file.)
  8347      */
  8348      return pBaseVfs->xOpen(pBaseVfs, zName, pFile, flags, pOutFlags);
  8349    }
  8350    memset(pApndFile, 0, sizeof(ApndFile));
  8351    pFile->pMethods = &apnd_io_methods;
  8352    pApndFile->iMark = -1;    /* Append mark not yet written */
  8353  
  8354    rc = pBaseVfs->xOpen(pBaseVfs, zName, pBaseFile, flags, pOutFlags);
  8355    if( rc==SQLITE_OK ){
  8356      rc = pBaseFile->pMethods->xFileSize(pBaseFile, &sz);
  8357      if( rc ){
  8358        pBaseFile->pMethods->xClose(pBaseFile);
  8359      }
  8360    }
  8361    if( rc ){
  8362      pFile->pMethods = 0;
  8363      return rc;
  8364    }
  8365    if( apndIsOrdinaryDatabaseFile(sz, pBaseFile) ){
  8366      /* The file being opened appears to be just an ordinary DB. Copy
  8367      ** the base dispatch-table so this instance mimics the base VFS. 
  8368      */
  8369      memmove(pApndFile, pBaseFile, pBaseVfs->szOsFile);
  8370      return SQLITE_OK;
  8371    }
  8372    pApndFile->iPgOne = apndReadMark(sz, pFile);
  8373    if( pApndFile->iPgOne>=0 ){
  8374      pApndFile->iMark = sz - APND_MARK_SIZE; /* Append mark found */
  8375      return SQLITE_OK;
  8376    }
  8377    if( (flags & SQLITE_OPEN_CREATE)==0 ){
  8378      pBaseFile->pMethods->xClose(pBaseFile);
  8379      rc = SQLITE_CANTOPEN;
  8380      pFile->pMethods = 0;
  8381    }else{
  8382      /* Round newly added appendvfs location to #define'd page boundary. 
  8383      ** Note that nothing has yet been written to the underlying file.
  8384      ** The append mark will be written along with first content write.
  8385      ** Until then, paf->iMark value indicates it is not yet written.
  8386      */
  8387      pApndFile->iPgOne = APND_START_ROUNDUP(sz);
  8388    }
  8389    return rc;
  8390  }
  8391  
  8392  /*
  8393  ** Delete an apnd file.
  8394  ** For an appendvfs, this could mean delete the appendvfs portion,
  8395  ** leaving the appendee as it was before it gained an appendvfs.
  8396  ** For now, this code deletes the underlying file too.
  8397  */
  8398  static int apndDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){
  8399    return ORIGVFS(pVfs)->xDelete(ORIGVFS(pVfs), zPath, dirSync);
  8400  }
  8401  
  8402  /*
  8403  ** All other VFS methods are pass-thrus.
  8404  */
  8405  static int apndAccess(
  8406    sqlite3_vfs *pVfs, 
  8407    const char *zPath, 
  8408    int flags, 
  8409    int *pResOut
  8410  ){
  8411    return ORIGVFS(pVfs)->xAccess(ORIGVFS(pVfs), zPath, flags, pResOut);
  8412  }
  8413  static int apndFullPathname(
  8414    sqlite3_vfs *pVfs, 
  8415    const char *zPath, 
  8416    int nOut, 
  8417    char *zOut
  8418  ){
  8419    return ORIGVFS(pVfs)->xFullPathname(ORIGVFS(pVfs),zPath,nOut,zOut);
  8420  }
  8421  static void *apndDlOpen(sqlite3_vfs *pVfs, const char *zPath){
  8422    return ORIGVFS(pVfs)->xDlOpen(ORIGVFS(pVfs), zPath);
  8423  }
  8424  static void apndDlError(sqlite3_vfs *pVfs, int nByte, char *zErrMsg){
  8425    ORIGVFS(pVfs)->xDlError(ORIGVFS(pVfs), nByte, zErrMsg);
  8426  }
  8427  static void (*apndDlSym(sqlite3_vfs *pVfs, void *p, const char *zSym))(void){
  8428    return ORIGVFS(pVfs)->xDlSym(ORIGVFS(pVfs), p, zSym);
  8429  }
  8430  static void apndDlClose(sqlite3_vfs *pVfs, void *pHandle){
  8431    ORIGVFS(pVfs)->xDlClose(ORIGVFS(pVfs), pHandle);
  8432  }
  8433  static int apndRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){
  8434    return ORIGVFS(pVfs)->xRandomness(ORIGVFS(pVfs), nByte, zBufOut);
  8435  }
  8436  static int apndSleep(sqlite3_vfs *pVfs, int nMicro){
  8437    return ORIGVFS(pVfs)->xSleep(ORIGVFS(pVfs), nMicro);
  8438  }
  8439  static int apndCurrentTime(sqlite3_vfs *pVfs, double *pTimeOut){
  8440    return ORIGVFS(pVfs)->xCurrentTime(ORIGVFS(pVfs), pTimeOut);
  8441  }
  8442  static int apndGetLastError(sqlite3_vfs *pVfs, int a, char *b){
  8443    return ORIGVFS(pVfs)->xGetLastError(ORIGVFS(pVfs), a, b);
  8444  }
  8445  static int apndCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *p){
  8446    return ORIGVFS(pVfs)->xCurrentTimeInt64(ORIGVFS(pVfs), p);
  8447  }
  8448  static int apndSetSystemCall(
  8449    sqlite3_vfs *pVfs,
  8450    const char *zName,
  8451    sqlite3_syscall_ptr pCall
  8452  ){
  8453    return ORIGVFS(pVfs)->xSetSystemCall(ORIGVFS(pVfs),zName,pCall);
  8454  }
  8455  static sqlite3_syscall_ptr apndGetSystemCall(
  8456    sqlite3_vfs *pVfs,
  8457    const char *zName
  8458  ){
  8459    return ORIGVFS(pVfs)->xGetSystemCall(ORIGVFS(pVfs),zName);
  8460  }
  8461  static const char *apndNextSystemCall(sqlite3_vfs *pVfs, const char *zName){
  8462    return ORIGVFS(pVfs)->xNextSystemCall(ORIGVFS(pVfs), zName);
  8463  }
  8464  
  8465    
  8466  #ifdef _WIN32
  8467  
  8468  #endif
  8469  /* 
  8470  ** This routine is called when the extension is loaded.
  8471  ** Register the new VFS.
  8472  */
  8473  int sqlite3_appendvfs_init(
  8474    sqlite3 *db, 
  8475    char **pzErrMsg, 
  8476    const sqlite3_api_routines *pApi
  8477  ){
  8478    int rc = SQLITE_OK;
  8479    sqlite3_vfs *pOrig;
  8480    SQLITE_EXTENSION_INIT2(pApi);
  8481    (void)pzErrMsg;
  8482    (void)db;
  8483    pOrig = sqlite3_vfs_find(0);
  8484    if( pOrig==0 ) return SQLITE_ERROR;
  8485    apnd_vfs.iVersion = pOrig->iVersion;
  8486    apnd_vfs.pAppData = pOrig;
  8487    apnd_vfs.szOsFile = pOrig->szOsFile + sizeof(ApndFile);
  8488    rc = sqlite3_vfs_register(&apnd_vfs, 0);
  8489  #ifdef APPENDVFS_TEST
  8490    if( rc==SQLITE_OK ){
  8491      rc = sqlite3_auto_extension((void(*)(void))apndvfsRegister);
  8492    }
  8493  #endif
  8494    if( rc==SQLITE_OK ) rc = SQLITE_OK_LOAD_PERMANENTLY;
  8495    return rc;
  8496  }
  8497  
  8498  /************************* End ../ext/misc/appendvfs.c ********************/
  8499  #endif
  8500  #ifdef SQLITE_HAVE_ZLIB
  8501  /************************* Begin ../ext/misc/zipfile.c ******************/
  8502  /*
  8503  ** 2017-12-26
  8504  **
  8505  ** The author disclaims copyright to this source code.  In place of
  8506  ** a legal notice, here is a blessing:
  8507  **
  8508  **    May you do good and not evil.
  8509  **    May you find forgiveness for yourself and forgive others.
  8510  **    May you share freely, never taking more than you give.
  8511  **
  8512  ******************************************************************************
  8513  **
  8514  ** This file implements a virtual table for reading and writing ZIP archive
  8515  ** files.
  8516  **
  8517  ** Usage example:
  8518  **
  8519  **     SELECT name, sz, datetime(mtime,'unixepoch') FROM zipfile($filename);
  8520  **
  8521  ** Current limitations:
  8522  **
  8523  **    *  No support for encryption
  8524  **    *  No support for ZIP archives spanning multiple files
  8525  **    *  No support for zip64 extensions
  8526  **    *  Only the "inflate/deflate" (zlib) compression method is supported
  8527  */
  8528  /* #include "sqlite3ext.h" */
  8529  SQLITE_EXTENSION_INIT1
  8530  #include <stdio.h>
  8531  #include <string.h>
  8532  #include <assert.h>
  8533  
  8534  #include <zlib.h>
  8535  
  8536  #ifndef SQLITE_OMIT_VIRTUALTABLE
  8537  
  8538  #ifndef SQLITE_AMALGAMATION
  8539  
  8540  #ifndef UINT32_TYPE
  8541  # ifdef HAVE_UINT32_T
  8542  #  define UINT32_TYPE uint32_t
  8543  # else
  8544  #  define UINT32_TYPE unsigned int
  8545  # endif
  8546  #endif
  8547  #ifndef UINT16_TYPE
  8548  # ifdef HAVE_UINT16_T
  8549  #  define UINT16_TYPE uint16_t
  8550  # else
  8551  #  define UINT16_TYPE unsigned short int
  8552  # endif
  8553  #endif
  8554  /* typedef sqlite3_int64 i64; */
  8555  /* typedef unsigned char u8; */
  8556  /* typedef UINT32_TYPE u32;           // 4-byte unsigned integer // */
  8557  /* typedef UINT16_TYPE u16;           // 2-byte unsigned integer // */
  8558  #define MIN(a,b) ((a)<(b) ? (a) : (b))
  8559  
  8560  #if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST)
  8561  # define SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS 1
  8562  #endif
  8563  #if defined(SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS)
  8564  # define ALWAYS(X)      (1)
  8565  # define NEVER(X)       (0)
  8566  #elif !defined(NDEBUG)
  8567  # define ALWAYS(X)      ((X)?1:(assert(0),0))
  8568  # define NEVER(X)       ((X)?(assert(0),1):0)
  8569  #else
  8570  # define ALWAYS(X)      (X)
  8571  # define NEVER(X)       (X)
  8572  #endif
  8573  
  8574  #endif   /* SQLITE_AMALGAMATION */
  8575  
  8576  /*
  8577  ** Definitions for mode bitmasks S_IFDIR, S_IFREG and S_IFLNK.
  8578  **
  8579  ** In some ways it would be better to obtain these values from system 
  8580  ** header files. But, the dependency is undesirable and (a) these
  8581  ** have been stable for decades, (b) the values are part of POSIX and
  8582  ** are also made explicit in [man stat], and (c) are part of the 
  8583  ** file format for zip archives.
  8584  */
  8585  #ifndef S_IFDIR
  8586  # define S_IFDIR 0040000
  8587  #endif
  8588  #ifndef S_IFREG
  8589  # define S_IFREG 0100000
  8590  #endif
  8591  #ifndef S_IFLNK
  8592  # define S_IFLNK 0120000
  8593  #endif
  8594  
  8595  static const char ZIPFILE_SCHEMA[] = 
  8596    "CREATE TABLE y("
  8597      "name PRIMARY KEY,"  /* 0: Name of file in zip archive */
  8598      "mode,"              /* 1: POSIX mode for file */
  8599      "mtime,"             /* 2: Last modification time (secs since 1970)*/
  8600      "sz,"                /* 3: Size of object */
  8601      "rawdata,"           /* 4: Raw data */
  8602      "data,"              /* 5: Uncompressed data */
  8603      "method,"            /* 6: Compression method (integer) */
  8604      "z HIDDEN"           /* 7: Name of zip file */
  8605    ") WITHOUT ROWID;";
  8606  
  8607  #define ZIPFILE_F_COLUMN_IDX 7    /* Index of column "file" in the above */
  8608  #define ZIPFILE_BUFFER_SIZE (64*1024)
  8609  
  8610  
  8611  /*
  8612  ** Magic numbers used to read and write zip files.
  8613  **
  8614  ** ZIPFILE_NEWENTRY_MADEBY:
  8615  **   Use this value for the "version-made-by" field in new zip file
  8616  **   entries. The upper byte indicates "unix", and the lower byte 
  8617  **   indicates that the zip file matches pkzip specification 3.0. 
  8618  **   This is what info-zip seems to do.
  8619  **
  8620  ** ZIPFILE_NEWENTRY_REQUIRED:
  8621  **   Value for "version-required-to-extract" field of new entries.
  8622  **   Version 2.0 is required to support folders and deflate compression.
  8623  **
  8624  ** ZIPFILE_NEWENTRY_FLAGS:
  8625  **   Value for "general-purpose-bit-flags" field of new entries. Bit
  8626  **   11 means "utf-8 filename and comment".
  8627  **
  8628  ** ZIPFILE_SIGNATURE_CDS:
  8629  **   First 4 bytes of a valid CDS record.
  8630  **
  8631  ** ZIPFILE_SIGNATURE_LFH:
  8632  **   First 4 bytes of a valid LFH record.
  8633  **
  8634  ** ZIPFILE_SIGNATURE_EOCD
  8635  **   First 4 bytes of a valid EOCD record.
  8636  */
  8637  #define ZIPFILE_EXTRA_TIMESTAMP   0x5455
  8638  #define ZIPFILE_NEWENTRY_MADEBY   ((3<<8) + 30)
  8639  #define ZIPFILE_NEWENTRY_REQUIRED 20
  8640  #define ZIPFILE_NEWENTRY_FLAGS    0x800
  8641  #define ZIPFILE_SIGNATURE_CDS     0x02014b50
  8642  #define ZIPFILE_SIGNATURE_LFH     0x04034b50
  8643  #define ZIPFILE_SIGNATURE_EOCD    0x06054b50
  8644  
  8645  /*
  8646  ** The sizes of the fixed-size part of each of the three main data 
  8647  ** structures in a zip archive.
  8648  */
  8649  #define ZIPFILE_LFH_FIXED_SZ      30
  8650  #define ZIPFILE_EOCD_FIXED_SZ     22
  8651  #define ZIPFILE_CDS_FIXED_SZ      46
  8652  
  8653  /*
  8654  *** 4.3.16  End of central directory record:
  8655  ***
  8656  ***   end of central dir signature    4 bytes  (0x06054b50)
  8657  ***   number of this disk             2 bytes
  8658  ***   number of the disk with the
  8659  ***   start of the central directory  2 bytes
  8660  ***   total number of entries in the
  8661  ***   central directory on this disk  2 bytes
  8662  ***   total number of entries in
  8663  ***   the central directory           2 bytes
  8664  ***   size of the central directory   4 bytes
  8665  ***   offset of start of central
  8666  ***   directory with respect to
  8667  ***   the starting disk number        4 bytes
  8668  ***   .ZIP file comment length        2 bytes
  8669  ***   .ZIP file comment       (variable size)
  8670  */
  8671  typedef struct ZipfileEOCD ZipfileEOCD;
  8672  struct ZipfileEOCD {
  8673    u16 iDisk;
  8674    u16 iFirstDisk;
  8675    u16 nEntry;
  8676    u16 nEntryTotal;
  8677    u32 nSize;
  8678    u32 iOffset;
  8679  };
  8680  
  8681  /*
  8682  *** 4.3.12  Central directory structure:
  8683  ***
  8684  *** ...
  8685  ***
  8686  ***   central file header signature   4 bytes  (0x02014b50)
  8687  ***   version made by                 2 bytes
  8688  ***   version needed to extract       2 bytes
  8689  ***   general purpose bit flag        2 bytes
  8690  ***   compression method              2 bytes
  8691  ***   last mod file time              2 bytes
  8692  ***   last mod file date              2 bytes
  8693  ***   crc-32                          4 bytes
  8694  ***   compressed size                 4 bytes
  8695  ***   uncompressed size               4 bytes
  8696  ***   file name length                2 bytes
  8697  ***   extra field length              2 bytes
  8698  ***   file comment length             2 bytes
  8699  ***   disk number start               2 bytes
  8700  ***   internal file attributes        2 bytes
  8701  ***   external file attributes        4 bytes
  8702  ***   relative offset of local header 4 bytes
  8703  */
  8704  typedef struct ZipfileCDS ZipfileCDS;
  8705  struct ZipfileCDS {
  8706    u16 iVersionMadeBy;
  8707    u16 iVersionExtract;
  8708    u16 flags;
  8709    u16 iCompression;
  8710    u16 mTime;
  8711    u16 mDate;
  8712    u32 crc32;
  8713    u32 szCompressed;
  8714    u32 szUncompressed;
  8715    u16 nFile;
  8716    u16 nExtra;
  8717    u16 nComment;
  8718    u16 iDiskStart;
  8719    u16 iInternalAttr;
  8720    u32 iExternalAttr;
  8721    u32 iOffset;
  8722    char *zFile;                    /* Filename (sqlite3_malloc()) */
  8723  };
  8724  
  8725  /*
  8726  *** 4.3.7  Local file header:
  8727  ***
  8728  ***   local file header signature     4 bytes  (0x04034b50)
  8729  ***   version needed to extract       2 bytes
  8730  ***   general purpose bit flag        2 bytes
  8731  ***   compression method              2 bytes
  8732  ***   last mod file time              2 bytes
  8733  ***   last mod file date              2 bytes
  8734  ***   crc-32                          4 bytes
  8735  ***   compressed size                 4 bytes
  8736  ***   uncompressed size               4 bytes
  8737  ***   file name length                2 bytes
  8738  ***   extra field length              2 bytes
  8739  ***   
  8740  */
  8741  typedef struct ZipfileLFH ZipfileLFH;
  8742  struct ZipfileLFH {
  8743    u16 iVersionExtract;
  8744    u16 flags;
  8745    u16 iCompression;
  8746    u16 mTime;
  8747    u16 mDate;
  8748    u32 crc32;
  8749    u32 szCompressed;
  8750    u32 szUncompressed;
  8751    u16 nFile;
  8752    u16 nExtra;
  8753  };
  8754  
  8755  typedef struct ZipfileEntry ZipfileEntry;
  8756  struct ZipfileEntry {
  8757    ZipfileCDS cds;            /* Parsed CDS record */
  8758    u32 mUnixTime;             /* Modification time, in UNIX format */
  8759    u8 *aExtra;                /* cds.nExtra+cds.nComment bytes of extra data */
  8760    i64 iDataOff;              /* Offset to data in file (if aData==0) */
  8761    u8 *aData;                 /* cds.szCompressed bytes of compressed data */
  8762    ZipfileEntry *pNext;       /* Next element in in-memory CDS */
  8763  };
  8764  
  8765  /* 
  8766  ** Cursor type for zipfile tables.
  8767  */
  8768  typedef struct ZipfileCsr ZipfileCsr;
  8769  struct ZipfileCsr {
  8770    sqlite3_vtab_cursor base;  /* Base class - must be first */
  8771    i64 iId;                   /* Cursor ID */
  8772    u8 bEof;                   /* True when at EOF */
  8773    u8 bNoop;                  /* If next xNext() call is no-op */
  8774  
  8775    /* Used outside of write transactions */
  8776    FILE *pFile;               /* Zip file */
  8777    i64 iNextOff;              /* Offset of next record in central directory */
  8778    ZipfileEOCD eocd;          /* Parse of central directory record */
  8779  
  8780    ZipfileEntry *pFreeEntry;  /* Free this list when cursor is closed or reset */
  8781    ZipfileEntry *pCurrent;    /* Current entry */
  8782    ZipfileCsr *pCsrNext;      /* Next cursor on same virtual table */
  8783  };
  8784  
  8785  typedef struct ZipfileTab ZipfileTab;
  8786  struct ZipfileTab {
  8787    sqlite3_vtab base;         /* Base class - must be first */
  8788    char *zFile;               /* Zip file this table accesses (may be NULL) */
  8789    sqlite3 *db;               /* Host database connection */
  8790    u8 *aBuffer;               /* Temporary buffer used for various tasks */
  8791  
  8792    ZipfileCsr *pCsrList;      /* List of cursors */
  8793    i64 iNextCsrid;
  8794  
  8795    /* The following are used by write transactions only */
  8796    ZipfileEntry *pFirstEntry; /* Linked list of all files (if pWriteFd!=0) */
  8797    ZipfileEntry *pLastEntry;  /* Last element in pFirstEntry list */
  8798    FILE *pWriteFd;            /* File handle open on zip archive */
  8799    i64 szCurrent;             /* Current size of zip archive */
  8800    i64 szOrig;                /* Size of archive at start of transaction */
  8801  };
  8802  
  8803  /*
  8804  ** Set the error message contained in context ctx to the results of
  8805  ** vprintf(zFmt, ...).
  8806  */
  8807  static void zipfileCtxErrorMsg(sqlite3_context *ctx, const char *zFmt, ...){
  8808    char *zMsg = 0;
  8809    va_list ap;
  8810    va_start(ap, zFmt);
  8811    zMsg = sqlite3_vmprintf(zFmt, ap);
  8812    sqlite3_result_error(ctx, zMsg, -1);
  8813    sqlite3_free(zMsg);
  8814    va_end(ap);
  8815  }
  8816  
  8817  /*
  8818  ** If string zIn is quoted, dequote it in place. Otherwise, if the string
  8819  ** is not quoted, do nothing.
  8820  */
  8821  static void zipfileDequote(char *zIn){
  8822    char q = zIn[0];
  8823    if( q=='"' || q=='\'' || q=='`' || q=='[' ){
  8824      int iIn = 1;
  8825      int iOut = 0;
  8826      if( q=='[' ) q = ']';
  8827      while( ALWAYS(zIn[iIn]) ){
  8828        char c = zIn[iIn++];
  8829        if( c==q && zIn[iIn++]!=q ) break;
  8830        zIn[iOut++] = c;
  8831      }
  8832      zIn[iOut] = '\0';
  8833    }
  8834  }
  8835  
  8836  /*
  8837  ** Construct a new ZipfileTab virtual table object.
  8838  ** 
  8839  **   argv[0]   -> module name  ("zipfile")
  8840  **   argv[1]   -> database name
  8841  **   argv[2]   -> table name
  8842  **   argv[...] -> "column name" and other module argument fields.
  8843  */
  8844  static int zipfileConnect(
  8845    sqlite3 *db,
  8846    void *pAux,
  8847    int argc, const char *const*argv,
  8848    sqlite3_vtab **ppVtab,
  8849    char **pzErr
  8850  ){
  8851    int nByte = sizeof(ZipfileTab) + ZIPFILE_BUFFER_SIZE;
  8852    int nFile = 0;
  8853    const char *zFile = 0;
  8854    ZipfileTab *pNew = 0;
  8855    int rc;
  8856    (void)pAux;
  8857  
  8858    /* If the table name is not "zipfile", require that the argument be
  8859    ** specified. This stops zipfile tables from being created as:
  8860    **
  8861    **   CREATE VIRTUAL TABLE zzz USING zipfile();
  8862    **
  8863    ** It does not prevent:
  8864    **
  8865    **   CREATE VIRTUAL TABLE zipfile USING zipfile();
  8866    */
  8867    assert( 0==sqlite3_stricmp(argv[0], "zipfile") );
  8868    if( (0!=sqlite3_stricmp(argv[2], "zipfile") && argc<4) || argc>4 ){
  8869      *pzErr = sqlite3_mprintf("zipfile constructor requires one argument");
  8870      return SQLITE_ERROR;
  8871    }
  8872  
  8873    if( argc>3 ){
  8874      zFile = argv[3];
  8875      nFile = (int)strlen(zFile)+1;
  8876    }
  8877  
  8878    rc = sqlite3_declare_vtab(db, ZIPFILE_SCHEMA);
  8879    if( rc==SQLITE_OK ){
  8880      pNew = (ZipfileTab*)sqlite3_malloc64((sqlite3_int64)nByte+nFile);
  8881      if( pNew==0 ) return SQLITE_NOMEM;
  8882      memset(pNew, 0, nByte+nFile);
  8883      pNew->db = db;
  8884      pNew->aBuffer = (u8*)&pNew[1];
  8885      if( zFile ){
  8886        pNew->zFile = (char*)&pNew->aBuffer[ZIPFILE_BUFFER_SIZE];
  8887        memcpy(pNew->zFile, zFile, nFile);
  8888        zipfileDequote(pNew->zFile);
  8889      }
  8890    }
  8891    sqlite3_vtab_config(db, SQLITE_VTAB_DIRECTONLY);
  8892    *ppVtab = (sqlite3_vtab*)pNew;
  8893    return rc;
  8894  }
  8895  
  8896  /*
  8897  ** Free the ZipfileEntry structure indicated by the only argument.
  8898  */
  8899  static void zipfileEntryFree(ZipfileEntry *p){
  8900    if( p ){
  8901      sqlite3_free(p->cds.zFile);
  8902      sqlite3_free(p);
  8903    }
  8904  }
  8905  
  8906  /*
  8907  ** Release resources that should be freed at the end of a write 
  8908  ** transaction.
  8909  */
  8910  static void zipfileCleanupTransaction(ZipfileTab *pTab){
  8911    ZipfileEntry *pEntry;
  8912    ZipfileEntry *pNext;
  8913  
  8914    if( pTab->pWriteFd ){
  8915      fclose(pTab->pWriteFd);
  8916      pTab->pWriteFd = 0;
  8917    }
  8918    for(pEntry=pTab->pFirstEntry; pEntry; pEntry=pNext){
  8919      pNext = pEntry->pNext;
  8920      zipfileEntryFree(pEntry);
  8921    }
  8922    pTab->pFirstEntry = 0;
  8923    pTab->pLastEntry = 0;
  8924    pTab->szCurrent = 0;
  8925    pTab->szOrig = 0;
  8926  }
  8927  
  8928  /*
  8929  ** This method is the destructor for zipfile vtab objects.
  8930  */
  8931  static int zipfileDisconnect(sqlite3_vtab *pVtab){
  8932    zipfileCleanupTransaction((ZipfileTab*)pVtab);
  8933    sqlite3_free(pVtab);
  8934    return SQLITE_OK;
  8935  }
  8936  
  8937  /*
  8938  ** Constructor for a new ZipfileCsr object.
  8939  */
  8940  static int zipfileOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCsr){
  8941    ZipfileTab *pTab = (ZipfileTab*)p;
  8942    ZipfileCsr *pCsr;
  8943    pCsr = sqlite3_malloc(sizeof(*pCsr));
  8944    *ppCsr = (sqlite3_vtab_cursor*)pCsr;
  8945    if( pCsr==0 ){
  8946      return SQLITE_NOMEM;
  8947    }
  8948    memset(pCsr, 0, sizeof(*pCsr));
  8949    pCsr->iId = ++pTab->iNextCsrid;
  8950    pCsr->pCsrNext = pTab->pCsrList;
  8951    pTab->pCsrList = pCsr;
  8952    return SQLITE_OK;
  8953  }
  8954  
  8955  /*
  8956  ** Reset a cursor back to the state it was in when first returned
  8957  ** by zipfileOpen().
  8958  */
  8959  static void zipfileResetCursor(ZipfileCsr *pCsr){
  8960    ZipfileEntry *p;
  8961    ZipfileEntry *pNext;
  8962  
  8963    pCsr->bEof = 0;
  8964    if( pCsr->pFile ){
  8965      fclose(pCsr->pFile);
  8966      pCsr->pFile = 0;
  8967      zipfileEntryFree(pCsr->pCurrent);
  8968      pCsr->pCurrent = 0;
  8969    }
  8970  
  8971    for(p=pCsr->pFreeEntry; p; p=pNext){
  8972      pNext = p->pNext;
  8973      zipfileEntryFree(p);
  8974    }
  8975  }
  8976  
  8977  /*
  8978  ** Destructor for an ZipfileCsr.
  8979  */
  8980  static int zipfileClose(sqlite3_vtab_cursor *cur){
  8981    ZipfileCsr *pCsr = (ZipfileCsr*)cur;
  8982    ZipfileTab *pTab = (ZipfileTab*)(pCsr->base.pVtab);
  8983    ZipfileCsr **pp;
  8984    zipfileResetCursor(pCsr);
  8985  
  8986    /* Remove this cursor from the ZipfileTab.pCsrList list. */
  8987    for(pp=&pTab->pCsrList; *pp!=pCsr; pp=&((*pp)->pCsrNext));
  8988    *pp = pCsr->pCsrNext;
  8989  
  8990    sqlite3_free(pCsr);
  8991    return SQLITE_OK;
  8992  }
  8993  
  8994  /*
  8995  ** Set the error message for the virtual table associated with cursor
  8996  ** pCsr to the results of vprintf(zFmt, ...).
  8997  */
  8998  static void zipfileTableErr(ZipfileTab *pTab, const char *zFmt, ...){
  8999    va_list ap;
  9000    va_start(ap, zFmt);
  9001    sqlite3_free(pTab->base.zErrMsg);
  9002    pTab->base.zErrMsg = sqlite3_vmprintf(zFmt, ap);
  9003    va_end(ap);
  9004  }
  9005  static void zipfileCursorErr(ZipfileCsr *pCsr, const char *zFmt, ...){
  9006    va_list ap;
  9007    va_start(ap, zFmt);
  9008    sqlite3_free(pCsr->base.pVtab->zErrMsg);
  9009    pCsr->base.pVtab->zErrMsg = sqlite3_vmprintf(zFmt, ap);
  9010    va_end(ap);
  9011  }
  9012  
  9013  /*
  9014  ** Read nRead bytes of data from offset iOff of file pFile into buffer
  9015  ** aRead[]. Return SQLITE_OK if successful, or an SQLite error code
  9016  ** otherwise. 
  9017  **
  9018  ** If an error does occur, output variable (*pzErrmsg) may be set to point
  9019  ** to an English language error message. It is the responsibility of the
  9020  ** caller to eventually free this buffer using
  9021  ** sqlite3_free().
  9022  */
  9023  static int zipfileReadData(
  9024    FILE *pFile,                    /* Read from this file */
  9025    u8 *aRead,                      /* Read into this buffer */
  9026    int nRead,                      /* Number of bytes to read */
  9027    i64 iOff,                       /* Offset to read from */
  9028    char **pzErrmsg                 /* OUT: Error message (from sqlite3_malloc) */
  9029  ){
  9030    size_t n;
  9031    fseek(pFile, (long)iOff, SEEK_SET);
  9032    n = fread(aRead, 1, nRead, pFile);
  9033    if( (int)n!=nRead ){
  9034      *pzErrmsg = sqlite3_mprintf("error in fread()");
  9035      return SQLITE_ERROR;
  9036    }
  9037    return SQLITE_OK;
  9038  }
  9039  
  9040  static int zipfileAppendData(
  9041    ZipfileTab *pTab,
  9042    const u8 *aWrite,
  9043    int nWrite
  9044  ){
  9045    if( nWrite>0 ){
  9046      size_t n = nWrite;
  9047      fseek(pTab->pWriteFd, (long)pTab->szCurrent, SEEK_SET);
  9048      n = fwrite(aWrite, 1, nWrite, pTab->pWriteFd);
  9049      if( (int)n!=nWrite ){
  9050        pTab->base.zErrMsg = sqlite3_mprintf("error in fwrite()");
  9051        return SQLITE_ERROR;
  9052      }
  9053      pTab->szCurrent += nWrite;
  9054    }
  9055    return SQLITE_OK;
  9056  }
  9057  
  9058  /*
  9059  ** Read and return a 16-bit little-endian unsigned integer from buffer aBuf.
  9060  */
  9061  static u16 zipfileGetU16(const u8 *aBuf){
  9062    return (aBuf[1] << 8) + aBuf[0];
  9063  }
  9064  
  9065  /*
  9066  ** Read and return a 32-bit little-endian unsigned integer from buffer aBuf.
  9067  */
  9068  static u32 zipfileGetU32(const u8 *aBuf){
  9069    if( aBuf==0 ) return 0;
  9070    return ((u32)(aBuf[3]) << 24)
  9071         + ((u32)(aBuf[2]) << 16)
  9072         + ((u32)(aBuf[1]) <<  8)
  9073         + ((u32)(aBuf[0]) <<  0);
  9074  }
  9075  
  9076  /*
  9077  ** Write a 16-bit little endiate integer into buffer aBuf.
  9078  */
  9079  static void zipfilePutU16(u8 *aBuf, u16 val){
  9080    aBuf[0] = val & 0xFF;
  9081    aBuf[1] = (val>>8) & 0xFF;
  9082  }
  9083  
  9084  /*
  9085  ** Write a 32-bit little endiate integer into buffer aBuf.
  9086  */
  9087  static void zipfilePutU32(u8 *aBuf, u32 val){
  9088    aBuf[0] = val & 0xFF;
  9089    aBuf[1] = (val>>8) & 0xFF;
  9090    aBuf[2] = (val>>16) & 0xFF;
  9091    aBuf[3] = (val>>24) & 0xFF;
  9092  }
  9093  
  9094  #define zipfileRead32(aBuf) ( aBuf+=4, zipfileGetU32(aBuf-4) )
  9095  #define zipfileRead16(aBuf) ( aBuf+=2, zipfileGetU16(aBuf-2) )
  9096  
  9097  #define zipfileWrite32(aBuf,val) { zipfilePutU32(aBuf,val); aBuf+=4; }
  9098  #define zipfileWrite16(aBuf,val) { zipfilePutU16(aBuf,val); aBuf+=2; }
  9099  
  9100  /*
  9101  ** Magic numbers used to read CDS records.
  9102  */
  9103  #define ZIPFILE_CDS_NFILE_OFF        28
  9104  #define ZIPFILE_CDS_SZCOMPRESSED_OFF 20
  9105  
  9106  /*
  9107  ** Decode the CDS record in buffer aBuf into (*pCDS). Return SQLITE_ERROR
  9108  ** if the record is not well-formed, or SQLITE_OK otherwise.
  9109  */
  9110  static int zipfileReadCDS(u8 *aBuf, ZipfileCDS *pCDS){
  9111    u8 *aRead = aBuf;
  9112    u32 sig = zipfileRead32(aRead);
  9113    int rc = SQLITE_OK;
  9114    if( sig!=ZIPFILE_SIGNATURE_CDS ){
  9115      rc = SQLITE_ERROR;
  9116    }else{
  9117      pCDS->iVersionMadeBy = zipfileRead16(aRead);
  9118      pCDS->iVersionExtract = zipfileRead16(aRead);
  9119      pCDS->flags = zipfileRead16(aRead);
  9120      pCDS->iCompression = zipfileRead16(aRead);
  9121      pCDS->mTime = zipfileRead16(aRead);
  9122      pCDS->mDate = zipfileRead16(aRead);
  9123      pCDS->crc32 = zipfileRead32(aRead);
  9124      pCDS->szCompressed = zipfileRead32(aRead);
  9125      pCDS->szUncompressed = zipfileRead32(aRead);
  9126      assert( aRead==&aBuf[ZIPFILE_CDS_NFILE_OFF] );
  9127      pCDS->nFile = zipfileRead16(aRead);
  9128      pCDS->nExtra = zipfileRead16(aRead);
  9129      pCDS->nComment = zipfileRead16(aRead);
  9130      pCDS->iDiskStart = zipfileRead16(aRead);
  9131      pCDS->iInternalAttr = zipfileRead16(aRead);
  9132      pCDS->iExternalAttr = zipfileRead32(aRead);
  9133      pCDS->iOffset = zipfileRead32(aRead);
  9134      assert( aRead==&aBuf[ZIPFILE_CDS_FIXED_SZ] );
  9135    }
  9136  
  9137    return rc;
  9138  }
  9139  
  9140  /*
  9141  ** Decode the LFH record in buffer aBuf into (*pLFH). Return SQLITE_ERROR
  9142  ** if the record is not well-formed, or SQLITE_OK otherwise.
  9143  */
  9144  static int zipfileReadLFH(
  9145    u8 *aBuffer,
  9146    ZipfileLFH *pLFH
  9147  ){
  9148    u8 *aRead = aBuffer;
  9149    int rc = SQLITE_OK;
  9150  
  9151    u32 sig = zipfileRead32(aRead);
  9152    if( sig!=ZIPFILE_SIGNATURE_LFH ){
  9153      rc = SQLITE_ERROR;
  9154    }else{
  9155      pLFH->iVersionExtract = zipfileRead16(aRead);
  9156      pLFH->flags = zipfileRead16(aRead);
  9157      pLFH->iCompression = zipfileRead16(aRead);
  9158      pLFH->mTime = zipfileRead16(aRead);
  9159      pLFH->mDate = zipfileRead16(aRead);
  9160      pLFH->crc32 = zipfileRead32(aRead);
  9161      pLFH->szCompressed = zipfileRead32(aRead);
  9162      pLFH->szUncompressed = zipfileRead32(aRead);
  9163      pLFH->nFile = zipfileRead16(aRead);
  9164      pLFH->nExtra = zipfileRead16(aRead);
  9165    }
  9166    return rc;
  9167  }
  9168  
  9169  
  9170  /*
  9171  ** Buffer aExtra (size nExtra bytes) contains zip archive "extra" fields.
  9172  ** Scan through this buffer to find an "extra-timestamp" field. If one
  9173  ** exists, extract the 32-bit modification-timestamp from it and store
  9174  ** the value in output parameter *pmTime.
  9175  **
  9176  ** Zero is returned if no extra-timestamp record could be found (and so
  9177  ** *pmTime is left unchanged), or non-zero otherwise.
  9178  **
  9179  ** The general format of an extra field is:
  9180  **
  9181  **   Header ID    2 bytes
  9182  **   Data Size    2 bytes
  9183  **   Data         N bytes
  9184  */
  9185  static int zipfileScanExtra(u8 *aExtra, int nExtra, u32 *pmTime){
  9186    int ret = 0;
  9187    u8 *p = aExtra;
  9188    u8 *pEnd = &aExtra[nExtra];
  9189  
  9190    while( p<pEnd ){
  9191      u16 id = zipfileRead16(p);
  9192      u16 nByte = zipfileRead16(p);
  9193  
  9194      switch( id ){
  9195        case ZIPFILE_EXTRA_TIMESTAMP: {
  9196          u8 b = p[0];
  9197          if( b & 0x01 ){     /* 0x01 -> modtime is present */
  9198            *pmTime = zipfileGetU32(&p[1]);
  9199            ret = 1;
  9200          }
  9201          break;
  9202        }
  9203      }
  9204  
  9205      p += nByte;
  9206    }
  9207    return ret;
  9208  }
  9209  
  9210  /*
  9211  ** Convert the standard MS-DOS timestamp stored in the mTime and mDate
  9212  ** fields of the CDS structure passed as the only argument to a 32-bit
  9213  ** UNIX seconds-since-the-epoch timestamp. Return the result.
  9214  **
  9215  ** "Standard" MS-DOS time format:
  9216  **
  9217  **   File modification time:
  9218  **     Bits 00-04: seconds divided by 2
  9219  **     Bits 05-10: minute
  9220  **     Bits 11-15: hour
  9221  **   File modification date:
  9222  **     Bits 00-04: day
  9223  **     Bits 05-08: month (1-12)
  9224  **     Bits 09-15: years from 1980 
  9225  **
  9226  ** https://msdn.microsoft.com/en-us/library/9kkf9tah.aspx
  9227  */
  9228  static u32 zipfileMtime(ZipfileCDS *pCDS){
  9229    int Y,M,D,X1,X2,A,B,sec,min,hr;
  9230    i64 JDsec;
  9231    Y = (1980 + ((pCDS->mDate >> 9) & 0x7F));
  9232    M = ((pCDS->mDate >> 5) & 0x0F);
  9233    D = (pCDS->mDate & 0x1F);
  9234    sec = (pCDS->mTime & 0x1F)*2;
  9235    min = (pCDS->mTime >> 5) & 0x3F;
  9236    hr = (pCDS->mTime >> 11) & 0x1F;
  9237    if( M<=2 ){
  9238      Y--;
  9239      M += 12;
  9240    }
  9241    X1 = 36525*(Y+4716)/100;
  9242    X2 = 306001*(M+1)/10000;
  9243    A = Y/100;
  9244    B = 2 - A + (A/4);
  9245    JDsec = (i64)((X1 + X2 + D + B - 1524.5)*86400) + hr*3600 + min*60 + sec;
  9246    return (u32)(JDsec - (i64)24405875*(i64)8640);
  9247  }
  9248  
  9249  /*
  9250  ** The opposite of zipfileMtime(). This function populates the mTime and
  9251  ** mDate fields of the CDS structure passed as the first argument according
  9252  ** to the UNIX timestamp value passed as the second.
  9253  */
  9254  static void zipfileMtimeToDos(ZipfileCDS *pCds, u32 mUnixTime){
  9255    /* Convert unix timestamp to JD (2440588 is noon on 1/1/1970) */
  9256    i64 JD = (i64)2440588 + mUnixTime / (24*60*60);
  9257  
  9258    int A, B, C, D, E;
  9259    int yr, mon, day;
  9260    int hr, min, sec;
  9261  
  9262    A = (int)((JD - 1867216.25)/36524.25);
  9263    A = (int)(JD + 1 + A - (A/4));
  9264    B = A + 1524;
  9265    C = (int)((B - 122.1)/365.25);
  9266    D = (36525*(C&32767))/100;
  9267    E = (int)((B-D)/30.6001);
  9268  
  9269    day = B - D - (int)(30.6001*E);
  9270    mon = (E<14 ? E-1 : E-13);
  9271    yr = mon>2 ? C-4716 : C-4715;
  9272  
  9273    hr = (mUnixTime % (24*60*60)) / (60*60);
  9274    min = (mUnixTime % (60*60)) / 60;
  9275    sec = (mUnixTime % 60);
  9276  
  9277    if( yr>=1980 ){
  9278      pCds->mDate = (u16)(day + (mon << 5) + ((yr-1980) << 9));
  9279      pCds->mTime = (u16)(sec/2 + (min<<5) + (hr<<11));
  9280    }else{
  9281      pCds->mDate = pCds->mTime = 0;
  9282    }
  9283  
  9284    assert( mUnixTime<315507600 
  9285         || mUnixTime==zipfileMtime(pCds) 
  9286         || ((mUnixTime % 2) && mUnixTime-1==zipfileMtime(pCds)) 
  9287         /* || (mUnixTime % 2) */
  9288    );
  9289  }
  9290  
  9291  /*
  9292  ** If aBlob is not NULL, then it is a pointer to a buffer (nBlob bytes in
  9293  ** size) containing an entire zip archive image. Or, if aBlob is NULL,
  9294  ** then pFile is a file-handle open on a zip file. In either case, this
  9295  ** function creates a ZipfileEntry object based on the zip archive entry
  9296  ** for which the CDS record is at offset iOff.
  9297  **
  9298  ** If successful, SQLITE_OK is returned and (*ppEntry) set to point to
  9299  ** the new object. Otherwise, an SQLite error code is returned and the
  9300  ** final value of (*ppEntry) undefined.
  9301  */
  9302  static int zipfileGetEntry(
  9303    ZipfileTab *pTab,               /* Store any error message here */
  9304    const u8 *aBlob,                /* Pointer to in-memory file image */
  9305    int nBlob,                      /* Size of aBlob[] in bytes */
  9306    FILE *pFile,                    /* If aBlob==0, read from this file */
  9307    i64 iOff,                       /* Offset of CDS record */
  9308    ZipfileEntry **ppEntry          /* OUT: Pointer to new object */
  9309  ){
  9310    u8 *aRead;
  9311    char **pzErr = &pTab->base.zErrMsg;
  9312    int rc = SQLITE_OK;
  9313    (void)nBlob;
  9314  
  9315    if( aBlob==0 ){
  9316      aRead = pTab->aBuffer;
  9317      rc = zipfileReadData(pFile, aRead, ZIPFILE_CDS_FIXED_SZ, iOff, pzErr);
  9318    }else{
  9319      aRead = (u8*)&aBlob[iOff];
  9320    }
  9321  
  9322    if( rc==SQLITE_OK ){
  9323      sqlite3_int64 nAlloc;
  9324      ZipfileEntry *pNew;
  9325  
  9326      int nFile = zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF]);
  9327      int nExtra = zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF+2]);
  9328      nExtra += zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF+4]);
  9329  
  9330      nAlloc = sizeof(ZipfileEntry) + nExtra;
  9331      if( aBlob ){
  9332        nAlloc += zipfileGetU32(&aRead[ZIPFILE_CDS_SZCOMPRESSED_OFF]);
  9333      }
  9334  
  9335      pNew = (ZipfileEntry*)sqlite3_malloc64(nAlloc);
  9336      if( pNew==0 ){
  9337        rc = SQLITE_NOMEM;
  9338      }else{
  9339        memset(pNew, 0, sizeof(ZipfileEntry));
  9340        rc = zipfileReadCDS(aRead, &pNew->cds);
  9341        if( rc!=SQLITE_OK ){
  9342          *pzErr = sqlite3_mprintf("failed to read CDS at offset %lld", iOff);
  9343        }else if( aBlob==0 ){
  9344          rc = zipfileReadData(
  9345              pFile, aRead, nExtra+nFile, iOff+ZIPFILE_CDS_FIXED_SZ, pzErr
  9346          );
  9347        }else{
  9348          aRead = (u8*)&aBlob[iOff + ZIPFILE_CDS_FIXED_SZ];
  9349        }
  9350      }
  9351  
  9352      if( rc==SQLITE_OK ){
  9353        u32 *pt = &pNew->mUnixTime;
  9354        pNew->cds.zFile = sqlite3_mprintf("%.*s", nFile, aRead); 
  9355        pNew->aExtra = (u8*)&pNew[1];
  9356        memcpy(pNew->aExtra, &aRead[nFile], nExtra);
  9357        if( pNew->cds.zFile==0 ){
  9358          rc = SQLITE_NOMEM;
  9359        }else if( 0==zipfileScanExtra(&aRead[nFile], pNew->cds.nExtra, pt) ){
  9360          pNew->mUnixTime = zipfileMtime(&pNew->cds);
  9361        }
  9362      }
  9363  
  9364      if( rc==SQLITE_OK ){
  9365        static const int szFix = ZIPFILE_LFH_FIXED_SZ;
  9366        ZipfileLFH lfh;
  9367        if( pFile ){
  9368          rc = zipfileReadData(pFile, aRead, szFix, pNew->cds.iOffset, pzErr);
  9369        }else{
  9370          aRead = (u8*)&aBlob[pNew->cds.iOffset];
  9371        }
  9372  
  9373        if( rc==SQLITE_OK ) rc = zipfileReadLFH(aRead, &lfh);
  9374        if( rc==SQLITE_OK ){
  9375          pNew->iDataOff =  pNew->cds.iOffset + ZIPFILE_LFH_FIXED_SZ;
  9376          pNew->iDataOff += lfh.nFile + lfh.nExtra;
  9377          if( aBlob && pNew->cds.szCompressed ){
  9378            pNew->aData = &pNew->aExtra[nExtra];
  9379            memcpy(pNew->aData, &aBlob[pNew->iDataOff], pNew->cds.szCompressed);
  9380          }
  9381        }else{
  9382          *pzErr = sqlite3_mprintf("failed to read LFH at offset %d", 
  9383              (int)pNew->cds.iOffset
  9384          );
  9385        }
  9386      }
  9387  
  9388      if( rc!=SQLITE_OK ){
  9389        zipfileEntryFree(pNew);
  9390      }else{
  9391        *ppEntry = pNew;
  9392      }
  9393    }
  9394  
  9395    return rc;
  9396  }
  9397  
  9398  /*
  9399  ** Advance an ZipfileCsr to its next row of output.
  9400  */
  9401  static int zipfileNext(sqlite3_vtab_cursor *cur){
  9402    ZipfileCsr *pCsr = (ZipfileCsr*)cur;
  9403    int rc = SQLITE_OK;
  9404  
  9405    if( pCsr->pFile ){
  9406      i64 iEof = pCsr->eocd.iOffset + pCsr->eocd.nSize;
  9407      zipfileEntryFree(pCsr->pCurrent);
  9408      pCsr->pCurrent = 0;
  9409      if( pCsr->iNextOff>=iEof ){
  9410        pCsr->bEof = 1;
  9411      }else{
  9412        ZipfileEntry *p = 0;
  9413        ZipfileTab *pTab = (ZipfileTab*)(cur->pVtab);
  9414        rc = zipfileGetEntry(pTab, 0, 0, pCsr->pFile, pCsr->iNextOff, &p);
  9415        if( rc==SQLITE_OK ){
  9416          pCsr->iNextOff += ZIPFILE_CDS_FIXED_SZ;
  9417          pCsr->iNextOff += (int)p->cds.nExtra + p->cds.nFile + p->cds.nComment;
  9418        }
  9419        pCsr->pCurrent = p;
  9420      }
  9421    }else{
  9422      if( !pCsr->bNoop ){
  9423        pCsr->pCurrent = pCsr->pCurrent->pNext;
  9424      }
  9425      if( pCsr->pCurrent==0 ){
  9426        pCsr->bEof = 1;
  9427      }
  9428    }
  9429  
  9430    pCsr->bNoop = 0;
  9431    return rc;
  9432  }
  9433  
  9434  static void zipfileFree(void *p) { 
  9435    sqlite3_free(p); 
  9436  }
  9437  
  9438  /*
  9439  ** Buffer aIn (size nIn bytes) contains compressed data. Uncompressed, the
  9440  ** size is nOut bytes. This function uncompresses the data and sets the
  9441  ** return value in context pCtx to the result (a blob).
  9442  **
  9443  ** If an error occurs, an error code is left in pCtx instead.
  9444  */
  9445  static void zipfileInflate(
  9446    sqlite3_context *pCtx,          /* Store result here */
  9447    const u8 *aIn,                  /* Compressed data */
  9448    int nIn,                        /* Size of buffer aIn[] in bytes */
  9449    int nOut                        /* Expected output size */
  9450  ){
  9451    u8 *aRes = sqlite3_malloc(nOut);
  9452    if( aRes==0 ){
  9453      sqlite3_result_error_nomem(pCtx);
  9454    }else{
  9455      int err;
  9456      z_stream str;
  9457      memset(&str, 0, sizeof(str));
  9458  
  9459      str.next_in = (Byte*)aIn;
  9460      str.avail_in = nIn;
  9461      str.next_out = (Byte*)aRes;
  9462      str.avail_out = nOut;
  9463  
  9464      err = inflateInit2(&str, -15);
  9465      if( err!=Z_OK ){
  9466        zipfileCtxErrorMsg(pCtx, "inflateInit2() failed (%d)", err);
  9467      }else{
  9468        err = inflate(&str, Z_NO_FLUSH);
  9469        if( err!=Z_STREAM_END ){
  9470          zipfileCtxErrorMsg(pCtx, "inflate() failed (%d)", err);
  9471        }else{
  9472          sqlite3_result_blob(pCtx, aRes, nOut, zipfileFree);
  9473          aRes = 0;
  9474        }
  9475      }
  9476      sqlite3_free(aRes);
  9477      inflateEnd(&str);
  9478    }
  9479  }
  9480  
  9481  /*
  9482  ** Buffer aIn (size nIn bytes) contains uncompressed data. This function
  9483  ** compresses it and sets (*ppOut) to point to a buffer containing the
  9484  ** compressed data. The caller is responsible for eventually calling
  9485  ** sqlite3_free() to release buffer (*ppOut). Before returning, (*pnOut) 
  9486  ** is set to the size of buffer (*ppOut) in bytes.
  9487  **
  9488  ** If no error occurs, SQLITE_OK is returned. Otherwise, an SQLite error
  9489  ** code is returned and an error message left in virtual-table handle
  9490  ** pTab. The values of (*ppOut) and (*pnOut) are left unchanged in this
  9491  ** case.
  9492  */
  9493  static int zipfileDeflate(
  9494    const u8 *aIn, int nIn,         /* Input */
  9495    u8 **ppOut, int *pnOut,         /* Output */
  9496    char **pzErr                    /* OUT: Error message */
  9497  ){
  9498    int rc = SQLITE_OK;
  9499    sqlite3_int64 nAlloc;
  9500    z_stream str;
  9501    u8 *aOut;
  9502  
  9503    memset(&str, 0, sizeof(str));
  9504    str.next_in = (Bytef*)aIn;
  9505    str.avail_in = nIn;
  9506    deflateInit2(&str, 9, Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY);
  9507  
  9508    nAlloc = deflateBound(&str, nIn);
  9509    aOut = (u8*)sqlite3_malloc64(nAlloc);
  9510    if( aOut==0 ){
  9511      rc = SQLITE_NOMEM;
  9512    }else{
  9513      int res;
  9514      str.next_out = aOut;
  9515      str.avail_out = nAlloc;
  9516      res = deflate(&str, Z_FINISH);
  9517      if( res==Z_STREAM_END ){
  9518        *ppOut = aOut;
  9519        *pnOut = (int)str.total_out;
  9520      }else{
  9521        sqlite3_free(aOut);
  9522        *pzErr = sqlite3_mprintf("zipfile: deflate() error");
  9523        rc = SQLITE_ERROR;
  9524      }
  9525      deflateEnd(&str);
  9526    }
  9527  
  9528    return rc;
  9529  }
  9530  
  9531  
  9532  /*
  9533  ** Return values of columns for the row at which the series_cursor
  9534  ** is currently pointing.
  9535  */
  9536  static int zipfileColumn(
  9537    sqlite3_vtab_cursor *cur,   /* The cursor */
  9538    sqlite3_context *ctx,       /* First argument to sqlite3_result_...() */
  9539    int i                       /* Which column to return */
  9540  ){
  9541    ZipfileCsr *pCsr = (ZipfileCsr*)cur;
  9542    ZipfileCDS *pCDS = &pCsr->pCurrent->cds;
  9543    int rc = SQLITE_OK;
  9544    switch( i ){
  9545      case 0:   /* name */
  9546        sqlite3_result_text(ctx, pCDS->zFile, -1, SQLITE_TRANSIENT);
  9547        break;
  9548      case 1:   /* mode */
  9549        /* TODO: Whether or not the following is correct surely depends on
  9550        ** the platform on which the archive was created.  */
  9551        sqlite3_result_int(ctx, pCDS->iExternalAttr >> 16);
  9552        break;
  9553      case 2: { /* mtime */
  9554        sqlite3_result_int64(ctx, pCsr->pCurrent->mUnixTime);
  9555        break;
  9556      }
  9557      case 3: { /* sz */
  9558        if( sqlite3_vtab_nochange(ctx)==0 ){
  9559          sqlite3_result_int64(ctx, pCDS->szUncompressed);
  9560        }
  9561        break;
  9562      }
  9563      case 4:   /* rawdata */
  9564        if( sqlite3_vtab_nochange(ctx) ) break;
  9565      case 5: { /* data */
  9566        if( i==4 || pCDS->iCompression==0 || pCDS->iCompression==8 ){
  9567          int sz = pCDS->szCompressed;
  9568          int szFinal = pCDS->szUncompressed;
  9569          if( szFinal>0 ){
  9570            u8 *aBuf;
  9571            u8 *aFree = 0;
  9572            if( pCsr->pCurrent->aData ){
  9573              aBuf = pCsr->pCurrent->aData;
  9574            }else{
  9575              aBuf = aFree = sqlite3_malloc64(sz);
  9576              if( aBuf==0 ){
  9577                rc = SQLITE_NOMEM;
  9578              }else{
  9579                FILE *pFile = pCsr->pFile;
  9580                if( pFile==0 ){
  9581                  pFile = ((ZipfileTab*)(pCsr->base.pVtab))->pWriteFd;
  9582                }
  9583                rc = zipfileReadData(pFile, aBuf, sz, pCsr->pCurrent->iDataOff,
  9584                    &pCsr->base.pVtab->zErrMsg
  9585                );
  9586              }
  9587            }
  9588            if( rc==SQLITE_OK ){
  9589              if( i==5 && pCDS->iCompression ){
  9590                zipfileInflate(ctx, aBuf, sz, szFinal);
  9591              }else{
  9592                sqlite3_result_blob(ctx, aBuf, sz, SQLITE_TRANSIENT);
  9593              }
  9594            }
  9595            sqlite3_free(aFree);
  9596          }else{
  9597            /* Figure out if this is a directory or a zero-sized file. Consider
  9598            ** it to be a directory either if the mode suggests so, or if
  9599            ** the final character in the name is '/'.  */
  9600            u32 mode = pCDS->iExternalAttr >> 16;
  9601            if( !(mode & S_IFDIR)
  9602             && pCDS->nFile>=1
  9603             && pCDS->zFile[pCDS->nFile-1]!='/'
  9604            ){
  9605              sqlite3_result_blob(ctx, "", 0, SQLITE_STATIC);
  9606            }
  9607          }
  9608        }
  9609        break;
  9610      }
  9611      case 6:   /* method */
  9612        sqlite3_result_int(ctx, pCDS->iCompression);
  9613        break;
  9614      default:  /* z */
  9615        assert( i==7 );
  9616        sqlite3_result_int64(ctx, pCsr->iId);
  9617        break;
  9618    }
  9619  
  9620    return rc;
  9621  }
  9622  
  9623  /*
  9624  ** Return TRUE if the cursor is at EOF.
  9625  */
  9626  static int zipfileEof(sqlite3_vtab_cursor *cur){
  9627    ZipfileCsr *pCsr = (ZipfileCsr*)cur;
  9628    return pCsr->bEof;
  9629  }
  9630  
  9631  /*
  9632  ** If aBlob is not NULL, then it points to a buffer nBlob bytes in size
  9633  ** containing an entire zip archive image. Or, if aBlob is NULL, then pFile
  9634  ** is guaranteed to be a file-handle open on a zip file.
  9635  **
  9636  ** This function attempts to locate the EOCD record within the zip archive
  9637  ** and populate *pEOCD with the results of decoding it. SQLITE_OK is
  9638  ** returned if successful. Otherwise, an SQLite error code is returned and
  9639  ** an English language error message may be left in virtual-table pTab.
  9640  */
  9641  static int zipfileReadEOCD(
  9642    ZipfileTab *pTab,               /* Return errors here */
  9643    const u8 *aBlob,                /* Pointer to in-memory file image */
  9644    int nBlob,                      /* Size of aBlob[] in bytes */
  9645    FILE *pFile,                    /* Read from this file if aBlob==0 */
  9646    ZipfileEOCD *pEOCD              /* Object to populate */
  9647  ){
  9648    u8 *aRead = pTab->aBuffer;      /* Temporary buffer */
  9649    int nRead;                      /* Bytes to read from file */
  9650    int rc = SQLITE_OK;
  9651  
  9652    memset(pEOCD, 0, sizeof(ZipfileEOCD));
  9653    if( aBlob==0 ){
  9654      i64 iOff;                     /* Offset to read from */
  9655      i64 szFile;                   /* Total size of file in bytes */
  9656      fseek(pFile, 0, SEEK_END);
  9657      szFile = (i64)ftell(pFile);
  9658      if( szFile==0 ){
  9659        return SQLITE_OK;
  9660      }
  9661      nRead = (int)(MIN(szFile, ZIPFILE_BUFFER_SIZE));
  9662      iOff = szFile - nRead;
  9663      rc = zipfileReadData(pFile, aRead, nRead, iOff, &pTab->base.zErrMsg);
  9664    }else{
  9665      nRead = (int)(MIN(nBlob, ZIPFILE_BUFFER_SIZE));
  9666      aRead = (u8*)&aBlob[nBlob-nRead];
  9667    }
  9668  
  9669    if( rc==SQLITE_OK ){
  9670      int i;
  9671  
  9672      /* Scan backwards looking for the signature bytes */
  9673      for(i=nRead-20; i>=0; i--){
  9674        if( aRead[i]==0x50 && aRead[i+1]==0x4b 
  9675         && aRead[i+2]==0x05 && aRead[i+3]==0x06 
  9676        ){
  9677          break;
  9678        }
  9679      }
  9680      if( i<0 ){
  9681        pTab->base.zErrMsg = sqlite3_mprintf(
  9682            "cannot find end of central directory record"
  9683        );
  9684        return SQLITE_ERROR;
  9685      }
  9686  
  9687      aRead += i+4;
  9688      pEOCD->iDisk = zipfileRead16(aRead);
  9689      pEOCD->iFirstDisk = zipfileRead16(aRead);
  9690      pEOCD->nEntry = zipfileRead16(aRead);
  9691      pEOCD->nEntryTotal = zipfileRead16(aRead);
  9692      pEOCD->nSize = zipfileRead32(aRead);
  9693      pEOCD->iOffset = zipfileRead32(aRead);
  9694    }
  9695  
  9696    return rc;
  9697  }
  9698  
  9699  /*
  9700  ** Add object pNew to the linked list that begins at ZipfileTab.pFirstEntry 
  9701  ** and ends with pLastEntry. If argument pBefore is NULL, then pNew is added
  9702  ** to the end of the list. Otherwise, it is added to the list immediately
  9703  ** before pBefore (which is guaranteed to be a part of said list).
  9704  */
  9705  static void zipfileAddEntry(
  9706    ZipfileTab *pTab, 
  9707    ZipfileEntry *pBefore, 
  9708    ZipfileEntry *pNew
  9709  ){
  9710    assert( (pTab->pFirstEntry==0)==(pTab->pLastEntry==0) );
  9711    assert( pNew->pNext==0 );
  9712    if( pBefore==0 ){
  9713      if( pTab->pFirstEntry==0 ){
  9714        pTab->pFirstEntry = pTab->pLastEntry = pNew;
  9715      }else{
  9716        assert( pTab->pLastEntry->pNext==0 );
  9717        pTab->pLastEntry->pNext = pNew;
  9718        pTab->pLastEntry = pNew;
  9719      }
  9720    }else{
  9721      ZipfileEntry **pp;
  9722      for(pp=&pTab->pFirstEntry; *pp!=pBefore; pp=&((*pp)->pNext));
  9723      pNew->pNext = pBefore;
  9724      *pp = pNew;
  9725    }
  9726  }
  9727  
  9728  static int zipfileLoadDirectory(ZipfileTab *pTab, const u8 *aBlob, int nBlob){
  9729    ZipfileEOCD eocd;
  9730    int rc;
  9731    int i;
  9732    i64 iOff;
  9733  
  9734    rc = zipfileReadEOCD(pTab, aBlob, nBlob, pTab->pWriteFd, &eocd);
  9735    iOff = eocd.iOffset;
  9736    for(i=0; rc==SQLITE_OK && i<eocd.nEntry; i++){
  9737      ZipfileEntry *pNew = 0;
  9738      rc = zipfileGetEntry(pTab, aBlob, nBlob, pTab->pWriteFd, iOff, &pNew);
  9739  
  9740      if( rc==SQLITE_OK ){
  9741        zipfileAddEntry(pTab, 0, pNew);
  9742        iOff += ZIPFILE_CDS_FIXED_SZ;
  9743        iOff += (int)pNew->cds.nExtra + pNew->cds.nFile + pNew->cds.nComment;
  9744      }
  9745    }
  9746    return rc;
  9747  }
  9748  
  9749  /*
  9750  ** xFilter callback.
  9751  */
  9752  static int zipfileFilter(
  9753    sqlite3_vtab_cursor *cur, 
  9754    int idxNum, const char *idxStr,
  9755    int argc, sqlite3_value **argv
  9756  ){
  9757    ZipfileTab *pTab = (ZipfileTab*)cur->pVtab;
  9758    ZipfileCsr *pCsr = (ZipfileCsr*)cur;
  9759    const char *zFile = 0;          /* Zip file to scan */
  9760    int rc = SQLITE_OK;             /* Return Code */
  9761    int bInMemory = 0;              /* True for an in-memory zipfile */
  9762  
  9763    (void)idxStr;
  9764    (void)argc;
  9765  
  9766    zipfileResetCursor(pCsr);
  9767  
  9768    if( pTab->zFile ){
  9769      zFile = pTab->zFile;
  9770    }else if( idxNum==0 ){
  9771      zipfileCursorErr(pCsr, "zipfile() function requires an argument");
  9772      return SQLITE_ERROR;
  9773    }else if( sqlite3_value_type(argv[0])==SQLITE_BLOB ){
  9774      static const u8 aEmptyBlob = 0;
  9775      const u8 *aBlob = (const u8*)sqlite3_value_blob(argv[0]);
  9776      int nBlob = sqlite3_value_bytes(argv[0]);
  9777      assert( pTab->pFirstEntry==0 );
  9778      if( aBlob==0 ){
  9779        aBlob = &aEmptyBlob;
  9780        nBlob = 0;
  9781      }
  9782      rc = zipfileLoadDirectory(pTab, aBlob, nBlob);
  9783      pCsr->pFreeEntry = pTab->pFirstEntry;
  9784      pTab->pFirstEntry = pTab->pLastEntry = 0;
  9785      if( rc!=SQLITE_OK ) return rc;
  9786      bInMemory = 1;
  9787    }else{
  9788      zFile = (const char*)sqlite3_value_text(argv[0]);
  9789    }
  9790  
  9791    if( 0==pTab->pWriteFd && 0==bInMemory ){
  9792      pCsr->pFile = zFile ? fopen(zFile, "rb") : 0;
  9793      if( pCsr->pFile==0 ){
  9794        zipfileCursorErr(pCsr, "cannot open file: %s", zFile);
  9795        rc = SQLITE_ERROR;
  9796      }else{
  9797        rc = zipfileReadEOCD(pTab, 0, 0, pCsr->pFile, &pCsr->eocd);
  9798        if( rc==SQLITE_OK ){
  9799          if( pCsr->eocd.nEntry==0 ){
  9800            pCsr->bEof = 1;
  9801          }else{
  9802            pCsr->iNextOff = pCsr->eocd.iOffset;
  9803            rc = zipfileNext(cur);
  9804          }
  9805        }
  9806      }
  9807    }else{
  9808      pCsr->bNoop = 1;
  9809      pCsr->pCurrent = pCsr->pFreeEntry ? pCsr->pFreeEntry : pTab->pFirstEntry;
  9810      rc = zipfileNext(cur);
  9811    }
  9812  
  9813    return rc;
  9814  }
  9815  
  9816  /*
  9817  ** xBestIndex callback.
  9818  */
  9819  static int zipfileBestIndex(
  9820    sqlite3_vtab *tab,
  9821    sqlite3_index_info *pIdxInfo
  9822  ){
  9823    int i;
  9824    int idx = -1;
  9825    int unusable = 0;
  9826    (void)tab;
  9827  
  9828    for(i=0; i<pIdxInfo->nConstraint; i++){
  9829      const struct sqlite3_index_constraint *pCons = &pIdxInfo->aConstraint[i];
  9830      if( pCons->iColumn!=ZIPFILE_F_COLUMN_IDX ) continue;
  9831      if( pCons->usable==0 ){
  9832        unusable = 1;
  9833      }else if( pCons->op==SQLITE_INDEX_CONSTRAINT_EQ ){
  9834        idx = i;
  9835      }
  9836    }
  9837    pIdxInfo->estimatedCost = 1000.0;
  9838    if( idx>=0 ){
  9839      pIdxInfo->aConstraintUsage[idx].argvIndex = 1;
  9840      pIdxInfo->aConstraintUsage[idx].omit = 1;
  9841      pIdxInfo->idxNum = 1;
  9842    }else if( unusable ){
  9843      return SQLITE_CONSTRAINT;
  9844    }
  9845    return SQLITE_OK;
  9846  }
  9847  
  9848  static ZipfileEntry *zipfileNewEntry(const char *zPath){
  9849    ZipfileEntry *pNew;
  9850    pNew = sqlite3_malloc(sizeof(ZipfileEntry));
  9851    if( pNew ){
  9852      memset(pNew, 0, sizeof(ZipfileEntry));
  9853      pNew->cds.zFile = sqlite3_mprintf("%s", zPath);
  9854      if( pNew->cds.zFile==0 ){
  9855        sqlite3_free(pNew);
  9856        pNew = 0;
  9857      }
  9858    }
  9859    return pNew;
  9860  }
  9861  
  9862  static int zipfileSerializeLFH(ZipfileEntry *pEntry, u8 *aBuf){
  9863    ZipfileCDS *pCds = &pEntry->cds;
  9864    u8 *a = aBuf;
  9865  
  9866    pCds->nExtra = 9;
  9867  
  9868    /* Write the LFH itself */
  9869    zipfileWrite32(a, ZIPFILE_SIGNATURE_LFH);
  9870    zipfileWrite16(a, pCds->iVersionExtract);
  9871    zipfileWrite16(a, pCds->flags);
  9872    zipfileWrite16(a, pCds->iCompression);
  9873    zipfileWrite16(a, pCds->mTime);
  9874    zipfileWrite16(a, pCds->mDate);
  9875    zipfileWrite32(a, pCds->crc32);
  9876    zipfileWrite32(a, pCds->szCompressed);
  9877    zipfileWrite32(a, pCds->szUncompressed);
  9878    zipfileWrite16(a, (u16)pCds->nFile);
  9879    zipfileWrite16(a, pCds->nExtra);
  9880    assert( a==&aBuf[ZIPFILE_LFH_FIXED_SZ] );
  9881  
  9882    /* Add the file name */
  9883    memcpy(a, pCds->zFile, (int)pCds->nFile);
  9884    a += (int)pCds->nFile;
  9885  
  9886    /* The "extra" data */
  9887    zipfileWrite16(a, ZIPFILE_EXTRA_TIMESTAMP);
  9888    zipfileWrite16(a, 5);
  9889    *a++ = 0x01;
  9890    zipfileWrite32(a, pEntry->mUnixTime);
  9891  
  9892    return a-aBuf;
  9893  }
  9894  
  9895  static int zipfileAppendEntry(
  9896    ZipfileTab *pTab,
  9897    ZipfileEntry *pEntry,
  9898    const u8 *pData,
  9899    int nData
  9900  ){
  9901    u8 *aBuf = pTab->aBuffer;
  9902    int nBuf;
  9903    int rc;
  9904  
  9905    nBuf = zipfileSerializeLFH(pEntry, aBuf);
  9906    rc = zipfileAppendData(pTab, aBuf, nBuf);
  9907    if( rc==SQLITE_OK ){
  9908      pEntry->iDataOff = pTab->szCurrent;
  9909      rc = zipfileAppendData(pTab, pData, nData);
  9910    }
  9911  
  9912    return rc;
  9913  }
  9914  
  9915  static int zipfileGetMode(
  9916    sqlite3_value *pVal, 
  9917    int bIsDir,                     /* If true, default to directory */
  9918    u32 *pMode,                     /* OUT: Mode value */
  9919    char **pzErr                    /* OUT: Error message */
  9920  ){
  9921    const char *z = (const char*)sqlite3_value_text(pVal);
  9922    u32 mode = 0;
  9923    if( z==0 ){
  9924      mode = (bIsDir ? (S_IFDIR + 0755) : (S_IFREG + 0644));
  9925    }else if( z[0]>='0' && z[0]<='9' ){
  9926      mode = (unsigned int)sqlite3_value_int(pVal);
  9927    }else{
  9928      const char zTemplate[11] = "-rwxrwxrwx";
  9929      int i;
  9930      if( strlen(z)!=10 ) goto parse_error;
  9931      switch( z[0] ){
  9932        case '-': mode |= S_IFREG; break;
  9933        case 'd': mode |= S_IFDIR; break;
  9934        case 'l': mode |= S_IFLNK; break;
  9935        default: goto parse_error;
  9936      }
  9937      for(i=1; i<10; i++){
  9938        if( z[i]==zTemplate[i] ) mode |= 1 << (9-i);
  9939        else if( z[i]!='-' ) goto parse_error;
  9940      }
  9941    }
  9942    if( ((mode & S_IFDIR)==0)==bIsDir ){
  9943      /* The "mode" attribute is a directory, but data has been specified.
  9944      ** Or vice-versa - no data but "mode" is a file or symlink.  */
  9945      *pzErr = sqlite3_mprintf("zipfile: mode does not match data");
  9946      return SQLITE_CONSTRAINT;
  9947    }
  9948    *pMode = mode;
  9949    return SQLITE_OK;
  9950  
  9951   parse_error:
  9952    *pzErr = sqlite3_mprintf("zipfile: parse error in mode: %s", z);
  9953    return SQLITE_ERROR;
  9954  }
  9955  
  9956  /*
  9957  ** Both (const char*) arguments point to nul-terminated strings. Argument
  9958  ** nB is the value of strlen(zB). This function returns 0 if the strings are
  9959  ** identical, ignoring any trailing '/' character in either path.  */
  9960  static int zipfileComparePath(const char *zA, const char *zB, int nB){
  9961    int nA = (int)strlen(zA);
  9962    if( nA>0 && zA[nA-1]=='/' ) nA--;
  9963    if( nB>0 && zB[nB-1]=='/' ) nB--;
  9964    if( nA==nB && memcmp(zA, zB, nA)==0 ) return 0;
  9965    return 1;
  9966  }
  9967  
  9968  static int zipfileBegin(sqlite3_vtab *pVtab){
  9969    ZipfileTab *pTab = (ZipfileTab*)pVtab;
  9970    int rc = SQLITE_OK;
  9971  
  9972    assert( pTab->pWriteFd==0 );
  9973    if( pTab->zFile==0 || pTab->zFile[0]==0 ){
  9974      pTab->base.zErrMsg = sqlite3_mprintf("zipfile: missing filename");
  9975      return SQLITE_ERROR;
  9976    }
  9977  
  9978    /* Open a write fd on the file. Also load the entire central directory
  9979    ** structure into memory. During the transaction any new file data is 
  9980    ** appended to the archive file, but the central directory is accumulated
  9981    ** in main-memory until the transaction is committed.  */
  9982    pTab->pWriteFd = fopen(pTab->zFile, "ab+");
  9983    if( pTab->pWriteFd==0 ){
  9984      pTab->base.zErrMsg = sqlite3_mprintf(
  9985          "zipfile: failed to open file %s for writing", pTab->zFile
  9986          );
  9987      rc = SQLITE_ERROR;
  9988    }else{
  9989      fseek(pTab->pWriteFd, 0, SEEK_END);
  9990      pTab->szCurrent = pTab->szOrig = (i64)ftell(pTab->pWriteFd);
  9991      rc = zipfileLoadDirectory(pTab, 0, 0);
  9992    }
  9993  
  9994    if( rc!=SQLITE_OK ){
  9995      zipfileCleanupTransaction(pTab);
  9996    }
  9997  
  9998    return rc;
  9999  }
 10000  
 10001  /*
 10002  ** Return the current time as a 32-bit timestamp in UNIX epoch format (like
 10003  ** time(2)).
 10004  */
 10005  static u32 zipfileTime(void){
 10006    sqlite3_vfs *pVfs = sqlite3_vfs_find(0);
 10007    u32 ret;
 10008    if( pVfs==0 ) return 0;
 10009    if( pVfs->iVersion>=2 && pVfs->xCurrentTimeInt64 ){
 10010      i64 ms;
 10011      pVfs->xCurrentTimeInt64(pVfs, &ms);
 10012      ret = (u32)((ms/1000) - ((i64)24405875 * 8640));
 10013    }else{
 10014      double day;
 10015      pVfs->xCurrentTime(pVfs, &day);
 10016      ret = (u32)((day - 2440587.5) * 86400);
 10017    }
 10018    return ret;
 10019  }
 10020  
 10021  /*
 10022  ** Return a 32-bit timestamp in UNIX epoch format.
 10023  **
 10024  ** If the value passed as the only argument is either NULL or an SQL NULL,
 10025  ** return the current time. Otherwise, return the value stored in (*pVal)
 10026  ** cast to a 32-bit unsigned integer.
 10027  */
 10028  static u32 zipfileGetTime(sqlite3_value *pVal){
 10029    if( pVal==0 || sqlite3_value_type(pVal)==SQLITE_NULL ){
 10030      return zipfileTime();
 10031    }
 10032    return (u32)sqlite3_value_int64(pVal);
 10033  }
 10034  
 10035  /*
 10036  ** Unless it is NULL, entry pOld is currently part of the pTab->pFirstEntry
 10037  ** linked list.  Remove it from the list and free the object.
 10038  */
 10039  static void zipfileRemoveEntryFromList(ZipfileTab *pTab, ZipfileEntry *pOld){
 10040    if( pOld ){
 10041      if( pTab->pFirstEntry==pOld ){
 10042        pTab->pFirstEntry = pOld->pNext;
 10043        if( pTab->pLastEntry==pOld ) pTab->pLastEntry = 0;
 10044      }else{
 10045        ZipfileEntry *p;
 10046        for(p=pTab->pFirstEntry; p; p=p->pNext){
 10047          if( p->pNext==pOld ){
 10048            p->pNext = pOld->pNext;
 10049            if( pTab->pLastEntry==pOld ) pTab->pLastEntry = p;
 10050            break;
 10051          }
 10052        }
 10053      }
 10054      zipfileEntryFree(pOld);
 10055    }
 10056  }
 10057  
 10058  /*
 10059  ** xUpdate method.
 10060  */
 10061  static int zipfileUpdate(
 10062    sqlite3_vtab *pVtab, 
 10063    int nVal, 
 10064    sqlite3_value **apVal, 
 10065    sqlite_int64 *pRowid
 10066  ){
 10067    ZipfileTab *pTab = (ZipfileTab*)pVtab;
 10068    int rc = SQLITE_OK;             /* Return Code */
 10069    ZipfileEntry *pNew = 0;         /* New in-memory CDS entry */
 10070  
 10071    u32 mode = 0;                   /* Mode for new entry */
 10072    u32 mTime = 0;                  /* Modification time for new entry */
 10073    i64 sz = 0;                     /* Uncompressed size */
 10074    const char *zPath = 0;          /* Path for new entry */
 10075    int nPath = 0;                  /* strlen(zPath) */
 10076    const u8 *pData = 0;            /* Pointer to buffer containing content */
 10077    int nData = 0;                  /* Size of pData buffer in bytes */
 10078    int iMethod = 0;                /* Compression method for new entry */
 10079    u8 *pFree = 0;                  /* Free this */
 10080    char *zFree = 0;                /* Also free this */
 10081    ZipfileEntry *pOld = 0;
 10082    ZipfileEntry *pOld2 = 0;
 10083    int bUpdate = 0;                /* True for an update that modifies "name" */
 10084    int bIsDir = 0;
 10085    u32 iCrc32 = 0;
 10086  
 10087    (void)pRowid;
 10088  
 10089    if( pTab->pWriteFd==0 ){
 10090      rc = zipfileBegin(pVtab);
 10091      if( rc!=SQLITE_OK ) return rc;
 10092    }
 10093  
 10094    /* If this is a DELETE or UPDATE, find the archive entry to delete. */
 10095    if( sqlite3_value_type(apVal[0])!=SQLITE_NULL ){
 10096      const char *zDelete = (const char*)sqlite3_value_text(apVal[0]);
 10097      int nDelete = (int)strlen(zDelete);
 10098      if( nVal>1 ){
 10099        const char *zUpdate = (const char*)sqlite3_value_text(apVal[1]);
 10100        if( zUpdate && zipfileComparePath(zUpdate, zDelete, nDelete)!=0 ){
 10101          bUpdate = 1;
 10102        }
 10103      }
 10104      for(pOld=pTab->pFirstEntry; 1; pOld=pOld->pNext){
 10105        if( zipfileComparePath(pOld->cds.zFile, zDelete, nDelete)==0 ){
 10106          break;
 10107        }
 10108        assert( pOld->pNext );
 10109      }
 10110    }
 10111  
 10112    if( nVal>1 ){
 10113      /* Check that "sz" and "rawdata" are both NULL: */
 10114      if( sqlite3_value_type(apVal[5])!=SQLITE_NULL ){
 10115        zipfileTableErr(pTab, "sz must be NULL");
 10116        rc = SQLITE_CONSTRAINT;
 10117      }
 10118      if( sqlite3_value_type(apVal[6])!=SQLITE_NULL ){
 10119        zipfileTableErr(pTab, "rawdata must be NULL"); 
 10120        rc = SQLITE_CONSTRAINT;
 10121      }
 10122  
 10123      if( rc==SQLITE_OK ){
 10124        if( sqlite3_value_type(apVal[7])==SQLITE_NULL ){
 10125          /* data=NULL. A directory */
 10126          bIsDir = 1;
 10127        }else{
 10128          /* Value specified for "data", and possibly "method". This must be
 10129          ** a regular file or a symlink. */
 10130          const u8 *aIn = sqlite3_value_blob(apVal[7]);
 10131          int nIn = sqlite3_value_bytes(apVal[7]);
 10132          int bAuto = sqlite3_value_type(apVal[8])==SQLITE_NULL;
 10133  
 10134          iMethod = sqlite3_value_int(apVal[8]);
 10135          sz = nIn;
 10136          pData = aIn;
 10137          nData = nIn;
 10138          if( iMethod!=0 && iMethod!=8 ){
 10139            zipfileTableErr(pTab, "unknown compression method: %d", iMethod);
 10140            rc = SQLITE_CONSTRAINT;
 10141          }else{
 10142            if( bAuto || iMethod ){
 10143              int nCmp;
 10144              rc = zipfileDeflate(aIn, nIn, &pFree, &nCmp, &pTab->base.zErrMsg);
 10145              if( rc==SQLITE_OK ){
 10146                if( iMethod || nCmp<nIn ){
 10147                  iMethod = 8;
 10148                  pData = pFree;
 10149                  nData = nCmp;
 10150                }
 10151              }
 10152            }
 10153            iCrc32 = crc32(0, aIn, nIn);
 10154          }
 10155        }
 10156      }
 10157  
 10158      if( rc==SQLITE_OK ){
 10159        rc = zipfileGetMode(apVal[3], bIsDir, &mode, &pTab->base.zErrMsg);
 10160      }
 10161  
 10162      if( rc==SQLITE_OK ){
 10163        zPath = (const char*)sqlite3_value_text(apVal[2]);
 10164        if( zPath==0 ) zPath = "";
 10165        nPath = (int)strlen(zPath);
 10166        mTime = zipfileGetTime(apVal[4]);
 10167      }
 10168  
 10169      if( rc==SQLITE_OK && bIsDir ){
 10170        /* For a directory, check that the last character in the path is a
 10171        ** '/'. This appears to be required for compatibility with info-zip
 10172        ** (the unzip command on unix). It does not create directories
 10173        ** otherwise.  */
 10174        if( nPath<=0 || zPath[nPath-1]!='/' ){
 10175          zFree = sqlite3_mprintf("%s/", zPath);
 10176          zPath = (const char*)zFree;
 10177          if( zFree==0 ){
 10178            rc = SQLITE_NOMEM;
 10179            nPath = 0;
 10180          }else{
 10181            nPath = (int)strlen(zPath);
 10182          }
 10183        }
 10184      }
 10185  
 10186      /* Check that we're not inserting a duplicate entry -OR- updating an
 10187      ** entry with a path, thereby making it into a duplicate. */
 10188      if( (pOld==0 || bUpdate) && rc==SQLITE_OK ){
 10189        ZipfileEntry *p;
 10190        for(p=pTab->pFirstEntry; p; p=p->pNext){
 10191          if( zipfileComparePath(p->cds.zFile, zPath, nPath)==0 ){
 10192            switch( sqlite3_vtab_on_conflict(pTab->db) ){
 10193              case SQLITE_IGNORE: {
 10194                goto zipfile_update_done;
 10195              }
 10196              case SQLITE_REPLACE: {
 10197                pOld2 = p;
 10198                break;
 10199              }
 10200              default: {
 10201                zipfileTableErr(pTab, "duplicate name: \"%s\"", zPath);
 10202                rc = SQLITE_CONSTRAINT;
 10203                break;
 10204              }
 10205            }
 10206            break;
 10207          }
 10208        }
 10209      }
 10210  
 10211      if( rc==SQLITE_OK ){
 10212        /* Create the new CDS record. */
 10213        pNew = zipfileNewEntry(zPath);
 10214        if( pNew==0 ){
 10215          rc = SQLITE_NOMEM;
 10216        }else{
 10217          pNew->cds.iVersionMadeBy = ZIPFILE_NEWENTRY_MADEBY;
 10218          pNew->cds.iVersionExtract = ZIPFILE_NEWENTRY_REQUIRED;
 10219          pNew->cds.flags = ZIPFILE_NEWENTRY_FLAGS;
 10220          pNew->cds.iCompression = (u16)iMethod;
 10221          zipfileMtimeToDos(&pNew->cds, mTime);
 10222          pNew->cds.crc32 = iCrc32;
 10223          pNew->cds.szCompressed = nData;
 10224          pNew->cds.szUncompressed = (u32)sz;
 10225          pNew->cds.iExternalAttr = (mode<<16);
 10226          pNew->cds.iOffset = (u32)pTab->szCurrent;
 10227          pNew->cds.nFile = (u16)nPath;
 10228          pNew->mUnixTime = (u32)mTime;
 10229          rc = zipfileAppendEntry(pTab, pNew, pData, nData);
 10230          zipfileAddEntry(pTab, pOld, pNew);
 10231        }
 10232      }
 10233    }
 10234  
 10235    if( rc==SQLITE_OK && (pOld || pOld2) ){
 10236      ZipfileCsr *pCsr;
 10237      for(pCsr=pTab->pCsrList; pCsr; pCsr=pCsr->pCsrNext){
 10238        if( pCsr->pCurrent && (pCsr->pCurrent==pOld || pCsr->pCurrent==pOld2) ){
 10239          pCsr->pCurrent = pCsr->pCurrent->pNext;
 10240          pCsr->bNoop = 1;
 10241        }
 10242      }
 10243  
 10244      zipfileRemoveEntryFromList(pTab, pOld);
 10245      zipfileRemoveEntryFromList(pTab, pOld2);
 10246    }
 10247  
 10248  zipfile_update_done:
 10249    sqlite3_free(pFree);
 10250    sqlite3_free(zFree);
 10251    return rc;
 10252  }
 10253  
 10254  static int zipfileSerializeEOCD(ZipfileEOCD *p, u8 *aBuf){
 10255    u8 *a = aBuf;
 10256    zipfileWrite32(a, ZIPFILE_SIGNATURE_EOCD);
 10257    zipfileWrite16(a, p->iDisk);
 10258    zipfileWrite16(a, p->iFirstDisk);
 10259    zipfileWrite16(a, p->nEntry);
 10260    zipfileWrite16(a, p->nEntryTotal);
 10261    zipfileWrite32(a, p->nSize);
 10262    zipfileWrite32(a, p->iOffset);
 10263    zipfileWrite16(a, 0);        /* Size of trailing comment in bytes*/
 10264  
 10265    return a-aBuf;
 10266  }
 10267  
 10268  static int zipfileAppendEOCD(ZipfileTab *pTab, ZipfileEOCD *p){
 10269    int nBuf = zipfileSerializeEOCD(p, pTab->aBuffer);
 10270    assert( nBuf==ZIPFILE_EOCD_FIXED_SZ );
 10271    return zipfileAppendData(pTab, pTab->aBuffer, nBuf);
 10272  }
 10273  
 10274  /*
 10275  ** Serialize the CDS structure into buffer aBuf[]. Return the number
 10276  ** of bytes written.
 10277  */
 10278  static int zipfileSerializeCDS(ZipfileEntry *pEntry, u8 *aBuf){
 10279    u8 *a = aBuf;
 10280    ZipfileCDS *pCDS = &pEntry->cds;
 10281  
 10282    if( pEntry->aExtra==0 ){
 10283      pCDS->nExtra = 9;
 10284    }
 10285  
 10286    zipfileWrite32(a, ZIPFILE_SIGNATURE_CDS);
 10287    zipfileWrite16(a, pCDS->iVersionMadeBy);
 10288    zipfileWrite16(a, pCDS->iVersionExtract);
 10289    zipfileWrite16(a, pCDS->flags);
 10290    zipfileWrite16(a, pCDS->iCompression);
 10291    zipfileWrite16(a, pCDS->mTime);
 10292    zipfileWrite16(a, pCDS->mDate);
 10293    zipfileWrite32(a, pCDS->crc32);
 10294    zipfileWrite32(a, pCDS->szCompressed);
 10295    zipfileWrite32(a, pCDS->szUncompressed);
 10296    assert( a==&aBuf[ZIPFILE_CDS_NFILE_OFF] );
 10297    zipfileWrite16(a, pCDS->nFile);
 10298    zipfileWrite16(a, pCDS->nExtra);
 10299    zipfileWrite16(a, pCDS->nComment);
 10300    zipfileWrite16(a, pCDS->iDiskStart);
 10301    zipfileWrite16(a, pCDS->iInternalAttr);
 10302    zipfileWrite32(a, pCDS->iExternalAttr);
 10303    zipfileWrite32(a, pCDS->iOffset);
 10304  
 10305    memcpy(a, pCDS->zFile, pCDS->nFile);
 10306    a += pCDS->nFile;
 10307  
 10308    if( pEntry->aExtra ){
 10309      int n = (int)pCDS->nExtra + (int)pCDS->nComment;
 10310      memcpy(a, pEntry->aExtra, n);
 10311      a += n;
 10312    }else{
 10313      assert( pCDS->nExtra==9 );
 10314      zipfileWrite16(a, ZIPFILE_EXTRA_TIMESTAMP);
 10315      zipfileWrite16(a, 5);
 10316      *a++ = 0x01;
 10317      zipfileWrite32(a, pEntry->mUnixTime);
 10318    }
 10319  
 10320    return a-aBuf;
 10321  }
 10322  
 10323  static int zipfileCommit(sqlite3_vtab *pVtab){
 10324    ZipfileTab *pTab = (ZipfileTab*)pVtab;
 10325    int rc = SQLITE_OK;
 10326    if( pTab->pWriteFd ){
 10327      i64 iOffset = pTab->szCurrent;
 10328      ZipfileEntry *p;
 10329      ZipfileEOCD eocd;
 10330      int nEntry = 0;
 10331  
 10332      /* Write out all entries */
 10333      for(p=pTab->pFirstEntry; rc==SQLITE_OK && p; p=p->pNext){
 10334        int n = zipfileSerializeCDS(p, pTab->aBuffer);
 10335        rc = zipfileAppendData(pTab, pTab->aBuffer, n);
 10336        nEntry++;
 10337      }
 10338  
 10339      /* Write out the EOCD record */
 10340      eocd.iDisk = 0;
 10341      eocd.iFirstDisk = 0;
 10342      eocd.nEntry = (u16)nEntry;
 10343      eocd.nEntryTotal = (u16)nEntry;
 10344      eocd.nSize = (u32)(pTab->szCurrent - iOffset);
 10345      eocd.iOffset = (u32)iOffset;
 10346      rc = zipfileAppendEOCD(pTab, &eocd);
 10347  
 10348      zipfileCleanupTransaction(pTab);
 10349    }
 10350    return rc;
 10351  }
 10352  
 10353  static int zipfileRollback(sqlite3_vtab *pVtab){
 10354    return zipfileCommit(pVtab);
 10355  }
 10356  
 10357  static ZipfileCsr *zipfileFindCursor(ZipfileTab *pTab, i64 iId){
 10358    ZipfileCsr *pCsr;
 10359    for(pCsr=pTab->pCsrList; pCsr; pCsr=pCsr->pCsrNext){
 10360      if( iId==pCsr->iId ) break;
 10361    }
 10362    return pCsr;
 10363  }
 10364  
 10365  static void zipfileFunctionCds(
 10366    sqlite3_context *context,
 10367    int argc,
 10368    sqlite3_value **argv
 10369  ){
 10370    ZipfileCsr *pCsr;
 10371    ZipfileTab *pTab = (ZipfileTab*)sqlite3_user_data(context);
 10372    assert( argc>0 );
 10373  
 10374    pCsr = zipfileFindCursor(pTab, sqlite3_value_int64(argv[0]));
 10375    if( pCsr ){
 10376      ZipfileCDS *p = &pCsr->pCurrent->cds;
 10377      char *zRes = sqlite3_mprintf("{"
 10378          "\"version-made-by\" : %u, "
 10379          "\"version-to-extract\" : %u, "
 10380          "\"flags\" : %u, "
 10381          "\"compression\" : %u, "
 10382          "\"time\" : %u, "
 10383          "\"date\" : %u, "
 10384          "\"crc32\" : %u, "
 10385          "\"compressed-size\" : %u, "
 10386          "\"uncompressed-size\" : %u, "
 10387          "\"file-name-length\" : %u, "
 10388          "\"extra-field-length\" : %u, "
 10389          "\"file-comment-length\" : %u, "
 10390          "\"disk-number-start\" : %u, "
 10391          "\"internal-attr\" : %u, "
 10392          "\"external-attr\" : %u, "
 10393          "\"offset\" : %u }",
 10394          (u32)p->iVersionMadeBy, (u32)p->iVersionExtract,
 10395          (u32)p->flags, (u32)p->iCompression,
 10396          (u32)p->mTime, (u32)p->mDate,
 10397          (u32)p->crc32, (u32)p->szCompressed,
 10398          (u32)p->szUncompressed, (u32)p->nFile,
 10399          (u32)p->nExtra, (u32)p->nComment,
 10400          (u32)p->iDiskStart, (u32)p->iInternalAttr,
 10401          (u32)p->iExternalAttr, (u32)p->iOffset
 10402      );
 10403  
 10404      if( zRes==0 ){
 10405        sqlite3_result_error_nomem(context);
 10406      }else{
 10407        sqlite3_result_text(context, zRes, -1, SQLITE_TRANSIENT);
 10408        sqlite3_free(zRes);
 10409      }
 10410    }
 10411  }
 10412  
 10413  /*
 10414  ** xFindFunction method.
 10415  */
 10416  static int zipfileFindFunction(
 10417    sqlite3_vtab *pVtab,            /* Virtual table handle */
 10418    int nArg,                       /* Number of SQL function arguments */
 10419    const char *zName,              /* Name of SQL function */
 10420    void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), /* OUT: Result */
 10421    void **ppArg                    /* OUT: User data for *pxFunc */
 10422  ){
 10423    (void)nArg;
 10424    if( sqlite3_stricmp("zipfile_cds", zName)==0 ){
 10425      *pxFunc = zipfileFunctionCds;
 10426      *ppArg = (void*)pVtab;
 10427      return 1;
 10428    }
 10429    return 0;
 10430  }
 10431  
 10432  typedef struct ZipfileBuffer ZipfileBuffer;
 10433  struct ZipfileBuffer {
 10434    u8 *a;                          /* Pointer to buffer */
 10435    int n;                          /* Size of buffer in bytes */
 10436    int nAlloc;                     /* Byte allocated at a[] */
 10437  };
 10438  
 10439  typedef struct ZipfileCtx ZipfileCtx;
 10440  struct ZipfileCtx {
 10441    int nEntry;
 10442    ZipfileBuffer body;
 10443    ZipfileBuffer cds;
 10444  };
 10445  
 10446  static int zipfileBufferGrow(ZipfileBuffer *pBuf, int nByte){
 10447    if( pBuf->n+nByte>pBuf->nAlloc ){
 10448      u8 *aNew;
 10449      sqlite3_int64 nNew = pBuf->n ? pBuf->n*2 : 512;
 10450      int nReq = pBuf->n + nByte;
 10451  
 10452      while( nNew<nReq ) nNew = nNew*2;
 10453      aNew = sqlite3_realloc64(pBuf->a, nNew);
 10454      if( aNew==0 ) return SQLITE_NOMEM;
 10455      pBuf->a = aNew;
 10456      pBuf->nAlloc = (int)nNew;
 10457    }
 10458    return SQLITE_OK;
 10459  }
 10460  
 10461  /*
 10462  ** xStep() callback for the zipfile() aggregate. This can be called in
 10463  ** any of the following ways:
 10464  **
 10465  **   SELECT zipfile(name,data) ...
 10466  **   SELECT zipfile(name,mode,mtime,data) ...
 10467  **   SELECT zipfile(name,mode,mtime,data,method) ...
 10468  */
 10469  static void zipfileStep(sqlite3_context *pCtx, int nVal, sqlite3_value **apVal){
 10470    ZipfileCtx *p;                  /* Aggregate function context */
 10471    ZipfileEntry e;                 /* New entry to add to zip archive */
 10472  
 10473    sqlite3_value *pName = 0;
 10474    sqlite3_value *pMode = 0;
 10475    sqlite3_value *pMtime = 0;
 10476    sqlite3_value *pData = 0;
 10477    sqlite3_value *pMethod = 0;
 10478  
 10479    int bIsDir = 0;
 10480    u32 mode;
 10481    int rc = SQLITE_OK;
 10482    char *zErr = 0;
 10483  
 10484    int iMethod = -1;               /* Compression method to use (0 or 8) */
 10485  
 10486    const u8 *aData = 0;            /* Possibly compressed data for new entry */
 10487    int nData = 0;                  /* Size of aData[] in bytes */
 10488    int szUncompressed = 0;         /* Size of data before compression */
 10489    u8 *aFree = 0;                  /* Free this before returning */
 10490    u32 iCrc32 = 0;                 /* crc32 of uncompressed data */
 10491  
 10492    char *zName = 0;                /* Path (name) of new entry */
 10493    int nName = 0;                  /* Size of zName in bytes */
 10494    char *zFree = 0;                /* Free this before returning */
 10495    int nByte;
 10496  
 10497    memset(&e, 0, sizeof(e));
 10498    p = (ZipfileCtx*)sqlite3_aggregate_context(pCtx, sizeof(ZipfileCtx));
 10499    if( p==0 ) return;
 10500  
 10501    /* Martial the arguments into stack variables */
 10502    if( nVal!=2 && nVal!=4 && nVal!=5 ){
 10503      zErr = sqlite3_mprintf("wrong number of arguments to function zipfile()");
 10504      rc = SQLITE_ERROR;
 10505      goto zipfile_step_out;
 10506    }
 10507    pName = apVal[0];
 10508    if( nVal==2 ){
 10509      pData = apVal[1];
 10510    }else{
 10511      pMode = apVal[1];
 10512      pMtime = apVal[2];
 10513      pData = apVal[3];
 10514      if( nVal==5 ){
 10515        pMethod = apVal[4];
 10516      }
 10517    }
 10518  
 10519    /* Check that the 'name' parameter looks ok. */
 10520    zName = (char*)sqlite3_value_text(pName);
 10521    nName = sqlite3_value_bytes(pName);
 10522    if( zName==0 ){
 10523      zErr = sqlite3_mprintf("first argument to zipfile() must be non-NULL");
 10524      rc = SQLITE_ERROR;
 10525      goto zipfile_step_out;
 10526    }
 10527  
 10528    /* Inspect the 'method' parameter. This must be either 0 (store), 8 (use
 10529    ** deflate compression) or NULL (choose automatically).  */
 10530    if( pMethod && SQLITE_NULL!=sqlite3_value_type(pMethod) ){
 10531      iMethod = (int)sqlite3_value_int64(pMethod);
 10532      if( iMethod!=0 && iMethod!=8 ){
 10533        zErr = sqlite3_mprintf("illegal method value: %d", iMethod);
 10534        rc = SQLITE_ERROR;
 10535        goto zipfile_step_out;
 10536      }
 10537    }
 10538  
 10539    /* Now inspect the data. If this is NULL, then the new entry must be a
 10540    ** directory.  Otherwise, figure out whether or not the data should
 10541    ** be deflated or simply stored in the zip archive. */
 10542    if( sqlite3_value_type(pData)==SQLITE_NULL ){
 10543      bIsDir = 1;
 10544      iMethod = 0;
 10545    }else{
 10546      aData = sqlite3_value_blob(pData);
 10547      szUncompressed = nData = sqlite3_value_bytes(pData);
 10548      iCrc32 = crc32(0, aData, nData);
 10549      if( iMethod<0 || iMethod==8 ){
 10550        int nOut = 0;
 10551        rc = zipfileDeflate(aData, nData, &aFree, &nOut, &zErr);
 10552        if( rc!=SQLITE_OK ){
 10553          goto zipfile_step_out;
 10554        }
 10555        if( iMethod==8 || nOut<nData ){
 10556          aData = aFree;
 10557          nData = nOut;
 10558          iMethod = 8;
 10559        }else{
 10560          iMethod = 0;
 10561        }
 10562      }
 10563    }
 10564  
 10565    /* Decode the "mode" argument. */
 10566    rc = zipfileGetMode(pMode, bIsDir, &mode, &zErr);
 10567    if( rc ) goto zipfile_step_out;
 10568  
 10569    /* Decode the "mtime" argument. */
 10570    e.mUnixTime = zipfileGetTime(pMtime);
 10571  
 10572    /* If this is a directory entry, ensure that there is exactly one '/'
 10573    ** at the end of the path. Or, if this is not a directory and the path
 10574    ** ends in '/' it is an error. */
 10575    if( bIsDir==0 ){
 10576      if( nName>0 && zName[nName-1]=='/' ){
 10577        zErr = sqlite3_mprintf("non-directory name must not end with /");
 10578        rc = SQLITE_ERROR;
 10579        goto zipfile_step_out;
 10580      }
 10581    }else{
 10582      if( nName==0 || zName[nName-1]!='/' ){
 10583        zName = zFree = sqlite3_mprintf("%s/", zName);
 10584        if( zName==0 ){
 10585          rc = SQLITE_NOMEM;
 10586          goto zipfile_step_out;
 10587        }
 10588        nName = (int)strlen(zName);
 10589      }else{
 10590        while( nName>1 && zName[nName-2]=='/' ) nName--;
 10591      }
 10592    }
 10593  
 10594    /* Assemble the ZipfileEntry object for the new zip archive entry */
 10595    e.cds.iVersionMadeBy = ZIPFILE_NEWENTRY_MADEBY;
 10596    e.cds.iVersionExtract = ZIPFILE_NEWENTRY_REQUIRED;
 10597    e.cds.flags = ZIPFILE_NEWENTRY_FLAGS;
 10598    e.cds.iCompression = (u16)iMethod;
 10599    zipfileMtimeToDos(&e.cds, (u32)e.mUnixTime);
 10600    e.cds.crc32 = iCrc32;
 10601    e.cds.szCompressed = nData;
 10602    e.cds.szUncompressed = szUncompressed;
 10603    e.cds.iExternalAttr = (mode<<16);
 10604    e.cds.iOffset = p->body.n;
 10605    e.cds.nFile = (u16)nName;
 10606    e.cds.zFile = zName;
 10607  
 10608    /* Append the LFH to the body of the new archive */
 10609    nByte = ZIPFILE_LFH_FIXED_SZ + e.cds.nFile + 9;
 10610    if( (rc = zipfileBufferGrow(&p->body, nByte)) ) goto zipfile_step_out;
 10611    p->body.n += zipfileSerializeLFH(&e, &p->body.a[p->body.n]);
 10612  
 10613    /* Append the data to the body of the new archive */
 10614    if( nData>0 ){
 10615      if( (rc = zipfileBufferGrow(&p->body, nData)) ) goto zipfile_step_out;
 10616      memcpy(&p->body.a[p->body.n], aData, nData);
 10617      p->body.n += nData;
 10618    }
 10619  
 10620    /* Append the CDS record to the directory of the new archive */
 10621    nByte = ZIPFILE_CDS_FIXED_SZ + e.cds.nFile + 9;
 10622    if( (rc = zipfileBufferGrow(&p->cds, nByte)) ) goto zipfile_step_out;
 10623    p->cds.n += zipfileSerializeCDS(&e, &p->cds.a[p->cds.n]);
 10624  
 10625    /* Increment the count of entries in the archive */
 10626    p->nEntry++;
 10627  
 10628   zipfile_step_out:
 10629    sqlite3_free(aFree);
 10630    sqlite3_free(zFree);
 10631    if( rc ){
 10632      if( zErr ){
 10633        sqlite3_result_error(pCtx, zErr, -1);
 10634      }else{
 10635        sqlite3_result_error_code(pCtx, rc);
 10636      }
 10637    }
 10638    sqlite3_free(zErr);
 10639  }
 10640  
 10641  /*
 10642  ** xFinalize() callback for zipfile aggregate function.
 10643  */
 10644  static void zipfileFinal(sqlite3_context *pCtx){
 10645    ZipfileCtx *p;
 10646    ZipfileEOCD eocd;
 10647    sqlite3_int64 nZip;
 10648    u8 *aZip;
 10649  
 10650    p = (ZipfileCtx*)sqlite3_aggregate_context(pCtx, sizeof(ZipfileCtx));
 10651    if( p==0 ) return;
 10652    if( p->nEntry>0 ){
 10653      memset(&eocd, 0, sizeof(eocd));
 10654      eocd.nEntry = (u16)p->nEntry;
 10655      eocd.nEntryTotal = (u16)p->nEntry;
 10656      eocd.nSize = p->cds.n;
 10657      eocd.iOffset = p->body.n;
 10658  
 10659      nZip = p->body.n + p->cds.n + ZIPFILE_EOCD_FIXED_SZ;
 10660      aZip = (u8*)sqlite3_malloc64(nZip);
 10661      if( aZip==0 ){
 10662        sqlite3_result_error_nomem(pCtx);
 10663      }else{
 10664        memcpy(aZip, p->body.a, p->body.n);
 10665        memcpy(&aZip[p->body.n], p->cds.a, p->cds.n);
 10666        zipfileSerializeEOCD(&eocd, &aZip[p->body.n + p->cds.n]);
 10667        sqlite3_result_blob(pCtx, aZip, (int)nZip, zipfileFree);
 10668      }
 10669    }
 10670  
 10671    sqlite3_free(p->body.a);
 10672    sqlite3_free(p->cds.a);
 10673  }
 10674  
 10675  
 10676  /*
 10677  ** Register the "zipfile" virtual table.
 10678  */
 10679  static int zipfileRegister(sqlite3 *db){
 10680    static sqlite3_module zipfileModule = {
 10681      1,                         /* iVersion */
 10682      zipfileConnect,            /* xCreate */
 10683      zipfileConnect,            /* xConnect */
 10684      zipfileBestIndex,          /* xBestIndex */
 10685      zipfileDisconnect,         /* xDisconnect */
 10686      zipfileDisconnect,         /* xDestroy */
 10687      zipfileOpen,               /* xOpen - open a cursor */
 10688      zipfileClose,              /* xClose - close a cursor */
 10689      zipfileFilter,             /* xFilter - configure scan constraints */
 10690      zipfileNext,               /* xNext - advance a cursor */
 10691      zipfileEof,                /* xEof - check for end of scan */
 10692      zipfileColumn,             /* xColumn - read data */
 10693      0,                         /* xRowid - read data */
 10694      zipfileUpdate,             /* xUpdate */
 10695      zipfileBegin,              /* xBegin */
 10696      0,                         /* xSync */
 10697      zipfileCommit,             /* xCommit */
 10698      zipfileRollback,           /* xRollback */
 10699      zipfileFindFunction,       /* xFindMethod */
 10700      0,                         /* xRename */
 10701      0,                         /* xSavepoint */
 10702      0,                         /* xRelease */
 10703      0,                         /* xRollback */
 10704      0                          /* xShadowName */
 10705    };
 10706  
 10707    int rc = sqlite3_create_module(db, "zipfile"  , &zipfileModule, 0);
 10708    if( rc==SQLITE_OK ) rc = sqlite3_overload_function(db, "zipfile_cds", -1);
 10709    if( rc==SQLITE_OK ){
 10710      rc = sqlite3_create_function(db, "zipfile", -1, SQLITE_UTF8, 0, 0, 
 10711          zipfileStep, zipfileFinal
 10712      );
 10713    }
 10714    assert( sizeof(i64)==8 );
 10715    assert( sizeof(u32)==4 );
 10716    assert( sizeof(u16)==2 );
 10717    assert( sizeof(u8)==1 );
 10718    return rc;
 10719  }
 10720  #else         /* SQLITE_OMIT_VIRTUALTABLE */
 10721  # define zipfileRegister(x) SQLITE_OK
 10722  #endif
 10723  
 10724  #ifdef _WIN32
 10725  
 10726  #endif
 10727  int sqlite3_zipfile_init(
 10728    sqlite3 *db, 
 10729    char **pzErrMsg, 
 10730    const sqlite3_api_routines *pApi
 10731  ){
 10732    SQLITE_EXTENSION_INIT2(pApi);
 10733    (void)pzErrMsg;  /* Unused parameter */
 10734    return zipfileRegister(db);
 10735  }
 10736  
 10737  /************************* End ../ext/misc/zipfile.c ********************/
 10738  /************************* Begin ../ext/misc/sqlar.c ******************/
 10739  /*
 10740  ** 2017-12-17
 10741  **
 10742  ** The author disclaims copyright to this source code.  In place of
 10743  ** a legal notice, here is a blessing:
 10744  **
 10745  **    May you do good and not evil.
 10746  **    May you find forgiveness for yourself and forgive others.
 10747  **    May you share freely, never taking more than you give.
 10748  **
 10749  ******************************************************************************
 10750  **
 10751  ** Utility functions sqlar_compress() and sqlar_uncompress(). Useful
 10752  ** for working with sqlar archives and used by the shell tool's built-in
 10753  ** sqlar support.
 10754  */
 10755  /* #include "sqlite3ext.h" */
 10756  SQLITE_EXTENSION_INIT1
 10757  #include <zlib.h>
 10758  #include <assert.h>
 10759  
 10760  /*
 10761  ** Implementation of the "sqlar_compress(X)" SQL function.
 10762  **
 10763  ** If the type of X is SQLITE_BLOB, and compressing that blob using
 10764  ** zlib utility function compress() yields a smaller blob, return the
 10765  ** compressed blob. Otherwise, return a copy of X.
 10766  **
 10767  ** SQLar uses the "zlib format" for compressed content.  The zlib format
 10768  ** contains a two-byte identification header and a four-byte checksum at
 10769  ** the end.  This is different from ZIP which uses the raw deflate format.
 10770  **
 10771  ** Future enhancements to SQLar might add support for new compression formats.
 10772  ** If so, those new formats will be identified by alternative headers in the
 10773  ** compressed data.
 10774  */
 10775  static void sqlarCompressFunc(
 10776    sqlite3_context *context,
 10777    int argc,
 10778    sqlite3_value **argv
 10779  ){
 10780    assert( argc==1 );
 10781    if( sqlite3_value_type(argv[0])==SQLITE_BLOB ){
 10782      const Bytef *pData = sqlite3_value_blob(argv[0]);
 10783      uLong nData = sqlite3_value_bytes(argv[0]);
 10784      uLongf nOut = compressBound(nData);
 10785      Bytef *pOut;
 10786  
 10787      pOut = (Bytef*)sqlite3_malloc(nOut);
 10788      if( pOut==0 ){
 10789        sqlite3_result_error_nomem(context);
 10790        return;
 10791      }else{
 10792        if( Z_OK!=compress(pOut, &nOut, pData, nData) ){
 10793          sqlite3_result_error(context, "error in compress()", -1);
 10794        }else if( nOut<nData ){
 10795          sqlite3_result_blob(context, pOut, nOut, SQLITE_TRANSIENT);
 10796        }else{
 10797          sqlite3_result_value(context, argv[0]);
 10798        }
 10799        sqlite3_free(pOut);
 10800      }
 10801    }else{
 10802      sqlite3_result_value(context, argv[0]);
 10803    }
 10804  }
 10805  
 10806  /*
 10807  ** Implementation of the "sqlar_uncompress(X,SZ)" SQL function
 10808  **
 10809  ** Parameter SZ is interpreted as an integer. If it is less than or
 10810  ** equal to zero, then this function returns a copy of X. Or, if
 10811  ** SZ is equal to the size of X when interpreted as a blob, also
 10812  ** return a copy of X. Otherwise, decompress blob X using zlib
 10813  ** utility function uncompress() and return the results (another
 10814  ** blob).
 10815  */
 10816  static void sqlarUncompressFunc(
 10817    sqlite3_context *context,
 10818    int argc,
 10819    sqlite3_value **argv
 10820  ){
 10821    uLong nData;
 10822    uLongf sz;
 10823  
 10824    assert( argc==2 );
 10825    sz = sqlite3_value_int(argv[1]);
 10826  
 10827    if( sz<=0 || sz==(nData = sqlite3_value_bytes(argv[0])) ){
 10828      sqlite3_result_value(context, argv[0]);
 10829    }else{
 10830      const Bytef *pData= sqlite3_value_blob(argv[0]);
 10831      Bytef *pOut = sqlite3_malloc(sz);
 10832      if( pOut==0 ){
 10833        sqlite3_result_error_nomem(context);
 10834      }else if( Z_OK!=uncompress(pOut, &sz, pData, nData) ){
 10835        sqlite3_result_error(context, "error in uncompress()", -1);
 10836      }else{
 10837        sqlite3_result_blob(context, pOut, sz, SQLITE_TRANSIENT);
 10838      }
 10839      sqlite3_free(pOut);
 10840    }
 10841  }
 10842  
 10843  #ifdef _WIN32
 10844  
 10845  #endif
 10846  int sqlite3_sqlar_init(
 10847    sqlite3 *db, 
 10848    char **pzErrMsg, 
 10849    const sqlite3_api_routines *pApi
 10850  ){
 10851    int rc = SQLITE_OK;
 10852    SQLITE_EXTENSION_INIT2(pApi);
 10853    (void)pzErrMsg;  /* Unused parameter */
 10854    rc = sqlite3_create_function(db, "sqlar_compress", 1, 
 10855                                 SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
 10856                                 sqlarCompressFunc, 0, 0);
 10857    if( rc==SQLITE_OK ){
 10858      rc = sqlite3_create_function(db, "sqlar_uncompress", 2,
 10859                                   SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
 10860                                   sqlarUncompressFunc, 0, 0);
 10861    }
 10862    return rc;
 10863  }
 10864  
 10865  /************************* End ../ext/misc/sqlar.c ********************/
 10866  #endif
 10867  /************************* Begin ../ext/expert/sqlite3expert.h ******************/
 10868  /*
 10869  ** 2017 April 07
 10870  **
 10871  ** The author disclaims copyright to this source code.  In place of
 10872  ** a legal notice, here is a blessing:
 10873  **
 10874  **    May you do good and not evil.
 10875  **    May you find forgiveness for yourself and forgive others.
 10876  **    May you share freely, never taking more than you give.
 10877  **
 10878  *************************************************************************
 10879  */
 10880  #if !defined(SQLITEEXPERT_H)
 10881  #define SQLITEEXPERT_H 1
 10882  /* #include "sqlite3.h" */
 10883  
 10884  typedef struct sqlite3expert sqlite3expert;
 10885  
 10886  /*
 10887  ** Create a new sqlite3expert object.
 10888  **
 10889  ** If successful, a pointer to the new object is returned and (*pzErr) set
 10890  ** to NULL. Or, if an error occurs, NULL is returned and (*pzErr) set to
 10891  ** an English-language error message. In this case it is the responsibility
 10892  ** of the caller to eventually free the error message buffer using
 10893  ** sqlite3_free().
 10894  */
 10895  sqlite3expert *sqlite3_expert_new(sqlite3 *db, char **pzErr);
 10896  
 10897  /*
 10898  ** Configure an sqlite3expert object.
 10899  **
 10900  ** EXPERT_CONFIG_SAMPLE:
 10901  **   By default, sqlite3_expert_analyze() generates sqlite_stat1 data for
 10902  **   each candidate index. This involves scanning and sorting the entire
 10903  **   contents of each user database table once for each candidate index
 10904  **   associated with the table. For large databases, this can be 
 10905  **   prohibitively slow. This option allows the sqlite3expert object to
 10906  **   be configured so that sqlite_stat1 data is instead generated based on a
 10907  **   subset of each table, or so that no sqlite_stat1 data is used at all.
 10908  **
 10909  **   A single integer argument is passed to this option. If the value is less
 10910  **   than or equal to zero, then no sqlite_stat1 data is generated or used by
 10911  **   the analysis - indexes are recommended based on the database schema only.
 10912  **   Or, if the value is 100 or greater, complete sqlite_stat1 data is
 10913  **   generated for each candidate index (this is the default). Finally, if the
 10914  **   value falls between 0 and 100, then it represents the percentage of user
 10915  **   table rows that should be considered when generating sqlite_stat1 data.
 10916  **
 10917  **   Examples:
 10918  **
 10919  **     // Do not generate any sqlite_stat1 data
 10920  **     sqlite3_expert_config(pExpert, EXPERT_CONFIG_SAMPLE, 0);
 10921  **
 10922  **     // Generate sqlite_stat1 data based on 10% of the rows in each table.
 10923  **     sqlite3_expert_config(pExpert, EXPERT_CONFIG_SAMPLE, 10);
 10924  */
 10925  int sqlite3_expert_config(sqlite3expert *p, int op, ...);
 10926  
 10927  #define EXPERT_CONFIG_SAMPLE 1    /* int */
 10928  
 10929  /*
 10930  ** Specify zero or more SQL statements to be included in the analysis.
 10931  **
 10932  ** Buffer zSql must contain zero or more complete SQL statements. This
 10933  ** function parses all statements contained in the buffer and adds them
 10934  ** to the internal list of statements to analyze. If successful, SQLITE_OK
 10935  ** is returned and (*pzErr) set to NULL. Or, if an error occurs - for example
 10936  ** due to a error in the SQL - an SQLite error code is returned and (*pzErr)
 10937  ** may be set to point to an English language error message. In this case
 10938  ** the caller is responsible for eventually freeing the error message buffer
 10939  ** using sqlite3_free().
 10940  **
 10941  ** If an error does occur while processing one of the statements in the
 10942  ** buffer passed as the second argument, none of the statements in the
 10943  ** buffer are added to the analysis.
 10944  **
 10945  ** This function must be called before sqlite3_expert_analyze(). If a call
 10946  ** to this function is made on an sqlite3expert object that has already
 10947  ** been passed to sqlite3_expert_analyze() SQLITE_MISUSE is returned
 10948  ** immediately and no statements are added to the analysis.
 10949  */
 10950  int sqlite3_expert_sql(
 10951    sqlite3expert *p,               /* From a successful sqlite3_expert_new() */
 10952    const char *zSql,               /* SQL statement(s) to add */
 10953    char **pzErr                    /* OUT: Error message (if any) */
 10954  );
 10955  
 10956  
 10957  /*
 10958  ** This function is called after the sqlite3expert object has been configured
 10959  ** with all SQL statements using sqlite3_expert_sql() to actually perform
 10960  ** the analysis. Once this function has been called, it is not possible to
 10961  ** add further SQL statements to the analysis.
 10962  **
 10963  ** If successful, SQLITE_OK is returned and (*pzErr) is set to NULL. Or, if
 10964  ** an error occurs, an SQLite error code is returned and (*pzErr) set to 
 10965  ** point to a buffer containing an English language error message. In this
 10966  ** case it is the responsibility of the caller to eventually free the buffer
 10967  ** using sqlite3_free().
 10968  **
 10969  ** If an error does occur within this function, the sqlite3expert object
 10970  ** is no longer useful for any purpose. At that point it is no longer
 10971  ** possible to add further SQL statements to the object or to re-attempt
 10972  ** the analysis. The sqlite3expert object must still be freed using a call
 10973  ** sqlite3_expert_destroy().
 10974  */
 10975  int sqlite3_expert_analyze(sqlite3expert *p, char **pzErr);
 10976  
 10977  /*
 10978  ** Return the total number of statements loaded using sqlite3_expert_sql().
 10979  ** The total number of SQL statements may be different from the total number
 10980  ** to calls to sqlite3_expert_sql().
 10981  */
 10982  int sqlite3_expert_count(sqlite3expert*);
 10983  
 10984  /*
 10985  ** Return a component of the report.
 10986  **
 10987  ** This function is called after sqlite3_expert_analyze() to extract the
 10988  ** results of the analysis. Each call to this function returns either a
 10989  ** NULL pointer or a pointer to a buffer containing a nul-terminated string.
 10990  ** The value passed as the third argument must be one of the EXPERT_REPORT_*
 10991  ** #define constants defined below.
 10992  **
 10993  ** For some EXPERT_REPORT_* parameters, the buffer returned contains 
 10994  ** information relating to a specific SQL statement. In these cases that
 10995  ** SQL statement is identified by the value passed as the second argument.
 10996  ** SQL statements are numbered from 0 in the order in which they are parsed.
 10997  ** If an out-of-range value (less than zero or equal to or greater than the
 10998  ** value returned by sqlite3_expert_count()) is passed as the second argument
 10999  ** along with such an EXPERT_REPORT_* parameter, NULL is always returned.
 11000  **
 11001  ** EXPERT_REPORT_SQL:
 11002  **   Return the text of SQL statement iStmt.
 11003  **
 11004  ** EXPERT_REPORT_INDEXES:
 11005  **   Return a buffer containing the CREATE INDEX statements for all recommended
 11006  **   indexes for statement iStmt. If there are no new recommeded indexes, NULL 
 11007  **   is returned.
 11008  **
 11009  ** EXPERT_REPORT_PLAN:
 11010  **   Return a buffer containing the EXPLAIN QUERY PLAN output for SQL query
 11011  **   iStmt after the proposed indexes have been added to the database schema.
 11012  **
 11013  ** EXPERT_REPORT_CANDIDATES:
 11014  **   Return a pointer to a buffer containing the CREATE INDEX statements 
 11015  **   for all indexes that were tested (for all SQL statements). The iStmt
 11016  **   parameter is ignored for EXPERT_REPORT_CANDIDATES calls.
 11017  */
 11018  const char *sqlite3_expert_report(sqlite3expert*, int iStmt, int eReport);
 11019  
 11020  /*
 11021  ** Values for the third argument passed to sqlite3_expert_report().
 11022  */
 11023  #define EXPERT_REPORT_SQL        1
 11024  #define EXPERT_REPORT_INDEXES    2
 11025  #define EXPERT_REPORT_PLAN       3
 11026  #define EXPERT_REPORT_CANDIDATES 4
 11027  
 11028  /*
 11029  ** Free an (sqlite3expert*) handle and all associated resources. There 
 11030  ** should be one call to this function for each successful call to 
 11031  ** sqlite3-expert_new().
 11032  */
 11033  void sqlite3_expert_destroy(sqlite3expert*);
 11034  
 11035  #endif  /* !defined(SQLITEEXPERT_H) */
 11036  
 11037  /************************* End ../ext/expert/sqlite3expert.h ********************/
 11038  /************************* Begin ../ext/expert/sqlite3expert.c ******************/
 11039  /*
 11040  ** 2017 April 09
 11041  **
 11042  ** The author disclaims copyright to this source code.  In place of
 11043  ** a legal notice, here is a blessing:
 11044  **
 11045  **    May you do good and not evil.
 11046  **    May you find forgiveness for yourself and forgive others.
 11047  **    May you share freely, never taking more than you give.
 11048  **
 11049  *************************************************************************
 11050  */
 11051  /* #include "sqlite3expert.h" */
 11052  #include <assert.h>
 11053  #include <string.h>
 11054  #include <stdio.h>
 11055  
 11056  #if !defined(SQLITE_AMALGAMATION)
 11057  #if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST)
 11058  # define SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS 1
 11059  #endif
 11060  #if defined(SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS)
 11061  # define ALWAYS(X)      (1)
 11062  # define NEVER(X)       (0)
 11063  #elif !defined(NDEBUG)
 11064  # define ALWAYS(X)      ((X)?1:(assert(0),0))
 11065  # define NEVER(X)       ((X)?(assert(0),1):0)
 11066  #else
 11067  # define ALWAYS(X)      (X)
 11068  # define NEVER(X)       (X)
 11069  #endif
 11070  #endif /* !defined(SQLITE_AMALGAMATION) */
 11071  
 11072  
 11073  #ifndef SQLITE_OMIT_VIRTUALTABLE 
 11074  
 11075  /* typedef sqlite3_int64 i64; */
 11076  /* typedef sqlite3_uint64 u64; */
 11077  
 11078  typedef struct IdxColumn IdxColumn;
 11079  typedef struct IdxConstraint IdxConstraint;
 11080  typedef struct IdxScan IdxScan;
 11081  typedef struct IdxStatement IdxStatement;
 11082  typedef struct IdxTable IdxTable;
 11083  typedef struct IdxWrite IdxWrite;
 11084  
 11085  #define STRLEN  (int)strlen
 11086  
 11087  /*
 11088  ** A temp table name that we assume no user database will actually use.
 11089  ** If this assumption proves incorrect triggers on the table with the
 11090  ** conflicting name will be ignored.
 11091  */
 11092  #define UNIQUE_TABLE_NAME "t592690916721053953805701627921227776"
 11093  
 11094  /*
 11095  ** A single constraint. Equivalent to either "col = ?" or "col < ?" (or
 11096  ** any other type of single-ended range constraint on a column).
 11097  **
 11098  ** pLink:
 11099  **   Used to temporarily link IdxConstraint objects into lists while
 11100  **   creating candidate indexes.
 11101  */
 11102  struct IdxConstraint {
 11103    char *zColl;                    /* Collation sequence */
 11104    int bRange;                     /* True for range, false for eq */
 11105    int iCol;                       /* Constrained table column */
 11106    int bFlag;                      /* Used by idxFindCompatible() */
 11107    int bDesc;                      /* True if ORDER BY <expr> DESC */
 11108    IdxConstraint *pNext;           /* Next constraint in pEq or pRange list */
 11109    IdxConstraint *pLink;           /* See above */
 11110  };
 11111  
 11112  /*
 11113  ** A single scan of a single table.
 11114  */
 11115  struct IdxScan {
 11116    IdxTable *pTab;                 /* Associated table object */
 11117    int iDb;                        /* Database containing table zTable */
 11118    i64 covering;                   /* Mask of columns required for cov. index */
 11119    IdxConstraint *pOrder;          /* ORDER BY columns */
 11120    IdxConstraint *pEq;             /* List of == constraints */
 11121    IdxConstraint *pRange;          /* List of < constraints */
 11122    IdxScan *pNextScan;             /* Next IdxScan object for same analysis */
 11123  };
 11124  
 11125  /*
 11126  ** Information regarding a single database table. Extracted from 
 11127  ** "PRAGMA table_info" by function idxGetTableInfo().
 11128  */
 11129  struct IdxColumn {
 11130    char *zName;
 11131    char *zColl;
 11132    int iPk;
 11133  };
 11134  struct IdxTable {
 11135    int nCol;
 11136    char *zName;                    /* Table name */
 11137    IdxColumn *aCol;
 11138    IdxTable *pNext;                /* Next table in linked list of all tables */
 11139  };
 11140  
 11141  /*
 11142  ** An object of the following type is created for each unique table/write-op
 11143  ** seen. The objects are stored in a singly-linked list beginning at
 11144  ** sqlite3expert.pWrite.
 11145  */
 11146  struct IdxWrite {
 11147    IdxTable *pTab;
 11148    int eOp;                        /* SQLITE_UPDATE, DELETE or INSERT */
 11149    IdxWrite *pNext;
 11150  };
 11151  
 11152  /*
 11153  ** Each statement being analyzed is represented by an instance of this
 11154  ** structure.
 11155  */
 11156  struct IdxStatement {
 11157    int iId;                        /* Statement number */
 11158    char *zSql;                     /* SQL statement */
 11159    char *zIdx;                     /* Indexes */
 11160    char *zEQP;                     /* Plan */
 11161    IdxStatement *pNext;
 11162  };
 11163  
 11164  
 11165  /*
 11166  ** A hash table for storing strings. With space for a payload string
 11167  ** with each entry. Methods are:
 11168  **
 11169  **   idxHashInit()
 11170  **   idxHashClear()
 11171  **   idxHashAdd()
 11172  **   idxHashSearch()
 11173  */
 11174  #define IDX_HASH_SIZE 1023
 11175  typedef struct IdxHashEntry IdxHashEntry;
 11176  typedef struct IdxHash IdxHash;
 11177  struct IdxHashEntry {
 11178    char *zKey;                     /* nul-terminated key */
 11179    char *zVal;                     /* nul-terminated value string */
 11180    char *zVal2;                    /* nul-terminated value string 2 */
 11181    IdxHashEntry *pHashNext;        /* Next entry in same hash bucket */
 11182    IdxHashEntry *pNext;            /* Next entry in hash */
 11183  };
 11184  struct IdxHash {
 11185    IdxHashEntry *pFirst;
 11186    IdxHashEntry *aHash[IDX_HASH_SIZE];
 11187  };
 11188  
 11189  /*
 11190  ** sqlite3expert object.
 11191  */
 11192  struct sqlite3expert {
 11193    int iSample;                    /* Percentage of tables to sample for stat1 */
 11194    sqlite3 *db;                    /* User database */
 11195    sqlite3 *dbm;                   /* In-memory db for this analysis */
 11196    sqlite3 *dbv;                   /* Vtab schema for this analysis */
 11197    IdxTable *pTable;               /* List of all IdxTable objects */
 11198    IdxScan *pScan;                 /* List of scan objects */
 11199    IdxWrite *pWrite;               /* List of write objects */
 11200    IdxStatement *pStatement;       /* List of IdxStatement objects */
 11201    int bRun;                       /* True once analysis has run */
 11202    char **pzErrmsg;
 11203    int rc;                         /* Error code from whereinfo hook */
 11204    IdxHash hIdx;                   /* Hash containing all candidate indexes */
 11205    char *zCandidates;              /* For EXPERT_REPORT_CANDIDATES */
 11206  };
 11207  
 11208  
 11209  /*
 11210  ** Allocate and return nByte bytes of zeroed memory using sqlite3_malloc(). 
 11211  ** If the allocation fails, set *pRc to SQLITE_NOMEM and return NULL.
 11212  */
 11213  static void *idxMalloc(int *pRc, int nByte){
 11214    void *pRet;
 11215    assert( *pRc==SQLITE_OK );
 11216    assert( nByte>0 );
 11217    pRet = sqlite3_malloc(nByte);
 11218    if( pRet ){
 11219      memset(pRet, 0, nByte);
 11220    }else{
 11221      *pRc = SQLITE_NOMEM;
 11222    }
 11223    return pRet;
 11224  }
 11225  
 11226  /*
 11227  ** Initialize an IdxHash hash table.
 11228  */
 11229  static void idxHashInit(IdxHash *pHash){
 11230    memset(pHash, 0, sizeof(IdxHash));
 11231  }
 11232  
 11233  /*
 11234  ** Reset an IdxHash hash table.
 11235  */
 11236  static void idxHashClear(IdxHash *pHash){
 11237    int i;
 11238    for(i=0; i<IDX_HASH_SIZE; i++){
 11239      IdxHashEntry *pEntry;
 11240      IdxHashEntry *pNext;
 11241      for(pEntry=pHash->aHash[i]; pEntry; pEntry=pNext){
 11242        pNext = pEntry->pHashNext;
 11243        sqlite3_free(pEntry->zVal2);
 11244        sqlite3_free(pEntry);
 11245      }
 11246    }
 11247    memset(pHash, 0, sizeof(IdxHash));
 11248  }
 11249  
 11250  /*
 11251  ** Return the index of the hash bucket that the string specified by the
 11252  ** arguments to this function belongs.
 11253  */
 11254  static int idxHashString(const char *z, int n){
 11255    unsigned int ret = 0;
 11256    int i;
 11257    for(i=0; i<n; i++){
 11258      ret += (ret<<3) + (unsigned char)(z[i]);
 11259    }
 11260    return (int)(ret % IDX_HASH_SIZE);
 11261  }
 11262  
 11263  /*
 11264  ** If zKey is already present in the hash table, return non-zero and do
 11265  ** nothing. Otherwise, add an entry with key zKey and payload string zVal to
 11266  ** the hash table passed as the second argument. 
 11267  */
 11268  static int idxHashAdd(
 11269    int *pRc, 
 11270    IdxHash *pHash, 
 11271    const char *zKey,
 11272    const char *zVal
 11273  ){
 11274    int nKey = STRLEN(zKey);
 11275    int iHash = idxHashString(zKey, nKey);
 11276    int nVal = (zVal ? STRLEN(zVal) : 0);
 11277    IdxHashEntry *pEntry;
 11278    assert( iHash>=0 );
 11279    for(pEntry=pHash->aHash[iHash]; pEntry; pEntry=pEntry->pHashNext){
 11280      if( STRLEN(pEntry->zKey)==nKey && 0==memcmp(pEntry->zKey, zKey, nKey) ){
 11281        return 1;
 11282      }
 11283    }
 11284    pEntry = idxMalloc(pRc, sizeof(IdxHashEntry) + nKey+1 + nVal+1);
 11285    if( pEntry ){
 11286      pEntry->zKey = (char*)&pEntry[1];
 11287      memcpy(pEntry->zKey, zKey, nKey);
 11288      if( zVal ){
 11289        pEntry->zVal = &pEntry->zKey[nKey+1];
 11290        memcpy(pEntry->zVal, zVal, nVal);
 11291      }
 11292      pEntry->pHashNext = pHash->aHash[iHash];
 11293      pHash->aHash[iHash] = pEntry;
 11294  
 11295      pEntry->pNext = pHash->pFirst;
 11296      pHash->pFirst = pEntry;
 11297    }
 11298    return 0;
 11299  }
 11300  
 11301  /*
 11302  ** If zKey/nKey is present in the hash table, return a pointer to the 
 11303  ** hash-entry object.
 11304  */
 11305  static IdxHashEntry *idxHashFind(IdxHash *pHash, const char *zKey, int nKey){
 11306    int iHash;
 11307    IdxHashEntry *pEntry;
 11308    if( nKey<0 ) nKey = STRLEN(zKey);
 11309    iHash = idxHashString(zKey, nKey);
 11310    assert( iHash>=0 );
 11311    for(pEntry=pHash->aHash[iHash]; pEntry; pEntry=pEntry->pHashNext){
 11312      if( STRLEN(pEntry->zKey)==nKey && 0==memcmp(pEntry->zKey, zKey, nKey) ){
 11313        return pEntry;
 11314      }
 11315    }
 11316    return 0;
 11317  }
 11318  
 11319  /*
 11320  ** If the hash table contains an entry with a key equal to the string
 11321  ** passed as the final two arguments to this function, return a pointer
 11322  ** to the payload string. Otherwise, if zKey/nKey is not present in the
 11323  ** hash table, return NULL.
 11324  */
 11325  static const char *idxHashSearch(IdxHash *pHash, const char *zKey, int nKey){
 11326    IdxHashEntry *pEntry = idxHashFind(pHash, zKey, nKey);
 11327    if( pEntry ) return pEntry->zVal;
 11328    return 0;
 11329  }
 11330  
 11331  /*
 11332  ** Allocate and return a new IdxConstraint object. Set the IdxConstraint.zColl
 11333  ** variable to point to a copy of nul-terminated string zColl.
 11334  */
 11335  static IdxConstraint *idxNewConstraint(int *pRc, const char *zColl){
 11336    IdxConstraint *pNew;
 11337    int nColl = STRLEN(zColl);
 11338  
 11339    assert( *pRc==SQLITE_OK );
 11340    pNew = (IdxConstraint*)idxMalloc(pRc, sizeof(IdxConstraint) * nColl + 1);
 11341    if( pNew ){
 11342      pNew->zColl = (char*)&pNew[1];
 11343      memcpy(pNew->zColl, zColl, nColl+1);
 11344    }
 11345    return pNew;
 11346  }
 11347  
 11348  /*
 11349  ** An error associated with database handle db has just occurred. Pass
 11350  ** the error message to callback function xOut.
 11351  */
 11352  static void idxDatabaseError(
 11353    sqlite3 *db,                    /* Database handle */
 11354    char **pzErrmsg                 /* Write error here */
 11355  ){
 11356    *pzErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(db));
 11357  }
 11358  
 11359  /*
 11360  ** Prepare an SQL statement.
 11361  */
 11362  static int idxPrepareStmt(
 11363    sqlite3 *db,                    /* Database handle to compile against */
 11364    sqlite3_stmt **ppStmt,          /* OUT: Compiled SQL statement */
 11365    char **pzErrmsg,                /* OUT: sqlite3_malloc()ed error message */
 11366    const char *zSql                /* SQL statement to compile */
 11367  ){
 11368    int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0);
 11369    if( rc!=SQLITE_OK ){
 11370      *ppStmt = 0;
 11371      idxDatabaseError(db, pzErrmsg);
 11372    }
 11373    return rc;
 11374  }
 11375  
 11376  /*
 11377  ** Prepare an SQL statement using the results of a printf() formatting.
 11378  */
 11379  static int idxPrintfPrepareStmt(
 11380    sqlite3 *db,                    /* Database handle to compile against */
 11381    sqlite3_stmt **ppStmt,          /* OUT: Compiled SQL statement */
 11382    char **pzErrmsg,                /* OUT: sqlite3_malloc()ed error message */
 11383    const char *zFmt,               /* printf() format of SQL statement */
 11384    ...                             /* Trailing printf() arguments */
 11385  ){
 11386    va_list ap;
 11387    int rc;
 11388    char *zSql;
 11389    va_start(ap, zFmt);
 11390    zSql = sqlite3_vmprintf(zFmt, ap);
 11391    if( zSql==0 ){
 11392      rc = SQLITE_NOMEM;
 11393    }else{
 11394      rc = idxPrepareStmt(db, ppStmt, pzErrmsg, zSql);
 11395      sqlite3_free(zSql);
 11396    }
 11397    va_end(ap);
 11398    return rc;
 11399  }
 11400  
 11401  
 11402  /*************************************************************************
 11403  ** Beginning of virtual table implementation.
 11404  */
 11405  typedef struct ExpertVtab ExpertVtab;
 11406  struct ExpertVtab {
 11407    sqlite3_vtab base;
 11408    IdxTable *pTab;
 11409    sqlite3expert *pExpert;
 11410  };
 11411  
 11412  typedef struct ExpertCsr ExpertCsr;
 11413  struct ExpertCsr {
 11414    sqlite3_vtab_cursor base;
 11415    sqlite3_stmt *pData;
 11416  };
 11417  
 11418  static char *expertDequote(const char *zIn){
 11419    int n = STRLEN(zIn);
 11420    char *zRet = sqlite3_malloc(n);
 11421  
 11422    assert( zIn[0]=='\'' );
 11423    assert( zIn[n-1]=='\'' );
 11424  
 11425    if( zRet ){
 11426      int iOut = 0;
 11427      int iIn = 0;
 11428      for(iIn=1; iIn<(n-1); iIn++){
 11429        if( zIn[iIn]=='\'' ){
 11430          assert( zIn[iIn+1]=='\'' );
 11431          iIn++;
 11432        }
 11433        zRet[iOut++] = zIn[iIn];
 11434      }
 11435      zRet[iOut] = '\0';
 11436    }
 11437  
 11438    return zRet;
 11439  }
 11440  
 11441  /* 
 11442  ** This function is the implementation of both the xConnect and xCreate
 11443  ** methods of the r-tree virtual table.
 11444  **
 11445  **   argv[0]   -> module name
 11446  **   argv[1]   -> database name
 11447  **   argv[2]   -> table name
 11448  **   argv[...] -> column names...
 11449  */
 11450  static int expertConnect(
 11451    sqlite3 *db,
 11452    void *pAux,
 11453    int argc, const char *const*argv,
 11454    sqlite3_vtab **ppVtab,
 11455    char **pzErr
 11456  ){
 11457    sqlite3expert *pExpert = (sqlite3expert*)pAux;
 11458    ExpertVtab *p = 0;
 11459    int rc;
 11460  
 11461    if( argc!=4 ){
 11462      *pzErr = sqlite3_mprintf("internal error!");
 11463      rc = SQLITE_ERROR;
 11464    }else{
 11465      char *zCreateTable = expertDequote(argv[3]);
 11466      if( zCreateTable ){
 11467        rc = sqlite3_declare_vtab(db, zCreateTable);
 11468        if( rc==SQLITE_OK ){
 11469          p = idxMalloc(&rc, sizeof(ExpertVtab));
 11470        }
 11471        if( rc==SQLITE_OK ){
 11472          p->pExpert = pExpert;
 11473          p->pTab = pExpert->pTable;
 11474          assert( sqlite3_stricmp(p->pTab->zName, argv[2])==0 );
 11475        }
 11476        sqlite3_free(zCreateTable);
 11477      }else{
 11478        rc = SQLITE_NOMEM;
 11479      }
 11480    }
 11481  
 11482    *ppVtab = (sqlite3_vtab*)p;
 11483    return rc;
 11484  }
 11485  
 11486  static int expertDisconnect(sqlite3_vtab *pVtab){
 11487    ExpertVtab *p = (ExpertVtab*)pVtab;
 11488    sqlite3_free(p);
 11489    return SQLITE_OK;
 11490  }
 11491  
 11492  static int expertBestIndex(sqlite3_vtab *pVtab, sqlite3_index_info *pIdxInfo){
 11493    ExpertVtab *p = (ExpertVtab*)pVtab;
 11494    int rc = SQLITE_OK;
 11495    int n = 0;
 11496    IdxScan *pScan;
 11497    const int opmask = 
 11498      SQLITE_INDEX_CONSTRAINT_EQ | SQLITE_INDEX_CONSTRAINT_GT |
 11499      SQLITE_INDEX_CONSTRAINT_LT | SQLITE_INDEX_CONSTRAINT_GE |
 11500      SQLITE_INDEX_CONSTRAINT_LE;
 11501  
 11502    pScan = idxMalloc(&rc, sizeof(IdxScan));
 11503    if( pScan ){
 11504      int i;
 11505  
 11506      /* Link the new scan object into the list */
 11507      pScan->pTab = p->pTab;
 11508      pScan->pNextScan = p->pExpert->pScan;
 11509      p->pExpert->pScan = pScan;
 11510  
 11511      /* Add the constraints to the IdxScan object */
 11512      for(i=0; i<pIdxInfo->nConstraint; i++){
 11513        struct sqlite3_index_constraint *pCons = &pIdxInfo->aConstraint[i];
 11514        if( pCons->usable 
 11515         && pCons->iColumn>=0 
 11516         && p->pTab->aCol[pCons->iColumn].iPk==0
 11517         && (pCons->op & opmask) 
 11518        ){
 11519          IdxConstraint *pNew;
 11520          const char *zColl = sqlite3_vtab_collation(pIdxInfo, i);
 11521          pNew = idxNewConstraint(&rc, zColl);
 11522          if( pNew ){
 11523            pNew->iCol = pCons->iColumn;
 11524            if( pCons->op==SQLITE_INDEX_CONSTRAINT_EQ ){
 11525              pNew->pNext = pScan->pEq;
 11526              pScan->pEq = pNew;
 11527            }else{
 11528              pNew->bRange = 1;
 11529              pNew->pNext = pScan->pRange;
 11530              pScan->pRange = pNew;
 11531            }
 11532          }
 11533          n++;
 11534          pIdxInfo->aConstraintUsage[i].argvIndex = n;
 11535        }
 11536      }
 11537  
 11538      /* Add the ORDER BY to the IdxScan object */
 11539      for(i=pIdxInfo->nOrderBy-1; i>=0; i--){
 11540        int iCol = pIdxInfo->aOrderBy[i].iColumn;
 11541        if( iCol>=0 ){
 11542          IdxConstraint *pNew = idxNewConstraint(&rc, p->pTab->aCol[iCol].zColl);
 11543          if( pNew ){
 11544            pNew->iCol = iCol;
 11545            pNew->bDesc = pIdxInfo->aOrderBy[i].desc;
 11546            pNew->pNext = pScan->pOrder;
 11547            pNew->pLink = pScan->pOrder;
 11548            pScan->pOrder = pNew;
 11549            n++;
 11550          }
 11551        }
 11552      }
 11553    }
 11554  
 11555    pIdxInfo->estimatedCost = 1000000.0 / (n+1);
 11556    return rc;
 11557  }
 11558  
 11559  static int expertUpdate(
 11560    sqlite3_vtab *pVtab, 
 11561    int nData, 
 11562    sqlite3_value **azData, 
 11563    sqlite_int64 *pRowid
 11564  ){
 11565    (void)pVtab;
 11566    (void)nData;
 11567    (void)azData;
 11568    (void)pRowid;
 11569    return SQLITE_OK;
 11570  }
 11571  
 11572  /* 
 11573  ** Virtual table module xOpen method.
 11574  */
 11575  static int expertOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
 11576    int rc = SQLITE_OK;
 11577    ExpertCsr *pCsr;
 11578    (void)pVTab;
 11579    pCsr = idxMalloc(&rc, sizeof(ExpertCsr));
 11580    *ppCursor = (sqlite3_vtab_cursor*)pCsr;
 11581    return rc;
 11582  }
 11583  
 11584  /* 
 11585  ** Virtual table module xClose method.
 11586  */
 11587  static int expertClose(sqlite3_vtab_cursor *cur){
 11588    ExpertCsr *pCsr = (ExpertCsr*)cur;
 11589    sqlite3_finalize(pCsr->pData);
 11590    sqlite3_free(pCsr);
 11591    return SQLITE_OK;
 11592  }
 11593  
 11594  /*
 11595  ** Virtual table module xEof method.
 11596  **
 11597  ** Return non-zero if the cursor does not currently point to a valid 
 11598  ** record (i.e if the scan has finished), or zero otherwise.
 11599  */
 11600  static int expertEof(sqlite3_vtab_cursor *cur){
 11601    ExpertCsr *pCsr = (ExpertCsr*)cur;
 11602    return pCsr->pData==0;
 11603  }
 11604  
 11605  /* 
 11606  ** Virtual table module xNext method.
 11607  */
 11608  static int expertNext(sqlite3_vtab_cursor *cur){
 11609    ExpertCsr *pCsr = (ExpertCsr*)cur;
 11610    int rc = SQLITE_OK;
 11611  
 11612    assert( pCsr->pData );
 11613    rc = sqlite3_step(pCsr->pData);
 11614    if( rc!=SQLITE_ROW ){
 11615      rc = sqlite3_finalize(pCsr->pData);
 11616      pCsr->pData = 0;
 11617    }else{
 11618      rc = SQLITE_OK;
 11619    }
 11620  
 11621    return rc;
 11622  }
 11623  
 11624  /* 
 11625  ** Virtual table module xRowid method.
 11626  */
 11627  static int expertRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
 11628    (void)cur;
 11629    *pRowid = 0;
 11630    return SQLITE_OK;
 11631  }
 11632  
 11633  /* 
 11634  ** Virtual table module xColumn method.
 11635  */
 11636  static int expertColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){
 11637    ExpertCsr *pCsr = (ExpertCsr*)cur;
 11638    sqlite3_value *pVal;
 11639    pVal = sqlite3_column_value(pCsr->pData, i);
 11640    if( pVal ){
 11641      sqlite3_result_value(ctx, pVal);
 11642    }
 11643    return SQLITE_OK;
 11644  }
 11645  
 11646  /* 
 11647  ** Virtual table module xFilter method.
 11648  */
 11649  static int expertFilter(
 11650    sqlite3_vtab_cursor *cur, 
 11651    int idxNum, const char *idxStr,
 11652    int argc, sqlite3_value **argv
 11653  ){
 11654    ExpertCsr *pCsr = (ExpertCsr*)cur;
 11655    ExpertVtab *pVtab = (ExpertVtab*)(cur->pVtab);
 11656    sqlite3expert *pExpert = pVtab->pExpert;
 11657    int rc;
 11658  
 11659    (void)idxNum;
 11660    (void)idxStr;
 11661    (void)argc;
 11662    (void)argv;
 11663    rc = sqlite3_finalize(pCsr->pData);
 11664    pCsr->pData = 0;
 11665    if( rc==SQLITE_OK ){
 11666      rc = idxPrintfPrepareStmt(pExpert->db, &pCsr->pData, &pVtab->base.zErrMsg,
 11667          "SELECT * FROM main.%Q WHERE sample()", pVtab->pTab->zName
 11668      );
 11669    }
 11670  
 11671    if( rc==SQLITE_OK ){
 11672      rc = expertNext(cur);
 11673    }
 11674    return rc;
 11675  }
 11676  
 11677  static int idxRegisterVtab(sqlite3expert *p){
 11678    static sqlite3_module expertModule = {
 11679      2,                            /* iVersion */
 11680      expertConnect,                /* xCreate - create a table */
 11681      expertConnect,                /* xConnect - connect to an existing table */
 11682      expertBestIndex,              /* xBestIndex - Determine search strategy */
 11683      expertDisconnect,             /* xDisconnect - Disconnect from a table */
 11684      expertDisconnect,             /* xDestroy - Drop a table */
 11685      expertOpen,                   /* xOpen - open a cursor */
 11686      expertClose,                  /* xClose - close a cursor */
 11687      expertFilter,                 /* xFilter - configure scan constraints */
 11688      expertNext,                   /* xNext - advance a cursor */
 11689      expertEof,                    /* xEof */
 11690      expertColumn,                 /* xColumn - read data */
 11691      expertRowid,                  /* xRowid - read data */
 11692      expertUpdate,                 /* xUpdate - write data */
 11693      0,                            /* xBegin - begin transaction */
 11694      0,                            /* xSync - sync transaction */
 11695      0,                            /* xCommit - commit transaction */
 11696      0,                            /* xRollback - rollback transaction */
 11697      0,                            /* xFindFunction - function overloading */
 11698      0,                            /* xRename - rename the table */
 11699      0,                            /* xSavepoint */
 11700      0,                            /* xRelease */
 11701      0,                            /* xRollbackTo */
 11702      0,                            /* xShadowName */
 11703    };
 11704  
 11705    return sqlite3_create_module(p->dbv, "expert", &expertModule, (void*)p);
 11706  }
 11707  /*
 11708  ** End of virtual table implementation.
 11709  *************************************************************************/
 11710  /*
 11711  ** Finalize SQL statement pStmt. If (*pRc) is SQLITE_OK when this function
 11712  ** is called, set it to the return value of sqlite3_finalize() before
 11713  ** returning. Otherwise, discard the sqlite3_finalize() return value.
 11714  */
 11715  static void idxFinalize(int *pRc, sqlite3_stmt *pStmt){
 11716    int rc = sqlite3_finalize(pStmt);
 11717    if( *pRc==SQLITE_OK ) *pRc = rc;
 11718  }
 11719  
 11720  /*
 11721  ** Attempt to allocate an IdxTable structure corresponding to table zTab
 11722  ** in the main database of connection db. If successful, set (*ppOut) to
 11723  ** point to the new object and return SQLITE_OK. Otherwise, return an
 11724  ** SQLite error code and set (*ppOut) to NULL. In this case *pzErrmsg may be
 11725  ** set to point to an error string.
 11726  **
 11727  ** It is the responsibility of the caller to eventually free either the
 11728  ** IdxTable object or error message using sqlite3_free().
 11729  */
 11730  static int idxGetTableInfo(
 11731    sqlite3 *db,                    /* Database connection to read details from */
 11732    const char *zTab,               /* Table name */
 11733    IdxTable **ppOut,               /* OUT: New object (if successful) */
 11734    char **pzErrmsg                 /* OUT: Error message (if not) */
 11735  ){
 11736    sqlite3_stmt *p1 = 0;
 11737    int nCol = 0;
 11738    int nTab;
 11739    int nByte;
 11740    IdxTable *pNew = 0;
 11741    int rc, rc2;
 11742    char *pCsr = 0;
 11743    int nPk = 0;
 11744  
 11745    *ppOut = 0;
 11746    if( zTab==0 ) return SQLITE_ERROR;
 11747    nTab = STRLEN(zTab);
 11748    nByte = sizeof(IdxTable) + nTab + 1;
 11749    rc = idxPrintfPrepareStmt(db, &p1, pzErrmsg, "PRAGMA table_xinfo=%Q", zTab);
 11750    while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){
 11751      const char *zCol = (const char*)sqlite3_column_text(p1, 1);
 11752      const char *zColSeq = 0;
 11753      if( zCol==0 ){
 11754        rc = SQLITE_ERROR;
 11755        break;
 11756      }
 11757      nByte += 1 + STRLEN(zCol);
 11758      rc = sqlite3_table_column_metadata(
 11759          db, "main", zTab, zCol, 0, &zColSeq, 0, 0, 0
 11760      );
 11761      if( zColSeq==0 ) zColSeq = "binary";
 11762      nByte += 1 + STRLEN(zColSeq);
 11763      nCol++;
 11764      nPk += (sqlite3_column_int(p1, 5)>0);
 11765    }
 11766    rc2 = sqlite3_reset(p1);
 11767    if( rc==SQLITE_OK ) rc = rc2;
 11768  
 11769    nByte += sizeof(IdxColumn) * nCol;
 11770    if( rc==SQLITE_OK ){
 11771      pNew = idxMalloc(&rc, nByte);
 11772    }
 11773    if( rc==SQLITE_OK ){
 11774      pNew->aCol = (IdxColumn*)&pNew[1];
 11775      pNew->nCol = nCol;
 11776      pCsr = (char*)&pNew->aCol[nCol];
 11777    }
 11778  
 11779    nCol = 0;
 11780    while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){
 11781      const char *zCol = (const char*)sqlite3_column_text(p1, 1);
 11782      const char *zColSeq = 0;
 11783      int nCopy;
 11784      if( zCol==0 ) continue;
 11785      nCopy = STRLEN(zCol) + 1;
 11786      pNew->aCol[nCol].zName = pCsr;
 11787      pNew->aCol[nCol].iPk = (sqlite3_column_int(p1, 5)==1 && nPk==1);
 11788      memcpy(pCsr, zCol, nCopy);
 11789      pCsr += nCopy;
 11790  
 11791      rc = sqlite3_table_column_metadata(
 11792          db, "main", zTab, zCol, 0, &zColSeq, 0, 0, 0
 11793      );
 11794      if( rc==SQLITE_OK ){
 11795        if( zColSeq==0 ) zColSeq = "binary";
 11796        nCopy = STRLEN(zColSeq) + 1;
 11797        pNew->aCol[nCol].zColl = pCsr;
 11798        memcpy(pCsr, zColSeq, nCopy);
 11799        pCsr += nCopy;
 11800      }
 11801  
 11802      nCol++;
 11803    }
 11804    idxFinalize(&rc, p1);
 11805  
 11806    if( rc!=SQLITE_OK ){
 11807      sqlite3_free(pNew);
 11808      pNew = 0;
 11809    }else if( ALWAYS(pNew!=0) ){
 11810      pNew->zName = pCsr;
 11811      if( ALWAYS(pNew->zName!=0) ) memcpy(pNew->zName, zTab, nTab+1);
 11812    }
 11813  
 11814    *ppOut = pNew;
 11815    return rc;
 11816  }
 11817  
 11818  /*
 11819  ** This function is a no-op if *pRc is set to anything other than 
 11820  ** SQLITE_OK when it is called.
 11821  **
 11822  ** If *pRc is initially set to SQLITE_OK, then the text specified by
 11823  ** the printf() style arguments is appended to zIn and the result returned
 11824  ** in a buffer allocated by sqlite3_malloc(). sqlite3_free() is called on
 11825  ** zIn before returning.
 11826  */
 11827  static char *idxAppendText(int *pRc, char *zIn, const char *zFmt, ...){
 11828    va_list ap;
 11829    char *zAppend = 0;
 11830    char *zRet = 0;
 11831    int nIn = zIn ? STRLEN(zIn) : 0;
 11832    int nAppend = 0;
 11833    va_start(ap, zFmt);
 11834    if( *pRc==SQLITE_OK ){
 11835      zAppend = sqlite3_vmprintf(zFmt, ap);
 11836      if( zAppend ){
 11837        nAppend = STRLEN(zAppend);
 11838        zRet = (char*)sqlite3_malloc(nIn + nAppend + 1);
 11839      }
 11840      if( zAppend && zRet ){
 11841        if( nIn ) memcpy(zRet, zIn, nIn);
 11842        memcpy(&zRet[nIn], zAppend, nAppend+1);
 11843      }else{
 11844        sqlite3_free(zRet);
 11845        zRet = 0;
 11846        *pRc = SQLITE_NOMEM;
 11847      }
 11848      sqlite3_free(zAppend);
 11849      sqlite3_free(zIn);
 11850    }
 11851    va_end(ap);
 11852    return zRet;
 11853  }
 11854  
 11855  /*
 11856  ** Return true if zId must be quoted in order to use it as an SQL
 11857  ** identifier, or false otherwise.
 11858  */
 11859  static int idxIdentifierRequiresQuotes(const char *zId){
 11860    int i;
 11861    int nId = STRLEN(zId);
 11862    
 11863    if( sqlite3_keyword_check(zId, nId) ) return 1;
 11864  
 11865    for(i=0; zId[i]; i++){
 11866      if( !(zId[i]=='_')
 11867       && !(zId[i]>='0' && zId[i]<='9')
 11868       && !(zId[i]>='a' && zId[i]<='z')
 11869       && !(zId[i]>='A' && zId[i]<='Z')
 11870      ){
 11871        return 1;
 11872      }
 11873    }
 11874    return 0;
 11875  }
 11876  
 11877  /*
 11878  ** This function appends an index column definition suitable for constraint
 11879  ** pCons to the string passed as zIn and returns the result.
 11880  */
 11881  static char *idxAppendColDefn(
 11882    int *pRc,                       /* IN/OUT: Error code */
 11883    char *zIn,                      /* Column defn accumulated so far */
 11884    IdxTable *pTab,                 /* Table index will be created on */
 11885    IdxConstraint *pCons
 11886  ){
 11887    char *zRet = zIn;
 11888    IdxColumn *p = &pTab->aCol[pCons->iCol];
 11889    if( zRet ) zRet = idxAppendText(pRc, zRet, ", ");
 11890  
 11891    if( idxIdentifierRequiresQuotes(p->zName) ){
 11892      zRet = idxAppendText(pRc, zRet, "%Q", p->zName);
 11893    }else{
 11894      zRet = idxAppendText(pRc, zRet, "%s", p->zName);
 11895    }
 11896  
 11897    if( sqlite3_stricmp(p->zColl, pCons->zColl) ){
 11898      if( idxIdentifierRequiresQuotes(pCons->zColl) ){
 11899        zRet = idxAppendText(pRc, zRet, " COLLATE %Q", pCons->zColl);
 11900      }else{
 11901        zRet = idxAppendText(pRc, zRet, " COLLATE %s", pCons->zColl);
 11902      }
 11903    }
 11904  
 11905    if( pCons->bDesc ){
 11906      zRet = idxAppendText(pRc, zRet, " DESC");
 11907    }
 11908    return zRet;
 11909  }
 11910  
 11911  /*
 11912  ** Search database dbm for an index compatible with the one idxCreateFromCons()
 11913  ** would create from arguments pScan, pEq and pTail. If no error occurs and 
 11914  ** such an index is found, return non-zero. Or, if no such index is found,
 11915  ** return zero.
 11916  **
 11917  ** If an error occurs, set *pRc to an SQLite error code and return zero.
 11918  */
 11919  static int idxFindCompatible(
 11920    int *pRc,                       /* OUT: Error code */
 11921    sqlite3* dbm,                   /* Database to search */
 11922    IdxScan *pScan,                 /* Scan for table to search for index on */
 11923    IdxConstraint *pEq,             /* List of == constraints */
 11924    IdxConstraint *pTail            /* List of range constraints */
 11925  ){
 11926    const char *zTbl = pScan->pTab->zName;
 11927    sqlite3_stmt *pIdxList = 0;
 11928    IdxConstraint *pIter;
 11929    int nEq = 0;                    /* Number of elements in pEq */
 11930    int rc;
 11931  
 11932    /* Count the elements in list pEq */
 11933    for(pIter=pEq; pIter; pIter=pIter->pLink) nEq++;
 11934  
 11935    rc = idxPrintfPrepareStmt(dbm, &pIdxList, 0, "PRAGMA index_list=%Q", zTbl);
 11936    while( rc==SQLITE_OK && sqlite3_step(pIdxList)==SQLITE_ROW ){
 11937      int bMatch = 1;
 11938      IdxConstraint *pT = pTail;
 11939      sqlite3_stmt *pInfo = 0;
 11940      const char *zIdx = (const char*)sqlite3_column_text(pIdxList, 1);
 11941      if( zIdx==0 ) continue;
 11942  
 11943      /* Zero the IdxConstraint.bFlag values in the pEq list */
 11944      for(pIter=pEq; pIter; pIter=pIter->pLink) pIter->bFlag = 0;
 11945  
 11946      rc = idxPrintfPrepareStmt(dbm, &pInfo, 0, "PRAGMA index_xInfo=%Q", zIdx);
 11947      while( rc==SQLITE_OK && sqlite3_step(pInfo)==SQLITE_ROW ){
 11948        int iIdx = sqlite3_column_int(pInfo, 0);
 11949        int iCol = sqlite3_column_int(pInfo, 1);
 11950        const char *zColl = (const char*)sqlite3_column_text(pInfo, 4);
 11951  
 11952        if( iIdx<nEq ){
 11953          for(pIter=pEq; pIter; pIter=pIter->pLink){
 11954            if( pIter->bFlag ) continue;
 11955            if( pIter->iCol!=iCol ) continue;
 11956            if( sqlite3_stricmp(pIter->zColl, zColl) ) continue;
 11957            pIter->bFlag = 1;
 11958            break;
 11959          }
 11960          if( pIter==0 ){
 11961            bMatch = 0;
 11962            break;
 11963          }
 11964        }else{
 11965          if( pT ){
 11966            if( pT->iCol!=iCol || sqlite3_stricmp(pT->zColl, zColl) ){
 11967              bMatch = 0;
 11968              break;
 11969            }
 11970            pT = pT->pLink;
 11971          }
 11972        }
 11973      }
 11974      idxFinalize(&rc, pInfo);
 11975  
 11976      if( rc==SQLITE_OK && bMatch ){
 11977        sqlite3_finalize(pIdxList);
 11978        return 1;
 11979      }
 11980    }
 11981    idxFinalize(&rc, pIdxList);
 11982  
 11983    *pRc = rc;
 11984    return 0;
 11985  }
 11986  
 11987  /* Callback for sqlite3_exec() with query with leading count(*) column.
 11988   * The first argument is expected to be an int*, referent to be incremented
 11989   * if that leading column is not exactly '0'.
 11990   */
 11991  static int countNonzeros(void* pCount, int nc,
 11992                           char* azResults[], char* azColumns[]){
 11993    (void)azColumns;  /* Suppress unused parameter warning */
 11994    if( nc>0 && (azResults[0][0]!='0' || azResults[0][1]!=0) ){
 11995      *((int *)pCount) += 1;
 11996    }
 11997    return 0;
 11998  }
 11999  
 12000  static int idxCreateFromCons(
 12001    sqlite3expert *p,
 12002    IdxScan *pScan,
 12003    IdxConstraint *pEq, 
 12004    IdxConstraint *pTail
 12005  ){
 12006    sqlite3 *dbm = p->dbm;
 12007    int rc = SQLITE_OK;
 12008    if( (pEq || pTail) && 0==idxFindCompatible(&rc, dbm, pScan, pEq, pTail) ){
 12009      IdxTable *pTab = pScan->pTab;
 12010      char *zCols = 0;
 12011      char *zIdx = 0;
 12012      IdxConstraint *pCons;
 12013      unsigned int h = 0;
 12014      const char *zFmt;
 12015  
 12016      for(pCons=pEq; pCons; pCons=pCons->pLink){
 12017        zCols = idxAppendColDefn(&rc, zCols, pTab, pCons);
 12018      }
 12019      for(pCons=pTail; pCons; pCons=pCons->pLink){
 12020        zCols = idxAppendColDefn(&rc, zCols, pTab, pCons);
 12021      }
 12022  
 12023      if( rc==SQLITE_OK ){
 12024        /* Hash the list of columns to come up with a name for the index */
 12025        const char *zTable = pScan->pTab->zName;
 12026        int quoteTable = idxIdentifierRequiresQuotes(zTable);
 12027        char *zName = 0;          /* Index name */
 12028        int collisions = 0;
 12029        do{
 12030          int i;
 12031          char *zFind;
 12032          for(i=0; zCols[i]; i++){
 12033            h += ((h<<3) + zCols[i]);
 12034          }
 12035          sqlite3_free(zName);
 12036          zName = sqlite3_mprintf("%s_idx_%08x", zTable, h);
 12037          if( zName==0 ) break;
 12038          /* Is is unique among table, view and index names? */
 12039          zFmt = "SELECT count(*) FROM sqlite_schema WHERE name=%Q"
 12040            " AND type in ('index','table','view')";
 12041          zFind = sqlite3_mprintf(zFmt, zName);
 12042          i = 0;
 12043          rc = sqlite3_exec(dbm, zFind, countNonzeros, &i, 0);
 12044          assert(rc==SQLITE_OK);
 12045          sqlite3_free(zFind);
 12046          if( i==0 ){
 12047            collisions = 0;
 12048            break;
 12049          }
 12050          ++collisions;
 12051        }while( collisions<50 && zName!=0 );
 12052        if( collisions ){
 12053          /* This return means "Gave up trying to find a unique index name." */
 12054          rc = SQLITE_BUSY_TIMEOUT;
 12055        }else if( zName==0 ){
 12056          rc = SQLITE_NOMEM;
 12057        }else{
 12058          if( quoteTable ){
 12059            zFmt = "CREATE INDEX \"%w\" ON \"%w\"(%s)";
 12060          }else{
 12061            zFmt = "CREATE INDEX %s ON %s(%s)";
 12062          }
 12063          zIdx = sqlite3_mprintf(zFmt, zName, zTable, zCols);
 12064          if( !zIdx ){
 12065            rc = SQLITE_NOMEM;
 12066          }else{
 12067            rc = sqlite3_exec(dbm, zIdx, 0, 0, p->pzErrmsg);
 12068            if( rc!=SQLITE_OK ){
 12069              rc = SQLITE_BUSY_TIMEOUT;
 12070            }else{
 12071              idxHashAdd(&rc, &p->hIdx, zName, zIdx);
 12072            }
 12073          }
 12074          sqlite3_free(zName);
 12075          sqlite3_free(zIdx);
 12076        }
 12077      }
 12078  
 12079      sqlite3_free(zCols);
 12080    }
 12081    return rc;
 12082  }
 12083  
 12084  /*
 12085  ** Return true if list pList (linked by IdxConstraint.pLink) contains
 12086  ** a constraint compatible with *p. Otherwise return false.
 12087  */
 12088  static int idxFindConstraint(IdxConstraint *pList, IdxConstraint *p){
 12089    IdxConstraint *pCmp;
 12090    for(pCmp=pList; pCmp; pCmp=pCmp->pLink){
 12091      if( p->iCol==pCmp->iCol ) return 1;
 12092    }
 12093    return 0;
 12094  }
 12095  
 12096  static int idxCreateFromWhere(
 12097    sqlite3expert *p, 
 12098    IdxScan *pScan,                 /* Create indexes for this scan */
 12099    IdxConstraint *pTail            /* range/ORDER BY constraints for inclusion */
 12100  ){
 12101    IdxConstraint *p1 = 0;
 12102    IdxConstraint *pCon;
 12103    int rc;
 12104  
 12105    /* Gather up all the == constraints. */
 12106    for(pCon=pScan->pEq; pCon; pCon=pCon->pNext){
 12107      if( !idxFindConstraint(p1, pCon) && !idxFindConstraint(pTail, pCon) ){
 12108        pCon->pLink = p1;
 12109        p1 = pCon;
 12110      }
 12111    }
 12112  
 12113    /* Create an index using the == constraints collected above. And the
 12114    ** range constraint/ORDER BY terms passed in by the caller, if any. */
 12115    rc = idxCreateFromCons(p, pScan, p1, pTail);
 12116  
 12117    /* If no range/ORDER BY passed by the caller, create a version of the
 12118    ** index for each range constraint.  */
 12119    if( pTail==0 ){
 12120      for(pCon=pScan->pRange; rc==SQLITE_OK && pCon; pCon=pCon->pNext){
 12121        assert( pCon->pLink==0 );
 12122        if( !idxFindConstraint(p1, pCon) && !idxFindConstraint(pTail, pCon) ){
 12123          rc = idxCreateFromCons(p, pScan, p1, pCon);
 12124        }
 12125      }
 12126    }
 12127  
 12128    return rc;
 12129  }
 12130  
 12131  /*
 12132  ** Create candidate indexes in database [dbm] based on the data in 
 12133  ** linked-list pScan.
 12134  */
 12135  static int idxCreateCandidates(sqlite3expert *p){
 12136    int rc = SQLITE_OK;
 12137    IdxScan *pIter;
 12138  
 12139    for(pIter=p->pScan; pIter && rc==SQLITE_OK; pIter=pIter->pNextScan){
 12140      rc = idxCreateFromWhere(p, pIter, 0);
 12141      if( rc==SQLITE_OK && pIter->pOrder ){
 12142        rc = idxCreateFromWhere(p, pIter, pIter->pOrder);
 12143      }
 12144    }
 12145  
 12146    return rc;
 12147  }
 12148  
 12149  /*
 12150  ** Free all elements of the linked list starting at pConstraint.
 12151  */
 12152  static void idxConstraintFree(IdxConstraint *pConstraint){
 12153    IdxConstraint *pNext;
 12154    IdxConstraint *p;
 12155  
 12156    for(p=pConstraint; p; p=pNext){
 12157      pNext = p->pNext;
 12158      sqlite3_free(p);
 12159    }
 12160  }
 12161  
 12162  /*
 12163  ** Free all elements of the linked list starting from pScan up until pLast
 12164  ** (pLast is not freed).
 12165  */
 12166  static void idxScanFree(IdxScan *pScan, IdxScan *pLast){
 12167    IdxScan *p;
 12168    IdxScan *pNext;
 12169    for(p=pScan; p!=pLast; p=pNext){
 12170      pNext = p->pNextScan;
 12171      idxConstraintFree(p->pOrder);
 12172      idxConstraintFree(p->pEq);
 12173      idxConstraintFree(p->pRange);
 12174      sqlite3_free(p);
 12175    }
 12176  }
 12177  
 12178  /*
 12179  ** Free all elements of the linked list starting from pStatement up 
 12180  ** until pLast (pLast is not freed).
 12181  */
 12182  static void idxStatementFree(IdxStatement *pStatement, IdxStatement *pLast){
 12183    IdxStatement *p;
 12184    IdxStatement *pNext;
 12185    for(p=pStatement; p!=pLast; p=pNext){
 12186      pNext = p->pNext;
 12187      sqlite3_free(p->zEQP);
 12188      sqlite3_free(p->zIdx);
 12189      sqlite3_free(p);
 12190    }
 12191  }
 12192  
 12193  /*
 12194  ** Free the linked list of IdxTable objects starting at pTab.
 12195  */
 12196  static void idxTableFree(IdxTable *pTab){
 12197    IdxTable *pIter;
 12198    IdxTable *pNext;
 12199    for(pIter=pTab; pIter; pIter=pNext){
 12200      pNext = pIter->pNext;
 12201      sqlite3_free(pIter);
 12202    }
 12203  }
 12204  
 12205  /*
 12206  ** Free the linked list of IdxWrite objects starting at pTab.
 12207  */
 12208  static void idxWriteFree(IdxWrite *pTab){
 12209    IdxWrite *pIter;
 12210    IdxWrite *pNext;
 12211    for(pIter=pTab; pIter; pIter=pNext){
 12212      pNext = pIter->pNext;
 12213      sqlite3_free(pIter);
 12214    }
 12215  }
 12216  
 12217  
 12218  
 12219  /*
 12220  ** This function is called after candidate indexes have been created. It
 12221  ** runs all the queries to see which indexes they prefer, and populates
 12222  ** IdxStatement.zIdx and IdxStatement.zEQP with the results.
 12223  */
 12224  static int idxFindIndexes(
 12225    sqlite3expert *p,
 12226    char **pzErr                         /* OUT: Error message (sqlite3_malloc) */
 12227  ){
 12228    IdxStatement *pStmt;
 12229    sqlite3 *dbm = p->dbm;
 12230    int rc = SQLITE_OK;
 12231  
 12232    IdxHash hIdx;
 12233    idxHashInit(&hIdx);
 12234  
 12235    for(pStmt=p->pStatement; rc==SQLITE_OK && pStmt; pStmt=pStmt->pNext){
 12236      IdxHashEntry *pEntry;
 12237      sqlite3_stmt *pExplain = 0;
 12238      idxHashClear(&hIdx);
 12239      rc = idxPrintfPrepareStmt(dbm, &pExplain, pzErr,
 12240          "EXPLAIN QUERY PLAN %s", pStmt->zSql
 12241      );
 12242      while( rc==SQLITE_OK && sqlite3_step(pExplain)==SQLITE_ROW ){
 12243        /* int iId = sqlite3_column_int(pExplain, 0); */
 12244        /* int iParent = sqlite3_column_int(pExplain, 1); */
 12245        /* int iNotUsed = sqlite3_column_int(pExplain, 2); */
 12246        const char *zDetail = (const char*)sqlite3_column_text(pExplain, 3);
 12247        int nDetail;
 12248        int i;
 12249  
 12250        if( !zDetail ) continue;
 12251        nDetail = STRLEN(zDetail);
 12252  
 12253        for(i=0; i<nDetail; i++){
 12254          const char *zIdx = 0;
 12255          if( i+13<nDetail && memcmp(&zDetail[i], " USING INDEX ", 13)==0 ){
 12256            zIdx = &zDetail[i+13];
 12257          }else if( i+22<nDetail 
 12258              && memcmp(&zDetail[i], " USING COVERING INDEX ", 22)==0 
 12259          ){
 12260            zIdx = &zDetail[i+22];
 12261          }
 12262          if( zIdx ){
 12263            const char *zSql;
 12264            int nIdx = 0;
 12265            while( zIdx[nIdx]!='\0' && (zIdx[nIdx]!=' ' || zIdx[nIdx+1]!='(') ){
 12266              nIdx++;
 12267            }
 12268            zSql = idxHashSearch(&p->hIdx, zIdx, nIdx);
 12269            if( zSql ){
 12270              idxHashAdd(&rc, &hIdx, zSql, 0);
 12271              if( rc ) goto find_indexes_out;
 12272            }
 12273            break;
 12274          }
 12275        }
 12276  
 12277        if( zDetail[0]!='-' ){
 12278          pStmt->zEQP = idxAppendText(&rc, pStmt->zEQP, "%s\n", zDetail);
 12279        }
 12280      }
 12281  
 12282      for(pEntry=hIdx.pFirst; pEntry; pEntry=pEntry->pNext){
 12283        pStmt->zIdx = idxAppendText(&rc, pStmt->zIdx, "%s;\n", pEntry->zKey);
 12284      }
 12285  
 12286      idxFinalize(&rc, pExplain);
 12287    }
 12288  
 12289   find_indexes_out:
 12290    idxHashClear(&hIdx);
 12291    return rc;
 12292  }
 12293  
 12294  static int idxAuthCallback(
 12295    void *pCtx,
 12296    int eOp,
 12297    const char *z3,
 12298    const char *z4,
 12299    const char *zDb,
 12300    const char *zTrigger
 12301  ){
 12302    int rc = SQLITE_OK;
 12303    (void)z4;
 12304    (void)zTrigger;
 12305    if( eOp==SQLITE_INSERT || eOp==SQLITE_UPDATE || eOp==SQLITE_DELETE ){
 12306      if( sqlite3_stricmp(zDb, "main")==0 ){
 12307        sqlite3expert *p = (sqlite3expert*)pCtx;
 12308        IdxTable *pTab;
 12309        for(pTab=p->pTable; pTab; pTab=pTab->pNext){
 12310          if( 0==sqlite3_stricmp(z3, pTab->zName) ) break;
 12311        }
 12312        if( pTab ){
 12313          IdxWrite *pWrite;
 12314          for(pWrite=p->pWrite; pWrite; pWrite=pWrite->pNext){
 12315            if( pWrite->pTab==pTab && pWrite->eOp==eOp ) break;
 12316          }
 12317          if( pWrite==0 ){
 12318            pWrite = idxMalloc(&rc, sizeof(IdxWrite));
 12319            if( rc==SQLITE_OK ){
 12320              pWrite->pTab = pTab;
 12321              pWrite->eOp = eOp;
 12322              pWrite->pNext = p->pWrite;
 12323              p->pWrite = pWrite;
 12324            }
 12325          }
 12326        }
 12327      }
 12328    }
 12329    return rc;
 12330  }
 12331  
 12332  static int idxProcessOneTrigger(
 12333    sqlite3expert *p, 
 12334    IdxWrite *pWrite, 
 12335    char **pzErr
 12336  ){
 12337    static const char *zInt = UNIQUE_TABLE_NAME;
 12338    static const char *zDrop = "DROP TABLE " UNIQUE_TABLE_NAME;
 12339    IdxTable *pTab = pWrite->pTab;
 12340    const char *zTab = pTab->zName;
 12341    const char *zSql = 
 12342      "SELECT 'CREATE TEMP' || substr(sql, 7) FROM sqlite_schema "
 12343      "WHERE tbl_name = %Q AND type IN ('table', 'trigger') "
 12344      "ORDER BY type;";
 12345    sqlite3_stmt *pSelect = 0;
 12346    int rc = SQLITE_OK;
 12347    char *zWrite = 0;
 12348  
 12349    /* Create the table and its triggers in the temp schema */
 12350    rc = idxPrintfPrepareStmt(p->db, &pSelect, pzErr, zSql, zTab, zTab);
 12351    while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSelect) ){
 12352      const char *zCreate = (const char*)sqlite3_column_text(pSelect, 0);
 12353      if( zCreate==0 ) continue;
 12354      rc = sqlite3_exec(p->dbv, zCreate, 0, 0, pzErr);
 12355    }
 12356    idxFinalize(&rc, pSelect);
 12357  
 12358    /* Rename the table in the temp schema to zInt */
 12359    if( rc==SQLITE_OK ){
 12360      char *z = sqlite3_mprintf("ALTER TABLE temp.%Q RENAME TO %Q", zTab, zInt);
 12361      if( z==0 ){
 12362        rc = SQLITE_NOMEM;
 12363      }else{
 12364        rc = sqlite3_exec(p->dbv, z, 0, 0, pzErr);
 12365        sqlite3_free(z);
 12366      }
 12367    }
 12368  
 12369    switch( pWrite->eOp ){
 12370      case SQLITE_INSERT: {
 12371        int i;
 12372        zWrite = idxAppendText(&rc, zWrite, "INSERT INTO %Q VALUES(", zInt);
 12373        for(i=0; i<pTab->nCol; i++){
 12374          zWrite = idxAppendText(&rc, zWrite, "%s?", i==0 ? "" : ", ");
 12375        }
 12376        zWrite = idxAppendText(&rc, zWrite, ")");
 12377        break;
 12378      }
 12379      case SQLITE_UPDATE: {
 12380        int i;
 12381        zWrite = idxAppendText(&rc, zWrite, "UPDATE %Q SET ", zInt);
 12382        for(i=0; i<pTab->nCol; i++){
 12383          zWrite = idxAppendText(&rc, zWrite, "%s%Q=?", i==0 ? "" : ", ", 
 12384              pTab->aCol[i].zName
 12385          );
 12386        }
 12387        break;
 12388      }
 12389      default: {
 12390        assert( pWrite->eOp==SQLITE_DELETE );
 12391        if( rc==SQLITE_OK ){
 12392          zWrite = sqlite3_mprintf("DELETE FROM %Q", zInt);
 12393          if( zWrite==0 ) rc = SQLITE_NOMEM;
 12394        }
 12395      }
 12396    }
 12397  
 12398    if( rc==SQLITE_OK ){
 12399      sqlite3_stmt *pX = 0;
 12400      rc = sqlite3_prepare_v2(p->dbv, zWrite, -1, &pX, 0);
 12401      idxFinalize(&rc, pX);
 12402      if( rc!=SQLITE_OK ){
 12403        idxDatabaseError(p->dbv, pzErr);
 12404      }
 12405    }
 12406    sqlite3_free(zWrite);
 12407  
 12408    if( rc==SQLITE_OK ){
 12409      rc = sqlite3_exec(p->dbv, zDrop, 0, 0, pzErr);
 12410    }
 12411  
 12412    return rc;
 12413  }
 12414  
 12415  static int idxProcessTriggers(sqlite3expert *p, char **pzErr){
 12416    int rc = SQLITE_OK;
 12417    IdxWrite *pEnd = 0;
 12418    IdxWrite *pFirst = p->pWrite;
 12419  
 12420    while( rc==SQLITE_OK && pFirst!=pEnd ){
 12421      IdxWrite *pIter;
 12422      for(pIter=pFirst; rc==SQLITE_OK && pIter!=pEnd; pIter=pIter->pNext){
 12423        rc = idxProcessOneTrigger(p, pIter, pzErr);
 12424      }
 12425      pEnd = pFirst;
 12426      pFirst = p->pWrite;
 12427    }
 12428  
 12429    return rc;
 12430  }
 12431  
 12432  
 12433  static int idxCreateVtabSchema(sqlite3expert *p, char **pzErrmsg){
 12434    int rc = idxRegisterVtab(p);
 12435    sqlite3_stmt *pSchema = 0;
 12436  
 12437    /* For each table in the main db schema:
 12438    **
 12439    **   1) Add an entry to the p->pTable list, and
 12440    **   2) Create the equivalent virtual table in dbv.
 12441    */
 12442    rc = idxPrepareStmt(p->db, &pSchema, pzErrmsg,
 12443        "SELECT type, name, sql, 1 FROM sqlite_schema "
 12444        "WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%%' "
 12445        " UNION ALL "
 12446        "SELECT type, name, sql, 2 FROM sqlite_schema "
 12447        "WHERE type = 'trigger'"
 12448        "  AND tbl_name IN(SELECT name FROM sqlite_schema WHERE type = 'view') "
 12449        "ORDER BY 4, 1"
 12450    );
 12451    while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSchema) ){
 12452      const char *zType = (const char*)sqlite3_column_text(pSchema, 0);
 12453      const char *zName = (const char*)sqlite3_column_text(pSchema, 1);
 12454      const char *zSql = (const char*)sqlite3_column_text(pSchema, 2);
 12455  
 12456      if( zType==0 || zName==0 ) continue;
 12457      if( zType[0]=='v' || zType[1]=='r' ){
 12458        if( zSql ) rc = sqlite3_exec(p->dbv, zSql, 0, 0, pzErrmsg);
 12459      }else{
 12460        IdxTable *pTab;
 12461        rc = idxGetTableInfo(p->db, zName, &pTab, pzErrmsg);
 12462        if( rc==SQLITE_OK ){
 12463          int i;
 12464          char *zInner = 0;
 12465          char *zOuter = 0;
 12466          pTab->pNext = p->pTable;
 12467          p->pTable = pTab;
 12468  
 12469          /* The statement the vtab will pass to sqlite3_declare_vtab() */
 12470          zInner = idxAppendText(&rc, 0, "CREATE TABLE x(");
 12471          for(i=0; i<pTab->nCol; i++){
 12472            zInner = idxAppendText(&rc, zInner, "%s%Q COLLATE %s", 
 12473                (i==0 ? "" : ", "), pTab->aCol[i].zName, pTab->aCol[i].zColl
 12474            );
 12475          }
 12476          zInner = idxAppendText(&rc, zInner, ")");
 12477  
 12478          /* The CVT statement to create the vtab */
 12479          zOuter = idxAppendText(&rc, 0, 
 12480              "CREATE VIRTUAL TABLE %Q USING expert(%Q)", zName, zInner
 12481          );
 12482          if( rc==SQLITE_OK ){
 12483            rc = sqlite3_exec(p->dbv, zOuter, 0, 0, pzErrmsg);
 12484          }
 12485          sqlite3_free(zInner);
 12486          sqlite3_free(zOuter);
 12487        }
 12488      }
 12489    }
 12490    idxFinalize(&rc, pSchema);
 12491    return rc;
 12492  }
 12493  
 12494  struct IdxSampleCtx {
 12495    int iTarget;
 12496    double target;                  /* Target nRet/nRow value */
 12497    double nRow;                    /* Number of rows seen */
 12498    double nRet;                    /* Number of rows returned */
 12499  };
 12500  
 12501  static void idxSampleFunc(
 12502    sqlite3_context *pCtx,
 12503    int argc,
 12504    sqlite3_value **argv
 12505  ){
 12506    struct IdxSampleCtx *p = (struct IdxSampleCtx*)sqlite3_user_data(pCtx);
 12507    int bRet;
 12508  
 12509    (void)argv;
 12510    assert( argc==0 );
 12511    if( p->nRow==0.0 ){
 12512      bRet = 1;
 12513    }else{
 12514      bRet = (p->nRet / p->nRow) <= p->target;
 12515      if( bRet==0 ){
 12516        unsigned short rnd;
 12517        sqlite3_randomness(2, (void*)&rnd);
 12518        bRet = ((int)rnd % 100) <= p->iTarget;
 12519      }
 12520    }
 12521  
 12522    sqlite3_result_int(pCtx, bRet);
 12523    p->nRow += 1.0;
 12524    p->nRet += (double)bRet;
 12525  }
 12526  
 12527  struct IdxRemCtx {
 12528    int nSlot;
 12529    struct IdxRemSlot {
 12530      int eType;                    /* SQLITE_NULL, INTEGER, REAL, TEXT, BLOB */
 12531      i64 iVal;                     /* SQLITE_INTEGER value */
 12532      double rVal;                  /* SQLITE_FLOAT value */
 12533      int nByte;                    /* Bytes of space allocated at z */
 12534      int n;                        /* Size of buffer z */
 12535      char *z;                      /* SQLITE_TEXT/BLOB value */
 12536    } aSlot[1];
 12537  };
 12538  
 12539  /*
 12540  ** Implementation of scalar function rem().
 12541  */
 12542  static void idxRemFunc(
 12543    sqlite3_context *pCtx,
 12544    int argc,
 12545    sqlite3_value **argv
 12546  ){
 12547    struct IdxRemCtx *p = (struct IdxRemCtx*)sqlite3_user_data(pCtx);
 12548    struct IdxRemSlot *pSlot;
 12549    int iSlot;
 12550    assert( argc==2 );
 12551  
 12552    iSlot = sqlite3_value_int(argv[0]);
 12553    assert( iSlot<=p->nSlot );
 12554    pSlot = &p->aSlot[iSlot];
 12555  
 12556    switch( pSlot->eType ){
 12557      case SQLITE_NULL:
 12558        /* no-op */
 12559        break;
 12560  
 12561      case SQLITE_INTEGER:
 12562        sqlite3_result_int64(pCtx, pSlot->iVal);
 12563        break;
 12564  
 12565      case SQLITE_FLOAT:
 12566        sqlite3_result_double(pCtx, pSlot->rVal);
 12567        break;
 12568  
 12569      case SQLITE_BLOB:
 12570        sqlite3_result_blob(pCtx, pSlot->z, pSlot->n, SQLITE_TRANSIENT);
 12571        break;
 12572  
 12573      case SQLITE_TEXT:
 12574        sqlite3_result_text(pCtx, pSlot->z, pSlot->n, SQLITE_TRANSIENT);
 12575        break;
 12576    }
 12577  
 12578    pSlot->eType = sqlite3_value_type(argv[1]);
 12579    switch( pSlot->eType ){
 12580      case SQLITE_NULL:
 12581        /* no-op */
 12582        break;
 12583  
 12584      case SQLITE_INTEGER:
 12585        pSlot->iVal = sqlite3_value_int64(argv[1]);
 12586        break;
 12587  
 12588      case SQLITE_FLOAT:
 12589        pSlot->rVal = sqlite3_value_double(argv[1]);
 12590        break;
 12591  
 12592      case SQLITE_BLOB:
 12593      case SQLITE_TEXT: {
 12594        int nByte = sqlite3_value_bytes(argv[1]);
 12595        const void *pData = 0;
 12596        if( nByte>pSlot->nByte ){
 12597          char *zNew = (char*)sqlite3_realloc(pSlot->z, nByte*2);
 12598          if( zNew==0 ){
 12599            sqlite3_result_error_nomem(pCtx);
 12600            return;
 12601          }
 12602          pSlot->nByte = nByte*2;
 12603          pSlot->z = zNew;
 12604        }
 12605        pSlot->n = nByte;
 12606        if( pSlot->eType==SQLITE_BLOB ){
 12607          pData = sqlite3_value_blob(argv[1]);
 12608          if( pData ) memcpy(pSlot->z, pData, nByte);
 12609        }else{
 12610          pData = sqlite3_value_text(argv[1]);
 12611          memcpy(pSlot->z, pData, nByte);
 12612        }
 12613        break;
 12614      }
 12615    }
 12616  }
 12617  
 12618  static int idxLargestIndex(sqlite3 *db, int *pnMax, char **pzErr){
 12619    int rc = SQLITE_OK;
 12620    const char *zMax = 
 12621      "SELECT max(i.seqno) FROM "
 12622      "  sqlite_schema AS s, "
 12623      "  pragma_index_list(s.name) AS l, "
 12624      "  pragma_index_info(l.name) AS i "
 12625      "WHERE s.type = 'table'";
 12626    sqlite3_stmt *pMax = 0;
 12627  
 12628    *pnMax = 0;
 12629    rc = idxPrepareStmt(db, &pMax, pzErr, zMax);
 12630    if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pMax) ){
 12631      *pnMax = sqlite3_column_int(pMax, 0) + 1;
 12632    }
 12633    idxFinalize(&rc, pMax);
 12634  
 12635    return rc;
 12636  }
 12637  
 12638  static int idxPopulateOneStat1(
 12639    sqlite3expert *p,
 12640    sqlite3_stmt *pIndexXInfo,
 12641    sqlite3_stmt *pWriteStat,
 12642    const char *zTab,
 12643    const char *zIdx,
 12644    char **pzErr
 12645  ){
 12646    char *zCols = 0;
 12647    char *zOrder = 0;
 12648    char *zQuery = 0;
 12649    int nCol = 0;
 12650    int i;
 12651    sqlite3_stmt *pQuery = 0;
 12652    int *aStat = 0;
 12653    int rc = SQLITE_OK;
 12654  
 12655    assert( p->iSample>0 );
 12656  
 12657    /* Formulate the query text */
 12658    sqlite3_bind_text(pIndexXInfo, 1, zIdx, -1, SQLITE_STATIC);
 12659    while( SQLITE_OK==rc && SQLITE_ROW==sqlite3_step(pIndexXInfo) ){
 12660      const char *zComma = zCols==0 ? "" : ", ";
 12661      const char *zName = (const char*)sqlite3_column_text(pIndexXInfo, 0);
 12662      const char *zColl = (const char*)sqlite3_column_text(pIndexXInfo, 1);
 12663      zCols = idxAppendText(&rc, zCols, 
 12664          "%sx.%Q IS rem(%d, x.%Q) COLLATE %s", zComma, zName, nCol, zName, zColl
 12665      );
 12666      zOrder = idxAppendText(&rc, zOrder, "%s%d", zComma, ++nCol);
 12667    }
 12668    sqlite3_reset(pIndexXInfo);
 12669    if( rc==SQLITE_OK ){
 12670      if( p->iSample==100 ){
 12671        zQuery = sqlite3_mprintf(
 12672            "SELECT %s FROM %Q x ORDER BY %s", zCols, zTab, zOrder
 12673        );
 12674      }else{
 12675        zQuery = sqlite3_mprintf(
 12676            "SELECT %s FROM temp."UNIQUE_TABLE_NAME" x ORDER BY %s", zCols, zOrder
 12677        );
 12678      }
 12679    }
 12680    sqlite3_free(zCols);
 12681    sqlite3_free(zOrder);
 12682  
 12683    /* Formulate the query text */
 12684    if( rc==SQLITE_OK ){
 12685      sqlite3 *dbrem = (p->iSample==100 ? p->db : p->dbv);
 12686      rc = idxPrepareStmt(dbrem, &pQuery, pzErr, zQuery);
 12687    }
 12688    sqlite3_free(zQuery);
 12689  
 12690    if( rc==SQLITE_OK ){
 12691      aStat = (int*)idxMalloc(&rc, sizeof(int)*(nCol+1));
 12692    }
 12693    if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pQuery) ){
 12694      IdxHashEntry *pEntry;
 12695      char *zStat = 0;
 12696      for(i=0; i<=nCol; i++) aStat[i] = 1;
 12697      while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pQuery) ){
 12698        aStat[0]++;
 12699        for(i=0; i<nCol; i++){
 12700          if( sqlite3_column_int(pQuery, i)==0 ) break;
 12701        }
 12702        for(/*no-op*/; i<nCol; i++){
 12703          aStat[i+1]++;
 12704        }
 12705      }
 12706  
 12707      if( rc==SQLITE_OK ){
 12708        int s0 = aStat[0];
 12709        zStat = sqlite3_mprintf("%d", s0);
 12710        if( zStat==0 ) rc = SQLITE_NOMEM;
 12711        for(i=1; rc==SQLITE_OK && i<=nCol; i++){
 12712          zStat = idxAppendText(&rc, zStat, " %d", (s0+aStat[i]/2) / aStat[i]);
 12713        }
 12714      }
 12715  
 12716      if( rc==SQLITE_OK ){
 12717        sqlite3_bind_text(pWriteStat, 1, zTab, -1, SQLITE_STATIC);
 12718        sqlite3_bind_text(pWriteStat, 2, zIdx, -1, SQLITE_STATIC);
 12719        sqlite3_bind_text(pWriteStat, 3, zStat, -1, SQLITE_STATIC);
 12720        sqlite3_step(pWriteStat);
 12721        rc = sqlite3_reset(pWriteStat);
 12722      }
 12723  
 12724      pEntry = idxHashFind(&p->hIdx, zIdx, STRLEN(zIdx));
 12725      if( pEntry ){
 12726        assert( pEntry->zVal2==0 );
 12727        pEntry->zVal2 = zStat;
 12728      }else{
 12729        sqlite3_free(zStat);
 12730      }
 12731    }
 12732    sqlite3_free(aStat);
 12733    idxFinalize(&rc, pQuery);
 12734  
 12735    return rc;
 12736  }
 12737  
 12738  static int idxBuildSampleTable(sqlite3expert *p, const char *zTab){
 12739    int rc;
 12740    char *zSql;
 12741  
 12742    rc = sqlite3_exec(p->dbv,"DROP TABLE IF EXISTS temp."UNIQUE_TABLE_NAME,0,0,0);
 12743    if( rc!=SQLITE_OK ) return rc;
 12744  
 12745    zSql = sqlite3_mprintf(
 12746        "CREATE TABLE temp." UNIQUE_TABLE_NAME " AS SELECT * FROM %Q", zTab
 12747    );
 12748    if( zSql==0 ) return SQLITE_NOMEM;
 12749    rc = sqlite3_exec(p->dbv, zSql, 0, 0, 0);
 12750    sqlite3_free(zSql);
 12751  
 12752    return rc;
 12753  }
 12754  
 12755  /*
 12756  ** This function is called as part of sqlite3_expert_analyze(). Candidate
 12757  ** indexes have already been created in database sqlite3expert.dbm, this
 12758  ** function populates sqlite_stat1 table in the same database.
 12759  **
 12760  ** The stat1 data is generated by querying the 
 12761  */
 12762  static int idxPopulateStat1(sqlite3expert *p, char **pzErr){
 12763    int rc = SQLITE_OK;
 12764    int nMax =0;
 12765    struct IdxRemCtx *pCtx = 0;
 12766    struct IdxSampleCtx samplectx; 
 12767    int i;
 12768    i64 iPrev = -100000;
 12769    sqlite3_stmt *pAllIndex = 0;
 12770    sqlite3_stmt *pIndexXInfo = 0;
 12771    sqlite3_stmt *pWrite = 0;
 12772  
 12773    const char *zAllIndex =
 12774      "SELECT s.rowid, s.name, l.name FROM "
 12775      "  sqlite_schema AS s, "
 12776      "  pragma_index_list(s.name) AS l "
 12777      "WHERE s.type = 'table'";
 12778    const char *zIndexXInfo = 
 12779      "SELECT name, coll FROM pragma_index_xinfo(?) WHERE key";
 12780    const char *zWrite = "INSERT INTO sqlite_stat1 VALUES(?, ?, ?)";
 12781  
 12782    /* If iSample==0, no sqlite_stat1 data is required. */
 12783    if( p->iSample==0 ) return SQLITE_OK;
 12784  
 12785    rc = idxLargestIndex(p->dbm, &nMax, pzErr);
 12786    if( nMax<=0 || rc!=SQLITE_OK ) return rc;
 12787  
 12788    rc = sqlite3_exec(p->dbm, "ANALYZE; PRAGMA writable_schema=1", 0, 0, 0);
 12789  
 12790    if( rc==SQLITE_OK ){
 12791      int nByte = sizeof(struct IdxRemCtx) + (sizeof(struct IdxRemSlot) * nMax);
 12792      pCtx = (struct IdxRemCtx*)idxMalloc(&rc, nByte);
 12793    }
 12794  
 12795    if( rc==SQLITE_OK ){
 12796      sqlite3 *dbrem = (p->iSample==100 ? p->db : p->dbv);
 12797      rc = sqlite3_create_function(
 12798          dbrem, "rem", 2, SQLITE_UTF8, (void*)pCtx, idxRemFunc, 0, 0
 12799      );
 12800    }
 12801    if( rc==SQLITE_OK ){
 12802      rc = sqlite3_create_function(
 12803          p->db, "sample", 0, SQLITE_UTF8, (void*)&samplectx, idxSampleFunc, 0, 0
 12804      );
 12805    }
 12806  
 12807    if( rc==SQLITE_OK ){
 12808      pCtx->nSlot = nMax+1;
 12809      rc = idxPrepareStmt(p->dbm, &pAllIndex, pzErr, zAllIndex);
 12810    }
 12811    if( rc==SQLITE_OK ){
 12812      rc = idxPrepareStmt(p->dbm, &pIndexXInfo, pzErr, zIndexXInfo);
 12813    }
 12814    if( rc==SQLITE_OK ){
 12815      rc = idxPrepareStmt(p->dbm, &pWrite, pzErr, zWrite);
 12816    }
 12817  
 12818    while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pAllIndex) ){
 12819      i64 iRowid = sqlite3_column_int64(pAllIndex, 0);
 12820      const char *zTab = (const char*)sqlite3_column_text(pAllIndex, 1);
 12821      const char *zIdx = (const char*)sqlite3_column_text(pAllIndex, 2);
 12822      if( zTab==0 || zIdx==0 ) continue;
 12823      if( p->iSample<100 && iPrev!=iRowid ){
 12824        samplectx.target = (double)p->iSample / 100.0;
 12825        samplectx.iTarget = p->iSample;
 12826        samplectx.nRow = 0.0;
 12827        samplectx.nRet = 0.0;
 12828        rc = idxBuildSampleTable(p, zTab);
 12829        if( rc!=SQLITE_OK ) break;
 12830      }
 12831      rc = idxPopulateOneStat1(p, pIndexXInfo, pWrite, zTab, zIdx, pzErr);
 12832      iPrev = iRowid;
 12833    }
 12834    if( rc==SQLITE_OK && p->iSample<100 ){
 12835      rc = sqlite3_exec(p->dbv, 
 12836          "DROP TABLE IF EXISTS temp." UNIQUE_TABLE_NAME, 0,0,0
 12837      );
 12838    }
 12839  
 12840    idxFinalize(&rc, pAllIndex);
 12841    idxFinalize(&rc, pIndexXInfo);
 12842    idxFinalize(&rc, pWrite);
 12843  
 12844    if( pCtx ){
 12845      for(i=0; i<pCtx->nSlot; i++){
 12846        sqlite3_free(pCtx->aSlot[i].z);
 12847      }
 12848      sqlite3_free(pCtx);
 12849    }
 12850  
 12851    if( rc==SQLITE_OK ){
 12852      rc = sqlite3_exec(p->dbm, "ANALYZE sqlite_schema", 0, 0, 0);
 12853    }
 12854  
 12855    sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp."UNIQUE_TABLE_NAME,0,0,0);
 12856    return rc;
 12857  }
 12858  
 12859  /*
 12860  ** Allocate a new sqlite3expert object.
 12861  */
 12862  sqlite3expert *sqlite3_expert_new(sqlite3 *db, char **pzErrmsg){
 12863    int rc = SQLITE_OK;
 12864    sqlite3expert *pNew;
 12865  
 12866    pNew = (sqlite3expert*)idxMalloc(&rc, sizeof(sqlite3expert));
 12867  
 12868    /* Open two in-memory databases to work with. The "vtab database" (dbv)
 12869    ** will contain a virtual table corresponding to each real table in
 12870    ** the user database schema, and a copy of each view. It is used to
 12871    ** collect information regarding the WHERE, ORDER BY and other clauses
 12872    ** of the user's query.
 12873    */
 12874    if( rc==SQLITE_OK ){
 12875      pNew->db = db;
 12876      pNew->iSample = 100;
 12877      rc = sqlite3_open(":memory:", &pNew->dbv);
 12878    }
 12879    if( rc==SQLITE_OK ){
 12880      rc = sqlite3_open(":memory:", &pNew->dbm);
 12881      if( rc==SQLITE_OK ){
 12882        sqlite3_db_config(pNew->dbm, SQLITE_DBCONFIG_TRIGGER_EQP, 1, (int*)0);
 12883      }
 12884    }
 12885    
 12886  
 12887    /* Copy the entire schema of database [db] into [dbm]. */
 12888    if( rc==SQLITE_OK ){
 12889      sqlite3_stmt *pSql = 0;
 12890      rc = idxPrintfPrepareStmt(pNew->db, &pSql, pzErrmsg, 
 12891          "SELECT sql FROM sqlite_schema WHERE name NOT LIKE 'sqlite_%%'"
 12892          " AND sql NOT LIKE 'CREATE VIRTUAL %%'"
 12893      );
 12894      while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
 12895        const char *zSql = (const char*)sqlite3_column_text(pSql, 0);
 12896        if( zSql ) rc = sqlite3_exec(pNew->dbm, zSql, 0, 0, pzErrmsg);
 12897      }
 12898      idxFinalize(&rc, pSql);
 12899    }
 12900  
 12901    /* Create the vtab schema */
 12902    if( rc==SQLITE_OK ){
 12903      rc = idxCreateVtabSchema(pNew, pzErrmsg);
 12904    }
 12905  
 12906    /* Register the auth callback with dbv */
 12907    if( rc==SQLITE_OK ){
 12908      sqlite3_set_authorizer(pNew->dbv, idxAuthCallback, (void*)pNew);
 12909    }
 12910  
 12911    /* If an error has occurred, free the new object and reutrn NULL. Otherwise,
 12912    ** return the new sqlite3expert handle.  */
 12913    if( rc!=SQLITE_OK ){
 12914      sqlite3_expert_destroy(pNew);
 12915      pNew = 0;
 12916    }
 12917    return pNew;
 12918  }
 12919  
 12920  /*
 12921  ** Configure an sqlite3expert object.
 12922  */
 12923  int sqlite3_expert_config(sqlite3expert *p, int op, ...){
 12924    int rc = SQLITE_OK;
 12925    va_list ap;
 12926    va_start(ap, op);
 12927    switch( op ){
 12928      case EXPERT_CONFIG_SAMPLE: {
 12929        int iVal = va_arg(ap, int);
 12930        if( iVal<0 ) iVal = 0;
 12931        if( iVal>100 ) iVal = 100;
 12932        p->iSample = iVal;
 12933        break;
 12934      }
 12935      default:
 12936        rc = SQLITE_NOTFOUND;
 12937        break;
 12938    }
 12939  
 12940    va_end(ap);
 12941    return rc;
 12942  }
 12943  
 12944  /*
 12945  ** Add an SQL statement to the analysis.
 12946  */
 12947  int sqlite3_expert_sql(
 12948    sqlite3expert *p,               /* From sqlite3_expert_new() */
 12949    const char *zSql,               /* SQL statement to add */
 12950    char **pzErr                    /* OUT: Error message (if any) */
 12951  ){
 12952    IdxScan *pScanOrig = p->pScan;
 12953    IdxStatement *pStmtOrig = p->pStatement;
 12954    int rc = SQLITE_OK;
 12955    const char *zStmt = zSql;
 12956  
 12957    if( p->bRun ) return SQLITE_MISUSE;
 12958  
 12959    while( rc==SQLITE_OK && zStmt && zStmt[0] ){
 12960      sqlite3_stmt *pStmt = 0;
 12961      rc = sqlite3_prepare_v2(p->dbv, zStmt, -1, &pStmt, &zStmt);
 12962      if( rc==SQLITE_OK ){
 12963        if( pStmt ){
 12964          IdxStatement *pNew;
 12965          const char *z = sqlite3_sql(pStmt);
 12966          int n = STRLEN(z);
 12967          pNew = (IdxStatement*)idxMalloc(&rc, sizeof(IdxStatement) + n+1);
 12968          if( rc==SQLITE_OK ){
 12969            pNew->zSql = (char*)&pNew[1];
 12970            memcpy(pNew->zSql, z, n+1);
 12971            pNew->pNext = p->pStatement;
 12972            if( p->pStatement ) pNew->iId = p->pStatement->iId+1;
 12973            p->pStatement = pNew;
 12974          }
 12975          sqlite3_finalize(pStmt);
 12976        }
 12977      }else{
 12978        idxDatabaseError(p->dbv, pzErr);
 12979      }
 12980    }
 12981  
 12982    if( rc!=SQLITE_OK ){
 12983      idxScanFree(p->pScan, pScanOrig);
 12984      idxStatementFree(p->pStatement, pStmtOrig);
 12985      p->pScan = pScanOrig;
 12986      p->pStatement = pStmtOrig;
 12987    }
 12988  
 12989    return rc;
 12990  }
 12991  
 12992  int sqlite3_expert_analyze(sqlite3expert *p, char **pzErr){
 12993    int rc;
 12994    IdxHashEntry *pEntry;
 12995  
 12996    /* Do trigger processing to collect any extra IdxScan structures */
 12997    rc = idxProcessTriggers(p, pzErr);
 12998  
 12999    /* Create candidate indexes within the in-memory database file */
 13000    if( rc==SQLITE_OK ){
 13001      rc = idxCreateCandidates(p);
 13002    }else if ( rc==SQLITE_BUSY_TIMEOUT ){
 13003      if( pzErr )
 13004        *pzErr = sqlite3_mprintf("Cannot find a unique index name to propose.");
 13005      return rc;
 13006    }
 13007  
 13008    /* Generate the stat1 data */
 13009    if( rc==SQLITE_OK ){
 13010      rc = idxPopulateStat1(p, pzErr);
 13011    }
 13012  
 13013    /* Formulate the EXPERT_REPORT_CANDIDATES text */
 13014    for(pEntry=p->hIdx.pFirst; pEntry; pEntry=pEntry->pNext){
 13015      p->zCandidates = idxAppendText(&rc, p->zCandidates, 
 13016          "%s;%s%s\n", pEntry->zVal, 
 13017          pEntry->zVal2 ? " -- stat1: " : "", pEntry->zVal2
 13018      );
 13019    }
 13020  
 13021    /* Figure out which of the candidate indexes are preferred by the query
 13022    ** planner and report the results to the user.  */
 13023    if( rc==SQLITE_OK ){
 13024      rc = idxFindIndexes(p, pzErr);
 13025    }
 13026  
 13027    if( rc==SQLITE_OK ){
 13028      p->bRun = 1;
 13029    }
 13030    return rc;
 13031  }
 13032  
 13033  /*
 13034  ** Return the total number of statements that have been added to this
 13035  ** sqlite3expert using sqlite3_expert_sql().
 13036  */
 13037  int sqlite3_expert_count(sqlite3expert *p){
 13038    int nRet = 0;
 13039    if( p->pStatement ) nRet = p->pStatement->iId+1;
 13040    return nRet;
 13041  }
 13042  
 13043  /*
 13044  ** Return a component of the report.
 13045  */
 13046  const char *sqlite3_expert_report(sqlite3expert *p, int iStmt, int eReport){
 13047    const char *zRet = 0;
 13048    IdxStatement *pStmt;
 13049  
 13050    if( p->bRun==0 ) return 0;
 13051    for(pStmt=p->pStatement; pStmt && pStmt->iId!=iStmt; pStmt=pStmt->pNext);
 13052    switch( eReport ){
 13053      case EXPERT_REPORT_SQL:
 13054        if( pStmt ) zRet = pStmt->zSql;
 13055        break;
 13056      case EXPERT_REPORT_INDEXES:
 13057        if( pStmt ) zRet = pStmt->zIdx;
 13058        break;
 13059      case EXPERT_REPORT_PLAN:
 13060        if( pStmt ) zRet = pStmt->zEQP;
 13061        break;
 13062      case EXPERT_REPORT_CANDIDATES:
 13063        zRet = p->zCandidates;
 13064        break;
 13065    }
 13066    return zRet;
 13067  }
 13068  
 13069  /*
 13070  ** Free an sqlite3expert object.
 13071  */
 13072  void sqlite3_expert_destroy(sqlite3expert *p){
 13073    if( p ){
 13074      sqlite3_close(p->dbm);
 13075      sqlite3_close(p->dbv);
 13076      idxScanFree(p->pScan, 0);
 13077      idxStatementFree(p->pStatement, 0);
 13078      idxTableFree(p->pTable);
 13079      idxWriteFree(p->pWrite);
 13080      idxHashClear(&p->hIdx);
 13081      sqlite3_free(p->zCandidates);
 13082      sqlite3_free(p);
 13083    }
 13084  }
 13085  
 13086  #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
 13087  
 13088  /************************* End ../ext/expert/sqlite3expert.c ********************/
 13089  
 13090  #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
 13091  #define SQLITE_SHELL_HAVE_RECOVER 1
 13092  #else
 13093  #define SQLITE_SHELL_HAVE_RECOVER 0
 13094  #endif
 13095  #if SQLITE_SHELL_HAVE_RECOVER
 13096  /************************* Begin ../ext/recover/sqlite3recover.h ******************/
 13097  /*
 13098  ** 2022-08-27
 13099  **
 13100  ** The author disclaims copyright to this source code.  In place of
 13101  ** a legal notice, here is a blessing:
 13102  **
 13103  **    May you do good and not evil.
 13104  **    May you find forgiveness for yourself and forgive others.
 13105  **    May you share freely, never taking more than you give.
 13106  **
 13107  *************************************************************************
 13108  **
 13109  ** This file contains the public interface to the "recover" extension -
 13110  ** an SQLite extension designed to recover data from corrupted database
 13111  ** files.
 13112  */
 13113  
 13114  /*
 13115  ** OVERVIEW:
 13116  **
 13117  ** To use the API to recover data from a corrupted database, an
 13118  ** application:
 13119  **
 13120  **   1) Creates an sqlite3_recover handle by calling either
 13121  **      sqlite3_recover_init() or sqlite3_recover_init_sql().
 13122  **
 13123  **   2) Configures the new handle using one or more calls to
 13124  **      sqlite3_recover_config().
 13125  **
 13126  **   3) Executes the recovery by repeatedly calling sqlite3_recover_step() on
 13127  **      the handle until it returns something other than SQLITE_OK. If it
 13128  **      returns SQLITE_DONE, then the recovery operation completed without 
 13129  **      error. If it returns some other non-SQLITE_OK value, then an error 
 13130  **      has occurred.
 13131  **
 13132  **   4) Retrieves any error code and English language error message using the
 13133  **      sqlite3_recover_errcode() and sqlite3_recover_errmsg() APIs,
 13134  **      respectively.
 13135  **
 13136  **   5) Destroys the sqlite3_recover handle and frees all resources
 13137  **      using sqlite3_recover_finish().
 13138  **
 13139  ** The application may abandon the recovery operation at any point 
 13140  ** before it is finished by passing the sqlite3_recover handle to
 13141  ** sqlite3_recover_finish(). This is not an error, but the final state
 13142  ** of the output database, or the results of running the partial script
 13143  ** delivered to the SQL callback, are undefined.
 13144  */
 13145  
 13146  #ifndef _SQLITE_RECOVER_H
 13147  #define _SQLITE_RECOVER_H
 13148  
 13149  /* #include "sqlite3.h" */
 13150  
 13151  #ifdef __cplusplus
 13152  extern "C" {
 13153  #endif
 13154  
 13155  /*
 13156  ** An instance of the sqlite3_recover object represents a recovery
 13157  ** operation in progress.
 13158  **
 13159  ** Constructors:
 13160  **
 13161  **    sqlite3_recover_init()
 13162  **    sqlite3_recover_init_sql()
 13163  **
 13164  ** Destructor:
 13165  **
 13166  **    sqlite3_recover_finish()
 13167  **
 13168  ** Methods:
 13169  **
 13170  **    sqlite3_recover_config()
 13171  **    sqlite3_recover_errcode()
 13172  **    sqlite3_recover_errmsg()
 13173  **    sqlite3_recover_run()
 13174  **    sqlite3_recover_step()
 13175  */
 13176  typedef struct sqlite3_recover sqlite3_recover;
 13177  
 13178  /* 
 13179  ** These two APIs attempt to create and return a new sqlite3_recover object.
 13180  ** In both cases the first two arguments identify the (possibly
 13181  ** corrupt) database to recover data from. The first argument is an open
 13182  ** database handle and the second the name of a database attached to that
 13183  ** handle (i.e. "main", "temp" or the name of an attached database).
 13184  **
 13185  ** If sqlite3_recover_init() is used to create the new sqlite3_recover
 13186  ** handle, then data is recovered into a new database, identified by
 13187  ** string parameter zUri. zUri may be an absolute or relative file path,
 13188  ** or may be an SQLite URI. If the identified database file already exists,
 13189  ** it is overwritten.
 13190  **
 13191  ** If sqlite3_recover_init_sql() is invoked, then any recovered data will
 13192  ** be returned to the user as a series of SQL statements. Executing these
 13193  ** SQL statements results in the same database as would have been created
 13194  ** had sqlite3_recover_init() been used. For each SQL statement in the
 13195  ** output, the callback function passed as the third argument (xSql) is 
 13196  ** invoked once. The first parameter is a passed a copy of the fourth argument
 13197  ** to this function (pCtx) as its first parameter, and a pointer to a
 13198  ** nul-terminated buffer containing the SQL statement formated as UTF-8 as 
 13199  ** the second. If the xSql callback returns any value other than SQLITE_OK,
 13200  ** then processing is immediately abandoned and the value returned used as
 13201  ** the recover handle error code (see below).
 13202  **
 13203  ** If an out-of-memory error occurs, NULL may be returned instead of
 13204  ** a valid handle. In all other cases, it is the responsibility of the
 13205  ** application to avoid resource leaks by ensuring that
 13206  ** sqlite3_recover_finish() is called on all allocated handles.
 13207  */
 13208  sqlite3_recover *sqlite3_recover_init(
 13209    sqlite3* db, 
 13210    const char *zDb, 
 13211    const char *zUri
 13212  );
 13213  sqlite3_recover *sqlite3_recover_init_sql(
 13214    sqlite3* db, 
 13215    const char *zDb, 
 13216    int (*xSql)(void*, const char*),
 13217    void *pCtx
 13218  );
 13219  
 13220  /*
 13221  ** Configure an sqlite3_recover object that has just been created using
 13222  ** sqlite3_recover_init() or sqlite3_recover_init_sql(). This function
 13223  ** may only be called before the first call to sqlite3_recover_step()
 13224  ** or sqlite3_recover_run() on the object.
 13225  **
 13226  ** The second argument passed to this function must be one of the
 13227  ** SQLITE_RECOVER_* symbols defined below. Valid values for the third argument
 13228  ** depend on the specific SQLITE_RECOVER_* symbol in use.
 13229  **
 13230  ** SQLITE_OK is returned if the configuration operation was successful,
 13231  ** or an SQLite error code otherwise.
 13232  */
 13233  int sqlite3_recover_config(sqlite3_recover*, int op, void *pArg);
 13234  
 13235  /*
 13236  ** SQLITE_RECOVER_LOST_AND_FOUND:
 13237  **   The pArg argument points to a string buffer containing the name
 13238  **   of a "lost-and-found" table in the output database, or NULL. If
 13239  **   the argument is non-NULL and the database contains seemingly
 13240  **   valid pages that cannot be associated with any table in the
 13241  **   recovered part of the schema, data is extracted from these
 13242  **   pages to add to the lost-and-found table.
 13243  **
 13244  ** SQLITE_RECOVER_FREELIST_CORRUPT:
 13245  **   The pArg value must actually be a pointer to a value of type
 13246  **   int containing value 0 or 1 cast as a (void*). If this option is set
 13247  **   (argument is 1) and a lost-and-found table has been configured using
 13248  **   SQLITE_RECOVER_LOST_AND_FOUND, then is assumed that the freelist is 
 13249  **   corrupt and an attempt is made to recover records from pages that
 13250  **   appear to be linked into the freelist. Otherwise, pages on the freelist
 13251  **   are ignored. Setting this option can recover more data from the
 13252  **   database, but often ends up "recovering" deleted records. The default 
 13253  **   value is 0 (clear).
 13254  **
 13255  ** SQLITE_RECOVER_ROWIDS:
 13256  **   The pArg value must actually be a pointer to a value of type
 13257  **   int containing value 0 or 1 cast as a (void*). If this option is set
 13258  **   (argument is 1), then an attempt is made to recover rowid values
 13259  **   that are not also INTEGER PRIMARY KEY values. If this option is
 13260  **   clear, then new rowids are assigned to all recovered rows. The
 13261  **   default value is 1 (set).
 13262  **
 13263  ** SQLITE_RECOVER_SLOWINDEXES:
 13264  **   The pArg value must actually be a pointer to a value of type
 13265  **   int containing value 0 or 1 cast as a (void*). If this option is clear
 13266  **   (argument is 0), then when creating an output database, the recover 
 13267  **   module creates and populates non-UNIQUE indexes right at the end of the
 13268  **   recovery operation - after all recoverable data has been inserted
 13269  **   into the new database. This is faster overall, but means that the
 13270  **   final call to sqlite3_recover_step() for a recovery operation may
 13271  **   be need to create a large number of indexes, which may be very slow.
 13272  **
 13273  **   Or, if this option is set (argument is 1), then non-UNIQUE indexes
 13274  **   are created in the output database before it is populated with 
 13275  **   recovered data. This is slower overall, but avoids the slow call
 13276  **   to sqlite3_recover_step() at the end of the recovery operation.
 13277  **
 13278  **   The default option value is 0.
 13279  */
 13280  #define SQLITE_RECOVER_LOST_AND_FOUND   1
 13281  #define SQLITE_RECOVER_FREELIST_CORRUPT 2
 13282  #define SQLITE_RECOVER_ROWIDS           3
 13283  #define SQLITE_RECOVER_SLOWINDEXES      4
 13284  
 13285  /*
 13286  ** Perform a unit of work towards the recovery operation. This function 
 13287  ** must normally be called multiple times to complete database recovery.
 13288  **
 13289  ** If no error occurs but the recovery operation is not completed, this
 13290  ** function returns SQLITE_OK. If recovery has been completed successfully
 13291  ** then SQLITE_DONE is returned. If an error has occurred, then an SQLite
 13292  ** error code (e.g. SQLITE_IOERR or SQLITE_NOMEM) is returned. It is not
 13293  ** considered an error if some or all of the data cannot be recovered
 13294  ** due to database corruption.
 13295  **
 13296  ** Once sqlite3_recover_step() has returned a value other than SQLITE_OK,
 13297  ** all further such calls on the same recover handle are no-ops that return
 13298  ** the same non-SQLITE_OK value.
 13299  */
 13300  int sqlite3_recover_step(sqlite3_recover*);
 13301  
 13302  /* 
 13303  ** Run the recovery operation to completion. Return SQLITE_OK if successful,
 13304  ** or an SQLite error code otherwise. Calling this function is the same
 13305  ** as executing:
 13306  **
 13307  **     while( SQLITE_OK==sqlite3_recover_step(p) );
 13308  **     return sqlite3_recover_errcode(p);
 13309  */
 13310  int sqlite3_recover_run(sqlite3_recover*);
 13311  
 13312  /*
 13313  ** If an error has been encountered during a prior call to
 13314  ** sqlite3_recover_step(), then this function attempts to return a 
 13315  ** pointer to a buffer containing an English language explanation of 
 13316  ** the error. If no error message is available, or if an out-of memory 
 13317  ** error occurs while attempting to allocate a buffer in which to format
 13318  ** the error message, NULL is returned.
 13319  **
 13320  ** The returned buffer remains valid until the sqlite3_recover handle is
 13321  ** destroyed using sqlite3_recover_finish().
 13322  */
 13323  const char *sqlite3_recover_errmsg(sqlite3_recover*);
 13324  
 13325  /*
 13326  ** If this function is called on an sqlite3_recover handle after
 13327  ** an error occurs, an SQLite error code is returned. Otherwise, SQLITE_OK.
 13328  */
 13329  int sqlite3_recover_errcode(sqlite3_recover*);
 13330  
 13331  /* 
 13332  ** Clean up a recovery object created by a call to sqlite3_recover_init().
 13333  ** The results of using a recovery object with any API after it has been
 13334  ** passed to this function are undefined.
 13335  **
 13336  ** This function returns the same value as sqlite3_recover_errcode().
 13337  */
 13338  int sqlite3_recover_finish(sqlite3_recover*);
 13339  
 13340  
 13341  #ifdef __cplusplus
 13342  }  /* end of the 'extern "C"' block */
 13343  #endif
 13344  
 13345  #endif /* ifndef _SQLITE_RECOVER_H */
 13346  
 13347  /************************* End ../ext/recover/sqlite3recover.h ********************/
 13348  # ifndef SQLITE_HAVE_SQLITE3R
 13349  /************************* Begin ../ext/recover/dbdata.c ******************/
 13350  /*
 13351  ** 2019-04-17
 13352  **
 13353  ** The author disclaims copyright to this source code.  In place of
 13354  ** a legal notice, here is a blessing:
 13355  **
 13356  **    May you do good and not evil.
 13357  **    May you find forgiveness for yourself and forgive others.
 13358  **    May you share freely, never taking more than you give.
 13359  **
 13360  ******************************************************************************
 13361  **
 13362  ** This file contains an implementation of two eponymous virtual tables,
 13363  ** "sqlite_dbdata" and "sqlite_dbptr". Both modules require that the
 13364  ** "sqlite_dbpage" eponymous virtual table be available.
 13365  **
 13366  ** SQLITE_DBDATA:
 13367  **   sqlite_dbdata is used to extract data directly from a database b-tree
 13368  **   page and its associated overflow pages, bypassing the b-tree layer.
 13369  **   The table schema is equivalent to:
 13370  **
 13371  **     CREATE TABLE sqlite_dbdata(
 13372  **       pgno INTEGER,
 13373  **       cell INTEGER,
 13374  **       field INTEGER,
 13375  **       value ANY,
 13376  **       schema TEXT HIDDEN
 13377  **     );
 13378  **
 13379  **   IMPORTANT: THE VIRTUAL TABLE SCHEMA ABOVE IS SUBJECT TO CHANGE. IN THE
 13380  **   FUTURE NEW NON-HIDDEN COLUMNS MAY BE ADDED BETWEEN "value" AND
 13381  **   "schema".
 13382  **
 13383  **   Each page of the database is inspected. If it cannot be interpreted as
 13384  **   a b-tree page, or if it is a b-tree page containing 0 entries, the
 13385  **   sqlite_dbdata table contains no rows for that page.  Otherwise, the
 13386  **   table contains one row for each field in the record associated with
 13387  **   each cell on the page. For intkey b-trees, the key value is stored in
 13388  **   field -1.
 13389  **
 13390  **   For example, for the database:
 13391  **
 13392  **     CREATE TABLE t1(a, b);     -- root page is page 2
 13393  **     INSERT INTO t1(rowid, a, b) VALUES(5, 'v', 'five');
 13394  **     INSERT INTO t1(rowid, a, b) VALUES(10, 'x', 'ten');
 13395  **
 13396  **   the sqlite_dbdata table contains, as well as from entries related to 
 13397  **   page 1, content equivalent to:
 13398  **
 13399  **     INSERT INTO sqlite_dbdata(pgno, cell, field, value) VALUES
 13400  **         (2, 0, -1, 5     ),
 13401  **         (2, 0,  0, 'v'   ),
 13402  **         (2, 0,  1, 'five'),
 13403  **         (2, 1, -1, 10    ),
 13404  **         (2, 1,  0, 'x'   ),
 13405  **         (2, 1,  1, 'ten' );
 13406  **
 13407  **   If database corruption is encountered, this module does not report an
 13408  **   error. Instead, it attempts to extract as much data as possible and
 13409  **   ignores the corruption.
 13410  **
 13411  ** SQLITE_DBPTR:
 13412  **   The sqlite_dbptr table has the following schema:
 13413  **
 13414  **     CREATE TABLE sqlite_dbptr(
 13415  **       pgno INTEGER,
 13416  **       child INTEGER,
 13417  **       schema TEXT HIDDEN
 13418  **     );
 13419  **
 13420  **   It contains one entry for each b-tree pointer between a parent and
 13421  **   child page in the database.
 13422  */
 13423  
 13424  #if !defined(SQLITEINT_H) 
 13425  /* #include "sqlite3.h" */
 13426  
 13427  /* typedef unsigned char u8; */
 13428  /* typedef unsigned int u32; */
 13429  
 13430  #endif
 13431  #include <string.h>
 13432  #include <assert.h>
 13433  
 13434  #ifndef SQLITE_OMIT_VIRTUALTABLE
 13435  
 13436  #define DBDATA_PADDING_BYTES 100 
 13437  
 13438  typedef struct DbdataTable DbdataTable;
 13439  typedef struct DbdataCursor DbdataCursor;
 13440  
 13441  /* Cursor object */
 13442  struct DbdataCursor {
 13443    sqlite3_vtab_cursor base;       /* Base class.  Must be first */
 13444    sqlite3_stmt *pStmt;            /* For fetching database pages */
 13445  
 13446    int iPgno;                      /* Current page number */
 13447    u8 *aPage;                      /* Buffer containing page */
 13448    int nPage;                      /* Size of aPage[] in bytes */
 13449    int nCell;                      /* Number of cells on aPage[] */
 13450    int iCell;                      /* Current cell number */
 13451    int bOnePage;                   /* True to stop after one page */
 13452    int szDb;
 13453    sqlite3_int64 iRowid;
 13454  
 13455    /* Only for the sqlite_dbdata table */
 13456    u8 *pRec;                       /* Buffer containing current record */
 13457    sqlite3_int64 nRec;             /* Size of pRec[] in bytes */
 13458    sqlite3_int64 nHdr;             /* Size of header in bytes */
 13459    int iField;                     /* Current field number */
 13460    u8 *pHdrPtr;
 13461    u8 *pPtr;
 13462    u32 enc;                        /* Text encoding */
 13463    
 13464    sqlite3_int64 iIntkey;          /* Integer key value */
 13465  };
 13466  
 13467  /* Table object */
 13468  struct DbdataTable {
 13469    sqlite3_vtab base;              /* Base class.  Must be first */
 13470    sqlite3 *db;                    /* The database connection */
 13471    sqlite3_stmt *pStmt;            /* For fetching database pages */
 13472    int bPtr;                       /* True for sqlite3_dbptr table */
 13473  };
 13474  
 13475  /* Column and schema definitions for sqlite_dbdata */
 13476  #define DBDATA_COLUMN_PGNO        0
 13477  #define DBDATA_COLUMN_CELL        1
 13478  #define DBDATA_COLUMN_FIELD       2
 13479  #define DBDATA_COLUMN_VALUE       3
 13480  #define DBDATA_COLUMN_SCHEMA      4
 13481  #define DBDATA_SCHEMA             \
 13482        "CREATE TABLE x("           \
 13483        "  pgno INTEGER,"           \
 13484        "  cell INTEGER,"           \
 13485        "  field INTEGER,"          \
 13486        "  value ANY,"              \
 13487        "  schema TEXT HIDDEN"      \
 13488        ")"
 13489  
 13490  /* Column and schema definitions for sqlite_dbptr */
 13491  #define DBPTR_COLUMN_PGNO         0
 13492  #define DBPTR_COLUMN_CHILD        1
 13493  #define DBPTR_COLUMN_SCHEMA       2
 13494  #define DBPTR_SCHEMA              \
 13495        "CREATE TABLE x("           \
 13496        "  pgno INTEGER,"           \
 13497        "  child INTEGER,"          \
 13498        "  schema TEXT HIDDEN"      \
 13499        ")"
 13500  
 13501  /*
 13502  ** Connect to an sqlite_dbdata (pAux==0) or sqlite_dbptr (pAux!=0) virtual 
 13503  ** table.
 13504  */
 13505  static int dbdataConnect(
 13506    sqlite3 *db,
 13507    void *pAux,
 13508    int argc, const char *const*argv,
 13509    sqlite3_vtab **ppVtab,
 13510    char **pzErr
 13511  ){
 13512    DbdataTable *pTab = 0;
 13513    int rc = sqlite3_declare_vtab(db, pAux ? DBPTR_SCHEMA : DBDATA_SCHEMA);
 13514  
 13515    (void)argc;
 13516    (void)argv;
 13517    (void)pzErr;
 13518    sqlite3_vtab_config(db, SQLITE_VTAB_USES_ALL_SCHEMAS);
 13519    if( rc==SQLITE_OK ){
 13520      pTab = (DbdataTable*)sqlite3_malloc64(sizeof(DbdataTable));
 13521      if( pTab==0 ){
 13522        rc = SQLITE_NOMEM;
 13523      }else{
 13524        memset(pTab, 0, sizeof(DbdataTable));
 13525        pTab->db = db;
 13526        pTab->bPtr = (pAux!=0);
 13527      }
 13528    }
 13529  
 13530    *ppVtab = (sqlite3_vtab*)pTab;
 13531    return rc;
 13532  }
 13533  
 13534  /*
 13535  ** Disconnect from or destroy a sqlite_dbdata or sqlite_dbptr virtual table.
 13536  */
 13537  static int dbdataDisconnect(sqlite3_vtab *pVtab){
 13538    DbdataTable *pTab = (DbdataTable*)pVtab;
 13539    if( pTab ){
 13540      sqlite3_finalize(pTab->pStmt);
 13541      sqlite3_free(pVtab);
 13542    }
 13543    return SQLITE_OK;
 13544  }
 13545  
 13546  /*
 13547  ** This function interprets two types of constraints:
 13548  **
 13549  **       schema=?
 13550  **       pgno=?
 13551  **
 13552  ** If neither are present, idxNum is set to 0. If schema=? is present,
 13553  ** the 0x01 bit in idxNum is set. If pgno=? is present, the 0x02 bit
 13554  ** in idxNum is set.
 13555  **
 13556  ** If both parameters are present, schema is in position 0 and pgno in
 13557  ** position 1.
 13558  */
 13559  static int dbdataBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdx){
 13560    DbdataTable *pTab = (DbdataTable*)tab;
 13561    int i;
 13562    int iSchema = -1;
 13563    int iPgno = -1;
 13564    int colSchema = (pTab->bPtr ? DBPTR_COLUMN_SCHEMA : DBDATA_COLUMN_SCHEMA);
 13565  
 13566    for(i=0; i<pIdx->nConstraint; i++){
 13567      struct sqlite3_index_constraint *p = &pIdx->aConstraint[i];
 13568      if( p->op==SQLITE_INDEX_CONSTRAINT_EQ ){
 13569        if( p->iColumn==colSchema ){
 13570          if( p->usable==0 ) return SQLITE_CONSTRAINT;
 13571          iSchema = i;
 13572        }
 13573        if( p->iColumn==DBDATA_COLUMN_PGNO && p->usable ){
 13574          iPgno = i;
 13575        }
 13576      }
 13577    }
 13578  
 13579    if( iSchema>=0 ){
 13580      pIdx->aConstraintUsage[iSchema].argvIndex = 1;
 13581      pIdx->aConstraintUsage[iSchema].omit = 1;
 13582    }
 13583    if( iPgno>=0 ){
 13584      pIdx->aConstraintUsage[iPgno].argvIndex = 1 + (iSchema>=0);
 13585      pIdx->aConstraintUsage[iPgno].omit = 1;
 13586      pIdx->estimatedCost = 100;
 13587      pIdx->estimatedRows =  50;
 13588  
 13589      if( pTab->bPtr==0 && pIdx->nOrderBy && pIdx->aOrderBy[0].desc==0 ){
 13590        int iCol = pIdx->aOrderBy[0].iColumn;
 13591        if( pIdx->nOrderBy==1 ){
 13592          pIdx->orderByConsumed = (iCol==0 || iCol==1);
 13593        }else if( pIdx->nOrderBy==2 && pIdx->aOrderBy[1].desc==0 && iCol==0 ){
 13594          pIdx->orderByConsumed = (pIdx->aOrderBy[1].iColumn==1);
 13595        }
 13596      }
 13597  
 13598    }else{
 13599      pIdx->estimatedCost = 100000000;
 13600      pIdx->estimatedRows = 1000000000;
 13601    }
 13602    pIdx->idxNum = (iSchema>=0 ? 0x01 : 0x00) | (iPgno>=0 ? 0x02 : 0x00);
 13603    return SQLITE_OK;
 13604  }
 13605  
 13606  /*
 13607  ** Open a new sqlite_dbdata or sqlite_dbptr cursor.
 13608  */
 13609  static int dbdataOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
 13610    DbdataCursor *pCsr;
 13611  
 13612    pCsr = (DbdataCursor*)sqlite3_malloc64(sizeof(DbdataCursor));
 13613    if( pCsr==0 ){
 13614      return SQLITE_NOMEM;
 13615    }else{
 13616      memset(pCsr, 0, sizeof(DbdataCursor));
 13617      pCsr->base.pVtab = pVTab;
 13618    }
 13619  
 13620    *ppCursor = (sqlite3_vtab_cursor *)pCsr;
 13621    return SQLITE_OK;
 13622  }
 13623  
 13624  /*
 13625  ** Restore a cursor object to the state it was in when first allocated 
 13626  ** by dbdataOpen().
 13627  */
 13628  static void dbdataResetCursor(DbdataCursor *pCsr){
 13629    DbdataTable *pTab = (DbdataTable*)(pCsr->base.pVtab);
 13630    if( pTab->pStmt==0 ){
 13631      pTab->pStmt = pCsr->pStmt;
 13632    }else{
 13633      sqlite3_finalize(pCsr->pStmt);
 13634    }
 13635    pCsr->pStmt = 0;
 13636    pCsr->iPgno = 1;
 13637    pCsr->iCell = 0;
 13638    pCsr->iField = 0;
 13639    pCsr->bOnePage = 0;
 13640    sqlite3_free(pCsr->aPage);
 13641    sqlite3_free(pCsr->pRec);
 13642    pCsr->pRec = 0;
 13643    pCsr->aPage = 0;
 13644  }
 13645  
 13646  /*
 13647  ** Close an sqlite_dbdata or sqlite_dbptr cursor.
 13648  */
 13649  static int dbdataClose(sqlite3_vtab_cursor *pCursor){
 13650    DbdataCursor *pCsr = (DbdataCursor*)pCursor;
 13651    dbdataResetCursor(pCsr);
 13652    sqlite3_free(pCsr);
 13653    return SQLITE_OK;
 13654  }
 13655  
 13656  /* 
 13657  ** Utility methods to decode 16 and 32-bit big-endian unsigned integers. 
 13658  */
 13659  static u32 get_uint16(unsigned char *a){
 13660    return (a[0]<<8)|a[1];
 13661  }
 13662  static u32 get_uint32(unsigned char *a){
 13663    return ((u32)a[0]<<24)
 13664         | ((u32)a[1]<<16)
 13665         | ((u32)a[2]<<8)
 13666         | ((u32)a[3]);
 13667  }
 13668  
 13669  /*
 13670  ** Load page pgno from the database via the sqlite_dbpage virtual table.
 13671  ** If successful, set (*ppPage) to point to a buffer containing the page
 13672  ** data, (*pnPage) to the size of that buffer in bytes and return
 13673  ** SQLITE_OK. In this case it is the responsibility of the caller to
 13674  ** eventually free the buffer using sqlite3_free().
 13675  **
 13676  ** Or, if an error occurs, set both (*ppPage) and (*pnPage) to 0 and
 13677  ** return an SQLite error code.
 13678  */
 13679  static int dbdataLoadPage(
 13680    DbdataCursor *pCsr,             /* Cursor object */
 13681    u32 pgno,                       /* Page number of page to load */
 13682    u8 **ppPage,                    /* OUT: pointer to page buffer */
 13683    int *pnPage                     /* OUT: Size of (*ppPage) in bytes */
 13684  ){
 13685    int rc2;
 13686    int rc = SQLITE_OK;
 13687    sqlite3_stmt *pStmt = pCsr->pStmt;
 13688  
 13689    *ppPage = 0;
 13690    *pnPage = 0;
 13691    if( pgno>0 ){
 13692      sqlite3_bind_int64(pStmt, 2, pgno);
 13693      if( SQLITE_ROW==sqlite3_step(pStmt) ){
 13694        int nCopy = sqlite3_column_bytes(pStmt, 0);
 13695        if( nCopy>0 ){
 13696          u8 *pPage;
 13697          pPage = (u8*)sqlite3_malloc64(nCopy + DBDATA_PADDING_BYTES);
 13698          if( pPage==0 ){
 13699            rc = SQLITE_NOMEM;
 13700          }else{
 13701            const u8 *pCopy = sqlite3_column_blob(pStmt, 0);
 13702            memcpy(pPage, pCopy, nCopy);
 13703            memset(&pPage[nCopy], 0, DBDATA_PADDING_BYTES);
 13704          }
 13705          *ppPage = pPage;
 13706          *pnPage = nCopy;
 13707        }
 13708      }
 13709      rc2 = sqlite3_reset(pStmt);
 13710      if( rc==SQLITE_OK ) rc = rc2;
 13711    }
 13712  
 13713    return rc;
 13714  }
 13715  
 13716  /*
 13717  ** Read a varint.  Put the value in *pVal and return the number of bytes.
 13718  */
 13719  static int dbdataGetVarint(const u8 *z, sqlite3_int64 *pVal){
 13720    sqlite3_uint64 u = 0;
 13721    int i;
 13722    for(i=0; i<8; i++){
 13723      u = (u<<7) + (z[i]&0x7f);
 13724      if( (z[i]&0x80)==0 ){ *pVal = (sqlite3_int64)u; return i+1; }
 13725    }
 13726    u = (u<<8) + (z[i]&0xff);
 13727    *pVal = (sqlite3_int64)u;
 13728    return 9;
 13729  }
 13730  
 13731  /*
 13732  ** Like dbdataGetVarint(), but set the output to 0 if it is less than 0
 13733  ** or greater than 0xFFFFFFFF. This can be used for all varints in an
 13734  ** SQLite database except for key values in intkey tables.
 13735  */
 13736  static int dbdataGetVarintU32(const u8 *z, sqlite3_int64 *pVal){
 13737    sqlite3_int64 val;
 13738    int nRet = dbdataGetVarint(z, &val);
 13739    if( val<0 || val>0xFFFFFFFF ) val = 0;
 13740    *pVal = val;
 13741    return nRet;
 13742  }
 13743  
 13744  /*
 13745  ** Return the number of bytes of space used by an SQLite value of type
 13746  ** eType.
 13747  */
 13748  static int dbdataValueBytes(int eType){
 13749    switch( eType ){
 13750      case 0: case 8: case 9:
 13751      case 10: case 11:
 13752        return 0;
 13753      case 1:
 13754        return 1;
 13755      case 2:
 13756        return 2;
 13757      case 3:
 13758        return 3;
 13759      case 4:
 13760        return 4;
 13761      case 5:
 13762        return 6;
 13763      case 6:
 13764      case 7:
 13765        return 8;
 13766      default:
 13767        if( eType>0 ){
 13768          return ((eType-12) / 2);
 13769        }
 13770        return 0;
 13771    }
 13772  }
 13773  
 13774  /*
 13775  ** Load a value of type eType from buffer pData and use it to set the
 13776  ** result of context object pCtx.
 13777  */
 13778  static void dbdataValue(
 13779    sqlite3_context *pCtx, 
 13780    u32 enc,
 13781    int eType, 
 13782    u8 *pData,
 13783    sqlite3_int64 nData
 13784  ){
 13785    if( eType>=0 && dbdataValueBytes(eType)<=nData ){
 13786      switch( eType ){
 13787        case 0: 
 13788        case 10: 
 13789        case 11: 
 13790          sqlite3_result_null(pCtx);
 13791          break;
 13792        
 13793        case 8: 
 13794          sqlite3_result_int(pCtx, 0);
 13795          break;
 13796        case 9:
 13797          sqlite3_result_int(pCtx, 1);
 13798          break;
 13799    
 13800        case 1: case 2: case 3: case 4: case 5: case 6: case 7: {
 13801          sqlite3_uint64 v = (signed char)pData[0];
 13802          pData++;
 13803          switch( eType ){
 13804            case 7:
 13805            case 6:  v = (v<<16) + (pData[0]<<8) + pData[1];  pData += 2;
 13806            case 5:  v = (v<<16) + (pData[0]<<8) + pData[1];  pData += 2;
 13807            case 4:  v = (v<<8) + pData[0];  pData++;
 13808            case 3:  v = (v<<8) + pData[0];  pData++;
 13809            case 2:  v = (v<<8) + pData[0];  pData++;
 13810          }
 13811    
 13812          if( eType==7 ){
 13813            double r;
 13814            memcpy(&r, &v, sizeof(r));
 13815            sqlite3_result_double(pCtx, r);
 13816          }else{
 13817            sqlite3_result_int64(pCtx, (sqlite3_int64)v);
 13818          }
 13819          break;
 13820        }
 13821    
 13822        default: {
 13823          int n = ((eType-12) / 2);
 13824          if( eType % 2 ){
 13825            switch( enc ){
 13826  #ifndef SQLITE_OMIT_UTF16
 13827              case SQLITE_UTF16BE:
 13828                sqlite3_result_text16be(pCtx, (void*)pData, n, SQLITE_TRANSIENT);
 13829                break;
 13830              case SQLITE_UTF16LE:
 13831                sqlite3_result_text16le(pCtx, (void*)pData, n, SQLITE_TRANSIENT);
 13832                break;
 13833  #endif
 13834              default:
 13835                sqlite3_result_text(pCtx, (char*)pData, n, SQLITE_TRANSIENT);
 13836                break;
 13837            }
 13838          }else{
 13839            sqlite3_result_blob(pCtx, pData, n, SQLITE_TRANSIENT);
 13840          }
 13841        }
 13842      }
 13843    }
 13844  }
 13845  
 13846  /*
 13847  ** Move an sqlite_dbdata or sqlite_dbptr cursor to the next entry.
 13848  */
 13849  static int dbdataNext(sqlite3_vtab_cursor *pCursor){
 13850    DbdataCursor *pCsr = (DbdataCursor*)pCursor;
 13851    DbdataTable *pTab = (DbdataTable*)pCursor->pVtab;
 13852  
 13853    pCsr->iRowid++;
 13854    while( 1 ){
 13855      int rc;
 13856      int iOff = (pCsr->iPgno==1 ? 100 : 0);
 13857      int bNextPage = 0;
 13858  
 13859      if( pCsr->aPage==0 ){
 13860        while( 1 ){
 13861          if( pCsr->bOnePage==0 && pCsr->iPgno>pCsr->szDb ) return SQLITE_OK;
 13862          rc = dbdataLoadPage(pCsr, pCsr->iPgno, &pCsr->aPage, &pCsr->nPage);
 13863          if( rc!=SQLITE_OK ) return rc;
 13864          if( pCsr->aPage && pCsr->nPage>=256 ) break;
 13865          sqlite3_free(pCsr->aPage);
 13866          pCsr->aPage = 0;
 13867          if( pCsr->bOnePage ) return SQLITE_OK;
 13868          pCsr->iPgno++;
 13869        }
 13870  
 13871        assert( iOff+3+2<=pCsr->nPage );
 13872        pCsr->iCell = pTab->bPtr ? -2 : 0;
 13873        pCsr->nCell = get_uint16(&pCsr->aPage[iOff+3]);
 13874      }
 13875  
 13876      if( pTab->bPtr ){
 13877        if( pCsr->aPage[iOff]!=0x02 && pCsr->aPage[iOff]!=0x05 ){
 13878          pCsr->iCell = pCsr->nCell;
 13879        }
 13880        pCsr->iCell++;
 13881        if( pCsr->iCell>=pCsr->nCell ){
 13882          sqlite3_free(pCsr->aPage);
 13883          pCsr->aPage = 0;
 13884          if( pCsr->bOnePage ) return SQLITE_OK;
 13885          pCsr->iPgno++;
 13886        }else{
 13887          return SQLITE_OK;
 13888        }
 13889      }else{
 13890        /* If there is no record loaded, load it now. */
 13891        if( pCsr->pRec==0 ){
 13892          int bHasRowid = 0;
 13893          int nPointer = 0;
 13894          sqlite3_int64 nPayload = 0;
 13895          sqlite3_int64 nHdr = 0;
 13896          int iHdr;
 13897          int U, X;
 13898          int nLocal;
 13899    
 13900          switch( pCsr->aPage[iOff] ){
 13901            case 0x02:
 13902              nPointer = 4;
 13903              break;
 13904            case 0x0a:
 13905              break;
 13906            case 0x0d:
 13907              bHasRowid = 1;
 13908              break;
 13909            default:
 13910              /* This is not a b-tree page with records on it. Continue. */
 13911              pCsr->iCell = pCsr->nCell;
 13912              break;
 13913          }
 13914  
 13915          if( pCsr->iCell>=pCsr->nCell ){
 13916            bNextPage = 1;
 13917          }else{
 13918    
 13919            iOff += 8 + nPointer + pCsr->iCell*2;
 13920            if( iOff>pCsr->nPage ){
 13921              bNextPage = 1;
 13922            }else{
 13923              iOff = get_uint16(&pCsr->aPage[iOff]);
 13924            }
 13925      
 13926            /* For an interior node cell, skip past the child-page number */
 13927            iOff += nPointer;
 13928      
 13929            /* Load the "byte of payload including overflow" field */
 13930            if( bNextPage || iOff>pCsr->nPage ){
 13931              bNextPage = 1;
 13932            }else{
 13933              iOff += dbdataGetVarintU32(&pCsr->aPage[iOff], &nPayload);
 13934            }
 13935      
 13936            /* If this is a leaf intkey cell, load the rowid */
 13937            if( bHasRowid && !bNextPage && iOff<pCsr->nPage ){
 13938              iOff += dbdataGetVarint(&pCsr->aPage[iOff], &pCsr->iIntkey);
 13939            }
 13940      
 13941            /* Figure out how much data to read from the local page */
 13942            U = pCsr->nPage;
 13943            if( bHasRowid ){
 13944              X = U-35;
 13945            }else{
 13946              X = ((U-12)*64/255)-23;
 13947            }
 13948            if( nPayload<=X ){
 13949              nLocal = nPayload;
 13950            }else{
 13951              int M, K;
 13952              M = ((U-12)*32/255)-23;
 13953              K = M+((nPayload-M)%(U-4));
 13954              if( K<=X ){
 13955                nLocal = K;
 13956              }else{
 13957                nLocal = M;
 13958              }
 13959            }
 13960  
 13961            if( bNextPage || nLocal+iOff>pCsr->nPage ){
 13962              bNextPage = 1;
 13963            }else{
 13964  
 13965              /* Allocate space for payload. And a bit more to catch small buffer
 13966              ** overruns caused by attempting to read a varint or similar from 
 13967              ** near the end of a corrupt record.  */
 13968              pCsr->pRec = (u8*)sqlite3_malloc64(nPayload+DBDATA_PADDING_BYTES);
 13969              if( pCsr->pRec==0 ) return SQLITE_NOMEM;
 13970              memset(pCsr->pRec, 0, nPayload+DBDATA_PADDING_BYTES);
 13971              pCsr->nRec = nPayload;
 13972  
 13973              /* Load the nLocal bytes of payload */
 13974              memcpy(pCsr->pRec, &pCsr->aPage[iOff], nLocal);
 13975              iOff += nLocal;
 13976  
 13977              /* Load content from overflow pages */
 13978              if( nPayload>nLocal ){
 13979                sqlite3_int64 nRem = nPayload - nLocal;
 13980                u32 pgnoOvfl = get_uint32(&pCsr->aPage[iOff]);
 13981                while( nRem>0 ){
 13982                  u8 *aOvfl = 0;
 13983                  int nOvfl = 0;
 13984                  int nCopy;
 13985                  rc = dbdataLoadPage(pCsr, pgnoOvfl, &aOvfl, &nOvfl);
 13986                  assert( rc!=SQLITE_OK || aOvfl==0 || nOvfl==pCsr->nPage );
 13987                  if( rc!=SQLITE_OK ) return rc;
 13988                  if( aOvfl==0 ) break;
 13989  
 13990                  nCopy = U-4;
 13991                  if( nCopy>nRem ) nCopy = nRem;
 13992                  memcpy(&pCsr->pRec[nPayload-nRem], &aOvfl[4], nCopy);
 13993                  nRem -= nCopy;
 13994  
 13995                  pgnoOvfl = get_uint32(aOvfl);
 13996                  sqlite3_free(aOvfl);
 13997                }
 13998              }
 13999      
 14000              iHdr = dbdataGetVarintU32(pCsr->pRec, &nHdr);
 14001              if( nHdr>nPayload ) nHdr = 0;
 14002              pCsr->nHdr = nHdr;
 14003              pCsr->pHdrPtr = &pCsr->pRec[iHdr];
 14004              pCsr->pPtr = &pCsr->pRec[pCsr->nHdr];
 14005              pCsr->iField = (bHasRowid ? -1 : 0);
 14006            }
 14007          }
 14008        }else{
 14009          pCsr->iField++;
 14010          if( pCsr->iField>0 ){
 14011            sqlite3_int64 iType;
 14012            if( pCsr->pHdrPtr>&pCsr->pRec[pCsr->nRec] ){
 14013              bNextPage = 1;
 14014            }else{
 14015              int szField = 0;
 14016              pCsr->pHdrPtr += dbdataGetVarintU32(pCsr->pHdrPtr, &iType);
 14017              szField = dbdataValueBytes(iType);
 14018              if( (pCsr->nRec - (pCsr->pPtr - pCsr->pRec))<szField ){
 14019                pCsr->pPtr = &pCsr->pRec[pCsr->nRec];
 14020              }else{
 14021                pCsr->pPtr += szField;
 14022              }
 14023            }
 14024          }
 14025        }
 14026  
 14027        if( bNextPage ){
 14028          sqlite3_free(pCsr->aPage);
 14029          sqlite3_free(pCsr->pRec);
 14030          pCsr->aPage = 0;
 14031          pCsr->pRec = 0;
 14032          if( pCsr->bOnePage ) return SQLITE_OK;
 14033          pCsr->iPgno++;
 14034        }else{
 14035          if( pCsr->iField<0 || pCsr->pHdrPtr<&pCsr->pRec[pCsr->nHdr] ){
 14036            return SQLITE_OK;
 14037          }
 14038  
 14039          /* Advance to the next cell. The next iteration of the loop will load
 14040          ** the record and so on. */
 14041          sqlite3_free(pCsr->pRec);
 14042          pCsr->pRec = 0;
 14043          pCsr->iCell++;
 14044        }
 14045      }
 14046    }
 14047  
 14048    assert( !"can't get here" );
 14049    return SQLITE_OK;
 14050  }
 14051  
 14052  /* 
 14053  ** Return true if the cursor is at EOF.
 14054  */
 14055  static int dbdataEof(sqlite3_vtab_cursor *pCursor){
 14056    DbdataCursor *pCsr = (DbdataCursor*)pCursor;
 14057    return pCsr->aPage==0;
 14058  }
 14059  
 14060  /*
 14061  ** Return true if nul-terminated string zSchema ends in "()". Or false
 14062  ** otherwise.
 14063  */
 14064  static int dbdataIsFunction(const char *zSchema){
 14065    size_t n = strlen(zSchema);
 14066    if( n>2 && zSchema[n-2]=='(' && zSchema[n-1]==')' ){
 14067      return (int)n-2;
 14068    }
 14069    return 0;
 14070  }
 14071  
 14072  /* 
 14073  ** Determine the size in pages of database zSchema (where zSchema is
 14074  ** "main", "temp" or the name of an attached database) and set 
 14075  ** pCsr->szDb accordingly. If successful, return SQLITE_OK. Otherwise,
 14076  ** an SQLite error code.
 14077  */
 14078  static int dbdataDbsize(DbdataCursor *pCsr, const char *zSchema){
 14079    DbdataTable *pTab = (DbdataTable*)pCsr->base.pVtab;
 14080    char *zSql = 0;
 14081    int rc, rc2;
 14082    int nFunc = 0;
 14083    sqlite3_stmt *pStmt = 0;
 14084  
 14085    if( (nFunc = dbdataIsFunction(zSchema))>0 ){
 14086      zSql = sqlite3_mprintf("SELECT %.*s(0)", nFunc, zSchema);
 14087    }else{
 14088      zSql = sqlite3_mprintf("PRAGMA %Q.page_count", zSchema);
 14089    }
 14090    if( zSql==0 ) return SQLITE_NOMEM;
 14091  
 14092    rc = sqlite3_prepare_v2(pTab->db, zSql, -1, &pStmt, 0);
 14093    sqlite3_free(zSql);
 14094    if( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
 14095      pCsr->szDb = sqlite3_column_int(pStmt, 0);
 14096    }
 14097    rc2 = sqlite3_finalize(pStmt);
 14098    if( rc==SQLITE_OK ) rc = rc2;
 14099    return rc;
 14100  }
 14101  
 14102  /*
 14103  ** Attempt to figure out the encoding of the database by retrieving page 1
 14104  ** and inspecting the header field. If successful, set the pCsr->enc variable
 14105  ** and return SQLITE_OK. Otherwise, return an SQLite error code.
 14106  */
 14107  static int dbdataGetEncoding(DbdataCursor *pCsr){
 14108    int rc = SQLITE_OK;
 14109    int nPg1 = 0;
 14110    u8 *aPg1 = 0;
 14111    rc = dbdataLoadPage(pCsr, 1, &aPg1, &nPg1);
 14112    if( rc==SQLITE_OK && nPg1>=(56+4) ){
 14113      pCsr->enc = get_uint32(&aPg1[56]);
 14114    }
 14115    sqlite3_free(aPg1);
 14116    return rc;
 14117  }
 14118  
 14119  
 14120  /* 
 14121  ** xFilter method for sqlite_dbdata and sqlite_dbptr.
 14122  */
 14123  static int dbdataFilter(
 14124    sqlite3_vtab_cursor *pCursor, 
 14125    int idxNum, const char *idxStr,
 14126    int argc, sqlite3_value **argv
 14127  ){
 14128    DbdataCursor *pCsr = (DbdataCursor*)pCursor;
 14129    DbdataTable *pTab = (DbdataTable*)pCursor->pVtab;
 14130    int rc = SQLITE_OK;
 14131    const char *zSchema = "main";
 14132    (void)idxStr;
 14133    (void)argc;
 14134  
 14135    dbdataResetCursor(pCsr);
 14136    assert( pCsr->iPgno==1 );
 14137    if( idxNum & 0x01 ){
 14138      zSchema = (const char*)sqlite3_value_text(argv[0]);
 14139      if( zSchema==0 ) zSchema = "";
 14140    }
 14141    if( idxNum & 0x02 ){
 14142      pCsr->iPgno = sqlite3_value_int(argv[(idxNum & 0x01)]);
 14143      pCsr->bOnePage = 1;
 14144    }else{
 14145      rc = dbdataDbsize(pCsr, zSchema);
 14146    }
 14147  
 14148    if( rc==SQLITE_OK ){
 14149      int nFunc = 0;
 14150      if( pTab->pStmt ){
 14151        pCsr->pStmt = pTab->pStmt;
 14152        pTab->pStmt = 0;
 14153      }else if( (nFunc = dbdataIsFunction(zSchema))>0 ){
 14154        char *zSql = sqlite3_mprintf("SELECT %.*s(?2)", nFunc, zSchema);
 14155        if( zSql==0 ){
 14156          rc = SQLITE_NOMEM;
 14157        }else{
 14158          rc = sqlite3_prepare_v2(pTab->db, zSql, -1, &pCsr->pStmt, 0);
 14159          sqlite3_free(zSql);
 14160        }
 14161      }else{
 14162        rc = sqlite3_prepare_v2(pTab->db, 
 14163            "SELECT data FROM sqlite_dbpage(?) WHERE pgno=?", -1,
 14164            &pCsr->pStmt, 0
 14165        );
 14166      }
 14167    }
 14168    if( rc==SQLITE_OK ){
 14169      rc = sqlite3_bind_text(pCsr->pStmt, 1, zSchema, -1, SQLITE_TRANSIENT);
 14170    }
 14171  
 14172    /* Try to determine the encoding of the db by inspecting the header
 14173    ** field on page 1. */
 14174    if( rc==SQLITE_OK ){
 14175      rc = dbdataGetEncoding(pCsr);
 14176    }
 14177  
 14178    if( rc!=SQLITE_OK ){
 14179      pTab->base.zErrMsg = sqlite3_mprintf("%s", sqlite3_errmsg(pTab->db));
 14180    }
 14181  
 14182    if( rc==SQLITE_OK ){
 14183      rc = dbdataNext(pCursor);
 14184    }
 14185    return rc;
 14186  }
 14187  
 14188  /*
 14189  ** Return a column for the sqlite_dbdata or sqlite_dbptr table.
 14190  */
 14191  static int dbdataColumn(
 14192    sqlite3_vtab_cursor *pCursor, 
 14193    sqlite3_context *ctx, 
 14194    int i
 14195  ){
 14196    DbdataCursor *pCsr = (DbdataCursor*)pCursor;
 14197    DbdataTable *pTab = (DbdataTable*)pCursor->pVtab;
 14198    if( pTab->bPtr ){
 14199      switch( i ){
 14200        case DBPTR_COLUMN_PGNO:
 14201          sqlite3_result_int64(ctx, pCsr->iPgno);
 14202          break;
 14203        case DBPTR_COLUMN_CHILD: {
 14204          int iOff = pCsr->iPgno==1 ? 100 : 0;
 14205          if( pCsr->iCell<0 ){
 14206            iOff += 8;
 14207          }else{
 14208            iOff += 12 + pCsr->iCell*2;
 14209            if( iOff>pCsr->nPage ) return SQLITE_OK;
 14210            iOff = get_uint16(&pCsr->aPage[iOff]);
 14211          }
 14212          if( iOff<=pCsr->nPage ){
 14213            sqlite3_result_int64(ctx, get_uint32(&pCsr->aPage[iOff]));
 14214          }
 14215          break;
 14216        }
 14217      }
 14218    }else{
 14219      switch( i ){
 14220        case DBDATA_COLUMN_PGNO:
 14221          sqlite3_result_int64(ctx, pCsr->iPgno);
 14222          break;
 14223        case DBDATA_COLUMN_CELL:
 14224          sqlite3_result_int(ctx, pCsr->iCell);
 14225          break;
 14226        case DBDATA_COLUMN_FIELD:
 14227          sqlite3_result_int(ctx, pCsr->iField);
 14228          break;
 14229        case DBDATA_COLUMN_VALUE: {
 14230          if( pCsr->iField<0 ){
 14231            sqlite3_result_int64(ctx, pCsr->iIntkey);
 14232          }else if( &pCsr->pRec[pCsr->nRec] >= pCsr->pPtr ){
 14233            sqlite3_int64 iType;
 14234            dbdataGetVarintU32(pCsr->pHdrPtr, &iType);
 14235            dbdataValue(
 14236                ctx, pCsr->enc, iType, pCsr->pPtr, 
 14237                &pCsr->pRec[pCsr->nRec] - pCsr->pPtr
 14238            );
 14239          }
 14240          break;
 14241        }
 14242      }
 14243    }
 14244    return SQLITE_OK;
 14245  }
 14246  
 14247  /* 
 14248  ** Return the rowid for an sqlite_dbdata or sqlite_dptr table.
 14249  */
 14250  static int dbdataRowid(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){
 14251    DbdataCursor *pCsr = (DbdataCursor*)pCursor;
 14252    *pRowid = pCsr->iRowid;
 14253    return SQLITE_OK;
 14254  }
 14255  
 14256  
 14257  /*
 14258  ** Invoke this routine to register the "sqlite_dbdata" virtual table module
 14259  */
 14260  static int sqlite3DbdataRegister(sqlite3 *db){
 14261    static sqlite3_module dbdata_module = {
 14262      0,                            /* iVersion */
 14263      0,                            /* xCreate */
 14264      dbdataConnect,                /* xConnect */
 14265      dbdataBestIndex,              /* xBestIndex */
 14266      dbdataDisconnect,             /* xDisconnect */
 14267      0,                            /* xDestroy */
 14268      dbdataOpen,                   /* xOpen - open a cursor */
 14269      dbdataClose,                  /* xClose - close a cursor */
 14270      dbdataFilter,                 /* xFilter - configure scan constraints */
 14271      dbdataNext,                   /* xNext - advance a cursor */
 14272      dbdataEof,                    /* xEof - check for end of scan */
 14273      dbdataColumn,                 /* xColumn - read data */
 14274      dbdataRowid,                  /* xRowid - read data */
 14275      0,                            /* xUpdate */
 14276      0,                            /* xBegin */
 14277      0,                            /* xSync */
 14278      0,                            /* xCommit */
 14279      0,                            /* xRollback */
 14280      0,                            /* xFindMethod */
 14281      0,                            /* xRename */
 14282      0,                            /* xSavepoint */
 14283      0,                            /* xRelease */
 14284      0,                            /* xRollbackTo */
 14285      0                             /* xShadowName */
 14286    };
 14287  
 14288    int rc = sqlite3_create_module(db, "sqlite_dbdata", &dbdata_module, 0);
 14289    if( rc==SQLITE_OK ){
 14290      rc = sqlite3_create_module(db, "sqlite_dbptr", &dbdata_module, (void*)1);
 14291    }
 14292    return rc;
 14293  }
 14294  
 14295  int sqlite3_dbdata_init(
 14296    sqlite3 *db, 
 14297    char **pzErrMsg, 
 14298    const sqlite3_api_routines *pApi
 14299  ){
 14300    (void)pzErrMsg;
 14301    return sqlite3DbdataRegister(db);
 14302  }
 14303  
 14304  #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
 14305  
 14306  /************************* End ../ext/recover/dbdata.c ********************/
 14307  /************************* Begin ../ext/recover/sqlite3recover.c ******************/
 14308  /*
 14309  ** 2022-08-27
 14310  **
 14311  ** The author disclaims copyright to this source code.  In place of
 14312  ** a legal notice, here is a blessing:
 14313  **
 14314  **    May you do good and not evil.
 14315  **    May you find forgiveness for yourself and forgive others.
 14316  **    May you share freely, never taking more than you give.
 14317  **
 14318  *************************************************************************
 14319  **
 14320  */
 14321  
 14322  
 14323  /* #include "sqlite3recover.h" */
 14324  #include <assert.h>
 14325  #include <string.h>
 14326  
 14327  #ifndef SQLITE_OMIT_VIRTUALTABLE
 14328  
 14329  /*
 14330  ** Declaration for public API function in file dbdata.c. This may be called
 14331  ** with NULL as the final two arguments to register the sqlite_dbptr and
 14332  ** sqlite_dbdata virtual tables with a database handle.
 14333  */
 14334  #ifdef _WIN32
 14335  
 14336  #endif
 14337  int sqlite3_dbdata_init(sqlite3*, char**, const sqlite3_api_routines*);
 14338  
 14339  /* typedef unsigned int u32; */
 14340  /* typedef unsigned char u8; */
 14341  /* typedef sqlite3_int64 i64; */
 14342  
 14343  typedef struct RecoverTable RecoverTable;
 14344  typedef struct RecoverColumn RecoverColumn;
 14345  
 14346  /*
 14347  ** When recovering rows of data that can be associated with table
 14348  ** definitions recovered from the sqlite_schema table, each table is
 14349  ** represented by an instance of the following object.
 14350  **
 14351  ** iRoot:
 14352  **   The root page in the original database. Not necessarily (and usually
 14353  **   not) the same in the recovered database.
 14354  **
 14355  ** zTab:
 14356  **   Name of the table.
 14357  **
 14358  ** nCol/aCol[]:
 14359  **   aCol[] is an array of nCol columns. In the order in which they appear 
 14360  **   in the table.
 14361  **
 14362  ** bIntkey:
 14363  **   Set to true for intkey tables, false for WITHOUT ROWID.
 14364  **
 14365  ** iRowidBind:
 14366  **   Each column in the aCol[] array has associated with it the index of
 14367  **   the bind parameter its values will be bound to in the INSERT statement
 14368  **   used to construct the output database. If the table does has a rowid
 14369  **   but not an INTEGER PRIMARY KEY column, then iRowidBind contains the
 14370  **   index of the bind paramater to which the rowid value should be bound.
 14371  **   Otherwise, it contains -1. If the table does contain an INTEGER PRIMARY 
 14372  **   KEY column, then the rowid value should be bound to the index associated
 14373  **   with the column.
 14374  **
 14375  ** pNext:
 14376  **   All RecoverTable objects used by the recovery operation are allocated
 14377  **   and populated as part of creating the recovered database schema in
 14378  **   the output database, before any non-schema data are recovered. They
 14379  **   are then stored in a singly-linked list linked by this variable beginning
 14380  **   at sqlite3_recover.pTblList.
 14381  */
 14382  struct RecoverTable {
 14383    u32 iRoot;                      /* Root page in original database */
 14384    char *zTab;                     /* Name of table */
 14385    int nCol;                       /* Number of columns in table */
 14386    RecoverColumn *aCol;            /* Array of columns */
 14387    int bIntkey;                    /* True for intkey, false for without rowid */
 14388    int iRowidBind;                 /* If >0, bind rowid to INSERT here */
 14389    RecoverTable *pNext;
 14390  };
 14391  
 14392  /*
 14393  ** Each database column is represented by an instance of the following object
 14394  ** stored in the RecoverTable.aCol[] array of the associated table.
 14395  **
 14396  ** iField:
 14397  **   The index of the associated field within database records. Or -1 if
 14398  **   there is no associated field (e.g. for virtual generated columns).
 14399  **
 14400  ** iBind:
 14401  **   The bind index of the INSERT statement to bind this columns values
 14402  **   to. Or 0 if there is no such index (iff (iField<0)).
 14403  **
 14404  ** bIPK:
 14405  **   True if this is the INTEGER PRIMARY KEY column.
 14406  **
 14407  ** zCol:
 14408  **   Name of column.
 14409  **
 14410  ** eHidden:
 14411  **   A RECOVER_EHIDDEN_* constant value (see below for interpretation of each).
 14412  */
 14413  struct RecoverColumn {
 14414    int iField;                     /* Field in record on disk */
 14415    int iBind;                      /* Binding to use in INSERT */
 14416    int bIPK;                       /* True for IPK column */
 14417    char *zCol;
 14418    int eHidden;
 14419  };
 14420  
 14421  #define RECOVER_EHIDDEN_NONE    0      /* Normal database column */
 14422  #define RECOVER_EHIDDEN_HIDDEN  1      /* Column is __HIDDEN__ */
 14423  #define RECOVER_EHIDDEN_VIRTUAL 2      /* Virtual generated column */
 14424  #define RECOVER_EHIDDEN_STORED  3      /* Stored generated column */
 14425  
 14426  /*
 14427  ** Bitmap object used to track pages in the input database. Allocated
 14428  ** and manipulated only by the following functions:
 14429  **
 14430  **     recoverBitmapAlloc()
 14431  **     recoverBitmapFree()
 14432  **     recoverBitmapSet()
 14433  **     recoverBitmapQuery()
 14434  **
 14435  ** nPg:
 14436  **   Largest page number that may be stored in the bitmap. The range
 14437  **   of valid keys is 1 to nPg, inclusive.
 14438  **
 14439  ** aElem[]:
 14440  **   Array large enough to contain a bit for each key. For key value
 14441  **   iKey, the associated bit is the bit (iKey%32) of aElem[iKey/32].
 14442  **   In other words, the following is true if bit iKey is set, or 
 14443  **   false if it is clear:
 14444  **
 14445  **       (aElem[iKey/32] & (1 << (iKey%32))) ? 1 : 0
 14446  */
 14447  typedef struct RecoverBitmap RecoverBitmap;
 14448  struct RecoverBitmap {
 14449    i64 nPg;                        /* Size of bitmap */
 14450    u32 aElem[1];                   /* Array of 32-bit bitmasks */
 14451  };
 14452  
 14453  /*
 14454  ** State variables (part of the sqlite3_recover structure) used while
 14455  ** recovering data for tables identified in the recovered schema (state
 14456  ** RECOVER_STATE_WRITING).
 14457  */
 14458  typedef struct RecoverStateW1 RecoverStateW1;
 14459  struct RecoverStateW1 {
 14460    sqlite3_stmt *pTbls;
 14461    sqlite3_stmt *pSel;
 14462    sqlite3_stmt *pInsert;
 14463    int nInsert;
 14464  
 14465    RecoverTable *pTab;             /* Table currently being written */
 14466    int nMax;                       /* Max column count in any schema table */
 14467    sqlite3_value **apVal;          /* Array of nMax values */
 14468    int nVal;                       /* Number of valid entries in apVal[] */
 14469    int bHaveRowid;
 14470    i64 iRowid;
 14471    i64 iPrevPage;
 14472    int iPrevCell;
 14473  };
 14474  
 14475  /*
 14476  ** State variables (part of the sqlite3_recover structure) used while
 14477  ** recovering data destined for the lost and found table (states
 14478  ** RECOVER_STATE_LOSTANDFOUND[123]).
 14479  */
 14480  typedef struct RecoverStateLAF RecoverStateLAF;
 14481  struct RecoverStateLAF {
 14482    RecoverBitmap *pUsed;
 14483    i64 nPg;                        /* Size of db in pages */
 14484    sqlite3_stmt *pAllAndParent;
 14485    sqlite3_stmt *pMapInsert;
 14486    sqlite3_stmt *pMaxField;
 14487    sqlite3_stmt *pUsedPages;
 14488    sqlite3_stmt *pFindRoot;
 14489    sqlite3_stmt *pInsert;          /* INSERT INTO lost_and_found ... */
 14490    sqlite3_stmt *pAllPage;
 14491    sqlite3_stmt *pPageData;
 14492    sqlite3_value **apVal;
 14493    int nMaxField;
 14494  };
 14495  
 14496  /*
 14497  ** Main recover handle structure.
 14498  */
 14499  struct sqlite3_recover {
 14500    /* Copies of sqlite3_recover_init[_sql]() parameters */
 14501    sqlite3 *dbIn;                  /* Input database */
 14502    char *zDb;                      /* Name of input db ("main" etc.) */
 14503    char *zUri;                     /* URI for output database */
 14504    void *pSqlCtx;                  /* SQL callback context */
 14505    int (*xSql)(void*,const char*); /* Pointer to SQL callback function */
 14506  
 14507    /* Values configured by sqlite3_recover_config() */
 14508    char *zStateDb;                 /* State database to use (or NULL) */
 14509    char *zLostAndFound;            /* Name of lost-and-found table (or NULL) */
 14510    int bFreelistCorrupt;           /* SQLITE_RECOVER_FREELIST_CORRUPT setting */
 14511    int bRecoverRowid;              /* SQLITE_RECOVER_ROWIDS setting */
 14512    int bSlowIndexes;               /* SQLITE_RECOVER_SLOWINDEXES setting */
 14513  
 14514    int pgsz;
 14515    int detected_pgsz;
 14516    int nReserve;
 14517    u8 *pPage1Disk;
 14518    u8 *pPage1Cache;
 14519  
 14520    /* Error code and error message */
 14521    int errCode;                    /* For sqlite3_recover_errcode() */
 14522    char *zErrMsg;                  /* For sqlite3_recover_errmsg() */
 14523  
 14524    int eState;
 14525    int bCloseTransaction;
 14526  
 14527    /* Variables used with eState==RECOVER_STATE_WRITING */
 14528    RecoverStateW1 w1;
 14529  
 14530    /* Variables used with states RECOVER_STATE_LOSTANDFOUND[123] */
 14531    RecoverStateLAF laf;
 14532  
 14533    /* Fields used within sqlite3_recover_run() */
 14534    sqlite3 *dbOut;                 /* Output database */
 14535    sqlite3_stmt *pGetPage;         /* SELECT against input db sqlite_dbdata */
 14536    RecoverTable *pTblList;         /* List of tables recovered from schema */
 14537  };
 14538  
 14539  /*
 14540  ** The various states in which an sqlite3_recover object may exist:
 14541  **
 14542  **   RECOVER_STATE_INIT:
 14543  **    The object is initially created in this state. sqlite3_recover_step()
 14544  **    has yet to be called. This is the only state in which it is permitted
 14545  **    to call sqlite3_recover_config().
 14546  **
 14547  **   RECOVER_STATE_WRITING:
 14548  **
 14549  **   RECOVER_STATE_LOSTANDFOUND1:
 14550  **    State to populate the bitmap of pages used by other tables or the
 14551  **    database freelist.
 14552  **
 14553  **   RECOVER_STATE_LOSTANDFOUND2:
 14554  **    Populate the recovery.map table - used to figure out a "root" page
 14555  **    for each lost page from in the database from which records are
 14556  **    extracted.
 14557  **
 14558  **   RECOVER_STATE_LOSTANDFOUND3:
 14559  **    Populate the lost-and-found table itself.
 14560  */
 14561  #define RECOVER_STATE_INIT           0
 14562  #define RECOVER_STATE_WRITING        1
 14563  #define RECOVER_STATE_LOSTANDFOUND1  2
 14564  #define RECOVER_STATE_LOSTANDFOUND2  3
 14565  #define RECOVER_STATE_LOSTANDFOUND3  4
 14566  #define RECOVER_STATE_SCHEMA2        5
 14567  #define RECOVER_STATE_DONE           6
 14568  
 14569  
 14570  /*
 14571  ** Global variables used by this extension.
 14572  */
 14573  typedef struct RecoverGlobal RecoverGlobal;
 14574  struct RecoverGlobal {
 14575    const sqlite3_io_methods *pMethods;
 14576    sqlite3_recover *p;
 14577  };
 14578  static RecoverGlobal recover_g;
 14579  
 14580  /*
 14581  ** Use this static SQLite mutex to protect the globals during the
 14582  ** first call to sqlite3_recover_step().
 14583  */ 
 14584  #define RECOVER_MUTEX_ID SQLITE_MUTEX_STATIC_APP2
 14585  
 14586  
 14587  /* 
 14588  ** Default value for SQLITE_RECOVER_ROWIDS (sqlite3_recover.bRecoverRowid).
 14589  */
 14590  #define RECOVER_ROWID_DEFAULT 1
 14591  
 14592  /*
 14593  ** Mutex handling:
 14594  **
 14595  **    recoverEnterMutex()       -   Enter the recovery mutex
 14596  **    recoverLeaveMutex()       -   Leave the recovery mutex
 14597  **    recoverAssertMutexHeld()  -   Assert that the recovery mutex is held
 14598  */
 14599  #if defined(SQLITE_THREADSAFE) && SQLITE_THREADSAFE==0
 14600  # define recoverEnterMutex()
 14601  # define recoverLeaveMutex()
 14602  #else
 14603  static void recoverEnterMutex(void){
 14604    sqlite3_mutex_enter(sqlite3_mutex_alloc(RECOVER_MUTEX_ID));
 14605  }
 14606  static void recoverLeaveMutex(void){
 14607    sqlite3_mutex_leave(sqlite3_mutex_alloc(RECOVER_MUTEX_ID));
 14608  }
 14609  #endif
 14610  #if SQLITE_THREADSAFE+0>=1 && defined(SQLITE_DEBUG)
 14611  static void recoverAssertMutexHeld(void){
 14612    assert( sqlite3_mutex_held(sqlite3_mutex_alloc(RECOVER_MUTEX_ID)) );
 14613  }
 14614  #else
 14615  # define recoverAssertMutexHeld()
 14616  #endif
 14617  
 14618  
 14619  /*
 14620  ** Like strlen(). But handles NULL pointer arguments.
 14621  */
 14622  static int recoverStrlen(const char *zStr){
 14623    if( zStr==0 ) return 0;
 14624    return (int)(strlen(zStr)&0x7fffffff);
 14625  }
 14626  
 14627  /*
 14628  ** This function is a no-op if the recover handle passed as the first 
 14629  ** argument already contains an error (if p->errCode!=SQLITE_OK). 
 14630  **
 14631  ** Otherwise, an attempt is made to allocate, zero and return a buffer nByte
 14632  ** bytes in size. If successful, a pointer to the new buffer is returned. Or,
 14633  ** if an OOM error occurs, NULL is returned and the handle error code
 14634  ** (p->errCode) set to SQLITE_NOMEM.
 14635  */
 14636  static void *recoverMalloc(sqlite3_recover *p, i64 nByte){
 14637    void *pRet = 0;
 14638    assert( nByte>0 );
 14639    if( p->errCode==SQLITE_OK ){
 14640      pRet = sqlite3_malloc64(nByte);
 14641      if( pRet ){
 14642        memset(pRet, 0, nByte);
 14643      }else{
 14644        p->errCode = SQLITE_NOMEM;
 14645      }
 14646    }
 14647    return pRet;
 14648  }
 14649  
 14650  /*
 14651  ** Set the error code and error message for the recover handle passed as
 14652  ** the first argument. The error code is set to the value of parameter
 14653  ** errCode.
 14654  **
 14655  ** Parameter zFmt must be a printf() style formatting string. The handle 
 14656  ** error message is set to the result of using any trailing arguments for 
 14657  ** parameter substitutions in the formatting string.
 14658  **
 14659  ** For example:
 14660  **
 14661  **   recoverError(p, SQLITE_ERROR, "no such table: %s", zTablename);
 14662  */
 14663  static int recoverError(
 14664    sqlite3_recover *p, 
 14665    int errCode, 
 14666    const char *zFmt, ...
 14667  ){
 14668    char *z = 0;
 14669    va_list ap;
 14670    va_start(ap, zFmt);
 14671    if( zFmt ){
 14672      z = sqlite3_vmprintf(zFmt, ap);
 14673      va_end(ap);
 14674    }
 14675    sqlite3_free(p->zErrMsg);
 14676    p->zErrMsg = z;
 14677    p->errCode = errCode;
 14678    return errCode;
 14679  }
 14680  
 14681  
 14682  /*
 14683  ** This function is a no-op if p->errCode is initially other than SQLITE_OK.
 14684  ** In this case it returns NULL.
 14685  **
 14686  ** Otherwise, an attempt is made to allocate and return a bitmap object
 14687  ** large enough to store a bit for all page numbers between 1 and nPg,
 14688  ** inclusive. The bitmap is initially zeroed.
 14689  */
 14690  static RecoverBitmap *recoverBitmapAlloc(sqlite3_recover *p, i64 nPg){
 14691    int nElem = (nPg+1+31) / 32;
 14692    int nByte = sizeof(RecoverBitmap) + nElem*sizeof(u32);
 14693    RecoverBitmap *pRet = (RecoverBitmap*)recoverMalloc(p, nByte);
 14694  
 14695    if( pRet ){
 14696      pRet->nPg = nPg;
 14697    }
 14698    return pRet;
 14699  }
 14700  
 14701  /*
 14702  ** Free a bitmap object allocated by recoverBitmapAlloc().
 14703  */
 14704  static void recoverBitmapFree(RecoverBitmap *pMap){
 14705    sqlite3_free(pMap);
 14706  }
 14707  
 14708  /*
 14709  ** Set the bit associated with page iPg in bitvec pMap.
 14710  */
 14711  static void recoverBitmapSet(RecoverBitmap *pMap, i64 iPg){
 14712    if( iPg<=pMap->nPg ){
 14713      int iElem = (iPg / 32);
 14714      int iBit = (iPg % 32);
 14715      pMap->aElem[iElem] |= (((u32)1) << iBit);
 14716    }
 14717  }
 14718  
 14719  /*
 14720  ** Query bitmap object pMap for the state of the bit associated with page
 14721  ** iPg. Return 1 if it is set, or 0 otherwise.
 14722  */
 14723  static int recoverBitmapQuery(RecoverBitmap *pMap, i64 iPg){
 14724    int ret = 1;
 14725    if( iPg<=pMap->nPg && iPg>0 ){
 14726      int iElem = (iPg / 32);
 14727      int iBit = (iPg % 32);
 14728      ret = (pMap->aElem[iElem] & (((u32)1) << iBit)) ? 1 : 0;
 14729    }
 14730    return ret;
 14731  }
 14732  
 14733  /*
 14734  ** Set the recover handle error to the error code and message returned by
 14735  ** calling sqlite3_errcode() and sqlite3_errmsg(), respectively, on database
 14736  ** handle db.
 14737  */
 14738  static int recoverDbError(sqlite3_recover *p, sqlite3 *db){
 14739    return recoverError(p, sqlite3_errcode(db), "%s", sqlite3_errmsg(db));
 14740  }
 14741  
 14742  /*
 14743  ** This function is a no-op if recover handle p already contains an error
 14744  ** (if p->errCode!=SQLITE_OK). 
 14745  **
 14746  ** Otherwise, it attempts to prepare the SQL statement in zSql against
 14747  ** database handle db. If successful, the statement handle is returned.
 14748  ** Or, if an error occurs, NULL is returned and an error left in the
 14749  ** recover handle.
 14750  */
 14751  static sqlite3_stmt *recoverPrepare(
 14752    sqlite3_recover *p,
 14753    sqlite3 *db, 
 14754    const char *zSql
 14755  ){
 14756    sqlite3_stmt *pStmt = 0;
 14757    if( p->errCode==SQLITE_OK ){
 14758      if( sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0) ){
 14759        recoverDbError(p, db);
 14760      }
 14761    }
 14762    return pStmt;
 14763  }
 14764  
 14765  /*
 14766  ** This function is a no-op if recover handle p already contains an error
 14767  ** (if p->errCode!=SQLITE_OK). 
 14768  **
 14769  ** Otherwise, argument zFmt is used as a printf() style format string,
 14770  ** along with any trailing arguments, to create an SQL statement. This
 14771  ** SQL statement is prepared against database handle db and, if successful,
 14772  ** the statment handle returned. Or, if an error occurs - either during
 14773  ** the printf() formatting or when preparing the resulting SQL - an
 14774  ** error code and message are left in the recover handle.
 14775  */
 14776  static sqlite3_stmt *recoverPreparePrintf(
 14777    sqlite3_recover *p,
 14778    sqlite3 *db, 
 14779    const char *zFmt, ...
 14780  ){
 14781    sqlite3_stmt *pStmt = 0;
 14782    if( p->errCode==SQLITE_OK ){
 14783      va_list ap;
 14784      char *z;
 14785      va_start(ap, zFmt);
 14786      z = sqlite3_vmprintf(zFmt, ap);
 14787      va_end(ap);
 14788      if( z==0 ){
 14789        p->errCode = SQLITE_NOMEM;
 14790      }else{
 14791        pStmt = recoverPrepare(p, db, z);
 14792        sqlite3_free(z);
 14793      }
 14794    }
 14795    return pStmt;
 14796  }
 14797  
 14798  /*
 14799  ** Reset SQLite statement handle pStmt. If the call to sqlite3_reset() 
 14800  ** indicates that an error occurred, and there is not already an error
 14801  ** in the recover handle passed as the first argument, set the error
 14802  ** code and error message appropriately.
 14803  **
 14804  ** This function returns a copy of the statement handle pointer passed
 14805  ** as the second argument.
 14806  */
 14807  static sqlite3_stmt *recoverReset(sqlite3_recover *p, sqlite3_stmt *pStmt){
 14808    int rc = sqlite3_reset(pStmt);
 14809    if( rc!=SQLITE_OK && rc!=SQLITE_CONSTRAINT && p->errCode==SQLITE_OK ){
 14810      recoverDbError(p, sqlite3_db_handle(pStmt));
 14811    }
 14812    return pStmt;
 14813  }
 14814  
 14815  /*
 14816  ** Finalize SQLite statement handle pStmt. If the call to sqlite3_reset() 
 14817  ** indicates that an error occurred, and there is not already an error
 14818  ** in the recover handle passed as the first argument, set the error
 14819  ** code and error message appropriately.
 14820  */
 14821  static void recoverFinalize(sqlite3_recover *p, sqlite3_stmt *pStmt){
 14822    sqlite3 *db = sqlite3_db_handle(pStmt);
 14823    int rc = sqlite3_finalize(pStmt);
 14824    if( rc!=SQLITE_OK && p->errCode==SQLITE_OK ){
 14825      recoverDbError(p, db);
 14826    }
 14827  }
 14828  
 14829  /*
 14830  ** This function is a no-op if recover handle p already contains an error
 14831  ** (if p->errCode!=SQLITE_OK). A copy of p->errCode is returned in this 
 14832  ** case.
 14833  **
 14834  ** Otherwise, execute SQL script zSql. If successful, return SQLITE_OK.
 14835  ** Or, if an error occurs, leave an error code and message in the recover
 14836  ** handle and return a copy of the error code.
 14837  */
 14838  static int recoverExec(sqlite3_recover *p, sqlite3 *db, const char *zSql){
 14839    if( p->errCode==SQLITE_OK ){
 14840      int rc = sqlite3_exec(db, zSql, 0, 0, 0);
 14841      if( rc ){
 14842        recoverDbError(p, db);
 14843      }
 14844    }
 14845    return p->errCode;
 14846  }
 14847  
 14848  /*
 14849  ** Bind the value pVal to parameter iBind of statement pStmt. Leave an
 14850  ** error in the recover handle passed as the first argument if an error
 14851  ** (e.g. an OOM) occurs.
 14852  */
 14853  static void recoverBindValue(
 14854    sqlite3_recover *p, 
 14855    sqlite3_stmt *pStmt, 
 14856    int iBind, 
 14857    sqlite3_value *pVal
 14858  ){
 14859    if( p->errCode==SQLITE_OK ){
 14860      int rc = sqlite3_bind_value(pStmt, iBind, pVal);
 14861      if( rc ) recoverError(p, rc, 0);
 14862    }
 14863  }
 14864  
 14865  /*
 14866  ** This function is a no-op if recover handle p already contains an error
 14867  ** (if p->errCode!=SQLITE_OK). NULL is returned in this case.
 14868  **
 14869  ** Otherwise, an attempt is made to interpret zFmt as a printf() style
 14870  ** formatting string and the result of using the trailing arguments for
 14871  ** parameter substitution with it written into a buffer obtained from
 14872  ** sqlite3_malloc(). If successful, a pointer to the buffer is returned.
 14873  ** It is the responsibility of the caller to eventually free the buffer
 14874  ** using sqlite3_free().
 14875  **
 14876  ** Or, if an error occurs, an error code and message is left in the recover
 14877  ** handle and NULL returned.
 14878  */
 14879  static char *recoverMPrintf(sqlite3_recover *p, const char *zFmt, ...){
 14880    va_list ap;
 14881    char *z;
 14882    va_start(ap, zFmt);
 14883    z = sqlite3_vmprintf(zFmt, ap);
 14884    va_end(ap);
 14885    if( p->errCode==SQLITE_OK ){
 14886      if( z==0 ) p->errCode = SQLITE_NOMEM;
 14887    }else{
 14888      sqlite3_free(z);
 14889      z = 0;
 14890    }
 14891    return z;
 14892  }
 14893  
 14894  /*
 14895  ** This function is a no-op if recover handle p already contains an error
 14896  ** (if p->errCode!=SQLITE_OK). Zero is returned in this case.
 14897  **
 14898  ** Otherwise, execute "PRAGMA page_count" against the input database. If
 14899  ** successful, return the integer result. Or, if an error occurs, leave an
 14900  ** error code and error message in the sqlite3_recover handle and return
 14901  ** zero.
 14902  */
 14903  static i64 recoverPageCount(sqlite3_recover *p){
 14904    i64 nPg = 0;
 14905    if( p->errCode==SQLITE_OK ){
 14906      sqlite3_stmt *pStmt = 0;
 14907      pStmt = recoverPreparePrintf(p, p->dbIn, "PRAGMA %Q.page_count", p->zDb);
 14908      if( pStmt ){
 14909        sqlite3_step(pStmt);
 14910        nPg = sqlite3_column_int64(pStmt, 0);
 14911      }
 14912      recoverFinalize(p, pStmt);
 14913    }
 14914    return nPg;
 14915  }
 14916  
 14917  /*
 14918  ** Implementation of SQL scalar function "read_i32". The first argument to 
 14919  ** this function must be a blob. The second a non-negative integer. This 
 14920  ** function reads and returns a 32-bit big-endian integer from byte
 14921  ** offset (4*<arg2>) of the blob.
 14922  **
 14923  **     SELECT read_i32(<blob>, <idx>)
 14924  */
 14925  static void recoverReadI32(
 14926    sqlite3_context *context, 
 14927    int argc, 
 14928    sqlite3_value **argv
 14929  ){
 14930    const unsigned char *pBlob;
 14931    int nBlob;
 14932    int iInt;
 14933  
 14934    assert( argc==2 );
 14935    nBlob = sqlite3_value_bytes(argv[0]);
 14936    pBlob = (const unsigned char*)sqlite3_value_blob(argv[0]);
 14937    iInt = sqlite3_value_int(argv[1]) & 0xFFFF;
 14938  
 14939    if( (iInt+1)*4<=nBlob ){
 14940      const unsigned char *a = &pBlob[iInt*4];
 14941      i64 iVal = ((i64)a[0]<<24)
 14942               + ((i64)a[1]<<16)
 14943               + ((i64)a[2]<< 8)
 14944               + ((i64)a[3]<< 0);
 14945      sqlite3_result_int64(context, iVal);
 14946    }
 14947  }
 14948  
 14949  /*
 14950  ** Implementation of SQL scalar function "page_is_used". This function
 14951  ** is used as part of the procedure for locating orphan rows for the
 14952  ** lost-and-found table, and it depends on those routines having populated
 14953  ** the sqlite3_recover.laf.pUsed variable.
 14954  **
 14955  ** The only argument to this function is a page-number. It returns true 
 14956  ** if the page has already been used somehow during data recovery, or false
 14957  ** otherwise.
 14958  **
 14959  **     SELECT page_is_used(<pgno>);
 14960  */
 14961  static void recoverPageIsUsed(
 14962    sqlite3_context *pCtx,
 14963    int nArg,
 14964    sqlite3_value **apArg
 14965  ){
 14966    sqlite3_recover *p = (sqlite3_recover*)sqlite3_user_data(pCtx);
 14967    i64 pgno = sqlite3_value_int64(apArg[0]);
 14968    assert( nArg==1 );
 14969    sqlite3_result_int(pCtx, recoverBitmapQuery(p->laf.pUsed, pgno));
 14970  }
 14971  
 14972  /*
 14973  ** The implementation of a user-defined SQL function invoked by the 
 14974  ** sqlite_dbdata and sqlite_dbptr virtual table modules to access pages
 14975  ** of the database being recovered.
 14976  **
 14977  ** This function always takes a single integer argument. If the argument
 14978  ** is zero, then the value returned is the number of pages in the db being
 14979  ** recovered. If the argument is greater than zero, it is a page number. 
 14980  ** The value returned in this case is an SQL blob containing the data for 
 14981  ** the identified page of the db being recovered. e.g.
 14982  **
 14983  **     SELECT getpage(0);       -- return number of pages in db
 14984  **     SELECT getpage(4);       -- return page 4 of db as a blob of data 
 14985  */
 14986  static void recoverGetPage(
 14987    sqlite3_context *pCtx,
 14988    int nArg,
 14989    sqlite3_value **apArg
 14990  ){
 14991    sqlite3_recover *p = (sqlite3_recover*)sqlite3_user_data(pCtx);
 14992    i64 pgno = sqlite3_value_int64(apArg[0]);
 14993    sqlite3_stmt *pStmt = 0;
 14994  
 14995    assert( nArg==1 );
 14996    if( pgno==0 ){
 14997      i64 nPg = recoverPageCount(p);
 14998      sqlite3_result_int64(pCtx, nPg);
 14999      return;
 15000    }else{
 15001      if( p->pGetPage==0 ){
 15002        pStmt = p->pGetPage = recoverPreparePrintf(
 15003            p, p->dbIn, "SELECT data FROM sqlite_dbpage(%Q) WHERE pgno=?", p->zDb
 15004        );
 15005      }else if( p->errCode==SQLITE_OK ){
 15006        pStmt = p->pGetPage;
 15007      }
 15008  
 15009      if( pStmt ){
 15010        sqlite3_bind_int64(pStmt, 1, pgno);
 15011        if( SQLITE_ROW==sqlite3_step(pStmt) ){
 15012          const u8 *aPg;
 15013          int nPg;
 15014          assert( p->errCode==SQLITE_OK );
 15015          aPg = sqlite3_column_blob(pStmt, 0);
 15016          nPg = sqlite3_column_bytes(pStmt, 0);
 15017          if( pgno==1 && nPg==p->pgsz && 0==memcmp(p->pPage1Cache, aPg, nPg) ){
 15018            aPg = p->pPage1Disk;
 15019          }
 15020          sqlite3_result_blob(pCtx, aPg, nPg-p->nReserve, SQLITE_TRANSIENT);
 15021        }
 15022        recoverReset(p, pStmt);
 15023      }
 15024    }
 15025  
 15026    if( p->errCode ){
 15027      if( p->zErrMsg ) sqlite3_result_error(pCtx, p->zErrMsg, -1);
 15028      sqlite3_result_error_code(pCtx, p->errCode);
 15029    }
 15030  }
 15031  
 15032  /*
 15033  ** Find a string that is not found anywhere in z[].  Return a pointer
 15034  ** to that string.
 15035  **
 15036  ** Try to use zA and zB first.  If both of those are already found in z[]
 15037  ** then make up some string and store it in the buffer zBuf.
 15038  */
 15039  static const char *recoverUnusedString(
 15040    const char *z,                    /* Result must not appear anywhere in z */
 15041    const char *zA, const char *zB,   /* Try these first */
 15042    char *zBuf                        /* Space to store a generated string */
 15043  ){
 15044    unsigned i = 0;
 15045    if( strstr(z, zA)==0 ) return zA;
 15046    if( strstr(z, zB)==0 ) return zB;
 15047    do{
 15048      sqlite3_snprintf(20,zBuf,"(%s%u)", zA, i++);
 15049    }while( strstr(z,zBuf)!=0 );
 15050    return zBuf;
 15051  }
 15052  
 15053  /*
 15054  ** Implementation of scalar SQL function "escape_crnl".  The argument passed to
 15055  ** this function is the output of built-in function quote(). If the first
 15056  ** character of the input is "'", indicating that the value passed to quote()
 15057  ** was a text value, then this function searches the input for "\n" and "\r"
 15058  ** characters and adds a wrapper similar to the following:
 15059  **
 15060  **   replace(replace(<input>, '\n', char(10), '\r', char(13));
 15061  **
 15062  ** Or, if the first character of the input is not "'", then a copy of the input
 15063  ** is returned.
 15064  */
 15065  static void recoverEscapeCrnl(
 15066    sqlite3_context *context, 
 15067    int argc, 
 15068    sqlite3_value **argv
 15069  ){
 15070    const char *zText = (const char*)sqlite3_value_text(argv[0]);
 15071    (void)argc;
 15072    if( zText && zText[0]=='\'' ){
 15073      int nText = sqlite3_value_bytes(argv[0]);
 15074      int i;
 15075      char zBuf1[20];
 15076      char zBuf2[20];
 15077      const char *zNL = 0;
 15078      const char *zCR = 0;
 15079      int nCR = 0;
 15080      int nNL = 0;
 15081  
 15082      for(i=0; zText[i]; i++){
 15083        if( zNL==0 && zText[i]=='\n' ){
 15084          zNL = recoverUnusedString(zText, "\\n", "\\012", zBuf1);
 15085          nNL = (int)strlen(zNL);
 15086        }
 15087        if( zCR==0 && zText[i]=='\r' ){
 15088          zCR = recoverUnusedString(zText, "\\r", "\\015", zBuf2);
 15089          nCR = (int)strlen(zCR);
 15090        }
 15091      }
 15092  
 15093      if( zNL || zCR ){
 15094        int iOut = 0;
 15095        i64 nMax = (nNL > nCR) ? nNL : nCR;
 15096        i64 nAlloc = nMax * nText + (nMax+64)*2;
 15097        char *zOut = (char*)sqlite3_malloc64(nAlloc);
 15098        if( zOut==0 ){
 15099          sqlite3_result_error_nomem(context);
 15100          return;
 15101        }
 15102  
 15103        if( zNL && zCR ){
 15104          memcpy(&zOut[iOut], "replace(replace(", 16);
 15105          iOut += 16;
 15106        }else{
 15107          memcpy(&zOut[iOut], "replace(", 8);
 15108          iOut += 8;
 15109        }
 15110        for(i=0; zText[i]; i++){
 15111          if( zText[i]=='\n' ){
 15112            memcpy(&zOut[iOut], zNL, nNL);
 15113            iOut += nNL;
 15114          }else if( zText[i]=='\r' ){
 15115            memcpy(&zOut[iOut], zCR, nCR);
 15116            iOut += nCR;
 15117          }else{
 15118            zOut[iOut] = zText[i];
 15119            iOut++;
 15120          }
 15121        }
 15122  
 15123        if( zNL ){
 15124          memcpy(&zOut[iOut], ",'", 2); iOut += 2;
 15125          memcpy(&zOut[iOut], zNL, nNL); iOut += nNL;
 15126          memcpy(&zOut[iOut], "', char(10))", 12); iOut += 12;
 15127        }
 15128        if( zCR ){
 15129          memcpy(&zOut[iOut], ",'", 2); iOut += 2;
 15130          memcpy(&zOut[iOut], zCR, nCR); iOut += nCR;
 15131          memcpy(&zOut[iOut], "', char(13))", 12); iOut += 12;
 15132        }
 15133  
 15134        sqlite3_result_text(context, zOut, iOut, SQLITE_TRANSIENT);
 15135        sqlite3_free(zOut);
 15136        return;
 15137      }
 15138    }
 15139  
 15140    sqlite3_result_value(context, argv[0]);
 15141  }
 15142  
 15143  /*
 15144  ** This function is a no-op if recover handle p already contains an error
 15145  ** (if p->errCode!=SQLITE_OK). A copy of the error code is returned in
 15146  ** this case. 
 15147  **
 15148  ** Otherwise, attempt to populate temporary table "recovery.schema" with the
 15149  ** parts of the database schema that can be extracted from the input database.
 15150  **
 15151  ** If no error occurs, SQLITE_OK is returned. Otherwise, an error code
 15152  ** and error message are left in the recover handle and a copy of the
 15153  ** error code returned. It is not considered an error if part of all of
 15154  ** the database schema cannot be recovered due to corruption.
 15155  */
 15156  static int recoverCacheSchema(sqlite3_recover *p){
 15157    return recoverExec(p, p->dbOut,
 15158      "WITH RECURSIVE pages(p) AS ("
 15159      "  SELECT 1"
 15160      "    UNION"
 15161      "  SELECT child FROM sqlite_dbptr('getpage()'), pages WHERE pgno=p"
 15162      ")"
 15163      "INSERT INTO recovery.schema SELECT"
 15164      "  max(CASE WHEN field=0 THEN value ELSE NULL END),"
 15165      "  max(CASE WHEN field=1 THEN value ELSE NULL END),"
 15166      "  max(CASE WHEN field=2 THEN value ELSE NULL END),"
 15167      "  max(CASE WHEN field=3 THEN value ELSE NULL END),"
 15168      "  max(CASE WHEN field=4 THEN value ELSE NULL END)"
 15169      "FROM sqlite_dbdata('getpage()') WHERE pgno IN ("
 15170      "  SELECT p FROM pages"
 15171      ") GROUP BY pgno, cell"
 15172    );
 15173  }
 15174  
 15175  /*
 15176  ** If this recover handle is not in SQL callback mode (i.e. was not created 
 15177  ** using sqlite3_recover_init_sql()) of if an error has already occurred, 
 15178  ** this function is a no-op. Otherwise, issue a callback with SQL statement
 15179  ** zSql as the parameter. 
 15180  **
 15181  ** If the callback returns non-zero, set the recover handle error code to
 15182  ** the value returned (so that the caller will abandon processing).
 15183  */
 15184  static void recoverSqlCallback(sqlite3_recover *p, const char *zSql){
 15185    if( p->errCode==SQLITE_OK && p->xSql ){
 15186      int res = p->xSql(p->pSqlCtx, zSql);
 15187      if( res ){
 15188        recoverError(p, SQLITE_ERROR, "callback returned an error - %d", res);
 15189      }
 15190    }
 15191  }
 15192  
 15193  /*
 15194  ** Transfer the following settings from the input database to the output
 15195  ** database:
 15196  **
 15197  **   + page-size,
 15198  **   + auto-vacuum settings,
 15199  **   + database encoding,
 15200  **   + user-version (PRAGMA user_version), and
 15201  **   + application-id (PRAGMA application_id), and
 15202  */
 15203  static void recoverTransferSettings(sqlite3_recover *p){
 15204    const char *aPragma[] = {
 15205      "encoding",
 15206      "page_size",
 15207      "auto_vacuum",
 15208      "user_version",
 15209      "application_id"
 15210    };
 15211    int ii;
 15212  
 15213    /* Truncate the output database to 0 pages in size. This is done by 
 15214    ** opening a new, empty, temp db, then using the backup API to clobber 
 15215    ** any existing output db with a copy of it. */
 15216    if( p->errCode==SQLITE_OK ){
 15217      sqlite3 *db2 = 0;
 15218      int rc = sqlite3_open("", &db2);
 15219      if( rc!=SQLITE_OK ){
 15220        recoverDbError(p, db2);
 15221        return;
 15222      }
 15223  
 15224      for(ii=0; ii<(int)(sizeof(aPragma)/sizeof(aPragma[0])); ii++){
 15225        const char *zPrag = aPragma[ii];
 15226        sqlite3_stmt *p1 = 0;
 15227        p1 = recoverPreparePrintf(p, p->dbIn, "PRAGMA %Q.%s", p->zDb, zPrag);
 15228        if( p->errCode==SQLITE_OK && sqlite3_step(p1)==SQLITE_ROW ){
 15229          const char *zArg = (const char*)sqlite3_column_text(p1, 0);
 15230          char *z2 = recoverMPrintf(p, "PRAGMA %s = %Q", zPrag, zArg);
 15231          recoverSqlCallback(p, z2);
 15232          recoverExec(p, db2, z2);
 15233          sqlite3_free(z2);
 15234          if( zArg==0 ){
 15235            recoverError(p, SQLITE_NOMEM, 0);
 15236          }
 15237        }
 15238        recoverFinalize(p, p1);
 15239      }
 15240      recoverExec(p, db2, "CREATE TABLE t1(a); DROP TABLE t1;");
 15241  
 15242      if( p->errCode==SQLITE_OK ){
 15243        sqlite3 *db = p->dbOut;
 15244        sqlite3_backup *pBackup = sqlite3_backup_init(db, "main", db2, "main");
 15245        if( pBackup ){
 15246          sqlite3_backup_step(pBackup, -1);
 15247          p->errCode = sqlite3_backup_finish(pBackup);
 15248        }else{
 15249          recoverDbError(p, db);
 15250        }
 15251      }
 15252  
 15253      sqlite3_close(db2);
 15254    }
 15255  }
 15256  
 15257  /*
 15258  ** This function is a no-op if recover handle p already contains an error
 15259  ** (if p->errCode!=SQLITE_OK). A copy of the error code is returned in
 15260  ** this case. 
 15261  **
 15262  ** Otherwise, an attempt is made to open the output database, attach
 15263  ** and create the schema of the temporary database used to store
 15264  ** intermediate data, and to register all required user functions and
 15265  ** virtual table modules with the output handle.
 15266  **
 15267  ** If no error occurs, SQLITE_OK is returned. Otherwise, an error code
 15268  ** and error message are left in the recover handle and a copy of the
 15269  ** error code returned.
 15270  */
 15271  static int recoverOpenOutput(sqlite3_recover *p){
 15272    struct Func {
 15273      const char *zName;
 15274      int nArg;
 15275      void (*xFunc)(sqlite3_context*,int,sqlite3_value **);
 15276    } aFunc[] = {
 15277      { "getpage", 1, recoverGetPage },
 15278      { "page_is_used", 1, recoverPageIsUsed },
 15279      { "read_i32", 2, recoverReadI32 },
 15280      { "escape_crnl", 1, recoverEscapeCrnl },
 15281    };
 15282  
 15283    const int flags = SQLITE_OPEN_URI|SQLITE_OPEN_CREATE|SQLITE_OPEN_READWRITE;
 15284    sqlite3 *db = 0;                /* New database handle */
 15285    int ii;                         /* For iterating through aFunc[] */
 15286  
 15287    assert( p->dbOut==0 );
 15288  
 15289    if( sqlite3_open_v2(p->zUri, &db, flags, 0) ){
 15290      recoverDbError(p, db);
 15291    }
 15292  
 15293    /* Register the sqlite_dbdata and sqlite_dbptr virtual table modules.
 15294    ** These two are registered with the output database handle - this
 15295    ** module depends on the input handle supporting the sqlite_dbpage
 15296    ** virtual table only.  */
 15297    if( p->errCode==SQLITE_OK ){
 15298      p->errCode = sqlite3_dbdata_init(db, 0, 0);
 15299    }
 15300  
 15301    /* Register the custom user-functions with the output handle. */
 15302    for(ii=0;
 15303        p->errCode==SQLITE_OK && ii<(int)(sizeof(aFunc)/sizeof(aFunc[0]));
 15304        ii++){
 15305      p->errCode = sqlite3_create_function(db, aFunc[ii].zName, 
 15306          aFunc[ii].nArg, SQLITE_UTF8, (void*)p, aFunc[ii].xFunc, 0, 0
 15307      );
 15308    }
 15309  
 15310    p->dbOut = db;
 15311    return p->errCode;
 15312  }
 15313  
 15314  /*
 15315  ** Attach the auxiliary database 'recovery' to the output database handle.
 15316  ** This temporary database is used during the recovery process and then 
 15317  ** discarded.
 15318  */
 15319  static void recoverOpenRecovery(sqlite3_recover *p){
 15320    char *zSql = recoverMPrintf(p, "ATTACH %Q AS recovery;", p->zStateDb);
 15321    recoverExec(p, p->dbOut, zSql);
 15322    recoverExec(p, p->dbOut,
 15323        "PRAGMA writable_schema = 1;"
 15324        "CREATE TABLE recovery.map(pgno INTEGER PRIMARY KEY, parent INT);" 
 15325        "CREATE TABLE recovery.schema(type, name, tbl_name, rootpage, sql);"
 15326    );
 15327    sqlite3_free(zSql);
 15328  }
 15329  
 15330  
 15331  /*
 15332  ** This function is a no-op if recover handle p already contains an error
 15333  ** (if p->errCode!=SQLITE_OK).
 15334  **
 15335  ** Otherwise, argument zName must be the name of a table that has just been
 15336  ** created in the output database. This function queries the output db
 15337  ** for the schema of said table, and creates a RecoverTable object to
 15338  ** store the schema in memory. The new RecoverTable object is linked into
 15339  ** the list at sqlite3_recover.pTblList.
 15340  **
 15341  ** Parameter iRoot must be the root page of table zName in the INPUT 
 15342  ** database.
 15343  */
 15344  static void recoverAddTable(
 15345    sqlite3_recover *p, 
 15346    const char *zName,              /* Name of table created in output db */
 15347    i64 iRoot                       /* Root page of same table in INPUT db */
 15348  ){
 15349    sqlite3_stmt *pStmt = recoverPreparePrintf(p, p->dbOut, 
 15350        "PRAGMA table_xinfo(%Q)", zName
 15351    );
 15352  
 15353    if( pStmt ){
 15354      int iPk = -1;
 15355      int iBind = 1;
 15356      RecoverTable *pNew = 0;
 15357      int nCol = 0;
 15358      int nName = recoverStrlen(zName);
 15359      int nByte = 0;
 15360      while( sqlite3_step(pStmt)==SQLITE_ROW ){
 15361        nCol++;
 15362        nByte += (sqlite3_column_bytes(pStmt, 1)+1);
 15363      }
 15364      nByte += sizeof(RecoverTable) + nCol*sizeof(RecoverColumn) + nName+1;
 15365      recoverReset(p, pStmt);
 15366  
 15367      pNew = recoverMalloc(p, nByte);
 15368      if( pNew ){
 15369        int i = 0;
 15370        int iField = 0;
 15371        char *csr = 0;
 15372        pNew->aCol = (RecoverColumn*)&pNew[1];
 15373        pNew->zTab = csr = (char*)&pNew->aCol[nCol];
 15374        pNew->nCol = nCol;
 15375        pNew->iRoot = iRoot;
 15376        memcpy(csr, zName, nName);
 15377        csr += nName+1;
 15378  
 15379        for(i=0; sqlite3_step(pStmt)==SQLITE_ROW; i++){
 15380          int iPKF = sqlite3_column_int(pStmt, 5);
 15381          int n = sqlite3_column_bytes(pStmt, 1);
 15382          const char *z = (const char*)sqlite3_column_text(pStmt, 1);
 15383          const char *zType = (const char*)sqlite3_column_text(pStmt, 2);
 15384          int eHidden = sqlite3_column_int(pStmt, 6);
 15385  
 15386          if( iPk==-1 && iPKF==1 && !sqlite3_stricmp("integer", zType) ) iPk = i;
 15387          if( iPKF>1 ) iPk = -2;
 15388          pNew->aCol[i].zCol = csr;
 15389          pNew->aCol[i].eHidden = eHidden;
 15390          if( eHidden==RECOVER_EHIDDEN_VIRTUAL ){
 15391            pNew->aCol[i].iField = -1;
 15392          }else{
 15393            pNew->aCol[i].iField = iField++;
 15394          }
 15395          if( eHidden!=RECOVER_EHIDDEN_VIRTUAL
 15396           && eHidden!=RECOVER_EHIDDEN_STORED
 15397          ){
 15398            pNew->aCol[i].iBind = iBind++;
 15399          }
 15400          memcpy(csr, z, n);
 15401          csr += (n+1);
 15402        }
 15403  
 15404        pNew->pNext = p->pTblList;
 15405        p->pTblList = pNew;
 15406        pNew->bIntkey = 1;
 15407      }
 15408  
 15409      recoverFinalize(p, pStmt);
 15410  
 15411      pStmt = recoverPreparePrintf(p, p->dbOut, "PRAGMA index_xinfo(%Q)", zName);
 15412      while( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
 15413        int iField = sqlite3_column_int(pStmt, 0);
 15414        int iCol = sqlite3_column_int(pStmt, 1);
 15415  
 15416        assert( iCol<pNew->nCol );
 15417        pNew->aCol[iCol].iField = iField;
 15418  
 15419        pNew->bIntkey = 0;
 15420        iPk = -2;
 15421      }
 15422      recoverFinalize(p, pStmt);
 15423  
 15424      if( p->errCode==SQLITE_OK ){
 15425        if( iPk>=0 ){
 15426          pNew->aCol[iPk].bIPK = 1;
 15427        }else if( pNew->bIntkey ){
 15428          pNew->iRowidBind = iBind++;
 15429        }
 15430      }
 15431    }
 15432  }
 15433  
 15434  /*
 15435  ** This function is called after recoverCacheSchema() has cached those parts
 15436  ** of the input database schema that could be recovered in temporary table
 15437  ** "recovery.schema". This function creates in the output database copies
 15438  ** of all parts of that schema that must be created before the tables can
 15439  ** be populated. Specifically, this means:
 15440  **
 15441  **     * all tables that are not VIRTUAL, and
 15442  **     * UNIQUE indexes.
 15443  **
 15444  ** If the recovery handle uses SQL callbacks, then callbacks containing
 15445  ** the associated "CREATE TABLE" and "CREATE INDEX" statements are made.
 15446  **
 15447  ** Additionally, records are added to the sqlite_schema table of the
 15448  ** output database for any VIRTUAL tables. The CREATE VIRTUAL TABLE
 15449  ** records are written directly to sqlite_schema, not actually executed.
 15450  ** If the handle is in SQL callback mode, then callbacks are invoked 
 15451  ** with equivalent SQL statements.
 15452  */
 15453  static int recoverWriteSchema1(sqlite3_recover *p){
 15454    sqlite3_stmt *pSelect = 0;
 15455    sqlite3_stmt *pTblname = 0;
 15456  
 15457    pSelect = recoverPrepare(p, p->dbOut,
 15458        "WITH dbschema(rootpage, name, sql, tbl, isVirtual, isIndex) AS ("
 15459        "  SELECT rootpage, name, sql, "
 15460        "    type='table', "
 15461        "    sql LIKE 'create virtual%',"
 15462        "    (type='index' AND (sql LIKE '%unique%' OR ?1))"
 15463        "  FROM recovery.schema"
 15464        ")"
 15465        "SELECT rootpage, tbl, isVirtual, name, sql"
 15466        " FROM dbschema "
 15467        "  WHERE tbl OR isIndex"
 15468        "  ORDER BY tbl DESC, name=='sqlite_sequence' DESC"
 15469    );
 15470  
 15471    pTblname = recoverPrepare(p, p->dbOut,
 15472        "SELECT name FROM sqlite_schema "
 15473        "WHERE type='table' ORDER BY rowid DESC LIMIT 1"
 15474    );
 15475  
 15476    if( pSelect ){
 15477      sqlite3_bind_int(pSelect, 1, p->bSlowIndexes);
 15478      while( sqlite3_step(pSelect)==SQLITE_ROW ){
 15479        i64 iRoot = sqlite3_column_int64(pSelect, 0);
 15480        int bTable = sqlite3_column_int(pSelect, 1);
 15481        int bVirtual = sqlite3_column_int(pSelect, 2);
 15482        const char *zName = (const char*)sqlite3_column_text(pSelect, 3);
 15483        const char *zSql = (const char*)sqlite3_column_text(pSelect, 4);
 15484        char *zFree = 0;
 15485        int rc = SQLITE_OK;
 15486  
 15487        if( bVirtual ){
 15488          zSql = (const char*)(zFree = recoverMPrintf(p,
 15489              "INSERT INTO sqlite_schema VALUES('table', %Q, %Q, 0, %Q)",
 15490              zName, zName, zSql
 15491          ));
 15492        }
 15493        rc = sqlite3_exec(p->dbOut, zSql, 0, 0, 0);
 15494        if( rc==SQLITE_OK ){
 15495          recoverSqlCallback(p, zSql);
 15496          if( bTable && !bVirtual ){
 15497            if( SQLITE_ROW==sqlite3_step(pTblname) ){
 15498              const char *zTbl = (const char*)sqlite3_column_text(pTblname, 0);
 15499              recoverAddTable(p, zTbl, iRoot);
 15500            }
 15501            recoverReset(p, pTblname);
 15502          }
 15503        }else if( rc!=SQLITE_ERROR ){
 15504          recoverDbError(p, p->dbOut);
 15505        }
 15506        sqlite3_free(zFree);
 15507      }
 15508    }
 15509    recoverFinalize(p, pSelect);
 15510    recoverFinalize(p, pTblname);
 15511  
 15512    return p->errCode;
 15513  }
 15514  
 15515  /*
 15516  ** This function is called after the output database has been populated. It
 15517  ** adds all recovered schema elements that were not created in the output
 15518  ** database by recoverWriteSchema1() - everything except for tables and
 15519  ** UNIQUE indexes. Specifically:
 15520  **
 15521  **     * views,
 15522  **     * triggers,
 15523  **     * non-UNIQUE indexes.
 15524  **
 15525  ** If the recover handle is in SQL callback mode, then equivalent callbacks
 15526  ** are issued to create the schema elements.
 15527  */
 15528  static int recoverWriteSchema2(sqlite3_recover *p){
 15529    sqlite3_stmt *pSelect = 0;
 15530  
 15531    pSelect = recoverPrepare(p, p->dbOut,
 15532        p->bSlowIndexes ?
 15533        "SELECT rootpage, sql FROM recovery.schema "
 15534        "  WHERE type!='table' AND type!='index'"
 15535        :
 15536        "SELECT rootpage, sql FROM recovery.schema "
 15537        "  WHERE type!='table' AND (type!='index' OR sql NOT LIKE '%unique%')"
 15538    );
 15539  
 15540    if( pSelect ){
 15541      while( sqlite3_step(pSelect)==SQLITE_ROW ){
 15542        const char *zSql = (const char*)sqlite3_column_text(pSelect, 1);
 15543        int rc = sqlite3_exec(p->dbOut, zSql, 0, 0, 0);
 15544        if( rc==SQLITE_OK ){
 15545          recoverSqlCallback(p, zSql);
 15546        }else if( rc!=SQLITE_ERROR ){
 15547          recoverDbError(p, p->dbOut);
 15548        }
 15549      }
 15550    }
 15551    recoverFinalize(p, pSelect);
 15552  
 15553    return p->errCode;
 15554  }
 15555  
 15556  /*
 15557  ** This function is a no-op if recover handle p already contains an error
 15558  ** (if p->errCode!=SQLITE_OK). In this case it returns NULL.
 15559  **
 15560  ** Otherwise, if the recover handle is configured to create an output
 15561  ** database (was created by sqlite3_recover_init()), then this function
 15562  ** prepares and returns an SQL statement to INSERT a new record into table
 15563  ** pTab, assuming the first nField fields of a record extracted from disk
 15564  ** are valid.
 15565  **
 15566  ** For example, if table pTab is:
 15567  **
 15568  **     CREATE TABLE name(a, b GENERATED ALWAYS AS (a+1) STORED, c, d, e);
 15569  **
 15570  ** And nField is 4, then the SQL statement prepared and returned is:
 15571  **
 15572  **     INSERT INTO (a, c, d) VALUES (?1, ?2, ?3);
 15573  **
 15574  ** In this case even though 4 values were extracted from the input db,
 15575  ** only 3 are written to the output, as the generated STORED column 
 15576  ** cannot be written.
 15577  **
 15578  ** If the recover handle is in SQL callback mode, then the SQL statement
 15579  ** prepared is such that evaluating it returns a single row containing
 15580  ** a single text value - itself an SQL statement similar to the above,
 15581  ** except with SQL literals in place of the variables. For example:
 15582  **
 15583  **     SELECT 'INSERT INTO (a, c, d) VALUES (' 
 15584  **          || quote(?1) || ', '
 15585  **          || quote(?2) || ', '
 15586  **          || quote(?3) || ')';
 15587  **
 15588  ** In either case, it is the responsibility of the caller to eventually
 15589  ** free the statement handle using sqlite3_finalize().
 15590  */
 15591  static sqlite3_stmt *recoverInsertStmt(
 15592    sqlite3_recover *p, 
 15593    RecoverTable *pTab,
 15594    int nField
 15595  ){
 15596    sqlite3_stmt *pRet = 0;
 15597    const char *zSep = "";
 15598    const char *zSqlSep = "";
 15599    char *zSql = 0;
 15600    char *zFinal = 0;
 15601    char *zBind = 0;
 15602    int ii;
 15603    int bSql = p->xSql ? 1 : 0;
 15604  
 15605    if( nField<=0 ) return 0;
 15606  
 15607    assert( nField<=pTab->nCol );
 15608  
 15609    zSql = recoverMPrintf(p, "INSERT OR IGNORE INTO %Q(", pTab->zTab);
 15610  
 15611    if( pTab->iRowidBind ){
 15612      assert( pTab->bIntkey );
 15613      zSql = recoverMPrintf(p, "%z_rowid_", zSql);
 15614      if( bSql ){
 15615        zBind = recoverMPrintf(p, "%zquote(?%d)", zBind, pTab->iRowidBind);
 15616      }else{
 15617        zBind = recoverMPrintf(p, "%z?%d", zBind, pTab->iRowidBind);
 15618      }
 15619      zSqlSep = "||', '||";
 15620      zSep = ", ";
 15621    }
 15622  
 15623    for(ii=0; ii<nField; ii++){
 15624      int eHidden = pTab->aCol[ii].eHidden;
 15625      if( eHidden!=RECOVER_EHIDDEN_VIRTUAL
 15626       && eHidden!=RECOVER_EHIDDEN_STORED
 15627      ){
 15628        assert( pTab->aCol[ii].iField>=0 && pTab->aCol[ii].iBind>=1 );
 15629        zSql = recoverMPrintf(p, "%z%s%Q", zSql, zSep, pTab->aCol[ii].zCol);
 15630  
 15631        if( bSql ){
 15632          zBind = recoverMPrintf(p, 
 15633              "%z%sescape_crnl(quote(?%d))", zBind, zSqlSep, pTab->aCol[ii].iBind
 15634          );
 15635          zSqlSep = "||', '||";
 15636        }else{
 15637          zBind = recoverMPrintf(p, "%z%s?%d", zBind, zSep, pTab->aCol[ii].iBind);
 15638        }
 15639        zSep = ", ";
 15640      }
 15641    }
 15642  
 15643    if( bSql ){
 15644      zFinal = recoverMPrintf(p, "SELECT %Q || ') VALUES (' || %s || ')'", 
 15645          zSql, zBind
 15646      );
 15647    }else{
 15648      zFinal = recoverMPrintf(p, "%s) VALUES (%s)", zSql, zBind);
 15649    }
 15650  
 15651    pRet = recoverPrepare(p, p->dbOut, zFinal);
 15652    sqlite3_free(zSql);
 15653    sqlite3_free(zBind);
 15654    sqlite3_free(zFinal);
 15655    
 15656    return pRet;
 15657  }
 15658  
 15659  
 15660  /*
 15661  ** Search the list of RecoverTable objects at p->pTblList for one that
 15662  ** has root page iRoot in the input database. If such an object is found,
 15663  ** return a pointer to it. Otherwise, return NULL.
 15664  */
 15665  static RecoverTable *recoverFindTable(sqlite3_recover *p, u32 iRoot){
 15666    RecoverTable *pRet = 0;
 15667    for(pRet=p->pTblList; pRet && pRet->iRoot!=iRoot; pRet=pRet->pNext);
 15668    return pRet;
 15669  }
 15670  
 15671  /*
 15672  ** This function attempts to create a lost and found table within the 
 15673  ** output db. If successful, it returns a pointer to a buffer containing
 15674  ** the name of the new table. It is the responsibility of the caller to
 15675  ** eventually free this buffer using sqlite3_free().
 15676  **
 15677  ** If an error occurs, NULL is returned and an error code and error 
 15678  ** message left in the recover handle.
 15679  */
 15680  static char *recoverLostAndFoundCreate(
 15681    sqlite3_recover *p,             /* Recover object */
 15682    int nField                      /* Number of column fields in new table */
 15683  ){
 15684    char *zTbl = 0;
 15685    sqlite3_stmt *pProbe = 0;
 15686    int ii = 0;
 15687  
 15688    pProbe = recoverPrepare(p, p->dbOut,
 15689      "SELECT 1 FROM sqlite_schema WHERE name=?"
 15690    );
 15691    for(ii=-1; zTbl==0 && p->errCode==SQLITE_OK && ii<1000; ii++){
 15692      int bFail = 0;
 15693      if( ii<0 ){
 15694        zTbl = recoverMPrintf(p, "%s", p->zLostAndFound);
 15695      }else{
 15696        zTbl = recoverMPrintf(p, "%s_%d", p->zLostAndFound, ii);
 15697      }
 15698  
 15699      if( p->errCode==SQLITE_OK ){
 15700        sqlite3_bind_text(pProbe, 1, zTbl, -1, SQLITE_STATIC);
 15701        if( SQLITE_ROW==sqlite3_step(pProbe) ){
 15702          bFail = 1;
 15703        }
 15704        recoverReset(p, pProbe);
 15705      }
 15706  
 15707      if( bFail ){
 15708        sqlite3_clear_bindings(pProbe);
 15709        sqlite3_free(zTbl);
 15710        zTbl = 0;
 15711      }
 15712    }
 15713    recoverFinalize(p, pProbe);
 15714  
 15715    if( zTbl ){
 15716      const char *zSep = 0;
 15717      char *zField = 0;
 15718      char *zSql = 0;
 15719  
 15720      zSep = "rootpgno INTEGER, pgno INTEGER, nfield INTEGER, id INTEGER, ";
 15721      for(ii=0; p->errCode==SQLITE_OK && ii<nField; ii++){
 15722        zField = recoverMPrintf(p, "%z%sc%d", zField, zSep, ii);
 15723        zSep = ", ";
 15724      }
 15725  
 15726      zSql = recoverMPrintf(p, "CREATE TABLE %s(%s)", zTbl, zField);
 15727      sqlite3_free(zField);
 15728  
 15729      recoverExec(p, p->dbOut, zSql);
 15730      recoverSqlCallback(p, zSql);
 15731      sqlite3_free(zSql);
 15732    }else if( p->errCode==SQLITE_OK ){
 15733      recoverError(
 15734          p, SQLITE_ERROR, "failed to create %s output table", p->zLostAndFound
 15735      );
 15736    }
 15737  
 15738    return zTbl;
 15739  }
 15740  
 15741  /*
 15742  ** Synthesize and prepare an INSERT statement to write to the lost_and_found
 15743  ** table in the output database. The name of the table is zTab, and it has
 15744  ** nField c* fields.
 15745  */
 15746  static sqlite3_stmt *recoverLostAndFoundInsert(
 15747    sqlite3_recover *p,
 15748    const char *zTab,
 15749    int nField
 15750  ){
 15751    int nTotal = nField + 4;
 15752    int ii;
 15753    char *zBind = 0;
 15754    sqlite3_stmt *pRet = 0;
 15755  
 15756    if( p->xSql==0 ){
 15757      for(ii=0; ii<nTotal; ii++){
 15758        zBind = recoverMPrintf(p, "%z%s?", zBind, zBind?", ":"", ii);
 15759      }
 15760      pRet = recoverPreparePrintf(
 15761          p, p->dbOut, "INSERT INTO %s VALUES(%s)", zTab, zBind
 15762      );
 15763    }else{
 15764      const char *zSep = "";
 15765      for(ii=0; ii<nTotal; ii++){
 15766        zBind = recoverMPrintf(p, "%z%squote(?)", zBind, zSep);
 15767        zSep = "|| ', ' ||";
 15768      }
 15769      pRet = recoverPreparePrintf(
 15770          p, p->dbOut, "SELECT 'INSERT INTO %s VALUES(' || %s || ')'", zTab, zBind
 15771      );
 15772    }
 15773  
 15774    sqlite3_free(zBind);
 15775    return pRet;
 15776  }
 15777  
 15778  /*
 15779  ** Input database page iPg contains data that will be written to the
 15780  ** lost-and-found table of the output database. This function attempts
 15781  ** to identify the root page of the tree that page iPg belonged to.
 15782  ** If successful, it sets output variable (*piRoot) to the page number
 15783  ** of the root page and returns SQLITE_OK. Otherwise, if an error occurs,
 15784  ** an SQLite error code is returned and the final value of *piRoot 
 15785  ** undefined.
 15786  */
 15787  static int recoverLostAndFoundFindRoot(
 15788    sqlite3_recover *p, 
 15789    i64 iPg,
 15790    i64 *piRoot
 15791  ){
 15792    RecoverStateLAF *pLaf = &p->laf;
 15793  
 15794    if( pLaf->pFindRoot==0 ){
 15795      pLaf->pFindRoot = recoverPrepare(p, p->dbOut,
 15796          "WITH RECURSIVE p(pgno) AS ("
 15797          "  SELECT ?"
 15798          "    UNION"
 15799          "  SELECT parent FROM recovery.map AS m, p WHERE m.pgno=p.pgno"
 15800          ") "
 15801          "SELECT p.pgno FROM p, recovery.map m WHERE m.pgno=p.pgno "
 15802          "    AND m.parent IS NULL"
 15803      );
 15804    }
 15805    if( p->errCode==SQLITE_OK ){
 15806      sqlite3_bind_int64(pLaf->pFindRoot, 1, iPg);
 15807      if( sqlite3_step(pLaf->pFindRoot)==SQLITE_ROW ){
 15808        *piRoot = sqlite3_column_int64(pLaf->pFindRoot, 0);
 15809      }else{
 15810        *piRoot = iPg;
 15811      }
 15812      recoverReset(p, pLaf->pFindRoot);
 15813    }
 15814    return p->errCode;
 15815  }
 15816  
 15817  /*
 15818  ** Recover data from page iPage of the input database and write it to
 15819  ** the lost-and-found table in the output database.
 15820  */
 15821  static void recoverLostAndFoundOnePage(sqlite3_recover *p, i64 iPage){
 15822    RecoverStateLAF *pLaf = &p->laf;
 15823    sqlite3_value **apVal = pLaf->apVal;
 15824    sqlite3_stmt *pPageData = pLaf->pPageData;
 15825    sqlite3_stmt *pInsert = pLaf->pInsert;
 15826  
 15827    int nVal = -1;
 15828    int iPrevCell = 0;
 15829    i64 iRoot = 0;
 15830    int bHaveRowid = 0;
 15831    i64 iRowid = 0;
 15832    int ii = 0;
 15833  
 15834    if( recoverLostAndFoundFindRoot(p, iPage, &iRoot) ) return;
 15835    sqlite3_bind_int64(pPageData, 1, iPage);
 15836    while( p->errCode==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPageData) ){
 15837      int iCell = sqlite3_column_int64(pPageData, 0);
 15838      int iField = sqlite3_column_int64(pPageData, 1);
 15839  
 15840      if( iPrevCell!=iCell && nVal>=0 ){
 15841        /* Insert the new row */
 15842        sqlite3_bind_int64(pInsert, 1, iRoot);      /* rootpgno */
 15843        sqlite3_bind_int64(pInsert, 2, iPage);      /* pgno */
 15844        sqlite3_bind_int(pInsert, 3, nVal);         /* nfield */
 15845        if( bHaveRowid ){
 15846          sqlite3_bind_int64(pInsert, 4, iRowid);   /* id */
 15847        }
 15848        for(ii=0; ii<nVal; ii++){
 15849          recoverBindValue(p, pInsert, 5+ii, apVal[ii]);
 15850        }
 15851        if( sqlite3_step(pInsert)==SQLITE_ROW ){
 15852          recoverSqlCallback(p, (const char*)sqlite3_column_text(pInsert, 0));
 15853        }
 15854        recoverReset(p, pInsert);
 15855  
 15856        /* Discard the accumulated row data */
 15857        for(ii=0; ii<nVal; ii++){
 15858          sqlite3_value_free(apVal[ii]);
 15859          apVal[ii] = 0;
 15860        }
 15861        sqlite3_clear_bindings(pInsert);
 15862        bHaveRowid = 0;
 15863        nVal = -1;
 15864      }
 15865  
 15866      if( iCell<0 ) break;
 15867  
 15868      if( iField<0 ){
 15869        assert( nVal==-1 );
 15870        iRowid = sqlite3_column_int64(pPageData, 2);
 15871        bHaveRowid = 1;
 15872        nVal = 0;
 15873      }else if( iField<pLaf->nMaxField ){
 15874        sqlite3_value *pVal = sqlite3_column_value(pPageData, 2);
 15875        apVal[iField] = sqlite3_value_dup(pVal);
 15876        assert( iField==nVal || (nVal==-1 && iField==0) );
 15877        nVal = iField+1;
 15878        if( apVal[iField]==0 ){
 15879          recoverError(p, SQLITE_NOMEM, 0);
 15880        }
 15881      }
 15882  
 15883      iPrevCell = iCell;
 15884    }
 15885    recoverReset(p, pPageData);
 15886  
 15887    for(ii=0; ii<nVal; ii++){
 15888      sqlite3_value_free(apVal[ii]);
 15889      apVal[ii] = 0;
 15890    }
 15891  }
 15892  
 15893  /*
 15894  ** Perform one step (sqlite3_recover_step()) of work for the connection 
 15895  ** passed as the only argument, which is guaranteed to be in
 15896  ** RECOVER_STATE_LOSTANDFOUND3 state - during which the lost-and-found 
 15897  ** table of the output database is populated with recovered data that can 
 15898  ** not be assigned to any recovered schema object.
 15899  */ 
 15900  static int recoverLostAndFound3Step(sqlite3_recover *p){
 15901    RecoverStateLAF *pLaf = &p->laf;
 15902    if( p->errCode==SQLITE_OK ){
 15903      if( pLaf->pInsert==0 ){
 15904        return SQLITE_DONE;
 15905      }else{
 15906        if( p->errCode==SQLITE_OK ){
 15907          int res = sqlite3_step(pLaf->pAllPage);
 15908          if( res==SQLITE_ROW ){
 15909            i64 iPage = sqlite3_column_int64(pLaf->pAllPage, 0);
 15910            if( recoverBitmapQuery(pLaf->pUsed, iPage)==0 ){
 15911              recoverLostAndFoundOnePage(p, iPage);
 15912            }
 15913          }else{
 15914            recoverReset(p, pLaf->pAllPage);
 15915            return SQLITE_DONE;
 15916          }
 15917        }
 15918      }
 15919    }
 15920    return SQLITE_OK;
 15921  }
 15922  
 15923  /*
 15924  ** Initialize resources required in RECOVER_STATE_LOSTANDFOUND3 
 15925  ** state - during which the lost-and-found table of the output database 
 15926  ** is populated with recovered data that can not be assigned to any 
 15927  ** recovered schema object.
 15928  */ 
 15929  static void recoverLostAndFound3Init(sqlite3_recover *p){
 15930    RecoverStateLAF *pLaf = &p->laf;
 15931  
 15932    if( pLaf->nMaxField>0 ){
 15933      char *zTab = 0;               /* Name of lost_and_found table */
 15934  
 15935      zTab = recoverLostAndFoundCreate(p, pLaf->nMaxField);
 15936      pLaf->pInsert = recoverLostAndFoundInsert(p, zTab, pLaf->nMaxField);
 15937      sqlite3_free(zTab);
 15938  
 15939      pLaf->pAllPage = recoverPreparePrintf(p, p->dbOut,
 15940          "WITH RECURSIVE seq(ii) AS ("
 15941          "  SELECT 1 UNION ALL SELECT ii+1 FROM seq WHERE ii<%lld"
 15942          ")"
 15943          "SELECT ii FROM seq" , p->laf.nPg
 15944      );
 15945      pLaf->pPageData = recoverPrepare(p, p->dbOut,
 15946          "SELECT cell, field, value "
 15947          "FROM sqlite_dbdata('getpage()') d WHERE d.pgno=? "
 15948          "UNION ALL "
 15949          "SELECT -1, -1, -1"
 15950      );
 15951  
 15952      pLaf->apVal = (sqlite3_value**)recoverMalloc(p, 
 15953          pLaf->nMaxField*sizeof(sqlite3_value*)
 15954      );
 15955    }
 15956  }
 15957  
 15958  /*
 15959  ** Initialize resources required in RECOVER_STATE_WRITING state - during which
 15960  ** tables recovered from the schema of the input database are populated with
 15961  ** recovered data.
 15962  */ 
 15963  static int recoverWriteDataInit(sqlite3_recover *p){
 15964    RecoverStateW1 *p1 = &p->w1;
 15965    RecoverTable *pTbl = 0;
 15966    int nByte = 0;
 15967  
 15968    /* Figure out the maximum number of columns for any table in the schema */
 15969    assert( p1->nMax==0 );
 15970    for(pTbl=p->pTblList; pTbl; pTbl=pTbl->pNext){
 15971      if( pTbl->nCol>p1->nMax ) p1->nMax = pTbl->nCol;
 15972    }
 15973  
 15974    /* Allocate an array of (sqlite3_value*) in which to accumulate the values
 15975    ** that will be written to the output database in a single row. */
 15976    nByte = sizeof(sqlite3_value*) * (p1->nMax+1);
 15977    p1->apVal = (sqlite3_value**)recoverMalloc(p, nByte);
 15978    if( p1->apVal==0 ) return p->errCode;
 15979  
 15980    /* Prepare the SELECT to loop through schema tables (pTbls) and the SELECT
 15981    ** to loop through cells that appear to belong to a single table (pSel). */
 15982    p1->pTbls = recoverPrepare(p, p->dbOut,
 15983        "SELECT rootpage FROM recovery.schema "
 15984        "  WHERE type='table' AND (sql NOT LIKE 'create virtual%')"
 15985        "  ORDER BY (tbl_name='sqlite_sequence') ASC"
 15986    );
 15987    p1->pSel = recoverPrepare(p, p->dbOut, 
 15988        "WITH RECURSIVE pages(page) AS ("
 15989        "  SELECT ?1"
 15990        "    UNION"
 15991        "  SELECT child FROM sqlite_dbptr('getpage()'), pages "
 15992        "    WHERE pgno=page"
 15993        ") "
 15994        "SELECT page, cell, field, value "
 15995        "FROM sqlite_dbdata('getpage()') d, pages p WHERE p.page=d.pgno "
 15996        "UNION ALL "
 15997        "SELECT 0, 0, 0, 0"
 15998    );
 15999  
 16000    return p->errCode;
 16001  }
 16002  
 16003  /*
 16004  ** Clean up resources allocated by recoverWriteDataInit() (stuff in 
 16005  ** sqlite3_recover.w1).
 16006  */
 16007  static void recoverWriteDataCleanup(sqlite3_recover *p){
 16008    RecoverStateW1 *p1 = &p->w1;
 16009    int ii;
 16010    for(ii=0; ii<p1->nVal; ii++){
 16011      sqlite3_value_free(p1->apVal[ii]);
 16012    }
 16013    sqlite3_free(p1->apVal);
 16014    recoverFinalize(p, p1->pInsert);
 16015    recoverFinalize(p, p1->pTbls);
 16016    recoverFinalize(p, p1->pSel);
 16017    memset(p1, 0, sizeof(*p1));
 16018  }
 16019  
 16020  /*
 16021  ** Perform one step (sqlite3_recover_step()) of work for the connection 
 16022  ** passed as the only argument, which is guaranteed to be in
 16023  ** RECOVER_STATE_WRITING state - during which tables recovered from the
 16024  ** schema of the input database are populated with recovered data.
 16025  */ 
 16026  static int recoverWriteDataStep(sqlite3_recover *p){
 16027    RecoverStateW1 *p1 = &p->w1;
 16028    sqlite3_stmt *pSel = p1->pSel;
 16029    sqlite3_value **apVal = p1->apVal;
 16030  
 16031    if( p->errCode==SQLITE_OK && p1->pTab==0 ){
 16032      if( sqlite3_step(p1->pTbls)==SQLITE_ROW ){
 16033        i64 iRoot = sqlite3_column_int64(p1->pTbls, 0);
 16034        p1->pTab = recoverFindTable(p, iRoot);
 16035  
 16036        recoverFinalize(p, p1->pInsert);
 16037        p1->pInsert = 0;
 16038  
 16039        /* If this table is unknown, return early. The caller will invoke this
 16040        ** function again and it will move on to the next table.  */
 16041        if( p1->pTab==0 ) return p->errCode;
 16042  
 16043        /* If this is the sqlite_sequence table, delete any rows added by
 16044        ** earlier INSERT statements on tables with AUTOINCREMENT primary
 16045        ** keys before recovering its contents. The p1->pTbls SELECT statement
 16046        ** is rigged to deliver "sqlite_sequence" last of all, so we don't
 16047        ** worry about it being modified after it is recovered. */
 16048        if( sqlite3_stricmp("sqlite_sequence", p1->pTab->zTab)==0 ){
 16049          recoverExec(p, p->dbOut, "DELETE FROM sqlite_sequence");
 16050          recoverSqlCallback(p, "DELETE FROM sqlite_sequence");
 16051        }
 16052  
 16053        /* Bind the root page of this table within the original database to 
 16054        ** SELECT statement p1->pSel. The SELECT statement will then iterate
 16055        ** through cells that look like they belong to table pTab.  */
 16056        sqlite3_bind_int64(pSel, 1, iRoot);
 16057  
 16058        p1->nVal = 0;
 16059        p1->bHaveRowid = 0;
 16060        p1->iPrevPage = -1;
 16061        p1->iPrevCell = -1;
 16062      }else{
 16063        return SQLITE_DONE;
 16064      }
 16065    }
 16066    assert( p->errCode!=SQLITE_OK || p1->pTab );
 16067  
 16068    if( p->errCode==SQLITE_OK && sqlite3_step(pSel)==SQLITE_ROW ){
 16069      RecoverTable *pTab = p1->pTab;
 16070  
 16071      i64 iPage = sqlite3_column_int64(pSel, 0);
 16072      int iCell = sqlite3_column_int(pSel, 1);
 16073      int iField = sqlite3_column_int(pSel, 2);
 16074      sqlite3_value *pVal = sqlite3_column_value(pSel, 3);
 16075      int bNewCell = (p1->iPrevPage!=iPage || p1->iPrevCell!=iCell);
 16076  
 16077      assert( bNewCell==0 || (iField==-1 || iField==0) );
 16078      assert( bNewCell || iField==p1->nVal || p1->nVal==pTab->nCol );
 16079  
 16080      if( bNewCell ){
 16081        int ii = 0;
 16082        if( p1->nVal>=0 ){
 16083          if( p1->pInsert==0 || p1->nVal!=p1->nInsert ){
 16084            recoverFinalize(p, p1->pInsert);
 16085            p1->pInsert = recoverInsertStmt(p, pTab, p1->nVal);
 16086            p1->nInsert = p1->nVal;
 16087          }
 16088          if( p1->nVal>0 ){
 16089            sqlite3_stmt *pInsert = p1->pInsert;
 16090            for(ii=0; ii<pTab->nCol; ii++){
 16091              RecoverColumn *pCol = &pTab->aCol[ii];
 16092              int iBind = pCol->iBind;
 16093              if( iBind>0 ){
 16094                if( pCol->bIPK ){
 16095                  sqlite3_bind_int64(pInsert, iBind, p1->iRowid);
 16096                }else if( pCol->iField<p1->nVal ){
 16097                  recoverBindValue(p, pInsert, iBind, apVal[pCol->iField]);
 16098                }
 16099              }
 16100            }
 16101            if( p->bRecoverRowid && pTab->iRowidBind>0 && p1->bHaveRowid ){
 16102              sqlite3_bind_int64(pInsert, pTab->iRowidBind, p1->iRowid);
 16103            }
 16104            if( SQLITE_ROW==sqlite3_step(pInsert) ){
 16105              const char *z = (const char*)sqlite3_column_text(pInsert, 0);
 16106              recoverSqlCallback(p, z);
 16107            }
 16108            recoverReset(p, pInsert);
 16109            assert( p->errCode || pInsert );
 16110            if( pInsert ) sqlite3_clear_bindings(pInsert);
 16111          }
 16112        }
 16113  
 16114        for(ii=0; ii<p1->nVal; ii++){
 16115          sqlite3_value_free(apVal[ii]);
 16116          apVal[ii] = 0;
 16117        }
 16118        p1->nVal = -1;
 16119        p1->bHaveRowid = 0;
 16120      }
 16121  
 16122      if( iPage!=0 ){
 16123        if( iField<0 ){
 16124          p1->iRowid = sqlite3_column_int64(pSel, 3);
 16125          assert( p1->nVal==-1 );
 16126          p1->nVal = 0;
 16127          p1->bHaveRowid = 1;
 16128        }else if( iField<pTab->nCol ){
 16129          assert( apVal[iField]==0 );
 16130          apVal[iField] = sqlite3_value_dup( pVal );
 16131          if( apVal[iField]==0 ){
 16132            recoverError(p, SQLITE_NOMEM, 0);
 16133          }
 16134          p1->nVal = iField+1;
 16135        }
 16136        p1->iPrevCell = iCell;
 16137        p1->iPrevPage = iPage;
 16138      }
 16139    }else{
 16140      recoverReset(p, pSel);
 16141      p1->pTab = 0;
 16142    }
 16143  
 16144    return p->errCode;
 16145  }
 16146  
 16147  /*
 16148  ** Initialize resources required by sqlite3_recover_step() in
 16149  ** RECOVER_STATE_LOSTANDFOUND1 state - during which the set of pages not
 16150  ** already allocated to a recovered schema element is determined.
 16151  */ 
 16152  static void recoverLostAndFound1Init(sqlite3_recover *p){
 16153    RecoverStateLAF *pLaf = &p->laf;
 16154    sqlite3_stmt *pStmt = 0;
 16155  
 16156    assert( p->laf.pUsed==0 );
 16157    pLaf->nPg = recoverPageCount(p);
 16158    pLaf->pUsed = recoverBitmapAlloc(p, pLaf->nPg);
 16159  
 16160    /* Prepare a statement to iterate through all pages that are part of any tree
 16161    ** in the recoverable part of the input database schema to the bitmap. And,
 16162    ** if !p->bFreelistCorrupt, add all pages that appear to be part of the
 16163    ** freelist.  */
 16164    pStmt = recoverPrepare(
 16165        p, p->dbOut,
 16166        "WITH trunk(pgno) AS ("
 16167        "  SELECT read_i32(getpage(1), 8) AS x WHERE x>0"
 16168        "    UNION"
 16169        "  SELECT read_i32(getpage(trunk.pgno), 0) AS x FROM trunk WHERE x>0"
 16170        "),"
 16171        "trunkdata(pgno, data) AS ("
 16172        "  SELECT pgno, getpage(pgno) FROM trunk"
 16173        "),"
 16174        "freelist(data, n, freepgno) AS ("
 16175        "  SELECT data, min(16384, read_i32(data, 1)-1), pgno FROM trunkdata"
 16176        "    UNION ALL"
 16177        "  SELECT data, n-1, read_i32(data, 2+n) FROM freelist WHERE n>=0"
 16178        "),"
 16179        ""
 16180        "roots(r) AS ("
 16181        "  SELECT 1 UNION ALL"
 16182        "  SELECT rootpage FROM recovery.schema WHERE rootpage>0"
 16183        "),"
 16184        "used(page) AS ("
 16185        "  SELECT r FROM roots"
 16186        "    UNION"
 16187        "  SELECT child FROM sqlite_dbptr('getpage()'), used "
 16188        "    WHERE pgno=page"
 16189        ") "
 16190        "SELECT page FROM used"
 16191        " UNION ALL "
 16192        "SELECT freepgno FROM freelist WHERE NOT ?"
 16193    );
 16194    if( pStmt ) sqlite3_bind_int(pStmt, 1, p->bFreelistCorrupt);
 16195    pLaf->pUsedPages = pStmt;
 16196  }
 16197  
 16198  /*
 16199  ** Perform one step (sqlite3_recover_step()) of work for the connection 
 16200  ** passed as the only argument, which is guaranteed to be in
 16201  ** RECOVER_STATE_LOSTANDFOUND1 state - during which the set of pages not
 16202  ** already allocated to a recovered schema element is determined.
 16203  */ 
 16204  static int recoverLostAndFound1Step(sqlite3_recover *p){
 16205    RecoverStateLAF *pLaf = &p->laf;
 16206    int rc = p->errCode;
 16207    if( rc==SQLITE_OK ){
 16208      rc = sqlite3_step(pLaf->pUsedPages);
 16209      if( rc==SQLITE_ROW ){
 16210        i64 iPg = sqlite3_column_int64(pLaf->pUsedPages, 0);
 16211        recoverBitmapSet(pLaf->pUsed, iPg);
 16212        rc = SQLITE_OK;
 16213      }else{
 16214        recoverFinalize(p, pLaf->pUsedPages);
 16215        pLaf->pUsedPages = 0;
 16216      }
 16217    }
 16218    return rc;
 16219  }
 16220  
 16221  /*
 16222  ** Initialize resources required by RECOVER_STATE_LOSTANDFOUND2 
 16223  ** state - during which the pages identified in RECOVER_STATE_LOSTANDFOUND1
 16224  ** are sorted into sets that likely belonged to the same database tree.
 16225  */ 
 16226  static void recoverLostAndFound2Init(sqlite3_recover *p){
 16227    RecoverStateLAF *pLaf = &p->laf;
 16228  
 16229    assert( p->laf.pAllAndParent==0 );
 16230    assert( p->laf.pMapInsert==0 );
 16231    assert( p->laf.pMaxField==0 );
 16232    assert( p->laf.nMaxField==0 );
 16233  
 16234    pLaf->pMapInsert = recoverPrepare(p, p->dbOut,
 16235        "INSERT OR IGNORE INTO recovery.map(pgno, parent) VALUES(?, ?)"
 16236    );
 16237    pLaf->pAllAndParent = recoverPreparePrintf(p, p->dbOut,
 16238        "WITH RECURSIVE seq(ii) AS ("
 16239        "  SELECT 1 UNION ALL SELECT ii+1 FROM seq WHERE ii<%lld"
 16240        ")"
 16241        "SELECT pgno, child FROM sqlite_dbptr('getpage()') "
 16242        " UNION ALL "
 16243        "SELECT NULL, ii FROM seq", p->laf.nPg
 16244    );
 16245    pLaf->pMaxField = recoverPreparePrintf(p, p->dbOut,
 16246        "SELECT max(field)+1 FROM sqlite_dbdata('getpage') WHERE pgno = ?"
 16247    );
 16248  }
 16249  
 16250  /*
 16251  ** Perform one step (sqlite3_recover_step()) of work for the connection 
 16252  ** passed as the only argument, which is guaranteed to be in
 16253  ** RECOVER_STATE_LOSTANDFOUND2 state - during which the pages identified 
 16254  ** in RECOVER_STATE_LOSTANDFOUND1 are sorted into sets that likely belonged 
 16255  ** to the same database tree.
 16256  */ 
 16257  static int recoverLostAndFound2Step(sqlite3_recover *p){
 16258    RecoverStateLAF *pLaf = &p->laf;
 16259    if( p->errCode==SQLITE_OK ){
 16260      int res = sqlite3_step(pLaf->pAllAndParent);
 16261      if( res==SQLITE_ROW ){
 16262        i64 iChild = sqlite3_column_int(pLaf->pAllAndParent, 1);
 16263        if( recoverBitmapQuery(pLaf->pUsed, iChild)==0 ){
 16264          sqlite3_bind_int64(pLaf->pMapInsert, 1, iChild);
 16265          sqlite3_bind_value(pLaf->pMapInsert, 2, 
 16266              sqlite3_column_value(pLaf->pAllAndParent, 0)
 16267          );
 16268          sqlite3_step(pLaf->pMapInsert);
 16269          recoverReset(p, pLaf->pMapInsert);
 16270          sqlite3_bind_int64(pLaf->pMaxField, 1, iChild);
 16271          if( SQLITE_ROW==sqlite3_step(pLaf->pMaxField) ){
 16272            int nMax = sqlite3_column_int(pLaf->pMaxField, 0);
 16273            if( nMax>pLaf->nMaxField ) pLaf->nMaxField = nMax;
 16274          }
 16275          recoverReset(p, pLaf->pMaxField);
 16276        }
 16277      }else{
 16278        recoverFinalize(p, pLaf->pAllAndParent);
 16279        pLaf->pAllAndParent =0;
 16280        return SQLITE_DONE;
 16281      }
 16282    }
 16283    return p->errCode;
 16284  }
 16285  
 16286  /*
 16287  ** Free all resources allocated as part of sqlite3_recover_step() calls
 16288  ** in one of the RECOVER_STATE_LOSTANDFOUND[123] states.
 16289  */
 16290  static void recoverLostAndFoundCleanup(sqlite3_recover *p){
 16291    recoverBitmapFree(p->laf.pUsed);
 16292    p->laf.pUsed = 0;
 16293    sqlite3_finalize(p->laf.pUsedPages);
 16294    sqlite3_finalize(p->laf.pAllAndParent);
 16295    sqlite3_finalize(p->laf.pMapInsert);
 16296    sqlite3_finalize(p->laf.pMaxField);
 16297    sqlite3_finalize(p->laf.pFindRoot);
 16298    sqlite3_finalize(p->laf.pInsert);
 16299    sqlite3_finalize(p->laf.pAllPage);
 16300    sqlite3_finalize(p->laf.pPageData);
 16301    p->laf.pUsedPages = 0;
 16302    p->laf.pAllAndParent = 0;
 16303    p->laf.pMapInsert = 0;
 16304    p->laf.pMaxField = 0;
 16305    p->laf.pFindRoot = 0;
 16306    p->laf.pInsert = 0;
 16307    p->laf.pAllPage = 0;
 16308    p->laf.pPageData = 0;
 16309    sqlite3_free(p->laf.apVal);
 16310    p->laf.apVal = 0;
 16311  }
 16312  
 16313  /*
 16314  ** Free all resources allocated as part of sqlite3_recover_step() calls.
 16315  */
 16316  static void recoverFinalCleanup(sqlite3_recover *p){
 16317    RecoverTable *pTab = 0;
 16318    RecoverTable *pNext = 0;
 16319  
 16320    recoverWriteDataCleanup(p);
 16321    recoverLostAndFoundCleanup(p);
 16322  
 16323    for(pTab=p->pTblList; pTab; pTab=pNext){
 16324      pNext = pTab->pNext;
 16325      sqlite3_free(pTab);
 16326    }
 16327    p->pTblList = 0;
 16328    sqlite3_finalize(p->pGetPage);
 16329    p->pGetPage = 0;
 16330    sqlite3_file_control(p->dbIn, p->zDb, SQLITE_FCNTL_RESET_CACHE, 0);
 16331  
 16332    {
 16333  #ifndef NDEBUG
 16334      int res = 
 16335  #endif
 16336         sqlite3_close(p->dbOut);
 16337      assert( res==SQLITE_OK );
 16338    }
 16339    p->dbOut = 0;
 16340  }
 16341  
 16342  /*
 16343  ** Decode and return an unsigned 16-bit big-endian integer value from 
 16344  ** buffer a[].
 16345  */
 16346  static u32 recoverGetU16(const u8 *a){
 16347    return (((u32)a[0])<<8) + ((u32)a[1]);
 16348  }
 16349  
 16350  /*
 16351  ** Decode and return an unsigned 32-bit big-endian integer value from 
 16352  ** buffer a[].
 16353  */
 16354  static u32 recoverGetU32(const u8 *a){
 16355    return (((u32)a[0])<<24) + (((u32)a[1])<<16) + (((u32)a[2])<<8) + ((u32)a[3]);
 16356  }
 16357  
 16358  /*
 16359  ** Decode an SQLite varint from buffer a[]. Write the decoded value to (*pVal)
 16360  ** and return the number of bytes consumed.
 16361  */
 16362  static int recoverGetVarint(const u8 *a, i64 *pVal){
 16363    sqlite3_uint64 u = 0;
 16364    int i;
 16365    for(i=0; i<8; i++){
 16366      u = (u<<7) + (a[i]&0x7f);
 16367      if( (a[i]&0x80)==0 ){ *pVal = (sqlite3_int64)u; return i+1; }
 16368    }
 16369    u = (u<<8) + (a[i]&0xff);
 16370    *pVal = (sqlite3_int64)u;
 16371    return 9;
 16372  }
 16373  
 16374  /*
 16375  ** The second argument points to a buffer n bytes in size. If this buffer
 16376  ** or a prefix thereof appears to contain a well-formed SQLite b-tree page, 
 16377  ** return the page-size in bytes. Otherwise, if the buffer does not 
 16378  ** appear to contain a well-formed b-tree page, return 0.
 16379  */
 16380  static int recoverIsValidPage(u8 *aTmp, const u8 *a, int n){
 16381    u8 *aUsed = aTmp;
 16382    int nFrag = 0;
 16383    int nActual = 0;
 16384    int iFree = 0;
 16385    int nCell = 0;                  /* Number of cells on page */
 16386    int iCellOff = 0;               /* Offset of cell array in page */
 16387    int iContent = 0;
 16388    int eType = 0;
 16389    int ii = 0;
 16390  
 16391    eType = (int)a[0];
 16392    if( eType!=0x02 && eType!=0x05 && eType!=0x0A && eType!=0x0D ) return 0;
 16393  
 16394    iFree = (int)recoverGetU16(&a[1]);
 16395    nCell = (int)recoverGetU16(&a[3]);
 16396    iContent = (int)recoverGetU16(&a[5]);
 16397    if( iContent==0 ) iContent = 65536;
 16398    nFrag = (int)a[7];
 16399  
 16400    if( iContent>n ) return 0;
 16401  
 16402    memset(aUsed, 0, n);
 16403    memset(aUsed, 0xFF, iContent);
 16404  
 16405    /* Follow the free-list. This is the same format for all b-tree pages. */
 16406    if( iFree && iFree<=iContent ) return 0;
 16407    while( iFree ){
 16408      int iNext = 0;
 16409      int nByte = 0;
 16410      if( iFree>(n-4) ) return 0;
 16411      iNext = recoverGetU16(&a[iFree]);
 16412      nByte = recoverGetU16(&a[iFree+2]);
 16413      if( iFree+nByte>n || nByte<4 ) return 0;
 16414      if( iNext && iNext<iFree+nByte ) return 0;
 16415      memset(&aUsed[iFree], 0xFF, nByte);
 16416      iFree = iNext;
 16417    }
 16418  
 16419    /* Run through the cells */
 16420    if( eType==0x02 || eType==0x05 ){
 16421      iCellOff = 12;
 16422    }else{
 16423      iCellOff = 8;
 16424    }
 16425    if( (iCellOff + 2*nCell)>iContent ) return 0;
 16426    for(ii=0; ii<nCell; ii++){
 16427      int iByte;
 16428      i64 nPayload = 0;
 16429      int nByte = 0;
 16430      int iOff = recoverGetU16(&a[iCellOff + 2*ii]);
 16431      if( iOff<iContent || iOff>n ){
 16432        return 0;
 16433      }
 16434      if( eType==0x05 || eType==0x02 ) nByte += 4;
 16435      nByte += recoverGetVarint(&a[iOff+nByte], &nPayload);
 16436      if( eType==0x0D ){
 16437        i64 dummy = 0;
 16438        nByte += recoverGetVarint(&a[iOff+nByte], &dummy);
 16439      }
 16440      if( eType!=0x05 ){
 16441        int X = (eType==0x0D) ? n-35 : (((n-12)*64/255)-23);
 16442        int M = ((n-12)*32/255)-23;
 16443        int K = M+((nPayload-M)%(n-4));
 16444  
 16445        if( nPayload<X ){
 16446          nByte += nPayload;
 16447        }else if( K<=X ){
 16448          nByte += K+4;
 16449        }else{
 16450          nByte += M+4;
 16451        }
 16452      }
 16453  
 16454      if( iOff+nByte>n ){
 16455        return 0;
 16456      }
 16457      for(iByte=iOff; iByte<(iOff+nByte); iByte++){
 16458        if( aUsed[iByte]!=0 ){
 16459          return 0;
 16460        }
 16461        aUsed[iByte] = 0xFF;
 16462      }
 16463    }
 16464  
 16465    nActual = 0;
 16466    for(ii=0; ii<n; ii++){
 16467      if( aUsed[ii]==0 ) nActual++;
 16468    }
 16469    return (nActual==nFrag);
 16470  }
 16471  
 16472  
 16473  static int recoverVfsClose(sqlite3_file*);
 16474  static int recoverVfsRead(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst);
 16475  static int recoverVfsWrite(sqlite3_file*, const void*, int, sqlite3_int64);
 16476  static int recoverVfsTruncate(sqlite3_file*, sqlite3_int64 size);
 16477  static int recoverVfsSync(sqlite3_file*, int flags);
 16478  static int recoverVfsFileSize(sqlite3_file*, sqlite3_int64 *pSize);
 16479  static int recoverVfsLock(sqlite3_file*, int);
 16480  static int recoverVfsUnlock(sqlite3_file*, int);
 16481  static int recoverVfsCheckReservedLock(sqlite3_file*, int *pResOut);
 16482  static int recoverVfsFileControl(sqlite3_file*, int op, void *pArg);
 16483  static int recoverVfsSectorSize(sqlite3_file*);
 16484  static int recoverVfsDeviceCharacteristics(sqlite3_file*);
 16485  static int recoverVfsShmMap(sqlite3_file*, int, int, int, void volatile**);
 16486  static int recoverVfsShmLock(sqlite3_file*, int offset, int n, int flags);
 16487  static void recoverVfsShmBarrier(sqlite3_file*);
 16488  static int recoverVfsShmUnmap(sqlite3_file*, int deleteFlag);
 16489  static int recoverVfsFetch(sqlite3_file*, sqlite3_int64, int, void**);
 16490  static int recoverVfsUnfetch(sqlite3_file *pFd, sqlite3_int64 iOff, void *p);
 16491  
 16492  static sqlite3_io_methods recover_methods = {
 16493    2, /* iVersion */
 16494    recoverVfsClose,
 16495    recoverVfsRead,
 16496    recoverVfsWrite,
 16497    recoverVfsTruncate,
 16498    recoverVfsSync,
 16499    recoverVfsFileSize,
 16500    recoverVfsLock,
 16501    recoverVfsUnlock,
 16502    recoverVfsCheckReservedLock,
 16503    recoverVfsFileControl,
 16504    recoverVfsSectorSize,
 16505    recoverVfsDeviceCharacteristics,
 16506    recoverVfsShmMap,
 16507    recoverVfsShmLock,
 16508    recoverVfsShmBarrier,
 16509    recoverVfsShmUnmap,
 16510    recoverVfsFetch,
 16511    recoverVfsUnfetch
 16512  };
 16513  
 16514  static int recoverVfsClose(sqlite3_file *pFd){
 16515    assert( pFd->pMethods!=&recover_methods );
 16516    return pFd->pMethods->xClose(pFd);
 16517  }
 16518  
 16519  /*
 16520  ** Write value v to buffer a[] as a 16-bit big-endian unsigned integer.
 16521  */
 16522  static void recoverPutU16(u8 *a, u32 v){
 16523    a[0] = (v>>8) & 0x00FF;
 16524    a[1] = (v>>0) & 0x00FF;
 16525  }
 16526  
 16527  /*
 16528  ** Write value v to buffer a[] as a 32-bit big-endian unsigned integer.
 16529  */
 16530  static void recoverPutU32(u8 *a, u32 v){
 16531    a[0] = (v>>24) & 0x00FF;
 16532    a[1] = (v>>16) & 0x00FF;
 16533    a[2] = (v>>8) & 0x00FF;
 16534    a[3] = (v>>0) & 0x00FF;
 16535  }
 16536  
 16537  /*
 16538  ** Detect the page-size of the database opened by file-handle pFd by 
 16539  ** searching the first part of the file for a well-formed SQLite b-tree 
 16540  ** page. If parameter nReserve is non-zero, then as well as searching for
 16541  ** a b-tree page with zero reserved bytes, this function searches for one
 16542  ** with nReserve reserved bytes at the end of it.
 16543  **
 16544  ** If successful, set variable p->detected_pgsz to the detected page-size
 16545  ** in bytes and return SQLITE_OK. Or, if no error occurs but no valid page
 16546  ** can be found, return SQLITE_OK but leave p->detected_pgsz set to 0. Or,
 16547  ** if an error occurs (e.g. an IO or OOM error), then an SQLite error code
 16548  ** is returned. The final value of p->detected_pgsz is undefined in this
 16549  ** case.
 16550  */
 16551  static int recoverVfsDetectPagesize(
 16552    sqlite3_recover *p,             /* Recover handle */
 16553    sqlite3_file *pFd,              /* File-handle open on input database */
 16554    u32 nReserve,                   /* Possible nReserve value */
 16555    i64 nSz                         /* Size of database file in bytes */
 16556  ){
 16557    int rc = SQLITE_OK;
 16558    const int nMin = 512;
 16559    const int nMax = 65536;
 16560    const int nMaxBlk = 4;
 16561    u32 pgsz = 0;
 16562    int iBlk = 0;
 16563    u8 *aPg = 0;
 16564    u8 *aTmp = 0;
 16565    int nBlk = 0;
 16566  
 16567    aPg = (u8*)sqlite3_malloc(2*nMax);
 16568    if( aPg==0 ) return SQLITE_NOMEM;
 16569    aTmp = &aPg[nMax];
 16570  
 16571    nBlk = (nSz+nMax-1)/nMax;
 16572    if( nBlk>nMaxBlk ) nBlk = nMaxBlk;
 16573  
 16574    do {
 16575      for(iBlk=0; rc==SQLITE_OK && iBlk<nBlk; iBlk++){
 16576        int nByte = (nSz>=((iBlk+1)*nMax)) ? nMax : (nSz % nMax);
 16577        memset(aPg, 0, nMax);
 16578        rc = pFd->pMethods->xRead(pFd, aPg, nByte, iBlk*nMax);
 16579        if( rc==SQLITE_OK ){
 16580          int pgsz2;
 16581          for(pgsz2=(pgsz ? pgsz*2 : nMin); pgsz2<=nMax; pgsz2=pgsz2*2){
 16582            int iOff;
 16583            for(iOff=0; iOff<nMax; iOff+=pgsz2){
 16584              if( recoverIsValidPage(aTmp, &aPg[iOff], pgsz2-nReserve) ){
 16585                pgsz = pgsz2;
 16586                break;
 16587              }
 16588            }
 16589          }
 16590        }
 16591      }
 16592      if( pgsz>(u32)p->detected_pgsz ){
 16593        p->detected_pgsz = pgsz;
 16594        p->nReserve = nReserve;
 16595      }
 16596      if( nReserve==0 ) break;
 16597      nReserve = 0;
 16598    }while( 1 );
 16599  
 16600    p->detected_pgsz = pgsz;
 16601    sqlite3_free(aPg);
 16602    return rc;
 16603  }
 16604  
 16605  /*
 16606  ** The xRead() method of the wrapper VFS. This is used to intercept calls
 16607  ** to read page 1 of the input database.
 16608  */
 16609  static int recoverVfsRead(sqlite3_file *pFd, void *aBuf, int nByte, i64 iOff){
 16610    int rc = SQLITE_OK;
 16611    if( pFd->pMethods==&recover_methods ){
 16612      pFd->pMethods = recover_g.pMethods;
 16613      rc = pFd->pMethods->xRead(pFd, aBuf, nByte, iOff);
 16614      if( nByte==16 ){
 16615        sqlite3_randomness(16, aBuf);
 16616      }else
 16617      if( rc==SQLITE_OK && iOff==0 && nByte>=108 ){
 16618        /* Ensure that the database has a valid header file. The only fields
 16619        ** that really matter to recovery are:
 16620        **
 16621        **   + Database page size (16-bits at offset 16)
 16622        **   + Size of db in pages (32-bits at offset 28)
 16623        **   + Database encoding (32-bits at offset 56)
 16624        **
 16625        ** Also preserved are:
 16626        **
 16627        **   + first freelist page (32-bits at offset 32)
 16628        **   + size of freelist (32-bits at offset 36)
 16629        **   + the wal-mode flags (16-bits at offset 18)
 16630        **
 16631        ** We also try to preserve the auto-vacuum, incr-value, user-version
 16632        ** and application-id fields - all 32 bit quantities at offsets 
 16633        ** 52, 60, 64 and 68. All other fields are set to known good values.
 16634        **
 16635        ** Byte offset 105 should also contain the page-size as a 16-bit 
 16636        ** integer.
 16637        */
 16638        const int aPreserve[] = {32, 36, 52, 60, 64, 68};
 16639        u8 aHdr[108] = {
 16640          0x53, 0x51, 0x4c, 0x69, 0x74, 0x65, 0x20, 0x66, 
 16641          0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x33, 0x00,
 16642          0xFF, 0xFF, 0x01, 0x01, 0x00, 0x40, 0x20, 0x20,
 16643          0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
 16644          0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
 16645          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
 16646          0x00, 0x00, 0x10, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
 16647          0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
 16648          0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
 16649          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 16650          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 16651          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 16652          0x00, 0x2e, 0x5b, 0x30,
 16653  
 16654          0x0D, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00
 16655        };
 16656        u8 *a = (u8*)aBuf;
 16657  
 16658        u32 pgsz = recoverGetU16(&a[16]);
 16659        u32 nReserve = a[20];
 16660        u32 enc = recoverGetU32(&a[56]);
 16661        u32 dbsz = 0;
 16662        i64 dbFileSize = 0;
 16663        int ii;
 16664        sqlite3_recover *p = recover_g.p;
 16665  
 16666        if( pgsz==0x01 ) pgsz = 65536;
 16667        rc = pFd->pMethods->xFileSize(pFd, &dbFileSize);
 16668  
 16669        if( rc==SQLITE_OK && p->detected_pgsz==0 ){
 16670          rc = recoverVfsDetectPagesize(p, pFd, nReserve, dbFileSize);
 16671        }
 16672        if( p->detected_pgsz ){
 16673          pgsz = p->detected_pgsz;
 16674          nReserve = p->nReserve;
 16675        }
 16676  
 16677        if( pgsz ){
 16678          dbsz = dbFileSize / pgsz;
 16679        }
 16680        if( enc!=SQLITE_UTF8 && enc!=SQLITE_UTF16BE && enc!=SQLITE_UTF16LE ){
 16681          enc = SQLITE_UTF8;
 16682        }
 16683  
 16684        sqlite3_free(p->pPage1Cache);
 16685        p->pPage1Cache = 0;
 16686        p->pPage1Disk = 0;
 16687  
 16688        p->pgsz = nByte;
 16689        p->pPage1Cache = (u8*)recoverMalloc(p, nByte*2);
 16690        if( p->pPage1Cache ){
 16691          p->pPage1Disk = &p->pPage1Cache[nByte];
 16692          memcpy(p->pPage1Disk, aBuf, nByte);
 16693          aHdr[18] = a[18];
 16694          aHdr[19] = a[19];
 16695          recoverPutU32(&aHdr[28], dbsz);
 16696          recoverPutU32(&aHdr[56], enc);
 16697          recoverPutU16(&aHdr[105], pgsz-nReserve);
 16698          if( pgsz==65536 ) pgsz = 1;
 16699          recoverPutU16(&aHdr[16], pgsz);
 16700          aHdr[20] = nReserve;
 16701          for(ii=0; ii<(int)(sizeof(aPreserve)/sizeof(aPreserve[0])); ii++){
 16702            memcpy(&aHdr[aPreserve[ii]], &a[aPreserve[ii]], 4);
 16703          }
 16704          memcpy(aBuf, aHdr, sizeof(aHdr));
 16705          memset(&((u8*)aBuf)[sizeof(aHdr)], 0, nByte-sizeof(aHdr));
 16706  
 16707          memcpy(p->pPage1Cache, aBuf, nByte);
 16708        }else{
 16709          rc = p->errCode;
 16710        }
 16711  
 16712      }
 16713      pFd->pMethods = &recover_methods;
 16714    }else{
 16715      rc = pFd->pMethods->xRead(pFd, aBuf, nByte, iOff);
 16716    }
 16717    return rc;
 16718  }
 16719  
 16720  /*
 16721  ** Used to make sqlite3_io_methods wrapper methods less verbose.
 16722  */
 16723  #define RECOVER_VFS_WRAPPER(code)                         \
 16724    int rc = SQLITE_OK;                                     \
 16725    if( pFd->pMethods==&recover_methods ){                  \
 16726      pFd->pMethods = recover_g.pMethods;                   \
 16727      rc = code;                                            \
 16728      pFd->pMethods = &recover_methods;                     \
 16729    }else{                                                  \
 16730      rc = code;                                            \
 16731    }                                                       \
 16732    return rc;                                              
 16733  
 16734  /*
 16735  ** Methods of the wrapper VFS. All methods except for xRead() and xClose()
 16736  ** simply uninstall the sqlite3_io_methods wrapper, invoke the equivalent
 16737  ** method on the lower level VFS, then reinstall the wrapper before returning.
 16738  ** Those that return an integer value use the RECOVER_VFS_WRAPPER macro.
 16739  */
 16740  static int recoverVfsWrite(
 16741    sqlite3_file *pFd, const void *aBuf, int nByte, i64 iOff
 16742  ){
 16743    RECOVER_VFS_WRAPPER (
 16744        pFd->pMethods->xWrite(pFd, aBuf, nByte, iOff)
 16745    );
 16746  }
 16747  static int recoverVfsTruncate(sqlite3_file *pFd, sqlite3_int64 size){
 16748    RECOVER_VFS_WRAPPER (
 16749        pFd->pMethods->xTruncate(pFd, size)
 16750    );
 16751  }
 16752  static int recoverVfsSync(sqlite3_file *pFd, int flags){
 16753    RECOVER_VFS_WRAPPER (
 16754        pFd->pMethods->xSync(pFd, flags)
 16755    );
 16756  }
 16757  static int recoverVfsFileSize(sqlite3_file *pFd, sqlite3_int64 *pSize){
 16758    RECOVER_VFS_WRAPPER (
 16759        pFd->pMethods->xFileSize(pFd, pSize)
 16760    );
 16761  }
 16762  static int recoverVfsLock(sqlite3_file *pFd, int eLock){
 16763    RECOVER_VFS_WRAPPER (
 16764        pFd->pMethods->xLock(pFd, eLock)
 16765    );
 16766  }
 16767  static int recoverVfsUnlock(sqlite3_file *pFd, int eLock){
 16768    RECOVER_VFS_WRAPPER (
 16769        pFd->pMethods->xUnlock(pFd, eLock)
 16770    );
 16771  }
 16772  static int recoverVfsCheckReservedLock(sqlite3_file *pFd, int *pResOut){
 16773    RECOVER_VFS_WRAPPER (
 16774        pFd->pMethods->xCheckReservedLock(pFd, pResOut)
 16775    );
 16776  }
 16777  static int recoverVfsFileControl(sqlite3_file *pFd, int op, void *pArg){
 16778    RECOVER_VFS_WRAPPER (
 16779      (pFd->pMethods ?  pFd->pMethods->xFileControl(pFd, op, pArg) : SQLITE_NOTFOUND)
 16780    );
 16781  }
 16782  static int recoverVfsSectorSize(sqlite3_file *pFd){
 16783    RECOVER_VFS_WRAPPER (
 16784        pFd->pMethods->xSectorSize(pFd)
 16785    );
 16786  }
 16787  static int recoverVfsDeviceCharacteristics(sqlite3_file *pFd){
 16788    RECOVER_VFS_WRAPPER (
 16789        pFd->pMethods->xDeviceCharacteristics(pFd)
 16790    );
 16791  }
 16792  static int recoverVfsShmMap(
 16793    sqlite3_file *pFd, int iPg, int pgsz, int bExtend, void volatile **pp
 16794  ){
 16795    RECOVER_VFS_WRAPPER (
 16796        pFd->pMethods->xShmMap(pFd, iPg, pgsz, bExtend, pp)
 16797    );
 16798  }
 16799  static int recoverVfsShmLock(sqlite3_file *pFd, int offset, int n, int flags){
 16800    RECOVER_VFS_WRAPPER (
 16801        pFd->pMethods->xShmLock(pFd, offset, n, flags)
 16802    );
 16803  }
 16804  static void recoverVfsShmBarrier(sqlite3_file *pFd){
 16805    if( pFd->pMethods==&recover_methods ){
 16806      pFd->pMethods = recover_g.pMethods;
 16807      pFd->pMethods->xShmBarrier(pFd);
 16808      pFd->pMethods = &recover_methods;
 16809    }else{
 16810      pFd->pMethods->xShmBarrier(pFd);
 16811    }
 16812  }
 16813  static int recoverVfsShmUnmap(sqlite3_file *pFd, int deleteFlag){
 16814    RECOVER_VFS_WRAPPER (
 16815        pFd->pMethods->xShmUnmap(pFd, deleteFlag)
 16816    );
 16817  }
 16818  
 16819  static int recoverVfsFetch(
 16820    sqlite3_file *pFd, 
 16821    sqlite3_int64 iOff, 
 16822    int iAmt, 
 16823    void **pp
 16824  ){
 16825    (void)pFd;
 16826    (void)iOff;
 16827    (void)iAmt;
 16828    *pp = 0;
 16829    return SQLITE_OK;
 16830  }
 16831  static int recoverVfsUnfetch(sqlite3_file *pFd, sqlite3_int64 iOff, void *p){
 16832    (void)pFd;
 16833    (void)iOff;
 16834    (void)p;
 16835    return SQLITE_OK;
 16836  }
 16837  
 16838  /*
 16839  ** Install the VFS wrapper around the file-descriptor open on the input
 16840  ** database for recover handle p. Mutex RECOVER_MUTEX_ID must be held
 16841  ** when this function is called.
 16842  */
 16843  static void recoverInstallWrapper(sqlite3_recover *p){
 16844    sqlite3_file *pFd = 0;
 16845    assert( recover_g.pMethods==0 );
 16846    recoverAssertMutexHeld();
 16847    sqlite3_file_control(p->dbIn, p->zDb, SQLITE_FCNTL_FILE_POINTER, (void*)&pFd);
 16848    assert( pFd==0 || pFd->pMethods!=&recover_methods );
 16849    if( pFd && pFd->pMethods ){
 16850      int iVersion = 1 + (pFd->pMethods->iVersion>1 && pFd->pMethods->xShmMap!=0);
 16851      recover_g.pMethods = pFd->pMethods;
 16852      recover_g.p = p;
 16853      recover_methods.iVersion = iVersion;
 16854      pFd->pMethods = &recover_methods;
 16855    }
 16856  }
 16857  
 16858  /*
 16859  ** Uninstall the VFS wrapper that was installed around the file-descriptor open
 16860  ** on the input database for recover handle p. Mutex RECOVER_MUTEX_ID must be
 16861  ** held when this function is called.
 16862  */
 16863  static void recoverUninstallWrapper(sqlite3_recover *p){
 16864    sqlite3_file *pFd = 0;
 16865    recoverAssertMutexHeld();
 16866    sqlite3_file_control(p->dbIn, p->zDb,SQLITE_FCNTL_FILE_POINTER,(void*)&pFd);
 16867    if( pFd && pFd->pMethods ){
 16868      pFd->pMethods = recover_g.pMethods;
 16869      recover_g.pMethods = 0;
 16870      recover_g.p = 0;
 16871    }
 16872  }
 16873  
 16874  /*
 16875  ** This function does the work of a single sqlite3_recover_step() call. It
 16876  ** is guaranteed that the handle is not in an error state when this
 16877  ** function is called.
 16878  */
 16879  static void recoverStep(sqlite3_recover *p){
 16880    assert( p && p->errCode==SQLITE_OK );
 16881    switch( p->eState ){
 16882      case RECOVER_STATE_INIT:
 16883        /* This is the very first call to sqlite3_recover_step() on this object.
 16884        */
 16885        recoverSqlCallback(p, "BEGIN");
 16886        recoverSqlCallback(p, "PRAGMA writable_schema = on");
 16887  
 16888        recoverEnterMutex();
 16889        recoverInstallWrapper(p);
 16890  
 16891        /* Open the output database. And register required virtual tables and 
 16892        ** user functions with the new handle. */
 16893        recoverOpenOutput(p);
 16894  
 16895        /* Open transactions on both the input and output databases. */
 16896        sqlite3_file_control(p->dbIn, p->zDb, SQLITE_FCNTL_RESET_CACHE, 0);
 16897        recoverExec(p, p->dbIn, "PRAGMA writable_schema = on");
 16898        recoverExec(p, p->dbIn, "BEGIN");
 16899        if( p->errCode==SQLITE_OK ) p->bCloseTransaction = 1;
 16900        recoverExec(p, p->dbIn, "SELECT 1 FROM sqlite_schema");
 16901        recoverTransferSettings(p);
 16902        recoverOpenRecovery(p);
 16903        recoverCacheSchema(p);
 16904  
 16905        recoverUninstallWrapper(p);
 16906        recoverLeaveMutex();
 16907  
 16908        recoverExec(p, p->dbOut, "BEGIN");
 16909  
 16910        recoverWriteSchema1(p);
 16911        p->eState = RECOVER_STATE_WRITING;
 16912        break;
 16913        
 16914      case RECOVER_STATE_WRITING: {
 16915        if( p->w1.pTbls==0 ){
 16916          recoverWriteDataInit(p);
 16917        }
 16918        if( SQLITE_DONE==recoverWriteDataStep(p) ){
 16919          recoverWriteDataCleanup(p);
 16920          if( p->zLostAndFound ){
 16921            p->eState = RECOVER_STATE_LOSTANDFOUND1;
 16922          }else{
 16923            p->eState = RECOVER_STATE_SCHEMA2;
 16924          }
 16925        }
 16926        break;
 16927      }
 16928  
 16929      case RECOVER_STATE_LOSTANDFOUND1: {
 16930        if( p->laf.pUsed==0 ){
 16931          recoverLostAndFound1Init(p);
 16932        }
 16933        if( SQLITE_DONE==recoverLostAndFound1Step(p) ){
 16934          p->eState = RECOVER_STATE_LOSTANDFOUND2;
 16935        }
 16936        break;
 16937      }
 16938      case RECOVER_STATE_LOSTANDFOUND2: {
 16939        if( p->laf.pAllAndParent==0 ){
 16940          recoverLostAndFound2Init(p);
 16941        }
 16942        if( SQLITE_DONE==recoverLostAndFound2Step(p) ){
 16943          p->eState = RECOVER_STATE_LOSTANDFOUND3;
 16944        }
 16945        break;
 16946      }
 16947  
 16948      case RECOVER_STATE_LOSTANDFOUND3: {
 16949        if( p->laf.pInsert==0 ){
 16950          recoverLostAndFound3Init(p);
 16951        }
 16952        if( SQLITE_DONE==recoverLostAndFound3Step(p) ){
 16953          p->eState = RECOVER_STATE_SCHEMA2;
 16954        }
 16955        break;
 16956      }
 16957  
 16958      case RECOVER_STATE_SCHEMA2: {
 16959        int rc = SQLITE_OK;
 16960  
 16961        recoverWriteSchema2(p);
 16962        p->eState = RECOVER_STATE_DONE;
 16963  
 16964        /* If no error has occurred, commit the write transaction on the output
 16965        ** database. Regardless of whether or not an error has occurred, make
 16966        ** an attempt to end the read transaction on the input database.  */
 16967        recoverExec(p, p->dbOut, "COMMIT");
 16968        rc = sqlite3_exec(p->dbIn, "END", 0, 0, 0);
 16969        if( p->errCode==SQLITE_OK ) p->errCode = rc;
 16970  
 16971        recoverSqlCallback(p, "PRAGMA writable_schema = off");
 16972        recoverSqlCallback(p, "COMMIT");
 16973        p->eState = RECOVER_STATE_DONE;
 16974        recoverFinalCleanup(p);
 16975        break;
 16976      };
 16977  
 16978      case RECOVER_STATE_DONE: {
 16979        /* no-op */
 16980        break;
 16981      };
 16982    }
 16983  }
 16984  
 16985  
 16986  /*
 16987  ** This is a worker function that does the heavy lifting for both init
 16988  ** functions:
 16989  **
 16990  **     sqlite3_recover_init()
 16991  **     sqlite3_recover_init_sql()
 16992  **
 16993  ** All this function does is allocate space for the recover handle and
 16994  ** take copies of the input parameters. All the real work is done within
 16995  ** sqlite3_recover_run().
 16996  */
 16997  sqlite3_recover *recoverInit(
 16998    sqlite3* db, 
 16999    const char *zDb, 
 17000    const char *zUri,               /* Output URI for _recover_init() */
 17001    int (*xSql)(void*, const char*),/* SQL callback for _recover_init_sql() */
 17002    void *pSqlCtx                   /* Context arg for _recover_init_sql() */
 17003  ){
 17004    sqlite3_recover *pRet = 0;
 17005    int nDb = 0;
 17006    int nUri = 0;
 17007    int nByte = 0;
 17008  
 17009    if( zDb==0 ){ zDb = "main"; }
 17010  
 17011    nDb = recoverStrlen(zDb);
 17012    nUri = recoverStrlen(zUri);
 17013  
 17014    nByte = sizeof(sqlite3_recover) + nDb+1 + nUri+1;
 17015    pRet = (sqlite3_recover*)sqlite3_malloc(nByte);
 17016    if( pRet ){
 17017      memset(pRet, 0, nByte);
 17018      pRet->dbIn = db;
 17019      pRet->zDb = (char*)&pRet[1];
 17020      pRet->zUri = &pRet->zDb[nDb+1];
 17021      memcpy(pRet->zDb, zDb, nDb);
 17022      if( nUri>0 && zUri ) memcpy(pRet->zUri, zUri, nUri);
 17023      pRet->xSql = xSql;
 17024      pRet->pSqlCtx = pSqlCtx;
 17025      pRet->bRecoverRowid = RECOVER_ROWID_DEFAULT;
 17026    }
 17027  
 17028    return pRet;
 17029  }
 17030  
 17031  /*
 17032  ** Initialize a recovery handle that creates a new database containing
 17033  ** the recovered data.
 17034  */
 17035  sqlite3_recover *sqlite3_recover_init(
 17036    sqlite3* db, 
 17037    const char *zDb, 
 17038    const char *zUri
 17039  ){
 17040    return recoverInit(db, zDb, zUri, 0, 0);
 17041  }
 17042  
 17043  /*
 17044  ** Initialize a recovery handle that returns recovered data in the
 17045  ** form of SQL statements via a callback.
 17046  */
 17047  sqlite3_recover *sqlite3_recover_init_sql(
 17048    sqlite3* db, 
 17049    const char *zDb, 
 17050    int (*xSql)(void*, const char*),
 17051    void *pSqlCtx
 17052  ){
 17053    return recoverInit(db, zDb, 0, xSql, pSqlCtx);
 17054  }
 17055  
 17056  /*
 17057  ** Return the handle error message, if any.
 17058  */
 17059  const char *sqlite3_recover_errmsg(sqlite3_recover *p){
 17060    return (p && p->errCode!=SQLITE_NOMEM) ? p->zErrMsg : "out of memory";
 17061  }
 17062  
 17063  /*
 17064  ** Return the handle error code.
 17065  */
 17066  int sqlite3_recover_errcode(sqlite3_recover *p){
 17067    return p ? p->errCode : SQLITE_NOMEM;
 17068  }
 17069  
 17070  /*
 17071  ** Configure the handle.
 17072  */
 17073  int sqlite3_recover_config(sqlite3_recover *p, int op, void *pArg){
 17074    int rc = SQLITE_OK;
 17075    if( p==0 ){
 17076      rc = SQLITE_NOMEM;
 17077    }else if( p->eState!=RECOVER_STATE_INIT ){
 17078      rc = SQLITE_MISUSE;
 17079    }else{
 17080      switch( op ){
 17081        case 789:
 17082          /* This undocumented magic configuration option is used to set the
 17083          ** name of the auxiliary database that is ATTACH-ed to the database
 17084          ** connection and used to hold state information during the
 17085          ** recovery process.  This option is for debugging use only and
 17086          ** is subject to change or removal at any time. */
 17087          sqlite3_free(p->zStateDb);
 17088          p->zStateDb = recoverMPrintf(p, "%s", (char*)pArg);
 17089          break;
 17090  
 17091        case SQLITE_RECOVER_LOST_AND_FOUND: {
 17092          const char *zArg = (const char*)pArg;
 17093          sqlite3_free(p->zLostAndFound);
 17094          if( zArg ){
 17095            p->zLostAndFound = recoverMPrintf(p, "%s", zArg);
 17096          }else{
 17097            p->zLostAndFound = 0;
 17098          }
 17099          break;
 17100        }
 17101  
 17102        case SQLITE_RECOVER_FREELIST_CORRUPT:
 17103          p->bFreelistCorrupt = *(int*)pArg;
 17104          break;
 17105  
 17106        case SQLITE_RECOVER_ROWIDS:
 17107          p->bRecoverRowid = *(int*)pArg;
 17108          break;
 17109  
 17110        case SQLITE_RECOVER_SLOWINDEXES:
 17111          p->bSlowIndexes = *(int*)pArg;
 17112          break;
 17113  
 17114        default:
 17115          rc = SQLITE_NOTFOUND;
 17116          break;
 17117      }
 17118    }
 17119  
 17120    return rc;
 17121  }
 17122  
 17123  /*
 17124  ** Do a unit of work towards the recovery job. Return SQLITE_OK if
 17125  ** no error has occurred but database recovery is not finished, SQLITE_DONE
 17126  ** if database recovery has been successfully completed, or an SQLite
 17127  ** error code if an error has occurred.
 17128  */
 17129  int sqlite3_recover_step(sqlite3_recover *p){
 17130    if( p==0 ) return SQLITE_NOMEM;
 17131    if( p->errCode==SQLITE_OK ) recoverStep(p);
 17132    if( p->eState==RECOVER_STATE_DONE && p->errCode==SQLITE_OK ){
 17133      return SQLITE_DONE;
 17134    }
 17135    return p->errCode;
 17136  }
 17137  
 17138  /*
 17139  ** Do the configured recovery operation. Return SQLITE_OK if successful, or
 17140  ** else an SQLite error code.
 17141  */
 17142  int sqlite3_recover_run(sqlite3_recover *p){
 17143    while( SQLITE_OK==sqlite3_recover_step(p) );
 17144    return sqlite3_recover_errcode(p);
 17145  }
 17146  
 17147  
 17148  /*
 17149  ** Free all resources associated with the recover handle passed as the only
 17150  ** argument. The results of using a handle with any sqlite3_recover_**
 17151  ** API function after it has been passed to this function are undefined.
 17152  **
 17153  ** A copy of the value returned by the first call made to sqlite3_recover_run()
 17154  ** on this handle is returned, or SQLITE_OK if sqlite3_recover_run() has
 17155  ** not been called on this handle.
 17156  */
 17157  int sqlite3_recover_finish(sqlite3_recover *p){
 17158    int rc;
 17159    if( p==0 ){
 17160      rc = SQLITE_NOMEM;
 17161    }else{
 17162      recoverFinalCleanup(p);
 17163      if( p->bCloseTransaction && sqlite3_get_autocommit(p->dbIn)==0 ){
 17164        rc = sqlite3_exec(p->dbIn, "END", 0, 0, 0);
 17165        if( p->errCode==SQLITE_OK ) p->errCode = rc;
 17166      }
 17167      rc = p->errCode;
 17168      sqlite3_free(p->zErrMsg);
 17169      sqlite3_free(p->zStateDb);
 17170      sqlite3_free(p->zLostAndFound);
 17171      sqlite3_free(p->pPage1Cache);
 17172      sqlite3_free(p);
 17173    }
 17174    return rc;
 17175  }
 17176  
 17177  #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
 17178  
 17179  /************************* End ../ext/recover/sqlite3recover.c ********************/
 17180  # endif /* SQLITE_HAVE_SQLITE3R */
 17181  #endif
 17182  #ifdef SQLITE_SHELL_EXTSRC
 17183  # include SHELL_STRINGIFY(SQLITE_SHELL_EXTSRC)
 17184  #endif
 17185  
 17186  #if defined(SQLITE_ENABLE_SESSION)
 17187  /*
 17188  ** State information for a single open session
 17189  */
 17190  typedef struct OpenSession OpenSession;
 17191  struct OpenSession {
 17192    char *zName;             /* Symbolic name for this session */
 17193    int nFilter;             /* Number of xFilter rejection GLOB patterns */
 17194    char **azFilter;         /* Array of xFilter rejection GLOB patterns */
 17195    sqlite3_session *p;      /* The open session */
 17196  };
 17197  #endif
 17198  
 17199  typedef struct ExpertInfo ExpertInfo;
 17200  struct ExpertInfo {
 17201    sqlite3expert *pExpert;
 17202    int bVerbose;
 17203  };
 17204  
 17205  /* A single line in the EQP output */
 17206  typedef struct EQPGraphRow EQPGraphRow;
 17207  struct EQPGraphRow {
 17208    int iEqpId;           /* ID for this row */
 17209    int iParentId;        /* ID of the parent row */
 17210    EQPGraphRow *pNext;   /* Next row in sequence */
 17211    char zText[1];        /* Text to display for this row */
 17212  };
 17213  
 17214  /* All EQP output is collected into an instance of the following */
 17215  typedef struct EQPGraph EQPGraph;
 17216  struct EQPGraph {
 17217    EQPGraphRow *pRow;    /* Linked list of all rows of the EQP output */
 17218    EQPGraphRow *pLast;   /* Last element of the pRow list */
 17219    char zPrefix[100];    /* Graph prefix */
 17220  };
 17221  
 17222  /* Parameters affecting columnar mode result display (defaulting together) */
 17223  typedef struct ColModeOpts {
 17224    int iWrap;            /* In columnar modes, wrap lines reaching this limit */
 17225    u8 bQuote;            /* Quote results for .mode box and table */
 17226    u8 bWordWrap;         /* In columnar modes, wrap at word boundaries  */
 17227  } ColModeOpts;
 17228  #define ColModeOpts_default { 60, 0, 0 }
 17229  #define ColModeOpts_default_qbox { 60, 1, 0 }
 17230  
 17231  /*
 17232  ** State information about the database connection is contained in an
 17233  ** instance of the following structure.
 17234  */
 17235  typedef struct ShellState ShellState;
 17236  struct ShellState {
 17237    sqlite3 *db;           /* The database */
 17238    u8 autoExplain;        /* Automatically turn on .explain mode */
 17239    u8 autoEQP;            /* Run EXPLAIN QUERY PLAN prior to each SQL stmt */
 17240    u8 autoEQPtest;        /* autoEQP is in test mode */
 17241    u8 autoEQPtrace;       /* autoEQP is in trace mode */
 17242    u8 scanstatsOn;        /* True to display scan stats before each finalize */
 17243    u8 openMode;           /* SHELL_OPEN_NORMAL, _APPENDVFS, or _ZIPFILE */
 17244    u8 doXdgOpen;          /* Invoke start/open/xdg-open in output_reset() */
 17245    u8 nEqpLevel;          /* Depth of the EQP output graph */
 17246    u8 eTraceType;         /* SHELL_TRACE_* value for type of trace */
 17247    u8 bSafeMode;          /* True to prohibit unsafe operations */
 17248    u8 bSafeModePersist;   /* The long-term value of bSafeMode */
 17249    ColModeOpts cmOpts;    /* Option values affecting columnar mode output */
 17250    unsigned statsOn;      /* True to display memory stats before each finalize */
 17251    unsigned mEqpLines;    /* Mask of vertical lines in the EQP output graph */
 17252    int inputNesting;      /* Track nesting level of .read and other redirects */
 17253    int outCount;          /* Revert to stdout when reaching zero */
 17254    int cnt;               /* Number of records displayed so far */
 17255    int lineno;            /* Line number of last line read from in */
 17256    int openFlags;         /* Additional flags to open.  (SQLITE_OPEN_NOFOLLOW) */
 17257    FILE *in;              /* Read commands from this stream */
 17258    FILE *out;             /* Write results here */
 17259    FILE *traceOut;        /* Output for sqlite3_trace() */
 17260    int nErr;              /* Number of errors seen */
 17261    int mode;              /* An output mode setting */
 17262    int modePrior;         /* Saved mode */
 17263    int cMode;             /* temporary output mode for the current query */
 17264    int normalMode;        /* Output mode before ".explain on" */
 17265    int writableSchema;    /* True if PRAGMA writable_schema=ON */
 17266    int showHeader;        /* True to show column names in List or Column mode */
 17267    int nCheck;            /* Number of ".check" commands run */
 17268    unsigned nProgress;    /* Number of progress callbacks encountered */
 17269    unsigned mxProgress;   /* Maximum progress callbacks before failing */
 17270    unsigned flgProgress;  /* Flags for the progress callback */
 17271    unsigned shellFlgs;    /* Various flags */
 17272    unsigned priorShFlgs;  /* Saved copy of flags */
 17273    sqlite3_int64 szMax;   /* --maxsize argument to .open */
 17274    char *zDestTable;      /* Name of destination table when MODE_Insert */
 17275    char *zTempFile;       /* Temporary file that might need deleting */
 17276    char zTestcase[30];    /* Name of current test case */
 17277    char colSeparator[20]; /* Column separator character for several modes */
 17278    char rowSeparator[20]; /* Row separator character for MODE_Ascii */
 17279    char colSepPrior[20];  /* Saved column separator */
 17280    char rowSepPrior[20];  /* Saved row separator */
 17281    int *colWidth;         /* Requested width of each column in columnar modes */
 17282    int *actualWidth;      /* Actual width of each column */
 17283    int nWidth;            /* Number of slots in colWidth[] and actualWidth[] */
 17284    char nullValue[20];    /* The text to print when a NULL comes back from
 17285                           ** the database */
 17286    char outfile[FILENAME_MAX]; /* Filename for *out */
 17287    sqlite3_stmt *pStmt;   /* Current statement if any. */
 17288    FILE *pLog;            /* Write log output here */
 17289    struct AuxDb {         /* Storage space for auxiliary database connections */
 17290      sqlite3 *db;               /* Connection pointer */
 17291      const char *zDbFilename;   /* Filename used to open the connection */
 17292      char *zFreeOnClose;        /* Free this memory allocation on close */
 17293  #if defined(SQLITE_ENABLE_SESSION)
 17294      int nSession;              /* Number of active sessions */
 17295      OpenSession aSession[4];   /* Array of sessions.  [0] is in focus. */
 17296  #endif
 17297    } aAuxDb[5],           /* Array of all database connections */
 17298      *pAuxDb;             /* Currently active database connection */
 17299    int *aiIndent;         /* Array of indents used in MODE_Explain */
 17300    int nIndent;           /* Size of array aiIndent[] */
 17301    int iIndent;           /* Index of current op in aiIndent[] */
 17302    char *zNonce;          /* Nonce for temporary safe-mode escapes */
 17303    EQPGraph sGraph;       /* Information for the graphical EXPLAIN QUERY PLAN */
 17304    ExpertInfo expert;     /* Valid if previous command was ".expert OPT..." */
 17305  #ifdef SQLITE_SHELL_FIDDLE
 17306    struct {
 17307      const char * zInput; /* Input string from wasm/JS proxy */
 17308      const char * zPos;   /* Cursor pos into zInput */
 17309      const char * zDefaultDbName; /* Default name for db file */
 17310    } wasm;
 17311  #endif
 17312  };
 17313  
 17314  #ifdef SQLITE_SHELL_FIDDLE
 17315  static ShellState shellState;
 17316  #endif
 17317  
 17318  
 17319  /* Allowed values for ShellState.autoEQP
 17320  */
 17321  #define AUTOEQP_off      0           /* Automatic EXPLAIN QUERY PLAN is off */
 17322  #define AUTOEQP_on       1           /* Automatic EQP is on */
 17323  #define AUTOEQP_trigger  2           /* On and also show plans for triggers */
 17324  #define AUTOEQP_full     3           /* Show full EXPLAIN */
 17325  
 17326  /* Allowed values for ShellState.openMode
 17327  */
 17328  #define SHELL_OPEN_UNSPEC      0      /* No open-mode specified */
 17329  #define SHELL_OPEN_NORMAL      1      /* Normal database file */
 17330  #define SHELL_OPEN_APPENDVFS   2      /* Use appendvfs */
 17331  #define SHELL_OPEN_ZIPFILE     3      /* Use the zipfile virtual table */
 17332  #define SHELL_OPEN_READONLY    4      /* Open a normal database read-only */
 17333  #define SHELL_OPEN_DESERIALIZE 5      /* Open using sqlite3_deserialize() */
 17334  #define SHELL_OPEN_HEXDB       6      /* Use "dbtotxt" output as data source */
 17335  
 17336  /* Allowed values for ShellState.eTraceType
 17337  */
 17338  #define SHELL_TRACE_PLAIN      0      /* Show input SQL text */
 17339  #define SHELL_TRACE_EXPANDED   1      /* Show expanded SQL text */
 17340  #define SHELL_TRACE_NORMALIZED 2      /* Show normalized SQL text */
 17341  
 17342  /* Bits in the ShellState.flgProgress variable */
 17343  #define SHELL_PROGRESS_QUIET 0x01  /* Omit announcing every progress callback */
 17344  #define SHELL_PROGRESS_RESET 0x02  /* Reset the count when the progress
 17345                                     ** callback limit is reached, and for each
 17346                                     ** top-level SQL statement */
 17347  #define SHELL_PROGRESS_ONCE  0x04  /* Cancel the --limit after firing once */
 17348  
 17349  /*
 17350  ** These are the allowed shellFlgs values
 17351  */
 17352  #define SHFLG_Pagecache      0x00000001 /* The --pagecache option is used */
 17353  #define SHFLG_Lookaside      0x00000002 /* Lookaside memory is used */
 17354  #define SHFLG_Backslash      0x00000004 /* The --backslash option is used */
 17355  #define SHFLG_PreserveRowid  0x00000008 /* .dump preserves rowid values */
 17356  #define SHFLG_Newlines       0x00000010 /* .dump --newline flag */
 17357  #define SHFLG_CountChanges   0x00000020 /* .changes setting */
 17358  #define SHFLG_Echo           0x00000040 /* .echo on/off, or --echo setting */
 17359  #define SHFLG_HeaderSet      0x00000080 /* showHeader has been specified */
 17360  #define SHFLG_DumpDataOnly   0x00000100 /* .dump show data only */
 17361  #define SHFLG_DumpNoSys      0x00000200 /* .dump omits system tables */
 17362  #define SHFLG_TestingMode    0x00000400 /* allow unsafe testing features */
 17363  
 17364  /*
 17365  ** Macros for testing and setting shellFlgs
 17366  */
 17367  #define ShellHasFlag(P,X)    (((P)->shellFlgs & (X))!=0)
 17368  #define ShellSetFlag(P,X)    ((P)->shellFlgs|=(X))
 17369  #define ShellClearFlag(P,X)  ((P)->shellFlgs&=(~(X)))
 17370  
 17371  /*
 17372  ** These are the allowed modes.
 17373  */
 17374  #define MODE_Line     0  /* One column per line.  Blank line between records */
 17375  #define MODE_Column   1  /* One record per line in neat columns */
 17376  #define MODE_List     2  /* One record per line with a separator */
 17377  #define MODE_Semi     3  /* Same as MODE_List but append ";" to each line */
 17378  #define MODE_Html     4  /* Generate an XHTML table */
 17379  #define MODE_Insert   5  /* Generate SQL "insert" statements */
 17380  #define MODE_Quote    6  /* Quote values as for SQL */
 17381  #define MODE_Tcl      7  /* Generate ANSI-C or TCL quoted elements */
 17382  #define MODE_Csv      8  /* Quote strings, numbers are plain */
 17383  #define MODE_Explain  9  /* Like MODE_Column, but do not truncate data */
 17384  #define MODE_Ascii   10  /* Use ASCII unit and record separators (0x1F/0x1E) */
 17385  #define MODE_Pretty  11  /* Pretty-print schemas */
 17386  #define MODE_EQP     12  /* Converts EXPLAIN QUERY PLAN output into a graph */
 17387  #define MODE_Json    13  /* Output JSON */
 17388  #define MODE_Markdown 14 /* Markdown formatting */
 17389  #define MODE_Table   15  /* MySQL-style table formatting */
 17390  #define MODE_Box     16  /* Unicode box-drawing characters */
 17391  #define MODE_Count   17  /* Output only a count of the rows of output */
 17392  #define MODE_Off     18  /* No query output shown */
 17393  #define MODE_ScanExp 19  /* Like MODE_Explain, but for ".scanstats vm" */
 17394  
 17395  static const char *modeDescr[] = {
 17396    "line",
 17397    "column",
 17398    "list",
 17399    "semi",
 17400    "html",
 17401    "insert",
 17402    "quote",
 17403    "tcl",
 17404    "csv",
 17405    "explain",
 17406    "ascii",
 17407    "prettyprint",
 17408    "eqp",
 17409    "json",
 17410    "markdown",
 17411    "table",
 17412    "box",
 17413    "count",
 17414    "off"
 17415  };
 17416  
 17417  /*
 17418  ** These are the column/row/line separators used by the various
 17419  ** import/export modes.
 17420  */
 17421  #define SEP_Column    "|"
 17422  #define SEP_Row       "\n"
 17423  #define SEP_Tab       "\t"
 17424  #define SEP_Space     " "
 17425  #define SEP_Comma     ","
 17426  #define SEP_CrLf      "\r\n"
 17427  #define SEP_Unit      "\x1F"
 17428  #define SEP_Record    "\x1E"
 17429  
 17430  /*
 17431  ** Limit input nesting via .read or any other input redirect.
 17432  ** It's not too expensive, so a generous allowance can be made.
 17433  */
 17434  #define MAX_INPUT_NESTING 25
 17435  
 17436  /*
 17437  ** A callback for the sqlite3_log() interface.
 17438  */
 17439  static void shellLog(void *pArg, int iErrCode, const char *zMsg){
 17440    ShellState *p = (ShellState*)pArg;
 17441    if( p->pLog==0 ) return;
 17442    utf8_printf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
 17443    fflush(p->pLog);
 17444  }
 17445  
 17446  /*
 17447  ** SQL function:  shell_putsnl(X)
 17448  **
 17449  ** Write the text X to the screen (or whatever output is being directed)
 17450  ** adding a newline at the end, and then return X.
 17451  */
 17452  static void shellPutsFunc(
 17453    sqlite3_context *pCtx,
 17454    int nVal,
 17455    sqlite3_value **apVal
 17456  ){
 17457    ShellState *p = (ShellState*)sqlite3_user_data(pCtx);
 17458    (void)nVal;
 17459    utf8_printf(p->out, "%s\n", sqlite3_value_text(apVal[0]));
 17460    sqlite3_result_value(pCtx, apVal[0]);
 17461  }
 17462  
 17463  /*
 17464  ** If in safe mode, print an error message described by the arguments
 17465  ** and exit immediately.
 17466  */
 17467  static void failIfSafeMode(
 17468    ShellState *p,
 17469    const char *zErrMsg,
 17470    ...
 17471  ){
 17472    if( p->bSafeMode ){
 17473      va_list ap;
 17474      char *zMsg;
 17475      va_start(ap, zErrMsg);
 17476      zMsg = sqlite3_vmprintf(zErrMsg, ap);
 17477      va_end(ap);
 17478      raw_printf(stderr, "line %d: ", p->lineno);
 17479      utf8_printf(stderr, "%s\n", zMsg);
 17480      exit(1);
 17481    }
 17482  }
 17483  
 17484  /*
 17485  ** SQL function:   edit(VALUE)
 17486  **                 edit(VALUE,EDITOR)
 17487  **
 17488  ** These steps:
 17489  **
 17490  **     (1) Write VALUE into a temporary file.
 17491  **     (2) Run program EDITOR on that temporary file.
 17492  **     (3) Read the temporary file back and return its content as the result.
 17493  **     (4) Delete the temporary file
 17494  **
 17495  ** If the EDITOR argument is omitted, use the value in the VISUAL
 17496  ** environment variable.  If still there is no EDITOR, through an error.
 17497  **
 17498  ** Also throw an error if the EDITOR program returns a non-zero exit code.
 17499  */
 17500  #ifndef SQLITE_NOHAVE_SYSTEM
 17501  static void editFunc(
 17502    sqlite3_context *context,
 17503    int argc,
 17504    sqlite3_value **argv
 17505  ){
 17506    const char *zEditor;
 17507    char *zTempFile = 0;
 17508    sqlite3 *db;
 17509    char *zCmd = 0;
 17510    int bBin;
 17511    int rc;
 17512    int hasCRNL = 0;
 17513    FILE *f = 0;
 17514    sqlite3_int64 sz;
 17515    sqlite3_int64 x;
 17516    unsigned char *p = 0;
 17517  
 17518    if( argc==2 ){
 17519      zEditor = (const char*)sqlite3_value_text(argv[1]);
 17520    }else{
 17521      zEditor = getenv("VISUAL");
 17522    }
 17523    if( zEditor==0 ){
 17524      sqlite3_result_error(context, "no editor for edit()", -1);
 17525      return;
 17526    }
 17527    if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
 17528      sqlite3_result_error(context, "NULL input to edit()", -1);
 17529      return;
 17530    }
 17531    db = sqlite3_context_db_handle(context);
 17532    zTempFile = 0;
 17533    sqlite3_file_control(db, 0, SQLITE_FCNTL_TEMPFILENAME, &zTempFile);
 17534    if( zTempFile==0 ){
 17535      sqlite3_uint64 r = 0;
 17536      sqlite3_randomness(sizeof(r), &r);
 17537      zTempFile = sqlite3_mprintf("temp%llx", r);
 17538      if( zTempFile==0 ){
 17539        sqlite3_result_error_nomem(context);
 17540        return;
 17541      }
 17542    }
 17543    bBin = sqlite3_value_type(argv[0])==SQLITE_BLOB;
 17544    /* When writing the file to be edited, do \n to \r\n conversions on systems
 17545    ** that want \r\n line endings */
 17546    f = fopen(zTempFile, bBin ? "wb" : "w");
 17547    if( f==0 ){
 17548      sqlite3_result_error(context, "edit() cannot open temp file", -1);
 17549      goto edit_func_end;
 17550    }
 17551    sz = sqlite3_value_bytes(argv[0]);
 17552    if( bBin ){
 17553      x = fwrite(sqlite3_value_blob(argv[0]), 1, (size_t)sz, f);
 17554    }else{
 17555      const char *z = (const char*)sqlite3_value_text(argv[0]);
 17556      /* Remember whether or not the value originally contained \r\n */
 17557      if( z && strstr(z,"\r\n")!=0 ) hasCRNL = 1;
 17558      x = fwrite(sqlite3_value_text(argv[0]), 1, (size_t)sz, f);
 17559    }
 17560    fclose(f);
 17561    f = 0;
 17562    if( x!=sz ){
 17563      sqlite3_result_error(context, "edit() could not write the whole file", -1);
 17564      goto edit_func_end;
 17565    }
 17566    zCmd = sqlite3_mprintf("%s \"%s\"", zEditor, zTempFile);
 17567    if( zCmd==0 ){
 17568      sqlite3_result_error_nomem(context);
 17569      goto edit_func_end;
 17570    }
 17571    rc = system(zCmd);
 17572    sqlite3_free(zCmd);
 17573    if( rc ){
 17574      sqlite3_result_error(context, "EDITOR returned non-zero", -1);
 17575      goto edit_func_end;
 17576    }
 17577    f = fopen(zTempFile, "rb");
 17578    if( f==0 ){
 17579      sqlite3_result_error(context,
 17580        "edit() cannot reopen temp file after edit", -1);
 17581      goto edit_func_end;
 17582    }
 17583    fseek(f, 0, SEEK_END);
 17584    sz = ftell(f);
 17585    rewind(f);
 17586    p = sqlite3_malloc64( sz+1 );
 17587    if( p==0 ){
 17588      sqlite3_result_error_nomem(context);
 17589      goto edit_func_end;
 17590    }
 17591    x = fread(p, 1, (size_t)sz, f);
 17592    fclose(f);
 17593    f = 0;
 17594    if( x!=sz ){
 17595      sqlite3_result_error(context, "could not read back the whole file", -1);
 17596      goto edit_func_end;
 17597    }
 17598    if( bBin ){
 17599      sqlite3_result_blob64(context, p, sz, sqlite3_free);
 17600    }else{
 17601      sqlite3_int64 i, j;
 17602      if( hasCRNL ){
 17603        /* If the original contains \r\n then do no conversions back to \n */
 17604      }else{
 17605        /* If the file did not originally contain \r\n then convert any new
 17606        ** \r\n back into \n */
 17607        p[sz] = 0;
 17608        for(i=j=0; i<sz; i++){
 17609          if( p[i]=='\r' && p[i+1]=='\n' ) i++;
 17610          p[j++] = p[i];
 17611        }
 17612        sz = j;
 17613        p[sz] = 0;
 17614      }
 17615      sqlite3_result_text64(context, (const char*)p, sz,
 17616                            sqlite3_free, SQLITE_UTF8);
 17617    }
 17618    p = 0;
 17619  
 17620  edit_func_end:
 17621    if( f ) fclose(f);
 17622    unlink(zTempFile);
 17623    sqlite3_free(zTempFile);
 17624    sqlite3_free(p);
 17625  }
 17626  #endif /* SQLITE_NOHAVE_SYSTEM */
 17627  
 17628  /*
 17629  ** Save or restore the current output mode
 17630  */
 17631  static void outputModePush(ShellState *p){
 17632    p->modePrior = p->mode;
 17633    p->priorShFlgs = p->shellFlgs;
 17634    memcpy(p->colSepPrior, p->colSeparator, sizeof(p->colSeparator));
 17635    memcpy(p->rowSepPrior, p->rowSeparator, sizeof(p->rowSeparator));
 17636  }
 17637  static void outputModePop(ShellState *p){
 17638    p->mode = p->modePrior;
 17639    p->shellFlgs = p->priorShFlgs;
 17640    memcpy(p->colSeparator, p->colSepPrior, sizeof(p->colSeparator));
 17641    memcpy(p->rowSeparator, p->rowSepPrior, sizeof(p->rowSeparator));
 17642  }
 17643  
 17644  /*
 17645  ** Output the given string as a hex-encoded blob (eg. X'1234' )
 17646  */
 17647  static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
 17648    int i;
 17649    unsigned char *aBlob = (unsigned char*)pBlob;
 17650  
 17651    char *zStr = sqlite3_malloc(nBlob*2 + 1);
 17652    shell_check_oom(zStr);
 17653  
 17654    for(i=0; i<nBlob; i++){
 17655      static const char aHex[] = {
 17656          '0', '1', '2', '3', '4', '5', '6', '7',
 17657          '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
 17658      };
 17659      zStr[i*2] = aHex[ (aBlob[i] >> 4) ];
 17660      zStr[i*2+1] = aHex[ (aBlob[i] & 0x0F) ];
 17661    }
 17662    zStr[i*2] = '\0';
 17663  
 17664    raw_printf(out,"X'%s'", zStr);
 17665    sqlite3_free(zStr);
 17666  }
 17667  
 17668  /*
 17669  ** Find a string that is not found anywhere in z[].  Return a pointer
 17670  ** to that string.
 17671  **
 17672  ** Try to use zA and zB first.  If both of those are already found in z[]
 17673  ** then make up some string and store it in the buffer zBuf.
 17674  */
 17675  static const char *unused_string(
 17676    const char *z,                    /* Result must not appear anywhere in z */
 17677    const char *zA, const char *zB,   /* Try these first */
 17678    char *zBuf                        /* Space to store a generated string */
 17679  ){
 17680    unsigned i = 0;
 17681    if( strstr(z, zA)==0 ) return zA;
 17682    if( strstr(z, zB)==0 ) return zB;
 17683    do{
 17684      sqlite3_snprintf(20,zBuf,"(%s%u)", zA, i++);
 17685    }while( strstr(z,zBuf)!=0 );
 17686    return zBuf;
 17687  }
 17688  
 17689  /*
 17690  ** Output the given string as a quoted string using SQL quoting conventions.
 17691  **
 17692  ** See also: output_quoted_escaped_string()
 17693  */
 17694  static void output_quoted_string(FILE *out, const char *z){
 17695    int i;
 17696    char c;
 17697    setBinaryMode(out, 1);
 17698    if( z==0 ) return;
 17699    for(i=0; (c = z[i])!=0 && c!='\''; i++){}
 17700    if( c==0 ){
 17701      utf8_printf(out,"'%s'",z);
 17702    }else{
 17703      raw_printf(out, "'");
 17704      while( *z ){
 17705        for(i=0; (c = z[i])!=0 && c!='\''; i++){}
 17706        if( c=='\'' ) i++;
 17707        if( i ){
 17708          utf8_printf(out, "%.*s", i, z);
 17709          z += i;
 17710        }
 17711        if( c=='\'' ){
 17712          raw_printf(out, "'");
 17713          continue;
 17714        }
 17715        if( c==0 ){
 17716          break;
 17717        }
 17718        z++;
 17719      }
 17720      raw_printf(out, "'");
 17721    }
 17722    setTextMode(out, 1);
 17723  }
 17724  
 17725  /*
 17726  ** Output the given string as a quoted string using SQL quoting conventions.
 17727  ** Additionallly , escape the "\n" and "\r" characters so that they do not
 17728  ** get corrupted by end-of-line translation facilities in some operating
 17729  ** systems.
 17730  **
 17731  ** This is like output_quoted_string() but with the addition of the \r\n
 17732  ** escape mechanism.
 17733  */
 17734  static void output_quoted_escaped_string(FILE *out, const char *z){
 17735    int i;
 17736    char c;
 17737    setBinaryMode(out, 1);
 17738    for(i=0; (c = z[i])!=0 && c!='\'' && c!='\n' && c!='\r'; i++){}
 17739    if( c==0 ){
 17740      utf8_printf(out,"'%s'",z);
 17741    }else{
 17742      const char *zNL = 0;
 17743      const char *zCR = 0;
 17744      int nNL = 0;
 17745      int nCR = 0;
 17746      char zBuf1[20], zBuf2[20];
 17747      for(i=0; z[i]; i++){
 17748        if( z[i]=='\n' ) nNL++;
 17749        if( z[i]=='\r' ) nCR++;
 17750      }
 17751      if( nNL ){
 17752        raw_printf(out, "replace(");
 17753        zNL = unused_string(z, "\\n", "\\012", zBuf1);
 17754      }
 17755      if( nCR ){
 17756        raw_printf(out, "replace(");
 17757        zCR = unused_string(z, "\\r", "\\015", zBuf2);
 17758      }
 17759      raw_printf(out, "'");
 17760      while( *z ){
 17761        for(i=0; (c = z[i])!=0 && c!='\n' && c!='\r' && c!='\''; i++){}
 17762        if( c=='\'' ) i++;
 17763        if( i ){
 17764          utf8_printf(out, "%.*s", i, z);
 17765          z += i;
 17766        }
 17767        if( c=='\'' ){
 17768          raw_printf(out, "'");
 17769          continue;
 17770        }
 17771        if( c==0 ){
 17772          break;
 17773        }
 17774        z++;
 17775        if( c=='\n' ){
 17776          raw_printf(out, "%s", zNL);
 17777          continue;
 17778        }
 17779        raw_printf(out, "%s", zCR);
 17780      }
 17781      raw_printf(out, "'");
 17782      if( nCR ){
 17783        raw_printf(out, ",'%s',char(13))", zCR);
 17784      }
 17785      if( nNL ){
 17786        raw_printf(out, ",'%s',char(10))", zNL);
 17787      }
 17788    }
 17789    setTextMode(out, 1);
 17790  }
 17791  
 17792  /*
 17793  ** Output the given string as a quoted according to C or TCL quoting rules.
 17794  */
 17795  static void output_c_string(FILE *out, const char *z){
 17796    unsigned int c;
 17797    fputc('"', out);
 17798    while( (c = *(z++))!=0 ){
 17799      if( c=='\\' ){
 17800        fputc(c, out);
 17801        fputc(c, out);
 17802      }else if( c=='"' ){
 17803        fputc('\\', out);
 17804        fputc('"', out);
 17805      }else if( c=='\t' ){
 17806        fputc('\\', out);
 17807        fputc('t', out);
 17808      }else if( c=='\n' ){
 17809        fputc('\\', out);
 17810        fputc('n', out);
 17811      }else if( c=='\r' ){
 17812        fputc('\\', out);
 17813        fputc('r', out);
 17814      }else if( !isprint(c&0xff) ){
 17815        raw_printf(out, "\\%03o", c&0xff);
 17816      }else{
 17817        fputc(c, out);
 17818      }
 17819    }
 17820    fputc('"', out);
 17821  }
 17822  
 17823  /*
 17824  ** Output the given string as a quoted according to JSON quoting rules.
 17825  */
 17826  static void output_json_string(FILE *out, const char *z, i64 n){
 17827    unsigned int c;
 17828    if( z==0 ) z = "";
 17829    if( n<0 ) n = strlen(z);
 17830    fputc('"', out);
 17831    while( n-- ){
 17832      c = *(z++);
 17833      if( c=='\\' || c=='"' ){
 17834        fputc('\\', out);
 17835        fputc(c, out);
 17836      }else if( c<=0x1f ){
 17837        fputc('\\', out);
 17838        if( c=='\b' ){
 17839          fputc('b', out);
 17840        }else if( c=='\f' ){
 17841          fputc('f', out);
 17842        }else if( c=='\n' ){
 17843          fputc('n', out);
 17844        }else if( c=='\r' ){
 17845          fputc('r', out);
 17846        }else if( c=='\t' ){
 17847          fputc('t', out);
 17848        }else{
 17849           raw_printf(out, "u%04x",c);
 17850        }
 17851      }else{
 17852        fputc(c, out);
 17853      }
 17854    }
 17855    fputc('"', out);
 17856  }
 17857  
 17858  /*
 17859  ** Output the given string with characters that are special to
 17860  ** HTML escaped.
 17861  */
 17862  static void output_html_string(FILE *out, const char *z){
 17863    int i;
 17864    if( z==0 ) z = "";
 17865    while( *z ){
 17866      for(i=0;   z[i]
 17867              && z[i]!='<'
 17868              && z[i]!='&'
 17869              && z[i]!='>'
 17870              && z[i]!='\"'
 17871              && z[i]!='\'';
 17872          i++){}
 17873      if( i>0 ){
 17874        utf8_printf(out,"%.*s",i,z);
 17875      }
 17876      if( z[i]=='<' ){
 17877        raw_printf(out,"&lt;");
 17878      }else if( z[i]=='&' ){
 17879        raw_printf(out,"&amp;");
 17880      }else if( z[i]=='>' ){
 17881        raw_printf(out,"&gt;");
 17882      }else if( z[i]=='\"' ){
 17883        raw_printf(out,"&quot;");
 17884      }else if( z[i]=='\'' ){
 17885        raw_printf(out,"&#39;");
 17886      }else{
 17887        break;
 17888      }
 17889      z += i + 1;
 17890    }
 17891  }
 17892  
 17893  /*
 17894  ** If a field contains any character identified by a 1 in the following
 17895  ** array, then the string must be quoted for CSV.
 17896  */
 17897  static const char needCsvQuote[] = {
 17898    1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
 17899    1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
 17900    1, 0, 1, 0, 0, 0, 0, 1,   0, 0, 0, 0, 0, 0, 0, 0,
 17901    0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
 17902    0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
 17903    0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
 17904    0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
 17905    0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 1,
 17906    1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
 17907    1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
 17908    1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
 17909    1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
 17910    1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
 17911    1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
 17912    1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
 17913    1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
 17914  };
 17915  
 17916  /*
 17917  ** Output a single term of CSV.  Actually, p->colSeparator is used for
 17918  ** the separator, which may or may not be a comma.  p->nullValue is
 17919  ** the null value.  Strings are quoted if necessary.  The separator
 17920  ** is only issued if bSep is true.
 17921  */
 17922  static void output_csv(ShellState *p, const char *z, int bSep){
 17923    FILE *out = p->out;
 17924    if( z==0 ){
 17925      utf8_printf(out,"%s",p->nullValue);
 17926    }else{
 17927      unsigned i;
 17928      for(i=0; z[i]; i++){
 17929        if( needCsvQuote[((unsigned char*)z)[i]] ){
 17930          i = 0;
 17931          break;
 17932        }
 17933      }
 17934      if( i==0 || strstr(z, p->colSeparator)!=0 ){
 17935        char *zQuoted = sqlite3_mprintf("\"%w\"", z);
 17936        shell_check_oom(zQuoted);
 17937        utf8_printf(out, "%s", zQuoted);
 17938        sqlite3_free(zQuoted);
 17939      }else{
 17940        utf8_printf(out, "%s", z);
 17941      }
 17942    }
 17943    if( bSep ){
 17944      utf8_printf(p->out, "%s", p->colSeparator);
 17945    }
 17946  }
 17947  
 17948  /*
 17949  ** This routine runs when the user presses Ctrl-C
 17950  */
 17951  static void interrupt_handler(int NotUsed){
 17952    UNUSED_PARAMETER(NotUsed);
 17953    if( ++seenInterrupt>1 ) exit(1);
 17954    if( globalDb ) sqlite3_interrupt(globalDb);
 17955  }
 17956  
 17957  #if (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE)
 17958  /*
 17959  ** This routine runs for console events (e.g. Ctrl-C) on Win32
 17960  */
 17961  static BOOL WINAPI ConsoleCtrlHandler(
 17962    DWORD dwCtrlType /* One of the CTRL_*_EVENT constants */
 17963  ){
 17964    if( dwCtrlType==CTRL_C_EVENT ){
 17965      interrupt_handler(0);
 17966      return TRUE;
 17967    }
 17968    return FALSE;
 17969  }
 17970  #endif
 17971  
 17972  #ifndef SQLITE_OMIT_AUTHORIZATION
 17973  /*
 17974  ** This authorizer runs in safe mode.
 17975  */
 17976  static int safeModeAuth(
 17977    void *pClientData,
 17978    int op,
 17979    const char *zA1,
 17980    const char *zA2,
 17981    const char *zA3,
 17982    const char *zA4
 17983  ){
 17984    ShellState *p = (ShellState*)pClientData;
 17985    static const char *azProhibitedFunctions[] = {
 17986      "edit",
 17987      "fts3_tokenizer",
 17988      "load_extension",
 17989      "readfile",
 17990      "writefile",
 17991      "zipfile",
 17992      "zipfile_cds",
 17993    };
 17994    UNUSED_PARAMETER(zA1);
 17995    UNUSED_PARAMETER(zA3);
 17996    UNUSED_PARAMETER(zA4);
 17997    switch( op ){
 17998      case SQLITE_ATTACH: {
 17999  #ifndef SQLITE_SHELL_FIDDLE
 18000        /* In WASM builds the filesystem is a virtual sandbox, so
 18001        ** there's no harm in using ATTACH. */
 18002        failIfSafeMode(p, "cannot run ATTACH in safe mode");
 18003  #endif
 18004        break;
 18005      }
 18006      case SQLITE_FUNCTION: {
 18007        int i;
 18008        for(i=0; i<ArraySize(azProhibitedFunctions); i++){
 18009          if( sqlite3_stricmp(zA2, azProhibitedFunctions[i])==0 ){
 18010            failIfSafeMode(p, "cannot use the %s() function in safe mode",
 18011                           azProhibitedFunctions[i]);
 18012          }
 18013        }
 18014        break;
 18015      }
 18016    }
 18017    return SQLITE_OK;
 18018  }
 18019  
 18020  /*
 18021  ** When the ".auth ON" is set, the following authorizer callback is
 18022  ** invoked.  It always returns SQLITE_OK.
 18023  */
 18024  static int shellAuth(
 18025    void *pClientData,
 18026    int op,
 18027    const char *zA1,
 18028    const char *zA2,
 18029    const char *zA3,
 18030    const char *zA4
 18031  ){
 18032    ShellState *p = (ShellState*)pClientData;
 18033    static const char *azAction[] = { 0,
 18034       "CREATE_INDEX",         "CREATE_TABLE",         "CREATE_TEMP_INDEX",
 18035       "CREATE_TEMP_TABLE",    "CREATE_TEMP_TRIGGER",  "CREATE_TEMP_VIEW",
 18036       "CREATE_TRIGGER",       "CREATE_VIEW",          "DELETE",
 18037       "DROP_INDEX",           "DROP_TABLE",           "DROP_TEMP_INDEX",
 18038       "DROP_TEMP_TABLE",      "DROP_TEMP_TRIGGER",    "DROP_TEMP_VIEW",
 18039       "DROP_TRIGGER",         "DROP_VIEW",            "INSERT",
 18040       "PRAGMA",               "READ",                 "SELECT",
 18041       "TRANSACTION",          "UPDATE",               "ATTACH",
 18042       "DETACH",               "ALTER_TABLE",          "REINDEX",
 18043       "ANALYZE",              "CREATE_VTABLE",        "DROP_VTABLE",
 18044       "FUNCTION",             "SAVEPOINT",            "RECURSIVE"
 18045    };
 18046    int i;
 18047    const char *az[4];
 18048    az[0] = zA1;
 18049    az[1] = zA2;
 18050    az[2] = zA3;
 18051    az[3] = zA4;
 18052    utf8_printf(p->out, "authorizer: %s", azAction[op]);
 18053    for(i=0; i<4; i++){
 18054      raw_printf(p->out, " ");
 18055      if( az[i] ){
 18056        output_c_string(p->out, az[i]);
 18057      }else{
 18058        raw_printf(p->out, "NULL");
 18059      }
 18060    }
 18061    raw_printf(p->out, "\n");
 18062    if( p->bSafeMode ) (void)safeModeAuth(pClientData, op, zA1, zA2, zA3, zA4);
 18063    return SQLITE_OK;
 18064  }
 18065  #endif
 18066  
 18067  /*
 18068  ** Print a schema statement.  Part of MODE_Semi and MODE_Pretty output.
 18069  **
 18070  ** This routine converts some CREATE TABLE statements for shadow tables
 18071  ** in FTS3/4/5 into CREATE TABLE IF NOT EXISTS statements.
 18072  **
 18073  ** If the schema statement in z[] contains a start-of-comment and if
 18074  ** sqlite3_complete() returns false, try to terminate the comment before
 18075  ** printing the result.  https://sqlite.org/forum/forumpost/d7be961c5c
 18076  */
 18077  static void printSchemaLine(FILE *out, const char *z, const char *zTail){
 18078    char *zToFree = 0;
 18079    if( z==0 ) return;
 18080    if( zTail==0 ) return;
 18081    if( zTail[0]==';' && (strstr(z, "/*")!=0 || strstr(z,"--")!=0) ){
 18082      const char *zOrig = z;
 18083      static const char *azTerm[] = { "", "*/", "\n" };
 18084      int i;
 18085      for(i=0; i<ArraySize(azTerm); i++){
 18086        char *zNew = sqlite3_mprintf("%s%s;", zOrig, azTerm[i]);
 18087        shell_check_oom(zNew);
 18088        if( sqlite3_complete(zNew) ){
 18089          size_t n = strlen(zNew);
 18090          zNew[n-1] = 0;
 18091          zToFree = zNew;
 18092          z = zNew;
 18093          break;
 18094        }
 18095        sqlite3_free(zNew);
 18096      }
 18097    }
 18098    if( sqlite3_strglob("CREATE TABLE ['\"]*", z)==0 ){
 18099      utf8_printf(out, "CREATE TABLE IF NOT EXISTS %s%s", z+13, zTail);
 18100    }else{
 18101      utf8_printf(out, "%s%s", z, zTail);
 18102    }
 18103    sqlite3_free(zToFree);
 18104  }
 18105  static void printSchemaLineN(FILE *out, char *z, int n, const char *zTail){
 18106    char c = z[n];
 18107    z[n] = 0;
 18108    printSchemaLine(out, z, zTail);
 18109    z[n] = c;
 18110  }
 18111  
 18112  /*
 18113  ** Return true if string z[] has nothing but whitespace and comments to the
 18114  ** end of the first line.
 18115  */
 18116  static int wsToEol(const char *z){
 18117    int i;
 18118    for(i=0; z[i]; i++){
 18119      if( z[i]=='\n' ) return 1;
 18120      if( IsSpace(z[i]) ) continue;
 18121      if( z[i]=='-' && z[i+1]=='-' ) return 1;
 18122      return 0;
 18123    }
 18124    return 1;
 18125  }
 18126  
 18127  /*
 18128  ** Add a new entry to the EXPLAIN QUERY PLAN data
 18129  */
 18130  static void eqp_append(ShellState *p, int iEqpId, int p2, const char *zText){
 18131    EQPGraphRow *pNew;
 18132    i64 nText;
 18133    if( zText==0 ) return;
 18134    nText = strlen(zText);
 18135    if( p->autoEQPtest ){
 18136      utf8_printf(p->out, "%d,%d,%s\n", iEqpId, p2, zText);
 18137    }
 18138    pNew = sqlite3_malloc64( sizeof(*pNew) + nText );
 18139    shell_check_oom(pNew);
 18140    pNew->iEqpId = iEqpId;
 18141    pNew->iParentId = p2;
 18142    memcpy(pNew->zText, zText, nText+1);
 18143    pNew->pNext = 0;
 18144    if( p->sGraph.pLast ){
 18145      p->sGraph.pLast->pNext = pNew;
 18146    }else{
 18147      p->sGraph.pRow = pNew;
 18148    }
 18149    p->sGraph.pLast = pNew;
 18150  }
 18151  
 18152  /*
 18153  ** Free and reset the EXPLAIN QUERY PLAN data that has been collected
 18154  ** in p->sGraph.
 18155  */
 18156  static void eqp_reset(ShellState *p){
 18157    EQPGraphRow *pRow, *pNext;
 18158    for(pRow = p->sGraph.pRow; pRow; pRow = pNext){
 18159      pNext = pRow->pNext;
 18160      sqlite3_free(pRow);
 18161    }
 18162    memset(&p->sGraph, 0, sizeof(p->sGraph));
 18163  }
 18164  
 18165  /* Return the next EXPLAIN QUERY PLAN line with iEqpId that occurs after
 18166  ** pOld, or return the first such line if pOld is NULL
 18167  */
 18168  static EQPGraphRow *eqp_next_row(ShellState *p, int iEqpId, EQPGraphRow *pOld){
 18169    EQPGraphRow *pRow = pOld ? pOld->pNext : p->sGraph.pRow;
 18170    while( pRow && pRow->iParentId!=iEqpId ) pRow = pRow->pNext;
 18171    return pRow;
 18172  }
 18173  
 18174  /* Render a single level of the graph that has iEqpId as its parent.  Called
 18175  ** recursively to render sublevels.
 18176  */
 18177  static void eqp_render_level(ShellState *p, int iEqpId){
 18178    EQPGraphRow *pRow, *pNext;
 18179    i64 n = strlen(p->sGraph.zPrefix);
 18180    char *z;
 18181    for(pRow = eqp_next_row(p, iEqpId, 0); pRow; pRow = pNext){
 18182      pNext = eqp_next_row(p, iEqpId, pRow);
 18183      z = pRow->zText;
 18184      utf8_printf(p->out, "%s%s%s\n", p->sGraph.zPrefix,
 18185                  pNext ? "|--" : "`--", z);
 18186      if( n<(i64)sizeof(p->sGraph.zPrefix)-7 ){
 18187        memcpy(&p->sGraph.zPrefix[n], pNext ? "|  " : "   ", 4);
 18188        eqp_render_level(p, pRow->iEqpId);
 18189        p->sGraph.zPrefix[n] = 0;
 18190      }
 18191    }
 18192  }
 18193  
 18194  /*
 18195  ** Display and reset the EXPLAIN QUERY PLAN data
 18196  */
 18197  static void eqp_render(ShellState *p, i64 nCycle){
 18198    EQPGraphRow *pRow = p->sGraph.pRow;
 18199    if( pRow ){
 18200      if( pRow->zText[0]=='-' ){
 18201        if( pRow->pNext==0 ){
 18202          eqp_reset(p);
 18203          return;
 18204        }
 18205        utf8_printf(p->out, "%s\n", pRow->zText+3);
 18206        p->sGraph.pRow = pRow->pNext;
 18207        sqlite3_free(pRow);
 18208      }else if( nCycle>0 ){
 18209        utf8_printf(p->out, "QUERY PLAN (cycles=%lld [100%%])\n", nCycle);
 18210      }else{
 18211        utf8_printf(p->out, "QUERY PLAN\n");
 18212      }
 18213      p->sGraph.zPrefix[0] = 0;
 18214      eqp_render_level(p, 0);
 18215      eqp_reset(p);
 18216    }
 18217  }
 18218  
 18219  #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
 18220  /*
 18221  ** Progress handler callback.
 18222  */
 18223  static int progress_handler(void *pClientData) {
 18224    ShellState *p = (ShellState*)pClientData;
 18225    p->nProgress++;
 18226    if( p->nProgress>=p->mxProgress && p->mxProgress>0 ){
 18227      raw_printf(p->out, "Progress limit reached (%u)\n", p->nProgress);
 18228      if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0;
 18229      if( p->flgProgress & SHELL_PROGRESS_ONCE ) p->mxProgress = 0;
 18230      return 1;
 18231    }
 18232    if( (p->flgProgress & SHELL_PROGRESS_QUIET)==0 ){
 18233      raw_printf(p->out, "Progress %u\n", p->nProgress);
 18234    }
 18235    return 0;
 18236  }
 18237  #endif /* SQLITE_OMIT_PROGRESS_CALLBACK */
 18238  
 18239  /*
 18240  ** Print N dashes
 18241  */
 18242  static void print_dashes(FILE *out, int N){
 18243    const char zDash[] = "--------------------------------------------------";
 18244    const int nDash = sizeof(zDash) - 1;
 18245    while( N>nDash ){
 18246      fputs(zDash, out);
 18247      N -= nDash;
 18248    }
 18249    raw_printf(out, "%.*s", N, zDash);
 18250  }
 18251  
 18252  /*
 18253  ** Print a markdown or table-style row separator using ascii-art
 18254  */
 18255  static void print_row_separator(
 18256    ShellState *p,
 18257    int nArg,
 18258    const char *zSep
 18259  ){
 18260    int i;
 18261    if( nArg>0 ){
 18262      fputs(zSep, p->out);
 18263      print_dashes(p->out, p->actualWidth[0]+2);
 18264      for(i=1; i<nArg; i++){
 18265        fputs(zSep, p->out);
 18266        print_dashes(p->out, p->actualWidth[i]+2);
 18267      }
 18268      fputs(zSep, p->out);
 18269    }
 18270    fputs("\n", p->out);
 18271  }
 18272  
 18273  /*
 18274  ** This is the callback routine that the shell
 18275  ** invokes for each row of a query result.
 18276  */
 18277  static int shell_callback(
 18278    void *pArg,
 18279    int nArg,        /* Number of result columns */
 18280    char **azArg,    /* Text of each result column */
 18281    char **azCol,    /* Column names */
 18282    int *aiType      /* Column types.  Might be NULL */
 18283  ){
 18284    int i;
 18285    ShellState *p = (ShellState*)pArg;
 18286  
 18287    if( azArg==0 ) return 0;
 18288    switch( p->cMode ){
 18289      case MODE_Count:
 18290      case MODE_Off: {
 18291        break;
 18292      }
 18293      case MODE_Line: {
 18294        int w = 5;
 18295        if( azArg==0 ) break;
 18296        for(i=0; i<nArg; i++){
 18297          int len = strlen30(azCol[i] ? azCol[i] : "");
 18298          if( len>w ) w = len;
 18299        }
 18300        if( p->cnt++>0 ) utf8_printf(p->out, "%s", p->rowSeparator);
 18301        for(i=0; i<nArg; i++){
 18302          utf8_printf(p->out,"%*s = %s%s", w, azCol[i],
 18303                  azArg[i] ? azArg[i] : p->nullValue, p->rowSeparator);
 18304        }
 18305        break;
 18306      }
 18307      case MODE_ScanExp:
 18308      case MODE_Explain: {
 18309        static const int aExplainWidth[] = {4,       13, 4, 4, 4, 13, 2, 13};
 18310        static const int aExplainMap[] =   {0,       1,  2, 3, 4, 5,  6, 7 };
 18311        static const int aScanExpWidth[] = {4, 6, 6, 13, 4, 4, 4, 13, 2, 13};
 18312        static const int aScanExpMap[] =   {0, 9, 8, 1,  2, 3, 4, 5,  6, 7 };
 18313  
 18314        const int *aWidth = aExplainWidth;
 18315        const int *aMap = aExplainMap;
 18316        int nWidth = ArraySize(aExplainWidth);
 18317        int iIndent = 1;
 18318  
 18319        if( p->cMode==MODE_ScanExp ){
 18320          aWidth = aScanExpWidth;
 18321          aMap = aScanExpMap;
 18322          nWidth = ArraySize(aScanExpWidth);
 18323          iIndent = 3;
 18324        }
 18325        if( nArg>nWidth ) nArg = nWidth;
 18326  
 18327        /* If this is the first row seen, print out the headers */
 18328        if( p->cnt++==0 ){
 18329          for(i=0; i<nArg; i++){
 18330            utf8_width_print(p->out, aWidth[i], azCol[ aMap[i] ]);
 18331            fputs(i==nArg-1 ? "\n" : "  ", p->out);
 18332          }
 18333          for(i=0; i<nArg; i++){
 18334            print_dashes(p->out, aWidth[i]);
 18335            fputs(i==nArg-1 ? "\n" : "  ", p->out);
 18336          }
 18337        }
 18338  
 18339        /* If there is no data, exit early. */
 18340        if( azArg==0 ) break;
 18341  
 18342        for(i=0; i<nArg; i++){
 18343          const char *zSep = "  ";
 18344          int w = aWidth[i];
 18345          const char *zVal = azArg[ aMap[i] ];
 18346          if( i==nArg-1 ) w = 0;
 18347          if( zVal && strlenChar(zVal)>w ){
 18348            w = strlenChar(zVal);
 18349            zSep = " ";
 18350          }
 18351          if( i==iIndent && p->aiIndent && p->pStmt ){
 18352            if( p->iIndent<p->nIndent ){
 18353              utf8_printf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
 18354            }
 18355            p->iIndent++;
 18356          }
 18357          utf8_width_print(p->out, w, zVal ? zVal : p->nullValue);
 18358          fputs(i==nArg-1 ? "\n" : zSep, p->out);
 18359        }
 18360        break;
 18361      }
 18362      case MODE_Semi: {   /* .schema and .fullschema output */
 18363        printSchemaLine(p->out, azArg[0], ";\n");
 18364        break;
 18365      }
 18366      case MODE_Pretty: {  /* .schema and .fullschema with --indent */
 18367        char *z;
 18368        int j;
 18369        int nParen = 0;
 18370        char cEnd = 0;
 18371        char c;
 18372        int nLine = 0;
 18373        assert( nArg==1 );
 18374        if( azArg[0]==0 ) break;
 18375        if( sqlite3_strlike("CREATE VIEW%", azArg[0], 0)==0
 18376         || sqlite3_strlike("CREATE TRIG%", azArg[0], 0)==0
 18377        ){
 18378          utf8_printf(p->out, "%s;\n", azArg[0]);
 18379          break;
 18380        }
 18381        z = sqlite3_mprintf("%s", azArg[0]);
 18382        shell_check_oom(z);
 18383        j = 0;
 18384        for(i=0; IsSpace(z[i]); i++){}
 18385        for(; (c = z[i])!=0; i++){
 18386          if( IsSpace(c) ){
 18387            if( z[j-1]=='\r' ) z[j-1] = '\n';
 18388            if( IsSpace(z[j-1]) || z[j-1]=='(' ) continue;
 18389          }else if( (c=='(' || c==')') && j>0 && IsSpace(z[j-1]) ){
 18390            j--;
 18391          }
 18392          z[j++] = c;
 18393        }
 18394        while( j>0 && IsSpace(z[j-1]) ){ j--; }
 18395        z[j] = 0;
 18396        if( strlen30(z)>=79 ){
 18397          for(i=j=0; (c = z[i])!=0; i++){ /* Copy from z[i] back to z[j] */
 18398            if( c==cEnd ){
 18399              cEnd = 0;
 18400            }else if( c=='"' || c=='\'' || c=='`' ){
 18401              cEnd = c;
 18402            }else if( c=='[' ){
 18403              cEnd = ']';
 18404            }else if( c=='-' && z[i+1]=='-' ){
 18405              cEnd = '\n';
 18406            }else if( c=='(' ){
 18407              nParen++;
 18408            }else if( c==')' ){
 18409              nParen--;
 18410              if( nLine>0 && nParen==0 && j>0 ){
 18411                printSchemaLineN(p->out, z, j, "\n");
 18412                j = 0;
 18413              }
 18414            }
 18415            z[j++] = c;
 18416            if( nParen==1 && cEnd==0
 18417             && (c=='(' || c=='\n' || (c==',' && !wsToEol(z+i+1)))
 18418            ){
 18419              if( c=='\n' ) j--;
 18420              printSchemaLineN(p->out, z, j, "\n  ");
 18421              j = 0;
 18422              nLine++;
 18423              while( IsSpace(z[i+1]) ){ i++; }
 18424            }
 18425          }
 18426          z[j] = 0;
 18427        }
 18428        printSchemaLine(p->out, z, ";\n");
 18429        sqlite3_free(z);
 18430        break;
 18431      }
 18432      case MODE_List: {
 18433        if( p->cnt++==0 && p->showHeader ){
 18434          for(i=0; i<nArg; i++){
 18435            utf8_printf(p->out,"%s%s",azCol[i],
 18436                    i==nArg-1 ? p->rowSeparator : p->colSeparator);
 18437          }
 18438        }
 18439        if( azArg==0 ) break;
 18440        for(i=0; i<nArg; i++){
 18441          char *z = azArg[i];
 18442          if( z==0 ) z = p->nullValue;
 18443          utf8_printf(p->out, "%s", z);
 18444          if( i<nArg-1 ){
 18445            utf8_printf(p->out, "%s", p->colSeparator);
 18446          }else{
 18447            utf8_printf(p->out, "%s", p->rowSeparator);
 18448          }
 18449        }
 18450        break;
 18451      }
 18452      case MODE_Html: {
 18453        if( p->cnt++==0 && p->showHeader ){
 18454          raw_printf(p->out,"<TR>");
 18455          for(i=0; i<nArg; i++){
 18456            raw_printf(p->out,"<TH>");
 18457            output_html_string(p->out, azCol[i]);
 18458            raw_printf(p->out,"</TH>\n");
 18459          }
 18460          raw_printf(p->out,"</TR>\n");
 18461        }
 18462        if( azArg==0 ) break;
 18463        raw_printf(p->out,"<TR>");
 18464        for(i=0; i<nArg; i++){
 18465          raw_printf(p->out,"<TD>");
 18466          output_html_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
 18467          raw_printf(p->out,"</TD>\n");
 18468        }
 18469        raw_printf(p->out,"</TR>\n");
 18470        break;
 18471      }
 18472      case MODE_Tcl: {
 18473        if( p->cnt++==0 && p->showHeader ){
 18474          for(i=0; i<nArg; i++){
 18475            output_c_string(p->out,azCol[i] ? azCol[i] : "");
 18476            if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
 18477          }
 18478          utf8_printf(p->out, "%s", p->rowSeparator);
 18479        }
 18480        if( azArg==0 ) break;
 18481        for(i=0; i<nArg; i++){
 18482          output_c_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
 18483          if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
 18484        }
 18485        utf8_printf(p->out, "%s", p->rowSeparator);
 18486        break;
 18487      }
 18488      case MODE_Csv: {
 18489        setBinaryMode(p->out, 1);
 18490        if( p->cnt++==0 && p->showHeader ){
 18491          for(i=0; i<nArg; i++){
 18492            output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
 18493          }
 18494          utf8_printf(p->out, "%s", p->rowSeparator);
 18495        }
 18496        if( nArg>0 ){
 18497          for(i=0; i<nArg; i++){
 18498            output_csv(p, azArg[i], i<nArg-1);
 18499          }
 18500          utf8_printf(p->out, "%s", p->rowSeparator);
 18501        }
 18502        setTextMode(p->out, 1);
 18503        break;
 18504      }
 18505      case MODE_Insert: {
 18506        if( azArg==0 ) break;
 18507        utf8_printf(p->out,"INSERT INTO %s",p->zDestTable);
 18508        if( p->showHeader ){
 18509          raw_printf(p->out,"(");
 18510          for(i=0; i<nArg; i++){
 18511            if( i>0 ) raw_printf(p->out, ",");
 18512            if( quoteChar(azCol[i]) ){
 18513              char *z = sqlite3_mprintf("\"%w\"", azCol[i]);
 18514              shell_check_oom(z);
 18515              utf8_printf(p->out, "%s", z);
 18516              sqlite3_free(z);
 18517            }else{
 18518              raw_printf(p->out, "%s", azCol[i]);
 18519            }
 18520          }
 18521          raw_printf(p->out,")");
 18522        }
 18523        p->cnt++;
 18524        for(i=0; i<nArg; i++){
 18525          raw_printf(p->out, i>0 ? "," : " VALUES(");
 18526          if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
 18527            utf8_printf(p->out,"NULL");
 18528          }else if( aiType && aiType[i]==SQLITE_TEXT ){
 18529            if( ShellHasFlag(p, SHFLG_Newlines) ){
 18530              output_quoted_string(p->out, azArg[i]);
 18531            }else{
 18532              output_quoted_escaped_string(p->out, azArg[i]);
 18533            }
 18534          }else if( aiType && aiType[i]==SQLITE_INTEGER ){
 18535            utf8_printf(p->out,"%s", azArg[i]);
 18536          }else if( aiType && aiType[i]==SQLITE_FLOAT ){
 18537            char z[50];
 18538            double r = sqlite3_column_double(p->pStmt, i);
 18539            sqlite3_uint64 ur;
 18540            memcpy(&ur,&r,sizeof(r));
 18541            if( ur==0x7ff0000000000000LL ){
 18542              raw_printf(p->out, "9.0e+999");
 18543            }else if( ur==0xfff0000000000000LL ){
 18544              raw_printf(p->out, "-9.0e+999");
 18545            }else{
 18546              sqlite3_int64 ir = (sqlite3_int64)r;
 18547              if( r==(double)ir ){
 18548                sqlite3_snprintf(50,z,"%lld.0", ir);
 18549              }else{
 18550                sqlite3_snprintf(50,z,"%!.20g", r);
 18551              }
 18552              raw_printf(p->out, "%s", z);
 18553            }
 18554          }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
 18555            const void *pBlob = sqlite3_column_blob(p->pStmt, i);
 18556            int nBlob = sqlite3_column_bytes(p->pStmt, i);
 18557            output_hex_blob(p->out, pBlob, nBlob);
 18558          }else if( isNumber(azArg[i], 0) ){
 18559            utf8_printf(p->out,"%s", azArg[i]);
 18560          }else if( ShellHasFlag(p, SHFLG_Newlines) ){
 18561            output_quoted_string(p->out, azArg[i]);
 18562          }else{
 18563            output_quoted_escaped_string(p->out, azArg[i]);
 18564          }
 18565        }
 18566        raw_printf(p->out,");\n");
 18567        break;
 18568      }
 18569      case MODE_Json: {
 18570        if( azArg==0 ) break;
 18571        if( p->cnt==0 ){
 18572          fputs("[{", p->out);
 18573        }else{
 18574          fputs(",\n{", p->out);
 18575        }
 18576        p->cnt++;
 18577        for(i=0; i<nArg; i++){
 18578          output_json_string(p->out, azCol[i], -1);
 18579          putc(':', p->out);
 18580          if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
 18581            fputs("null",p->out);
 18582          }else if( aiType && aiType[i]==SQLITE_FLOAT ){
 18583            char z[50];
 18584            double r = sqlite3_column_double(p->pStmt, i);
 18585            sqlite3_uint64 ur;
 18586            memcpy(&ur,&r,sizeof(r));
 18587            if( ur==0x7ff0000000000000LL ){
 18588              raw_printf(p->out, "9.0e+999");
 18589            }else if( ur==0xfff0000000000000LL ){
 18590              raw_printf(p->out, "-9.0e+999");
 18591            }else{
 18592              sqlite3_snprintf(50,z,"%!.20g", r);
 18593              raw_printf(p->out, "%s", z);
 18594            }
 18595          }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
 18596            const void *pBlob = sqlite3_column_blob(p->pStmt, i);
 18597            int nBlob = sqlite3_column_bytes(p->pStmt, i);
 18598            output_json_string(p->out, pBlob, nBlob);
 18599          }else if( aiType && aiType[i]==SQLITE_TEXT ){
 18600            output_json_string(p->out, azArg[i], -1);
 18601          }else{
 18602            utf8_printf(p->out,"%s", azArg[i]);
 18603          }
 18604          if( i<nArg-1 ){
 18605            putc(',', p->out);
 18606          }
 18607        }
 18608        putc('}', p->out);
 18609        break;
 18610      }
 18611      case MODE_Quote: {
 18612        if( azArg==0 ) break;
 18613        if( p->cnt==0 && p->showHeader ){
 18614          for(i=0; i<nArg; i++){
 18615            if( i>0 ) fputs(p->colSeparator, p->out);
 18616            output_quoted_string(p->out, azCol[i]);
 18617          }
 18618          fputs(p->rowSeparator, p->out);
 18619        }
 18620        p->cnt++;
 18621        for(i=0; i<nArg; i++){
 18622          if( i>0 ) fputs(p->colSeparator, p->out);
 18623          if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
 18624            utf8_printf(p->out,"NULL");
 18625          }else if( aiType && aiType[i]==SQLITE_TEXT ){
 18626            output_quoted_string(p->out, azArg[i]);
 18627          }else if( aiType && aiType[i]==SQLITE_INTEGER ){
 18628            utf8_printf(p->out,"%s", azArg[i]);
 18629          }else if( aiType && aiType[i]==SQLITE_FLOAT ){
 18630            char z[50];
 18631            double r = sqlite3_column_double(p->pStmt, i);
 18632            sqlite3_snprintf(50,z,"%!.20g", r);
 18633            raw_printf(p->out, "%s", z);
 18634          }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
 18635            const void *pBlob = sqlite3_column_blob(p->pStmt, i);
 18636            int nBlob = sqlite3_column_bytes(p->pStmt, i);
 18637            output_hex_blob(p->out, pBlob, nBlob);
 18638          }else if( isNumber(azArg[i], 0) ){
 18639            utf8_printf(p->out,"%s", azArg[i]);
 18640          }else{
 18641            output_quoted_string(p->out, azArg[i]);
 18642          }
 18643        }
 18644        fputs(p->rowSeparator, p->out);
 18645        break;
 18646      }
 18647      case MODE_Ascii: {
 18648        if( p->cnt++==0 && p->showHeader ){
 18649          for(i=0; i<nArg; i++){
 18650            if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
 18651            utf8_printf(p->out,"%s",azCol[i] ? azCol[i] : "");
 18652          }
 18653          utf8_printf(p->out, "%s", p->rowSeparator);
 18654        }
 18655        if( azArg==0 ) break;
 18656        for(i=0; i<nArg; i++){
 18657          if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
 18658          utf8_printf(p->out,"%s",azArg[i] ? azArg[i] : p->nullValue);
 18659        }
 18660        utf8_printf(p->out, "%s", p->rowSeparator);
 18661        break;
 18662      }
 18663      case MODE_EQP: {
 18664        eqp_append(p, atoi(azArg[0]), atoi(azArg[1]), azArg[3]);
 18665        break;
 18666      }
 18667    }
 18668    return 0;
 18669  }
 18670  
 18671  /*
 18672  ** This is the callback routine that the SQLite library
 18673  ** invokes for each row of a query result.
 18674  */
 18675  static int callback(void *pArg, int nArg, char **azArg, char **azCol){
 18676    /* since we don't have type info, call the shell_callback with a NULL value */
 18677    return shell_callback(pArg, nArg, azArg, azCol, NULL);
 18678  }
 18679  
 18680  /*
 18681  ** This is the callback routine from sqlite3_exec() that appends all
 18682  ** output onto the end of a ShellText object.
 18683  */
 18684  static int captureOutputCallback(void *pArg, int nArg, char **azArg, char **az){
 18685    ShellText *p = (ShellText*)pArg;
 18686    int i;
 18687    UNUSED_PARAMETER(az);
 18688    if( azArg==0 ) return 0;
 18689    if( p->n ) appendText(p, "|", 0);
 18690    for(i=0; i<nArg; i++){
 18691      if( i ) appendText(p, ",", 0);
 18692      if( azArg[i] ) appendText(p, azArg[i], 0);
 18693    }
 18694    return 0;
 18695  }
 18696  
 18697  /*
 18698  ** Generate an appropriate SELFTEST table in the main database.
 18699  */
 18700  static void createSelftestTable(ShellState *p){
 18701    char *zErrMsg = 0;
 18702    sqlite3_exec(p->db,
 18703      "SAVEPOINT selftest_init;\n"
 18704      "CREATE TABLE IF NOT EXISTS selftest(\n"
 18705      "  tno INTEGER PRIMARY KEY,\n"   /* Test number */
 18706      "  op TEXT,\n"                   /* Operator:  memo run */
 18707      "  cmd TEXT,\n"                  /* Command text */
 18708      "  ans TEXT\n"                   /* Desired answer */
 18709      ");"
 18710      "CREATE TEMP TABLE [_shell$self](op,cmd,ans);\n"
 18711      "INSERT INTO [_shell$self](rowid,op,cmd)\n"
 18712      "  VALUES(coalesce((SELECT (max(tno)+100)/10 FROM selftest),10),\n"
 18713      "         'memo','Tests generated by --init');\n"
 18714      "INSERT INTO [_shell$self]\n"
 18715      "  SELECT 'run',\n"
 18716      "    'SELECT hex(sha3_query(''SELECT type,name,tbl_name,sql "
 18717                                   "FROM sqlite_schema ORDER BY 2'',224))',\n"
 18718      "    hex(sha3_query('SELECT type,name,tbl_name,sql "
 18719                            "FROM sqlite_schema ORDER BY 2',224));\n"
 18720      "INSERT INTO [_shell$self]\n"
 18721      "  SELECT 'run',"
 18722      "    'SELECT hex(sha3_query(''SELECT * FROM \"' ||"
 18723      "        printf('%w',name) || '\" NOT INDEXED'',224))',\n"
 18724      "    hex(sha3_query(printf('SELECT * FROM \"%w\" NOT INDEXED',name),224))\n"
 18725      "  FROM (\n"
 18726      "    SELECT name FROM sqlite_schema\n"
 18727      "     WHERE type='table'\n"
 18728      "       AND name<>'selftest'\n"
 18729      "       AND coalesce(rootpage,0)>0\n"
 18730      "  )\n"
 18731      " ORDER BY name;\n"
 18732      "INSERT INTO [_shell$self]\n"
 18733      "  VALUES('run','PRAGMA integrity_check','ok');\n"
 18734      "INSERT INTO selftest(tno,op,cmd,ans)"
 18735      "  SELECT rowid*10,op,cmd,ans FROM [_shell$self];\n"
 18736      "DROP TABLE [_shell$self];"
 18737      ,0,0,&zErrMsg);
 18738    if( zErrMsg ){
 18739      utf8_printf(stderr, "SELFTEST initialization failure: %s\n", zErrMsg);
 18740      sqlite3_free(zErrMsg);
 18741    }
 18742    sqlite3_exec(p->db, "RELEASE selftest_init",0,0,0);
 18743  }
 18744  
 18745  
 18746  /*
 18747  ** Set the destination table field of the ShellState structure to
 18748  ** the name of the table given.  Escape any quote characters in the
 18749  ** table name.
 18750  */
 18751  static void set_table_name(ShellState *p, const char *zName){
 18752    int i, n;
 18753    char cQuote;
 18754    char *z;
 18755  
 18756    if( p->zDestTable ){
 18757      free(p->zDestTable);
 18758      p->zDestTable = 0;
 18759    }
 18760    if( zName==0 ) return;
 18761    cQuote = quoteChar(zName);
 18762    n = strlen30(zName);
 18763    if( cQuote ) n += n+2;
 18764    z = p->zDestTable = malloc( n+1 );
 18765    shell_check_oom(z);
 18766    n = 0;
 18767    if( cQuote ) z[n++] = cQuote;
 18768    for(i=0; zName[i]; i++){
 18769      z[n++] = zName[i];
 18770      if( zName[i]==cQuote ) z[n++] = cQuote;
 18771    }
 18772    if( cQuote ) z[n++] = cQuote;
 18773    z[n] = 0;
 18774  }
 18775  
 18776  /*
 18777  ** Maybe construct two lines of text that point out the position of a
 18778  ** syntax error.  Return a pointer to the text, in memory obtained from
 18779  ** sqlite3_malloc().  Or, if the most recent error does not involve a
 18780  ** specific token that we can point to, return an empty string.
 18781  **
 18782  ** In all cases, the memory returned is obtained from sqlite3_malloc64()
 18783  ** and should be released by the caller invoking sqlite3_free().
 18784  */
 18785  static char *shell_error_context(const char *zSql, sqlite3 *db){
 18786    int iOffset;
 18787    size_t len;
 18788    char *zCode;
 18789    char *zMsg;
 18790    int i;
 18791    if( db==0
 18792     || zSql==0
 18793     || (iOffset = sqlite3_error_offset(db))<0
 18794     || iOffset>=(int)strlen(zSql)
 18795    ){
 18796      return sqlite3_mprintf("");
 18797    }
 18798    while( iOffset>50 ){
 18799      iOffset--;
 18800      zSql++;
 18801      while( (zSql[0]&0xc0)==0x80 ){ zSql++; iOffset--; }
 18802    }
 18803    len = strlen(zSql);
 18804    if( len>78 ){
 18805      len = 78;
 18806      while( len>0 && (zSql[len]&0xc0)==0x80 ) len--;
 18807    }
 18808    zCode = sqlite3_mprintf("%.*s", len, zSql);
 18809    shell_check_oom(zCode);
 18810    for(i=0; zCode[i]; i++){ if( IsSpace(zSql[i]) ) zCode[i] = ' '; }
 18811    if( iOffset<25 ){
 18812      zMsg = sqlite3_mprintf("\n  %z\n  %*s^--- error here", zCode,iOffset,"");
 18813    }else{
 18814      zMsg = sqlite3_mprintf("\n  %z\n  %*serror here ---^", zCode,iOffset-14,"");
 18815    }
 18816    return zMsg;
 18817  }
 18818  
 18819  
 18820  /*
 18821  ** Execute a query statement that will generate SQL output.  Print
 18822  ** the result columns, comma-separated, on a line and then add a
 18823  ** semicolon terminator to the end of that line.
 18824  **
 18825  ** If the number of columns is 1 and that column contains text "--"
 18826  ** then write the semicolon on a separate line.  That way, if a
 18827  ** "--" comment occurs at the end of the statement, the comment
 18828  ** won't consume the semicolon terminator.
 18829  */
 18830  static int run_table_dump_query(
 18831    ShellState *p,           /* Query context */
 18832    const char *zSelect      /* SELECT statement to extract content */
 18833  ){
 18834    sqlite3_stmt *pSelect;
 18835    int rc;
 18836    int nResult;
 18837    int i;
 18838    const char *z;
 18839    rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
 18840    if( rc!=SQLITE_OK || !pSelect ){
 18841      char *zContext = shell_error_context(zSelect, p->db);
 18842      utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n%s", rc,
 18843                  sqlite3_errmsg(p->db), zContext);
 18844      sqlite3_free(zContext);
 18845      if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
 18846      return rc;
 18847    }
 18848    rc = sqlite3_step(pSelect);
 18849    nResult = sqlite3_column_count(pSelect);
 18850    while( rc==SQLITE_ROW ){
 18851      z = (const char*)sqlite3_column_text(pSelect, 0);
 18852      utf8_printf(p->out, "%s", z);
 18853      for(i=1; i<nResult; i++){
 18854        utf8_printf(p->out, ",%s", sqlite3_column_text(pSelect, i));
 18855      }
 18856      if( z==0 ) z = "";
 18857      while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
 18858      if( z[0] ){
 18859        raw_printf(p->out, "\n;\n");
 18860      }else{
 18861        raw_printf(p->out, ";\n");
 18862      }
 18863      rc = sqlite3_step(pSelect);
 18864    }
 18865    rc = sqlite3_finalize(pSelect);
 18866    if( rc!=SQLITE_OK ){
 18867      utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
 18868                  sqlite3_errmsg(p->db));
 18869      if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
 18870    }
 18871    return rc;
 18872  }
 18873  
 18874  /*
 18875  ** Allocate space and save off string indicating current error.
 18876  */
 18877  static char *save_err_msg(
 18878    sqlite3 *db,           /* Database to query */
 18879    const char *zPhase,    /* When the error occurs */
 18880    int rc,                /* Error code returned from API */
 18881    const char *zSql       /* SQL string, or NULL */
 18882  ){
 18883    char *zErr;
 18884    char *zContext;
 18885    sqlite3_str *pStr = sqlite3_str_new(0);
 18886    sqlite3_str_appendf(pStr, "%s, %s", zPhase, sqlite3_errmsg(db));
 18887    if( rc>1 ){
 18888      sqlite3_str_appendf(pStr, " (%d)", rc);
 18889    }
 18890    zContext = shell_error_context(zSql, db);
 18891    if( zContext ){
 18892      sqlite3_str_appendall(pStr, zContext);
 18893      sqlite3_free(zContext);
 18894    }
 18895    zErr = sqlite3_str_finish(pStr);
 18896    shell_check_oom(zErr);
 18897    return zErr;
 18898  }
 18899  
 18900  #ifdef __linux__
 18901  /*
 18902  ** Attempt to display I/O stats on Linux using /proc/PID/io
 18903  */
 18904  static void displayLinuxIoStats(FILE *out){
 18905    FILE *in;
 18906    char z[200];
 18907    sqlite3_snprintf(sizeof(z), z, "/proc/%d/io", getpid());
 18908    in = fopen(z, "rb");
 18909    if( in==0 ) return;
 18910    while( fgets(z, sizeof(z), in)!=0 ){
 18911      static const struct {
 18912        const char *zPattern;
 18913        const char *zDesc;
 18914      } aTrans[] = {
 18915        { "rchar: ",                  "Bytes received by read():" },
 18916        { "wchar: ",                  "Bytes sent to write():"    },
 18917        { "syscr: ",                  "Read() system calls:"      },
 18918        { "syscw: ",                  "Write() system calls:"     },
 18919        { "read_bytes: ",             "Bytes read from storage:"  },
 18920        { "write_bytes: ",            "Bytes written to storage:" },
 18921        { "cancelled_write_bytes: ",  "Cancelled write bytes:"    },
 18922      };
 18923      int i;
 18924      for(i=0; i<ArraySize(aTrans); i++){
 18925        int n = strlen30(aTrans[i].zPattern);
 18926        if( cli_strncmp(aTrans[i].zPattern, z, n)==0 ){
 18927          utf8_printf(out, "%-36s %s", aTrans[i].zDesc, &z[n]);
 18928          break;
 18929        }
 18930      }
 18931    }
 18932    fclose(in);
 18933  }
 18934  #endif
 18935  
 18936  /*
 18937  ** Display a single line of status using 64-bit values.
 18938  */
 18939  static void displayStatLine(
 18940    ShellState *p,            /* The shell context */
 18941    char *zLabel,             /* Label for this one line */
 18942    char *zFormat,            /* Format for the result */
 18943    int iStatusCtrl,          /* Which status to display */
 18944    int bReset                /* True to reset the stats */
 18945  ){
 18946    sqlite3_int64 iCur = -1;
 18947    sqlite3_int64 iHiwtr = -1;
 18948    int i, nPercent;
 18949    char zLine[200];
 18950    sqlite3_status64(iStatusCtrl, &iCur, &iHiwtr, bReset);
 18951    for(i=0, nPercent=0; zFormat[i]; i++){
 18952      if( zFormat[i]=='%' ) nPercent++;
 18953    }
 18954    if( nPercent>1 ){
 18955      sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iCur, iHiwtr);
 18956    }else{
 18957      sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iHiwtr);
 18958    }
 18959    raw_printf(p->out, "%-36s %s\n", zLabel, zLine);
 18960  }
 18961  
 18962  /*
 18963  ** Display memory stats.
 18964  */
 18965  static int display_stats(
 18966    sqlite3 *db,                /* Database to query */
 18967    ShellState *pArg,           /* Pointer to ShellState */
 18968    int bReset                  /* True to reset the stats */
 18969  ){
 18970    int iCur;
 18971    int iHiwtr;
 18972    FILE *out;
 18973    if( pArg==0 || pArg->out==0 ) return 0;
 18974    out = pArg->out;
 18975  
 18976    if( pArg->pStmt && pArg->statsOn==2 ){
 18977      int nCol, i, x;
 18978      sqlite3_stmt *pStmt = pArg->pStmt;
 18979      char z[100];
 18980      nCol = sqlite3_column_count(pStmt);
 18981      raw_printf(out, "%-36s %d\n", "Number of output columns:", nCol);
 18982      for(i=0; i<nCol; i++){
 18983        sqlite3_snprintf(sizeof(z),z,"Column %d %nname:", i, &x);
 18984        utf8_printf(out, "%-36s %s\n", z, sqlite3_column_name(pStmt,i));
 18985  #ifndef SQLITE_OMIT_DECLTYPE
 18986        sqlite3_snprintf(30, z+x, "declared type:");
 18987        utf8_printf(out, "%-36s %s\n", z, sqlite3_column_decltype(pStmt, i));
 18988  #endif
 18989  #ifdef SQLITE_ENABLE_COLUMN_METADATA
 18990        sqlite3_snprintf(30, z+x, "database name:");
 18991        utf8_printf(out, "%-36s %s\n", z, sqlite3_column_database_name(pStmt,i));
 18992        sqlite3_snprintf(30, z+x, "table name:");
 18993        utf8_printf(out, "%-36s %s\n", z, sqlite3_column_table_name(pStmt,i));
 18994        sqlite3_snprintf(30, z+x, "origin name:");
 18995        utf8_printf(out, "%-36s %s\n", z, sqlite3_column_origin_name(pStmt,i));
 18996  #endif
 18997      }
 18998    }
 18999  
 19000    if( pArg->statsOn==3 ){
 19001      if( pArg->pStmt ){
 19002        iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP,bReset);
 19003        raw_printf(pArg->out, "VM-steps: %d\n", iCur);
 19004      }
 19005      return 0;
 19006    }
 19007  
 19008    displayStatLine(pArg, "Memory Used:",
 19009       "%lld (max %lld) bytes", SQLITE_STATUS_MEMORY_USED, bReset);
 19010    displayStatLine(pArg, "Number of Outstanding Allocations:",
 19011       "%lld (max %lld)", SQLITE_STATUS_MALLOC_COUNT, bReset);
 19012    if( pArg->shellFlgs & SHFLG_Pagecache ){
 19013      displayStatLine(pArg, "Number of Pcache Pages Used:",
 19014         "%lld (max %lld) pages", SQLITE_STATUS_PAGECACHE_USED, bReset);
 19015    }
 19016    displayStatLine(pArg, "Number of Pcache Overflow Bytes:",
 19017       "%lld (max %lld) bytes", SQLITE_STATUS_PAGECACHE_OVERFLOW, bReset);
 19018    displayStatLine(pArg, "Largest Allocation:",
 19019       "%lld bytes", SQLITE_STATUS_MALLOC_SIZE, bReset);
 19020    displayStatLine(pArg, "Largest Pcache Allocation:",
 19021       "%lld bytes", SQLITE_STATUS_PAGECACHE_SIZE, bReset);
 19022  #ifdef YYTRACKMAXSTACKDEPTH
 19023    displayStatLine(pArg, "Deepest Parser Stack:",
 19024       "%lld (max %lld)", SQLITE_STATUS_PARSER_STACK, bReset);
 19025  #endif
 19026  
 19027    if( db ){
 19028      if( pArg->shellFlgs & SHFLG_Lookaside ){
 19029        iHiwtr = iCur = -1;
 19030        sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED,
 19031                          &iCur, &iHiwtr, bReset);
 19032        raw_printf(pArg->out,
 19033                "Lookaside Slots Used:                %d (max %d)\n",
 19034                iCur, iHiwtr);
 19035        sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT,
 19036                          &iCur, &iHiwtr, bReset);
 19037        raw_printf(pArg->out, "Successful lookaside attempts:       %d\n",
 19038                iHiwtr);
 19039        sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE,
 19040                          &iCur, &iHiwtr, bReset);
 19041        raw_printf(pArg->out, "Lookaside failures due to size:      %d\n",
 19042                iHiwtr);
 19043        sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL,
 19044                          &iCur, &iHiwtr, bReset);
 19045        raw_printf(pArg->out, "Lookaside failures due to OOM:       %d\n",
 19046                iHiwtr);
 19047      }
 19048      iHiwtr = iCur = -1;
 19049      sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
 19050      raw_printf(pArg->out, "Pager Heap Usage:                    %d bytes\n",
 19051              iCur);
 19052      iHiwtr = iCur = -1;
 19053      sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
 19054      raw_printf(pArg->out, "Page cache hits:                     %d\n", iCur);
 19055      iHiwtr = iCur = -1;
 19056      sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
 19057      raw_printf(pArg->out, "Page cache misses:                   %d\n", iCur);
 19058      iHiwtr = iCur = -1;
 19059      sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
 19060      raw_printf(pArg->out, "Page cache writes:                   %d\n", iCur);
 19061      iHiwtr = iCur = -1;
 19062      sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_SPILL, &iCur, &iHiwtr, 1);
 19063      raw_printf(pArg->out, "Page cache spills:                   %d\n", iCur);
 19064      iHiwtr = iCur = -1;
 19065      sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
 19066      raw_printf(pArg->out, "Schema Heap Usage:                   %d bytes\n",
 19067              iCur);
 19068      iHiwtr = iCur = -1;
 19069      sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
 19070      raw_printf(pArg->out, "Statement Heap/Lookaside Usage:      %d bytes\n",
 19071              iCur);
 19072    }
 19073  
 19074    if( pArg->pStmt ){
 19075      int iHit, iMiss;
 19076      iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP,
 19077                                 bReset);
 19078      raw_printf(pArg->out, "Fullscan Steps:                      %d\n", iCur);
 19079      iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
 19080      raw_printf(pArg->out, "Sort Operations:                     %d\n", iCur);
 19081      iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset);
 19082      raw_printf(pArg->out, "Autoindex Inserts:                   %d\n", iCur);
 19083      iHit = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FILTER_HIT,
 19084                                 bReset);
 19085      iMiss = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FILTER_MISS,
 19086                                  bReset);
 19087      if( iHit || iMiss ){
 19088        raw_printf(pArg->out, "Bloom filter bypass taken:           %d/%d\n",
 19089              iHit, iHit+iMiss);
 19090      }
 19091      iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
 19092      raw_printf(pArg->out, "Virtual Machine Steps:               %d\n", iCur);
 19093      iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_REPREPARE,bReset);
 19094      raw_printf(pArg->out, "Reprepare operations:                %d\n", iCur);
 19095      iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_RUN, bReset);
 19096      raw_printf(pArg->out, "Number of times run:                 %d\n", iCur);
 19097      iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_MEMUSED, bReset);
 19098      raw_printf(pArg->out, "Memory used by prepared stmt:        %d\n", iCur);
 19099    }
 19100  
 19101  #ifdef __linux__
 19102    displayLinuxIoStats(pArg->out);
 19103  #endif
 19104  
 19105    /* Do not remove this machine readable comment: extra-stats-output-here */
 19106  
 19107    return 0;
 19108  }
 19109  
 19110  
 19111  #ifdef SQLITE_ENABLE_STMT_SCANSTATUS
 19112  static int scanStatsHeight(sqlite3_stmt *p, int iEntry){
 19113    int iPid = 0;
 19114    int ret = 1;
 19115    sqlite3_stmt_scanstatus_v2(p, iEntry,
 19116        SQLITE_SCANSTAT_SELECTID, SQLITE_SCANSTAT_COMPLEX, (void*)&iPid
 19117    );
 19118    while( iPid!=0 ){
 19119      int ii;
 19120      for(ii=0; 1; ii++){
 19121        int iId;
 19122        int res;
 19123        res = sqlite3_stmt_scanstatus_v2(p, ii,
 19124            SQLITE_SCANSTAT_SELECTID, SQLITE_SCANSTAT_COMPLEX, (void*)&iId
 19125        );
 19126        if( res ) break;
 19127        if( iId==iPid ){
 19128          sqlite3_stmt_scanstatus_v2(p, ii,
 19129              SQLITE_SCANSTAT_PARENTID, SQLITE_SCANSTAT_COMPLEX, (void*)&iPid
 19130          );
 19131        }
 19132      }
 19133      ret++;
 19134    }
 19135    return ret;
 19136  }
 19137  #endif
 19138  
 19139  #ifdef SQLITE_ENABLE_STMT_SCANSTATUS
 19140  static void display_explain_scanstats(
 19141    sqlite3 *db,                    /* Database to query */
 19142    ShellState *pArg                /* Pointer to ShellState */
 19143  ){
 19144    static const int f = SQLITE_SCANSTAT_COMPLEX;
 19145    sqlite3_stmt *p = pArg->pStmt;
 19146    int ii = 0;
 19147    i64 nTotal = 0;
 19148    int nWidth = 0;
 19149    eqp_reset(pArg);
 19150  
 19151    for(ii=0; 1; ii++){
 19152      const char *z = 0;
 19153      int n = 0;
 19154      if( sqlite3_stmt_scanstatus_v2(p,ii,SQLITE_SCANSTAT_EXPLAIN,f,(void*)&z) ){
 19155        break;
 19156      }
 19157      n = strlen(z) + scanStatsHeight(p, ii)*3;
 19158      if( n>nWidth ) nWidth = n;
 19159    }
 19160    nWidth += 4;
 19161  
 19162    sqlite3_stmt_scanstatus_v2(p, -1, SQLITE_SCANSTAT_NCYCLE, f, (void*)&nTotal);
 19163    for(ii=0; 1; ii++){
 19164      i64 nLoop = 0;
 19165      i64 nRow = 0;
 19166      i64 nCycle = 0;
 19167      int iId = 0;
 19168      int iPid = 0;
 19169      const char *z = 0;
 19170      const char *zName = 0;
 19171      char *zText = 0;
 19172      double rEst = 0.0;
 19173  
 19174      if( sqlite3_stmt_scanstatus_v2(p,ii,SQLITE_SCANSTAT_EXPLAIN,f,(void*)&z) ){
 19175        break;
 19176      }
 19177      sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_EST,f,(void*)&rEst);
 19178      sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_NLOOP,f,(void*)&nLoop);
 19179      sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_NVISIT,f,(void*)&nRow);
 19180      sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_NCYCLE,f,(void*)&nCycle);
 19181      sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_SELECTID,f,(void*)&iId);
 19182      sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_PARENTID,f,(void*)&iPid);
 19183      sqlite3_stmt_scanstatus_v2(p, ii, SQLITE_SCANSTAT_NAME,f,(void*)&zName);
 19184  
 19185      zText = sqlite3_mprintf("%s", z);
 19186      if( nCycle>=0 || nLoop>=0 || nRow>=0 ){
 19187        char *z = 0;
 19188        if( nCycle>=0 && nTotal>0 ){
 19189          z = sqlite3_mprintf("%zcycles=%lld [%d%%]", z,
 19190              nCycle, ((nCycle*100)+nTotal/2) / nTotal
 19191          );
 19192        }
 19193        if( nLoop>=0 ){
 19194          z = sqlite3_mprintf("%z%sloops=%lld", z, z ? " " : "", nLoop);
 19195        }
 19196        if( nRow>=0 ){
 19197          z = sqlite3_mprintf("%z%srows=%lld", z, z ? " " : "", nRow);
 19198        }
 19199  
 19200        if( zName && pArg->scanstatsOn>1 ){
 19201          double rpl = (double)nRow / (double)nLoop;
 19202          z = sqlite3_mprintf("%z rpl=%.1f est=%.1f", z, rpl, rEst);
 19203        }
 19204  
 19205        zText = sqlite3_mprintf(
 19206            "% *z (%z)", -1*(nWidth-scanStatsHeight(p, ii)*3), zText, z
 19207        );
 19208      }
 19209  
 19210      eqp_append(pArg, iId, iPid, zText);
 19211      sqlite3_free(zText);
 19212    }
 19213  
 19214    eqp_render(pArg, nTotal);
 19215  }
 19216  #endif
 19217  
 19218  
 19219  /*
 19220  ** Parameter azArray points to a zero-terminated array of strings. zStr
 19221  ** points to a single nul-terminated string. Return non-zero if zStr
 19222  ** is equal, according to strcmp(), to any of the strings in the array.
 19223  ** Otherwise, return zero.
 19224  */
 19225  static int str_in_array(const char *zStr, const char **azArray){
 19226    int i;
 19227    for(i=0; azArray[i]; i++){
 19228      if( 0==cli_strcmp(zStr, azArray[i]) ) return 1;
 19229    }
 19230    return 0;
 19231  }
 19232  
 19233  /*
 19234  ** If compiled statement pSql appears to be an EXPLAIN statement, allocate
 19235  ** and populate the ShellState.aiIndent[] array with the number of
 19236  ** spaces each opcode should be indented before it is output.
 19237  **
 19238  ** The indenting rules are:
 19239  **
 19240  **     * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
 19241  **       all opcodes that occur between the p2 jump destination and the opcode
 19242  **       itself by 2 spaces.
 19243  **
 19244  **     * Do the previous for "Return" instructions for when P2 is positive.
 19245  **       See tag-20220407a in wherecode.c and vdbe.c.
 19246  **
 19247  **     * For each "Goto", if the jump destination is earlier in the program
 19248  **       and ends on one of:
 19249  **          Yield  SeekGt  SeekLt  RowSetRead  Rewind
 19250  **       or if the P1 parameter is one instead of zero,
 19251  **       then indent all opcodes between the earlier instruction
 19252  **       and "Goto" by 2 spaces.
 19253  */
 19254  static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){
 19255    int *abYield = 0;               /* True if op is an OP_Yield */
 19256    int nAlloc = 0;                 /* Allocated size of p->aiIndent[], abYield */
 19257    int iOp;                        /* Index of operation in p->aiIndent[] */
 19258  
 19259    const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext",
 19260                             "Return", 0 };
 19261    const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead",
 19262                              "Rewind", 0 };
 19263    const char *azGoto[] = { "Goto", 0 };
 19264  
 19265    /* The caller guarantees that the leftmost 4 columns of the statement
 19266    ** passed to this function are equivalent to the leftmost 4 columns
 19267    ** of EXPLAIN statement output. In practice the statement may be
 19268    ** an EXPLAIN, or it may be a query on the bytecode() virtual table.  */
 19269    assert( sqlite3_column_count(pSql)>=4 );
 19270    assert( 0==sqlite3_stricmp( sqlite3_column_name(pSql, 0), "addr" ) );
 19271    assert( 0==sqlite3_stricmp( sqlite3_column_name(pSql, 1), "opcode" ) );
 19272    assert( 0==sqlite3_stricmp( sqlite3_column_name(pSql, 2), "p1" ) );
 19273    assert( 0==sqlite3_stricmp( sqlite3_column_name(pSql, 3), "p2" ) );
 19274  
 19275    for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
 19276      int i;
 19277      int iAddr = sqlite3_column_int(pSql, 0);
 19278      const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
 19279      int p1 = sqlite3_column_int(pSql, 2);
 19280      int p2 = sqlite3_column_int(pSql, 3);
 19281  
 19282      /* Assuming that p2 is an instruction address, set variable p2op to the
 19283      ** index of that instruction in the aiIndent[] array. p2 and p2op may be
 19284      ** different if the current instruction is part of a sub-program generated
 19285      ** by an SQL trigger or foreign key.  */
 19286      int p2op = (p2 + (iOp-iAddr));
 19287  
 19288      /* Grow the p->aiIndent array as required */
 19289      if( iOp>=nAlloc ){
 19290        nAlloc += 100;
 19291        p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int));
 19292        shell_check_oom(p->aiIndent);
 19293        abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int));
 19294        shell_check_oom(abYield);
 19295      }
 19296  
 19297      abYield[iOp] = str_in_array(zOp, azYield);
 19298      p->aiIndent[iOp] = 0;
 19299      p->nIndent = iOp+1;
 19300      if( str_in_array(zOp, azNext) && p2op>0 ){
 19301        for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
 19302      }
 19303      if( str_in_array(zOp, azGoto) && p2op<iOp && (abYield[p2op] || p1) ){
 19304        for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
 19305      }
 19306    }
 19307  
 19308    p->iIndent = 0;
 19309    sqlite3_free(abYield);
 19310    sqlite3_reset(pSql);
 19311  }
 19312  
 19313  /*
 19314  ** Free the array allocated by explain_data_prepare().
 19315  */
 19316  static void explain_data_delete(ShellState *p){
 19317    sqlite3_free(p->aiIndent);
 19318    p->aiIndent = 0;
 19319    p->nIndent = 0;
 19320    p->iIndent = 0;
 19321  }
 19322  
 19323  static void exec_prepared_stmt(ShellState*, sqlite3_stmt*);
 19324  
 19325  /*
 19326  ** Display scan stats.
 19327  */
 19328  static void display_scanstats(
 19329    sqlite3 *db,                    /* Database to query */
 19330    ShellState *pArg                /* Pointer to ShellState */
 19331  ){
 19332  #ifndef SQLITE_ENABLE_STMT_SCANSTATUS
 19333    UNUSED_PARAMETER(db);
 19334    UNUSED_PARAMETER(pArg);
 19335  #else
 19336    if( pArg->scanstatsOn==3 ){
 19337      const char *zSql = 
 19338        "  SELECT addr, opcode, p1, p2, p3, p4, p5, comment, nexec,"
 19339        "   round(ncycle*100.0 / (sum(ncycle) OVER ()), 2)||'%' AS cycles"
 19340        "   FROM bytecode(?)";
 19341  
 19342      int rc = SQLITE_OK;
 19343      sqlite3_stmt *pStmt = 0;
 19344      rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
 19345      if( rc==SQLITE_OK ){
 19346        sqlite3_stmt *pSave = pArg->pStmt;
 19347        pArg->pStmt = pStmt;
 19348        sqlite3_bind_pointer(pStmt, 1, pSave, "stmt-pointer", 0);
 19349  
 19350        pArg->cnt = 0;
 19351        pArg->cMode = MODE_ScanExp;
 19352        explain_data_prepare(pArg, pStmt);
 19353        exec_prepared_stmt(pArg, pStmt);
 19354        explain_data_delete(pArg);
 19355  
 19356        sqlite3_finalize(pStmt);
 19357        pArg->pStmt = pSave;
 19358      }
 19359    }else{
 19360      display_explain_scanstats(db, pArg);
 19361    }
 19362  #endif
 19363  }
 19364  
 19365  /*
 19366  ** Disable and restore .wheretrace and .treetrace/.selecttrace settings.
 19367  */
 19368  static unsigned int savedSelectTrace;
 19369  static unsigned int savedWhereTrace;
 19370  static void disable_debug_trace_modes(void){
 19371    unsigned int zero = 0;
 19372    sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 0, &savedSelectTrace);
 19373    sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &zero);
 19374    sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 2, &savedWhereTrace);
 19375    sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &zero);
 19376  }
 19377  static void restore_debug_trace_modes(void){
 19378    sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &savedSelectTrace);
 19379    sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &savedWhereTrace);
 19380  }
 19381  
 19382  /* Create the TEMP table used to store parameter bindings */
 19383  static void bind_table_init(ShellState *p){
 19384    int wrSchema = 0;
 19385    int defensiveMode = 0;
 19386    sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, -1, &defensiveMode);
 19387    sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, 0, 0);
 19388    sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, -1, &wrSchema);
 19389    sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, 1, 0);
 19390    sqlite3_exec(p->db,
 19391      "CREATE TABLE IF NOT EXISTS temp.sqlite_parameters(\n"
 19392      "  key TEXT PRIMARY KEY,\n"
 19393      "  value\n"
 19394      ") WITHOUT ROWID;",
 19395      0, 0, 0);
 19396    sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, wrSchema, 0);
 19397    sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, defensiveMode, 0);
 19398  }
 19399  
 19400  /*
 19401  ** Bind parameters on a prepared statement.
 19402  **
 19403  ** Parameter bindings are taken from a TEMP table of the form:
 19404  **
 19405  **    CREATE TEMP TABLE sqlite_parameters(key TEXT PRIMARY KEY, value)
 19406  **    WITHOUT ROWID;
 19407  **
 19408  ** No bindings occur if this table does not exist.  The name of the table
 19409  ** begins with "sqlite_" so that it will not collide with ordinary application
 19410  ** tables.  The table must be in the TEMP schema.
 19411  */
 19412  static void bind_prepared_stmt(ShellState *pArg, sqlite3_stmt *pStmt){
 19413    int nVar;
 19414    int i;
 19415    int rc;
 19416    sqlite3_stmt *pQ = 0;
 19417  
 19418    nVar = sqlite3_bind_parameter_count(pStmt);
 19419    if( nVar==0 ) return;  /* Nothing to do */
 19420    if( sqlite3_table_column_metadata(pArg->db, "TEMP", "sqlite_parameters",
 19421                                      "key", 0, 0, 0, 0, 0)!=SQLITE_OK ){
 19422      rc = SQLITE_NOTFOUND;
 19423      pQ = 0;
 19424    }else{
 19425      rc = sqlite3_prepare_v2(pArg->db,
 19426              "SELECT value FROM temp.sqlite_parameters"
 19427              " WHERE key=?1", -1, &pQ, 0);
 19428    }
 19429    for(i=1; i<=nVar; i++){
 19430      char zNum[30];
 19431      const char *zVar = sqlite3_bind_parameter_name(pStmt, i);
 19432      if( zVar==0 ){
 19433        sqlite3_snprintf(sizeof(zNum),zNum,"?%d",i);
 19434        zVar = zNum;
 19435      }
 19436      sqlite3_bind_text(pQ, 1, zVar, -1, SQLITE_STATIC);
 19437      if( rc==SQLITE_OK && pQ && sqlite3_step(pQ)==SQLITE_ROW ){
 19438        sqlite3_bind_value(pStmt, i, sqlite3_column_value(pQ, 0));
 19439  #ifdef NAN
 19440      }else if( sqlite3_strlike("_NAN", zVar, 0)==0 ){
 19441        sqlite3_bind_double(pStmt, i, NAN);
 19442  #endif
 19443  #ifdef INFINITY
 19444      }else if( sqlite3_strlike("_INF", zVar, 0)==0 ){
 19445        sqlite3_bind_double(pStmt, i, INFINITY);
 19446  #endif
 19447      }else{
 19448        sqlite3_bind_null(pStmt, i);
 19449      }
 19450      sqlite3_reset(pQ);
 19451    }
 19452    sqlite3_finalize(pQ);
 19453  }
 19454  
 19455  /*
 19456  ** UTF8 box-drawing characters.  Imagine box lines like this:
 19457  **
 19458  **           1
 19459  **           |
 19460  **       4 --+-- 2
 19461  **           |
 19462  **           3
 19463  **
 19464  ** Each box characters has between 2 and 4 of the lines leading from
 19465  ** the center.  The characters are here identified by the numbers of
 19466  ** their corresponding lines.
 19467  */
 19468  #define BOX_24   "\342\224\200"  /* U+2500 --- */
 19469  #define BOX_13   "\342\224\202"  /* U+2502  |  */
 19470  #define BOX_23   "\342\224\214"  /* U+250c  ,- */
 19471  #define BOX_34   "\342\224\220"  /* U+2510 -,  */
 19472  #define BOX_12   "\342\224\224"  /* U+2514  '- */
 19473  #define BOX_14   "\342\224\230"  /* U+2518 -'  */
 19474  #define BOX_123  "\342\224\234"  /* U+251c  |- */
 19475  #define BOX_134  "\342\224\244"  /* U+2524 -|  */
 19476  #define BOX_234  "\342\224\254"  /* U+252c -,- */
 19477  #define BOX_124  "\342\224\264"  /* U+2534 -'- */
 19478  #define BOX_1234 "\342\224\274"  /* U+253c -|- */
 19479  
 19480  /* Draw horizontal line N characters long using unicode box
 19481  ** characters
 19482  */
 19483  static void print_box_line(FILE *out, int N){
 19484    const char zDash[] =
 19485        BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24
 19486        BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24;
 19487    const int nDash = sizeof(zDash) - 1;
 19488    N *= 3;
 19489    while( N>nDash ){
 19490      utf8_printf(out, zDash);
 19491      N -= nDash;
 19492    }
 19493    utf8_printf(out, "%.*s", N, zDash);
 19494  }
 19495  
 19496  /*
 19497  ** Draw a horizontal separator for a MODE_Box table.
 19498  */
 19499  static void print_box_row_separator(
 19500    ShellState *p,
 19501    int nArg,
 19502    const char *zSep1,
 19503    const char *zSep2,
 19504    const char *zSep3
 19505  ){
 19506    int i;
 19507    if( nArg>0 ){
 19508      utf8_printf(p->out, "%s", zSep1);
 19509      print_box_line(p->out, p->actualWidth[0]+2);
 19510      for(i=1; i<nArg; i++){
 19511        utf8_printf(p->out, "%s", zSep2);
 19512        print_box_line(p->out, p->actualWidth[i]+2);
 19513      }
 19514      utf8_printf(p->out, "%s", zSep3);
 19515    }
 19516    fputs("\n", p->out);
 19517  }
 19518  
 19519  /*
 19520  ** z[] is a line of text that is to be displayed the .mode box or table or
 19521  ** similar tabular formats.  z[] might contain control characters such
 19522  ** as \n, \t, \f, or \r.
 19523  **
 19524  ** Compute characters to display on the first line of z[].  Stop at the
 19525  ** first \r, \n, or \f.  Expand \t into spaces.  Return a copy (obtained
 19526  ** from malloc()) of that first line, which caller should free sometime.
 19527  ** Write anything to display on the next line into *pzTail.  If this is
 19528  ** the last line, write a NULL into *pzTail. (*pzTail is not allocated.)
 19529  */
 19530  static char *translateForDisplayAndDup(
 19531    const unsigned char *z,            /* Input text to be transformed */
 19532    const unsigned char **pzTail,      /* OUT: Tail of the input for next line */
 19533    int mxWidth,                       /* Max width.  0 means no limit */
 19534    u8 bWordWrap                       /* If true, avoid breaking mid-word */
 19535  ){
 19536    int i;                 /* Input bytes consumed */
 19537    int j;                 /* Output bytes generated */
 19538    int k;                 /* Input bytes to be displayed */
 19539    int n;                 /* Output column number */
 19540    unsigned char *zOut;   /* Output text */
 19541  
 19542    if( z==0 ){
 19543      *pzTail = 0;
 19544      return 0;
 19545    }
 19546    if( mxWidth<0 ) mxWidth = -mxWidth;
 19547    if( mxWidth==0 ) mxWidth = 1000000;
 19548    i = j = n = 0;
 19549    while( n<mxWidth ){
 19550      if( z[i]>=' ' ){
 19551        n++;
 19552        do{ i++; j++; }while( (z[i]&0xc0)==0x80 );
 19553        continue;
 19554      }
 19555      if( z[i]=='\t' ){
 19556        do{
 19557          n++;
 19558          j++;
 19559        }while( (n&7)!=0 && n<mxWidth );
 19560        i++;
 19561        continue;
 19562      }
 19563      break;
 19564    }
 19565    if( n>=mxWidth && bWordWrap  ){
 19566      /* Perhaps try to back up to a better place to break the line */
 19567      for(k=i; k>i/2; k--){
 19568        if( isspace(z[k-1]) ) break;
 19569      }
 19570      if( k<=i/2 ){
 19571        for(k=i; k>i/2; k--){
 19572          if( isalnum(z[k-1])!=isalnum(z[k]) && (z[k]&0xc0)!=0x80 ) break;
 19573        }
 19574      }
 19575      if( k<=i/2 ){
 19576        k = i;
 19577      }else{
 19578        i = k;
 19579        while( z[i]==' ' ) i++;
 19580      }
 19581    }else{
 19582      k = i;
 19583    }
 19584    if( n>=mxWidth && z[i]>=' ' ){
 19585     *pzTail = &z[i];
 19586    }else if( z[i]=='\r' && z[i+1]=='\n' ){
 19587      *pzTail = z[i+2] ? &z[i+2] : 0;
 19588    }else if( z[i]==0 || z[i+1]==0 ){
 19589      *pzTail = 0;
 19590    }else{
 19591      *pzTail = &z[i+1];
 19592    }
 19593    zOut = malloc( j+1 );
 19594    shell_check_oom(zOut);
 19595    i = j = n = 0;
 19596    while( i<k ){
 19597      if( z[i]>=' ' ){
 19598        n++;
 19599        do{ zOut[j++] = z[i++]; }while( (z[i]&0xc0)==0x80 );
 19600        continue;
 19601      }
 19602      if( z[i]=='\t' ){
 19603        do{
 19604          n++;
 19605          zOut[j++] = ' ';
 19606        }while( (n&7)!=0 && n<mxWidth );
 19607        i++;
 19608        continue;
 19609      }
 19610      break;
 19611    }
 19612    zOut[j] = 0;
 19613    return (char*)zOut;
 19614  }
 19615  
 19616  /* Extract the value of the i-th current column for pStmt as an SQL literal
 19617  ** value.  Memory is obtained from sqlite3_malloc64() and must be freed by
 19618  ** the caller.
 19619  */
 19620  static char *quoted_column(sqlite3_stmt *pStmt, int i){
 19621    switch( sqlite3_column_type(pStmt, i) ){
 19622      case SQLITE_NULL: {
 19623        return sqlite3_mprintf("NULL");
 19624      }
 19625      case SQLITE_INTEGER:
 19626      case SQLITE_FLOAT: {
 19627        return sqlite3_mprintf("%s",sqlite3_column_text(pStmt,i));
 19628      }
 19629      case SQLITE_TEXT: {
 19630        return sqlite3_mprintf("%Q",sqlite3_column_text(pStmt,i));
 19631      }
 19632      case SQLITE_BLOB: {
 19633        int j;
 19634        sqlite3_str *pStr = sqlite3_str_new(0);
 19635        const unsigned char *a = sqlite3_column_blob(pStmt,i);
 19636        int n = sqlite3_column_bytes(pStmt,i);
 19637        sqlite3_str_append(pStr, "x'", 2);
 19638        for(j=0; j<n; j++){
 19639          sqlite3_str_appendf(pStr, "%02x", a[j]);
 19640        }
 19641        sqlite3_str_append(pStr, "'", 1);
 19642        return sqlite3_str_finish(pStr);
 19643      }
 19644    }
 19645    return 0; /* Not reached */
 19646  }
 19647  
 19648  /*
 19649  ** Run a prepared statement and output the result in one of the
 19650  ** table-oriented formats: MODE_Column, MODE_Markdown, MODE_Table,
 19651  ** or MODE_Box.
 19652  **
 19653  ** This is different from ordinary exec_prepared_stmt() in that
 19654  ** it has to run the entire query and gather the results into memory
 19655  ** first, in order to determine column widths, before providing
 19656  ** any output.
 19657  */
 19658  static void exec_prepared_stmt_columnar(
 19659    ShellState *p,                        /* Pointer to ShellState */
 19660    sqlite3_stmt *pStmt                   /* Statement to run */
 19661  ){
 19662    sqlite3_int64 nRow = 0;
 19663    int nColumn = 0;
 19664    char **azData = 0;
 19665    sqlite3_int64 nAlloc = 0;
 19666    char *abRowDiv = 0;
 19667    const unsigned char *uz;
 19668    const char *z;
 19669    char **azQuoted = 0;
 19670    int rc;
 19671    sqlite3_int64 i, nData;
 19672    int j, nTotal, w, n;
 19673    const char *colSep = 0;
 19674    const char *rowSep = 0;
 19675    const unsigned char **azNextLine = 0;
 19676    int bNextLine = 0;
 19677    int bMultiLineRowExists = 0;
 19678    int bw = p->cmOpts.bWordWrap;
 19679    const char *zEmpty = "";
 19680    const char *zShowNull = p->nullValue;
 19681  
 19682    rc = sqlite3_step(pStmt);
 19683    if( rc!=SQLITE_ROW ) return;
 19684    nColumn = sqlite3_column_count(pStmt);
 19685    nAlloc = nColumn*4;
 19686    if( nAlloc<=0 ) nAlloc = 1;
 19687    azData = sqlite3_malloc64( nAlloc*sizeof(char*) );
 19688    shell_check_oom(azData);
 19689    azNextLine = sqlite3_malloc64( nColumn*sizeof(char*) );
 19690    shell_check_oom(azNextLine);
 19691    memset((void*)azNextLine, 0, nColumn*sizeof(char*) );
 19692    if( p->cmOpts.bQuote ){
 19693      azQuoted = sqlite3_malloc64( nColumn*sizeof(char*) );
 19694      shell_check_oom(azQuoted);
 19695      memset(azQuoted, 0, nColumn*sizeof(char*) );
 19696    }
 19697    abRowDiv = sqlite3_malloc64( nAlloc/nColumn );
 19698    shell_check_oom(abRowDiv);
 19699    if( nColumn>p->nWidth ){
 19700      p->colWidth = realloc(p->colWidth, (nColumn+1)*2*sizeof(int));
 19701      shell_check_oom(p->colWidth);
 19702      for(i=p->nWidth; i<nColumn; i++) p->colWidth[i] = 0;
 19703      p->nWidth = nColumn;
 19704      p->actualWidth = &p->colWidth[nColumn];
 19705    }
 19706    memset(p->actualWidth, 0, nColumn*sizeof(int));
 19707    for(i=0; i<nColumn; i++){
 19708      w = p->colWidth[i];
 19709      if( w<0 ) w = -w;
 19710      p->actualWidth[i] = w;
 19711    }
 19712    for(i=0; i<nColumn; i++){
 19713      const unsigned char *zNotUsed;
 19714      int wx = p->colWidth[i];
 19715      if( wx==0 ){
 19716        wx = p->cmOpts.iWrap;
 19717      }
 19718      if( wx<0 ) wx = -wx;
 19719      uz = (const unsigned char*)sqlite3_column_name(pStmt,i);
 19720      if( uz==0 ) uz = (u8*)"";
 19721      azData[i] = translateForDisplayAndDup(uz, &zNotUsed, wx, bw);
 19722    }
 19723    do{
 19724      int useNextLine = bNextLine;
 19725      bNextLine = 0;
 19726      if( (nRow+2)*nColumn >= nAlloc ){
 19727        nAlloc *= 2;
 19728        azData = sqlite3_realloc64(azData, nAlloc*sizeof(char*));
 19729        shell_check_oom(azData);
 19730        abRowDiv = sqlite3_realloc64(abRowDiv, nAlloc/nColumn);
 19731        shell_check_oom(abRowDiv);
 19732      }
 19733      abRowDiv[nRow] = 1;
 19734      nRow++;
 19735      for(i=0; i<nColumn; i++){
 19736        int wx = p->colWidth[i];
 19737        if( wx==0 ){
 19738          wx = p->cmOpts.iWrap;
 19739        }
 19740        if( wx<0 ) wx = -wx;
 19741        if( useNextLine ){
 19742          uz = azNextLine[i];
 19743          if( uz==0 ) uz = (u8*)zEmpty;
 19744        }else if( p->cmOpts.bQuote ){
 19745          sqlite3_free(azQuoted[i]);
 19746          azQuoted[i] = quoted_column(pStmt,i);
 19747          uz = (const unsigned char*)azQuoted[i];
 19748        }else{
 19749          uz = (const unsigned char*)sqlite3_column_text(pStmt,i);
 19750          if( uz==0 ) uz = (u8*)zShowNull;
 19751        }
 19752        azData[nRow*nColumn + i]
 19753          = translateForDisplayAndDup(uz, &azNextLine[i], wx, bw);
 19754        if( azNextLine[i] ){
 19755          bNextLine = 1;
 19756          abRowDiv[nRow-1] = 0;
 19757          bMultiLineRowExists = 1;
 19758        }
 19759      }
 19760    }while( bNextLine || sqlite3_step(pStmt)==SQLITE_ROW );
 19761    nTotal = nColumn*(nRow+1);
 19762    for(i=0; i<nTotal; i++){
 19763      z = azData[i];
 19764      if( z==0 ) z = (char*)zEmpty;
 19765      n = strlenChar(z);
 19766      j = i%nColumn;
 19767      if( n>p->actualWidth[j] ) p->actualWidth[j] = n;
 19768    }
 19769    if( seenInterrupt ) goto columnar_end;
 19770    if( nColumn==0 ) goto columnar_end;
 19771    switch( p->cMode ){
 19772      case MODE_Column: {
 19773        colSep = "  ";
 19774        rowSep = "\n";
 19775        if( p->showHeader ){
 19776          for(i=0; i<nColumn; i++){
 19777            w = p->actualWidth[i];
 19778            if( p->colWidth[i]<0 ) w = -w;
 19779            utf8_width_print(p->out, w, azData[i]);
 19780            fputs(i==nColumn-1?"\n":"  ", p->out);
 19781          }
 19782          for(i=0; i<nColumn; i++){
 19783            print_dashes(p->out, p->actualWidth[i]);
 19784            fputs(i==nColumn-1?"\n":"  ", p->out);
 19785          }
 19786        }
 19787        break;
 19788      }
 19789      case MODE_Table: {
 19790        colSep = " | ";
 19791        rowSep = " |\n";
 19792        print_row_separator(p, nColumn, "+");
 19793        fputs("| ", p->out);
 19794        for(i=0; i<nColumn; i++){
 19795          w = p->actualWidth[i];
 19796          n = strlenChar(azData[i]);
 19797          utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, "");
 19798          fputs(i==nColumn-1?" |\n":" | ", p->out);
 19799        }
 19800        print_row_separator(p, nColumn, "+");
 19801        break;
 19802      }
 19803      case MODE_Markdown: {
 19804        colSep = " | ";
 19805        rowSep = " |\n";
 19806        fputs("| ", p->out);
 19807        for(i=0; i<nColumn; i++){
 19808          w = p->actualWidth[i];
 19809          n = strlenChar(azData[i]);
 19810          utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, "");
 19811          fputs(i==nColumn-1?" |\n":" | ", p->out);
 19812        }
 19813        print_row_separator(p, nColumn, "|");
 19814        break;
 19815      }
 19816      case MODE_Box: {
 19817        colSep = " " BOX_13 " ";
 19818        rowSep = " " BOX_13 "\n";
 19819        print_box_row_separator(p, nColumn, BOX_23, BOX_234, BOX_34);
 19820        utf8_printf(p->out, BOX_13 " ");
 19821        for(i=0; i<nColumn; i++){
 19822          w = p->actualWidth[i];
 19823          n = strlenChar(azData[i]);
 19824          utf8_printf(p->out, "%*s%s%*s%s",
 19825              (w-n)/2, "", azData[i], (w-n+1)/2, "",
 19826              i==nColumn-1?" "BOX_13"\n":" "BOX_13" ");
 19827        }
 19828        print_box_row_separator(p, nColumn, BOX_123, BOX_1234, BOX_134);
 19829        break;
 19830      }
 19831    }
 19832    for(i=nColumn, j=0; i<nTotal; i++, j++){
 19833      if( j==0 && p->cMode!=MODE_Column ){
 19834        utf8_printf(p->out, "%s", p->cMode==MODE_Box?BOX_13" ":"| ");
 19835      }
 19836      z = azData[i];
 19837      if( z==0 ) z = p->nullValue;
 19838      w = p->actualWidth[j];
 19839      if( p->colWidth[j]<0 ) w = -w;
 19840      utf8_width_print(p->out, w, z);
 19841      if( j==nColumn-1 ){
 19842        utf8_printf(p->out, "%s", rowSep);
 19843        if( bMultiLineRowExists && abRowDiv[i/nColumn-1] && i+1<nTotal ){
 19844          if( p->cMode==MODE_Table ){
 19845            print_row_separator(p, nColumn, "+");
 19846          }else if( p->cMode==MODE_Box ){
 19847            print_box_row_separator(p, nColumn, BOX_123, BOX_1234, BOX_134);
 19848          }else if( p->cMode==MODE_Column ){
 19849            raw_printf(p->out, "\n");
 19850          }
 19851        }
 19852        j = -1;
 19853        if( seenInterrupt ) goto columnar_end;
 19854      }else{
 19855        utf8_printf(p->out, "%s", colSep);
 19856      }
 19857    }
 19858    if( p->cMode==MODE_Table ){
 19859      print_row_separator(p, nColumn, "+");
 19860    }else if( p->cMode==MODE_Box ){
 19861      print_box_row_separator(p, nColumn, BOX_12, BOX_124, BOX_14);
 19862    }
 19863  columnar_end:
 19864    if( seenInterrupt ){
 19865      utf8_printf(p->out, "Interrupt\n");
 19866    }
 19867    nData = (nRow+1)*nColumn;
 19868    for(i=0; i<nData; i++){
 19869      z = azData[i];
 19870      if( z!=zEmpty && z!=zShowNull ) free(azData[i]);
 19871    }
 19872    sqlite3_free(azData);
 19873    sqlite3_free((void*)azNextLine);
 19874    sqlite3_free(abRowDiv);
 19875    if( azQuoted ){
 19876      for(i=0; i<nColumn; i++) sqlite3_free(azQuoted[i]);
 19877      sqlite3_free(azQuoted);
 19878    }
 19879  }
 19880  
 19881  /*
 19882  ** Run a prepared statement
 19883  */
 19884  static void exec_prepared_stmt(
 19885    ShellState *pArg,                                /* Pointer to ShellState */
 19886    sqlite3_stmt *pStmt                              /* Statement to run */
 19887  ){
 19888    int rc;
 19889    sqlite3_uint64 nRow = 0;
 19890  
 19891    if( pArg->cMode==MODE_Column
 19892     || pArg->cMode==MODE_Table
 19893     || pArg->cMode==MODE_Box
 19894     || pArg->cMode==MODE_Markdown
 19895    ){
 19896      exec_prepared_stmt_columnar(pArg, pStmt);
 19897      return;
 19898    }
 19899  
 19900    /* perform the first step.  this will tell us if we
 19901    ** have a result set or not and how wide it is.
 19902    */
 19903    rc = sqlite3_step(pStmt);
 19904    /* if we have a result set... */
 19905    if( SQLITE_ROW == rc ){
 19906      /* allocate space for col name ptr, value ptr, and type */
 19907      int nCol = sqlite3_column_count(pStmt);
 19908      void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1);
 19909      if( !pData ){
 19910        shell_out_of_memory();
 19911      }else{
 19912        char **azCols = (char **)pData;      /* Names of result columns */
 19913        char **azVals = &azCols[nCol];       /* Results */
 19914        int *aiTypes = (int *)&azVals[nCol]; /* Result types */
 19915        int i, x;
 19916        assert(sizeof(int) <= sizeof(char *));
 19917        /* save off ptrs to column names */
 19918        for(i=0; i<nCol; i++){
 19919          azCols[i] = (char *)sqlite3_column_name(pStmt, i);
 19920        }
 19921        do{
 19922          nRow++;
 19923          /* extract the data and data types */
 19924          for(i=0; i<nCol; i++){
 19925            aiTypes[i] = x = sqlite3_column_type(pStmt, i);
 19926            if( x==SQLITE_BLOB
 19927             && pArg
 19928             && (pArg->cMode==MODE_Insert || pArg->cMode==MODE_Quote)
 19929            ){
 19930              azVals[i] = "";
 19931            }else{
 19932              azVals[i] = (char*)sqlite3_column_text(pStmt, i);
 19933            }
 19934            if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
 19935              rc = SQLITE_NOMEM;
 19936              break; /* from for */
 19937            }
 19938          } /* end for */
 19939  
 19940          /* if data and types extracted successfully... */
 19941          if( SQLITE_ROW == rc ){
 19942            /* call the supplied callback with the result row data */
 19943            if( shell_callback(pArg, nCol, azVals, azCols, aiTypes) ){
 19944              rc = SQLITE_ABORT;
 19945            }else{
 19946              rc = sqlite3_step(pStmt);
 19947            }
 19948          }
 19949        } while( SQLITE_ROW == rc );
 19950        sqlite3_free(pData);
 19951        if( pArg->cMode==MODE_Json ){
 19952          fputs("]\n", pArg->out);
 19953        }else if( pArg->cMode==MODE_Count ){
 19954          char zBuf[200];
 19955          sqlite3_snprintf(sizeof(zBuf), zBuf, "%llu row%s\n",
 19956                           nRow, nRow!=1 ? "s" : "");
 19957          printf("%s", zBuf);
 19958        }
 19959      }
 19960    }
 19961  }
 19962  
 19963  #ifndef SQLITE_OMIT_VIRTUALTABLE
 19964  /*
 19965  ** This function is called to process SQL if the previous shell command
 19966  ** was ".expert". It passes the SQL in the second argument directly to
 19967  ** the sqlite3expert object.
 19968  **
 19969  ** If successful, SQLITE_OK is returned. Otherwise, an SQLite error
 19970  ** code. In this case, (*pzErr) may be set to point to a buffer containing
 19971  ** an English language error message. It is the responsibility of the
 19972  ** caller to eventually free this buffer using sqlite3_free().
 19973  */
 19974  static int expertHandleSQL(
 19975    ShellState *pState,
 19976    const char *zSql,
 19977    char **pzErr
 19978  ){
 19979    assert( pState->expert.pExpert );
 19980    assert( pzErr==0 || *pzErr==0 );
 19981    return sqlite3_expert_sql(pState->expert.pExpert, zSql, pzErr);
 19982  }
 19983  
 19984  /*
 19985  ** This function is called either to silently clean up the object
 19986  ** created by the ".expert" command (if bCancel==1), or to generate a
 19987  ** report from it and then clean it up (if bCancel==0).
 19988  **
 19989  ** If successful, SQLITE_OK is returned. Otherwise, an SQLite error
 19990  ** code. In this case, (*pzErr) may be set to point to a buffer containing
 19991  ** an English language error message. It is the responsibility of the
 19992  ** caller to eventually free this buffer using sqlite3_free().
 19993  */
 19994  static int expertFinish(
 19995    ShellState *pState,
 19996    int bCancel,
 19997    char **pzErr
 19998  ){
 19999    int rc = SQLITE_OK;
 20000    sqlite3expert *p = pState->expert.pExpert;
 20001    assert( p );
 20002    assert( bCancel || pzErr==0 || *pzErr==0 );
 20003    if( bCancel==0 ){
 20004      FILE *out = pState->out;
 20005      int bVerbose = pState->expert.bVerbose;
 20006  
 20007      rc = sqlite3_expert_analyze(p, pzErr);
 20008      if( rc==SQLITE_OK ){
 20009        int nQuery = sqlite3_expert_count(p);
 20010        int i;
 20011  
 20012        if( bVerbose ){
 20013          const char *zCand = sqlite3_expert_report(p,0,EXPERT_REPORT_CANDIDATES);
 20014          raw_printf(out, "-- Candidates -----------------------------\n");
 20015          raw_printf(out, "%s\n", zCand);
 20016        }
 20017        for(i=0; i<nQuery; i++){
 20018          const char *zSql = sqlite3_expert_report(p, i, EXPERT_REPORT_SQL);
 20019          const char *zIdx = sqlite3_expert_report(p, i, EXPERT_REPORT_INDEXES);
 20020          const char *zEQP = sqlite3_expert_report(p, i, EXPERT_REPORT_PLAN);
 20021          if( zIdx==0 ) zIdx = "(no new indexes)\n";
 20022          if( bVerbose ){
 20023            raw_printf(out, "-- Query %d --------------------------------\n",i+1);
 20024            raw_printf(out, "%s\n\n", zSql);
 20025          }
 20026          raw_printf(out, "%s\n", zIdx);
 20027          raw_printf(out, "%s\n", zEQP);
 20028        }
 20029      }
 20030    }
 20031    sqlite3_expert_destroy(p);
 20032    pState->expert.pExpert = 0;
 20033    return rc;
 20034  }
 20035  
 20036  /*
 20037  ** Implementation of ".expert" dot command.
 20038  */
 20039  static int expertDotCommand(
 20040    ShellState *pState,             /* Current shell tool state */
 20041    char **azArg,                   /* Array of arguments passed to dot command */
 20042    int nArg                        /* Number of entries in azArg[] */
 20043  ){
 20044    int rc = SQLITE_OK;
 20045    char *zErr = 0;
 20046    int i;
 20047    int iSample = 0;
 20048  
 20049    assert( pState->expert.pExpert==0 );
 20050    memset(&pState->expert, 0, sizeof(ExpertInfo));
 20051  
 20052    for(i=1; rc==SQLITE_OK && i<nArg; i++){
 20053      char *z = azArg[i];
 20054      int n;
 20055      if( z[0]=='-' && z[1]=='-' ) z++;
 20056      n = strlen30(z);
 20057      if( n>=2 && 0==cli_strncmp(z, "-verbose", n) ){
 20058        pState->expert.bVerbose = 1;
 20059      }
 20060      else if( n>=2 && 0==cli_strncmp(z, "-sample", n) ){
 20061        if( i==(nArg-1) ){
 20062          raw_printf(stderr, "option requires an argument: %s\n", z);
 20063          rc = SQLITE_ERROR;
 20064        }else{
 20065          iSample = (int)integerValue(azArg[++i]);
 20066          if( iSample<0 || iSample>100 ){
 20067            raw_printf(stderr, "value out of range: %s\n", azArg[i]);
 20068            rc = SQLITE_ERROR;
 20069          }
 20070        }
 20071      }
 20072      else{
 20073        raw_printf(stderr, "unknown option: %s\n", z);
 20074        rc = SQLITE_ERROR;
 20075      }
 20076    }
 20077  
 20078    if( rc==SQLITE_OK ){
 20079      pState->expert.pExpert = sqlite3_expert_new(pState->db, &zErr);
 20080      if( pState->expert.pExpert==0 ){
 20081        raw_printf(stderr, "sqlite3_expert_new: %s\n",
 20082                   zErr ? zErr : "out of memory");
 20083        rc = SQLITE_ERROR;
 20084      }else{
 20085        sqlite3_expert_config(
 20086            pState->expert.pExpert, EXPERT_CONFIG_SAMPLE, iSample
 20087        );
 20088      }
 20089    }
 20090    sqlite3_free(zErr);
 20091  
 20092    return rc;
 20093  }
 20094  #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
 20095  
 20096  /*
 20097  ** Execute a statement or set of statements.  Print
 20098  ** any result rows/columns depending on the current mode
 20099  ** set via the supplied callback.
 20100  **
 20101  ** This is very similar to SQLite's built-in sqlite3_exec()
 20102  ** function except it takes a slightly different callback
 20103  ** and callback data argument.
 20104  */
 20105  static int shell_exec(
 20106    ShellState *pArg,                         /* Pointer to ShellState */
 20107    const char *zSql,                         /* SQL to be evaluated */
 20108    char **pzErrMsg                           /* Error msg written here */
 20109  ){
 20110    sqlite3_stmt *pStmt = NULL;     /* Statement to execute. */
 20111    int rc = SQLITE_OK;             /* Return Code */
 20112    int rc2;
 20113    const char *zLeftover;          /* Tail of unprocessed SQL */
 20114    sqlite3 *db = pArg->db;
 20115  
 20116    if( pzErrMsg ){
 20117      *pzErrMsg = NULL;
 20118    }
 20119  
 20120  #ifndef SQLITE_OMIT_VIRTUALTABLE
 20121    if( pArg->expert.pExpert ){
 20122      rc = expertHandleSQL(pArg, zSql, pzErrMsg);
 20123      return expertFinish(pArg, (rc!=SQLITE_OK), pzErrMsg);
 20124    }
 20125  #endif
 20126  
 20127    while( zSql[0] && (SQLITE_OK == rc) ){
 20128      static const char *zStmtSql;
 20129      rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
 20130      if( SQLITE_OK != rc ){
 20131        if( pzErrMsg ){
 20132          *pzErrMsg = save_err_msg(db, "in prepare", rc, zSql);
 20133        }
 20134      }else{
 20135        if( !pStmt ){
 20136          /* this happens for a comment or white-space */
 20137          zSql = zLeftover;
 20138          while( IsSpace(zSql[0]) ) zSql++;
 20139          continue;
 20140        }
 20141        zStmtSql = sqlite3_sql(pStmt);
 20142        if( zStmtSql==0 ) zStmtSql = "";
 20143        while( IsSpace(zStmtSql[0]) ) zStmtSql++;
 20144  
 20145        /* save off the prepared statement handle and reset row count */
 20146        if( pArg ){
 20147          pArg->pStmt = pStmt;
 20148          pArg->cnt = 0;
 20149        }
 20150  
 20151        /* Show the EXPLAIN QUERY PLAN if .eqp is on */
 20152        if( pArg && pArg->autoEQP && sqlite3_stmt_isexplain(pStmt)==0 ){
 20153          sqlite3_stmt *pExplain;
 20154          int triggerEQP = 0;
 20155          disable_debug_trace_modes();
 20156          sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, -1, &triggerEQP);
 20157          if( pArg->autoEQP>=AUTOEQP_trigger ){
 20158            sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 1, 0);
 20159          }
 20160          pExplain = pStmt;
 20161          sqlite3_reset(pExplain);
 20162          rc = sqlite3_stmt_explain(pExplain, 2);
 20163          if( rc==SQLITE_OK ){
 20164            while( sqlite3_step(pExplain)==SQLITE_ROW ){
 20165              const char *zEQPLine = (const char*)sqlite3_column_text(pExplain,3);
 20166              int iEqpId = sqlite3_column_int(pExplain, 0);
 20167              int iParentId = sqlite3_column_int(pExplain, 1);
 20168              if( zEQPLine==0 ) zEQPLine = "";
 20169              if( zEQPLine[0]=='-' ) eqp_render(pArg, 0);
 20170              eqp_append(pArg, iEqpId, iParentId, zEQPLine);
 20171            }
 20172            eqp_render(pArg, 0);
 20173          }
 20174          if( pArg->autoEQP>=AUTOEQP_full ){
 20175            /* Also do an EXPLAIN for ".eqp full" mode */
 20176            sqlite3_reset(pExplain);
 20177            rc = sqlite3_stmt_explain(pExplain, 1);
 20178            if( rc==SQLITE_OK ){
 20179              pArg->cMode = MODE_Explain;
 20180              assert( sqlite3_stmt_isexplain(pExplain)==1 );
 20181              explain_data_prepare(pArg, pExplain);
 20182              exec_prepared_stmt(pArg, pExplain);
 20183              explain_data_delete(pArg);
 20184            }
 20185          }
 20186          if( pArg->autoEQP>=AUTOEQP_trigger && triggerEQP==0 ){
 20187            sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 0, 0);
 20188          }
 20189          sqlite3_reset(pStmt);
 20190          sqlite3_stmt_explain(pStmt, 0);
 20191          restore_debug_trace_modes();
 20192        }
 20193  
 20194        if( pArg ){
 20195          int bIsExplain = (sqlite3_stmt_isexplain(pStmt)==1);
 20196          pArg->cMode = pArg->mode;
 20197          if( pArg->autoExplain ){
 20198            if( bIsExplain ){
 20199              pArg->cMode = MODE_Explain;
 20200            }
 20201            if( sqlite3_stmt_isexplain(pStmt)==2 ){
 20202              pArg->cMode = MODE_EQP;
 20203            }
 20204          }
 20205  
 20206          /* If the shell is currently in ".explain" mode, gather the extra
 20207          ** data required to add indents to the output.*/
 20208          if( pArg->cMode==MODE_Explain && bIsExplain ){
 20209            explain_data_prepare(pArg, pStmt);
 20210          }
 20211        }
 20212  
 20213        bind_prepared_stmt(pArg, pStmt);
 20214        exec_prepared_stmt(pArg, pStmt);
 20215        explain_data_delete(pArg);
 20216        eqp_render(pArg, 0);
 20217  
 20218        /* print usage stats if stats on */
 20219        if( pArg && pArg->statsOn ){
 20220          display_stats(db, pArg, 0);
 20221        }
 20222  
 20223        /* print loop-counters if required */
 20224        if( pArg && pArg->scanstatsOn ){
 20225          display_scanstats(db, pArg);
 20226        }
 20227  
 20228        /* Finalize the statement just executed. If this fails, save a
 20229        ** copy of the error message. Otherwise, set zSql to point to the
 20230        ** next statement to execute. */
 20231        rc2 = sqlite3_finalize(pStmt);
 20232        if( rc!=SQLITE_NOMEM ) rc = rc2;
 20233        if( rc==SQLITE_OK ){
 20234          zSql = zLeftover;
 20235          while( IsSpace(zSql[0]) ) zSql++;
 20236        }else if( pzErrMsg ){
 20237          *pzErrMsg = save_err_msg(db, "stepping", rc, 0);
 20238        }
 20239  
 20240        /* clear saved stmt handle */
 20241        if( pArg ){
 20242          pArg->pStmt = NULL;
 20243        }
 20244      }
 20245    } /* end while */
 20246  
 20247    return rc;
 20248  }
 20249  
 20250  /*
 20251  ** Release memory previously allocated by tableColumnList().
 20252  */
 20253  static void freeColumnList(char **azCol){
 20254    int i;
 20255    for(i=1; azCol[i]; i++){
 20256      sqlite3_free(azCol[i]);
 20257    }
 20258    /* azCol[0] is a static string */
 20259    sqlite3_free(azCol);
 20260  }
 20261  
 20262  /*
 20263  ** Return a list of pointers to strings which are the names of all
 20264  ** columns in table zTab.   The memory to hold the names is dynamically
 20265  ** allocated and must be released by the caller using a subsequent call
 20266  ** to freeColumnList().
 20267  **
 20268  ** The azCol[0] entry is usually NULL.  However, if zTab contains a rowid
 20269  ** value that needs to be preserved, then azCol[0] is filled in with the
 20270  ** name of the rowid column.
 20271  **
 20272  ** The first regular column in the table is azCol[1].  The list is terminated
 20273  ** by an entry with azCol[i]==0.
 20274  */
 20275  static char **tableColumnList(ShellState *p, const char *zTab){
 20276    char **azCol = 0;
 20277    sqlite3_stmt *pStmt;
 20278    char *zSql;
 20279    int nCol = 0;
 20280    int nAlloc = 0;
 20281    int nPK = 0;       /* Number of PRIMARY KEY columns seen */
 20282    int isIPK = 0;     /* True if one PRIMARY KEY column of type INTEGER */
 20283    int preserveRowid = ShellHasFlag(p, SHFLG_PreserveRowid);
 20284    int rc;
 20285  
 20286    zSql = sqlite3_mprintf("PRAGMA table_info=%Q", zTab);
 20287    shell_check_oom(zSql);
 20288    rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
 20289    sqlite3_free(zSql);
 20290    if( rc ) return 0;
 20291    while( sqlite3_step(pStmt)==SQLITE_ROW ){
 20292      if( nCol>=nAlloc-2 ){
 20293        nAlloc = nAlloc*2 + nCol + 10;
 20294        azCol = sqlite3_realloc(azCol, nAlloc*sizeof(azCol[0]));
 20295        shell_check_oom(azCol);
 20296      }
 20297      azCol[++nCol] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 1));
 20298      shell_check_oom(azCol[nCol]);
 20299      if( sqlite3_column_int(pStmt, 5) ){
 20300        nPK++;
 20301        if( nPK==1
 20302         && sqlite3_stricmp((const char*)sqlite3_column_text(pStmt,2),
 20303                            "INTEGER")==0
 20304        ){
 20305          isIPK = 1;
 20306        }else{
 20307          isIPK = 0;
 20308        }
 20309      }
 20310    }
 20311    sqlite3_finalize(pStmt);
 20312    if( azCol==0 ) return 0;
 20313    azCol[0] = 0;
 20314    azCol[nCol+1] = 0;
 20315  
 20316    /* The decision of whether or not a rowid really needs to be preserved
 20317    ** is tricky.  We never need to preserve a rowid for a WITHOUT ROWID table
 20318    ** or a table with an INTEGER PRIMARY KEY.  We are unable to preserve
 20319    ** rowids on tables where the rowid is inaccessible because there are other
 20320    ** columns in the table named "rowid", "_rowid_", and "oid".
 20321    */
 20322    if( preserveRowid && isIPK ){
 20323      /* If a single PRIMARY KEY column with type INTEGER was seen, then it
 20324      ** might be an alias for the ROWID.  But it might also be a WITHOUT ROWID
 20325      ** table or a INTEGER PRIMARY KEY DESC column, neither of which are
 20326      ** ROWID aliases.  To distinguish these cases, check to see if
 20327      ** there is a "pk" entry in "PRAGMA index_list".  There will be
 20328      ** no "pk" index if the PRIMARY KEY really is an alias for the ROWID.
 20329      */
 20330      zSql = sqlite3_mprintf("SELECT 1 FROM pragma_index_list(%Q)"
 20331                             " WHERE origin='pk'", zTab);
 20332      shell_check_oom(zSql);
 20333      rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
 20334      sqlite3_free(zSql);
 20335      if( rc ){
 20336        freeColumnList(azCol);
 20337        return 0;
 20338      }
 20339      rc = sqlite3_step(pStmt);
 20340      sqlite3_finalize(pStmt);
 20341      preserveRowid = rc==SQLITE_ROW;
 20342    }
 20343    if( preserveRowid ){
 20344      /* Only preserve the rowid if we can find a name to use for the
 20345      ** rowid */
 20346      static char *azRowid[] = { "rowid", "_rowid_", "oid" };
 20347      int i, j;
 20348      for(j=0; j<3; j++){
 20349        for(i=1; i<=nCol; i++){
 20350          if( sqlite3_stricmp(azRowid[j],azCol[i])==0 ) break;
 20351        }
 20352        if( i>nCol ){
 20353          /* At this point, we know that azRowid[j] is not the name of any
 20354          ** ordinary column in the table.  Verify that azRowid[j] is a valid
 20355          ** name for the rowid before adding it to azCol[0].  WITHOUT ROWID
 20356          ** tables will fail this last check */
 20357          rc = sqlite3_table_column_metadata(p->db,0,zTab,azRowid[j],0,0,0,0,0);
 20358          if( rc==SQLITE_OK ) azCol[0] = azRowid[j];
 20359          break;
 20360        }
 20361      }
 20362    }
 20363    return azCol;
 20364  }
 20365  
 20366  /*
 20367  ** Toggle the reverse_unordered_selects setting.
 20368  */
 20369  static void toggleSelectOrder(sqlite3 *db){
 20370    sqlite3_stmt *pStmt = 0;
 20371    int iSetting = 0;
 20372    char zStmt[100];
 20373    sqlite3_prepare_v2(db, "PRAGMA reverse_unordered_selects", -1, &pStmt, 0);
 20374    if( sqlite3_step(pStmt)==SQLITE_ROW ){
 20375      iSetting = sqlite3_column_int(pStmt, 0);
 20376    }
 20377    sqlite3_finalize(pStmt);
 20378    sqlite3_snprintf(sizeof(zStmt), zStmt,
 20379         "PRAGMA reverse_unordered_selects(%d)", !iSetting);
 20380    sqlite3_exec(db, zStmt, 0, 0, 0);
 20381  }
 20382  
 20383  /*
 20384  ** This is a different callback routine used for dumping the database.
 20385  ** Each row received by this callback consists of a table name,
 20386  ** the table type ("index" or "table") and SQL to create the table.
 20387  ** This routine should print text sufficient to recreate the table.
 20388  */
 20389  static int dump_callback(void *pArg, int nArg, char **azArg, char **azNotUsed){
 20390    int rc;
 20391    const char *zTable;
 20392    const char *zType;
 20393    const char *zSql;
 20394    ShellState *p = (ShellState *)pArg;
 20395    int dataOnly;
 20396    int noSys;
 20397  
 20398    UNUSED_PARAMETER(azNotUsed);
 20399    if( nArg!=3 || azArg==0 ) return 0;
 20400    zTable = azArg[0];
 20401    zType = azArg[1];
 20402    zSql = azArg[2];
 20403    if( zTable==0 ) return 0;
 20404    if( zType==0 ) return 0;
 20405    dataOnly = (p->shellFlgs & SHFLG_DumpDataOnly)!=0;
 20406    noSys    = (p->shellFlgs & SHFLG_DumpNoSys)!=0;
 20407  
 20408    if( cli_strcmp(zTable, "sqlite_sequence")==0 && !noSys ){
 20409      if( !dataOnly ) raw_printf(p->out, "DELETE FROM sqlite_sequence;\n");
 20410    }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 && !noSys ){
 20411      if( !dataOnly ) raw_printf(p->out, "ANALYZE sqlite_schema;\n");
 20412    }else if( cli_strncmp(zTable, "sqlite_", 7)==0 ){
 20413      return 0;
 20414    }else if( dataOnly ){
 20415      /* no-op */
 20416    }else if( cli_strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
 20417      char *zIns;
 20418      if( !p->writableSchema ){
 20419        raw_printf(p->out, "PRAGMA writable_schema=ON;\n");
 20420        p->writableSchema = 1;
 20421      }
 20422      zIns = sqlite3_mprintf(
 20423         "INSERT INTO sqlite_schema(type,name,tbl_name,rootpage,sql)"
 20424         "VALUES('table','%q','%q',0,'%q');",
 20425         zTable, zTable, zSql);
 20426      shell_check_oom(zIns);
 20427      utf8_printf(p->out, "%s\n", zIns);
 20428      sqlite3_free(zIns);
 20429      return 0;
 20430    }else{
 20431      printSchemaLine(p->out, zSql, ";\n");
 20432    }
 20433  
 20434    if( cli_strcmp(zType, "table")==0 ){
 20435      ShellText sSelect;
 20436      ShellText sTable;
 20437      char **azCol;
 20438      int i;
 20439      char *savedDestTable;
 20440      int savedMode;
 20441  
 20442      azCol = tableColumnList(p, zTable);
 20443      if( azCol==0 ){
 20444        p->nErr++;
 20445        return 0;
 20446      }
 20447  
 20448      /* Always quote the table name, even if it appears to be pure ascii,
 20449      ** in case it is a keyword. Ex:  INSERT INTO "table" ... */
 20450      initText(&sTable);
 20451      appendText(&sTable, zTable, quoteChar(zTable));
 20452      /* If preserving the rowid, add a column list after the table name.
 20453      ** In other words:  "INSERT INTO tab(rowid,a,b,c,...) VALUES(...)"
 20454      ** instead of the usual "INSERT INTO tab VALUES(...)".
 20455      */
 20456      if( azCol[0] ){
 20457        appendText(&sTable, "(", 0);
 20458        appendText(&sTable, azCol[0], 0);
 20459        for(i=1; azCol[i]; i++){
 20460          appendText(&sTable, ",", 0);
 20461          appendText(&sTable, azCol[i], quoteChar(azCol[i]));
 20462        }
 20463        appendText(&sTable, ")", 0);
 20464      }
 20465  
 20466      /* Build an appropriate SELECT statement */
 20467      initText(&sSelect);
 20468      appendText(&sSelect, "SELECT ", 0);
 20469      if( azCol[0] ){
 20470        appendText(&sSelect, azCol[0], 0);
 20471        appendText(&sSelect, ",", 0);
 20472      }
 20473      for(i=1; azCol[i]; i++){
 20474        appendText(&sSelect, azCol[i], quoteChar(azCol[i]));
 20475        if( azCol[i+1] ){
 20476          appendText(&sSelect, ",", 0);
 20477        }
 20478      }
 20479      freeColumnList(azCol);
 20480      appendText(&sSelect, " FROM ", 0);
 20481      appendText(&sSelect, zTable, quoteChar(zTable));
 20482  
 20483      savedDestTable = p->zDestTable;
 20484      savedMode = p->mode;
 20485      p->zDestTable = sTable.z;
 20486      p->mode = p->cMode = MODE_Insert;
 20487      rc = shell_exec(p, sSelect.z, 0);
 20488      if( (rc&0xff)==SQLITE_CORRUPT ){
 20489        raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
 20490        toggleSelectOrder(p->db);
 20491        shell_exec(p, sSelect.z, 0);
 20492        toggleSelectOrder(p->db);
 20493      }
 20494      p->zDestTable = savedDestTable;
 20495      p->mode = savedMode;
 20496      freeText(&sTable);
 20497      freeText(&sSelect);
 20498      if( rc ) p->nErr++;
 20499    }
 20500    return 0;
 20501  }
 20502  
 20503  /*
 20504  ** Run zQuery.  Use dump_callback() as the callback routine so that
 20505  ** the contents of the query are output as SQL statements.
 20506  **
 20507  ** If we get a SQLITE_CORRUPT error, rerun the query after appending
 20508  ** "ORDER BY rowid DESC" to the end.
 20509  */
 20510  static int run_schema_dump_query(
 20511    ShellState *p,
 20512    const char *zQuery
 20513  ){
 20514    int rc;
 20515    char *zErr = 0;
 20516    rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
 20517    if( rc==SQLITE_CORRUPT ){
 20518      char *zQ2;
 20519      int len = strlen30(zQuery);
 20520      raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
 20521      if( zErr ){
 20522        utf8_printf(p->out, "/****** %s ******/\n", zErr);
 20523        sqlite3_free(zErr);
 20524        zErr = 0;
 20525      }
 20526      zQ2 = malloc( len+100 );
 20527      if( zQ2==0 ) return rc;
 20528      sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
 20529      rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
 20530      if( rc ){
 20531        utf8_printf(p->out, "/****** ERROR: %s ******/\n", zErr);
 20532      }else{
 20533        rc = SQLITE_CORRUPT;
 20534      }
 20535      sqlite3_free(zErr);
 20536      free(zQ2);
 20537    }
 20538    return rc;
 20539  }
 20540  
 20541  /*
 20542  ** Text of help messages.
 20543  **
 20544  ** The help text for each individual command begins with a line that starts
 20545  ** with ".".  Subsequent lines are supplemental information.
 20546  **
 20547  ** There must be two or more spaces between the end of the command and the
 20548  ** start of the description of what that command does.
 20549  */
 20550  static const char *(azHelp[]) = {
 20551  #if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE) \
 20552    && !defined(SQLITE_SHELL_FIDDLE)
 20553    ".archive ...             Manage SQL archives",
 20554    "   Each command must have exactly one of the following options:",
 20555    "     -c, --create               Create a new archive",
 20556    "     -u, --update               Add or update files with changed mtime",
 20557    "     -i, --insert               Like -u but always add even if unchanged",
 20558    "     -r, --remove               Remove files from archive",
 20559    "     -t, --list                 List contents of archive",
 20560    "     -x, --extract              Extract files from archive",
 20561    "   Optional arguments:",
 20562    "     -v, --verbose              Print each filename as it is processed",
 20563    "     -f FILE, --file FILE       Use archive FILE (default is current db)",
 20564    "     -a FILE, --append FILE     Open FILE using the apndvfs VFS",
 20565    "     -C DIR, --directory DIR    Read/extract files from directory DIR",
 20566    "     -g, --glob                 Use glob matching for names in archive",
 20567    "     -n, --dryrun               Show the SQL that would have occurred",
 20568    "   Examples:",
 20569    "     .ar -cf ARCHIVE foo bar  # Create ARCHIVE from files foo and bar",
 20570    "     .ar -tf ARCHIVE          # List members of ARCHIVE",
 20571    "     .ar -xvf ARCHIVE         # Verbosely extract files from ARCHIVE",
 20572    "   See also:",
 20573    "      http://sqlite.org/cli.html#sqlite_archive_support",
 20574  #endif
 20575  #ifndef SQLITE_OMIT_AUTHORIZATION
 20576    ".auth ON|OFF             Show authorizer callbacks",
 20577  #endif
 20578  #ifndef SQLITE_SHELL_FIDDLE
 20579    ".backup ?DB? FILE        Backup DB (default \"main\") to FILE",
 20580    "   Options:",
 20581    "       --append            Use the appendvfs",
 20582    "       --async             Write to FILE without journal and fsync()",
 20583  #endif
 20584    ".bail on|off             Stop after hitting an error.  Default OFF",
 20585  #ifndef SQLITE_SHELL_FIDDLE
 20586    ".cd DIRECTORY            Change the working directory to DIRECTORY",
 20587  #endif
 20588    ".changes on|off          Show number of rows changed by SQL",
 20589  #ifndef SQLITE_SHELL_FIDDLE
 20590    ".check GLOB              Fail if output since .testcase does not match",
 20591    ".clone NEWDB             Clone data into NEWDB from the existing database",
 20592  #endif
 20593    ".connection [close] [#]  Open or close an auxiliary database connection",
 20594  #if defined(_WIN32) || defined(WIN32)
 20595    ".crnl on|off             Translate \\n to \\r\\n.  Default ON",
 20596  #endif
 20597    ".databases               List names and files of attached databases",
 20598    ".dbconfig ?op? ?val?     List or change sqlite3_db_config() options",
 20599  #if SQLITE_SHELL_HAVE_RECOVER
 20600    ".dbinfo ?DB?             Show status information about the database",
 20601  #endif
 20602    ".dump ?OBJECTS?          Render database content as SQL",
 20603    "   Options:",
 20604    "     --data-only            Output only INSERT statements",
 20605    "     --newlines             Allow unescaped newline characters in output",
 20606    "     --nosys                Omit system tables (ex: \"sqlite_stat1\")",
 20607    "     --preserve-rowids      Include ROWID values in the output",
 20608    "   OBJECTS is a LIKE pattern for tables, indexes, triggers or views to dump",
 20609    "   Additional LIKE patterns can be given in subsequent arguments",
 20610    ".echo on|off             Turn command echo on or off",
 20611    ".eqp on|off|full|...     Enable or disable automatic EXPLAIN QUERY PLAN",
 20612    "   Other Modes:",
 20613  #ifdef SQLITE_DEBUG
 20614    "      test                  Show raw EXPLAIN QUERY PLAN output",
 20615    "      trace                 Like \"full\" but enable \"PRAGMA vdbe_trace\"",
 20616  #endif
 20617    "      trigger               Like \"full\" but also show trigger bytecode",
 20618  #ifndef SQLITE_SHELL_FIDDLE
 20619    ".excel                   Display the output of next command in spreadsheet",
 20620    "   --bom                   Put a UTF8 byte-order mark on intermediate file",
 20621  #endif
 20622  #ifndef SQLITE_SHELL_FIDDLE
 20623    ".exit ?CODE?             Exit this program with return-code CODE",
 20624  #endif
 20625    ".expert                  EXPERIMENTAL. Suggest indexes for queries",
 20626    ".explain ?on|off|auto?   Change the EXPLAIN formatting mode.  Default: auto",
 20627    ".filectrl CMD ...        Run various sqlite3_file_control() operations",
 20628    "   --schema SCHEMA         Use SCHEMA instead of \"main\"",
 20629    "   --help                  Show CMD details",
 20630    ".fullschema ?--indent?   Show schema and the content of sqlite_stat tables",
 20631    ".headers on|off          Turn display of headers on or off",
 20632    ".help ?-all? ?PATTERN?   Show help text for PATTERN",
 20633  #ifndef SQLITE_SHELL_FIDDLE
 20634    ".import FILE TABLE       Import data from FILE into TABLE",
 20635    "   Options:",
 20636    "     --ascii               Use \\037 and \\036 as column and row separators",
 20637    "     --csv                 Use , and \\n as column and row separators",
 20638    "     --skip N              Skip the first N rows of input",
 20639    "     --schema S            Target table to be S.TABLE",
 20640    "     -v                    \"Verbose\" - increase auxiliary output",
 20641    "   Notes:",
 20642    "     *  If TABLE does not exist, it is created.  The first row of input",
 20643    "        determines the column names.",
 20644    "     *  If neither --csv or --ascii are used, the input mode is derived",
 20645    "        from the \".mode\" output mode",
 20646    "     *  If FILE begins with \"|\" then it is a command that generates the",
 20647    "        input text.",
 20648  #endif
 20649  #ifndef SQLITE_OMIT_TEST_CONTROL
 20650    ",imposter INDEX TABLE    Create imposter table TABLE on index INDEX",
 20651  #endif
 20652    ".indexes ?TABLE?         Show names of indexes",
 20653    "                           If TABLE is specified, only show indexes for",
 20654    "                           tables matching TABLE using the LIKE operator.",
 20655  #ifdef SQLITE_ENABLE_IOTRACE
 20656    ",iotrace FILE            Enable I/O diagnostic logging to FILE",
 20657  #endif
 20658    ".limit ?LIMIT? ?VAL?     Display or change the value of an SQLITE_LIMIT",
 20659    ".lint OPTIONS            Report potential schema issues.",
 20660    "     Options:",
 20661    "        fkey-indexes     Find missing foreign key indexes",
 20662  #if !defined(SQLITE_OMIT_LOAD_EXTENSION) && !defined(SQLITE_SHELL_FIDDLE)
 20663    ".load FILE ?ENTRY?       Load an extension library",
 20664  #endif
 20665  #if !defined(SQLITE_SHELL_FIDDLE)
 20666    ".log FILE|on|off         Turn logging on or off.  FILE can be stderr/stdout",
 20667  #else
 20668    ".log on|off              Turn logging on or off.",
 20669  #endif
 20670    ".mode MODE ?OPTIONS?     Set output mode",
 20671    "   MODE is one of:",
 20672    "     ascii       Columns/rows delimited by 0x1F and 0x1E",
 20673    "     box         Tables using unicode box-drawing characters",
 20674    "     csv         Comma-separated values",
 20675    "     column      Output in columns.  (See .width)",
 20676    "     html        HTML <table> code",
 20677    "     insert      SQL insert statements for TABLE",
 20678    "     json        Results in a JSON array",
 20679    "     line        One value per line",
 20680    "     list        Values delimited by \"|\"",
 20681    "     markdown    Markdown table format",
 20682    "     qbox        Shorthand for \"box --wrap 60 --quote\"",
 20683    "     quote       Escape answers as for SQL",
 20684    "     table       ASCII-art table",
 20685    "     tabs        Tab-separated values",
 20686    "     tcl         TCL list elements",
 20687    "   OPTIONS: (for columnar modes or insert mode):",
 20688    "     --wrap N       Wrap output lines to no longer than N characters",
 20689    "     --wordwrap B   Wrap or not at word boundaries per B (on/off)",
 20690    "     --ww           Shorthand for \"--wordwrap 1\"",
 20691    "     --quote        Quote output text as SQL literals",
 20692    "     --noquote      Do not quote output text",
 20693    "     TABLE          The name of SQL table used for \"insert\" mode",
 20694  #ifndef SQLITE_SHELL_FIDDLE
 20695    ".nonce STRING            Suspend safe mode for one command if nonce matches",
 20696  #endif
 20697    ".nullvalue STRING        Use STRING in place of NULL values",
 20698  #ifndef SQLITE_SHELL_FIDDLE
 20699    ".once ?OPTIONS? ?FILE?   Output for the next SQL command only to FILE",
 20700    "     If FILE begins with '|' then open as a pipe",
 20701    "       --bom  Put a UTF8 byte-order mark at the beginning",
 20702    "       -e     Send output to the system text editor",
 20703    "       -x     Send output as CSV to a spreadsheet (same as \".excel\")",
 20704    /* Note that .open is (partially) available in WASM builds but is
 20705    ** currently only intended to be used by the fiddle tool, not
 20706    ** end users, so is "undocumented." */
 20707    ".open ?OPTIONS? ?FILE?   Close existing database and reopen FILE",
 20708    "     Options:",
 20709    "        --append        Use appendvfs to append database to the end of FILE",
 20710  #endif
 20711  #ifndef SQLITE_OMIT_DESERIALIZE
 20712    "        --deserialize   Load into memory using sqlite3_deserialize()",
 20713    "        --hexdb         Load the output of \"dbtotxt\" as an in-memory db",
 20714    "        --maxsize N     Maximum size for --hexdb or --deserialized database",
 20715  #endif
 20716    "        --new           Initialize FILE to an empty database",
 20717    "        --nofollow      Do not follow symbolic links",
 20718    "        --readonly      Open FILE readonly",
 20719    "        --zip           FILE is a ZIP archive",
 20720  #ifndef SQLITE_SHELL_FIDDLE
 20721    ".output ?FILE?           Send output to FILE or stdout if FILE is omitted",
 20722    "   If FILE begins with '|' then open it as a pipe.",
 20723    "   Options:",
 20724    "     --bom                 Prefix output with a UTF8 byte-order mark",
 20725    "     -e                    Send output to the system text editor",
 20726    "     -x                    Send output as CSV to a spreadsheet",
 20727  #endif
 20728    ".parameter CMD ...       Manage SQL parameter bindings",
 20729    "   clear                   Erase all bindings",
 20730    "   init                    Initialize the TEMP table that holds bindings",
 20731    "   list                    List the current parameter bindings",
 20732    "   set PARAMETER VALUE     Given SQL parameter PARAMETER a value of VALUE",
 20733    "                           PARAMETER should start with one of: $ : @ ?",
 20734    "   unset PARAMETER         Remove PARAMETER from the binding table",
 20735    ".print STRING...         Print literal STRING",
 20736  #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
 20737    ".progress N              Invoke progress handler after every N opcodes",
 20738    "   --limit N                 Interrupt after N progress callbacks",
 20739    "   --once                    Do no more than one progress interrupt",
 20740    "   --quiet|-q                No output except at interrupts",
 20741    "   --reset                   Reset the count for each input and interrupt",
 20742  #endif
 20743    ".prompt MAIN CONTINUE    Replace the standard prompts",
 20744  #ifndef SQLITE_SHELL_FIDDLE
 20745    ".quit                    Stop interpreting input stream, exit if primary.",
 20746    ".read FILE               Read input from FILE or command output",
 20747    "    If FILE begins with \"|\", it is a command that generates the input.",
 20748  #endif
 20749  #if SQLITE_SHELL_HAVE_RECOVER
 20750    ".recover                 Recover as much data as possible from corrupt db.",
 20751    "   --ignore-freelist        Ignore pages that appear to be on db freelist",
 20752    "   --lost-and-found TABLE   Alternative name for the lost-and-found table",
 20753    "   --no-rowids              Do not attempt to recover rowid values",
 20754    "                            that are not also INTEGER PRIMARY KEYs",
 20755  #endif
 20756  #ifndef SQLITE_SHELL_FIDDLE
 20757    ".restore ?DB? FILE       Restore content of DB (default \"main\") from FILE",
 20758    ".save ?OPTIONS? FILE     Write database to FILE (an alias for .backup ...)",
 20759  #endif
 20760    ".scanstats on|off|est    Turn sqlite3_stmt_scanstatus() metrics on or off",
 20761    ".schema ?PATTERN?        Show the CREATE statements matching PATTERN",
 20762    "   Options:",
 20763    "      --indent             Try to pretty-print the schema",
 20764    "      --nosys              Omit objects whose names start with \"sqlite_\"",
 20765    ",selftest ?OPTIONS?      Run tests defined in the SELFTEST table",
 20766    "    Options:",
 20767    "       --init               Create a new SELFTEST table",
 20768    "       -v                   Verbose output",
 20769    ".separator COL ?ROW?     Change the column and row separators",
 20770  #if defined(SQLITE_ENABLE_SESSION)
 20771    ".session ?NAME? CMD ...  Create or control sessions",
 20772    "   Subcommands:",
 20773    "     attach TABLE             Attach TABLE",
 20774    "     changeset FILE           Write a changeset into FILE",
 20775    "     close                    Close one session",
 20776    "     enable ?BOOLEAN?         Set or query the enable bit",
 20777    "     filter GLOB...           Reject tables matching GLOBs",
 20778    "     indirect ?BOOLEAN?       Mark or query the indirect status",
 20779    "     isempty                  Query whether the session is empty",
 20780    "     list                     List currently open session names",
 20781    "     open DB NAME             Open a new session on DB",
 20782    "     patchset FILE            Write a patchset into FILE",
 20783    "   If ?NAME? is omitted, the first defined session is used.",
 20784  #endif
 20785    ".sha3sum ...             Compute a SHA3 hash of database content",
 20786    "    Options:",
 20787    "      --schema              Also hash the sqlite_schema table",
 20788    "      --sha3-224            Use the sha3-224 algorithm",
 20789    "      --sha3-256            Use the sha3-256 algorithm (default)",
 20790    "      --sha3-384            Use the sha3-384 algorithm",
 20791    "      --sha3-512            Use the sha3-512 algorithm",
 20792    "    Any other argument is a LIKE pattern for tables to hash",
 20793  #if !defined(SQLITE_NOHAVE_SYSTEM) && !defined(SQLITE_SHELL_FIDDLE)
 20794    ".shell CMD ARGS...       Run CMD ARGS... in a system shell",
 20795  #endif
 20796    ".show                    Show the current values for various settings",
 20797    ".stats ?ARG?             Show stats or turn stats on or off",
 20798    "   off                      Turn off automatic stat display",
 20799    "   on                       Turn on automatic stat display",
 20800    "   stmt                     Show statement stats",
 20801    "   vmstep                   Show the virtual machine step count only",
 20802  #if !defined(SQLITE_NOHAVE_SYSTEM) && !defined(SQLITE_SHELL_FIDDLE)
 20803    ".system CMD ARGS...      Run CMD ARGS... in a system shell",
 20804  #endif
 20805    ".tables ?TABLE?          List names of tables matching LIKE pattern TABLE",
 20806  #ifndef SQLITE_SHELL_FIDDLE
 20807    ",testcase NAME           Begin redirecting output to 'testcase-out.txt'",
 20808  #endif
 20809    ",testctrl CMD ...        Run various sqlite3_test_control() operations",
 20810    "                           Run \".testctrl\" with no arguments for details",
 20811    ".timeout MS              Try opening locked tables for MS milliseconds",
 20812    ".timer on|off            Turn SQL timer on or off",
 20813  #ifndef SQLITE_OMIT_TRACE
 20814    ".trace ?OPTIONS?         Output each SQL statement as it is run",
 20815    "    FILE                    Send output to FILE",
 20816    "    stdout                  Send output to stdout",
 20817    "    stderr                  Send output to stderr",
 20818    "    off                     Disable tracing",
 20819    "    --expanded              Expand query parameters",
 20820  #ifdef SQLITE_ENABLE_NORMALIZE
 20821    "    --normalized            Normal the SQL statements",
 20822  #endif
 20823    "    --plain                 Show SQL as it is input",
 20824    "    --stmt                  Trace statement execution (SQLITE_TRACE_STMT)",
 20825    "    --profile               Profile statements (SQLITE_TRACE_PROFILE)",
 20826    "    --row                   Trace each row (SQLITE_TRACE_ROW)",
 20827    "    --close                 Trace connection close (SQLITE_TRACE_CLOSE)",
 20828  #endif /* SQLITE_OMIT_TRACE */
 20829  #ifdef SQLITE_DEBUG
 20830    ".unmodule NAME ...       Unregister virtual table modules",
 20831    "    --allexcept             Unregister everything except those named",
 20832  #endif
 20833    ".version                 Show source, library and compiler versions",
 20834    ".vfsinfo ?AUX?           Information about the top-level VFS",
 20835    ".vfslist                 List all available VFSes",
 20836    ".vfsname ?AUX?           Print the name of the VFS stack",
 20837    ".width NUM1 NUM2 ...     Set minimum column widths for columnar output",
 20838    "     Negative values right-justify",
 20839  };
 20840  
 20841  /*
 20842  ** Output help text.
 20843  **
 20844  ** zPattern describes the set of commands for which help text is provided.
 20845  ** If zPattern is NULL, then show all commands, but only give a one-line
 20846  ** description of each.
 20847  **
 20848  ** Return the number of matches.
 20849  */
 20850  static int showHelp(FILE *out, const char *zPattern){
 20851    int i = 0;
 20852    int j = 0;
 20853    int n = 0;
 20854    char *zPat;
 20855    if( zPattern==0
 20856     || zPattern[0]=='0'
 20857     || cli_strcmp(zPattern,"-a")==0
 20858     || cli_strcmp(zPattern,"-all")==0
 20859     || cli_strcmp(zPattern,"--all")==0
 20860    ){
 20861      enum HelpWanted { HW_NoCull = 0, HW_SummaryOnly = 1, HW_Undoc = 2 };
 20862      enum HelpHave { HH_Undoc = 2, HH_Summary = 1, HH_More = 0 };
 20863      /* Show all or most commands
 20864      ** *zPattern==0   => summary of documented commands only
 20865      ** *zPattern=='0' => whole help for undocumented commands
 20866      ** Otherwise      => whole help for documented commands
 20867      */
 20868      enum HelpWanted hw = HW_SummaryOnly;
 20869      enum HelpHave hh = HH_More;
 20870      if( zPattern!=0 ){
 20871        hw = (*zPattern=='0')? HW_NoCull|HW_Undoc : HW_NoCull;
 20872      }
 20873      for(i=0; i<ArraySize(azHelp); i++){
 20874        switch( azHelp[i][0] ){
 20875        case ',':
 20876          hh = HH_Summary|HH_Undoc;
 20877          break;
 20878        case '.':
 20879          hh = HH_Summary;
 20880          break;
 20881        default:
 20882          hh &= ~HH_Summary;
 20883          break;
 20884        }
 20885        if( ((hw^hh)&HH_Undoc)==0 ){
 20886          if( (hh&HH_Summary)!=0 ){
 20887            utf8_printf(out, ".%s\n", azHelp[i]+1);
 20888            ++n;
 20889          }else if( (hw&HW_SummaryOnly)==0 ){
 20890            utf8_printf(out, "%s\n", azHelp[i]);
 20891          }
 20892        }
 20893      }
 20894    }else{
 20895      /* Seek documented commands for which zPattern is an exact prefix */
 20896      zPat = sqlite3_mprintf(".%s*", zPattern);
 20897      shell_check_oom(zPat);
 20898      for(i=0; i<ArraySize(azHelp); i++){
 20899        if( sqlite3_strglob(zPat, azHelp[i])==0 ){
 20900          utf8_printf(out, "%s\n", azHelp[i]);
 20901          j = i+1;
 20902          n++;
 20903        }
 20904      }
 20905      sqlite3_free(zPat);
 20906      if( n ){
 20907        if( n==1 ){
 20908          /* when zPattern is a prefix of exactly one command, then include
 20909          ** the details of that command, which should begin at offset j */
 20910          while( j<ArraySize(azHelp)-1 && azHelp[j][0]==' ' ){
 20911            utf8_printf(out, "%s\n", azHelp[j]);
 20912            j++;
 20913          }
 20914        }
 20915        return n;
 20916      }
 20917      /* Look for documented commands that contain zPattern anywhere.
 20918      ** Show complete text of all documented commands that match. */
 20919      zPat = sqlite3_mprintf("%%%s%%", zPattern);
 20920      shell_check_oom(zPat);
 20921      for(i=0; i<ArraySize(azHelp); i++){
 20922        if( azHelp[i][0]==',' ){
 20923          while( i<ArraySize(azHelp)-1 && azHelp[i+1][0]==' ' ) ++i;
 20924          continue;
 20925        }
 20926        if( azHelp[i][0]=='.' ) j = i;
 20927        if( sqlite3_strlike(zPat, azHelp[i], 0)==0 ){
 20928          utf8_printf(out, "%s\n", azHelp[j]);
 20929          while( j<ArraySize(azHelp)-1 && azHelp[j+1][0]==' ' ){
 20930            j++;
 20931            utf8_printf(out, "%s\n", azHelp[j]);
 20932          }
 20933          i = j;
 20934          n++;
 20935        }
 20936      }
 20937      sqlite3_free(zPat);
 20938    }
 20939    return n;
 20940  }
 20941  
 20942  /* Forward reference */
 20943  static int process_input(ShellState *p);
 20944  
 20945  /*
 20946  ** Read the content of file zName into memory obtained from sqlite3_malloc64()
 20947  ** and return a pointer to the buffer. The caller is responsible for freeing
 20948  ** the memory.
 20949  **
 20950  ** If parameter pnByte is not NULL, (*pnByte) is set to the number of bytes
 20951  ** read.
 20952  **
 20953  ** For convenience, a nul-terminator byte is always appended to the data read
 20954  ** from the file before the buffer is returned. This byte is not included in
 20955  ** the final value of (*pnByte), if applicable.
 20956  **
 20957  ** NULL is returned if any error is encountered. The final value of *pnByte
 20958  ** is undefined in this case.
 20959  */
 20960  static char *readFile(const char *zName, int *pnByte){
 20961    FILE *in = fopen(zName, "rb");
 20962    long nIn;
 20963    size_t nRead;
 20964    char *pBuf;
 20965    int rc;
 20966    if( in==0 ) return 0;
 20967    rc = fseek(in, 0, SEEK_END);
 20968    if( rc!=0 ){
 20969      raw_printf(stderr, "Error: '%s' not seekable\n", zName);
 20970      fclose(in);
 20971      return 0;
 20972    }
 20973    nIn = ftell(in);
 20974    rewind(in);
 20975    pBuf = sqlite3_malloc64( nIn+1 );
 20976    if( pBuf==0 ){
 20977      raw_printf(stderr, "Error: out of memory\n");
 20978      fclose(in);
 20979      return 0;
 20980    }
 20981    nRead = fread(pBuf, nIn, 1, in);
 20982    fclose(in);
 20983    if( nRead!=1 ){
 20984      sqlite3_free(pBuf);
 20985      raw_printf(stderr, "Error: cannot read '%s'\n", zName);
 20986      return 0;
 20987    }
 20988    pBuf[nIn] = 0;
 20989    if( pnByte ) *pnByte = nIn;
 20990    return pBuf;
 20991  }
 20992  
 20993  #if defined(SQLITE_ENABLE_SESSION)
 20994  /*
 20995  ** Close a single OpenSession object and release all of its associated
 20996  ** resources.
 20997  */
 20998  static void session_close(OpenSession *pSession){
 20999    int i;
 21000    sqlite3session_delete(pSession->p);
 21001    sqlite3_free(pSession->zName);
 21002    for(i=0; i<pSession->nFilter; i++){
 21003      sqlite3_free(pSession->azFilter[i]);
 21004    }
 21005    sqlite3_free(pSession->azFilter);
 21006    memset(pSession, 0, sizeof(OpenSession));
 21007  }
 21008  #endif
 21009  
 21010  /*
 21011  ** Close all OpenSession objects and release all associated resources.
 21012  */
 21013  #if defined(SQLITE_ENABLE_SESSION)
 21014  static void session_close_all(ShellState *p, int i){
 21015    int j;
 21016    struct AuxDb *pAuxDb = i<0 ? p->pAuxDb : &p->aAuxDb[i];
 21017    for(j=0; j<pAuxDb->nSession; j++){
 21018      session_close(&pAuxDb->aSession[j]);
 21019    }
 21020    pAuxDb->nSession = 0;
 21021  }
 21022  #else
 21023  # define session_close_all(X,Y)
 21024  #endif
 21025  
 21026  /*
 21027  ** Implementation of the xFilter function for an open session.  Omit
 21028  ** any tables named by ".session filter" but let all other table through.
 21029  */
 21030  #if defined(SQLITE_ENABLE_SESSION)
 21031  static int session_filter(void *pCtx, const char *zTab){
 21032    OpenSession *pSession = (OpenSession*)pCtx;
 21033    int i;
 21034    for(i=0; i<pSession->nFilter; i++){
 21035      if( sqlite3_strglob(pSession->azFilter[i], zTab)==0 ) return 0;
 21036    }
 21037    return 1;
 21038  }
 21039  #endif
 21040  
 21041  /*
 21042  ** Try to deduce the type of file for zName based on its content.  Return
 21043  ** one of the SHELL_OPEN_* constants.
 21044  **
 21045  ** If the file does not exist or is empty but its name looks like a ZIP
 21046  ** archive and the dfltZip flag is true, then assume it is a ZIP archive.
 21047  ** Otherwise, assume an ordinary database regardless of the filename if
 21048  ** the type cannot be determined from content.
 21049  */
 21050  int deduceDatabaseType(const char *zName, int dfltZip){
 21051    FILE *f = fopen(zName, "rb");
 21052    size_t n;
 21053    int rc = SHELL_OPEN_UNSPEC;
 21054    char zBuf[100];
 21055    if( f==0 ){
 21056      if( dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){
 21057         return SHELL_OPEN_ZIPFILE;
 21058      }else{
 21059         return SHELL_OPEN_NORMAL;
 21060      }
 21061    }
 21062    n = fread(zBuf, 16, 1, f);
 21063    if( n==1 && memcmp(zBuf, "SQLite format 3", 16)==0 ){
 21064      fclose(f);
 21065      return SHELL_OPEN_NORMAL;
 21066    }
 21067    fseek(f, -25, SEEK_END);
 21068    n = fread(zBuf, 25, 1, f);
 21069    if( n==1 && memcmp(zBuf, "Start-Of-SQLite3-", 17)==0 ){
 21070      rc = SHELL_OPEN_APPENDVFS;
 21071    }else{
 21072      fseek(f, -22, SEEK_END);
 21073      n = fread(zBuf, 22, 1, f);
 21074      if( n==1 && zBuf[0]==0x50 && zBuf[1]==0x4b && zBuf[2]==0x05
 21075         && zBuf[3]==0x06 ){
 21076        rc = SHELL_OPEN_ZIPFILE;
 21077      }else if( n==0 && dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){
 21078        rc = SHELL_OPEN_ZIPFILE;
 21079      }
 21080    }
 21081    fclose(f);
 21082    return rc;
 21083  }
 21084  
 21085  #ifndef SQLITE_OMIT_DESERIALIZE
 21086  /*
 21087  ** Reconstruct an in-memory database using the output from the "dbtotxt"
 21088  ** program.  Read content from the file in p->aAuxDb[].zDbFilename.
 21089  ** If p->aAuxDb[].zDbFilename is 0, then read from standard input.
 21090  */
 21091  static unsigned char *readHexDb(ShellState *p, int *pnData){
 21092    unsigned char *a = 0;
 21093    int nLine;
 21094    int n = 0;
 21095    int pgsz = 0;
 21096    int iOffset = 0;
 21097    int j, k;
 21098    int rc;
 21099    FILE *in;
 21100    const char *zDbFilename = p->pAuxDb->zDbFilename;
 21101    unsigned int x[16];
 21102    char zLine[1000];
 21103    if( zDbFilename ){
 21104      in = fopen(zDbFilename, "r");
 21105      if( in==0 ){
 21106        utf8_printf(stderr, "cannot open \"%s\" for reading\n", zDbFilename);
 21107        return 0;
 21108      }
 21109      nLine = 0;
 21110    }else{
 21111      in = p->in;
 21112      nLine = p->lineno;
 21113      if( in==0 ) in = stdin;
 21114    }
 21115    *pnData = 0;
 21116    nLine++;
 21117    if( fgets(zLine, sizeof(zLine), in)==0 ) goto readHexDb_error;
 21118    rc = sscanf(zLine, "| size %d pagesize %d", &n, &pgsz);
 21119    if( rc!=2 ) goto readHexDb_error;
 21120    if( n<0 ) goto readHexDb_error;
 21121    if( pgsz<512 || pgsz>65536 || (pgsz&(pgsz-1))!=0 ) goto readHexDb_error;
 21122    n = (n+pgsz-1)&~(pgsz-1);  /* Round n up to the next multiple of pgsz */
 21123    a = sqlite3_malloc( n ? n : 1 );
 21124    shell_check_oom(a);
 21125    memset(a, 0, n);
 21126    if( pgsz<512 || pgsz>65536 || (pgsz & (pgsz-1))!=0 ){
 21127      utf8_printf(stderr, "invalid pagesize\n");
 21128      goto readHexDb_error;
 21129    }
 21130    for(nLine++; fgets(zLine, sizeof(zLine), in)!=0; nLine++){
 21131      rc = sscanf(zLine, "| page %d offset %d", &j, &k);
 21132      if( rc==2 ){
 21133        iOffset = k;
 21134        continue;
 21135      }
 21136      if( cli_strncmp(zLine, "| end ", 6)==0 ){
 21137        break;
 21138      }
 21139      rc = sscanf(zLine,"| %d: %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x",
 21140                  &j, &x[0], &x[1], &x[2], &x[3], &x[4], &x[5], &x[6], &x[7],
 21141                  &x[8], &x[9], &x[10], &x[11], &x[12], &x[13], &x[14], &x[15]);
 21142      if( rc==17 ){
 21143        k = iOffset+j;
 21144        if( k+16<=n && k>=0 ){
 21145          int ii;
 21146          for(ii=0; ii<16; ii++) a[k+ii] = x[ii]&0xff;
 21147        }
 21148      }
 21149    }
 21150    *pnData = n;
 21151    if( in!=p->in ){
 21152      fclose(in);
 21153    }else{
 21154      p->lineno = nLine;
 21155    }
 21156    return a;
 21157  
 21158  readHexDb_error:
 21159    if( in!=p->in ){
 21160      fclose(in);
 21161    }else{
 21162      while( fgets(zLine, sizeof(zLine), p->in)!=0 ){
 21163        nLine++;
 21164        if(cli_strncmp(zLine, "| end ", 6)==0 ) break;
 21165      }
 21166      p->lineno = nLine;
 21167    }
 21168    sqlite3_free(a);
 21169    utf8_printf(stderr,"Error on line %d of --hexdb input\n", nLine);
 21170    return 0;
 21171  }
 21172  #endif /* SQLITE_OMIT_DESERIALIZE */
 21173  
 21174  /*
 21175  ** Scalar function "usleep(X)" invokes sqlite3_sleep(X) and returns X.
 21176  */
 21177  static void shellUSleepFunc(
 21178    sqlite3_context *context,
 21179    int argcUnused,
 21180    sqlite3_value **argv
 21181  ){
 21182    int sleep = sqlite3_value_int(argv[0]);
 21183    (void)argcUnused;
 21184    sqlite3_sleep(sleep/1000);
 21185    sqlite3_result_int(context, sleep);
 21186  }
 21187  
 21188  /* Flags for open_db().
 21189  **
 21190  ** The default behavior of open_db() is to exit(1) if the database fails to
 21191  ** open.  The OPEN_DB_KEEPALIVE flag changes that so that it prints an error
 21192  ** but still returns without calling exit.
 21193  **
 21194  ** The OPEN_DB_ZIPFILE flag causes open_db() to prefer to open files as a
 21195  ** ZIP archive if the file does not exist or is empty and its name matches
 21196  ** the *.zip pattern.
 21197  */
 21198  #define OPEN_DB_KEEPALIVE   0x001   /* Return after error if true */
 21199  #define OPEN_DB_ZIPFILE     0x002   /* Open as ZIP if name matches *.zip */
 21200  
 21201  /*
 21202  ** Make sure the database is open.  If it is not, then open it.  If
 21203  ** the database fails to open, print an error message and exit.
 21204  */
 21205  static void open_db(ShellState *p, int openFlags){
 21206    if( p->db==0 ){
 21207      const char *zDbFilename = p->pAuxDb->zDbFilename;
 21208      if( p->openMode==SHELL_OPEN_UNSPEC ){
 21209        if( zDbFilename==0 || zDbFilename[0]==0 ){
 21210          p->openMode = SHELL_OPEN_NORMAL;
 21211        }else{
 21212          p->openMode = (u8)deduceDatabaseType(zDbFilename,
 21213                               (openFlags & OPEN_DB_ZIPFILE)!=0);
 21214        }
 21215      }
 21216      switch( p->openMode ){
 21217        case SHELL_OPEN_APPENDVFS: {
 21218          sqlite3_open_v2(zDbFilename, &p->db,
 21219             SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, "apndvfs");
 21220          break;
 21221        }
 21222        case SHELL_OPEN_HEXDB:
 21223        case SHELL_OPEN_DESERIALIZE: {
 21224          sqlite3_open(0, &p->db);
 21225          break;
 21226        }
 21227        case SHELL_OPEN_ZIPFILE: {
 21228          sqlite3_open(":memory:", &p->db);
 21229          break;
 21230        }
 21231        case SHELL_OPEN_READONLY: {
 21232          sqlite3_open_v2(zDbFilename, &p->db,
 21233              SQLITE_OPEN_READONLY|p->openFlags, 0);
 21234          break;
 21235        }
 21236        case SHELL_OPEN_UNSPEC:
 21237        case SHELL_OPEN_NORMAL: {
 21238          sqlite3_open_v2(zDbFilename, &p->db,
 21239             SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, 0);
 21240          break;
 21241        }
 21242      }
 21243      globalDb = p->db;
 21244      if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){
 21245        utf8_printf(stderr,"Error: unable to open database \"%s\": %s\n",
 21246            zDbFilename, sqlite3_errmsg(p->db));
 21247        if( (openFlags & OPEN_DB_KEEPALIVE)==0 ){
 21248          exit(1);
 21249        }
 21250        sqlite3_close(p->db);
 21251        sqlite3_open(":memory:", &p->db);
 21252        if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){
 21253          utf8_printf(stderr,
 21254            "Also: unable to open substitute in-memory database.\n"
 21255          );
 21256          exit(1);
 21257        }else{
 21258          utf8_printf(stderr,
 21259            "Notice: using substitute in-memory database instead of \"%s\"\n",
 21260            zDbFilename);
 21261        }
 21262      }
 21263      sqlite3_db_config(p->db, SQLITE_DBCONFIG_STMT_SCANSTATUS, (int)0, (int*)0);
 21264  
 21265      /* Reflect the use or absence of --unsafe-testing invocation. */
 21266      {
 21267        int testmode_on = ShellHasFlag(p,SHFLG_TestingMode);
 21268        sqlite3_db_config(p->db, SQLITE_DBCONFIG_TRUSTED_SCHEMA, testmode_on,0);
 21269        sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, !testmode_on,0);
 21270      }
 21271  
 21272  #ifndef SQLITE_OMIT_LOAD_EXTENSION
 21273      sqlite3_enable_load_extension(p->db, 1);
 21274  #endif
 21275      sqlite3_shathree_init(p->db, 0, 0);
 21276      sqlite3_uint_init(p->db, 0, 0);
 21277      sqlite3_decimal_init(p->db, 0, 0);
 21278      sqlite3_base64_init(p->db, 0, 0);
 21279      sqlite3_base85_init(p->db, 0, 0);
 21280      sqlite3_regexp_init(p->db, 0, 0);
 21281      sqlite3_ieee_init(p->db, 0, 0);
 21282      sqlite3_series_init(p->db, 0, 0);
 21283  #ifndef SQLITE_SHELL_FIDDLE
 21284      sqlite3_fileio_init(p->db, 0, 0);
 21285      sqlite3_completion_init(p->db, 0, 0);
 21286  #endif
 21287  #ifdef SQLITE_HAVE_ZLIB
 21288      if( !p->bSafeModePersist ){
 21289        sqlite3_zipfile_init(p->db, 0, 0);
 21290        sqlite3_sqlar_init(p->db, 0, 0);
 21291      }
 21292  #endif
 21293  #ifdef SQLITE_SHELL_EXTFUNCS
 21294      /* Create a preprocessing mechanism for extensions to make
 21295       * their own provisions for being built into the shell.
 21296       * This is a short-span macro. See further below for usage.
 21297       */
 21298  #define SHELL_SUB_MACRO(base, variant) base ## _ ## variant
 21299  #define SHELL_SUBMACRO(base, variant) SHELL_SUB_MACRO(base, variant)
 21300      /* Let custom-included extensions get their ..._init() called.
 21301       * The WHATEVER_INIT( db, pzErrorMsg, pApi ) macro should cause
 21302       * the extension's sqlite3_*_init( db, pzErrorMsg, pApi )
 21303       * initialization routine to be called.
 21304       */
 21305      {
 21306        int irc = SHELL_SUBMACRO(SQLITE_SHELL_EXTFUNCS, INIT)(p->db);
 21307      /* Let custom-included extensions expose their functionality.
 21308       * The WHATEVER_EXPOSE( db, pzErrorMsg ) macro should cause
 21309       * the SQL functions, virtual tables, collating sequences or
 21310       * VFS's implemented by the extension to be registered.
 21311       */
 21312        if( irc==SQLITE_OK
 21313            || irc==SQLITE_OK_LOAD_PERMANENTLY ){
 21314          SHELL_SUBMACRO(SQLITE_SHELL_EXTFUNCS, EXPOSE)(p->db, 0);
 21315        }
 21316  #undef SHELL_SUB_MACRO
 21317  #undef SHELL_SUBMACRO
 21318      }
 21319  #endif
 21320  
 21321      sqlite3_create_function(p->db, "strtod", 1, SQLITE_UTF8, 0,
 21322                              shellStrtod, 0, 0);
 21323      sqlite3_create_function(p->db, "dtostr", 1, SQLITE_UTF8, 0,
 21324                              shellDtostr, 0, 0);
 21325      sqlite3_create_function(p->db, "dtostr", 2, SQLITE_UTF8, 0,
 21326                              shellDtostr, 0, 0);
 21327      sqlite3_create_function(p->db, "shell_add_schema", 3, SQLITE_UTF8, 0,
 21328                              shellAddSchemaName, 0, 0);
 21329      sqlite3_create_function(p->db, "shell_module_schema", 1, SQLITE_UTF8, 0,
 21330                              shellModuleSchema, 0, 0);
 21331      sqlite3_create_function(p->db, "shell_putsnl", 1, SQLITE_UTF8, p,
 21332                              shellPutsFunc, 0, 0);
 21333      sqlite3_create_function(p->db, "usleep",1,SQLITE_UTF8,0,
 21334                              shellUSleepFunc, 0, 0);
 21335  #ifndef SQLITE_NOHAVE_SYSTEM
 21336      sqlite3_create_function(p->db, "edit", 1, SQLITE_UTF8, 0,
 21337                              editFunc, 0, 0);
 21338      sqlite3_create_function(p->db, "edit", 2, SQLITE_UTF8, 0,
 21339                              editFunc, 0, 0);
 21340  #endif
 21341  
 21342      if( p->openMode==SHELL_OPEN_ZIPFILE ){
 21343        char *zSql = sqlite3_mprintf(
 21344           "CREATE VIRTUAL TABLE zip USING zipfile(%Q);", zDbFilename);
 21345        shell_check_oom(zSql);
 21346        sqlite3_exec(p->db, zSql, 0, 0, 0);
 21347        sqlite3_free(zSql);
 21348      }
 21349  #ifndef SQLITE_OMIT_DESERIALIZE
 21350      else
 21351      if( p->openMode==SHELL_OPEN_DESERIALIZE || p->openMode==SHELL_OPEN_HEXDB ){
 21352        int rc;
 21353        int nData = 0;
 21354        unsigned char *aData;
 21355        if( p->openMode==SHELL_OPEN_DESERIALIZE ){
 21356          aData = (unsigned char*)readFile(zDbFilename, &nData);
 21357        }else{
 21358          aData = readHexDb(p, &nData);
 21359        }
 21360        if( aData==0 ){
 21361          return;
 21362        }
 21363        rc = sqlite3_deserialize(p->db, "main", aData, nData, nData,
 21364                     SQLITE_DESERIALIZE_RESIZEABLE |
 21365                     SQLITE_DESERIALIZE_FREEONCLOSE);
 21366        if( rc ){
 21367          utf8_printf(stderr, "Error: sqlite3_deserialize() returns %d\n", rc);
 21368        }
 21369        if( p->szMax>0 ){
 21370          sqlite3_file_control(p->db, "main", SQLITE_FCNTL_SIZE_LIMIT, &p->szMax);
 21371        }
 21372      }
 21373  #endif
 21374    }
 21375    if( p->db!=0 ){
 21376      if( p->bSafeModePersist ){
 21377        sqlite3_set_authorizer(p->db, safeModeAuth, p);
 21378      }
 21379      sqlite3_db_config(
 21380          p->db, SQLITE_DBCONFIG_STMT_SCANSTATUS, p->scanstatsOn, (int*)0
 21381      );
 21382    }
 21383  }
 21384  
 21385  /*
 21386  ** Attempt to close the database connection.  Report errors.
 21387  */
 21388  void close_db(sqlite3 *db){
 21389    int rc = sqlite3_close(db);
 21390    if( rc ){
 21391      utf8_printf(stderr, "Error: sqlite3_close() returns %d: %s\n",
 21392          rc, sqlite3_errmsg(db));
 21393    }
 21394  }
 21395  
 21396  #if HAVE_READLINE || HAVE_EDITLINE
 21397  /*
 21398  ** Readline completion callbacks
 21399  */
 21400  static char *readline_completion_generator(const char *text, int state){
 21401    static sqlite3_stmt *pStmt = 0;
 21402    char *zRet;
 21403    if( state==0 ){
 21404      char *zSql;
 21405      sqlite3_finalize(pStmt);
 21406      zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
 21407                             "  FROM completion(%Q) ORDER BY 1", text);
 21408      shell_check_oom(zSql);
 21409      sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
 21410      sqlite3_free(zSql);
 21411    }
 21412    if( sqlite3_step(pStmt)==SQLITE_ROW ){
 21413      const char *z = (const char*)sqlite3_column_text(pStmt,0);
 21414      zRet = z ? strdup(z) : 0;
 21415    }else{
 21416      sqlite3_finalize(pStmt);
 21417      pStmt = 0;
 21418      zRet = 0;
 21419    }
 21420    return zRet;
 21421  }
 21422  static char **readline_completion(const char *zText, int iStart, int iEnd){
 21423    (void)iStart;
 21424    (void)iEnd;
 21425    rl_attempted_completion_over = 1;
 21426    return rl_completion_matches(zText, readline_completion_generator);
 21427  }
 21428  
 21429  #elif HAVE_LINENOISE
 21430  /*
 21431  ** Linenoise completion callback
 21432  */
 21433  static void linenoise_completion(const char *zLine, linenoiseCompletions *lc){
 21434    i64 nLine = strlen(zLine);
 21435    i64 i, iStart;
 21436    sqlite3_stmt *pStmt = 0;
 21437    char *zSql;
 21438    char zBuf[1000];
 21439  
 21440    if( nLine>(i64)sizeof(zBuf)-30 ) return;
 21441    if( zLine[0]=='.' || zLine[0]=='#') return;
 21442    for(i=nLine-1; i>=0 && (isalnum(zLine[i]) || zLine[i]=='_'); i--){}
 21443    if( i==nLine-1 ) return;
 21444    iStart = i+1;
 21445    memcpy(zBuf, zLine, iStart);
 21446    zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
 21447                           "  FROM completion(%Q,%Q) ORDER BY 1",
 21448                           &zLine[iStart], zLine);
 21449    shell_check_oom(zSql);
 21450    sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
 21451    sqlite3_free(zSql);
 21452    sqlite3_exec(globalDb, "PRAGMA page_count", 0, 0, 0); /* Load the schema */
 21453    while( sqlite3_step(pStmt)==SQLITE_ROW ){
 21454      const char *zCompletion = (const char*)sqlite3_column_text(pStmt, 0);
 21455      int nCompletion = sqlite3_column_bytes(pStmt, 0);
 21456      if( iStart+nCompletion < (i64)sizeof(zBuf)-1 && zCompletion ){
 21457        memcpy(zBuf+iStart, zCompletion, nCompletion+1);
 21458        linenoiseAddCompletion(lc, zBuf);
 21459      }
 21460    }
 21461    sqlite3_finalize(pStmt);
 21462  }
 21463  #endif
 21464  
 21465  /*
 21466  ** Do C-language style dequoting.
 21467  **
 21468  **    \a    -> alarm
 21469  **    \b    -> backspace
 21470  **    \t    -> tab
 21471  **    \n    -> newline
 21472  **    \v    -> vertical tab
 21473  **    \f    -> form feed
 21474  **    \r    -> carriage return
 21475  **    \s    -> space
 21476  **    \"    -> "
 21477  **    \'    -> '
 21478  **    \\    -> backslash
 21479  **    \NNN  -> ascii character NNN in octal
 21480  **    \xHH  -> ascii character HH in hexadecimal
 21481  */
 21482  static void resolve_backslashes(char *z){
 21483    int i, j;
 21484    char c;
 21485    while( *z && *z!='\\' ) z++;
 21486    for(i=j=0; (c = z[i])!=0; i++, j++){
 21487      if( c=='\\' && z[i+1]!=0 ){
 21488        c = z[++i];
 21489        if( c=='a' ){
 21490          c = '\a';
 21491        }else if( c=='b' ){
 21492          c = '\b';
 21493        }else if( c=='t' ){
 21494          c = '\t';
 21495        }else if( c=='n' ){
 21496          c = '\n';
 21497        }else if( c=='v' ){
 21498          c = '\v';
 21499        }else if( c=='f' ){
 21500          c = '\f';
 21501        }else if( c=='r' ){
 21502          c = '\r';
 21503        }else if( c=='"' ){
 21504          c = '"';
 21505        }else if( c=='\'' ){
 21506          c = '\'';
 21507        }else if( c=='\\' ){
 21508          c = '\\';
 21509        }else if( c=='x' ){
 21510          int nhd = 0, hdv;
 21511          u8 hv = 0;
 21512          while( nhd<2 && (c=z[i+1+nhd])!=0 && (hdv=hexDigitValue(c))>=0 ){
 21513            hv = (u8)((hv<<4)|hdv);
 21514            ++nhd;
 21515          }
 21516          i += nhd;
 21517          c = (u8)hv;
 21518        }else if( c>='0' && c<='7' ){
 21519          c -= '0';
 21520          if( z[i+1]>='0' && z[i+1]<='7' ){
 21521            i++;
 21522            c = (c<<3) + z[i] - '0';
 21523            if( z[i+1]>='0' && z[i+1]<='7' ){
 21524              i++;
 21525              c = (c<<3) + z[i] - '0';
 21526            }
 21527          }
 21528        }
 21529      }
 21530      z[j] = c;
 21531    }
 21532    if( j<i ) z[j] = 0;
 21533  }
 21534  
 21535  /*
 21536  ** Interpret zArg as either an integer or a boolean value.  Return 1 or 0
 21537  ** for TRUE and FALSE.  Return the integer value if appropriate.
 21538  */
 21539  static int booleanValue(const char *zArg){
 21540    int i;
 21541    if( zArg[0]=='0' && zArg[1]=='x' ){
 21542      for(i=2; hexDigitValue(zArg[i])>=0; i++){}
 21543    }else{
 21544      for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
 21545    }
 21546    if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
 21547    if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
 21548      return 1;
 21549    }
 21550    if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
 21551      return 0;
 21552    }
 21553    utf8_printf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
 21554            zArg);
 21555    return 0;
 21556  }
 21557  
 21558  /*
 21559  ** Set or clear a shell flag according to a boolean value.
 21560  */
 21561  static void setOrClearFlag(ShellState *p, unsigned mFlag, const char *zArg){
 21562    if( booleanValue(zArg) ){
 21563      ShellSetFlag(p, mFlag);
 21564    }else{
 21565      ShellClearFlag(p, mFlag);
 21566    }
 21567  }
 21568  
 21569  /*
 21570  ** Close an output file, assuming it is not stderr or stdout
 21571  */
 21572  static void output_file_close(FILE *f){
 21573    if( f && f!=stdout && f!=stderr ) fclose(f);
 21574  }
 21575  
 21576  /*
 21577  ** Try to open an output file.   The names "stdout" and "stderr" are
 21578  ** recognized and do the right thing.  NULL is returned if the output
 21579  ** filename is "off".
 21580  */
 21581  static FILE *output_file_open(const char *zFile, int bTextMode){
 21582    FILE *f;
 21583    if( cli_strcmp(zFile,"stdout")==0 ){
 21584      f = stdout;
 21585    }else if( cli_strcmp(zFile, "stderr")==0 ){
 21586      f = stderr;
 21587    }else if( cli_strcmp(zFile, "off")==0 ){
 21588      f = 0;
 21589    }else{
 21590      f = fopen(zFile, bTextMode ? "w" : "wb");
 21591      if( f==0 ){
 21592        utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
 21593      }
 21594    }
 21595    return f;
 21596  }
 21597  
 21598  #ifndef SQLITE_OMIT_TRACE
 21599  /*
 21600  ** A routine for handling output from sqlite3_trace().
 21601  */
 21602  static int sql_trace_callback(
 21603    unsigned mType,         /* The trace type */
 21604    void *pArg,             /* The ShellState pointer */
 21605    void *pP,               /* Usually a pointer to sqlite_stmt */
 21606    void *pX                /* Auxiliary output */
 21607  ){
 21608    ShellState *p = (ShellState*)pArg;
 21609    sqlite3_stmt *pStmt;
 21610    const char *zSql;
 21611    i64 nSql;
 21612    if( p->traceOut==0 ) return 0;
 21613    if( mType==SQLITE_TRACE_CLOSE ){
 21614      utf8_printf(p->traceOut, "-- closing database connection\n");
 21615      return 0;
 21616    }
 21617    if( mType!=SQLITE_TRACE_ROW && pX!=0 && ((const char*)pX)[0]=='-' ){
 21618      zSql = (const char*)pX;
 21619    }else{
 21620      pStmt = (sqlite3_stmt*)pP;
 21621      switch( p->eTraceType ){
 21622        case SHELL_TRACE_EXPANDED: {
 21623          zSql = sqlite3_expanded_sql(pStmt);
 21624          break;
 21625        }
 21626  #ifdef SQLITE_ENABLE_NORMALIZE
 21627        case SHELL_TRACE_NORMALIZED: {
 21628          zSql = sqlite3_normalized_sql(pStmt);
 21629          break;
 21630        }
 21631  #endif
 21632        default: {
 21633          zSql = sqlite3_sql(pStmt);
 21634          break;
 21635        }
 21636      }
 21637    }
 21638    if( zSql==0 ) return 0;
 21639    nSql = strlen(zSql);
 21640    if( nSql>1000000000 ) nSql = 1000000000;
 21641    while( nSql>0 && zSql[nSql-1]==';' ){ nSql--; }
 21642    switch( mType ){
 21643      case SQLITE_TRACE_ROW:
 21644      case SQLITE_TRACE_STMT: {
 21645        utf8_printf(p->traceOut, "%.*s;\n", (int)nSql, zSql);
 21646        break;
 21647      }
 21648      case SQLITE_TRACE_PROFILE: {
 21649        sqlite3_int64 nNanosec = pX ? *(sqlite3_int64*)pX : 0;
 21650        utf8_printf(p->traceOut, "%.*s; -- %lld ns\n", (int)nSql, zSql, nNanosec);
 21651        break;
 21652      }
 21653    }
 21654    return 0;
 21655  }
 21656  #endif
 21657  
 21658  /*
 21659  ** A no-op routine that runs with the ".breakpoint" doc-command.  This is
 21660  ** a useful spot to set a debugger breakpoint.
 21661  **
 21662  ** This routine does not do anything practical.  The code are there simply
 21663  ** to prevent the compiler from optimizing this routine out.
 21664  */
 21665  static void test_breakpoint(void){
 21666    static unsigned int nCall = 0;
 21667    if( (nCall++)==0xffffffff ) printf("Many .breakpoints have run\n");
 21668  }
 21669  
 21670  /*
 21671  ** An object used to read a CSV and other files for import.
 21672  */
 21673  typedef struct ImportCtx ImportCtx;
 21674  struct ImportCtx {
 21675    const char *zFile;  /* Name of the input file */
 21676    FILE *in;           /* Read the CSV text from this input stream */
 21677    int (SQLITE_CDECL *xCloser)(FILE*);      /* Func to close in */
 21678    char *z;            /* Accumulated text for a field */
 21679    int n;              /* Number of bytes in z */
 21680    int nAlloc;         /* Space allocated for z[] */
 21681    int nLine;          /* Current line number */
 21682    int nRow;           /* Number of rows imported */
 21683    int nErr;           /* Number of errors encountered */
 21684    int bNotFirst;      /* True if one or more bytes already read */
 21685    int cTerm;          /* Character that terminated the most recent field */
 21686    int cColSep;        /* The column separator character.  (Usually ",") */
 21687    int cRowSep;        /* The row separator character.  (Usually "\n") */
 21688  };
 21689  
 21690  /* Clean up resourced used by an ImportCtx */
 21691  static void import_cleanup(ImportCtx *p){
 21692    if( p->in!=0 && p->xCloser!=0 ){
 21693      p->xCloser(p->in);
 21694      p->in = 0;
 21695    }
 21696    sqlite3_free(p->z);
 21697    p->z = 0;
 21698  }
 21699  
 21700  /* Append a single byte to z[] */
 21701  static void import_append_char(ImportCtx *p, int c){
 21702    if( p->n+1>=p->nAlloc ){
 21703      p->nAlloc += p->nAlloc + 100;
 21704      p->z = sqlite3_realloc64(p->z, p->nAlloc);
 21705      shell_check_oom(p->z);
 21706    }
 21707    p->z[p->n++] = (char)c;
 21708  }
 21709  
 21710  /* Read a single field of CSV text.  Compatible with rfc4180 and extended
 21711  ** with the option of having a separator other than ",".
 21712  **
 21713  **   +  Input comes from p->in.
 21714  **   +  Store results in p->z of length p->n.  Space to hold p->z comes
 21715  **      from sqlite3_malloc64().
 21716  **   +  Use p->cSep as the column separator.  The default is ",".
 21717  **   +  Use p->rSep as the row separator.  The default is "\n".
 21718  **   +  Keep track of the line number in p->nLine.
 21719  **   +  Store the character that terminates the field in p->cTerm.  Store
 21720  **      EOF on end-of-file.
 21721  **   +  Report syntax errors on stderr
 21722  */
 21723  static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){
 21724    int c;
 21725    int cSep = (u8)p->cColSep;
 21726    int rSep = (u8)p->cRowSep;
 21727    p->n = 0;
 21728    c = fgetc(p->in);
 21729    if( c==EOF || seenInterrupt ){
 21730      p->cTerm = EOF;
 21731      return 0;
 21732    }
 21733    if( c=='"' ){
 21734      int pc, ppc;
 21735      int startLine = p->nLine;
 21736      int cQuote = c;
 21737      pc = ppc = 0;
 21738      while( 1 ){
 21739        c = fgetc(p->in);
 21740        if( c==rSep ) p->nLine++;
 21741        if( c==cQuote ){
 21742          if( pc==cQuote ){
 21743            pc = 0;
 21744            continue;
 21745          }
 21746        }
 21747        if( (c==cSep && pc==cQuote)
 21748         || (c==rSep && pc==cQuote)
 21749         || (c==rSep && pc=='\r' && ppc==cQuote)
 21750         || (c==EOF && pc==cQuote)
 21751        ){
 21752          do{ p->n--; }while( p->z[p->n]!=cQuote );
 21753          p->cTerm = c;
 21754          break;
 21755        }
 21756        if( pc==cQuote && c!='\r' ){
 21757          utf8_printf(stderr, "%s:%d: unescaped %c character\n",
 21758                  p->zFile, p->nLine, cQuote);
 21759        }
 21760        if( c==EOF ){
 21761          utf8_printf(stderr, "%s:%d: unterminated %c-quoted field\n",
 21762                  p->zFile, startLine, cQuote);
 21763          p->cTerm = c;
 21764          break;
 21765        }
 21766        import_append_char(p, c);
 21767        ppc = pc;
 21768        pc = c;
 21769      }
 21770    }else{
 21771      /* If this is the first field being parsed and it begins with the
 21772      ** UTF-8 BOM  (0xEF BB BF) then skip the BOM */
 21773      if( (c&0xff)==0xef && p->bNotFirst==0 ){
 21774        import_append_char(p, c);
 21775        c = fgetc(p->in);
 21776        if( (c&0xff)==0xbb ){
 21777          import_append_char(p, c);
 21778          c = fgetc(p->in);
 21779          if( (c&0xff)==0xbf ){
 21780            p->bNotFirst = 1;
 21781            p->n = 0;
 21782            return csv_read_one_field(p);
 21783          }
 21784        }
 21785      }
 21786      while( c!=EOF && c!=cSep && c!=rSep ){
 21787        import_append_char(p, c);
 21788        c = fgetc(p->in);
 21789      }
 21790      if( c==rSep ){
 21791        p->nLine++;
 21792        if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
 21793      }
 21794      p->cTerm = c;
 21795    }
 21796    if( p->z ) p->z[p->n] = 0;
 21797    p->bNotFirst = 1;
 21798    return p->z;
 21799  }
 21800  
 21801  /* Read a single field of ASCII delimited text.
 21802  **
 21803  **   +  Input comes from p->in.
 21804  **   +  Store results in p->z of length p->n.  Space to hold p->z comes
 21805  **      from sqlite3_malloc64().
 21806  **   +  Use p->cSep as the column separator.  The default is "\x1F".
 21807  **   +  Use p->rSep as the row separator.  The default is "\x1E".
 21808  **   +  Keep track of the row number in p->nLine.
 21809  **   +  Store the character that terminates the field in p->cTerm.  Store
 21810  **      EOF on end-of-file.
 21811  **   +  Report syntax errors on stderr
 21812  */
 21813  static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){
 21814    int c;
 21815    int cSep = (u8)p->cColSep;
 21816    int rSep = (u8)p->cRowSep;
 21817    p->n = 0;
 21818    c = fgetc(p->in);
 21819    if( c==EOF || seenInterrupt ){
 21820      p->cTerm = EOF;
 21821      return 0;
 21822    }
 21823    while( c!=EOF && c!=cSep && c!=rSep ){
 21824      import_append_char(p, c);
 21825      c = fgetc(p->in);
 21826    }
 21827    if( c==rSep ){
 21828      p->nLine++;
 21829    }
 21830    p->cTerm = c;
 21831    if( p->z ) p->z[p->n] = 0;
 21832    return p->z;
 21833  }
 21834  
 21835  /*
 21836  ** Try to transfer data for table zTable.  If an error is seen while
 21837  ** moving forward, try to go backwards.  The backwards movement won't
 21838  ** work for WITHOUT ROWID tables.
 21839  */
 21840  static void tryToCloneData(
 21841    ShellState *p,
 21842    sqlite3 *newDb,
 21843    const char *zTable
 21844  ){
 21845    sqlite3_stmt *pQuery = 0;
 21846    sqlite3_stmt *pInsert = 0;
 21847    char *zQuery = 0;
 21848    char *zInsert = 0;
 21849    int rc;
 21850    int i, j, n;
 21851    int nTable = strlen30(zTable);
 21852    int k = 0;
 21853    int cnt = 0;
 21854    const int spinRate = 10000;
 21855  
 21856    zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
 21857    shell_check_oom(zQuery);
 21858    rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
 21859    if( rc ){
 21860      utf8_printf(stderr, "Error %d: %s on [%s]\n",
 21861              sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
 21862              zQuery);
 21863      goto end_data_xfer;
 21864    }
 21865    n = sqlite3_column_count(pQuery);
 21866    zInsert = sqlite3_malloc64(200 + nTable + n*3);
 21867    shell_check_oom(zInsert);
 21868    sqlite3_snprintf(200+nTable,zInsert,
 21869                     "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
 21870    i = strlen30(zInsert);
 21871    for(j=1; j<n; j++){
 21872      memcpy(zInsert+i, ",?", 2);
 21873      i += 2;
 21874    }
 21875    memcpy(zInsert+i, ");", 3);
 21876    rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
 21877    if( rc ){
 21878      utf8_printf(stderr, "Error %d: %s on [%s]\n",
 21879              sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
 21880              zInsert);
 21881      goto end_data_xfer;
 21882    }
 21883    for(k=0; k<2; k++){
 21884      while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
 21885        for(i=0; i<n; i++){
 21886          switch( sqlite3_column_type(pQuery, i) ){
 21887            case SQLITE_NULL: {
 21888              sqlite3_bind_null(pInsert, i+1);
 21889              break;
 21890            }
 21891            case SQLITE_INTEGER: {
 21892              sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
 21893              break;
 21894            }
 21895            case SQLITE_FLOAT: {
 21896              sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
 21897              break;
 21898            }
 21899            case SQLITE_TEXT: {
 21900              sqlite3_bind_text(pInsert, i+1,
 21901                               (const char*)sqlite3_column_text(pQuery,i),
 21902                               -1, SQLITE_STATIC);
 21903              break;
 21904            }
 21905            case SQLITE_BLOB: {
 21906              sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
 21907                                              sqlite3_column_bytes(pQuery,i),
 21908                                              SQLITE_STATIC);
 21909              break;
 21910            }
 21911          }
 21912        } /* End for */
 21913        rc = sqlite3_step(pInsert);
 21914        if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
 21915          utf8_printf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
 21916                          sqlite3_errmsg(newDb));
 21917        }
 21918        sqlite3_reset(pInsert);
 21919        cnt++;
 21920        if( (cnt%spinRate)==0 ){
 21921          printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
 21922          fflush(stdout);
 21923        }
 21924      } /* End while */
 21925      if( rc==SQLITE_DONE ) break;
 21926      sqlite3_finalize(pQuery);
 21927      sqlite3_free(zQuery);
 21928      zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
 21929                               zTable);
 21930      shell_check_oom(zQuery);
 21931      rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
 21932      if( rc ){
 21933        utf8_printf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
 21934        break;
 21935      }
 21936    } /* End for(k=0...) */
 21937  
 21938  end_data_xfer:
 21939    sqlite3_finalize(pQuery);
 21940    sqlite3_finalize(pInsert);
 21941    sqlite3_free(zQuery);
 21942    sqlite3_free(zInsert);
 21943  }
 21944  
 21945  
 21946  /*
 21947  ** Try to transfer all rows of the schema that match zWhere.  For
 21948  ** each row, invoke xForEach() on the object defined by that row.
 21949  ** If an error is encountered while moving forward through the
 21950  ** sqlite_schema table, try again moving backwards.
 21951  */
 21952  static void tryToCloneSchema(
 21953    ShellState *p,
 21954    sqlite3 *newDb,
 21955    const char *zWhere,
 21956    void (*xForEach)(ShellState*,sqlite3*,const char*)
 21957  ){
 21958    sqlite3_stmt *pQuery = 0;
 21959    char *zQuery = 0;
 21960    int rc;
 21961    const unsigned char *zName;
 21962    const unsigned char *zSql;
 21963    char *zErrMsg = 0;
 21964  
 21965    zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema"
 21966                             " WHERE %s ORDER BY rowid ASC", zWhere);
 21967    shell_check_oom(zQuery);
 21968    rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
 21969    if( rc ){
 21970      utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
 21971                      sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
 21972                      zQuery);
 21973      goto end_schema_xfer;
 21974    }
 21975    while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
 21976      zName = sqlite3_column_text(pQuery, 0);
 21977      zSql = sqlite3_column_text(pQuery, 1);
 21978      if( zName==0 || zSql==0 ) continue;
 21979      if( sqlite3_stricmp((char*)zName, "sqlite_sequence")!=0 ){
 21980        printf("%s... ", zName); fflush(stdout);
 21981        sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
 21982        if( zErrMsg ){
 21983          utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
 21984          sqlite3_free(zErrMsg);
 21985          zErrMsg = 0;
 21986        }
 21987      }
 21988      if( xForEach ){
 21989        xForEach(p, newDb, (const char*)zName);
 21990      }
 21991      printf("done\n");
 21992    }
 21993    if( rc!=SQLITE_DONE ){
 21994      sqlite3_finalize(pQuery);
 21995      sqlite3_free(zQuery);
 21996      zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema"
 21997                               " WHERE %s ORDER BY rowid DESC", zWhere);
 21998      shell_check_oom(zQuery);
 21999      rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
 22000      if( rc ){
 22001        utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
 22002                        sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
 22003                        zQuery);
 22004        goto end_schema_xfer;
 22005      }
 22006      while( sqlite3_step(pQuery)==SQLITE_ROW ){
 22007        zName = sqlite3_column_text(pQuery, 0);
 22008        zSql = sqlite3_column_text(pQuery, 1);
 22009        if( zName==0 || zSql==0 ) continue;
 22010        if( sqlite3_stricmp((char*)zName, "sqlite_sequence")==0 ) continue;
 22011        printf("%s... ", zName); fflush(stdout);
 22012        sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
 22013        if( zErrMsg ){
 22014          utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
 22015          sqlite3_free(zErrMsg);
 22016          zErrMsg = 0;
 22017        }
 22018        if( xForEach ){
 22019          xForEach(p, newDb, (const char*)zName);
 22020        }
 22021        printf("done\n");
 22022      }
 22023    }
 22024  end_schema_xfer:
 22025    sqlite3_finalize(pQuery);
 22026    sqlite3_free(zQuery);
 22027  }
 22028  
 22029  /*
 22030  ** Open a new database file named "zNewDb".  Try to recover as much information
 22031  ** as possible out of the main database (which might be corrupt) and write it
 22032  ** into zNewDb.
 22033  */
 22034  static void tryToClone(ShellState *p, const char *zNewDb){
 22035    int rc;
 22036    sqlite3 *newDb = 0;
 22037    if( access(zNewDb,0)==0 ){
 22038      utf8_printf(stderr, "File \"%s\" already exists.\n", zNewDb);
 22039      return;
 22040    }
 22041    rc = sqlite3_open(zNewDb, &newDb);
 22042    if( rc ){
 22043      utf8_printf(stderr, "Cannot create output database: %s\n",
 22044              sqlite3_errmsg(newDb));
 22045    }else{
 22046      sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
 22047      sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
 22048      tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
 22049      tryToCloneSchema(p, newDb, "type!='table'", 0);
 22050      sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
 22051      sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
 22052    }
 22053    close_db(newDb);
 22054  }
 22055  
 22056  /*
 22057  ** Change the output file back to stdout.
 22058  **
 22059  ** If the p->doXdgOpen flag is set, that means the output was being
 22060  ** redirected to a temporary file named by p->zTempFile.  In that case,
 22061  ** launch start/open/xdg-open on that temporary file.
 22062  */
 22063  static void output_reset(ShellState *p){
 22064    if( p->outfile[0]=='|' ){
 22065  #ifndef SQLITE_OMIT_POPEN
 22066      pclose(p->out);
 22067  #endif
 22068    }else{
 22069      output_file_close(p->out);
 22070  #ifndef SQLITE_NOHAVE_SYSTEM
 22071      if( p->doXdgOpen ){
 22072        const char *zXdgOpenCmd =
 22073  #if defined(_WIN32)
 22074        "start";
 22075  #elif defined(__APPLE__)
 22076        "open";
 22077  #else
 22078        "xdg-open";
 22079  #endif
 22080        char *zCmd;
 22081        zCmd = sqlite3_mprintf("%s %s", zXdgOpenCmd, p->zTempFile);
 22082        if( system(zCmd) ){
 22083          utf8_printf(stderr, "Failed: [%s]\n", zCmd);
 22084        }else{
 22085          /* Give the start/open/xdg-open command some time to get
 22086          ** going before we continue, and potential delete the
 22087          ** p->zTempFile data file out from under it */
 22088          sqlite3_sleep(2000);
 22089        }
 22090        sqlite3_free(zCmd);
 22091        outputModePop(p);
 22092        p->doXdgOpen = 0;
 22093      }
 22094  #endif /* !defined(SQLITE_NOHAVE_SYSTEM) */
 22095    }
 22096    p->outfile[0] = 0;
 22097    p->out = stdout;
 22098  }
 22099  
 22100  /*
 22101  ** Run an SQL command and return the single integer result.
 22102  */
 22103  static int db_int(sqlite3 *db, const char *zSql){
 22104    sqlite3_stmt *pStmt;
 22105    int res = 0;
 22106    sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
 22107    if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
 22108      res = sqlite3_column_int(pStmt,0);
 22109    }
 22110    sqlite3_finalize(pStmt);
 22111    return res;
 22112  }
 22113  
 22114  #if SQLITE_SHELL_HAVE_RECOVER
 22115  /*
 22116  ** Convert a 2-byte or 4-byte big-endian integer into a native integer
 22117  */
 22118  static unsigned int get2byteInt(unsigned char *a){
 22119    return (a[0]<<8) + a[1];
 22120  }
 22121  static unsigned int get4byteInt(unsigned char *a){
 22122    return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3];
 22123  }
 22124  
 22125  /*
 22126  ** Implementation of the ".dbinfo" command.
 22127  **
 22128  ** Return 1 on error, 2 to exit, and 0 otherwise.
 22129  */
 22130  static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){
 22131    static const struct { const char *zName; int ofst; } aField[] = {
 22132       { "file change counter:",  24  },
 22133       { "database page count:",  28  },
 22134       { "freelist page count:",  36  },
 22135       { "schema cookie:",        40  },
 22136       { "schema format:",        44  },
 22137       { "default cache size:",   48  },
 22138       { "autovacuum top root:",  52  },
 22139       { "incremental vacuum:",   64  },
 22140       { "text encoding:",        56  },
 22141       { "user version:",         60  },
 22142       { "application id:",       68  },
 22143       { "software version:",     96  },
 22144    };
 22145    static const struct { const char *zName; const char *zSql; } aQuery[] = {
 22146       { "number of tables:",
 22147         "SELECT count(*) FROM %s WHERE type='table'" },
 22148       { "number of indexes:",
 22149         "SELECT count(*) FROM %s WHERE type='index'" },
 22150       { "number of triggers:",
 22151         "SELECT count(*) FROM %s WHERE type='trigger'" },
 22152       { "number of views:",
 22153         "SELECT count(*) FROM %s WHERE type='view'" },
 22154       { "schema size:",
 22155         "SELECT total(length(sql)) FROM %s" },
 22156    };
 22157    int i, rc;
 22158    unsigned iDataVersion;
 22159    char *zSchemaTab;
 22160    char *zDb = nArg>=2 ? azArg[1] : "main";
 22161    sqlite3_stmt *pStmt = 0;
 22162    unsigned char aHdr[100];
 22163    open_db(p, 0);
 22164    if( p->db==0 ) return 1;
 22165    rc = sqlite3_prepare_v2(p->db,
 22166               "SELECT data FROM sqlite_dbpage(?1) WHERE pgno=1",
 22167               -1, &pStmt, 0);
 22168    if( rc ){
 22169      utf8_printf(stderr, "error: %s\n", sqlite3_errmsg(p->db));
 22170      sqlite3_finalize(pStmt);
 22171      return 1;
 22172    }
 22173    sqlite3_bind_text(pStmt, 1, zDb, -1, SQLITE_STATIC);
 22174    if( sqlite3_step(pStmt)==SQLITE_ROW
 22175     && sqlite3_column_bytes(pStmt,0)>100
 22176    ){
 22177      const u8 *pb = sqlite3_column_blob(pStmt,0);
 22178      shell_check_oom(pb);
 22179      memcpy(aHdr, pb, 100);
 22180      sqlite3_finalize(pStmt);
 22181    }else{
 22182      raw_printf(stderr, "unable to read database header\n");
 22183      sqlite3_finalize(pStmt);
 22184      return 1;
 22185    }
 22186    i = get2byteInt(aHdr+16);
 22187    if( i==1 ) i = 65536;
 22188    utf8_printf(p->out, "%-20s %d\n", "database page size:", i);
 22189    utf8_printf(p->out, "%-20s %d\n", "write format:", aHdr[18]);
 22190    utf8_printf(p->out, "%-20s %d\n", "read format:", aHdr[19]);
 22191    utf8_printf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]);
 22192    for(i=0; i<ArraySize(aField); i++){
 22193      int ofst = aField[i].ofst;
 22194      unsigned int val = get4byteInt(aHdr + ofst);
 22195      utf8_printf(p->out, "%-20s %u", aField[i].zName, val);
 22196      switch( ofst ){
 22197        case 56: {
 22198          if( val==1 ) raw_printf(p->out, " (utf8)");
 22199          if( val==2 ) raw_printf(p->out, " (utf16le)");
 22200          if( val==3 ) raw_printf(p->out, " (utf16be)");
 22201        }
 22202      }
 22203      raw_printf(p->out, "\n");
 22204    }
 22205    if( zDb==0 ){
 22206      zSchemaTab = sqlite3_mprintf("main.sqlite_schema");
 22207    }else if( cli_strcmp(zDb,"temp")==0 ){
 22208      zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_schema");
 22209    }else{
 22210      zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_schema", zDb);
 22211    }
 22212    for(i=0; i<ArraySize(aQuery); i++){
 22213      char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab);
 22214      int val = db_int(p->db, zSql);
 22215      sqlite3_free(zSql);
 22216      utf8_printf(p->out, "%-20s %d\n", aQuery[i].zName, val);
 22217    }
 22218    sqlite3_free(zSchemaTab);
 22219    sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_DATA_VERSION, &iDataVersion);
 22220    utf8_printf(p->out, "%-20s %u\n", "data version", iDataVersion);
 22221    return 0;
 22222  }
 22223  #endif /* SQLITE_SHELL_HAVE_RECOVER */
 22224  
 22225  /*
 22226  ** Print the current sqlite3_errmsg() value to stderr and return 1.
 22227  */
 22228  static int shellDatabaseError(sqlite3 *db){
 22229    const char *zErr = sqlite3_errmsg(db);
 22230    utf8_printf(stderr, "Error: %s\n", zErr);
 22231    return 1;
 22232  }
 22233  
 22234  /*
 22235  ** Compare the pattern in zGlob[] against the text in z[].  Return TRUE
 22236  ** if they match and FALSE (0) if they do not match.
 22237  **
 22238  ** Globbing rules:
 22239  **
 22240  **      '*'       Matches any sequence of zero or more characters.
 22241  **
 22242  **      '?'       Matches exactly one character.
 22243  **
 22244  **     [...]      Matches one character from the enclosed list of
 22245  **                characters.
 22246  **
 22247  **     [^...]     Matches one character not in the enclosed list.
 22248  **
 22249  **      '#'       Matches any sequence of one or more digits with an
 22250  **                optional + or - sign in front
 22251  **
 22252  **      ' '       Any span of whitespace matches any other span of
 22253  **                whitespace.
 22254  **
 22255  ** Extra whitespace at the end of z[] is ignored.
 22256  */
 22257  static int testcase_glob(const char *zGlob, const char *z){
 22258    int c, c2;
 22259    int invert;
 22260    int seen;
 22261  
 22262    while( (c = (*(zGlob++)))!=0 ){
 22263      if( IsSpace(c) ){
 22264        if( !IsSpace(*z) ) return 0;
 22265        while( IsSpace(*zGlob) ) zGlob++;
 22266        while( IsSpace(*z) ) z++;
 22267      }else if( c=='*' ){
 22268        while( (c=(*(zGlob++))) == '*' || c=='?' ){
 22269          if( c=='?' && (*(z++))==0 ) return 0;
 22270        }
 22271        if( c==0 ){
 22272          return 1;
 22273        }else if( c=='[' ){
 22274          while( *z && testcase_glob(zGlob-1,z)==0 ){
 22275            z++;
 22276          }
 22277          return (*z)!=0;
 22278        }
 22279        while( (c2 = (*(z++)))!=0 ){
 22280          while( c2!=c ){
 22281            c2 = *(z++);
 22282            if( c2==0 ) return 0;
 22283          }
 22284          if( testcase_glob(zGlob,z) ) return 1;
 22285        }
 22286        return 0;
 22287      }else if( c=='?' ){
 22288        if( (*(z++))==0 ) return 0;
 22289      }else if( c=='[' ){
 22290        int prior_c = 0;
 22291        seen = 0;
 22292        invert = 0;
 22293        c = *(z++);
 22294        if( c==0 ) return 0;
 22295        c2 = *(zGlob++);
 22296        if( c2=='^' ){
 22297          invert = 1;
 22298          c2 = *(zGlob++);
 22299        }
 22300        if( c2==']' ){
 22301          if( c==']' ) seen = 1;
 22302          c2 = *(zGlob++);
 22303        }
 22304        while( c2 && c2!=']' ){
 22305          if( c2=='-' && zGlob[0]!=']' && zGlob[0]!=0 && prior_c>0 ){
 22306            c2 = *(zGlob++);
 22307            if( c>=prior_c && c<=c2 ) seen = 1;
 22308            prior_c = 0;
 22309          }else{
 22310            if( c==c2 ){
 22311              seen = 1;
 22312            }
 22313            prior_c = c2;
 22314          }
 22315          c2 = *(zGlob++);
 22316        }
 22317        if( c2==0 || (seen ^ invert)==0 ) return 0;
 22318      }else if( c=='#' ){
 22319        if( (z[0]=='-' || z[0]=='+') && IsDigit(z[1]) ) z++;
 22320        if( !IsDigit(z[0]) ) return 0;
 22321        z++;
 22322        while( IsDigit(z[0]) ){ z++; }
 22323      }else{
 22324        if( c!=(*(z++)) ) return 0;
 22325      }
 22326    }
 22327    while( IsSpace(*z) ){ z++; }
 22328    return *z==0;
 22329  }
 22330  
 22331  
 22332  /*
 22333  ** Compare the string as a command-line option with either one or two
 22334  ** initial "-" characters.
 22335  */
 22336  static int optionMatch(const char *zStr, const char *zOpt){
 22337    if( zStr[0]!='-' ) return 0;
 22338    zStr++;
 22339    if( zStr[0]=='-' ) zStr++;
 22340    return cli_strcmp(zStr, zOpt)==0;
 22341  }
 22342  
 22343  /*
 22344  ** Delete a file.
 22345  */
 22346  int shellDeleteFile(const char *zFilename){
 22347    int rc;
 22348  #ifdef _WIN32
 22349    wchar_t *z = sqlite3_win32_utf8_to_unicode(zFilename);
 22350    rc = _wunlink(z);
 22351    sqlite3_free(z);
 22352  #else
 22353    rc = unlink(zFilename);
 22354  #endif
 22355    return rc;
 22356  }
 22357  
 22358  /*
 22359  ** Try to delete the temporary file (if there is one) and free the
 22360  ** memory used to hold the name of the temp file.
 22361  */
 22362  static void clearTempFile(ShellState *p){
 22363    if( p->zTempFile==0 ) return;
 22364    if( p->doXdgOpen ) return;
 22365    if( shellDeleteFile(p->zTempFile) ) return;
 22366    sqlite3_free(p->zTempFile);
 22367    p->zTempFile = 0;
 22368  }
 22369  
 22370  /*
 22371  ** Create a new temp file name with the given suffix.
 22372  */
 22373  static void newTempFile(ShellState *p, const char *zSuffix){
 22374    clearTempFile(p);
 22375    sqlite3_free(p->zTempFile);
 22376    p->zTempFile = 0;
 22377    if( p->db ){
 22378      sqlite3_file_control(p->db, 0, SQLITE_FCNTL_TEMPFILENAME, &p->zTempFile);
 22379    }
 22380    if( p->zTempFile==0 ){
 22381      /* If p->db is an in-memory database then the TEMPFILENAME file-control
 22382      ** will not work and we will need to fallback to guessing */
 22383      char *zTemp;
 22384      sqlite3_uint64 r;
 22385      sqlite3_randomness(sizeof(r), &r);
 22386      zTemp = getenv("TEMP");
 22387      if( zTemp==0 ) zTemp = getenv("TMP");
 22388      if( zTemp==0 ){
 22389  #ifdef _WIN32
 22390        zTemp = "\\tmp";
 22391  #else
 22392        zTemp = "/tmp";
 22393  #endif
 22394      }
 22395      p->zTempFile = sqlite3_mprintf("%s/temp%llx.%s", zTemp, r, zSuffix);
 22396    }else{
 22397      p->zTempFile = sqlite3_mprintf("%z.%s", p->zTempFile, zSuffix);
 22398    }
 22399    shell_check_oom(p->zTempFile);
 22400  }
 22401  
 22402  
 22403  /*
 22404  ** The implementation of SQL scalar function fkey_collate_clause(), used
 22405  ** by the ".lint fkey-indexes" command. This scalar function is always
 22406  ** called with four arguments - the parent table name, the parent column name,
 22407  ** the child table name and the child column name.
 22408  **
 22409  **   fkey_collate_clause('parent-tab', 'parent-col', 'child-tab', 'child-col')
 22410  **
 22411  ** If either of the named tables or columns do not exist, this function
 22412  ** returns an empty string. An empty string is also returned if both tables
 22413  ** and columns exist but have the same default collation sequence. Or,
 22414  ** if both exist but the default collation sequences are different, this
 22415  ** function returns the string " COLLATE <parent-collation>", where
 22416  ** <parent-collation> is the default collation sequence of the parent column.
 22417  */
 22418  static void shellFkeyCollateClause(
 22419    sqlite3_context *pCtx,
 22420    int nVal,
 22421    sqlite3_value **apVal
 22422  ){
 22423    sqlite3 *db = sqlite3_context_db_handle(pCtx);
 22424    const char *zParent;
 22425    const char *zParentCol;
 22426    const char *zParentSeq;
 22427    const char *zChild;
 22428    const char *zChildCol;
 22429    const char *zChildSeq = 0;  /* Initialize to avoid false-positive warning */
 22430    int rc;
 22431  
 22432    assert( nVal==4 );
 22433    zParent = (const char*)sqlite3_value_text(apVal[0]);
 22434    zParentCol = (const char*)sqlite3_value_text(apVal[1]);
 22435    zChild = (const char*)sqlite3_value_text(apVal[2]);
 22436    zChildCol = (const char*)sqlite3_value_text(apVal[3]);
 22437  
 22438    sqlite3_result_text(pCtx, "", -1, SQLITE_STATIC);
 22439    rc = sqlite3_table_column_metadata(
 22440        db, "main", zParent, zParentCol, 0, &zParentSeq, 0, 0, 0
 22441    );
 22442    if( rc==SQLITE_OK ){
 22443      rc = sqlite3_table_column_metadata(
 22444          db, "main", zChild, zChildCol, 0, &zChildSeq, 0, 0, 0
 22445      );
 22446    }
 22447  
 22448    if( rc==SQLITE_OK && sqlite3_stricmp(zParentSeq, zChildSeq) ){
 22449      char *z = sqlite3_mprintf(" COLLATE %s", zParentSeq);
 22450      sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT);
 22451      sqlite3_free(z);
 22452    }
 22453  }
 22454  
 22455  
 22456  /*
 22457  ** The implementation of dot-command ".lint fkey-indexes".
 22458  */
 22459  static int lintFkeyIndexes(
 22460    ShellState *pState,             /* Current shell tool state */
 22461    char **azArg,                   /* Array of arguments passed to dot command */
 22462    int nArg                        /* Number of entries in azArg[] */
 22463  ){
 22464    sqlite3 *db = pState->db;       /* Database handle to query "main" db of */
 22465    FILE *out = pState->out;        /* Stream to write non-error output to */
 22466    int bVerbose = 0;               /* If -verbose is present */
 22467    int bGroupByParent = 0;         /* If -groupbyparent is present */
 22468    int i;                          /* To iterate through azArg[] */
 22469    const char *zIndent = "";       /* How much to indent CREATE INDEX by */
 22470    int rc;                         /* Return code */
 22471    sqlite3_stmt *pSql = 0;         /* Compiled version of SQL statement below */
 22472  
 22473    /*
 22474    ** This SELECT statement returns one row for each foreign key constraint
 22475    ** in the schema of the main database. The column values are:
 22476    **
 22477    ** 0. The text of an SQL statement similar to:
 22478    **
 22479    **      "EXPLAIN QUERY PLAN SELECT 1 FROM child_table WHERE child_key=?"
 22480    **
 22481    **    This SELECT is similar to the one that the foreign keys implementation
 22482    **    needs to run internally on child tables. If there is an index that can
 22483    **    be used to optimize this query, then it can also be used by the FK
 22484    **    implementation to optimize DELETE or UPDATE statements on the parent
 22485    **    table.
 22486    **
 22487    ** 1. A GLOB pattern suitable for sqlite3_strglob(). If the plan output by
 22488    **    the EXPLAIN QUERY PLAN command matches this pattern, then the schema
 22489    **    contains an index that can be used to optimize the query.
 22490    **
 22491    ** 2. Human readable text that describes the child table and columns. e.g.
 22492    **
 22493    **       "child_table(child_key1, child_key2)"
 22494    **
 22495    ** 3. Human readable text that describes the parent table and columns. e.g.
 22496    **
 22497    **       "parent_table(parent_key1, parent_key2)"
 22498    **
 22499    ** 4. A full CREATE INDEX statement for an index that could be used to
 22500    **    optimize DELETE or UPDATE statements on the parent table. e.g.
 22501    **
 22502    **       "CREATE INDEX child_table_child_key ON child_table(child_key)"
 22503    **
 22504    ** 5. The name of the parent table.
 22505    **
 22506    ** These six values are used by the C logic below to generate the report.
 22507    */
 22508    const char *zSql =
 22509    "SELECT "
 22510      "     'EXPLAIN QUERY PLAN SELECT 1 FROM ' || quote(s.name) || ' WHERE '"
 22511      "  || group_concat(quote(s.name) || '.' || quote(f.[from]) || '=?' "
 22512      "  || fkey_collate_clause("
 22513      "       f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]),' AND ')"
 22514      ", "
 22515      "     'SEARCH ' || s.name || ' USING COVERING INDEX*('"
 22516      "  || group_concat('*=?', ' AND ') || ')'"
 22517      ", "
 22518      "     s.name  || '(' || group_concat(f.[from],  ', ') || ')'"
 22519      ", "
 22520      "     f.[table] || '(' || group_concat(COALESCE(f.[to], p.[name])) || ')'"
 22521      ", "
 22522      "     'CREATE INDEX ' || quote(s.name ||'_'|| group_concat(f.[from], '_'))"
 22523      "  || ' ON ' || quote(s.name) || '('"
 22524      "  || group_concat(quote(f.[from]) ||"
 22525      "        fkey_collate_clause("
 22526      "          f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]), ', ')"
 22527      "  || ');'"
 22528      ", "
 22529      "     f.[table] "
 22530      "FROM sqlite_schema AS s, pragma_foreign_key_list(s.name) AS f "
 22531      "LEFT JOIN pragma_table_info AS p ON (pk-1=seq AND p.arg=f.[table]) "
 22532      "GROUP BY s.name, f.id "
 22533      "ORDER BY (CASE WHEN ? THEN f.[table] ELSE s.name END)"
 22534    ;
 22535    const char *zGlobIPK = "SEARCH * USING INTEGER PRIMARY KEY (rowid=?)";
 22536  
 22537    for(i=2; i<nArg; i++){
 22538      int n = strlen30(azArg[i]);
 22539      if( n>1 && sqlite3_strnicmp("-verbose", azArg[i], n)==0 ){
 22540        bVerbose = 1;
 22541      }
 22542      else if( n>1 && sqlite3_strnicmp("-groupbyparent", azArg[i], n)==0 ){
 22543        bGroupByParent = 1;
 22544        zIndent = "    ";
 22545      }
 22546      else{
 22547        raw_printf(stderr, "Usage: %s %s ?-verbose? ?-groupbyparent?\n",
 22548            azArg[0], azArg[1]
 22549        );
 22550        return SQLITE_ERROR;
 22551      }
 22552    }
 22553  
 22554    /* Register the fkey_collate_clause() SQL function */
 22555    rc = sqlite3_create_function(db, "fkey_collate_clause", 4, SQLITE_UTF8,
 22556        0, shellFkeyCollateClause, 0, 0
 22557    );
 22558  
 22559  
 22560    if( rc==SQLITE_OK ){
 22561      rc = sqlite3_prepare_v2(db, zSql, -1, &pSql, 0);
 22562    }
 22563    if( rc==SQLITE_OK ){
 22564      sqlite3_bind_int(pSql, 1, bGroupByParent);
 22565    }
 22566  
 22567    if( rc==SQLITE_OK ){
 22568      int rc2;
 22569      char *zPrev = 0;
 22570      while( SQLITE_ROW==sqlite3_step(pSql) ){
 22571        int res = -1;
 22572        sqlite3_stmt *pExplain = 0;
 22573        const char *zEQP = (const char*)sqlite3_column_text(pSql, 0);
 22574        const char *zGlob = (const char*)sqlite3_column_text(pSql, 1);
 22575        const char *zFrom = (const char*)sqlite3_column_text(pSql, 2);
 22576        const char *zTarget = (const char*)sqlite3_column_text(pSql, 3);
 22577        const char *zCI = (const char*)sqlite3_column_text(pSql, 4);
 22578        const char *zParent = (const char*)sqlite3_column_text(pSql, 5);
 22579  
 22580        if( zEQP==0 ) continue;
 22581        if( zGlob==0 ) continue;
 22582        rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
 22583        if( rc!=SQLITE_OK ) break;
 22584        if( SQLITE_ROW==sqlite3_step(pExplain) ){
 22585          const char *zPlan = (const char*)sqlite3_column_text(pExplain, 3);
 22586          res = zPlan!=0 && (  0==sqlite3_strglob(zGlob, zPlan)
 22587                            || 0==sqlite3_strglob(zGlobIPK, zPlan));
 22588        }
 22589        rc = sqlite3_finalize(pExplain);
 22590        if( rc!=SQLITE_OK ) break;
 22591  
 22592        if( res<0 ){
 22593          raw_printf(stderr, "Error: internal error");
 22594          break;
 22595        }else{
 22596          if( bGroupByParent
 22597          && (bVerbose || res==0)
 22598          && (zPrev==0 || sqlite3_stricmp(zParent, zPrev))
 22599          ){
 22600            raw_printf(out, "-- Parent table %s\n", zParent);
 22601            sqlite3_free(zPrev);
 22602            zPrev = sqlite3_mprintf("%s", zParent);
 22603          }
 22604  
 22605          if( res==0 ){
 22606            raw_printf(out, "%s%s --> %s\n", zIndent, zCI, zTarget);
 22607          }else if( bVerbose ){
 22608            raw_printf(out, "%s/* no extra indexes required for %s -> %s */\n",
 22609                zIndent, zFrom, zTarget
 22610            );
 22611          }
 22612        }
 22613      }
 22614      sqlite3_free(zPrev);
 22615  
 22616      if( rc!=SQLITE_OK ){
 22617        raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
 22618      }
 22619  
 22620      rc2 = sqlite3_finalize(pSql);
 22621      if( rc==SQLITE_OK && rc2!=SQLITE_OK ){
 22622        rc = rc2;
 22623        raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
 22624      }
 22625    }else{
 22626      raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
 22627    }
 22628  
 22629    return rc;
 22630  }
 22631  
 22632  /*
 22633  ** Implementation of ".lint" dot command.
 22634  */
 22635  static int lintDotCommand(
 22636    ShellState *pState,             /* Current shell tool state */
 22637    char **azArg,                   /* Array of arguments passed to dot command */
 22638    int nArg                        /* Number of entries in azArg[] */
 22639  ){
 22640    int n;
 22641    n = (nArg>=2 ? strlen30(azArg[1]) : 0);
 22642    if( n<1 || sqlite3_strnicmp(azArg[1], "fkey-indexes", n) ) goto usage;
 22643    return lintFkeyIndexes(pState, azArg, nArg);
 22644  
 22645   usage:
 22646    raw_printf(stderr, "Usage %s sub-command ?switches...?\n", azArg[0]);
 22647    raw_printf(stderr, "Where sub-commands are:\n");
 22648    raw_printf(stderr, "    fkey-indexes\n");
 22649    return SQLITE_ERROR;
 22650  }
 22651  
 22652  #if !defined SQLITE_OMIT_VIRTUALTABLE
 22653  static void shellPrepare(
 22654    sqlite3 *db,
 22655    int *pRc,
 22656    const char *zSql,
 22657    sqlite3_stmt **ppStmt
 22658  ){
 22659    *ppStmt = 0;
 22660    if( *pRc==SQLITE_OK ){
 22661      int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0);
 22662      if( rc!=SQLITE_OK ){
 22663        raw_printf(stderr, "sql error: %s (%d)\n",
 22664            sqlite3_errmsg(db), sqlite3_errcode(db)
 22665        );
 22666        *pRc = rc;
 22667      }
 22668    }
 22669  }
 22670  
 22671  /*
 22672  ** Create a prepared statement using printf-style arguments for the SQL.
 22673  **
 22674  ** This routine is could be marked "static".  But it is not always used,
 22675  ** depending on compile-time options.  By omitting the "static", we avoid
 22676  ** nuisance compiler warnings about "defined but not used".
 22677  */
 22678  void shellPreparePrintf(
 22679    sqlite3 *db,
 22680    int *pRc,
 22681    sqlite3_stmt **ppStmt,
 22682    const char *zFmt,
 22683    ...
 22684  ){
 22685    *ppStmt = 0;
 22686    if( *pRc==SQLITE_OK ){
 22687      va_list ap;
 22688      char *z;
 22689      va_start(ap, zFmt);
 22690      z = sqlite3_vmprintf(zFmt, ap);
 22691      va_end(ap);
 22692      if( z==0 ){
 22693        *pRc = SQLITE_NOMEM;
 22694      }else{
 22695        shellPrepare(db, pRc, z, ppStmt);
 22696        sqlite3_free(z);
 22697      }
 22698    }
 22699  }
 22700  
 22701  /* Finalize the prepared statement created using shellPreparePrintf().
 22702  **
 22703  ** This routine is could be marked "static".  But it is not always used,
 22704  ** depending on compile-time options.  By omitting the "static", we avoid
 22705  ** nuisance compiler warnings about "defined but not used".
 22706  */
 22707  void shellFinalize(
 22708    int *pRc,
 22709    sqlite3_stmt *pStmt
 22710  ){
 22711    if( pStmt ){
 22712      sqlite3 *db = sqlite3_db_handle(pStmt);
 22713      int rc = sqlite3_finalize(pStmt);
 22714      if( *pRc==SQLITE_OK ){
 22715        if( rc!=SQLITE_OK ){
 22716          raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
 22717        }
 22718        *pRc = rc;
 22719      }
 22720    }
 22721  }
 22722  
 22723  /* Reset the prepared statement created using shellPreparePrintf().
 22724  **
 22725  ** This routine is could be marked "static".  But it is not always used,
 22726  ** depending on compile-time options.  By omitting the "static", we avoid
 22727  ** nuisance compiler warnings about "defined but not used".
 22728  */
 22729  void shellReset(
 22730    int *pRc,
 22731    sqlite3_stmt *pStmt
 22732  ){
 22733    int rc = sqlite3_reset(pStmt);
 22734    if( *pRc==SQLITE_OK ){
 22735      if( rc!=SQLITE_OK ){
 22736        sqlite3 *db = sqlite3_db_handle(pStmt);
 22737        raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
 22738      }
 22739      *pRc = rc;
 22740    }
 22741  }
 22742  #endif /* !defined SQLITE_OMIT_VIRTUALTABLE */
 22743  
 22744  #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
 22745  /******************************************************************************
 22746  ** The ".archive" or ".ar" command.
 22747  */
 22748  /*
 22749  ** Structure representing a single ".ar" command.
 22750  */
 22751  typedef struct ArCommand ArCommand;
 22752  struct ArCommand {
 22753    u8 eCmd;                        /* An AR_CMD_* value */
 22754    u8 bVerbose;                    /* True if --verbose */
 22755    u8 bZip;                        /* True if the archive is a ZIP */
 22756    u8 bDryRun;                     /* True if --dry-run */
 22757    u8 bAppend;                     /* True if --append */
 22758    u8 bGlob;                       /* True if --glob */
 22759    u8 fromCmdLine;                 /* Run from -A instead of .archive */
 22760    int nArg;                       /* Number of command arguments */
 22761    char *zSrcTable;                /* "sqlar", "zipfile($file)" or "zip" */
 22762    const char *zFile;              /* --file argument, or NULL */
 22763    const char *zDir;               /* --directory argument, or NULL */
 22764    char **azArg;                   /* Array of command arguments */
 22765    ShellState *p;                  /* Shell state */
 22766    sqlite3 *db;                    /* Database containing the archive */
 22767  };
 22768  
 22769  /*
 22770  ** Print a usage message for the .ar command to stderr and return SQLITE_ERROR.
 22771  */
 22772  static int arUsage(FILE *f){
 22773    showHelp(f,"archive");
 22774    return SQLITE_ERROR;
 22775  }
 22776  
 22777  /*
 22778  ** Print an error message for the .ar command to stderr and return
 22779  ** SQLITE_ERROR.
 22780  */
 22781  static int arErrorMsg(ArCommand *pAr, const char *zFmt, ...){
 22782    va_list ap;
 22783    char *z;
 22784    va_start(ap, zFmt);
 22785    z = sqlite3_vmprintf(zFmt, ap);
 22786    va_end(ap);
 22787    utf8_printf(stderr, "Error: %s\n", z);
 22788    if( pAr->fromCmdLine ){
 22789      utf8_printf(stderr, "Use \"-A\" for more help\n");
 22790    }else{
 22791      utf8_printf(stderr, "Use \".archive --help\" for more help\n");
 22792    }
 22793    sqlite3_free(z);
 22794    return SQLITE_ERROR;
 22795  }
 22796  
 22797  /*
 22798  ** Values for ArCommand.eCmd.
 22799  */
 22800  #define AR_CMD_CREATE       1
 22801  #define AR_CMD_UPDATE       2
 22802  #define AR_CMD_INSERT       3
 22803  #define AR_CMD_EXTRACT      4
 22804  #define AR_CMD_LIST         5
 22805  #define AR_CMD_HELP         6
 22806  #define AR_CMD_REMOVE       7
 22807  
 22808  /*
 22809  ** Other (non-command) switches.
 22810  */
 22811  #define AR_SWITCH_VERBOSE     8
 22812  #define AR_SWITCH_FILE        9
 22813  #define AR_SWITCH_DIRECTORY  10
 22814  #define AR_SWITCH_APPEND     11
 22815  #define AR_SWITCH_DRYRUN     12
 22816  #define AR_SWITCH_GLOB       13
 22817  
 22818  static int arProcessSwitch(ArCommand *pAr, int eSwitch, const char *zArg){
 22819    switch( eSwitch ){
 22820      case AR_CMD_CREATE:
 22821      case AR_CMD_EXTRACT:
 22822      case AR_CMD_LIST:
 22823      case AR_CMD_REMOVE:
 22824      case AR_CMD_UPDATE:
 22825      case AR_CMD_INSERT:
 22826      case AR_CMD_HELP:
 22827        if( pAr->eCmd ){
 22828          return arErrorMsg(pAr, "multiple command options");
 22829        }
 22830        pAr->eCmd = eSwitch;
 22831        break;
 22832  
 22833      case AR_SWITCH_DRYRUN:
 22834        pAr->bDryRun = 1;
 22835        break;
 22836      case AR_SWITCH_GLOB:
 22837        pAr->bGlob = 1;
 22838        break;
 22839      case AR_SWITCH_VERBOSE:
 22840        pAr->bVerbose = 1;
 22841        break;
 22842      case AR_SWITCH_APPEND:
 22843        pAr->bAppend = 1;
 22844        deliberate_fall_through;
 22845      case AR_SWITCH_FILE:
 22846        pAr->zFile = zArg;
 22847        break;
 22848      case AR_SWITCH_DIRECTORY:
 22849        pAr->zDir = zArg;
 22850        break;
 22851    }
 22852  
 22853    return SQLITE_OK;
 22854  }
 22855  
 22856  /*
 22857  ** Parse the command line for an ".ar" command. The results are written into
 22858  ** structure (*pAr). SQLITE_OK is returned if the command line is parsed
 22859  ** successfully, otherwise an error message is written to stderr and
 22860  ** SQLITE_ERROR returned.
 22861  */
 22862  static int arParseCommand(
 22863    char **azArg,                   /* Array of arguments passed to dot command */
 22864    int nArg,                       /* Number of entries in azArg[] */
 22865    ArCommand *pAr                  /* Populate this object */
 22866  ){
 22867    struct ArSwitch {
 22868      const char *zLong;
 22869      char cShort;
 22870      u8 eSwitch;
 22871      u8 bArg;
 22872    } aSwitch[] = {
 22873      { "create",    'c', AR_CMD_CREATE,       0 },
 22874      { "extract",   'x', AR_CMD_EXTRACT,      0 },
 22875      { "insert",    'i', AR_CMD_INSERT,       0 },
 22876      { "list",      't', AR_CMD_LIST,         0 },
 22877      { "remove",    'r', AR_CMD_REMOVE,       0 },
 22878      { "update",    'u', AR_CMD_UPDATE,       0 },
 22879      { "help",      'h', AR_CMD_HELP,         0 },
 22880      { "verbose",   'v', AR_SWITCH_VERBOSE,   0 },
 22881      { "file",      'f', AR_SWITCH_FILE,      1 },
 22882      { "append",    'a', AR_SWITCH_APPEND,    1 },
 22883      { "directory", 'C', AR_SWITCH_DIRECTORY, 1 },
 22884      { "dryrun",    'n', AR_SWITCH_DRYRUN,    0 },
 22885      { "glob",      'g', AR_SWITCH_GLOB,      0 },
 22886    };
 22887    int nSwitch = sizeof(aSwitch) / sizeof(struct ArSwitch);
 22888    struct ArSwitch *pEnd = &aSwitch[nSwitch];
 22889  
 22890    if( nArg<=1 ){
 22891      utf8_printf(stderr, "Wrong number of arguments.  Usage:\n");
 22892      return arUsage(stderr);
 22893    }else{
 22894      char *z = azArg[1];
 22895      if( z[0]!='-' ){
 22896        /* Traditional style [tar] invocation */
 22897        int i;
 22898        int iArg = 2;
 22899        for(i=0; z[i]; i++){
 22900          const char *zArg = 0;
 22901          struct ArSwitch *pOpt;
 22902          for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
 22903            if( z[i]==pOpt->cShort ) break;
 22904          }
 22905          if( pOpt==pEnd ){
 22906            return arErrorMsg(pAr, "unrecognized option: %c", z[i]);
 22907          }
 22908          if( pOpt->bArg ){
 22909            if( iArg>=nArg ){
 22910              return arErrorMsg(pAr, "option requires an argument: %c",z[i]);
 22911            }
 22912            zArg = azArg[iArg++];
 22913          }
 22914          if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR;
 22915        }
 22916        pAr->nArg = nArg-iArg;
 22917        if( pAr->nArg>0 ){
 22918          pAr->azArg = &azArg[iArg];
 22919        }
 22920      }else{
 22921        /* Non-traditional invocation */
 22922        int iArg;
 22923        for(iArg=1; iArg<nArg; iArg++){
 22924          int n;
 22925          z = azArg[iArg];
 22926          if( z[0]!='-' ){
 22927            /* All remaining command line words are command arguments. */
 22928            pAr->azArg = &azArg[iArg];
 22929            pAr->nArg = nArg-iArg;
 22930            break;
 22931          }
 22932          n = strlen30(z);
 22933  
 22934          if( z[1]!='-' ){
 22935            int i;
 22936            /* One or more short options */
 22937            for(i=1; i<n; i++){
 22938              const char *zArg = 0;
 22939              struct ArSwitch *pOpt;
 22940              for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
 22941                if( z[i]==pOpt->cShort ) break;
 22942              }
 22943              if( pOpt==pEnd ){
 22944                return arErrorMsg(pAr, "unrecognized option: %c", z[i]);
 22945              }
 22946              if( pOpt->bArg ){
 22947                if( i<(n-1) ){
 22948                  zArg = &z[i+1];
 22949                  i = n;
 22950                }else{
 22951                  if( iArg>=(nArg-1) ){
 22952                    return arErrorMsg(pAr, "option requires an argument: %c",
 22953                                      z[i]);
 22954                  }
 22955                  zArg = azArg[++iArg];
 22956                }
 22957              }
 22958              if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR;
 22959            }
 22960          }else if( z[2]=='\0' ){
 22961            /* A -- option, indicating that all remaining command line words
 22962            ** are command arguments.  */
 22963            pAr->azArg = &azArg[iArg+1];
 22964            pAr->nArg = nArg-iArg-1;
 22965            break;
 22966          }else{
 22967            /* A long option */
 22968            const char *zArg = 0;             /* Argument for option, if any */
 22969            struct ArSwitch *pMatch = 0;      /* Matching option */
 22970            struct ArSwitch *pOpt;            /* Iterator */
 22971            for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
 22972              const char *zLong = pOpt->zLong;
 22973              if( (n-2)<=strlen30(zLong) && 0==memcmp(&z[2], zLong, n-2) ){
 22974                if( pMatch ){
 22975                  return arErrorMsg(pAr, "ambiguous option: %s",z);
 22976                }else{
 22977                  pMatch = pOpt;
 22978                }
 22979              }
 22980            }
 22981  
 22982            if( pMatch==0 ){
 22983              return arErrorMsg(pAr, "unrecognized option: %s", z);
 22984            }
 22985            if( pMatch->bArg ){
 22986              if( iArg>=(nArg-1) ){
 22987                return arErrorMsg(pAr, "option requires an argument: %s", z);
 22988              }
 22989              zArg = azArg[++iArg];
 22990            }
 22991            if( arProcessSwitch(pAr, pMatch->eSwitch, zArg) ) return SQLITE_ERROR;
 22992          }
 22993        }
 22994      }
 22995    }
 22996    if( pAr->eCmd==0 ){
 22997      utf8_printf(stderr, "Required argument missing.  Usage:\n");
 22998      return arUsage(stderr);
 22999    }
 23000    return SQLITE_OK;
 23001  }
 23002  
 23003  /*
 23004  ** This function assumes that all arguments within the ArCommand.azArg[]
 23005  ** array refer to archive members, as for the --extract, --list or --remove
 23006  ** commands. It checks that each of them are "present". If any specified
 23007  ** file is not present in the archive, an error is printed to stderr and an
 23008  ** error code returned. Otherwise, if all specified arguments are present
 23009  ** in the archive, SQLITE_OK is returned. Here, "present" means either an
 23010  ** exact equality when pAr->bGlob is false or a "name GLOB pattern" match
 23011  ** when pAr->bGlob is true.
 23012  **
 23013  ** This function strips any trailing '/' characters from each argument.
 23014  ** This is consistent with the way the [tar] command seems to work on
 23015  ** Linux.
 23016  */
 23017  static int arCheckEntries(ArCommand *pAr){
 23018    int rc = SQLITE_OK;
 23019    if( pAr->nArg ){
 23020      int i, j;
 23021      sqlite3_stmt *pTest = 0;
 23022      const char *zSel = (pAr->bGlob)
 23023        ? "SELECT name FROM %s WHERE glob($name,name)"
 23024        : "SELECT name FROM %s WHERE name=$name";
 23025  
 23026      shellPreparePrintf(pAr->db, &rc, &pTest, zSel, pAr->zSrcTable);
 23027      j = sqlite3_bind_parameter_index(pTest, "$name");
 23028      for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){
 23029        char *z = pAr->azArg[i];
 23030        int n = strlen30(z);
 23031        int bOk = 0;
 23032        while( n>0 && z[n-1]=='/' ) n--;
 23033        z[n] = '\0';
 23034        sqlite3_bind_text(pTest, j, z, -1, SQLITE_STATIC);
 23035        if( SQLITE_ROW==sqlite3_step(pTest) ){
 23036          bOk = 1;
 23037        }
 23038        shellReset(&rc, pTest);
 23039        if( rc==SQLITE_OK && bOk==0 ){
 23040          utf8_printf(stderr, "not found in archive: %s\n", z);
 23041          rc = SQLITE_ERROR;
 23042        }
 23043      }
 23044      shellFinalize(&rc, pTest);
 23045    }
 23046    return rc;
 23047  }
 23048  
 23049  /*
 23050  ** Format a WHERE clause that can be used against the "sqlar" table to
 23051  ** identify all archive members that match the command arguments held
 23052  ** in (*pAr). Leave this WHERE clause in (*pzWhere) before returning.
 23053  ** The caller is responsible for eventually calling sqlite3_free() on
 23054  ** any non-NULL (*pzWhere) value. Here, "match" means strict equality
 23055  ** when pAr->bGlob is false and GLOB match when pAr->bGlob is true.
 23056  */
 23057  static void arWhereClause(
 23058    int *pRc,
 23059    ArCommand *pAr,
 23060    char **pzWhere                  /* OUT: New WHERE clause */
 23061  ){
 23062    char *zWhere = 0;
 23063    const char *zSameOp = (pAr->bGlob)? "GLOB" : "=";
 23064    if( *pRc==SQLITE_OK ){
 23065      if( pAr->nArg==0 ){
 23066        zWhere = sqlite3_mprintf("1");
 23067      }else{
 23068        int i;
 23069        const char *zSep = "";
 23070        for(i=0; i<pAr->nArg; i++){
 23071          const char *z = pAr->azArg[i];
 23072          zWhere = sqlite3_mprintf(
 23073            "%z%s name %s '%q' OR substr(name,1,%d) %s '%q/'",
 23074            zWhere, zSep, zSameOp, z, strlen30(z)+1, zSameOp, z
 23075          );
 23076          if( zWhere==0 ){
 23077            *pRc = SQLITE_NOMEM;
 23078            break;
 23079          }
 23080          zSep = " OR ";
 23081        }
 23082      }
 23083    }
 23084    *pzWhere = zWhere;
 23085  }
 23086  
 23087  /*
 23088  ** Implementation of .ar "lisT" command.
 23089  */
 23090  static int arListCommand(ArCommand *pAr){
 23091    const char *zSql = "SELECT %s FROM %s WHERE %s";
 23092    const char *azCols[] = {
 23093      "name",
 23094      "lsmode(mode), sz, datetime(mtime, 'unixepoch'), name"
 23095    };
 23096  
 23097    char *zWhere = 0;
 23098    sqlite3_stmt *pSql = 0;
 23099    int rc;
 23100  
 23101    rc = arCheckEntries(pAr);
 23102    arWhereClause(&rc, pAr, &zWhere);
 23103  
 23104    shellPreparePrintf(pAr->db, &rc, &pSql, zSql, azCols[pAr->bVerbose],
 23105                       pAr->zSrcTable, zWhere);
 23106    if( pAr->bDryRun ){
 23107      utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql));
 23108    }else{
 23109      while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
 23110        if( pAr->bVerbose ){
 23111          utf8_printf(pAr->p->out, "%s % 10d  %s  %s\n",
 23112              sqlite3_column_text(pSql, 0),
 23113              sqlite3_column_int(pSql, 1),
 23114              sqlite3_column_text(pSql, 2),
 23115              sqlite3_column_text(pSql, 3)
 23116          );
 23117        }else{
 23118          utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0));
 23119        }
 23120      }
 23121    }
 23122    shellFinalize(&rc, pSql);
 23123    sqlite3_free(zWhere);
 23124    return rc;
 23125  }
 23126  
 23127  
 23128  /*
 23129  ** Implementation of .ar "Remove" command.
 23130  */
 23131  static int arRemoveCommand(ArCommand *pAr){
 23132    int rc = 0;
 23133    char *zSql = 0;
 23134    char *zWhere = 0;
 23135  
 23136    if( pAr->nArg ){
 23137      /* Verify that args actually exist within the archive before proceeding.
 23138      ** And formulate a WHERE clause to match them.  */
 23139      rc = arCheckEntries(pAr);
 23140      arWhereClause(&rc, pAr, &zWhere);
 23141    }
 23142    if( rc==SQLITE_OK ){
 23143      zSql = sqlite3_mprintf("DELETE FROM %s WHERE %s;",
 23144                             pAr->zSrcTable, zWhere);
 23145      if( pAr->bDryRun ){
 23146        utf8_printf(pAr->p->out, "%s\n", zSql);
 23147      }else{
 23148        char *zErr = 0;
 23149        rc = sqlite3_exec(pAr->db, "SAVEPOINT ar;", 0, 0, 0);
 23150        if( rc==SQLITE_OK ){
 23151          rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr);
 23152          if( rc!=SQLITE_OK ){
 23153            sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0);
 23154          }else{
 23155            rc = sqlite3_exec(pAr->db, "RELEASE ar;", 0, 0, 0);
 23156          }
 23157        }
 23158        if( zErr ){
 23159          utf8_printf(stdout, "ERROR: %s\n", zErr);
 23160          sqlite3_free(zErr);
 23161        }
 23162      }
 23163    }
 23164    sqlite3_free(zWhere);
 23165    sqlite3_free(zSql);
 23166    return rc;
 23167  }
 23168  
 23169  /*
 23170  ** Implementation of .ar "eXtract" command.
 23171  */
 23172  static int arExtractCommand(ArCommand *pAr){
 23173    const char *zSql1 =
 23174      "SELECT "
 23175      " ($dir || name),"
 23176      " writefile(($dir || name), %s, mode, mtime) "
 23177      "FROM %s WHERE (%s) AND (data IS NULL OR $dirOnly = 0)"
 23178      " AND name NOT GLOB '*..[/\\]*'";
 23179  
 23180    const char *azExtraArg[] = {
 23181      "sqlar_uncompress(data, sz)",
 23182      "data"
 23183    };
 23184  
 23185    sqlite3_stmt *pSql = 0;
 23186    int rc = SQLITE_OK;
 23187    char *zDir = 0;
 23188    char *zWhere = 0;
 23189    int i, j;
 23190  
 23191    /* If arguments are specified, check that they actually exist within
 23192    ** the archive before proceeding. And formulate a WHERE clause to
 23193    ** match them.  */
 23194    rc = arCheckEntries(pAr);
 23195    arWhereClause(&rc, pAr, &zWhere);
 23196  
 23197    if( rc==SQLITE_OK ){
 23198      if( pAr->zDir ){
 23199        zDir = sqlite3_mprintf("%s/", pAr->zDir);
 23200      }else{
 23201        zDir = sqlite3_mprintf("");
 23202      }
 23203      if( zDir==0 ) rc = SQLITE_NOMEM;
 23204    }
 23205  
 23206    shellPreparePrintf(pAr->db, &rc, &pSql, zSql1,
 23207        azExtraArg[pAr->bZip], pAr->zSrcTable, zWhere
 23208    );
 23209  
 23210    if( rc==SQLITE_OK ){
 23211      j = sqlite3_bind_parameter_index(pSql, "$dir");
 23212      sqlite3_bind_text(pSql, j, zDir, -1, SQLITE_STATIC);
 23213  
 23214      /* Run the SELECT statement twice. The first time, writefile() is called
 23215      ** for all archive members that should be extracted. The second time,
 23216      ** only for the directories. This is because the timestamps for
 23217      ** extracted directories must be reset after they are populated (as
 23218      ** populating them changes the timestamp).  */
 23219      for(i=0; i<2; i++){
 23220        j = sqlite3_bind_parameter_index(pSql, "$dirOnly");
 23221        sqlite3_bind_int(pSql, j, i);
 23222        if( pAr->bDryRun ){
 23223          utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql));
 23224        }else{
 23225          while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
 23226            if( i==0 && pAr->bVerbose ){
 23227              utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0));
 23228            }
 23229          }
 23230        }
 23231        shellReset(&rc, pSql);
 23232      }
 23233      shellFinalize(&rc, pSql);
 23234    }
 23235  
 23236    sqlite3_free(zDir);
 23237    sqlite3_free(zWhere);
 23238    return rc;
 23239  }
 23240  
 23241  /*
 23242  ** Run the SQL statement in zSql.  Or if doing a --dryrun, merely print it out.
 23243  */
 23244  static int arExecSql(ArCommand *pAr, const char *zSql){
 23245    int rc;
 23246    if( pAr->bDryRun ){
 23247      utf8_printf(pAr->p->out, "%s\n", zSql);
 23248      rc = SQLITE_OK;
 23249    }else{
 23250      char *zErr = 0;
 23251      rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr);
 23252      if( zErr ){
 23253        utf8_printf(stdout, "ERROR: %s\n", zErr);
 23254        sqlite3_free(zErr);
 23255      }
 23256    }
 23257    return rc;
 23258  }
 23259  
 23260  
 23261  /*
 23262  ** Implementation of .ar "create", "insert", and "update" commands.
 23263  **
 23264  **     create    ->     Create a new SQL archive
 23265  **     insert    ->     Insert or reinsert all files listed
 23266  **     update    ->     Insert files that have changed or that were not
 23267  **                      previously in the archive
 23268  **
 23269  ** Create the "sqlar" table in the database if it does not already exist.
 23270  ** Then add each file in the azFile[] array to the archive. Directories
 23271  ** are added recursively. If argument bVerbose is non-zero, a message is
 23272  ** printed on stdout for each file archived.
 23273  **
 23274  ** The create command is the same as update, except that it drops
 23275  ** any existing "sqlar" table before beginning.  The "insert" command
 23276  ** always overwrites every file named on the command-line, where as
 23277  ** "update" only overwrites if the size or mtime or mode has changed.
 23278  */
 23279  static int arCreateOrUpdateCommand(
 23280    ArCommand *pAr,                 /* Command arguments and options */
 23281    int bUpdate,                    /* true for a --create. */
 23282    int bOnlyIfChanged              /* Only update if file has changed */
 23283  ){
 23284    const char *zCreate =
 23285        "CREATE TABLE IF NOT EXISTS sqlar(\n"
 23286        "  name TEXT PRIMARY KEY,  -- name of the file\n"
 23287        "  mode INT,               -- access permissions\n"
 23288        "  mtime INT,              -- last modification time\n"
 23289        "  sz INT,                 -- original file size\n"
 23290        "  data BLOB               -- compressed content\n"
 23291        ")";
 23292    const char *zDrop = "DROP TABLE IF EXISTS sqlar";
 23293    const char *zInsertFmt[2] = {
 23294       "REPLACE INTO %s(name,mode,mtime,sz,data)\n"
 23295       "  SELECT\n"
 23296       "    %s,\n"
 23297       "    mode,\n"
 23298       "    mtime,\n"
 23299       "    CASE substr(lsmode(mode),1,1)\n"
 23300       "      WHEN '-' THEN length(data)\n"
 23301       "      WHEN 'd' THEN 0\n"
 23302       "      ELSE -1 END,\n"
 23303       "    sqlar_compress(data)\n"
 23304       "  FROM fsdir(%Q,%Q) AS disk\n"
 23305       "  WHERE lsmode(mode) NOT LIKE '?%%'%s;"
 23306       ,
 23307       "REPLACE INTO %s(name,mode,mtime,data)\n"
 23308       "  SELECT\n"
 23309       "    %s,\n"
 23310       "    mode,\n"
 23311       "    mtime,\n"
 23312       "    data\n"
 23313       "  FROM fsdir(%Q,%Q) AS disk\n"
 23314       "  WHERE lsmode(mode) NOT LIKE '?%%'%s;"
 23315    };
 23316    int i;                          /* For iterating through azFile[] */
 23317    int rc;                         /* Return code */
 23318    const char *zTab = 0;           /* SQL table into which to insert */
 23319    char *zSql;
 23320    char zTemp[50];
 23321    char *zExists = 0;
 23322  
 23323    arExecSql(pAr, "PRAGMA page_size=512");
 23324    rc = arExecSql(pAr, "SAVEPOINT ar;");
 23325    if( rc!=SQLITE_OK ) return rc;
 23326    zTemp[0] = 0;
 23327    if( pAr->bZip ){
 23328      /* Initialize the zipfile virtual table, if necessary */
 23329      if( pAr->zFile ){
 23330        sqlite3_uint64 r;
 23331        sqlite3_randomness(sizeof(r),&r);
 23332        sqlite3_snprintf(sizeof(zTemp),zTemp,"zip%016llx",r);
 23333        zTab = zTemp;
 23334        zSql = sqlite3_mprintf(
 23335           "CREATE VIRTUAL TABLE temp.%s USING zipfile(%Q)",
 23336           zTab, pAr->zFile
 23337        );
 23338        rc = arExecSql(pAr, zSql);
 23339        sqlite3_free(zSql);
 23340      }else{
 23341        zTab = "zip";
 23342      }
 23343    }else{
 23344      /* Initialize the table for an SQLAR */
 23345      zTab = "sqlar";
 23346      if( bUpdate==0 ){
 23347        rc = arExecSql(pAr, zDrop);
 23348        if( rc!=SQLITE_OK ) goto end_ar_transaction;
 23349      }
 23350      rc = arExecSql(pAr, zCreate);
 23351    }
 23352    if( bOnlyIfChanged ){
 23353      zExists = sqlite3_mprintf(
 23354        " AND NOT EXISTS("
 23355            "SELECT 1 FROM %s AS mem"
 23356            " WHERE mem.name=disk.name"
 23357            " AND mem.mtime=disk.mtime"
 23358            " AND mem.mode=disk.mode)", zTab);
 23359    }else{
 23360      zExists = sqlite3_mprintf("");
 23361    }
 23362    if( zExists==0 ) rc = SQLITE_NOMEM;
 23363    for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){
 23364      char *zSql2 = sqlite3_mprintf(zInsertFmt[pAr->bZip], zTab,
 23365          pAr->bVerbose ? "shell_putsnl(name)" : "name",
 23366          pAr->azArg[i], pAr->zDir, zExists);
 23367      rc = arExecSql(pAr, zSql2);
 23368      sqlite3_free(zSql2);
 23369    }
 23370  end_ar_transaction:
 23371    if( rc!=SQLITE_OK ){
 23372      sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0);
 23373    }else{
 23374      rc = arExecSql(pAr, "RELEASE ar;");
 23375      if( pAr->bZip && pAr->zFile ){
 23376        zSql = sqlite3_mprintf("DROP TABLE %s", zTemp);
 23377        arExecSql(pAr, zSql);
 23378        sqlite3_free(zSql);
 23379      }
 23380    }
 23381    sqlite3_free(zExists);
 23382    return rc;
 23383  }
 23384  
 23385  /*
 23386  ** Implementation of ".ar" dot command.
 23387  */
 23388  static int arDotCommand(
 23389    ShellState *pState,          /* Current shell tool state */
 23390    int fromCmdLine,             /* True if -A command-line option, not .ar cmd */
 23391    char **azArg,                /* Array of arguments passed to dot command */
 23392    int nArg                     /* Number of entries in azArg[] */
 23393  ){
 23394    ArCommand cmd;
 23395    int rc;
 23396    memset(&cmd, 0, sizeof(cmd));
 23397    cmd.fromCmdLine = fromCmdLine;
 23398    rc = arParseCommand(azArg, nArg, &cmd);
 23399    if( rc==SQLITE_OK ){
 23400      int eDbType = SHELL_OPEN_UNSPEC;
 23401      cmd.p = pState;
 23402      cmd.db = pState->db;
 23403      if( cmd.zFile ){
 23404        eDbType = deduceDatabaseType(cmd.zFile, 1);
 23405      }else{
 23406        eDbType = pState->openMode;
 23407      }
 23408      if( eDbType==SHELL_OPEN_ZIPFILE ){
 23409        if( cmd.eCmd==AR_CMD_EXTRACT || cmd.eCmd==AR_CMD_LIST ){
 23410          if( cmd.zFile==0 ){
 23411            cmd.zSrcTable = sqlite3_mprintf("zip");
 23412          }else{
 23413            cmd.zSrcTable = sqlite3_mprintf("zipfile(%Q)", cmd.zFile);
 23414          }
 23415        }
 23416        cmd.bZip = 1;
 23417      }else if( cmd.zFile ){
 23418        int flags;
 23419        if( cmd.bAppend ) eDbType = SHELL_OPEN_APPENDVFS;
 23420        if( cmd.eCmd==AR_CMD_CREATE || cmd.eCmd==AR_CMD_INSERT
 23421             || cmd.eCmd==AR_CMD_REMOVE || cmd.eCmd==AR_CMD_UPDATE ){
 23422          flags = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE;
 23423        }else{
 23424          flags = SQLITE_OPEN_READONLY;
 23425        }
 23426        cmd.db = 0;
 23427        if( cmd.bDryRun ){
 23428          utf8_printf(pState->out, "-- open database '%s'%s\n", cmd.zFile,
 23429               eDbType==SHELL_OPEN_APPENDVFS ? " using 'apndvfs'" : "");
 23430        }
 23431        rc = sqlite3_open_v2(cmd.zFile, &cmd.db, flags,
 23432               eDbType==SHELL_OPEN_APPENDVFS ? "apndvfs" : 0);
 23433        if( rc!=SQLITE_OK ){
 23434          utf8_printf(stderr, "cannot open file: %s (%s)\n",
 23435              cmd.zFile, sqlite3_errmsg(cmd.db)
 23436          );
 23437          goto end_ar_command;
 23438        }
 23439        sqlite3_fileio_init(cmd.db, 0, 0);
 23440        sqlite3_sqlar_init(cmd.db, 0, 0);
 23441        sqlite3_create_function(cmd.db, "shell_putsnl", 1, SQLITE_UTF8, cmd.p,
 23442                                shellPutsFunc, 0, 0);
 23443  
 23444      }
 23445      if( cmd.zSrcTable==0 && cmd.bZip==0 && cmd.eCmd!=AR_CMD_HELP ){
 23446        if( cmd.eCmd!=AR_CMD_CREATE
 23447         && sqlite3_table_column_metadata(cmd.db,0,"sqlar","name",0,0,0,0,0)
 23448        ){
 23449          utf8_printf(stderr, "database does not contain an 'sqlar' table\n");
 23450          rc = SQLITE_ERROR;
 23451          goto end_ar_command;
 23452        }
 23453        cmd.zSrcTable = sqlite3_mprintf("sqlar");
 23454      }
 23455  
 23456      switch( cmd.eCmd ){
 23457        case AR_CMD_CREATE:
 23458          rc = arCreateOrUpdateCommand(&cmd, 0, 0);
 23459          break;
 23460  
 23461        case AR_CMD_EXTRACT:
 23462          rc = arExtractCommand(&cmd);
 23463          break;
 23464  
 23465        case AR_CMD_LIST:
 23466          rc = arListCommand(&cmd);
 23467          break;
 23468  
 23469        case AR_CMD_HELP:
 23470          arUsage(pState->out);
 23471          break;
 23472  
 23473        case AR_CMD_INSERT:
 23474          rc = arCreateOrUpdateCommand(&cmd, 1, 0);
 23475          break;
 23476  
 23477        case AR_CMD_REMOVE:
 23478          rc = arRemoveCommand(&cmd);
 23479          break;
 23480  
 23481        default:
 23482          assert( cmd.eCmd==AR_CMD_UPDATE );
 23483          rc = arCreateOrUpdateCommand(&cmd, 1, 1);
 23484          break;
 23485      }
 23486    }
 23487  end_ar_command:
 23488    if( cmd.db!=pState->db ){
 23489      close_db(cmd.db);
 23490    }
 23491    sqlite3_free(cmd.zSrcTable);
 23492  
 23493    return rc;
 23494  }
 23495  /* End of the ".archive" or ".ar" command logic
 23496  *******************************************************************************/
 23497  #endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) */
 23498  
 23499  #if SQLITE_SHELL_HAVE_RECOVER
 23500  
 23501  /*
 23502  ** This function is used as a callback by the recover extension. Simply
 23503  ** print the supplied SQL statement to stdout.
 23504  */
 23505  static int recoverSqlCb(void *pCtx, const char *zSql){
 23506    ShellState *pState = (ShellState*)pCtx;
 23507    utf8_printf(pState->out, "%s;\n", zSql);
 23508    return SQLITE_OK;
 23509  }
 23510  
 23511  /*
 23512  ** This function is called to recover data from the database. A script
 23513  ** to construct a new database containing all recovered data is output
 23514  ** on stream pState->out.
 23515  */
 23516  static int recoverDatabaseCmd(ShellState *pState, int nArg, char **azArg){
 23517    int rc = SQLITE_OK;
 23518    const char *zRecoveryDb = "";   /* Name of "recovery" database.  Debug only */
 23519    const char *zLAF = "lost_and_found";
 23520    int bFreelist = 1;              /* 0 if --ignore-freelist is specified */
 23521    int bRowids = 1;                /* 0 if --no-rowids */
 23522    sqlite3_recover *p = 0;
 23523    int i = 0;
 23524  
 23525    for(i=1; i<nArg; i++){
 23526      char *z = azArg[i];
 23527      int n;
 23528      if( z[0]=='-' && z[1]=='-' ) z++;
 23529      n = strlen30(z);
 23530      if( n<=17 && memcmp("-ignore-freelist", z, n)==0 ){
 23531        bFreelist = 0;
 23532      }else
 23533      if( n<=12 && memcmp("-recovery-db", z, n)==0 && i<(nArg-1) ){
 23534        /* This option determines the name of the ATTACH-ed database used
 23535        ** internally by the recovery extension.  The default is "" which
 23536        ** means to use a temporary database that is automatically deleted
 23537        ** when closed.  This option is undocumented and might disappear at
 23538        ** any moment. */
 23539        i++;
 23540        zRecoveryDb = azArg[i];
 23541      }else
 23542      if( n<=15 && memcmp("-lost-and-found", z, n)==0 && i<(nArg-1) ){
 23543        i++;
 23544        zLAF = azArg[i];
 23545      }else
 23546      if( n<=10 && memcmp("-no-rowids", z, n)==0 ){
 23547        bRowids = 0;
 23548      }
 23549      else{
 23550        utf8_printf(stderr, "unexpected option: %s\n", azArg[i]);
 23551        showHelp(pState->out, azArg[0]);
 23552        return 1;
 23553      }
 23554    }
 23555  
 23556    p = sqlite3_recover_init_sql(
 23557        pState->db, "main", recoverSqlCb, (void*)pState
 23558    );
 23559  
 23560    sqlite3_recover_config(p, 789, (void*)zRecoveryDb);  /* Debug use only */
 23561    sqlite3_recover_config(p, SQLITE_RECOVER_LOST_AND_FOUND, (void*)zLAF);
 23562    sqlite3_recover_config(p, SQLITE_RECOVER_ROWIDS, (void*)&bRowids);
 23563    sqlite3_recover_config(p, SQLITE_RECOVER_FREELIST_CORRUPT,(void*)&bFreelist);
 23564  
 23565    sqlite3_recover_run(p);
 23566    if( sqlite3_recover_errcode(p)!=SQLITE_OK ){
 23567      const char *zErr = sqlite3_recover_errmsg(p);
 23568      int errCode = sqlite3_recover_errcode(p);
 23569      raw_printf(stderr, "sql error: %s (%d)\n", zErr, errCode);
 23570    }
 23571    rc = sqlite3_recover_finish(p);
 23572    return rc;
 23573  }
 23574  #endif /* SQLITE_SHELL_HAVE_RECOVER */
 23575  
 23576  
 23577  /*
 23578   * zAutoColumn(zCol, &db, ?) => Maybe init db, add column zCol to it.
 23579   * zAutoColumn(0, &db, ?) => (db!=0) Form columns spec for CREATE TABLE,
 23580   *   close db and set it to 0, and return the columns spec, to later
 23581   *   be sqlite3_free()'ed by the caller.
 23582   * The return is 0 when either:
 23583   *   (a) The db was not initialized and zCol==0 (There are no columns.)
 23584   *   (b) zCol!=0  (Column was added, db initialized as needed.)
 23585   * The 3rd argument, pRenamed, references an out parameter. If the
 23586   * pointer is non-zero, its referent will be set to a summary of renames
 23587   * done if renaming was necessary, or set to 0 if none was done. The out
 23588   * string (if any) must be sqlite3_free()'ed by the caller.
 23589   */
 23590  #ifdef SHELL_DEBUG
 23591  #define rc_err_oom_die(rc) \
 23592    if( rc==SQLITE_NOMEM ) shell_check_oom(0); \
 23593    else if(!(rc==SQLITE_OK||rc==SQLITE_DONE)) \
 23594      fprintf(stderr,"E:%d\n",rc), assert(0)
 23595  #else
 23596  static void rc_err_oom_die(int rc){
 23597    if( rc==SQLITE_NOMEM ) shell_check_oom(0);
 23598    assert(rc==SQLITE_OK||rc==SQLITE_DONE);
 23599  }
 23600  #endif
 23601  
 23602  #ifdef SHELL_COLFIX_DB /* If this is set, the DB can be in a file. */
 23603  static char zCOL_DB[] = SHELL_STRINGIFY(SHELL_COLFIX_DB);
 23604  #else  /* Otherwise, memory is faster/better for the transient DB. */
 23605  static const char *zCOL_DB = ":memory:";
 23606  #endif
 23607  
 23608  /* Define character (as C string) to separate generated column ordinal
 23609   * from protected part of incoming column names. This defaults to "_"
 23610   * so that incoming column identifiers that did not need not be quoted
 23611   * remain usable without being quoted. It must be one character.
 23612   */
 23613  #ifndef SHELL_AUTOCOLUMN_SEP
 23614  # define AUTOCOLUMN_SEP "_"
 23615  #else
 23616  # define AUTOCOLUMN_SEP SHELL_STRINGIFY(SHELL_AUTOCOLUMN_SEP)
 23617  #endif
 23618  
 23619  static char *zAutoColumn(const char *zColNew, sqlite3 **pDb, char **pzRenamed){
 23620    /* Queries and D{D,M}L used here */
 23621    static const char * const zTabMake = "\
 23622  CREATE TABLE ColNames(\
 23623   cpos INTEGER PRIMARY KEY,\
 23624   name TEXT, nlen INT, chop INT, reps INT, suff TEXT);\
 23625  CREATE VIEW RepeatedNames AS \
 23626  SELECT DISTINCT t.name FROM ColNames t \
 23627  WHERE t.name COLLATE NOCASE IN (\
 23628   SELECT o.name FROM ColNames o WHERE o.cpos<>t.cpos\
 23629  );\
 23630  ";
 23631    static const char * const zTabFill = "\
 23632  INSERT INTO ColNames(name,nlen,chop,reps,suff)\
 23633   VALUES(iif(length(?1)>0,?1,'?'),max(length(?1),1),0,0,'')\
 23634  ";
 23635    static const char * const zHasDupes = "\
 23636  SELECT count(DISTINCT (substring(name,1,nlen-chop)||suff) COLLATE NOCASE)\
 23637   <count(name) FROM ColNames\
 23638  ";
 23639  #ifdef SHELL_COLUMN_RENAME_CLEAN
 23640    static const char * const zDedoctor = "\
 23641  UPDATE ColNames SET chop=iif(\
 23642    (substring(name,nlen,1) BETWEEN '0' AND '9')\
 23643    AND (rtrim(name,'0123456790') glob '*"AUTOCOLUMN_SEP"'),\
 23644   nlen-length(rtrim(name, '"AUTOCOLUMN_SEP"0123456789')),\
 23645   0\
 23646  )\
 23647  ";
 23648  #endif
 23649    static const char * const zSetReps = "\
 23650  UPDATE ColNames AS t SET reps=\
 23651  (SELECT count(*) FROM ColNames d \
 23652   WHERE substring(t.name,1,t.nlen-t.chop)=substring(d.name,1,d.nlen-d.chop)\
 23653   COLLATE NOCASE\
 23654  )\
 23655  ";
 23656  #ifdef SQLITE_ENABLE_MATH_FUNCTIONS
 23657    static const char * const zColDigits = "\
 23658  SELECT CAST(ceil(log(count(*)+0.5)) AS INT) FROM ColNames \
 23659  ";
 23660  #else
 23661    /* Counting on SQLITE_MAX_COLUMN < 100,000 here. (32767 is the hard limit.) */
 23662    static const char * const zColDigits = "\
 23663  SELECT CASE WHEN (nc < 10) THEN 1 WHEN (nc < 100) THEN 2 \
 23664   WHEN (nc < 1000) THEN 3 WHEN (nc < 10000) THEN 4 \
 23665   ELSE 5 FROM (SELECT count(*) AS nc FROM ColNames) \
 23666  ";
 23667  #endif
 23668    static const char * const zRenameRank =
 23669  #ifdef SHELL_COLUMN_RENAME_CLEAN
 23670      "UPDATE ColNames AS t SET suff="
 23671      "iif(reps>1, printf('%c%0*d', '"AUTOCOLUMN_SEP"', $1, cpos), '')"
 23672  #else /* ...RENAME_MINIMAL_ONE_PASS */
 23673  "WITH Lzn(nlz) AS (" /* Find minimum extraneous leading 0's for uniqueness */
 23674  "  SELECT 0 AS nlz"
 23675  "  UNION"
 23676  "  SELECT nlz+1 AS nlz FROM Lzn"
 23677  "  WHERE EXISTS("
 23678  "   SELECT 1"
 23679  "   FROM ColNames t, ColNames o"
 23680  "   WHERE"
 23681  "    iif(t.name IN (SELECT * FROM RepeatedNames),"
 23682  "     printf('%s"AUTOCOLUMN_SEP"%s',"
 23683  "      t.name, substring(printf('%.*c%0.*d',nlz+1,'0',$1,t.cpos),2)),"
 23684  "     t.name"
 23685  "    )"
 23686  "    ="
 23687  "    iif(o.name IN (SELECT * FROM RepeatedNames),"
 23688  "     printf('%s"AUTOCOLUMN_SEP"%s',"
 23689  "      o.name, substring(printf('%.*c%0.*d',nlz+1,'0',$1,o.cpos),2)),"
 23690  "     o.name"
 23691  "    )"
 23692  "    COLLATE NOCASE"
 23693  "    AND o.cpos<>t.cpos"
 23694  "   GROUP BY t.cpos"
 23695  "  )"
 23696  ") UPDATE Colnames AS t SET"
 23697  " chop = 0," /* No chopping, never touch incoming names. */
 23698  " suff = iif(name IN (SELECT * FROM RepeatedNames),"
 23699  "  printf('"AUTOCOLUMN_SEP"%s', substring("
 23700  "   printf('%.*c%0.*d',(SELECT max(nlz) FROM Lzn)+1,'0',1,t.cpos),2)),"
 23701  "  ''"
 23702  " )"
 23703  #endif
 23704      ;
 23705    static const char * const zCollectVar = "\
 23706  SELECT\
 23707   '('||x'0a'\
 23708   || group_concat(\
 23709    cname||' TEXT',\
 23710    ','||iif((cpos-1)%4>0, ' ', x'0a'||' '))\
 23711   ||')' AS ColsSpec \
 23712  FROM (\
 23713   SELECT cpos, printf('\"%w\"',printf('%!.*s%s', nlen-chop,name,suff)) AS cname \
 23714   FROM ColNames ORDER BY cpos\
 23715  )";
 23716    static const char * const zRenamesDone =
 23717      "SELECT group_concat("
 23718      " printf('\"%w\" to \"%w\"',name,printf('%!.*s%s', nlen-chop, name, suff)),"
 23719      " ','||x'0a')"
 23720      "FROM ColNames WHERE suff<>'' OR chop!=0"
 23721      ;
 23722    int rc;
 23723    sqlite3_stmt *pStmt = 0;
 23724    assert(pDb!=0);
 23725    if( zColNew ){
 23726      /* Add initial or additional column. Init db if necessary. */
 23727      if( *pDb==0 ){
 23728        if( SQLITE_OK!=sqlite3_open(zCOL_DB, pDb) ) return 0;
 23729  #ifdef SHELL_COLFIX_DB
 23730        if(*zCOL_DB!=':')
 23731          sqlite3_exec(*pDb,"drop table if exists ColNames;"
 23732                       "drop view if exists RepeatedNames;",0,0,0);
 23733  #endif
 23734        rc = sqlite3_exec(*pDb, zTabMake, 0, 0, 0);
 23735        rc_err_oom_die(rc);
 23736      }
 23737      assert(*pDb!=0);
 23738      rc = sqlite3_prepare_v2(*pDb, zTabFill, -1, &pStmt, 0);
 23739      rc_err_oom_die(rc);
 23740      rc = sqlite3_bind_text(pStmt, 1, zColNew, -1, 0);
 23741      rc_err_oom_die(rc);
 23742      rc = sqlite3_step(pStmt);
 23743      rc_err_oom_die(rc);
 23744      sqlite3_finalize(pStmt);
 23745      return 0;
 23746    }else if( *pDb==0 ){
 23747      return 0;
 23748    }else{
 23749      /* Formulate the columns spec, close the DB, zero *pDb. */
 23750      char *zColsSpec = 0;
 23751      int hasDupes = db_int(*pDb, zHasDupes);
 23752      int nDigits = (hasDupes)? db_int(*pDb, zColDigits) : 0;
 23753      if( hasDupes ){
 23754  #ifdef SHELL_COLUMN_RENAME_CLEAN
 23755        rc = sqlite3_exec(*pDb, zDedoctor, 0, 0, 0);
 23756        rc_err_oom_die(rc);
 23757  #endif
 23758        rc = sqlite3_exec(*pDb, zSetReps, 0, 0, 0);
 23759        rc_err_oom_die(rc);
 23760        rc = sqlite3_prepare_v2(*pDb, zRenameRank, -1, &pStmt, 0);
 23761        rc_err_oom_die(rc);
 23762        sqlite3_bind_int(pStmt, 1, nDigits);
 23763        rc = sqlite3_step(pStmt);
 23764        sqlite3_finalize(pStmt);
 23765        if( rc!=SQLITE_DONE ) rc_err_oom_die(SQLITE_NOMEM);
 23766      }
 23767      assert(db_int(*pDb, zHasDupes)==0); /* Consider: remove this */
 23768      rc = sqlite3_prepare_v2(*pDb, zCollectVar, -1, &pStmt, 0);
 23769      rc_err_oom_die(rc);
 23770      rc = sqlite3_step(pStmt);
 23771      if( rc==SQLITE_ROW ){
 23772        zColsSpec = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
 23773      }else{
 23774        zColsSpec = 0;
 23775      }
 23776      if( pzRenamed!=0 ){
 23777        if( !hasDupes ) *pzRenamed = 0;
 23778        else{
 23779          sqlite3_finalize(pStmt);
 23780          if( SQLITE_OK==sqlite3_prepare_v2(*pDb, zRenamesDone, -1, &pStmt, 0)
 23781              && SQLITE_ROW==sqlite3_step(pStmt) ){
 23782            *pzRenamed = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
 23783          }else
 23784            *pzRenamed = 0;
 23785        }
 23786      }
 23787      sqlite3_finalize(pStmt);
 23788      sqlite3_close(*pDb);
 23789      *pDb = 0;
 23790      return zColsSpec;
 23791    }
 23792  }
 23793  
 23794  /*
 23795  ** If an input line begins with "." then invoke this routine to
 23796  ** process that line.
 23797  **
 23798  ** Return 1 on error, 2 to exit, and 0 otherwise.
 23799  */
 23800  static int do_meta_command(char *zLine, ShellState *p){
 23801    int h = 1;
 23802    int nArg = 0;
 23803    int n, c;
 23804    int rc = 0;
 23805    char *azArg[52];
 23806  
 23807  #ifndef SQLITE_OMIT_VIRTUALTABLE
 23808    if( p->expert.pExpert ){
 23809      expertFinish(p, 1, 0);
 23810    }
 23811  #endif
 23812  
 23813    /* Parse the input line into tokens.
 23814    */
 23815    while( zLine[h] && nArg<ArraySize(azArg)-1 ){
 23816      while( IsSpace(zLine[h]) ){ h++; }
 23817      if( zLine[h]==0 ) break;
 23818      if( zLine[h]=='\'' || zLine[h]=='"' ){
 23819        int delim = zLine[h++];
 23820        azArg[nArg++] = &zLine[h];
 23821        while( zLine[h] && zLine[h]!=delim ){
 23822          if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++;
 23823          h++;
 23824        }
 23825        if( zLine[h]==delim ){
 23826          zLine[h++] = 0;
 23827        }
 23828        if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
 23829      }else{
 23830        azArg[nArg++] = &zLine[h];
 23831        while( zLine[h] && !IsSpace(zLine[h]) ){ h++; }
 23832        if( zLine[h] ) zLine[h++] = 0;
 23833        resolve_backslashes(azArg[nArg-1]);
 23834      }
 23835    }
 23836    azArg[nArg] = 0;
 23837  
 23838    /* Process the input line.
 23839    */
 23840    if( nArg==0 ) return 0; /* no tokens, no error */
 23841    n = strlen30(azArg[0]);
 23842    c = azArg[0][0];
 23843    clearTempFile(p);
 23844  
 23845  #ifndef SQLITE_OMIT_AUTHORIZATION
 23846    if( c=='a' && cli_strncmp(azArg[0], "auth", n)==0 ){
 23847      if( nArg!=2 ){
 23848        raw_printf(stderr, "Usage: .auth ON|OFF\n");
 23849        rc = 1;
 23850        goto meta_command_exit;
 23851      }
 23852      open_db(p, 0);
 23853      if( booleanValue(azArg[1]) ){
 23854        sqlite3_set_authorizer(p->db, shellAuth, p);
 23855      }else if( p->bSafeModePersist ){
 23856        sqlite3_set_authorizer(p->db, safeModeAuth, p);
 23857      }else{
 23858        sqlite3_set_authorizer(p->db, 0, 0);
 23859      }
 23860    }else
 23861  #endif
 23862  
 23863  #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) \
 23864    && !defined(SQLITE_SHELL_FIDDLE)
 23865    if( c=='a' && cli_strncmp(azArg[0], "archive", n)==0 ){
 23866      open_db(p, 0);
 23867      failIfSafeMode(p, "cannot run .archive in safe mode");
 23868      rc = arDotCommand(p, 0, azArg, nArg);
 23869    }else
 23870  #endif
 23871  
 23872  #ifndef SQLITE_SHELL_FIDDLE
 23873    if( (c=='b' && n>=3 && cli_strncmp(azArg[0], "backup", n)==0)
 23874     || (c=='s' && n>=3 && cli_strncmp(azArg[0], "save", n)==0)
 23875    ){
 23876      const char *zDestFile = 0;
 23877      const char *zDb = 0;
 23878      sqlite3 *pDest;
 23879      sqlite3_backup *pBackup;
 23880      int j;
 23881      int bAsync = 0;
 23882      const char *zVfs = 0;
 23883      failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
 23884      for(j=1; j<nArg; j++){
 23885        const char *z = azArg[j];
 23886        if( z[0]=='-' ){
 23887          if( z[1]=='-' ) z++;
 23888          if( cli_strcmp(z, "-append")==0 ){
 23889            zVfs = "apndvfs";
 23890          }else
 23891          if( cli_strcmp(z, "-async")==0 ){
 23892            bAsync = 1;
 23893          }else
 23894          {
 23895            utf8_printf(stderr, "unknown option: %s\n", azArg[j]);
 23896            return 1;
 23897          }
 23898        }else if( zDestFile==0 ){
 23899          zDestFile = azArg[j];
 23900        }else if( zDb==0 ){
 23901          zDb = zDestFile;
 23902          zDestFile = azArg[j];
 23903        }else{
 23904          raw_printf(stderr, "Usage: .backup ?DB? ?OPTIONS? FILENAME\n");
 23905          return 1;
 23906        }
 23907      }
 23908      if( zDestFile==0 ){
 23909        raw_printf(stderr, "missing FILENAME argument on .backup\n");
 23910        return 1;
 23911      }
 23912      if( zDb==0 ) zDb = "main";
 23913      rc = sqlite3_open_v2(zDestFile, &pDest,
 23914                    SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, zVfs);
 23915      if( rc!=SQLITE_OK ){
 23916        utf8_printf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
 23917        close_db(pDest);
 23918        return 1;
 23919      }
 23920      if( bAsync ){
 23921        sqlite3_exec(pDest, "PRAGMA synchronous=OFF; PRAGMA journal_mode=OFF;",
 23922                     0, 0, 0);
 23923      }
 23924      open_db(p, 0);
 23925      pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
 23926      if( pBackup==0 ){
 23927        utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
 23928        close_db(pDest);
 23929        return 1;
 23930      }
 23931      while(  (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
 23932      sqlite3_backup_finish(pBackup);
 23933      if( rc==SQLITE_DONE ){
 23934        rc = 0;
 23935      }else{
 23936        utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
 23937        rc = 1;
 23938      }
 23939      close_db(pDest);
 23940    }else
 23941  #endif /* !defined(SQLITE_SHELL_FIDDLE) */
 23942  
 23943    if( c=='b' && n>=3 && cli_strncmp(azArg[0], "bail", n)==0 ){
 23944      if( nArg==2 ){
 23945        bail_on_error = booleanValue(azArg[1]);
 23946      }else{
 23947        raw_printf(stderr, "Usage: .bail on|off\n");
 23948        rc = 1;
 23949      }
 23950    }else
 23951  
 23952    /* Undocumented.  Legacy only.  See "crnl" below */
 23953    if( c=='b' && n>=3 && cli_strncmp(azArg[0], "binary", n)==0 ){
 23954      if( nArg==2 ){
 23955        if( booleanValue(azArg[1]) ){
 23956          setBinaryMode(p->out, 1);
 23957        }else{
 23958          setTextMode(p->out, 1);
 23959        }
 23960      }else{
 23961        raw_printf(stderr, "The \".binary\" command is deprecated."
 23962                           " Use \".crnl\" instead.\n");
 23963        raw_printf(stderr, "Usage: .binary on|off\n");
 23964        rc = 1;
 23965      }
 23966    }else
 23967  
 23968    /* The undocumented ".breakpoint" command causes a call to the no-op
 23969    ** routine named test_breakpoint().
 23970    */
 23971    if( c=='b' && n>=3 && cli_strncmp(azArg[0], "breakpoint", n)==0 ){
 23972      test_breakpoint();
 23973    }else
 23974  
 23975  #ifndef SQLITE_SHELL_FIDDLE
 23976    if( c=='c' && cli_strcmp(azArg[0],"cd")==0 ){
 23977      failIfSafeMode(p, "cannot run .cd in safe mode");
 23978      if( nArg==2 ){
 23979  #if defined(_WIN32) || defined(WIN32)
 23980        wchar_t *z = sqlite3_win32_utf8_to_unicode(azArg[1]);
 23981        rc = !SetCurrentDirectoryW(z);
 23982        sqlite3_free(z);
 23983  #else
 23984        rc = chdir(azArg[1]);
 23985  #endif
 23986        if( rc ){
 23987          utf8_printf(stderr, "Cannot change to directory \"%s\"\n", azArg[1]);
 23988          rc = 1;
 23989        }
 23990      }else{
 23991        raw_printf(stderr, "Usage: .cd DIRECTORY\n");
 23992        rc = 1;
 23993      }
 23994    }else
 23995  #endif /* !defined(SQLITE_SHELL_FIDDLE) */
 23996  
 23997    if( c=='c' && n>=3 && cli_strncmp(azArg[0], "changes", n)==0 ){
 23998      if( nArg==2 ){
 23999        setOrClearFlag(p, SHFLG_CountChanges, azArg[1]);
 24000      }else{
 24001        raw_printf(stderr, "Usage: .changes on|off\n");
 24002        rc = 1;
 24003      }
 24004    }else
 24005  
 24006  #ifndef SQLITE_SHELL_FIDDLE
 24007    /* Cancel output redirection, if it is currently set (by .testcase)
 24008    ** Then read the content of the testcase-out.txt file and compare against
 24009    ** azArg[1].  If there are differences, report an error and exit.
 24010    */
 24011    if( c=='c' && n>=3 && cli_strncmp(azArg[0], "check", n)==0 ){
 24012      char *zRes = 0;
 24013      output_reset(p);
 24014      if( nArg!=2 ){
 24015        raw_printf(stderr, "Usage: .check GLOB-PATTERN\n");
 24016        rc = 2;
 24017      }else if( (zRes = readFile("testcase-out.txt", 0))==0 ){
 24018        rc = 2;
 24019      }else if( testcase_glob(azArg[1],zRes)==0 ){
 24020        utf8_printf(stderr,
 24021                   "testcase-%s FAILED\n Expected: [%s]\n      Got: [%s]\n",
 24022                   p->zTestcase, azArg[1], zRes);
 24023        rc = 1;
 24024      }else{
 24025        utf8_printf(stdout, "testcase-%s ok\n", p->zTestcase);
 24026        p->nCheck++;
 24027      }
 24028      sqlite3_free(zRes);
 24029    }else
 24030  #endif /* !defined(SQLITE_SHELL_FIDDLE) */
 24031  
 24032  #ifndef SQLITE_SHELL_FIDDLE
 24033    if( c=='c' && cli_strncmp(azArg[0], "clone", n)==0 ){
 24034      failIfSafeMode(p, "cannot run .clone in safe mode");
 24035      if( nArg==2 ){
 24036        tryToClone(p, azArg[1]);
 24037      }else{
 24038        raw_printf(stderr, "Usage: .clone FILENAME\n");
 24039        rc = 1;
 24040      }
 24041    }else
 24042  #endif /* !defined(SQLITE_SHELL_FIDDLE) */
 24043  
 24044    if( c=='c' && cli_strncmp(azArg[0], "connection", n)==0 ){
 24045      if( nArg==1 ){
 24046        /* List available connections */
 24047        int i;
 24048        for(i=0; i<ArraySize(p->aAuxDb); i++){
 24049          const char *zFile = p->aAuxDb[i].zDbFilename;
 24050          if( p->aAuxDb[i].db==0 && p->pAuxDb!=&p->aAuxDb[i] ){
 24051            zFile = "(not open)";
 24052          }else if( zFile==0 ){
 24053            zFile = "(memory)";
 24054          }else if( zFile[0]==0 ){
 24055            zFile = "(temporary-file)";
 24056          }
 24057          if( p->pAuxDb == &p->aAuxDb[i] ){
 24058            utf8_printf(stdout, "ACTIVE %d: %s\n", i, zFile);
 24059          }else if( p->aAuxDb[i].db!=0 ){
 24060            utf8_printf(stdout, "       %d: %s\n", i, zFile);
 24061          }
 24062        }
 24063      }else if( nArg==2 && IsDigit(azArg[1][0]) && azArg[1][1]==0 ){
 24064        int i = azArg[1][0] - '0';
 24065        if( p->pAuxDb != &p->aAuxDb[i] && i>=0 && i<ArraySize(p->aAuxDb) ){
 24066          p->pAuxDb->db = p->db;
 24067          p->pAuxDb = &p->aAuxDb[i];
 24068          globalDb = p->db = p->pAuxDb->db;
 24069          p->pAuxDb->db = 0;
 24070        }
 24071      }else if( nArg==3 && cli_strcmp(azArg[1], "close")==0
 24072             && IsDigit(azArg[2][0]) && azArg[2][1]==0 ){
 24073        int i = azArg[2][0] - '0';
 24074        if( i<0 || i>=ArraySize(p->aAuxDb) ){
 24075          /* No-op */
 24076        }else if( p->pAuxDb == &p->aAuxDb[i] ){
 24077          raw_printf(stderr, "cannot close the active database connection\n");
 24078          rc = 1;
 24079        }else if( p->aAuxDb[i].db ){
 24080          session_close_all(p, i);
 24081          close_db(p->aAuxDb[i].db);
 24082          p->aAuxDb[i].db = 0;
 24083        }
 24084      }else{
 24085        raw_printf(stderr, "Usage: .connection [close] [CONNECTION-NUMBER]\n");
 24086        rc = 1;
 24087      }
 24088    }else
 24089  
 24090    if( c=='c' && n==4 && cli_strncmp(azArg[0], "crnl", n)==0 ){
 24091      if( nArg==2 ){
 24092        if( booleanValue(azArg[1]) ){
 24093          setTextMode(p->out, 1);
 24094        }else{
 24095          setBinaryMode(p->out, 1);
 24096        }
 24097      }else{
 24098  #if !defined(_WIN32) && !defined(WIN32)
 24099        raw_printf(stderr, "The \".crnl\" is a no-op on non-Windows machines.\n");
 24100  #endif
 24101        raw_printf(stderr, "Usage: .crnl on|off\n");
 24102        rc = 1;
 24103      }
 24104    }else
 24105  
 24106    if( c=='d' && n>1 && cli_strncmp(azArg[0], "databases", n)==0 ){
 24107      char **azName = 0;
 24108      int nName = 0;
 24109      sqlite3_stmt *pStmt;
 24110      int i;
 24111      open_db(p, 0);
 24112      rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
 24113      if( rc ){
 24114        utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
 24115        rc = 1;
 24116      }else{
 24117        while( sqlite3_step(pStmt)==SQLITE_ROW ){
 24118          const char *zSchema = (const char *)sqlite3_column_text(pStmt,1);
 24119          const char *zFile = (const char*)sqlite3_column_text(pStmt,2);
 24120          if( zSchema==0 || zFile==0 ) continue;
 24121          azName = sqlite3_realloc(azName, (nName+1)*2*sizeof(char*));
 24122          shell_check_oom(azName);
 24123          azName[nName*2] = strdup(zSchema);
 24124          azName[nName*2+1] = strdup(zFile);
 24125          nName++;
 24126        }
 24127      }
 24128      sqlite3_finalize(pStmt);
 24129      for(i=0; i<nName; i++){
 24130        int eTxn = sqlite3_txn_state(p->db, azName[i*2]);
 24131        int bRdonly = sqlite3_db_readonly(p->db, azName[i*2]);
 24132        const char *z = azName[i*2+1];
 24133        utf8_printf(p->out, "%s: %s %s%s\n",
 24134           azName[i*2],
 24135           z && z[0] ? z : "\"\"",
 24136           bRdonly ? "r/o" : "r/w",
 24137           eTxn==SQLITE_TXN_NONE ? "" :
 24138              eTxn==SQLITE_TXN_READ ? " read-txn" : " write-txn");
 24139        free(azName[i*2]);
 24140        free(azName[i*2+1]);
 24141      }
 24142      sqlite3_free(azName);
 24143    }else
 24144  
 24145    if( c=='d' && n>=3 && cli_strncmp(azArg[0], "dbconfig", n)==0 ){
 24146      static const struct DbConfigChoices {
 24147        const char *zName;
 24148        int op;
 24149      } aDbConfig[] = {
 24150          { "defensive",          SQLITE_DBCONFIG_DEFENSIVE             },
 24151          { "dqs_ddl",            SQLITE_DBCONFIG_DQS_DDL               },
 24152          { "dqs_dml",            SQLITE_DBCONFIG_DQS_DML               },
 24153          { "enable_fkey",        SQLITE_DBCONFIG_ENABLE_FKEY           },
 24154          { "enable_qpsg",        SQLITE_DBCONFIG_ENABLE_QPSG           },
 24155          { "enable_trigger",     SQLITE_DBCONFIG_ENABLE_TRIGGER        },
 24156          { "enable_view",        SQLITE_DBCONFIG_ENABLE_VIEW           },
 24157          { "fts3_tokenizer",     SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER },
 24158          { "legacy_alter_table", SQLITE_DBCONFIG_LEGACY_ALTER_TABLE    },
 24159          { "legacy_file_format", SQLITE_DBCONFIG_LEGACY_FILE_FORMAT    },
 24160          { "load_extension",     SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION },
 24161          { "no_ckpt_on_close",   SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE      },
 24162          { "reset_database",     SQLITE_DBCONFIG_RESET_DATABASE        },
 24163          { "reverse_scanorder",  SQLITE_DBCONFIG_REVERSE_SCANORDER     },
 24164          { "stmt_scanstatus",    SQLITE_DBCONFIG_STMT_SCANSTATUS       },
 24165          { "trigger_eqp",        SQLITE_DBCONFIG_TRIGGER_EQP           },
 24166          { "trusted_schema",     SQLITE_DBCONFIG_TRUSTED_SCHEMA        },
 24167          { "writable_schema",    SQLITE_DBCONFIG_WRITABLE_SCHEMA       },
 24168      };
 24169      int ii, v;
 24170      open_db(p, 0);
 24171      for(ii=0; ii<ArraySize(aDbConfig); ii++){
 24172        if( nArg>1 && cli_strcmp(azArg[1], aDbConfig[ii].zName)!=0 ) continue;
 24173        if( nArg>=3 ){
 24174          sqlite3_db_config(p->db, aDbConfig[ii].op, booleanValue(azArg[2]), 0);
 24175        }
 24176        sqlite3_db_config(p->db, aDbConfig[ii].op, -1, &v);
 24177        utf8_printf(p->out, "%19s %s\n", aDbConfig[ii].zName, v ? "on" : "off");
 24178        if( nArg>1 ) break;
 24179      }
 24180      if( nArg>1 && ii==ArraySize(aDbConfig) ){
 24181        utf8_printf(stderr, "Error: unknown dbconfig \"%s\"\n", azArg[1]);
 24182        utf8_printf(stderr, "Enter \".dbconfig\" with no arguments for a list\n");
 24183      }
 24184    }else
 24185  
 24186  #if SQLITE_SHELL_HAVE_RECOVER
 24187    if( c=='d' && n>=3 && cli_strncmp(azArg[0], "dbinfo", n)==0 ){
 24188      rc = shell_dbinfo_command(p, nArg, azArg);
 24189    }else
 24190  
 24191    if( c=='r' && cli_strncmp(azArg[0], "recover", n)==0 ){
 24192      open_db(p, 0);
 24193      rc = recoverDatabaseCmd(p, nArg, azArg);
 24194    }else
 24195  #endif /* SQLITE_SHELL_HAVE_RECOVER */
 24196  
 24197    if( c=='d' && cli_strncmp(azArg[0], "dump", n)==0 ){
 24198      char *zLike = 0;
 24199      char *zSql;
 24200      int i;
 24201      int savedShowHeader = p->showHeader;
 24202      int savedShellFlags = p->shellFlgs;
 24203      ShellClearFlag(p,
 24204         SHFLG_PreserveRowid|SHFLG_Newlines|SHFLG_Echo
 24205         |SHFLG_DumpDataOnly|SHFLG_DumpNoSys);
 24206      for(i=1; i<nArg; i++){
 24207        if( azArg[i][0]=='-' ){
 24208          const char *z = azArg[i]+1;
 24209          if( z[0]=='-' ) z++;
 24210          if( cli_strcmp(z,"preserve-rowids")==0 ){
 24211  #ifdef SQLITE_OMIT_VIRTUALTABLE
 24212            raw_printf(stderr, "The --preserve-rowids option is not compatible"
 24213                               " with SQLITE_OMIT_VIRTUALTABLE\n");
 24214            rc = 1;
 24215            sqlite3_free(zLike);
 24216            goto meta_command_exit;
 24217  #else
 24218            ShellSetFlag(p, SHFLG_PreserveRowid);
 24219  #endif
 24220          }else
 24221          if( cli_strcmp(z,"newlines")==0 ){
 24222            ShellSetFlag(p, SHFLG_Newlines);
 24223          }else
 24224          if( cli_strcmp(z,"data-only")==0 ){
 24225            ShellSetFlag(p, SHFLG_DumpDataOnly);
 24226          }else
 24227          if( cli_strcmp(z,"nosys")==0 ){
 24228            ShellSetFlag(p, SHFLG_DumpNoSys);
 24229          }else
 24230          {
 24231            raw_printf(stderr, "Unknown option \"%s\" on \".dump\"\n", azArg[i]);
 24232            rc = 1;
 24233            sqlite3_free(zLike);
 24234            goto meta_command_exit;
 24235          }
 24236        }else{
 24237          /* azArg[i] contains a LIKE pattern. This ".dump" request should
 24238          ** only dump data for tables for which either the table name matches
 24239          ** the LIKE pattern, or the table appears to be a shadow table of
 24240          ** a virtual table for which the name matches the LIKE pattern.
 24241          */
 24242          char *zExpr = sqlite3_mprintf(
 24243              "name LIKE %Q ESCAPE '\\' OR EXISTS ("
 24244              "  SELECT 1 FROM sqlite_schema WHERE "
 24245              "    name LIKE %Q ESCAPE '\\' AND"
 24246              "    sql LIKE 'CREATE VIRTUAL TABLE%%' AND"
 24247              "    substr(o.name, 1, length(name)+1) == (name||'_')"
 24248              ")", azArg[i], azArg[i]
 24249          );
 24250  
 24251          if( zLike ){
 24252            zLike = sqlite3_mprintf("%z OR %z", zLike, zExpr);
 24253          }else{
 24254            zLike = zExpr;
 24255          }
 24256        }
 24257      }
 24258  
 24259      open_db(p, 0);
 24260  
 24261      if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
 24262        /* When playing back a "dump", the content might appear in an order
 24263        ** which causes immediate foreign key constraints to be violated.
 24264        ** So disable foreign-key constraint enforcement to prevent problems. */
 24265        raw_printf(p->out, "PRAGMA foreign_keys=OFF;\n");
 24266        raw_printf(p->out, "BEGIN TRANSACTION;\n");
 24267      }
 24268      p->writableSchema = 0;
 24269      p->showHeader = 0;
 24270      /* Set writable_schema=ON since doing so forces SQLite to initialize
 24271      ** as much of the schema as it can even if the sqlite_schema table is
 24272      ** corrupt. */
 24273      sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
 24274      p->nErr = 0;
 24275      if( zLike==0 ) zLike = sqlite3_mprintf("true");
 24276      zSql = sqlite3_mprintf(
 24277        "SELECT name, type, sql FROM sqlite_schema AS o "
 24278        "WHERE (%s) AND type=='table'"
 24279        "  AND sql NOT NULL"
 24280        " ORDER BY tbl_name='sqlite_sequence', rowid",
 24281        zLike
 24282      );
 24283      run_schema_dump_query(p,zSql);
 24284      sqlite3_free(zSql);
 24285      if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
 24286        zSql = sqlite3_mprintf(
 24287          "SELECT sql FROM sqlite_schema AS o "
 24288          "WHERE (%s) AND sql NOT NULL"
 24289          "  AND type IN ('index','trigger','view')",
 24290          zLike
 24291        );
 24292        run_table_dump_query(p, zSql);
 24293        sqlite3_free(zSql);
 24294      }
 24295      sqlite3_free(zLike);
 24296      if( p->writableSchema ){
 24297        raw_printf(p->out, "PRAGMA writable_schema=OFF;\n");
 24298        p->writableSchema = 0;
 24299      }
 24300      sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
 24301      sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
 24302      if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
 24303        raw_printf(p->out, p->nErr?"ROLLBACK; -- due to errors\n":"COMMIT;\n");
 24304      }
 24305      p->showHeader = savedShowHeader;
 24306      p->shellFlgs = savedShellFlags;
 24307    }else
 24308  
 24309    if( c=='e' && cli_strncmp(azArg[0], "echo", n)==0 ){
 24310      if( nArg==2 ){
 24311        setOrClearFlag(p, SHFLG_Echo, azArg[1]);
 24312      }else{
 24313        raw_printf(stderr, "Usage: .echo on|off\n");
 24314        rc = 1;
 24315      }
 24316    }else
 24317  
 24318    if( c=='e' && cli_strncmp(azArg[0], "eqp", n)==0 ){
 24319      if( nArg==2 ){
 24320        p->autoEQPtest = 0;
 24321        if( p->autoEQPtrace ){
 24322          if( p->db ) sqlite3_exec(p->db, "PRAGMA vdbe_trace=OFF;", 0, 0, 0);
 24323          p->autoEQPtrace = 0;
 24324        }
 24325        if( cli_strcmp(azArg[1],"full")==0 ){
 24326          p->autoEQP = AUTOEQP_full;
 24327        }else if( cli_strcmp(azArg[1],"trigger")==0 ){
 24328          p->autoEQP = AUTOEQP_trigger;
 24329  #ifdef SQLITE_DEBUG
 24330        }else if( cli_strcmp(azArg[1],"test")==0 ){
 24331          p->autoEQP = AUTOEQP_on;
 24332          p->autoEQPtest = 1;
 24333        }else if( cli_strcmp(azArg[1],"trace")==0 ){
 24334          p->autoEQP = AUTOEQP_full;
 24335          p->autoEQPtrace = 1;
 24336          open_db(p, 0);
 24337          sqlite3_exec(p->db, "SELECT name FROM sqlite_schema LIMIT 1", 0, 0, 0);
 24338          sqlite3_exec(p->db, "PRAGMA vdbe_trace=ON;", 0, 0, 0);
 24339  #endif
 24340        }else{
 24341          p->autoEQP = (u8)booleanValue(azArg[1]);
 24342        }
 24343      }else{
 24344        raw_printf(stderr, "Usage: .eqp off|on|trace|trigger|full\n");
 24345        rc = 1;
 24346      }
 24347    }else
 24348  
 24349  #ifndef SQLITE_SHELL_FIDDLE
 24350    if( c=='e' && cli_strncmp(azArg[0], "exit", n)==0 ){
 24351      if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
 24352      rc = 2;
 24353    }else
 24354  #endif
 24355  
 24356    /* The ".explain" command is automatic now.  It is largely pointless.  It
 24357    ** retained purely for backwards compatibility */
 24358    if( c=='e' && cli_strncmp(azArg[0], "explain", n)==0 ){
 24359      int val = 1;
 24360      if( nArg>=2 ){
 24361        if( cli_strcmp(azArg[1],"auto")==0 ){
 24362          val = 99;
 24363        }else{
 24364          val =  booleanValue(azArg[1]);
 24365        }
 24366      }
 24367      if( val==1 && p->mode!=MODE_Explain ){
 24368        p->normalMode = p->mode;
 24369        p->mode = MODE_Explain;
 24370        p->autoExplain = 0;
 24371      }else if( val==0 ){
 24372        if( p->mode==MODE_Explain ) p->mode = p->normalMode;
 24373        p->autoExplain = 0;
 24374      }else if( val==99 ){
 24375        if( p->mode==MODE_Explain ) p->mode = p->normalMode;
 24376        p->autoExplain = 1;
 24377      }
 24378    }else
 24379  
 24380  #ifndef SQLITE_OMIT_VIRTUALTABLE
 24381    if( c=='e' && cli_strncmp(azArg[0], "expert", n)==0 ){
 24382      if( p->bSafeMode ){
 24383        raw_printf(stderr,
 24384          "Cannot run experimental commands such as \"%s\" in safe mode\n",
 24385          azArg[0]);
 24386        rc = 1;
 24387      }else{
 24388        open_db(p, 0);
 24389        expertDotCommand(p, azArg, nArg);
 24390      }
 24391    }else
 24392  #endif
 24393  
 24394    if( c=='f' && cli_strncmp(azArg[0], "filectrl", n)==0 ){
 24395      static const struct {
 24396         const char *zCtrlName;   /* Name of a test-control option */
 24397         int ctrlCode;            /* Integer code for that option */
 24398         const char *zUsage;      /* Usage notes */
 24399      } aCtrl[] = {
 24400        { "chunk_size",     SQLITE_FCNTL_CHUNK_SIZE,      "SIZE"           },
 24401        { "data_version",   SQLITE_FCNTL_DATA_VERSION,    ""               },
 24402        { "has_moved",      SQLITE_FCNTL_HAS_MOVED,       ""               },
 24403        { "lock_timeout",   SQLITE_FCNTL_LOCK_TIMEOUT,    "MILLISEC"       },
 24404        { "persist_wal",    SQLITE_FCNTL_PERSIST_WAL,     "[BOOLEAN]"      },
 24405     /* { "pragma",         SQLITE_FCNTL_PRAGMA,          "NAME ARG"       },*/
 24406        { "psow",       SQLITE_FCNTL_POWERSAFE_OVERWRITE, "[BOOLEAN]"      },
 24407        { "reserve_bytes",  SQLITE_FCNTL_RESERVE_BYTES,   "[N]"            },
 24408        { "size_limit",     SQLITE_FCNTL_SIZE_LIMIT,      "[LIMIT]"        },
 24409        { "tempfilename",   SQLITE_FCNTL_TEMPFILENAME,    ""               },
 24410     /* { "win32_av_retry", SQLITE_FCNTL_WIN32_AV_RETRY,  "COUNT DELAY"    },*/
 24411      };
 24412      int filectrl = -1;
 24413      int iCtrl = -1;
 24414      sqlite3_int64 iRes = 0;  /* Integer result to display if rc2==1 */
 24415      int isOk = 0;            /* 0: usage  1: %lld  2: no-result */
 24416      int n2, i;
 24417      const char *zCmd = 0;
 24418      const char *zSchema = 0;
 24419  
 24420      open_db(p, 0);
 24421      zCmd = nArg>=2 ? azArg[1] : "help";
 24422  
 24423      if( zCmd[0]=='-'
 24424       && (cli_strcmp(zCmd,"--schema")==0 || cli_strcmp(zCmd,"-schema")==0)
 24425       && nArg>=4
 24426      ){
 24427        zSchema = azArg[2];
 24428        for(i=3; i<nArg; i++) azArg[i-2] = azArg[i];
 24429        nArg -= 2;
 24430        zCmd = azArg[1];
 24431      }
 24432  
 24433      /* The argument can optionally begin with "-" or "--" */
 24434      if( zCmd[0]=='-' && zCmd[1] ){
 24435        zCmd++;
 24436        if( zCmd[0]=='-' && zCmd[1] ) zCmd++;
 24437      }
 24438  
 24439      /* --help lists all file-controls */
 24440      if( cli_strcmp(zCmd,"help")==0 ){
 24441        utf8_printf(p->out, "Available file-controls:\n");
 24442        for(i=0; i<ArraySize(aCtrl); i++){
 24443          utf8_printf(p->out, "  .filectrl %s %s\n",
 24444                      aCtrl[i].zCtrlName, aCtrl[i].zUsage);
 24445        }
 24446        rc = 1;
 24447        goto meta_command_exit;
 24448      }
 24449  
 24450      /* convert filectrl text option to value. allow any unique prefix
 24451      ** of the option name, or a numerical value. */
 24452      n2 = strlen30(zCmd);
 24453      for(i=0; i<ArraySize(aCtrl); i++){
 24454        if( cli_strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){
 24455          if( filectrl<0 ){
 24456            filectrl = aCtrl[i].ctrlCode;
 24457            iCtrl = i;
 24458          }else{
 24459            utf8_printf(stderr, "Error: ambiguous file-control: \"%s\"\n"
 24460                                "Use \".filectrl --help\" for help\n", zCmd);
 24461            rc = 1;
 24462            goto meta_command_exit;
 24463          }
 24464        }
 24465      }
 24466      if( filectrl<0 ){
 24467        utf8_printf(stderr,"Error: unknown file-control: %s\n"
 24468                           "Use \".filectrl --help\" for help\n", zCmd);
 24469      }else{
 24470        switch(filectrl){
 24471          case SQLITE_FCNTL_SIZE_LIMIT: {
 24472            if( nArg!=2 && nArg!=3 ) break;
 24473            iRes = nArg==3 ? integerValue(azArg[2]) : -1;
 24474            sqlite3_file_control(p->db, zSchema, SQLITE_FCNTL_SIZE_LIMIT, &iRes);
 24475            isOk = 1;
 24476            break;
 24477          }
 24478          case SQLITE_FCNTL_LOCK_TIMEOUT:
 24479          case SQLITE_FCNTL_CHUNK_SIZE: {
 24480            int x;
 24481            if( nArg!=3 ) break;
 24482            x = (int)integerValue(azArg[2]);
 24483            sqlite3_file_control(p->db, zSchema, filectrl, &x);
 24484            isOk = 2;
 24485            break;
 24486          }
 24487          case SQLITE_FCNTL_PERSIST_WAL:
 24488          case SQLITE_FCNTL_POWERSAFE_OVERWRITE: {
 24489            int x;
 24490            if( nArg!=2 && nArg!=3 ) break;
 24491            x = nArg==3 ? booleanValue(azArg[2]) : -1;
 24492            sqlite3_file_control(p->db, zSchema, filectrl, &x);
 24493            iRes = x;
 24494            isOk = 1;
 24495            break;
 24496          }
 24497          case SQLITE_FCNTL_DATA_VERSION:
 24498          case SQLITE_FCNTL_HAS_MOVED: {
 24499            int x;
 24500            if( nArg!=2 ) break;
 24501            sqlite3_file_control(p->db, zSchema, filectrl, &x);
 24502            iRes = x;
 24503            isOk = 1;
 24504            break;
 24505          }
 24506          case SQLITE_FCNTL_TEMPFILENAME: {
 24507            char *z = 0;
 24508            if( nArg!=2 ) break;
 24509            sqlite3_file_control(p->db, zSchema, filectrl, &z);
 24510            if( z ){
 24511              utf8_printf(p->out, "%s\n", z);
 24512              sqlite3_free(z);
 24513            }
 24514            isOk = 2;
 24515            break;
 24516          }
 24517          case SQLITE_FCNTL_RESERVE_BYTES: {
 24518            int x;
 24519            if( nArg>=3 ){
 24520              x = atoi(azArg[2]);
 24521              sqlite3_file_control(p->db, zSchema, filectrl, &x);
 24522            }
 24523            x = -1;
 24524            sqlite3_file_control(p->db, zSchema, filectrl, &x);
 24525            utf8_printf(p->out,"%d\n", x);
 24526            isOk = 2;
 24527            break;
 24528          }
 24529        }
 24530      }
 24531      if( isOk==0 && iCtrl>=0 ){
 24532        utf8_printf(p->out, "Usage: .filectrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage);
 24533        rc = 1;
 24534      }else if( isOk==1 ){
 24535        char zBuf[100];
 24536        sqlite3_snprintf(sizeof(zBuf), zBuf, "%lld", iRes);
 24537        raw_printf(p->out, "%s\n", zBuf);
 24538      }
 24539    }else
 24540  
 24541    if( c=='f' && cli_strncmp(azArg[0], "fullschema", n)==0 ){
 24542      ShellState data;
 24543      int doStats = 0;
 24544      memcpy(&data, p, sizeof(data));
 24545      data.showHeader = 0;
 24546      data.cMode = data.mode = MODE_Semi;
 24547      if( nArg==2 && optionMatch(azArg[1], "indent") ){
 24548        data.cMode = data.mode = MODE_Pretty;
 24549        nArg = 1;
 24550      }
 24551      if( nArg!=1 ){
 24552        raw_printf(stderr, "Usage: .fullschema ?--indent?\n");
 24553        rc = 1;
 24554        goto meta_command_exit;
 24555      }
 24556      open_db(p, 0);
 24557      rc = sqlite3_exec(p->db,
 24558         "SELECT sql FROM"
 24559         "  (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
 24560         "     FROM sqlite_schema UNION ALL"
 24561         "   SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_schema) "
 24562         "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
 24563         "ORDER BY x",
 24564         callback, &data, 0
 24565      );
 24566      if( rc==SQLITE_OK ){
 24567        sqlite3_stmt *pStmt;
 24568        rc = sqlite3_prepare_v2(p->db,
 24569                 "SELECT rowid FROM sqlite_schema"
 24570                 " WHERE name GLOB 'sqlite_stat[134]'",
 24571                 -1, &pStmt, 0);
 24572        doStats = sqlite3_step(pStmt)==SQLITE_ROW;
 24573        sqlite3_finalize(pStmt);
 24574      }
 24575      if( doStats==0 ){
 24576        raw_printf(p->out, "/* No STAT tables available */\n");
 24577      }else{
 24578        raw_printf(p->out, "ANALYZE sqlite_schema;\n");
 24579        data.cMode = data.mode = MODE_Insert;
 24580        data.zDestTable = "sqlite_stat1";
 24581        shell_exec(&data, "SELECT * FROM sqlite_stat1", 0);
 24582        data.zDestTable = "sqlite_stat4";
 24583        shell_exec(&data, "SELECT * FROM sqlite_stat4", 0);
 24584        raw_printf(p->out, "ANALYZE sqlite_schema;\n");
 24585      }
 24586    }else
 24587  
 24588    if( c=='h' && cli_strncmp(azArg[0], "headers", n)==0 ){
 24589      if( nArg==2 ){
 24590        p->showHeader = booleanValue(azArg[1]);
 24591        p->shellFlgs |= SHFLG_HeaderSet;
 24592      }else{
 24593        raw_printf(stderr, "Usage: .headers on|off\n");
 24594        rc = 1;
 24595      }
 24596    }else
 24597  
 24598    if( c=='h' && cli_strncmp(azArg[0], "help", n)==0 ){
 24599      if( nArg>=2 ){
 24600        n = showHelp(p->out, azArg[1]);
 24601        if( n==0 ){
 24602          utf8_printf(p->out, "Nothing matches '%s'\n", azArg[1]);
 24603        }
 24604      }else{
 24605        showHelp(p->out, 0);
 24606      }
 24607    }else
 24608  
 24609  #ifndef SQLITE_SHELL_FIDDLE
 24610    if( c=='i' && cli_strncmp(azArg[0], "import", n)==0 ){
 24611      char *zTable = 0;           /* Insert data into this table */
 24612      char *zSchema = 0;          /* within this schema (may default to "main") */
 24613      char *zFile = 0;            /* Name of file to extra content from */
 24614      sqlite3_stmt *pStmt = NULL; /* A statement */
 24615      int nCol;                   /* Number of columns in the table */
 24616      int nByte;                  /* Number of bytes in an SQL string */
 24617      int i, j;                   /* Loop counters */
 24618      int needCommit;             /* True to COMMIT or ROLLBACK at end */
 24619      int nSep;                   /* Number of bytes in p->colSeparator[] */
 24620      char *zSql;                 /* An SQL statement */
 24621      char *zFullTabName;         /* Table name with schema if applicable */
 24622      ImportCtx sCtx;             /* Reader context */
 24623      char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */
 24624      int eVerbose = 0;           /* Larger for more console output */
 24625      int nSkip = 0;              /* Initial lines to skip */
 24626      int useOutputMode = 1;      /* Use output mode to determine separators */
 24627      char *zCreate = 0;          /* CREATE TABLE statement text */
 24628  
 24629      failIfSafeMode(p, "cannot run .import in safe mode");
 24630      memset(&sCtx, 0, sizeof(sCtx));
 24631      if( p->mode==MODE_Ascii ){
 24632        xRead = ascii_read_one_field;
 24633      }else{
 24634        xRead = csv_read_one_field;
 24635      }
 24636      rc = 1;
 24637      for(i=1; i<nArg; i++){
 24638        char *z = azArg[i];
 24639        if( z[0]=='-' && z[1]=='-' ) z++;
 24640        if( z[0]!='-' ){
 24641          if( zFile==0 ){
 24642            zFile = z;
 24643          }else if( zTable==0 ){
 24644            zTable = z;
 24645          }else{
 24646            utf8_printf(p->out, "ERROR: extra argument: \"%s\".  Usage:\n", z);
 24647            showHelp(p->out, "import");
 24648            goto meta_command_exit;
 24649          }
 24650        }else if( cli_strcmp(z,"-v")==0 ){
 24651          eVerbose++;
 24652        }else if( cli_strcmp(z,"-schema")==0 && i<nArg-1 ){
 24653          zSchema = azArg[++i];
 24654        }else if( cli_strcmp(z,"-skip")==0 && i<nArg-1 ){
 24655          nSkip = integerValue(azArg[++i]);
 24656        }else if( cli_strcmp(z,"-ascii")==0 ){
 24657          sCtx.cColSep = SEP_Unit[0];
 24658          sCtx.cRowSep = SEP_Record[0];
 24659          xRead = ascii_read_one_field;
 24660          useOutputMode = 0;
 24661        }else if( cli_strcmp(z,"-csv")==0 ){
 24662          sCtx.cColSep = ',';
 24663          sCtx.cRowSep = '\n';
 24664          xRead = csv_read_one_field;
 24665          useOutputMode = 0;
 24666        }else{
 24667          utf8_printf(p->out, "ERROR: unknown option: \"%s\".  Usage:\n", z);
 24668          showHelp(p->out, "import");
 24669          goto meta_command_exit;
 24670        }
 24671      }
 24672      if( zTable==0 ){
 24673        utf8_printf(p->out, "ERROR: missing %s argument. Usage:\n",
 24674                    zFile==0 ? "FILE" : "TABLE");
 24675        showHelp(p->out, "import");
 24676        goto meta_command_exit;
 24677      }
 24678      seenInterrupt = 0;
 24679      open_db(p, 0);
 24680      if( useOutputMode ){
 24681        /* If neither the --csv or --ascii options are specified, then set
 24682        ** the column and row separator characters from the output mode. */
 24683        nSep = strlen30(p->colSeparator);
 24684        if( nSep==0 ){
 24685          raw_printf(stderr,
 24686                     "Error: non-null column separator required for import\n");
 24687          goto meta_command_exit;
 24688        }
 24689        if( nSep>1 ){
 24690          raw_printf(stderr,
 24691                "Error: multi-character column separators not allowed"
 24692                " for import\n");
 24693          goto meta_command_exit;
 24694        }
 24695        nSep = strlen30(p->rowSeparator);
 24696        if( nSep==0 ){
 24697          raw_printf(stderr,
 24698              "Error: non-null row separator required for import\n");
 24699          goto meta_command_exit;
 24700        }
 24701        if( nSep==2 && p->mode==MODE_Csv
 24702         && cli_strcmp(p->rowSeparator,SEP_CrLf)==0
 24703        ){
 24704          /* When importing CSV (only), if the row separator is set to the
 24705          ** default output row separator, change it to the default input
 24706          ** row separator.  This avoids having to maintain different input
 24707          ** and output row separators. */
 24708          sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
 24709          nSep = strlen30(p->rowSeparator);
 24710        }
 24711        if( nSep>1 ){
 24712          raw_printf(stderr, "Error: multi-character row separators not allowed"
 24713                             " for import\n");
 24714          goto meta_command_exit;
 24715        }
 24716        sCtx.cColSep = (u8)p->colSeparator[0];
 24717        sCtx.cRowSep = (u8)p->rowSeparator[0];
 24718      }
 24719      sCtx.zFile = zFile;
 24720      sCtx.nLine = 1;
 24721      if( sCtx.zFile[0]=='|' ){
 24722  #ifdef SQLITE_OMIT_POPEN
 24723        raw_printf(stderr, "Error: pipes are not supported in this OS\n");
 24724        goto meta_command_exit;
 24725  #else
 24726        sCtx.in = popen(sCtx.zFile+1, "r");
 24727        sCtx.zFile = "<pipe>";
 24728        sCtx.xCloser = pclose;
 24729  #endif
 24730      }else{
 24731        sCtx.in = fopen(sCtx.zFile, "rb");
 24732        sCtx.xCloser = fclose;
 24733      }
 24734      if( sCtx.in==0 ){
 24735        utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
 24736        goto meta_command_exit;
 24737      }
 24738      if( eVerbose>=2 || (eVerbose>=1 && useOutputMode) ){
 24739        char zSep[2];
 24740        zSep[1] = 0;
 24741        zSep[0] = sCtx.cColSep;
 24742        utf8_printf(p->out, "Column separator ");
 24743        output_c_string(p->out, zSep);
 24744        utf8_printf(p->out, ", row separator ");
 24745        zSep[0] = sCtx.cRowSep;
 24746        output_c_string(p->out, zSep);
 24747        utf8_printf(p->out, "\n");
 24748      }
 24749      sCtx.z = sqlite3_malloc64(120);
 24750      if( sCtx.z==0 ){
 24751        import_cleanup(&sCtx);
 24752        shell_out_of_memory();
 24753      }
 24754      /* Below, resources must be freed before exit. */
 24755      while( (nSkip--)>0 ){
 24756        while( xRead(&sCtx) && sCtx.cTerm==sCtx.cColSep ){}
 24757      }
 24758      if( zSchema!=0 ){
 24759        zFullTabName = sqlite3_mprintf("\"%w\".\"%w\"", zSchema, zTable);
 24760      }else{
 24761        zFullTabName = sqlite3_mprintf("\"%w\"", zTable);
 24762      }
 24763      zSql = sqlite3_mprintf("SELECT * FROM %s", zFullTabName);
 24764      if( zSql==0 || zFullTabName==0 ){
 24765        import_cleanup(&sCtx);
 24766        shell_out_of_memory();
 24767      }
 24768      nByte = strlen30(zSql);
 24769      rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
 24770      import_append_char(&sCtx, 0);    /* To ensure sCtx.z is allocated */
 24771      if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){
 24772        sqlite3 *dbCols = 0;
 24773        char *zRenames = 0;
 24774        char *zColDefs;
 24775        zCreate = sqlite3_mprintf("CREATE TABLE %s", zFullTabName);
 24776        while( xRead(&sCtx) ){
 24777          zAutoColumn(sCtx.z, &dbCols, 0);
 24778          if( sCtx.cTerm!=sCtx.cColSep ) break;
 24779        }
 24780        zColDefs = zAutoColumn(0, &dbCols, &zRenames);
 24781        if( zRenames!=0 ){
 24782          utf8_printf((stdin_is_interactive && p->in==stdin)? p->out : stderr,
 24783                      "Columns renamed during .import %s due to duplicates:\n"
 24784                      "%s\n", sCtx.zFile, zRenames);
 24785          sqlite3_free(zRenames);
 24786        }
 24787        assert(dbCols==0);
 24788        if( zColDefs==0 ){
 24789          utf8_printf(stderr,"%s: empty file\n", sCtx.zFile);
 24790        import_fail:
 24791          sqlite3_free(zCreate);
 24792          sqlite3_free(zSql);
 24793          sqlite3_free(zFullTabName);
 24794          import_cleanup(&sCtx);
 24795          rc = 1;
 24796          goto meta_command_exit;
 24797        }
 24798        zCreate = sqlite3_mprintf("%z%z\n", zCreate, zColDefs);
 24799        if( eVerbose>=1 ){
 24800          utf8_printf(p->out, "%s\n", zCreate);
 24801        }
 24802        rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
 24803        if( rc ){
 24804          utf8_printf(stderr, "%s failed:\n%s\n", zCreate, sqlite3_errmsg(p->db));
 24805          goto import_fail;
 24806        }
 24807        sqlite3_free(zCreate);
 24808        zCreate = 0;
 24809        rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
 24810      }
 24811      if( rc ){
 24812        if (pStmt) sqlite3_finalize(pStmt);
 24813        utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db));
 24814        goto import_fail;
 24815      }
 24816      sqlite3_free(zSql);
 24817      nCol = sqlite3_column_count(pStmt);
 24818      sqlite3_finalize(pStmt);
 24819      pStmt = 0;
 24820      if( nCol==0 ) return 0; /* no columns, no error */
 24821      zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 );
 24822      if( zSql==0 ){
 24823        import_cleanup(&sCtx);
 24824        shell_out_of_memory();
 24825      }
 24826      sqlite3_snprintf(nByte+20, zSql, "INSERT INTO %s VALUES(?", zFullTabName);
 24827      j = strlen30(zSql);
 24828      for(i=1; i<nCol; i++){
 24829        zSql[j++] = ',';
 24830        zSql[j++] = '?';
 24831      }
 24832      zSql[j++] = ')';
 24833      zSql[j] = 0;
 24834      if( eVerbose>=2 ){
 24835        utf8_printf(p->out, "Insert using: %s\n", zSql);
 24836      }
 24837      rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
 24838      if( rc ){
 24839        utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
 24840        if (pStmt) sqlite3_finalize(pStmt);
 24841        goto import_fail;
 24842      }
 24843      sqlite3_free(zSql);
 24844      sqlite3_free(zFullTabName);
 24845      needCommit = sqlite3_get_autocommit(p->db);
 24846      if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
 24847      do{
 24848        int startLine = sCtx.nLine;
 24849        for(i=0; i<nCol; i++){
 24850          char *z = xRead(&sCtx);
 24851          /*
 24852          ** Did we reach end-of-file before finding any columns?
 24853          ** If so, stop instead of NULL filling the remaining columns.
 24854          */
 24855          if( z==0 && i==0 ) break;
 24856          /*
 24857          ** Did we reach end-of-file OR end-of-line before finding any
 24858          ** columns in ASCII mode?  If so, stop instead of NULL filling
 24859          ** the remaining columns.
 24860          */
 24861          if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break;
 24862          sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
 24863          if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){
 24864            utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
 24865                            "filling the rest with NULL\n",
 24866                            sCtx.zFile, startLine, nCol, i+1);
 24867            i += 2;
 24868            while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
 24869          }
 24870        }
 24871        if( sCtx.cTerm==sCtx.cColSep ){
 24872          do{
 24873            xRead(&sCtx);
 24874            i++;
 24875          }while( sCtx.cTerm==sCtx.cColSep );
 24876          utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
 24877                          "extras ignored\n",
 24878                          sCtx.zFile, startLine, nCol, i);
 24879        }
 24880        if( i>=nCol ){
 24881          sqlite3_step(pStmt);
 24882          rc = sqlite3_reset(pStmt);
 24883          if( rc!=SQLITE_OK ){
 24884            utf8_printf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile,
 24885                        startLine, sqlite3_errmsg(p->db));
 24886            sCtx.nErr++;
 24887          }else{
 24888            sCtx.nRow++;
 24889          }
 24890        }
 24891      }while( sCtx.cTerm!=EOF );
 24892  
 24893      import_cleanup(&sCtx);
 24894      sqlite3_finalize(pStmt);
 24895      if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0);
 24896      if( eVerbose>0 ){
 24897        utf8_printf(p->out,
 24898            "Added %d rows with %d errors using %d lines of input\n",
 24899            sCtx.nRow, sCtx.nErr, sCtx.nLine-1);
 24900      }
 24901    }else
 24902  #endif /* !defined(SQLITE_SHELL_FIDDLE) */
 24903  
 24904  #ifndef SQLITE_UNTESTABLE
 24905    if( c=='i' && cli_strncmp(azArg[0], "imposter", n)==0 ){
 24906      char *zSql;
 24907      char *zCollist = 0;
 24908      sqlite3_stmt *pStmt;
 24909      int tnum = 0;
 24910      int isWO = 0;  /* True if making an imposter of a WITHOUT ROWID table */
 24911      int lenPK = 0; /* Length of the PRIMARY KEY string for isWO tables */
 24912      int i;
 24913      if( !ShellHasFlag(p,SHFLG_TestingMode) ){
 24914        utf8_printf(stderr, ".%s unavailable without --unsafe-testing\n",
 24915                    "imposter");
 24916        rc = 1;
 24917        goto meta_command_exit;
 24918      }
 24919      if( !(nArg==3 || (nArg==2 && sqlite3_stricmp(azArg[1],"off")==0)) ){
 24920        utf8_printf(stderr, "Usage: .imposter INDEX IMPOSTER\n"
 24921                            "       .imposter off\n");
 24922        /* Also allowed, but not documented:
 24923        **
 24924        **    .imposter TABLE IMPOSTER
 24925        **
 24926        ** where TABLE is a WITHOUT ROWID table.  In that case, the
 24927        ** imposter is another WITHOUT ROWID table with the columns in
 24928        ** storage order. */
 24929        rc = 1;
 24930        goto meta_command_exit;
 24931      }
 24932      open_db(p, 0);
 24933      if( nArg==2 ){
 24934        sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 1);
 24935        goto meta_command_exit;
 24936      }
 24937      zSql = sqlite3_mprintf(
 24938        "SELECT rootpage, 0 FROM sqlite_schema"
 24939        " WHERE name='%q' AND type='index'"
 24940        "UNION ALL "
 24941        "SELECT rootpage, 1 FROM sqlite_schema"
 24942        " WHERE name='%q' AND type='table'"
 24943        "   AND sql LIKE '%%without%%rowid%%'",
 24944        azArg[1], azArg[1]
 24945      );
 24946      sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
 24947      sqlite3_free(zSql);
 24948      if( sqlite3_step(pStmt)==SQLITE_ROW ){
 24949        tnum = sqlite3_column_int(pStmt, 0);
 24950        isWO = sqlite3_column_int(pStmt, 1);
 24951      }
 24952      sqlite3_finalize(pStmt);
 24953      zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]);
 24954      rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
 24955      sqlite3_free(zSql);
 24956      i = 0;
 24957      while( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
 24958        char zLabel[20];
 24959        const char *zCol = (const char*)sqlite3_column_text(pStmt,2);
 24960        i++;
 24961        if( zCol==0 ){
 24962          if( sqlite3_column_int(pStmt,1)==-1 ){
 24963            zCol = "_ROWID_";
 24964          }else{
 24965            sqlite3_snprintf(sizeof(zLabel),zLabel,"expr%d",i);
 24966            zCol = zLabel;
 24967          }
 24968        }
 24969        if( isWO && lenPK==0 && sqlite3_column_int(pStmt,5)==0 && zCollist ){
 24970          lenPK = (int)strlen(zCollist);
 24971        }
 24972        if( zCollist==0 ){
 24973          zCollist = sqlite3_mprintf("\"%w\"", zCol);
 24974        }else{
 24975          zCollist = sqlite3_mprintf("%z,\"%w\"", zCollist, zCol);
 24976        }
 24977      }
 24978      sqlite3_finalize(pStmt);
 24979      if( i==0 || tnum==0 ){
 24980        utf8_printf(stderr, "no such index: \"%s\"\n", azArg[1]);
 24981        rc = 1;
 24982        sqlite3_free(zCollist);
 24983        goto meta_command_exit;
 24984      }
 24985      if( lenPK==0 ) lenPK = 100000;
 24986      zSql = sqlite3_mprintf(
 24987            "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%.*s))WITHOUT ROWID",
 24988            azArg[2], zCollist, lenPK, zCollist);
 24989      sqlite3_free(zCollist);
 24990      rc = sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 1, tnum);
 24991      if( rc==SQLITE_OK ){
 24992        rc = sqlite3_exec(p->db, zSql, 0, 0, 0);
 24993        sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 0);
 24994        if( rc ){
 24995          utf8_printf(stderr, "Error in [%s]: %s\n", zSql, sqlite3_errmsg(p->db));
 24996        }else{
 24997          utf8_printf(stdout, "%s;\n", zSql);
 24998          raw_printf(stdout,
 24999            "WARNING: writing to an imposter table will corrupt the \"%s\" %s!\n",
 25000            azArg[1], isWO ? "table" : "index"
 25001          );
 25002        }
 25003      }else{
 25004        raw_printf(stderr, "SQLITE_TESTCTRL_IMPOSTER returns %d\n", rc);
 25005        rc = 1;
 25006      }
 25007      sqlite3_free(zSql);
 25008    }else
 25009  #endif /* !defined(SQLITE_OMIT_TEST_CONTROL) */
 25010  
 25011  #ifdef SQLITE_ENABLE_IOTRACE
 25012    if( c=='i' && cli_strncmp(azArg[0], "iotrace", n)==0 ){
 25013      SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...);
 25014      if( iotrace && iotrace!=stdout ) fclose(iotrace);
 25015      iotrace = 0;
 25016      if( nArg<2 ){
 25017        sqlite3IoTrace = 0;
 25018      }else if( cli_strcmp(azArg[1], "-")==0 ){
 25019        sqlite3IoTrace = iotracePrintf;
 25020        iotrace = stdout;
 25021      }else{
 25022        iotrace = fopen(azArg[1], "w");
 25023        if( iotrace==0 ){
 25024          utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
 25025          sqlite3IoTrace = 0;
 25026          rc = 1;
 25027        }else{
 25028          sqlite3IoTrace = iotracePrintf;
 25029        }
 25030      }
 25031    }else
 25032  #endif
 25033  
 25034    if( c=='l' && n>=5 && cli_strncmp(azArg[0], "limits", n)==0 ){
 25035      static const struct {
 25036         const char *zLimitName;   /* Name of a limit */
 25037         int limitCode;            /* Integer code for that limit */
 25038      } aLimit[] = {
 25039        { "length",                SQLITE_LIMIT_LENGTH                    },
 25040        { "sql_length",            SQLITE_LIMIT_SQL_LENGTH                },
 25041        { "column",                SQLITE_LIMIT_COLUMN                    },
 25042        { "expr_depth",            SQLITE_LIMIT_EXPR_DEPTH                },
 25043        { "compound_select",       SQLITE_LIMIT_COMPOUND_SELECT           },
 25044        { "vdbe_op",               SQLITE_LIMIT_VDBE_OP                   },
 25045        { "function_arg",          SQLITE_LIMIT_FUNCTION_ARG              },
 25046        { "attached",              SQLITE_LIMIT_ATTACHED                  },
 25047        { "like_pattern_length",   SQLITE_LIMIT_LIKE_PATTERN_LENGTH       },
 25048        { "variable_number",       SQLITE_LIMIT_VARIABLE_NUMBER           },
 25049        { "trigger_depth",         SQLITE_LIMIT_TRIGGER_DEPTH             },
 25050        { "worker_threads",        SQLITE_LIMIT_WORKER_THREADS            },
 25051      };
 25052      int i, n2;
 25053      open_db(p, 0);
 25054      if( nArg==1 ){
 25055        for(i=0; i<ArraySize(aLimit); i++){
 25056          printf("%20s %d\n", aLimit[i].zLimitName,
 25057                 sqlite3_limit(p->db, aLimit[i].limitCode, -1));
 25058        }
 25059      }else if( nArg>3 ){
 25060        raw_printf(stderr, "Usage: .limit NAME ?NEW-VALUE?\n");
 25061        rc = 1;
 25062        goto meta_command_exit;
 25063      }else{
 25064        int iLimit = -1;
 25065        n2 = strlen30(azArg[1]);
 25066        for(i=0; i<ArraySize(aLimit); i++){
 25067          if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){
 25068            if( iLimit<0 ){
 25069              iLimit = i;
 25070            }else{
 25071              utf8_printf(stderr, "ambiguous limit: \"%s\"\n", azArg[1]);
 25072              rc = 1;
 25073              goto meta_command_exit;
 25074            }
 25075          }
 25076        }
 25077        if( iLimit<0 ){
 25078          utf8_printf(stderr, "unknown limit: \"%s\"\n"
 25079                          "enter \".limits\" with no arguments for a list.\n",
 25080                           azArg[1]);
 25081          rc = 1;
 25082          goto meta_command_exit;
 25083        }
 25084        if( nArg==3 ){
 25085          sqlite3_limit(p->db, aLimit[iLimit].limitCode,
 25086                        (int)integerValue(azArg[2]));
 25087        }
 25088        printf("%20s %d\n", aLimit[iLimit].zLimitName,
 25089               sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1));
 25090      }
 25091    }else
 25092  
 25093    if( c=='l' && n>2 && cli_strncmp(azArg[0], "lint", n)==0 ){
 25094      open_db(p, 0);
 25095      lintDotCommand(p, azArg, nArg);
 25096    }else
 25097  
 25098  #if !defined(SQLITE_OMIT_LOAD_EXTENSION) && !defined(SQLITE_SHELL_FIDDLE)
 25099    if( c=='l' && cli_strncmp(azArg[0], "load", n)==0 ){
 25100      const char *zFile, *zProc;
 25101      char *zErrMsg = 0;
 25102      failIfSafeMode(p, "cannot run .load in safe mode");
 25103      if( nArg<2 || azArg[1][0]==0 ){
 25104        /* Must have a non-empty FILE. (Will not load self.) */
 25105        raw_printf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
 25106        rc = 1;
 25107        goto meta_command_exit;
 25108      }
 25109      zFile = azArg[1];
 25110      zProc = nArg>=3 ? azArg[2] : 0;
 25111      open_db(p, 0);
 25112      rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
 25113      if( rc!=SQLITE_OK ){
 25114        utf8_printf(stderr, "Error: %s\n", zErrMsg);
 25115        sqlite3_free(zErrMsg);
 25116        rc = 1;
 25117      }
 25118    }else
 25119  #endif
 25120  
 25121    if( c=='l' && cli_strncmp(azArg[0], "log", n)==0 ){
 25122      if( nArg!=2 ){
 25123        raw_printf(stderr, "Usage: .log FILENAME\n");
 25124        rc = 1;
 25125      }else{
 25126        const char *zFile = azArg[1];
 25127        if( p->bSafeMode
 25128         && cli_strcmp(zFile,"on")!=0
 25129         && cli_strcmp(zFile,"off")!=0
 25130        ){
 25131          raw_printf(stdout, "cannot set .log to anything other "
 25132                     "than \"on\" or \"off\"\n");
 25133          zFile = "off";
 25134        }
 25135        output_file_close(p->pLog);
 25136        if( cli_strcmp(zFile,"on")==0 ) zFile = "stdout";
 25137        p->pLog = output_file_open(zFile, 0);
 25138      }
 25139    }else
 25140  
 25141    if( c=='m' && cli_strncmp(azArg[0], "mode", n)==0 ){
 25142      const char *zMode = 0;
 25143      const char *zTabname = 0;
 25144      int i, n2;
 25145      ColModeOpts cmOpts = ColModeOpts_default;
 25146      for(i=1; i<nArg; i++){
 25147        const char *z = azArg[i];
 25148        if( optionMatch(z,"wrap") && i+1<nArg ){
 25149          cmOpts.iWrap = integerValue(azArg[++i]);
 25150        }else if( optionMatch(z,"ww") ){
 25151          cmOpts.bWordWrap = 1;
 25152        }else if( optionMatch(z,"wordwrap") && i+1<nArg ){
 25153          cmOpts.bWordWrap = (u8)booleanValue(azArg[++i]);
 25154        }else if( optionMatch(z,"quote") ){
 25155          cmOpts.bQuote = 1;
 25156        }else if( optionMatch(z,"noquote") ){
 25157          cmOpts.bQuote = 0;
 25158        }else if( zMode==0 ){
 25159          zMode = z;
 25160          /* Apply defaults for qbox pseudo-mode.  If that
 25161           * overwrites already-set values, user was informed of this.
 25162           */
 25163          if( cli_strcmp(z, "qbox")==0 ){
 25164            ColModeOpts cmo = ColModeOpts_default_qbox;
 25165            zMode = "box";
 25166            cmOpts = cmo;
 25167          }
 25168        }else if( zTabname==0 ){
 25169          zTabname = z;
 25170        }else if( z[0]=='-' ){
 25171          utf8_printf(stderr, "unknown option: %s\n", z);
 25172          utf8_printf(stderr, "options:\n"
 25173                              "  --noquote\n"
 25174                              "  --quote\n"
 25175                              "  --wordwrap on/off\n"
 25176                              "  --wrap N\n"
 25177                              "  --ww\n");
 25178          rc = 1;
 25179          goto meta_command_exit;
 25180        }else{
 25181          utf8_printf(stderr, "extra argument: \"%s\"\n", z);
 25182          rc = 1;
 25183          goto meta_command_exit;
 25184        }
 25185      }
 25186      if( zMode==0 ){
 25187        if( p->mode==MODE_Column
 25188         || (p->mode>=MODE_Markdown && p->mode<=MODE_Box)
 25189        ){
 25190          raw_printf
 25191            (p->out,
 25192             "current output mode: %s --wrap %d --wordwrap %s --%squote\n",
 25193             modeDescr[p->mode], p->cmOpts.iWrap,
 25194             p->cmOpts.bWordWrap ? "on" : "off",
 25195             p->cmOpts.bQuote ? "" : "no");
 25196        }else{
 25197          raw_printf(p->out, "current output mode: %s\n", modeDescr[p->mode]);
 25198        }
 25199        zMode = modeDescr[p->mode];
 25200      }
 25201      n2 = strlen30(zMode);
 25202      if( cli_strncmp(zMode,"lines",n2)==0 ){
 25203        p->mode = MODE_Line;
 25204        sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
 25205      }else if( cli_strncmp(zMode,"columns",n2)==0 ){
 25206        p->mode = MODE_Column;
 25207        if( (p->shellFlgs & SHFLG_HeaderSet)==0 ){
 25208          p->showHeader = 1;
 25209        }
 25210        sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
 25211        p->cmOpts = cmOpts;
 25212      }else if( cli_strncmp(zMode,"list",n2)==0 ){
 25213        p->mode = MODE_List;
 25214        sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Column);
 25215        sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
 25216      }else if( cli_strncmp(zMode,"html",n2)==0 ){
 25217        p->mode = MODE_Html;
 25218      }else if( cli_strncmp(zMode,"tcl",n2)==0 ){
 25219        p->mode = MODE_Tcl;
 25220        sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space);
 25221        sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
 25222      }else if( cli_strncmp(zMode,"csv",n2)==0 ){
 25223        p->mode = MODE_Csv;
 25224        sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
 25225        sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
 25226      }else if( cli_strncmp(zMode,"tabs",n2)==0 ){
 25227        p->mode = MODE_List;
 25228        sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab);
 25229      }else if( cli_strncmp(zMode,"insert",n2)==0 ){
 25230        p->mode = MODE_Insert;
 25231        set_table_name(p, zTabname ? zTabname : "table");
 25232      }else if( cli_strncmp(zMode,"quote",n2)==0 ){
 25233        p->mode = MODE_Quote;
 25234        sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
 25235        sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
 25236      }else if( cli_strncmp(zMode,"ascii",n2)==0 ){
 25237        p->mode = MODE_Ascii;
 25238        sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit);
 25239        sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record);
 25240      }else if( cli_strncmp(zMode,"markdown",n2)==0 ){
 25241        p->mode = MODE_Markdown;
 25242        p->cmOpts = cmOpts;
 25243      }else if( cli_strncmp(zMode,"table",n2)==0 ){
 25244        p->mode = MODE_Table;
 25245        p->cmOpts = cmOpts;
 25246      }else if( cli_strncmp(zMode,"box",n2)==0 ){
 25247        p->mode = MODE_Box;
 25248        p->cmOpts = cmOpts;
 25249      }else if( cli_strncmp(zMode,"count",n2)==0 ){
 25250        p->mode = MODE_Count;
 25251      }else if( cli_strncmp(zMode,"off",n2)==0 ){
 25252        p->mode = MODE_Off;
 25253      }else if( cli_strncmp(zMode,"json",n2)==0 ){
 25254        p->mode = MODE_Json;
 25255      }else{
 25256        raw_printf(stderr, "Error: mode should be one of: "
 25257           "ascii box column csv html insert json line list markdown "
 25258           "qbox quote table tabs tcl\n");
 25259        rc = 1;
 25260      }
 25261      p->cMode = p->mode;
 25262    }else
 25263  
 25264  #ifndef SQLITE_SHELL_FIDDLE
 25265    if( c=='n' && cli_strcmp(azArg[0], "nonce")==0 ){
 25266      if( nArg!=2 ){
 25267        raw_printf(stderr, "Usage: .nonce NONCE\n");
 25268        rc = 1;
 25269      }else if( p->zNonce==0 || cli_strcmp(azArg[1],p->zNonce)!=0 ){
 25270        raw_printf(stderr, "line %d: incorrect nonce: \"%s\"\n",
 25271                   p->lineno, azArg[1]);
 25272        exit(1);
 25273      }else{
 25274        p->bSafeMode = 0;
 25275        return 0;  /* Return immediately to bypass the safe mode reset
 25276                   ** at the end of this procedure */
 25277      }
 25278    }else
 25279  #endif /* !defined(SQLITE_SHELL_FIDDLE) */
 25280  
 25281    if( c=='n' && cli_strncmp(azArg[0], "nullvalue", n)==0 ){
 25282      if( nArg==2 ){
 25283        sqlite3_snprintf(sizeof(p->nullValue), p->nullValue,
 25284                         "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]);
 25285      }else{
 25286        raw_printf(stderr, "Usage: .nullvalue STRING\n");
 25287        rc = 1;
 25288      }
 25289    }else
 25290  
 25291    if( c=='o' && cli_strncmp(azArg[0], "open", n)==0 && n>=2 ){
 25292      const char *zFN = 0;     /* Pointer to constant filename */
 25293      char *zNewFilename = 0;  /* Name of the database file to open */
 25294      int iName = 1;           /* Index in azArg[] of the filename */
 25295      int newFlag = 0;         /* True to delete file before opening */
 25296      int openMode = SHELL_OPEN_UNSPEC;
 25297  
 25298      /* Check for command-line arguments */
 25299      for(iName=1; iName<nArg; iName++){
 25300        const char *z = azArg[iName];
 25301  #ifndef SQLITE_SHELL_FIDDLE
 25302        if( optionMatch(z,"new") ){
 25303          newFlag = 1;
 25304  #ifdef SQLITE_HAVE_ZLIB
 25305        }else if( optionMatch(z, "zip") ){
 25306          openMode = SHELL_OPEN_ZIPFILE;
 25307  #endif
 25308        }else if( optionMatch(z, "append") ){
 25309          openMode = SHELL_OPEN_APPENDVFS;
 25310        }else if( optionMatch(z, "readonly") ){
 25311          openMode = SHELL_OPEN_READONLY;
 25312        }else if( optionMatch(z, "nofollow") ){
 25313          p->openFlags |= SQLITE_OPEN_NOFOLLOW;
 25314  #ifndef SQLITE_OMIT_DESERIALIZE
 25315        }else if( optionMatch(z, "deserialize") ){
 25316          openMode = SHELL_OPEN_DESERIALIZE;
 25317        }else if( optionMatch(z, "hexdb") ){
 25318          openMode = SHELL_OPEN_HEXDB;
 25319        }else if( optionMatch(z, "maxsize") && iName+1<nArg ){
 25320          p->szMax = integerValue(azArg[++iName]);
 25321  #endif /* SQLITE_OMIT_DESERIALIZE */
 25322        }else
 25323  #endif /* !SQLITE_SHELL_FIDDLE */
 25324        if( z[0]=='-' ){
 25325          utf8_printf(stderr, "unknown option: %s\n", z);
 25326          rc = 1;
 25327          goto meta_command_exit;
 25328        }else if( zFN ){
 25329          utf8_printf(stderr, "extra argument: \"%s\"\n", z);
 25330          rc = 1;
 25331          goto meta_command_exit;
 25332        }else{
 25333          zFN = z;
 25334        }
 25335      }
 25336  
 25337      /* Close the existing database */
 25338      session_close_all(p, -1);
 25339      close_db(p->db);
 25340      p->db = 0;
 25341      p->pAuxDb->zDbFilename = 0;
 25342      sqlite3_free(p->pAuxDb->zFreeOnClose);
 25343      p->pAuxDb->zFreeOnClose = 0;
 25344      p->openMode = openMode;
 25345      p->openFlags = 0;
 25346      p->szMax = 0;
 25347  
 25348      /* If a filename is specified, try to open it first */
 25349      if( zFN || p->openMode==SHELL_OPEN_HEXDB ){
 25350        if( newFlag && zFN && !p->bSafeMode ) shellDeleteFile(zFN);
 25351  #ifndef SQLITE_SHELL_FIDDLE
 25352        if( p->bSafeMode
 25353         && p->openMode!=SHELL_OPEN_HEXDB
 25354         && zFN
 25355         && cli_strcmp(zFN,":memory:")!=0
 25356        ){
 25357          failIfSafeMode(p, "cannot open disk-based database files in safe mode");
 25358        }
 25359  #else
 25360        /* WASM mode has its own sandboxed pseudo-filesystem. */
 25361  #endif
 25362        if( zFN ){
 25363          zNewFilename = sqlite3_mprintf("%s", zFN);
 25364          shell_check_oom(zNewFilename);
 25365        }else{
 25366          zNewFilename = 0;
 25367        }
 25368        p->pAuxDb->zDbFilename = zNewFilename;
 25369        open_db(p, OPEN_DB_KEEPALIVE);
 25370        if( p->db==0 ){
 25371          utf8_printf(stderr, "Error: cannot open '%s'\n", zNewFilename);
 25372          sqlite3_free(zNewFilename);
 25373        }else{
 25374          p->pAuxDb->zFreeOnClose = zNewFilename;
 25375        }
 25376      }
 25377      if( p->db==0 ){
 25378        /* As a fall-back open a TEMP database */
 25379        p->pAuxDb->zDbFilename = 0;
 25380        open_db(p, 0);
 25381      }
 25382    }else
 25383  
 25384  #ifndef SQLITE_SHELL_FIDDLE
 25385    if( (c=='o'
 25386          && (cli_strncmp(azArg[0], "output", n)==0
 25387              || cli_strncmp(azArg[0], "once", n)==0))
 25388     || (c=='e' && n==5 && cli_strcmp(azArg[0],"excel")==0)
 25389    ){
 25390      char *zFile = 0;
 25391      int bTxtMode = 0;
 25392      int i;
 25393      int eMode = 0;
 25394      int bOnce = 0;            /* 0: .output, 1: .once, 2: .excel */
 25395      unsigned char zBOM[4];    /* Byte-order mark to using if --bom is present */
 25396  
 25397      zBOM[0] = 0;
 25398      failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
 25399      if( c=='e' ){
 25400        eMode = 'x';
 25401        bOnce = 2;
 25402      }else if( cli_strncmp(azArg[0],"once",n)==0 ){
 25403        bOnce = 1;
 25404      }
 25405      for(i=1; i<nArg; i++){
 25406        char *z = azArg[i];
 25407        if( z[0]=='-' ){
 25408          if( z[1]=='-' ) z++;
 25409          if( cli_strcmp(z,"-bom")==0 ){
 25410            zBOM[0] = 0xef;
 25411            zBOM[1] = 0xbb;
 25412            zBOM[2] = 0xbf;
 25413            zBOM[3] = 0;
 25414          }else if( c!='e' && cli_strcmp(z,"-x")==0 ){
 25415            eMode = 'x';  /* spreadsheet */
 25416          }else if( c!='e' && cli_strcmp(z,"-e")==0 ){
 25417            eMode = 'e';  /* text editor */
 25418          }else{
 25419            utf8_printf(p->out, "ERROR: unknown option: \"%s\".  Usage:\n",
 25420                        azArg[i]);
 25421            showHelp(p->out, azArg[0]);
 25422            rc = 1;
 25423            goto meta_command_exit;
 25424          }
 25425        }else if( zFile==0 && eMode!='e' && eMode!='x' ){
 25426          zFile = sqlite3_mprintf("%s", z);
 25427          if( zFile && zFile[0]=='|' ){
 25428            while( i+1<nArg ) zFile = sqlite3_mprintf("%z %s", zFile, azArg[++i]);
 25429            break;
 25430          }
 25431        }else{
 25432          utf8_printf(p->out,"ERROR: extra parameter: \"%s\".  Usage:\n",
 25433                      azArg[i]);
 25434          showHelp(p->out, azArg[0]);
 25435          rc = 1;
 25436          sqlite3_free(zFile);
 25437          goto meta_command_exit;
 25438        }
 25439      }
 25440      if( zFile==0 ){
 25441        zFile = sqlite3_mprintf("stdout");
 25442      }
 25443      if( bOnce ){
 25444        p->outCount = 2;
 25445      }else{
 25446        p->outCount = 0;
 25447      }
 25448      output_reset(p);
 25449  #ifndef SQLITE_NOHAVE_SYSTEM
 25450      if( eMode=='e' || eMode=='x' ){
 25451        p->doXdgOpen = 1;
 25452        outputModePush(p);
 25453        if( eMode=='x' ){
 25454          /* spreadsheet mode.  Output as CSV. */
 25455          newTempFile(p, "csv");
 25456          ShellClearFlag(p, SHFLG_Echo);
 25457          p->mode = MODE_Csv;
 25458          sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
 25459          sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
 25460        }else{
 25461          /* text editor mode */
 25462          newTempFile(p, "txt");
 25463          bTxtMode = 1;
 25464        }
 25465        sqlite3_free(zFile);
 25466        zFile = sqlite3_mprintf("%s", p->zTempFile);
 25467      }
 25468  #endif /* SQLITE_NOHAVE_SYSTEM */
 25469      shell_check_oom(zFile);
 25470      if( zFile[0]=='|' ){
 25471  #ifdef SQLITE_OMIT_POPEN
 25472        raw_printf(stderr, "Error: pipes are not supported in this OS\n");
 25473        rc = 1;
 25474        p->out = stdout;
 25475  #else
 25476        p->out = popen(zFile + 1, "w");
 25477        if( p->out==0 ){
 25478          utf8_printf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
 25479          p->out = stdout;
 25480          rc = 1;
 25481        }else{
 25482          if( zBOM[0] ) fwrite(zBOM, 1, 3, p->out);
 25483          sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
 25484        }
 25485  #endif
 25486      }else{
 25487        p->out = output_file_open(zFile, bTxtMode);
 25488        if( p->out==0 ){
 25489          if( cli_strcmp(zFile,"off")!=0 ){
 25490            utf8_printf(stderr,"Error: cannot write to \"%s\"\n", zFile);
 25491          }
 25492          p->out = stdout;
 25493          rc = 1;
 25494        } else {
 25495          if( zBOM[0] ) fwrite(zBOM, 1, 3, p->out);
 25496          sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
 25497        }
 25498      }
 25499      sqlite3_free(zFile);
 25500    }else
 25501  #endif /* !defined(SQLITE_SHELL_FIDDLE) */
 25502  
 25503    if( c=='p' && n>=3 && cli_strncmp(azArg[0], "parameter", n)==0 ){
 25504      open_db(p,0);
 25505      if( nArg<=1 ) goto parameter_syntax_error;
 25506  
 25507      /* .parameter clear
 25508      ** Clear all bind parameters by dropping the TEMP table that holds them.
 25509      */
 25510      if( nArg==2 && cli_strcmp(azArg[1],"clear")==0 ){
 25511        sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp.sqlite_parameters;",
 25512                     0, 0, 0);
 25513      }else
 25514  
 25515      /* .parameter list
 25516      ** List all bind parameters.
 25517      */
 25518      if( nArg==2 && cli_strcmp(azArg[1],"list")==0 ){
 25519        sqlite3_stmt *pStmt = 0;
 25520        int rx;
 25521        int len = 0;
 25522        rx = sqlite3_prepare_v2(p->db,
 25523               "SELECT max(length(key)) "
 25524               "FROM temp.sqlite_parameters;", -1, &pStmt, 0);
 25525        if( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
 25526          len = sqlite3_column_int(pStmt, 0);
 25527          if( len>40 ) len = 40;
 25528        }
 25529        sqlite3_finalize(pStmt);
 25530        pStmt = 0;
 25531        if( len ){
 25532          rx = sqlite3_prepare_v2(p->db,
 25533               "SELECT key, quote(value) "
 25534               "FROM temp.sqlite_parameters;", -1, &pStmt, 0);
 25535          while( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
 25536            utf8_printf(p->out, "%-*s %s\n", len, sqlite3_column_text(pStmt,0),
 25537                        sqlite3_column_text(pStmt,1));
 25538          }
 25539          sqlite3_finalize(pStmt);
 25540        }
 25541      }else
 25542  
 25543      /* .parameter init
 25544      ** Make sure the TEMP table used to hold bind parameters exists.
 25545      ** Create it if necessary.
 25546      */
 25547      if( nArg==2 && cli_strcmp(azArg[1],"init")==0 ){
 25548        bind_table_init(p);
 25549      }else
 25550  
 25551      /* .parameter set NAME VALUE
 25552      ** Set or reset a bind parameter.  NAME should be the full parameter
 25553      ** name exactly as it appears in the query.  (ex: $abc, @def).  The
 25554      ** VALUE can be in either SQL literal notation, or if not it will be
 25555      ** understood to be a text string.
 25556      */
 25557      if( nArg==4 && cli_strcmp(azArg[1],"set")==0 ){
 25558        int rx;
 25559        char *zSql;
 25560        sqlite3_stmt *pStmt;
 25561        const char *zKey = azArg[2];
 25562        const char *zValue = azArg[3];
 25563        bind_table_init(p);
 25564        zSql = sqlite3_mprintf(
 25565                    "REPLACE INTO temp.sqlite_parameters(key,value)"
 25566                    "VALUES(%Q,%s);", zKey, zValue);
 25567        shell_check_oom(zSql);
 25568        pStmt = 0;
 25569        rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
 25570        sqlite3_free(zSql);
 25571        if( rx!=SQLITE_OK ){
 25572          sqlite3_finalize(pStmt);
 25573          pStmt = 0;
 25574          zSql = sqlite3_mprintf(
 25575                     "REPLACE INTO temp.sqlite_parameters(key,value)"
 25576                     "VALUES(%Q,%Q);", zKey, zValue);
 25577          shell_check_oom(zSql);
 25578          rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
 25579          sqlite3_free(zSql);
 25580          if( rx!=SQLITE_OK ){
 25581            utf8_printf(p->out, "Error: %s\n", sqlite3_errmsg(p->db));
 25582            sqlite3_finalize(pStmt);
 25583            pStmt = 0;
 25584            rc = 1;
 25585          }
 25586        }
 25587        sqlite3_step(pStmt);
 25588        sqlite3_finalize(pStmt);
 25589      }else
 25590  
 25591      /* .parameter unset NAME
 25592      ** Remove the NAME binding from the parameter binding table, if it
 25593      ** exists.
 25594      */
 25595      if( nArg==3 && cli_strcmp(azArg[1],"unset")==0 ){
 25596        char *zSql = sqlite3_mprintf(
 25597            "DELETE FROM temp.sqlite_parameters WHERE key=%Q", azArg[2]);
 25598        shell_check_oom(zSql);
 25599        sqlite3_exec(p->db, zSql, 0, 0, 0);
 25600        sqlite3_free(zSql);
 25601      }else
 25602      /* If no command name matches, show a syntax error */
 25603      parameter_syntax_error:
 25604      showHelp(p->out, "parameter");
 25605    }else
 25606  
 25607    if( c=='p' && n>=3 && cli_strncmp(azArg[0], "print", n)==0 ){
 25608      int i;
 25609      for(i=1; i<nArg; i++){
 25610        if( i>1 ) raw_printf(p->out, " ");
 25611        utf8_printf(p->out, "%s", azArg[i]);
 25612      }
 25613      raw_printf(p->out, "\n");
 25614    }else
 25615  
 25616  #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
 25617    if( c=='p' && n>=3 && cli_strncmp(azArg[0], "progress", n)==0 ){
 25618      int i;
 25619      int nn = 0;
 25620      p->flgProgress = 0;
 25621      p->mxProgress = 0;
 25622      p->nProgress = 0;
 25623      for(i=1; i<nArg; i++){
 25624        const char *z = azArg[i];
 25625        if( z[0]=='-' ){
 25626          z++;
 25627          if( z[0]=='-' ) z++;
 25628          if( cli_strcmp(z,"quiet")==0 || cli_strcmp(z,"q")==0 ){
 25629            p->flgProgress |= SHELL_PROGRESS_QUIET;
 25630            continue;
 25631          }
 25632          if( cli_strcmp(z,"reset")==0 ){
 25633            p->flgProgress |= SHELL_PROGRESS_RESET;
 25634            continue;
 25635          }
 25636          if( cli_strcmp(z,"once")==0 ){
 25637            p->flgProgress |= SHELL_PROGRESS_ONCE;
 25638            continue;
 25639          }
 25640          if( cli_strcmp(z,"limit")==0 ){
 25641            if( i+1>=nArg ){
 25642              utf8_printf(stderr, "Error: missing argument on --limit\n");
 25643              rc = 1;
 25644              goto meta_command_exit;
 25645            }else{
 25646              p->mxProgress = (int)integerValue(azArg[++i]);
 25647            }
 25648            continue;
 25649          }
 25650          utf8_printf(stderr, "Error: unknown option: \"%s\"\n", azArg[i]);
 25651          rc = 1;
 25652          goto meta_command_exit;
 25653        }else{
 25654          nn = (int)integerValue(z);
 25655        }
 25656      }
 25657      open_db(p, 0);
 25658      sqlite3_progress_handler(p->db, nn, progress_handler, p);
 25659    }else
 25660  #endif /* SQLITE_OMIT_PROGRESS_CALLBACK */
 25661  
 25662    if( c=='p' && cli_strncmp(azArg[0], "prompt", n)==0 ){
 25663      if( nArg >= 2) {
 25664        shell_strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
 25665      }
 25666      if( nArg >= 3) {
 25667        shell_strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
 25668      }
 25669    }else
 25670  
 25671  #ifndef SQLITE_SHELL_FIDDLE
 25672    if( c=='q' && cli_strncmp(azArg[0], "quit", n)==0 ){
 25673      rc = 2;
 25674    }else
 25675  #endif
 25676  
 25677  #ifndef SQLITE_SHELL_FIDDLE
 25678    if( c=='r' && n>=3 && cli_strncmp(azArg[0], "read", n)==0 ){
 25679      FILE *inSaved = p->in;
 25680      int savedLineno = p->lineno;
 25681      failIfSafeMode(p, "cannot run .read in safe mode");
 25682      if( nArg!=2 ){
 25683        raw_printf(stderr, "Usage: .read FILE\n");
 25684        rc = 1;
 25685        goto meta_command_exit;
 25686      }
 25687      if( azArg[1][0]=='|' ){
 25688  #ifdef SQLITE_OMIT_POPEN
 25689        raw_printf(stderr, "Error: pipes are not supported in this OS\n");
 25690        rc = 1;
 25691        p->out = stdout;
 25692  #else
 25693        p->in = popen(azArg[1]+1, "r");
 25694        if( p->in==0 ){
 25695          utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
 25696          rc = 1;
 25697        }else{
 25698          rc = process_input(p);
 25699          pclose(p->in);
 25700        }
 25701  #endif
 25702      }else if( (p->in = openChrSource(azArg[1]))==0 ){
 25703        utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
 25704        rc = 1;
 25705      }else{
 25706        rc = process_input(p);
 25707        fclose(p->in);
 25708      }
 25709      p->in = inSaved;
 25710      p->lineno = savedLineno;
 25711    }else
 25712  #endif /* !defined(SQLITE_SHELL_FIDDLE) */
 25713  
 25714  #ifndef SQLITE_SHELL_FIDDLE
 25715    if( c=='r' && n>=3 && cli_strncmp(azArg[0], "restore", n)==0 ){
 25716      const char *zSrcFile;
 25717      const char *zDb;
 25718      sqlite3 *pSrc;
 25719      sqlite3_backup *pBackup;
 25720      int nTimeout = 0;
 25721  
 25722      failIfSafeMode(p, "cannot run .restore in safe mode");
 25723      if( nArg==2 ){
 25724        zSrcFile = azArg[1];
 25725        zDb = "main";
 25726      }else if( nArg==3 ){
 25727        zSrcFile = azArg[2];
 25728        zDb = azArg[1];
 25729      }else{
 25730        raw_printf(stderr, "Usage: .restore ?DB? FILE\n");
 25731        rc = 1;
 25732        goto meta_command_exit;
 25733      }
 25734      rc = sqlite3_open(zSrcFile, &pSrc);
 25735      if( rc!=SQLITE_OK ){
 25736        utf8_printf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
 25737        close_db(pSrc);
 25738        return 1;
 25739      }
 25740      open_db(p, 0);
 25741      pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
 25742      if( pBackup==0 ){
 25743        utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
 25744        close_db(pSrc);
 25745        return 1;
 25746      }
 25747      while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
 25748            || rc==SQLITE_BUSY  ){
 25749        if( rc==SQLITE_BUSY ){
 25750          if( nTimeout++ >= 3 ) break;
 25751          sqlite3_sleep(100);
 25752        }
 25753      }
 25754      sqlite3_backup_finish(pBackup);
 25755      if( rc==SQLITE_DONE ){
 25756        rc = 0;
 25757      }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
 25758        raw_printf(stderr, "Error: source database is busy\n");
 25759        rc = 1;
 25760      }else{
 25761        utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
 25762        rc = 1;
 25763      }
 25764      close_db(pSrc);
 25765    }else
 25766  #endif /* !defined(SQLITE_SHELL_FIDDLE) */
 25767  
 25768    if( c=='s' && cli_strncmp(azArg[0], "scanstats", n)==0 ){
 25769      if( nArg==2 ){
 25770        if( cli_strcmp(azArg[1], "vm")==0 ){
 25771          p->scanstatsOn = 3;
 25772        }else
 25773        if( cli_strcmp(azArg[1], "est")==0 ){
 25774          p->scanstatsOn = 2;
 25775        }else{
 25776          p->scanstatsOn = (u8)booleanValue(azArg[1]);
 25777        }
 25778        open_db(p, 0);
 25779        sqlite3_db_config(
 25780            p->db, SQLITE_DBCONFIG_STMT_SCANSTATUS, p->scanstatsOn, (int*)0
 25781        );
 25782  #ifndef SQLITE_ENABLE_STMT_SCANSTATUS
 25783        raw_printf(stderr, "Warning: .scanstats not available in this build.\n");
 25784  #endif
 25785      }else{
 25786        raw_printf(stderr, "Usage: .scanstats on|off|est\n");
 25787        rc = 1;
 25788      }
 25789    }else
 25790  
 25791    if( c=='s' && cli_strncmp(azArg[0], "schema", n)==0 ){
 25792      ShellText sSelect;
 25793      ShellState data;
 25794      char *zErrMsg = 0;
 25795      const char *zDiv = "(";
 25796      const char *zName = 0;
 25797      int iSchema = 0;
 25798      int bDebug = 0;
 25799      int bNoSystemTabs = 0;
 25800      int ii;
 25801  
 25802      open_db(p, 0);
 25803      memcpy(&data, p, sizeof(data));
 25804      data.showHeader = 0;
 25805      data.cMode = data.mode = MODE_Semi;
 25806      initText(&sSelect);
 25807      for(ii=1; ii<nArg; ii++){
 25808        if( optionMatch(azArg[ii],"indent") ){
 25809          data.cMode = data.mode = MODE_Pretty;
 25810        }else if( optionMatch(azArg[ii],"debug") ){
 25811          bDebug = 1;
 25812        }else if( optionMatch(azArg[ii],"nosys") ){
 25813          bNoSystemTabs = 1;
 25814        }else if( azArg[ii][0]=='-' ){
 25815          utf8_printf(stderr, "Unknown option: \"%s\"\n", azArg[ii]);
 25816          rc = 1;
 25817          goto meta_command_exit;
 25818        }else if( zName==0 ){
 25819          zName = azArg[ii];
 25820        }else{
 25821          raw_printf(stderr,
 25822                     "Usage: .schema ?--indent? ?--nosys? ?LIKE-PATTERN?\n");
 25823          rc = 1;
 25824          goto meta_command_exit;
 25825        }
 25826      }
 25827      if( zName!=0 ){
 25828        int isSchema = sqlite3_strlike(zName, "sqlite_master", '\\')==0
 25829                    || sqlite3_strlike(zName, "sqlite_schema", '\\')==0
 25830                    || sqlite3_strlike(zName,"sqlite_temp_master", '\\')==0
 25831                    || sqlite3_strlike(zName,"sqlite_temp_schema", '\\')==0;
 25832        if( isSchema ){
 25833          char *new_argv[2], *new_colv[2];
 25834          new_argv[0] = sqlite3_mprintf(
 25835                        "CREATE TABLE %s (\n"
 25836                        "  type text,\n"
 25837                        "  name text,\n"
 25838                        "  tbl_name text,\n"
 25839                        "  rootpage integer,\n"
 25840                        "  sql text\n"
 25841                        ")", zName);
 25842          shell_check_oom(new_argv[0]);
 25843          new_argv[1] = 0;
 25844          new_colv[0] = "sql";
 25845          new_colv[1] = 0;
 25846          callback(&data, 1, new_argv, new_colv);
 25847          sqlite3_free(new_argv[0]);
 25848        }
 25849      }
 25850      if( zDiv ){
 25851        sqlite3_stmt *pStmt = 0;
 25852        rc = sqlite3_prepare_v2(p->db, "SELECT name FROM pragma_database_list",
 25853                                -1, &pStmt, 0);
 25854        if( rc ){
 25855          utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
 25856          sqlite3_finalize(pStmt);
 25857          rc = 1;
 25858          goto meta_command_exit;
 25859        }
 25860        appendText(&sSelect, "SELECT sql FROM", 0);
 25861        iSchema = 0;
 25862        while( sqlite3_step(pStmt)==SQLITE_ROW ){
 25863          const char *zDb = (const char*)sqlite3_column_text(pStmt, 0);
 25864          char zScNum[30];
 25865          sqlite3_snprintf(sizeof(zScNum), zScNum, "%d", ++iSchema);
 25866          appendText(&sSelect, zDiv, 0);
 25867          zDiv = " UNION ALL ";
 25868          appendText(&sSelect, "SELECT shell_add_schema(sql,", 0);
 25869          if( sqlite3_stricmp(zDb, "main")!=0 ){
 25870            appendText(&sSelect, zDb, '\'');
 25871          }else{
 25872            appendText(&sSelect, "NULL", 0);
 25873          }
 25874          appendText(&sSelect, ",name) AS sql, type, tbl_name, name, rowid,", 0);
 25875          appendText(&sSelect, zScNum, 0);
 25876          appendText(&sSelect, " AS snum, ", 0);
 25877          appendText(&sSelect, zDb, '\'');
 25878          appendText(&sSelect, " AS sname FROM ", 0);
 25879          appendText(&sSelect, zDb, quoteChar(zDb));
 25880          appendText(&sSelect, ".sqlite_schema", 0);
 25881        }
 25882        sqlite3_finalize(pStmt);
 25883  #ifndef SQLITE_OMIT_INTROSPECTION_PRAGMAS
 25884        if( zName ){
 25885          appendText(&sSelect,
 25886             " UNION ALL SELECT shell_module_schema(name),"
 25887             " 'table', name, name, name, 9e+99, 'main' FROM pragma_module_list",
 25888          0);
 25889        }
 25890  #endif
 25891        appendText(&sSelect, ") WHERE ", 0);
 25892        if( zName ){
 25893          char *zQarg = sqlite3_mprintf("%Q", zName);
 25894          int bGlob;
 25895          shell_check_oom(zQarg);
 25896          bGlob = strchr(zName, '*') != 0 || strchr(zName, '?') != 0 ||
 25897                  strchr(zName, '[') != 0;
 25898          if( strchr(zName, '.') ){
 25899            appendText(&sSelect, "lower(printf('%s.%s',sname,tbl_name))", 0);
 25900          }else{
 25901            appendText(&sSelect, "lower(tbl_name)", 0);
 25902          }
 25903          appendText(&sSelect, bGlob ? " GLOB " : " LIKE ", 0);
 25904          appendText(&sSelect, zQarg, 0);
 25905          if( !bGlob ){
 25906            appendText(&sSelect, " ESCAPE '\\' ", 0);
 25907          }
 25908          appendText(&sSelect, " AND ", 0);
 25909          sqlite3_free(zQarg);
 25910        }
 25911        if( bNoSystemTabs ){
 25912          appendText(&sSelect, "name NOT LIKE 'sqlite_%%' AND ", 0);
 25913        }
 25914        appendText(&sSelect, "sql IS NOT NULL"
 25915                             " ORDER BY snum, rowid", 0);
 25916        if( bDebug ){
 25917          utf8_printf(p->out, "SQL: %s;\n", sSelect.z);
 25918        }else{
 25919          rc = sqlite3_exec(p->db, sSelect.z, callback, &data, &zErrMsg);
 25920        }
 25921        freeText(&sSelect);
 25922      }
 25923      if( zErrMsg ){
 25924        utf8_printf(stderr,"Error: %s\n", zErrMsg);
 25925        sqlite3_free(zErrMsg);
 25926        rc = 1;
 25927      }else if( rc != SQLITE_OK ){
 25928        raw_printf(stderr,"Error: querying schema information\n");
 25929        rc = 1;
 25930      }else{
 25931        rc = 0;
 25932      }
 25933    }else
 25934  
 25935    if( (c=='s' && n==11 && cli_strncmp(azArg[0], "selecttrace", n)==0)
 25936     || (c=='t' && n==9  && cli_strncmp(azArg[0], "treetrace", n)==0)
 25937    ){
 25938      unsigned int x = nArg>=2? (unsigned int)integerValue(azArg[1]) : 0xffffffff;
 25939      sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &x);
 25940    }else
 25941  
 25942  #if defined(SQLITE_ENABLE_SESSION)
 25943    if( c=='s' && cli_strncmp(azArg[0],"session",n)==0 && n>=3 ){
 25944      struct AuxDb *pAuxDb = p->pAuxDb;
 25945      OpenSession *pSession = &pAuxDb->aSession[0];
 25946      char **azCmd = &azArg[1];
 25947      int iSes = 0;
 25948      int nCmd = nArg - 1;
 25949      int i;
 25950      if( nArg<=1 ) goto session_syntax_error;
 25951      open_db(p, 0);
 25952      if( nArg>=3 ){
 25953        for(iSes=0; iSes<pAuxDb->nSession; iSes++){
 25954          if( cli_strcmp(pAuxDb->aSession[iSes].zName, azArg[1])==0 ) break;
 25955        }
 25956        if( iSes<pAuxDb->nSession ){
 25957          pSession = &pAuxDb->aSession[iSes];
 25958          azCmd++;
 25959          nCmd--;
 25960        }else{
 25961          pSession = &pAuxDb->aSession[0];
 25962          iSes = 0;
 25963        }
 25964      }
 25965  
 25966      /* .session attach TABLE
 25967      ** Invoke the sqlite3session_attach() interface to attach a particular
 25968      ** table so that it is never filtered.
 25969      */
 25970      if( cli_strcmp(azCmd[0],"attach")==0 ){
 25971        if( nCmd!=2 ) goto session_syntax_error;
 25972        if( pSession->p==0 ){
 25973          session_not_open:
 25974          raw_printf(stderr, "ERROR: No sessions are open\n");
 25975        }else{
 25976          rc = sqlite3session_attach(pSession->p, azCmd[1]);
 25977          if( rc ){
 25978            raw_printf(stderr, "ERROR: sqlite3session_attach() returns %d\n", rc);
 25979            rc = 0;
 25980          }
 25981        }
 25982      }else
 25983  
 25984      /* .session changeset FILE
 25985      ** .session patchset FILE
 25986      ** Write a changeset or patchset into a file.  The file is overwritten.
 25987      */
 25988      if( cli_strcmp(azCmd[0],"changeset")==0
 25989       || cli_strcmp(azCmd[0],"patchset")==0
 25990      ){
 25991        FILE *out = 0;
 25992        failIfSafeMode(p, "cannot run \".session %s\" in safe mode", azCmd[0]);
 25993        if( nCmd!=2 ) goto session_syntax_error;
 25994        if( pSession->p==0 ) goto session_not_open;
 25995        out = fopen(azCmd[1], "wb");
 25996        if( out==0 ){
 25997          utf8_printf(stderr, "ERROR: cannot open \"%s\" for writing\n",
 25998                      azCmd[1]);
 25999        }else{
 26000          int szChng;
 26001          void *pChng;
 26002          if( azCmd[0][0]=='c' ){
 26003            rc = sqlite3session_changeset(pSession->p, &szChng, &pChng);
 26004          }else{
 26005            rc = sqlite3session_patchset(pSession->p, &szChng, &pChng);
 26006          }
 26007          if( rc ){
 26008            printf("Error: error code %d\n", rc);
 26009            rc = 0;
 26010          }
 26011          if( pChng
 26012            && fwrite(pChng, szChng, 1, out)!=1 ){
 26013            raw_printf(stderr, "ERROR: Failed to write entire %d-byte output\n",
 26014                    szChng);
 26015          }
 26016          sqlite3_free(pChng);
 26017          fclose(out);
 26018        }
 26019      }else
 26020  
 26021      /* .session close
 26022      ** Close the identified session
 26023      */
 26024      if( cli_strcmp(azCmd[0], "close")==0 ){
 26025        if( nCmd!=1 ) goto session_syntax_error;
 26026        if( pAuxDb->nSession ){
 26027          session_close(pSession);
 26028          pAuxDb->aSession[iSes] = pAuxDb->aSession[--pAuxDb->nSession];
 26029        }
 26030      }else
 26031  
 26032      /* .session enable ?BOOLEAN?
 26033      ** Query or set the enable flag
 26034      */
 26035      if( cli_strcmp(azCmd[0], "enable")==0 ){
 26036        int ii;
 26037        if( nCmd>2 ) goto session_syntax_error;
 26038        ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
 26039        if( pAuxDb->nSession ){
 26040          ii = sqlite3session_enable(pSession->p, ii);
 26041          utf8_printf(p->out, "session %s enable flag = %d\n",
 26042                      pSession->zName, ii);
 26043        }
 26044      }else
 26045  
 26046      /* .session filter GLOB ....
 26047      ** Set a list of GLOB patterns of table names to be excluded.
 26048      */
 26049      if( cli_strcmp(azCmd[0], "filter")==0 ){
 26050        int ii, nByte;
 26051        if( nCmd<2 ) goto session_syntax_error;
 26052        if( pAuxDb->nSession ){
 26053          for(ii=0; ii<pSession->nFilter; ii++){
 26054            sqlite3_free(pSession->azFilter[ii]);
 26055          }
 26056          sqlite3_free(pSession->azFilter);
 26057          nByte = sizeof(pSession->azFilter[0])*(nCmd-1);
 26058          pSession->azFilter = sqlite3_malloc( nByte );
 26059          if( pSession->azFilter==0 ){
 26060            raw_printf(stderr, "Error: out or memory\n");
 26061            exit(1);
 26062          }
 26063          for(ii=1; ii<nCmd; ii++){
 26064            char *x = pSession->azFilter[ii-1] = sqlite3_mprintf("%s", azCmd[ii]);
 26065            shell_check_oom(x);
 26066          }
 26067          pSession->nFilter = ii-1;
 26068        }
 26069      }else
 26070  
 26071      /* .session indirect ?BOOLEAN?
 26072      ** Query or set the indirect flag
 26073      */
 26074      if( cli_strcmp(azCmd[0], "indirect")==0 ){
 26075        int ii;
 26076        if( nCmd>2 ) goto session_syntax_error;
 26077        ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
 26078        if( pAuxDb->nSession ){
 26079          ii = sqlite3session_indirect(pSession->p, ii);
 26080          utf8_printf(p->out, "session %s indirect flag = %d\n",
 26081                      pSession->zName, ii);
 26082        }
 26083      }else
 26084  
 26085      /* .session isempty
 26086      ** Determine if the session is empty
 26087      */
 26088      if( cli_strcmp(azCmd[0], "isempty")==0 ){
 26089        int ii;
 26090        if( nCmd!=1 ) goto session_syntax_error;
 26091        if( pAuxDb->nSession ){
 26092          ii = sqlite3session_isempty(pSession->p);
 26093          utf8_printf(p->out, "session %s isempty flag = %d\n",
 26094                      pSession->zName, ii);
 26095        }
 26096      }else
 26097  
 26098      /* .session list
 26099      ** List all currently open sessions
 26100      */
 26101      if( cli_strcmp(azCmd[0],"list")==0 ){
 26102        for(i=0; i<pAuxDb->nSession; i++){
 26103          utf8_printf(p->out, "%d %s\n", i, pAuxDb->aSession[i].zName);
 26104        }
 26105      }else
 26106  
 26107      /* .session open DB NAME
 26108      ** Open a new session called NAME on the attached database DB.
 26109      ** DB is normally "main".
 26110      */
 26111      if( cli_strcmp(azCmd[0],"open")==0 ){
 26112        char *zName;
 26113        if( nCmd!=3 ) goto session_syntax_error;
 26114        zName = azCmd[2];
 26115        if( zName[0]==0 ) goto session_syntax_error;
 26116        for(i=0; i<pAuxDb->nSession; i++){
 26117          if( cli_strcmp(pAuxDb->aSession[i].zName,zName)==0 ){
 26118            utf8_printf(stderr, "Session \"%s\" already exists\n", zName);
 26119            goto meta_command_exit;
 26120          }
 26121        }
 26122        if( pAuxDb->nSession>=ArraySize(pAuxDb->aSession) ){
 26123          raw_printf(stderr,
 26124                     "Maximum of %d sessions\n", ArraySize(pAuxDb->aSession));
 26125          goto meta_command_exit;
 26126        }
 26127        pSession = &pAuxDb->aSession[pAuxDb->nSession];
 26128        rc = sqlite3session_create(p->db, azCmd[1], &pSession->p);
 26129        if( rc ){
 26130          raw_printf(stderr, "Cannot open session: error code=%d\n", rc);
 26131          rc = 0;
 26132          goto meta_command_exit;
 26133        }
 26134        pSession->nFilter = 0;
 26135        sqlite3session_table_filter(pSession->p, session_filter, pSession);
 26136        pAuxDb->nSession++;
 26137        pSession->zName = sqlite3_mprintf("%s", zName);
 26138        shell_check_oom(pSession->zName);
 26139      }else
 26140      /* If no command name matches, show a syntax error */
 26141      session_syntax_error:
 26142      showHelp(p->out, "session");
 26143    }else
 26144  #endif
 26145  
 26146  #ifdef SQLITE_DEBUG
 26147    /* Undocumented commands for internal testing.  Subject to change
 26148    ** without notice. */
 26149    if( c=='s' && n>=10 && cli_strncmp(azArg[0], "selftest-", 9)==0 ){
 26150      if( cli_strncmp(azArg[0]+9, "boolean", n-9)==0 ){
 26151        int i, v;
 26152        for(i=1; i<nArg; i++){
 26153          v = booleanValue(azArg[i]);
 26154          utf8_printf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
 26155        }
 26156      }
 26157      if( cli_strncmp(azArg[0]+9, "integer", n-9)==0 ){
 26158        int i; sqlite3_int64 v;
 26159        for(i=1; i<nArg; i++){
 26160          char zBuf[200];
 26161          v = integerValue(azArg[i]);
 26162          sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
 26163          utf8_printf(p->out, "%s", zBuf);
 26164        }
 26165      }
 26166    }else
 26167  #endif
 26168  
 26169    if( c=='s' && n>=4 && cli_strncmp(azArg[0],"selftest",n)==0 ){
 26170      int bIsInit = 0;         /* True to initialize the SELFTEST table */
 26171      int bVerbose = 0;        /* Verbose output */
 26172      int bSelftestExists;     /* True if SELFTEST already exists */
 26173      int i, k;                /* Loop counters */
 26174      int nTest = 0;           /* Number of tests runs */
 26175      int nErr = 0;            /* Number of errors seen */
 26176      ShellText str;           /* Answer for a query */
 26177      sqlite3_stmt *pStmt = 0; /* Query against the SELFTEST table */
 26178  
 26179      open_db(p,0);
 26180      for(i=1; i<nArg; i++){
 26181        const char *z = azArg[i];
 26182        if( z[0]=='-' && z[1]=='-' ) z++;
 26183        if( cli_strcmp(z,"-init")==0 ){
 26184          bIsInit = 1;
 26185        }else
 26186        if( cli_strcmp(z,"-v")==0 ){
 26187          bVerbose++;
 26188        }else
 26189        {
 26190          utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
 26191                      azArg[i], azArg[0]);
 26192          raw_printf(stderr, "Should be one of: --init -v\n");
 26193          rc = 1;
 26194          goto meta_command_exit;
 26195        }
 26196      }
 26197      if( sqlite3_table_column_metadata(p->db,"main","selftest",0,0,0,0,0,0)
 26198             != SQLITE_OK ){
 26199        bSelftestExists = 0;
 26200      }else{
 26201        bSelftestExists = 1;
 26202      }
 26203      if( bIsInit ){
 26204        createSelftestTable(p);
 26205        bSelftestExists = 1;
 26206      }
 26207      initText(&str);
 26208      appendText(&str, "x", 0);
 26209      for(k=bSelftestExists; k>=0; k--){
 26210        if( k==1 ){
 26211          rc = sqlite3_prepare_v2(p->db,
 26212              "SELECT tno,op,cmd,ans FROM selftest ORDER BY tno",
 26213              -1, &pStmt, 0);
 26214        }else{
 26215          rc = sqlite3_prepare_v2(p->db,
 26216            "VALUES(0,'memo','Missing SELFTEST table - default checks only',''),"
 26217            "      (1,'run','PRAGMA integrity_check','ok')",
 26218            -1, &pStmt, 0);
 26219        }
 26220        if( rc ){
 26221          raw_printf(stderr, "Error querying the selftest table\n");
 26222          rc = 1;
 26223          sqlite3_finalize(pStmt);
 26224          goto meta_command_exit;
 26225        }
 26226        for(i=1; sqlite3_step(pStmt)==SQLITE_ROW; i++){
 26227          int tno = sqlite3_column_int(pStmt, 0);
 26228          const char *zOp = (const char*)sqlite3_column_text(pStmt, 1);
 26229          const char *zSql = (const char*)sqlite3_column_text(pStmt, 2);
 26230          const char *zAns = (const char*)sqlite3_column_text(pStmt, 3);
 26231  
 26232          if( zOp==0 ) continue;
 26233          if( zSql==0 ) continue;
 26234          if( zAns==0 ) continue;
 26235          k = 0;
 26236          if( bVerbose>0 ){
 26237            printf("%d: %s %s\n", tno, zOp, zSql);
 26238          }
 26239          if( cli_strcmp(zOp,"memo")==0 ){
 26240            utf8_printf(p->out, "%s\n", zSql);
 26241          }else
 26242          if( cli_strcmp(zOp,"run")==0 ){
 26243            char *zErrMsg = 0;
 26244            str.n = 0;
 26245            str.z[0] = 0;
 26246            rc = sqlite3_exec(p->db, zSql, captureOutputCallback, &str, &zErrMsg);
 26247            nTest++;
 26248            if( bVerbose ){
 26249              utf8_printf(p->out, "Result: %s\n", str.z);
 26250            }
 26251            if( rc || zErrMsg ){
 26252              nErr++;
 26253              rc = 1;
 26254              utf8_printf(p->out, "%d: error-code-%d: %s\n", tno, rc, zErrMsg);
 26255              sqlite3_free(zErrMsg);
 26256            }else if( cli_strcmp(zAns,str.z)!=0 ){
 26257              nErr++;
 26258              rc = 1;
 26259              utf8_printf(p->out, "%d: Expected: [%s]\n", tno, zAns);
 26260              utf8_printf(p->out, "%d:      Got: [%s]\n", tno, str.z);
 26261            }
 26262          }else
 26263          {
 26264            utf8_printf(stderr,
 26265              "Unknown operation \"%s\" on selftest line %d\n", zOp, tno);
 26266            rc = 1;
 26267            break;
 26268          }
 26269        } /* End loop over rows of content from SELFTEST */
 26270        sqlite3_finalize(pStmt);
 26271      } /* End loop over k */
 26272      freeText(&str);
 26273      utf8_printf(p->out, "%d errors out of %d tests\n", nErr, nTest);
 26274    }else
 26275  
 26276    if( c=='s' && cli_strncmp(azArg[0], "separator", n)==0 ){
 26277      if( nArg<2 || nArg>3 ){
 26278        raw_printf(stderr, "Usage: .separator COL ?ROW?\n");
 26279        rc = 1;
 26280      }
 26281      if( nArg>=2 ){
 26282        sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator,
 26283                         "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]);
 26284      }
 26285      if( nArg>=3 ){
 26286        sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator,
 26287                         "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]);
 26288      }
 26289    }else
 26290  
 26291    if( c=='s' && n>=4 && cli_strncmp(azArg[0],"sha3sum",n)==0 ){
 26292      const char *zLike = 0;   /* Which table to checksum. 0 means everything */
 26293      int i;                   /* Loop counter */
 26294      int bSchema = 0;         /* Also hash the schema */
 26295      int bSeparate = 0;       /* Hash each table separately */
 26296      int iSize = 224;         /* Hash algorithm to use */
 26297      int bDebug = 0;          /* Only show the query that would have run */
 26298      sqlite3_stmt *pStmt;     /* For querying tables names */
 26299      char *zSql;              /* SQL to be run */
 26300      char *zSep;              /* Separator */
 26301      ShellText sSql;          /* Complete SQL for the query to run the hash */
 26302      ShellText sQuery;        /* Set of queries used to read all content */
 26303      open_db(p, 0);
 26304      for(i=1; i<nArg; i++){
 26305        const char *z = azArg[i];
 26306        if( z[0]=='-' ){
 26307          z++;
 26308          if( z[0]=='-' ) z++;
 26309          if( cli_strcmp(z,"schema")==0 ){
 26310            bSchema = 1;
 26311          }else
 26312          if( cli_strcmp(z,"sha3-224")==0 || cli_strcmp(z,"sha3-256")==0
 26313           || cli_strcmp(z,"sha3-384")==0 || cli_strcmp(z,"sha3-512")==0
 26314          ){
 26315            iSize = atoi(&z[5]);
 26316          }else
 26317          if( cli_strcmp(z,"debug")==0 ){
 26318            bDebug = 1;
 26319          }else
 26320          {
 26321            utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
 26322                        azArg[i], azArg[0]);
 26323            showHelp(p->out, azArg[0]);
 26324            rc = 1;
 26325            goto meta_command_exit;
 26326          }
 26327        }else if( zLike ){
 26328          raw_printf(stderr, "Usage: .sha3sum ?OPTIONS? ?LIKE-PATTERN?\n");
 26329          rc = 1;
 26330          goto meta_command_exit;
 26331        }else{
 26332          zLike = z;
 26333          bSeparate = 1;
 26334          if( sqlite3_strlike("sqlite\\_%", zLike, '\\')==0 ) bSchema = 1;
 26335        }
 26336      }
 26337      if( bSchema ){
 26338        zSql = "SELECT lower(name) as tname FROM sqlite_schema"
 26339               " WHERE type='table' AND coalesce(rootpage,0)>1"
 26340               " UNION ALL SELECT 'sqlite_schema'"
 26341               " ORDER BY 1 collate nocase";
 26342      }else{
 26343        zSql = "SELECT lower(name) as tname FROM sqlite_schema"
 26344               " WHERE type='table' AND coalesce(rootpage,0)>1"
 26345               " AND name NOT LIKE 'sqlite_%'"
 26346               " ORDER BY 1 collate nocase";
 26347      }
 26348      sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
 26349      initText(&sQuery);
 26350      initText(&sSql);
 26351      appendText(&sSql, "WITH [sha3sum$query](a,b) AS(",0);
 26352      zSep = "VALUES(";
 26353      while( SQLITE_ROW==sqlite3_step(pStmt) ){
 26354        const char *zTab = (const char*)sqlite3_column_text(pStmt,0);
 26355        if( zTab==0 ) continue;
 26356        if( zLike && sqlite3_strlike(zLike, zTab, 0)!=0 ) continue;
 26357        if( cli_strncmp(zTab, "sqlite_",7)!=0 ){
 26358          appendText(&sQuery,"SELECT * FROM ", 0);
 26359          appendText(&sQuery,zTab,'"');
 26360          appendText(&sQuery," NOT INDEXED;", 0);
 26361        }else if( cli_strcmp(zTab, "sqlite_schema")==0 ){
 26362          appendText(&sQuery,"SELECT type,name,tbl_name,sql FROM sqlite_schema"
 26363                             " ORDER BY name;", 0);
 26364        }else if( cli_strcmp(zTab, "sqlite_sequence")==0 ){
 26365          appendText(&sQuery,"SELECT name,seq FROM sqlite_sequence"
 26366                             " ORDER BY name;", 0);
 26367        }else if( cli_strcmp(zTab, "sqlite_stat1")==0 ){
 26368          appendText(&sQuery,"SELECT tbl,idx,stat FROM sqlite_stat1"
 26369                             " ORDER BY tbl,idx;", 0);
 26370        }else if( cli_strcmp(zTab, "sqlite_stat4")==0 ){
 26371          appendText(&sQuery, "SELECT * FROM ", 0);
 26372          appendText(&sQuery, zTab, 0);
 26373          appendText(&sQuery, " ORDER BY tbl, idx, rowid;\n", 0);
 26374        }
 26375        appendText(&sSql, zSep, 0);
 26376        appendText(&sSql, sQuery.z, '\'');
 26377        sQuery.n = 0;
 26378        appendText(&sSql, ",", 0);
 26379        appendText(&sSql, zTab, '\'');
 26380        zSep = "),(";
 26381      }
 26382      sqlite3_finalize(pStmt);
 26383      if( bSeparate ){
 26384        zSql = sqlite3_mprintf(
 26385            "%s))"
 26386            " SELECT lower(hex(sha3_query(a,%d))) AS hash, b AS label"
 26387            "   FROM [sha3sum$query]",
 26388            sSql.z, iSize);
 26389      }else{
 26390        zSql = sqlite3_mprintf(
 26391            "%s))"
 26392            " SELECT lower(hex(sha3_query(group_concat(a,''),%d))) AS hash"
 26393            "   FROM [sha3sum$query]",
 26394            sSql.z, iSize);
 26395      }
 26396      shell_check_oom(zSql);
 26397      freeText(&sQuery);
 26398      freeText(&sSql);
 26399      if( bDebug ){
 26400        utf8_printf(p->out, "%s\n", zSql);
 26401      }else{
 26402        shell_exec(p, zSql, 0);
 26403      }
 26404  #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) && !defined(SQLITE_OMIT_VIRTUALTABLE)
 26405      {
 26406        int lrc;
 26407        char *zRevText = /* Query for reversible to-blob-to-text check */
 26408          "SELECT lower(name) as tname FROM sqlite_schema\n"
 26409          "WHERE type='table' AND coalesce(rootpage,0)>1\n"
 26410          "AND name NOT LIKE 'sqlite_%%'%s\n"
 26411          "ORDER BY 1 collate nocase";
 26412        zRevText = sqlite3_mprintf(zRevText, zLike? " AND name LIKE $tspec" : "");
 26413        zRevText = sqlite3_mprintf(
 26414            /* lower-case query is first run, producing upper-case query. */
 26415            "with tabcols as materialized(\n"
 26416            "select tname, cname\n"
 26417            "from ("
 26418            " select printf('\"%%w\"',ss.tname) as tname,"
 26419            " printf('\"%%w\"',ti.name) as cname\n"
 26420            " from (%z) ss\n inner join pragma_table_info(tname) ti))\n"
 26421            "select 'SELECT total(bad_text_count) AS bad_text_count\n"
 26422            "FROM ('||group_concat(query, ' UNION ALL ')||')' as btc_query\n"
 26423            " from (select 'SELECT COUNT(*) AS bad_text_count\n"
 26424            "FROM '||tname||' WHERE '\n"
 26425            "||group_concat('CAST(CAST('||cname||' AS BLOB) AS TEXT)<>'||cname\n"
 26426            "|| ' AND typeof('||cname||')=''text'' ',\n"
 26427            "' OR ') as query, tname from tabcols group by tname)"
 26428            , zRevText);
 26429        shell_check_oom(zRevText);
 26430        if( bDebug ) utf8_printf(p->out, "%s\n", zRevText);
 26431        lrc = sqlite3_prepare_v2(p->db, zRevText, -1, &pStmt, 0);
 26432        if( lrc!=SQLITE_OK ){
 26433          /* assert(lrc==SQLITE_NOMEM); // might also be SQLITE_ERROR if the
 26434          ** user does cruel and unnatural things like ".limit expr_depth 0". */
 26435          rc = 1;
 26436        }else{
 26437          if( zLike ) sqlite3_bind_text(pStmt,1,zLike,-1,SQLITE_STATIC);
 26438          lrc = SQLITE_ROW==sqlite3_step(pStmt);
 26439          if( lrc ){
 26440            const char *zGenQuery = (char*)sqlite3_column_text(pStmt,0);
 26441            sqlite3_stmt *pCheckStmt;
 26442            lrc = sqlite3_prepare_v2(p->db, zGenQuery, -1, &pCheckStmt, 0);
 26443            if( bDebug ) utf8_printf(p->out, "%s\n", zGenQuery);
 26444            if( lrc!=SQLITE_OK ){
 26445              rc = 1;
 26446            }else{
 26447              if( SQLITE_ROW==sqlite3_step(pCheckStmt) ){
 26448                double countIrreversible = sqlite3_column_double(pCheckStmt, 0);
 26449                if( countIrreversible>0 ){
 26450                  int sz = (int)(countIrreversible + 0.5);
 26451                  utf8_printf(stderr,
 26452                       "Digest includes %d invalidly encoded text field%s.\n",
 26453                              sz, (sz>1)? "s": "");
 26454                }
 26455              }
 26456              sqlite3_finalize(pCheckStmt);
 26457            }
 26458            sqlite3_finalize(pStmt);
 26459          }
 26460        }
 26461        if( rc ) utf8_printf(stderr, ".sha3sum failed.\n");
 26462        sqlite3_free(zRevText);
 26463      }
 26464  #endif /* !defined(*_OMIT_SCHEMA_PRAGMAS) && !defined(*_OMIT_VIRTUALTABLE) */
 26465      sqlite3_free(zSql);
 26466    }else
 26467  
 26468  #if !defined(SQLITE_NOHAVE_SYSTEM) && !defined(SQLITE_SHELL_FIDDLE)
 26469    if( c=='s'
 26470     && (cli_strncmp(azArg[0], "shell", n)==0
 26471         || cli_strncmp(azArg[0],"system",n)==0)
 26472    ){
 26473      char *zCmd;
 26474      int i, x;
 26475      failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
 26476      if( nArg<2 ){
 26477        raw_printf(stderr, "Usage: .system COMMAND\n");
 26478        rc = 1;
 26479        goto meta_command_exit;
 26480      }
 26481      zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
 26482      for(i=2; i<nArg && zCmd!=0; i++){
 26483        zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
 26484                               zCmd, azArg[i]);
 26485      }
 26486      x = zCmd!=0 ? system(zCmd) : 1;
 26487      sqlite3_free(zCmd);
 26488      if( x ) raw_printf(stderr, "System command returns %d\n", x);
 26489    }else
 26490  #endif /* !defined(SQLITE_NOHAVE_SYSTEM) && !defined(SQLITE_SHELL_FIDDLE) */
 26491  
 26492    if( c=='s' && cli_strncmp(azArg[0], "show", n)==0 ){
 26493      static const char *azBool[] = { "off", "on", "trigger", "full"};
 26494      const char *zOut;
 26495      int i;
 26496      if( nArg!=1 ){
 26497        raw_printf(stderr, "Usage: .show\n");
 26498        rc = 1;
 26499        goto meta_command_exit;
 26500      }
 26501      utf8_printf(p->out, "%12.12s: %s\n","echo",
 26502                  azBool[ShellHasFlag(p, SHFLG_Echo)]);
 26503      utf8_printf(p->out, "%12.12s: %s\n","eqp", azBool[p->autoEQP&3]);
 26504      utf8_printf(p->out, "%12.12s: %s\n","explain",
 26505           p->mode==MODE_Explain ? "on" : p->autoExplain ? "auto" : "off");
 26506      utf8_printf(p->out,"%12.12s: %s\n","headers", azBool[p->showHeader!=0]);
 26507      if( p->mode==MODE_Column
 26508       || (p->mode>=MODE_Markdown && p->mode<=MODE_Box)
 26509      ){
 26510        utf8_printf
 26511          (p->out, "%12.12s: %s --wrap %d --wordwrap %s --%squote\n", "mode",
 26512           modeDescr[p->mode], p->cmOpts.iWrap,
 26513           p->cmOpts.bWordWrap ? "on" : "off",
 26514           p->cmOpts.bQuote ? "" : "no");
 26515      }else{
 26516        utf8_printf(p->out, "%12.12s: %s\n","mode", modeDescr[p->mode]);
 26517      }
 26518      utf8_printf(p->out, "%12.12s: ", "nullvalue");
 26519        output_c_string(p->out, p->nullValue);
 26520        raw_printf(p->out, "\n");
 26521      utf8_printf(p->out,"%12.12s: %s\n","output",
 26522              strlen30(p->outfile) ? p->outfile : "stdout");
 26523      utf8_printf(p->out,"%12.12s: ", "colseparator");
 26524        output_c_string(p->out, p->colSeparator);
 26525        raw_printf(p->out, "\n");
 26526      utf8_printf(p->out,"%12.12s: ", "rowseparator");
 26527        output_c_string(p->out, p->rowSeparator);
 26528        raw_printf(p->out, "\n");
 26529      switch( p->statsOn ){
 26530        case 0:  zOut = "off";     break;
 26531        default: zOut = "on";      break;
 26532        case 2:  zOut = "stmt";    break;
 26533        case 3:  zOut = "vmstep";  break;
 26534      }
 26535      utf8_printf(p->out, "%12.12s: %s\n","stats", zOut);
 26536      utf8_printf(p->out, "%12.12s: ", "width");
 26537      for (i=0;i<p->nWidth;i++) {
 26538        raw_printf(p->out, "%d ", p->colWidth[i]);
 26539      }
 26540      raw_printf(p->out, "\n");
 26541      utf8_printf(p->out, "%12.12s: %s\n", "filename",
 26542                  p->pAuxDb->zDbFilename ? p->pAuxDb->zDbFilename : "");
 26543    }else
 26544  
 26545    if( c=='s' && cli_strncmp(azArg[0], "stats", n)==0 ){
 26546      if( nArg==2 ){
 26547        if( cli_strcmp(azArg[1],"stmt")==0 ){
 26548          p->statsOn = 2;
 26549        }else if( cli_strcmp(azArg[1],"vmstep")==0 ){
 26550          p->statsOn = 3;
 26551        }else{
 26552          p->statsOn = (u8)booleanValue(azArg[1]);
 26553        }
 26554      }else if( nArg==1 ){
 26555        display_stats(p->db, p, 0);
 26556      }else{
 26557        raw_printf(stderr, "Usage: .stats ?on|off|stmt|vmstep?\n");
 26558        rc = 1;
 26559      }
 26560    }else
 26561  
 26562    if( (c=='t' && n>1 && cli_strncmp(azArg[0], "tables", n)==0)
 26563     || (c=='i' && (cli_strncmp(azArg[0], "indices", n)==0
 26564                   || cli_strncmp(azArg[0], "indexes", n)==0) )
 26565    ){
 26566      sqlite3_stmt *pStmt;
 26567      char **azResult;
 26568      int nRow, nAlloc;
 26569      int ii;
 26570      ShellText s;
 26571      initText(&s);
 26572      open_db(p, 0);
 26573      rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
 26574      if( rc ){
 26575        sqlite3_finalize(pStmt);
 26576        return shellDatabaseError(p->db);
 26577      }
 26578  
 26579      if( nArg>2 && c=='i' ){
 26580        /* It is an historical accident that the .indexes command shows an error
 26581        ** when called with the wrong number of arguments whereas the .tables
 26582        ** command does not. */
 26583        raw_printf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n");
 26584        rc = 1;
 26585        sqlite3_finalize(pStmt);
 26586        goto meta_command_exit;
 26587      }
 26588      for(ii=0; sqlite3_step(pStmt)==SQLITE_ROW; ii++){
 26589        const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
 26590        if( zDbName==0 ) continue;
 26591        if( s.z && s.z[0] ) appendText(&s, " UNION ALL ", 0);
 26592        if( sqlite3_stricmp(zDbName, "main")==0 ){
 26593          appendText(&s, "SELECT name FROM ", 0);
 26594        }else{
 26595          appendText(&s, "SELECT ", 0);
 26596          appendText(&s, zDbName, '\'');
 26597          appendText(&s, "||'.'||name FROM ", 0);
 26598        }
 26599        appendText(&s, zDbName, '"');
 26600        appendText(&s, ".sqlite_schema ", 0);
 26601        if( c=='t' ){
 26602          appendText(&s," WHERE type IN ('table','view')"
 26603                        "   AND name NOT LIKE 'sqlite_%'"
 26604                        "   AND name LIKE ?1", 0);
 26605        }else{
 26606          appendText(&s," WHERE type='index'"
 26607                        "   AND tbl_name LIKE ?1", 0);
 26608        }
 26609      }
 26610      rc = sqlite3_finalize(pStmt);
 26611      if( rc==SQLITE_OK ){
 26612        appendText(&s, " ORDER BY 1", 0);
 26613        rc = sqlite3_prepare_v2(p->db, s.z, -1, &pStmt, 0);
 26614      }
 26615      freeText(&s);
 26616      if( rc ) return shellDatabaseError(p->db);
 26617  
 26618      /* Run the SQL statement prepared by the above block. Store the results
 26619      ** as an array of nul-terminated strings in azResult[].  */
 26620      nRow = nAlloc = 0;
 26621      azResult = 0;
 26622      if( nArg>1 ){
 26623        sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
 26624      }else{
 26625        sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
 26626      }
 26627      while( sqlite3_step(pStmt)==SQLITE_ROW ){
 26628        if( nRow>=nAlloc ){
 26629          char **azNew;
 26630          int n2 = nAlloc*2 + 10;
 26631          azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2);
 26632          shell_check_oom(azNew);
 26633          nAlloc = n2;
 26634          azResult = azNew;
 26635        }
 26636        azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
 26637        shell_check_oom(azResult[nRow]);
 26638        nRow++;
 26639      }
 26640      if( sqlite3_finalize(pStmt)!=SQLITE_OK ){
 26641        rc = shellDatabaseError(p->db);
 26642      }
 26643  
 26644      /* Pretty-print the contents of array azResult[] to the output */
 26645      if( rc==0 && nRow>0 ){
 26646        int len, maxlen = 0;
 26647        int i, j;
 26648        int nPrintCol, nPrintRow;
 26649        for(i=0; i<nRow; i++){
 26650          len = strlen30(azResult[i]);
 26651          if( len>maxlen ) maxlen = len;
 26652        }
 26653        nPrintCol = 80/(maxlen+2);
 26654        if( nPrintCol<1 ) nPrintCol = 1;
 26655        nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
 26656        for(i=0; i<nPrintRow; i++){
 26657          for(j=i; j<nRow; j+=nPrintRow){
 26658            char *zSp = j<nPrintRow ? "" : "  ";
 26659            utf8_printf(p->out, "%s%-*s", zSp, maxlen,
 26660                        azResult[j] ? azResult[j]:"");
 26661          }
 26662          raw_printf(p->out, "\n");
 26663        }
 26664      }
 26665  
 26666      for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
 26667      sqlite3_free(azResult);
 26668    }else
 26669  
 26670  #ifndef SQLITE_SHELL_FIDDLE
 26671    /* Begin redirecting output to the file "testcase-out.txt" */
 26672    if( c=='t' && cli_strcmp(azArg[0],"testcase")==0 ){
 26673      output_reset(p);
 26674      p->out = output_file_open("testcase-out.txt", 0);
 26675      if( p->out==0 ){
 26676        raw_printf(stderr, "Error: cannot open 'testcase-out.txt'\n");
 26677      }
 26678      if( nArg>=2 ){
 26679        sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "%s", azArg[1]);
 26680      }else{
 26681        sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "?");
 26682      }
 26683    }else
 26684  #endif /* !defined(SQLITE_SHELL_FIDDLE) */
 26685  
 26686  #ifndef SQLITE_UNTESTABLE
 26687    if( c=='t' && n>=8 && cli_strncmp(azArg[0], "testctrl", n)==0 ){
 26688      static const struct {
 26689         const char *zCtrlName;   /* Name of a test-control option */
 26690         int ctrlCode;            /* Integer code for that option */
 26691         int unSafe;              /* Not valid unless --unsafe-testing */
 26692         const char *zUsage;      /* Usage notes */
 26693      } aCtrl[] = {
 26694      {"always",             SQLITE_TESTCTRL_ALWAYS, 1,     "BOOLEAN"         },
 26695      {"assert",             SQLITE_TESTCTRL_ASSERT, 1,     "BOOLEAN"         },
 26696    /*{"benign_malloc_hooks",SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS,1, ""        },*/
 26697    /*{"bitvec_test",        SQLITE_TESTCTRL_BITVEC_TEST, 1,  ""              },*/
 26698      {"byteorder",          SQLITE_TESTCTRL_BYTEORDER, 0,  ""                },
 26699      {"extra_schema_checks",SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS,0,"BOOLEAN"  },
 26700    /*{"fault_install",      SQLITE_TESTCTRL_FAULT_INSTALL, 1,""              },*/
 26701      {"imposter",         SQLITE_TESTCTRL_IMPOSTER,1,"SCHEMA ON/OFF ROOTPAGE"},
 26702      {"internal_functions", SQLITE_TESTCTRL_INTERNAL_FUNCTIONS,0,""          },
 26703      {"localtime_fault",    SQLITE_TESTCTRL_LOCALTIME_FAULT,0,"BOOLEAN"      },
 26704      {"never_corrupt",      SQLITE_TESTCTRL_NEVER_CORRUPT,1, "BOOLEAN"       },
 26705      {"optimizations",      SQLITE_TESTCTRL_OPTIMIZATIONS,0,"DISABLE-MASK"   },
 26706  #ifdef YYCOVERAGE
 26707      {"parser_coverage",    SQLITE_TESTCTRL_PARSER_COVERAGE,0,""             },
 26708  #endif
 26709      {"pending_byte",       SQLITE_TESTCTRL_PENDING_BYTE,0, "OFFSET  "       },
 26710      {"prng_restore",       SQLITE_TESTCTRL_PRNG_RESTORE,0, ""               },
 26711      {"prng_save",          SQLITE_TESTCTRL_PRNG_SAVE,   0, ""               },
 26712      {"prng_seed",          SQLITE_TESTCTRL_PRNG_SEED,   0, "SEED ?db?"      },
 26713      {"seek_count",         SQLITE_TESTCTRL_SEEK_COUNT,  0, ""               },
 26714      {"sorter_mmap",        SQLITE_TESTCTRL_SORTER_MMAP, 0, "NMAX"           },
 26715      {"tune",               SQLITE_TESTCTRL_TUNE,        1, "ID VALUE"       },
 26716      {"uselongdouble",    SQLITE_TESTCTRL_USELONGDOUBLE,0,"?BOOLEAN|\"default\"?"},
 26717      };
 26718      int testctrl = -1;
 26719      int iCtrl = -1;
 26720      int rc2 = 0;    /* 0: usage.  1: %d  2: %x  3: no-output */
 26721      int isOk = 0;
 26722      int i, n2;
 26723      const char *zCmd = 0;
 26724  
 26725      open_db(p, 0);
 26726      zCmd = nArg>=2 ? azArg[1] : "help";
 26727  
 26728      /* The argument can optionally begin with "-" or "--" */
 26729      if( zCmd[0]=='-' && zCmd[1] ){
 26730        zCmd++;
 26731        if( zCmd[0]=='-' && zCmd[1] ) zCmd++;
 26732      }
 26733  
 26734      /* --help lists all test-controls */
 26735      if( cli_strcmp(zCmd,"help")==0 ){
 26736        utf8_printf(p->out, "Available test-controls:\n");
 26737        for(i=0; i<ArraySize(aCtrl); i++){
 26738          if( aCtrl[i].unSafe && !ShellHasFlag(p,SHFLG_TestingMode) ) continue;
 26739          utf8_printf(p->out, "  .testctrl %s %s\n",
 26740                      aCtrl[i].zCtrlName, aCtrl[i].zUsage);
 26741        }
 26742        rc = 1;
 26743        goto meta_command_exit;
 26744      }
 26745  
 26746      /* convert testctrl text option to value. allow any unique prefix
 26747      ** of the option name, or a numerical value. */
 26748      n2 = strlen30(zCmd);
 26749      for(i=0; i<ArraySize(aCtrl); i++){
 26750        if( aCtrl[i].unSafe && !ShellHasFlag(p,SHFLG_TestingMode) ) continue;
 26751        if( cli_strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){
 26752          if( testctrl<0 ){
 26753            testctrl = aCtrl[i].ctrlCode;
 26754            iCtrl = i;
 26755          }else{
 26756            utf8_printf(stderr, "Error: ambiguous test-control: \"%s\"\n"
 26757                                "Use \".testctrl --help\" for help\n", zCmd);
 26758            rc = 1;
 26759            goto meta_command_exit;
 26760          }
 26761        }
 26762      }
 26763      if( testctrl<0 ){
 26764        utf8_printf(stderr,"Error: unknown test-control: %s\n"
 26765                           "Use \".testctrl --help\" for help\n", zCmd);
 26766      }else{
 26767        switch(testctrl){
 26768  
 26769          /* sqlite3_test_control(int, db, int) */
 26770          case SQLITE_TESTCTRL_OPTIMIZATIONS:
 26771            if( nArg==3 ){
 26772              unsigned int opt = (unsigned int)strtol(azArg[2], 0, 0);
 26773              rc2 = sqlite3_test_control(testctrl, p->db, opt);
 26774              isOk = 3;
 26775            }
 26776            break;
 26777  
 26778          /* sqlite3_test_control(int) */
 26779          case SQLITE_TESTCTRL_PRNG_SAVE:
 26780          case SQLITE_TESTCTRL_PRNG_RESTORE:
 26781          case SQLITE_TESTCTRL_BYTEORDER:
 26782            if( nArg==2 ){
 26783              rc2 = sqlite3_test_control(testctrl);
 26784              isOk = testctrl==SQLITE_TESTCTRL_BYTEORDER ? 1 : 3;
 26785            }
 26786            break;
 26787  
 26788          /* sqlite3_test_control(int, uint) */
 26789          case SQLITE_TESTCTRL_PENDING_BYTE:
 26790            if( nArg==3 ){
 26791              unsigned int opt = (unsigned int)integerValue(azArg[2]);
 26792              rc2 = sqlite3_test_control(testctrl, opt);
 26793              isOk = 3;
 26794            }
 26795            break;
 26796  
 26797          /* sqlite3_test_control(int, int, sqlite3*) */
 26798          case SQLITE_TESTCTRL_PRNG_SEED:
 26799            if( nArg==3 || nArg==4 ){
 26800              int ii = (int)integerValue(azArg[2]);
 26801              sqlite3 *db;
 26802              if( ii==0 && cli_strcmp(azArg[2],"random")==0 ){
 26803                sqlite3_randomness(sizeof(ii),&ii);
 26804                printf("-- random seed: %d\n", ii);
 26805              }
 26806              if( nArg==3 ){
 26807                db = 0;
 26808              }else{
 26809                db = p->db;
 26810                /* Make sure the schema has been loaded */
 26811                sqlite3_table_column_metadata(db, 0, "x", 0, 0, 0, 0, 0, 0);
 26812              }
 26813              rc2 = sqlite3_test_control(testctrl, ii, db);
 26814              isOk = 3;
 26815            }
 26816            break;
 26817  
 26818          /* sqlite3_test_control(int, int) */
 26819          case SQLITE_TESTCTRL_ASSERT:
 26820          case SQLITE_TESTCTRL_ALWAYS:
 26821            if( nArg==3 ){
 26822              int opt = booleanValue(azArg[2]);
 26823              rc2 = sqlite3_test_control(testctrl, opt);
 26824              isOk = 1;
 26825            }
 26826            break;
 26827  
 26828          /* sqlite3_test_control(int, int) */
 26829          case SQLITE_TESTCTRL_LOCALTIME_FAULT:
 26830          case SQLITE_TESTCTRL_NEVER_CORRUPT:
 26831            if( nArg==3 ){
 26832              int opt = booleanValue(azArg[2]);
 26833              rc2 = sqlite3_test_control(testctrl, opt);
 26834              isOk = 3;
 26835            }
 26836            break;
 26837  
 26838          /* sqlite3_test_control(int, int) */
 26839          case SQLITE_TESTCTRL_USELONGDOUBLE: {
 26840            int opt = -1;
 26841            if( nArg==3 ){
 26842              if( cli_strcmp(azArg[2],"default")==0 ){
 26843                opt = 2;
 26844              }else{
 26845                opt = booleanValue(azArg[2]);
 26846              }
 26847            }
 26848            rc2 = sqlite3_test_control(testctrl, opt);
 26849            isOk = 1;
 26850            break;
 26851          }
 26852  
 26853          /* sqlite3_test_control(sqlite3*) */
 26854          case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS:
 26855            rc2 = sqlite3_test_control(testctrl, p->db);
 26856            isOk = 3;
 26857            break;
 26858  
 26859          case SQLITE_TESTCTRL_IMPOSTER:
 26860            if( nArg==5 ){
 26861              rc2 = sqlite3_test_control(testctrl, p->db,
 26862                            azArg[2],
 26863                            integerValue(azArg[3]),
 26864                            integerValue(azArg[4]));
 26865              isOk = 3;
 26866            }
 26867            break;
 26868  
 26869          case SQLITE_TESTCTRL_SEEK_COUNT: {
 26870            u64 x = 0;
 26871            rc2 = sqlite3_test_control(testctrl, p->db, &x);
 26872            utf8_printf(p->out, "%llu\n", x);
 26873            isOk = 3;
 26874            break;
 26875          }
 26876  
 26877  #ifdef YYCOVERAGE
 26878          case SQLITE_TESTCTRL_PARSER_COVERAGE: {
 26879            if( nArg==2 ){
 26880              sqlite3_test_control(testctrl, p->out);
 26881              isOk = 3;
 26882            }
 26883            break;
 26884          }
 26885  #endif
 26886  #ifdef SQLITE_DEBUG
 26887          case SQLITE_TESTCTRL_TUNE: {
 26888            if( nArg==4 ){
 26889              int id = (int)integerValue(azArg[2]);
 26890              int val = (int)integerValue(azArg[3]);
 26891              sqlite3_test_control(testctrl, id, &val);
 26892              isOk = 3;
 26893            }else if( nArg==3 ){
 26894              int id = (int)integerValue(azArg[2]);
 26895              sqlite3_test_control(testctrl, -id, &rc2);
 26896              isOk = 1;
 26897            }else if( nArg==2 ){
 26898              int id = 1;
 26899              while(1){
 26900                int val = 0;
 26901                rc2 = sqlite3_test_control(testctrl, -id, &val);
 26902                if( rc2!=SQLITE_OK ) break;
 26903                if( id>1 ) utf8_printf(p->out, "  ");
 26904                utf8_printf(p->out, "%d: %d", id, val);
 26905                id++;
 26906              }
 26907              if( id>1 ) utf8_printf(p->out, "\n");
 26908              isOk = 3;
 26909            }
 26910            break;
 26911          }
 26912  #endif
 26913          case SQLITE_TESTCTRL_SORTER_MMAP:
 26914            if( nArg==3 ){
 26915              int opt = (unsigned int)integerValue(azArg[2]);
 26916              rc2 = sqlite3_test_control(testctrl, p->db, opt);
 26917              isOk = 3;
 26918            }
 26919            break;
 26920        }
 26921      }
 26922      if( isOk==0 && iCtrl>=0 ){
 26923        utf8_printf(p->out, "Usage: .testctrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage);
 26924        rc = 1;
 26925      }else if( isOk==1 ){
 26926        raw_printf(p->out, "%d\n", rc2);
 26927      }else if( isOk==2 ){
 26928        raw_printf(p->out, "0x%08x\n", rc2);
 26929      }
 26930    }else
 26931  #endif /* !defined(SQLITE_UNTESTABLE) */
 26932  
 26933    if( c=='t' && n>4 && cli_strncmp(azArg[0], "timeout", n)==0 ){
 26934      open_db(p, 0);
 26935      sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
 26936    }else
 26937  
 26938    if( c=='t' && n>=5 && cli_strncmp(azArg[0], "timer", n)==0 ){
 26939      if( nArg==2 ){
 26940        enableTimer = booleanValue(azArg[1]);
 26941        if( enableTimer && !HAS_TIMER ){
 26942          raw_printf(stderr, "Error: timer not available on this system.\n");
 26943          enableTimer = 0;
 26944        }
 26945      }else{
 26946        raw_printf(stderr, "Usage: .timer on|off\n");
 26947        rc = 1;
 26948      }
 26949    }else
 26950  
 26951  #ifndef SQLITE_OMIT_TRACE
 26952    if( c=='t' && cli_strncmp(azArg[0], "trace", n)==0 ){
 26953      int mType = 0;
 26954      int jj;
 26955      open_db(p, 0);
 26956      for(jj=1; jj<nArg; jj++){
 26957        const char *z = azArg[jj];
 26958        if( z[0]=='-' ){
 26959          if( optionMatch(z, "expanded") ){
 26960            p->eTraceType = SHELL_TRACE_EXPANDED;
 26961          }
 26962  #ifdef SQLITE_ENABLE_NORMALIZE
 26963          else if( optionMatch(z, "normalized") ){
 26964            p->eTraceType = SHELL_TRACE_NORMALIZED;
 26965          }
 26966  #endif
 26967          else if( optionMatch(z, "plain") ){
 26968            p->eTraceType = SHELL_TRACE_PLAIN;
 26969          }
 26970          else if( optionMatch(z, "profile") ){
 26971            mType |= SQLITE_TRACE_PROFILE;
 26972          }
 26973          else if( optionMatch(z, "row") ){
 26974            mType |= SQLITE_TRACE_ROW;
 26975          }
 26976          else if( optionMatch(z, "stmt") ){
 26977            mType |= SQLITE_TRACE_STMT;
 26978          }
 26979          else if( optionMatch(z, "close") ){
 26980            mType |= SQLITE_TRACE_CLOSE;
 26981          }
 26982          else {
 26983            raw_printf(stderr, "Unknown option \"%s\" on \".trace\"\n", z);
 26984            rc = 1;
 26985            goto meta_command_exit;
 26986          }
 26987        }else{
 26988          output_file_close(p->traceOut);
 26989          p->traceOut = output_file_open(z, 0);
 26990        }
 26991      }
 26992      if( p->traceOut==0 ){
 26993        sqlite3_trace_v2(p->db, 0, 0, 0);
 26994      }else{
 26995        if( mType==0 ) mType = SQLITE_TRACE_STMT;
 26996        sqlite3_trace_v2(p->db, mType, sql_trace_callback, p);
 26997      }
 26998    }else
 26999  #endif /* !defined(SQLITE_OMIT_TRACE) */
 27000  
 27001  #if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_VIRTUALTABLE)
 27002    if( c=='u' && cli_strncmp(azArg[0], "unmodule", n)==0 ){
 27003      int ii;
 27004      int lenOpt;
 27005      char *zOpt;
 27006      if( nArg<2 ){
 27007        raw_printf(stderr, "Usage: .unmodule [--allexcept] NAME ...\n");
 27008        rc = 1;
 27009        goto meta_command_exit;
 27010      }
 27011      open_db(p, 0);
 27012      zOpt = azArg[1];
 27013      if( zOpt[0]=='-' && zOpt[1]=='-' && zOpt[2]!=0 ) zOpt++;
 27014      lenOpt = (int)strlen(zOpt);
 27015      if( lenOpt>=3 && cli_strncmp(zOpt, "-allexcept",lenOpt)==0 ){
 27016        assert( azArg[nArg]==0 );
 27017        sqlite3_drop_modules(p->db, nArg>2 ? (const char**)(azArg+2) : 0);
 27018      }else{
 27019        for(ii=1; ii<nArg; ii++){
 27020          sqlite3_create_module(p->db, azArg[ii], 0, 0);
 27021        }
 27022      }
 27023    }else
 27024  #endif
 27025  
 27026  #if SQLITE_USER_AUTHENTICATION
 27027    if( c=='u' && cli_strncmp(azArg[0], "user", n)==0 ){
 27028      if( nArg<2 ){
 27029        raw_printf(stderr, "Usage: .user SUBCOMMAND ...\n");
 27030        rc = 1;
 27031        goto meta_command_exit;
 27032      }
 27033      open_db(p, 0);
 27034      if( cli_strcmp(azArg[1],"login")==0 ){
 27035        if( nArg!=4 ){
 27036          raw_printf(stderr, "Usage: .user login USER PASSWORD\n");
 27037          rc = 1;
 27038          goto meta_command_exit;
 27039        }
 27040        rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3],
 27041                                       strlen30(azArg[3]));
 27042        if( rc ){
 27043          utf8_printf(stderr, "Authentication failed for user %s\n", azArg[2]);
 27044          rc = 1;
 27045        }
 27046      }else if( cli_strcmp(azArg[1],"add")==0 ){
 27047        if( nArg!=5 ){
 27048          raw_printf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n");
 27049          rc = 1;
 27050          goto meta_command_exit;
 27051        }
 27052        rc = sqlite3_user_add(p->db, azArg[2], azArg[3], strlen30(azArg[3]),
 27053                              booleanValue(azArg[4]));
 27054        if( rc ){
 27055          raw_printf(stderr, "User-Add failed: %d\n", rc);
 27056          rc = 1;
 27057        }
 27058      }else if( cli_strcmp(azArg[1],"edit")==0 ){
 27059        if( nArg!=5 ){
 27060          raw_printf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n");
 27061          rc = 1;
 27062          goto meta_command_exit;
 27063        }
 27064        rc = sqlite3_user_change(p->db, azArg[2], azArg[3], strlen30(azArg[3]),
 27065                                booleanValue(azArg[4]));
 27066        if( rc ){
 27067          raw_printf(stderr, "User-Edit failed: %d\n", rc);
 27068          rc = 1;
 27069        }
 27070      }else if( cli_strcmp(azArg[1],"delete")==0 ){
 27071        if( nArg!=3 ){
 27072          raw_printf(stderr, "Usage: .user delete USER\n");
 27073          rc = 1;
 27074          goto meta_command_exit;
 27075        }
 27076        rc = sqlite3_user_delete(p->db, azArg[2]);
 27077        if( rc ){
 27078          raw_printf(stderr, "User-Delete failed: %d\n", rc);
 27079          rc = 1;
 27080        }
 27081      }else{
 27082        raw_printf(stderr, "Usage: .user login|add|edit|delete ...\n");
 27083        rc = 1;
 27084        goto meta_command_exit;
 27085      }
 27086    }else
 27087  #endif /* SQLITE_USER_AUTHENTICATION */
 27088  
 27089    if( c=='v' && cli_strncmp(azArg[0], "version", n)==0 ){
 27090      char *zPtrSz = sizeof(void*)==8 ? "64-bit" : "32-bit";
 27091      utf8_printf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
 27092          sqlite3_libversion(), sqlite3_sourceid());
 27093  #if SQLITE_HAVE_ZLIB
 27094      utf8_printf(p->out, "zlib version %s\n", zlibVersion());
 27095  #endif
 27096  #define CTIMEOPT_VAL_(opt) #opt
 27097  #define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt)
 27098  #if defined(__clang__) && defined(__clang_major__)
 27099      utf8_printf(p->out, "clang-" CTIMEOPT_VAL(__clang_major__) "."
 27100                      CTIMEOPT_VAL(__clang_minor__) "."
 27101                      CTIMEOPT_VAL(__clang_patchlevel__) " (%s)\n", zPtrSz);
 27102  #elif defined(_MSC_VER)
 27103      utf8_printf(p->out, "msvc-" CTIMEOPT_VAL(_MSC_VER) " (%s)\n", zPtrSz);
 27104  #elif defined(__GNUC__) && defined(__VERSION__)
 27105      utf8_printf(p->out, "gcc-" __VERSION__ " (%s)\n", zPtrSz);
 27106  #endif
 27107    }else
 27108  
 27109    if( c=='v' && cli_strncmp(azArg[0], "vfsinfo", n)==0 ){
 27110      const char *zDbName = nArg==2 ? azArg[1] : "main";
 27111      sqlite3_vfs *pVfs = 0;
 27112      if( p->db ){
 27113        sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFS_POINTER, &pVfs);
 27114        if( pVfs ){
 27115          utf8_printf(p->out, "vfs.zName      = \"%s\"\n", pVfs->zName);
 27116          raw_printf(p->out, "vfs.iVersion   = %d\n", pVfs->iVersion);
 27117          raw_printf(p->out, "vfs.szOsFile   = %d\n", pVfs->szOsFile);
 27118          raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
 27119        }
 27120      }
 27121    }else
 27122  
 27123    if( c=='v' && cli_strncmp(azArg[0], "vfslist", n)==0 ){
 27124      sqlite3_vfs *pVfs;
 27125      sqlite3_vfs *pCurrent = 0;
 27126      if( p->db ){
 27127        sqlite3_file_control(p->db, "main", SQLITE_FCNTL_VFS_POINTER, &pCurrent);
 27128      }
 27129      for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){
 27130        utf8_printf(p->out, "vfs.zName      = \"%s\"%s\n", pVfs->zName,
 27131             pVfs==pCurrent ? "  <--- CURRENT" : "");
 27132        raw_printf(p->out, "vfs.iVersion   = %d\n", pVfs->iVersion);
 27133        raw_printf(p->out, "vfs.szOsFile   = %d\n", pVfs->szOsFile);
 27134        raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
 27135        if( pVfs->pNext ){
 27136          raw_printf(p->out, "-----------------------------------\n");
 27137        }
 27138      }
 27139    }else
 27140  
 27141    if( c=='v' && cli_strncmp(azArg[0], "vfsname", n)==0 ){
 27142      const char *zDbName = nArg==2 ? azArg[1] : "main";
 27143      char *zVfsName = 0;
 27144      if( p->db ){
 27145        sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
 27146        if( zVfsName ){
 27147          utf8_printf(p->out, "%s\n", zVfsName);
 27148          sqlite3_free(zVfsName);
 27149        }
 27150      }
 27151    }else
 27152  
 27153    if( c=='w' && cli_strncmp(azArg[0], "wheretrace", n)==0 ){
 27154      unsigned int x = nArg>=2? (unsigned int)integerValue(azArg[1]) : 0xffffffff;
 27155      sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &x);
 27156    }else
 27157  
 27158    if( c=='w' && cli_strncmp(azArg[0], "width", n)==0 ){
 27159      int j;
 27160      assert( nArg<=ArraySize(azArg) );
 27161      p->nWidth = nArg-1;
 27162      p->colWidth = realloc(p->colWidth, (p->nWidth+1)*sizeof(int)*2);
 27163      if( p->colWidth==0 && p->nWidth>0 ) shell_out_of_memory();
 27164      if( p->nWidth ) p->actualWidth = &p->colWidth[p->nWidth];
 27165      for(j=1; j<nArg; j++){
 27166        p->colWidth[j-1] = (int)integerValue(azArg[j]);
 27167      }
 27168    }else
 27169  
 27170    {
 27171      utf8_printf(stderr, "Error: unknown command or invalid arguments: "
 27172        " \"%s\". Enter \".help\" for help\n", azArg[0]);
 27173      rc = 1;
 27174    }
 27175  
 27176  meta_command_exit:
 27177    if( p->outCount ){
 27178      p->outCount--;
 27179      if( p->outCount==0 ) output_reset(p);
 27180    }
 27181    p->bSafeMode = p->bSafeModePersist;
 27182    return rc;
 27183  }
 27184  
 27185  /* Line scan result and intermediate states (supporting scan resumption)
 27186  */
 27187  #ifndef CHAR_BIT
 27188  # define CHAR_BIT 8
 27189  #endif
 27190  typedef enum {
 27191    QSS_HasDark = 1<<CHAR_BIT, QSS_EndingSemi = 2<<CHAR_BIT,
 27192    QSS_CharMask = (1<<CHAR_BIT)-1, QSS_ScanMask = 3<<CHAR_BIT,
 27193    QSS_Start = 0
 27194  } QuickScanState;
 27195  #define QSS_SETV(qss, newst) ((newst) | ((qss) & QSS_ScanMask))
 27196  #define QSS_INPLAIN(qss) (((qss)&QSS_CharMask)==QSS_Start)
 27197  #define QSS_PLAINWHITE(qss) (((qss)&~QSS_EndingSemi)==QSS_Start)
 27198  #define QSS_PLAINDARK(qss) (((qss)&~QSS_EndingSemi)==QSS_HasDark)
 27199  #define QSS_SEMITERM(qss) (((qss)&~QSS_HasDark)==QSS_EndingSemi)
 27200  
 27201  /*
 27202  ** Scan line for classification to guide shell's handling.
 27203  ** The scan is resumable for subsequent lines when prior
 27204  ** return values are passed as the 2nd argument.
 27205  */
 27206  static QuickScanState quickscan(char *zLine, QuickScanState qss,
 27207                                  SCAN_TRACKER_REFTYPE pst){
 27208    char cin;
 27209    char cWait = (char)qss; /* intentional narrowing loss */
 27210    if( cWait==0 ){
 27211    PlainScan:
 27212      assert( cWait==0 );
 27213      while( (cin = *zLine++)!=0 ){
 27214        if( IsSpace(cin) )
 27215          continue;
 27216        switch (cin){
 27217        case '-':
 27218          if( *zLine!='-' )
 27219            break;
 27220          while((cin = *++zLine)!=0 )
 27221            if( cin=='\n')
 27222              goto PlainScan;
 27223          return qss;
 27224        case ';':
 27225          qss |= QSS_EndingSemi;
 27226          continue;
 27227        case '/':
 27228          if( *zLine=='*' ){
 27229            ++zLine;
 27230            cWait = '*';
 27231            CONTINUE_PROMPT_AWAITS(pst, "/*");
 27232            qss = QSS_SETV(qss, cWait);
 27233            goto TermScan;
 27234          }
 27235          break;
 27236        case '[':
 27237          cin = ']';
 27238          deliberate_fall_through;
 27239        case '`': case '\'': case '"':
 27240          cWait = cin;
 27241          qss = QSS_HasDark | cWait;
 27242          CONTINUE_PROMPT_AWAITC(pst, cin);
 27243          goto TermScan;
 27244        case '(':
 27245          CONTINUE_PAREN_INCR(pst, 1);
 27246          break;
 27247        case ')':
 27248          CONTINUE_PAREN_INCR(pst, -1);
 27249          break;
 27250        default:
 27251          break;
 27252        }
 27253        qss = (qss & ~QSS_EndingSemi) | QSS_HasDark;
 27254      }
 27255    }else{
 27256    TermScan:
 27257      while( (cin = *zLine++)!=0 ){
 27258        if( cin==cWait ){
 27259          switch( cWait ){
 27260          case '*':
 27261            if( *zLine != '/' )
 27262              continue;
 27263            ++zLine;
 27264            cWait = 0;
 27265            CONTINUE_PROMPT_AWAITC(pst, 0);
 27266            qss = QSS_SETV(qss, 0);
 27267            goto PlainScan;
 27268          case '`': case '\'': case '"':
 27269            if(*zLine==cWait){
 27270              /* Swallow doubled end-delimiter.*/
 27271              ++zLine;
 27272              continue;
 27273            }
 27274            deliberate_fall_through;
 27275          case ']':
 27276            cWait = 0;
 27277            CONTINUE_PROMPT_AWAITC(pst, 0);
 27278            qss = QSS_SETV(qss, 0);
 27279            goto PlainScan;
 27280          default: assert(0);
 27281          }
 27282        }
 27283      }
 27284    }
 27285    return qss;
 27286  }
 27287  
 27288  /*
 27289  ** Return TRUE if the line typed in is an SQL command terminator other
 27290  ** than a semi-colon.  The SQL Server style "go" command is understood
 27291  ** as is the Oracle "/".
 27292  */
 27293  static int line_is_command_terminator(char *zLine){
 27294    while( IsSpace(zLine[0]) ){ zLine++; };
 27295    if( zLine[0]=='/' )
 27296      zLine += 1; /* Oracle */
 27297    else if ( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o' )
 27298      zLine += 2; /* SQL Server */
 27299    else
 27300      return 0;
 27301    return quickscan(zLine, QSS_Start, 0)==QSS_Start;
 27302  }
 27303  
 27304  /*
 27305  ** The CLI needs a working sqlite3_complete() to work properly.  So error
 27306  ** out of the build if compiling with SQLITE_OMIT_COMPLETE.
 27307  */
 27308  #ifdef SQLITE_OMIT_COMPLETE
 27309  # error the CLI application is imcompatable with SQLITE_OMIT_COMPLETE.
 27310  #endif
 27311  
 27312  /*
 27313  ** Return true if zSql is a complete SQL statement.  Return false if it
 27314  ** ends in the middle of a string literal or C-style comment.
 27315  */
 27316  static int line_is_complete(char *zSql, int nSql){
 27317    int rc;
 27318    if( zSql==0 ) return 1;
 27319    zSql[nSql] = ';';
 27320    zSql[nSql+1] = 0;
 27321    rc = sqlite3_complete(zSql);
 27322    zSql[nSql] = 0;
 27323    return rc;
 27324  }
 27325  
 27326  /*
 27327  ** Run a single line of SQL.  Return the number of errors.
 27328  */
 27329  static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){
 27330    int rc;
 27331    char *zErrMsg = 0;
 27332  
 27333    open_db(p, 0);
 27334    if( ShellHasFlag(p,SHFLG_Backslash) ) resolve_backslashes(zSql);
 27335    if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0;
 27336    BEGIN_TIMER;
 27337    rc = shell_exec(p, zSql, &zErrMsg);
 27338    END_TIMER;
 27339    if( rc || zErrMsg ){
 27340      char zPrefix[100];
 27341      const char *zErrorTail;
 27342      const char *zErrorType;
 27343      if( zErrMsg==0 ){
 27344        zErrorType = "Error";
 27345        zErrorTail = sqlite3_errmsg(p->db);
 27346      }else if( cli_strncmp(zErrMsg, "in prepare, ",12)==0 ){
 27347        zErrorType = "Parse error";
 27348        zErrorTail = &zErrMsg[12];
 27349      }else if( cli_strncmp(zErrMsg, "stepping, ", 10)==0 ){
 27350        zErrorType = "Runtime error";
 27351        zErrorTail = &zErrMsg[10];
 27352      }else{
 27353        zErrorType = "Error";
 27354        zErrorTail = zErrMsg;
 27355      }
 27356      if( in!=0 || !stdin_is_interactive ){
 27357        sqlite3_snprintf(sizeof(zPrefix), zPrefix,
 27358                         "%s near line %d:", zErrorType, startline);
 27359      }else{
 27360        sqlite3_snprintf(sizeof(zPrefix), zPrefix, "%s:", zErrorType);
 27361      }
 27362      utf8_printf(stderr, "%s %s\n", zPrefix, zErrorTail);
 27363      sqlite3_free(zErrMsg);
 27364      zErrMsg = 0;
 27365      return 1;
 27366    }else if( ShellHasFlag(p, SHFLG_CountChanges) ){
 27367      char zLineBuf[2000];
 27368      sqlite3_snprintf(sizeof(zLineBuf), zLineBuf,
 27369              "changes: %lld   total_changes: %lld",
 27370              sqlite3_changes64(p->db), sqlite3_total_changes64(p->db));
 27371      raw_printf(p->out, "%s\n", zLineBuf);
 27372    }
 27373    return 0;
 27374  }
 27375  
 27376  static void echo_group_input(ShellState *p, const char *zDo){
 27377    if( ShellHasFlag(p, SHFLG_Echo) ) utf8_printf(p->out, "%s\n", zDo);
 27378  }
 27379  
 27380  #ifdef SQLITE_SHELL_FIDDLE
 27381  /*
 27382  ** Alternate one_input_line() impl for wasm mode. This is not in the primary
 27383  ** impl because we need the global shellState and cannot access it from that
 27384  ** function without moving lots of code around (creating a larger/messier diff).
 27385  */
 27386  static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
 27387    /* Parse the next line from shellState.wasm.zInput. */
 27388    const char *zBegin = shellState.wasm.zPos;
 27389    const char *z = zBegin;
 27390    char *zLine = 0;
 27391    i64 nZ = 0;
 27392  
 27393    UNUSED_PARAMETER(in);
 27394    UNUSED_PARAMETER(isContinuation);
 27395    if(!z || !*z){
 27396      return 0;
 27397    }
 27398    while(*z && isspace(*z)) ++z;
 27399    zBegin = z;
 27400    for(; *z && '\n'!=*z; ++nZ, ++z){}
 27401    if(nZ>0 && '\r'==zBegin[nZ-1]){
 27402      --nZ;
 27403    }
 27404    shellState.wasm.zPos = z;
 27405    zLine = realloc(zPrior, nZ+1);
 27406    shell_check_oom(zLine);
 27407    memcpy(zLine, zBegin, nZ);
 27408    zLine[nZ] = 0;
 27409    return zLine;
 27410  }
 27411  #endif /* SQLITE_SHELL_FIDDLE */
 27412  
 27413  /*
 27414  ** Read input from *in and process it.  If *in==0 then input
 27415  ** is interactive - the user is typing it it.  Otherwise, input
 27416  ** is coming from a file or device.  A prompt is issued and history
 27417  ** is saved only if input is interactive.  An interrupt signal will
 27418  ** cause this routine to exit immediately, unless input is interactive.
 27419  **
 27420  ** Return the number of errors.
 27421  */
 27422  static int process_input(ShellState *p){
 27423    char *zLine = 0;          /* A single input line */
 27424    char *zSql = 0;           /* Accumulated SQL text */
 27425    i64 nLine;                /* Length of current line */
 27426    i64 nSql = 0;             /* Bytes of zSql[] used */
 27427    i64 nAlloc = 0;           /* Allocated zSql[] space */
 27428    int rc;                   /* Error code */
 27429    int errCnt = 0;           /* Number of errors seen */
 27430    i64 startline = 0;        /* Line number for start of current input */
 27431    QuickScanState qss = QSS_Start; /* Accumulated line status (so far) */
 27432  
 27433    if( p->inputNesting==MAX_INPUT_NESTING ){
 27434      /* This will be more informative in a later version. */
 27435      utf8_printf(stderr,"Input nesting limit (%d) reached at line %d."
 27436                  " Check recursion.\n", MAX_INPUT_NESTING, p->lineno);
 27437      return 1;
 27438    }
 27439    ++p->inputNesting;
 27440    p->lineno = 0;
 27441    CONTINUE_PROMPT_RESET;
 27442    while( errCnt==0 || !bail_on_error || (p->in==0 && stdin_is_interactive) ){
 27443      fflush(p->out);
 27444      zLine = one_input_line(p->in, zLine, nSql>0);
 27445      if( zLine==0 ){
 27446        /* End of input */
 27447        if( p->in==0 && stdin_is_interactive ) printf("\n");
 27448        break;
 27449      }
 27450      if( seenInterrupt ){
 27451        if( p->in!=0 ) break;
 27452        seenInterrupt = 0;
 27453      }
 27454      p->lineno++;
 27455      if( QSS_INPLAIN(qss)
 27456          && line_is_command_terminator(zLine)
 27457          && line_is_complete(zSql, nSql) ){
 27458        memcpy(zLine,";",2);
 27459      }
 27460      qss = quickscan(zLine, qss, CONTINUE_PROMPT_PSTATE);
 27461      if( QSS_PLAINWHITE(qss) && nSql==0 ){
 27462        /* Just swallow single-line whitespace */
 27463        echo_group_input(p, zLine);
 27464        qss = QSS_Start;
 27465        continue;
 27466      }
 27467      if( zLine && (zLine[0]=='.' || zLine[0]=='#') && nSql==0 ){
 27468        CONTINUE_PROMPT_RESET;
 27469        echo_group_input(p, zLine);
 27470        if( zLine[0]=='.' ){
 27471          rc = do_meta_command(zLine, p);
 27472          if( rc==2 ){ /* exit requested */
 27473            break;
 27474          }else if( rc ){
 27475            errCnt++;
 27476          }
 27477        }
 27478        qss = QSS_Start;
 27479        continue;
 27480      }
 27481      /* No single-line dispositions remain; accumulate line(s). */
 27482      nLine = strlen(zLine);
 27483      if( nSql+nLine+2>=nAlloc ){
 27484        /* Grow buffer by half-again increments when big. */
 27485        nAlloc = nSql+(nSql>>1)+nLine+100;
 27486        zSql = realloc(zSql, nAlloc);
 27487        shell_check_oom(zSql);
 27488      }
 27489      if( nSql==0 ){
 27490        i64 i;
 27491        for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
 27492        assert( nAlloc>0 && zSql!=0 );
 27493        memcpy(zSql, zLine+i, nLine+1-i);
 27494        startline = p->lineno;
 27495        nSql = nLine-i;
 27496      }else{
 27497        zSql[nSql++] = '\n';
 27498        memcpy(zSql+nSql, zLine, nLine+1);
 27499        nSql += nLine;
 27500      }
 27501      if( nSql && QSS_SEMITERM(qss) && sqlite3_complete(zSql) ){
 27502        echo_group_input(p, zSql);
 27503        errCnt += runOneSqlLine(p, zSql, p->in, startline);
 27504        CONTINUE_PROMPT_RESET;
 27505        nSql = 0;
 27506        if( p->outCount ){
 27507          output_reset(p);
 27508          p->outCount = 0;
 27509        }else{
 27510          clearTempFile(p);
 27511        }
 27512        p->bSafeMode = p->bSafeModePersist;
 27513        qss = QSS_Start;
 27514      }else if( nSql && QSS_PLAINWHITE(qss) ){
 27515        echo_group_input(p, zSql);
 27516        nSql = 0;
 27517        qss = QSS_Start;
 27518      }
 27519    }
 27520    if( nSql ){
 27521      /* This may be incomplete. Let the SQL parser deal with that. */
 27522      echo_group_input(p, zSql);
 27523      errCnt += runOneSqlLine(p, zSql, p->in, startline);
 27524      CONTINUE_PROMPT_RESET;
 27525    }
 27526    free(zSql);
 27527    free(zLine);
 27528    --p->inputNesting;
 27529    return errCnt>0;
 27530  }
 27531  
 27532  /*
 27533  ** Return a pathname which is the user's home directory.  A
 27534  ** 0 return indicates an error of some kind.
 27535  */
 27536  static char *find_home_dir(int clearFlag){
 27537    static char *home_dir = NULL;
 27538    if( clearFlag ){
 27539      free(home_dir);
 27540      home_dir = 0;
 27541      return 0;
 27542    }
 27543    if( home_dir ) return home_dir;
 27544  
 27545  #if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \
 27546       && !defined(__RTP__) && !defined(_WRS_KERNEL) && !defined(SQLITE_WASI)
 27547    {
 27548      struct passwd *pwent;
 27549      uid_t uid = getuid();
 27550      if( (pwent=getpwuid(uid)) != NULL) {
 27551        home_dir = pwent->pw_dir;
 27552      }
 27553    }
 27554  #endif
 27555  
 27556  #if defined(_WIN32_WCE)
 27557    /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
 27558     */
 27559    home_dir = "/";
 27560  #else
 27561  
 27562  #if defined(_WIN32) || defined(WIN32)
 27563    if (!home_dir) {
 27564      home_dir = getenv("USERPROFILE");
 27565    }
 27566  #endif
 27567  
 27568    if (!home_dir) {
 27569      home_dir = getenv("HOME");
 27570    }
 27571  
 27572  #if defined(_WIN32) || defined(WIN32)
 27573    if (!home_dir) {
 27574      char *zDrive, *zPath;
 27575      int n;
 27576      zDrive = getenv("HOMEDRIVE");
 27577      zPath = getenv("HOMEPATH");
 27578      if( zDrive && zPath ){
 27579        n = strlen30(zDrive) + strlen30(zPath) + 1;
 27580        home_dir = malloc( n );
 27581        if( home_dir==0 ) return 0;
 27582        sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
 27583        return home_dir;
 27584      }
 27585      home_dir = "c:\\";
 27586    }
 27587  #endif
 27588  
 27589  #endif /* !_WIN32_WCE */
 27590  
 27591    if( home_dir ){
 27592      i64 n = strlen(home_dir) + 1;
 27593      char *z = malloc( n );
 27594      if( z ) memcpy(z, home_dir, n);
 27595      home_dir = z;
 27596    }
 27597  
 27598    return home_dir;
 27599  }
 27600  
 27601  /*
 27602  ** On non-Windows platforms, look for $XDG_CONFIG_HOME.
 27603  ** If ${XDG_CONFIG_HOME}/sqlite3/sqliterc is found, return
 27604  ** the path to it, else return 0. The result is cached for
 27605  ** subsequent calls.
 27606  */
 27607  static const char *find_xdg_config(void){
 27608  #if defined(_WIN32) || defined(WIN32) || defined(_WIN32_WCE) \
 27609       || defined(__RTP__) || defined(_WRS_KERNEL)
 27610    return 0;
 27611  #else
 27612    static int alreadyTried = 0;
 27613    static char *zConfig = 0;
 27614    const char *zXdgHome;
 27615  
 27616    if( alreadyTried!=0 ){
 27617      return zConfig;
 27618    }
 27619    alreadyTried = 1;
 27620    zXdgHome = getenv("XDG_CONFIG_HOME");
 27621    if( zXdgHome==0 ){
 27622      return 0;
 27623    }
 27624    zConfig = sqlite3_mprintf("%s/sqlite3/sqliterc", zXdgHome);
 27625    shell_check_oom(zConfig);
 27626    if( access(zConfig,0)!=0 ){
 27627      sqlite3_free(zConfig);
 27628      zConfig = 0;
 27629    }
 27630    return zConfig;
 27631  #endif
 27632  }
 27633  
 27634  /*
 27635  ** Read input from the file given by sqliterc_override.  Or if that
 27636  ** parameter is NULL, take input from the first of find_xdg_config()
 27637  ** or ~/.sqliterc which is found.
 27638  **
 27639  ** Returns the number of errors.
 27640  */
 27641  static void process_sqliterc(
 27642    ShellState *p,                  /* Configuration data */
 27643    const char *sqliterc_override   /* Name of config file. NULL to use default */
 27644  ){
 27645    char *home_dir = NULL;
 27646    const char *sqliterc = sqliterc_override;
 27647    char *zBuf = 0;
 27648    FILE *inSaved = p->in;
 27649    int savedLineno = p->lineno;
 27650  
 27651    if( sqliterc == NULL ){
 27652      sqliterc = find_xdg_config();
 27653    }
 27654    if( sqliterc == NULL ){
 27655      home_dir = find_home_dir(0);
 27656      if( home_dir==0 ){
 27657        raw_printf(stderr, "-- warning: cannot find home directory;"
 27658                        " cannot read ~/.sqliterc\n");
 27659        return;
 27660      }
 27661      zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
 27662      shell_check_oom(zBuf);
 27663      sqliterc = zBuf;
 27664    }
 27665    p->in = fopen(sqliterc,"rb");
 27666    if( p->in ){
 27667      if( stdin_is_interactive ){
 27668        utf8_printf(stderr,"-- Loading resources from %s\n",sqliterc);
 27669      }
 27670      if( process_input(p) && bail_on_error ) exit(1);
 27671      fclose(p->in);
 27672    }else if( sqliterc_override!=0 ){
 27673      utf8_printf(stderr,"cannot open: \"%s\"\n", sqliterc);
 27674      if( bail_on_error ) exit(1);
 27675    }
 27676    p->in = inSaved;
 27677    p->lineno = savedLineno;
 27678    sqlite3_free(zBuf);
 27679  }
 27680  
 27681  /*
 27682  ** Show available command line options
 27683  */
 27684  static const char zOptions[] =
 27685    "   --                   treat no subsequent arguments as options\n"
 27686  #if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE)
 27687    "   -A ARGS...           run \".archive ARGS\" and exit\n"
 27688  #endif
 27689    "   -append              append the database to the end of the file\n"
 27690    "   -ascii               set output mode to 'ascii'\n"
 27691    "   -bail                stop after hitting an error\n"
 27692    "   -batch               force batch I/O\n"
 27693    "   -box                 set output mode to 'box'\n"
 27694    "   -column              set output mode to 'column'\n"
 27695    "   -cmd COMMAND         run \"COMMAND\" before reading stdin\n"
 27696    "   -csv                 set output mode to 'csv'\n"
 27697  #if !defined(SQLITE_OMIT_DESERIALIZE)
 27698    "   -deserialize         open the database using sqlite3_deserialize()\n"
 27699  #endif
 27700    "   -echo                print inputs before execution\n"
 27701    "   -init FILENAME       read/process named file\n"
 27702    "   -[no]header          turn headers on or off\n"
 27703  #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
 27704    "   -heap SIZE           Size of heap for memsys3 or memsys5\n"
 27705  #endif
 27706    "   -help                show this message\n"
 27707    "   -html                set output mode to HTML\n"
 27708    "   -interactive         force interactive I/O\n"
 27709    "   -json                set output mode to 'json'\n"
 27710    "   -line                set output mode to 'line'\n"
 27711    "   -list                set output mode to 'list'\n"
 27712    "   -lookaside SIZE N    use N entries of SZ bytes for lookaside memory\n"
 27713    "   -markdown            set output mode to 'markdown'\n"
 27714  #if !defined(SQLITE_OMIT_DESERIALIZE)
 27715    "   -maxsize N           maximum size for a --deserialize database\n"
 27716  #endif
 27717    "   -memtrace            trace all memory allocations and deallocations\n"
 27718    "   -mmap N              default mmap size set to N\n"
 27719  #ifdef SQLITE_ENABLE_MULTIPLEX
 27720    "   -multiplex           enable the multiplexor VFS\n"
 27721  #endif
 27722    "   -newline SEP         set output row separator. Default: '\\n'\n"
 27723    "   -nofollow            refuse to open symbolic links to database files\n"
 27724    "   -nonce STRING        set the safe-mode escape nonce\n"
 27725    "   -nullvalue TEXT      set text string for NULL values. Default ''\n"
 27726    "   -pagecache SIZE N    use N slots of SZ bytes each for page cache memory\n"
 27727    "   -pcachetrace         trace all page cache operations\n"
 27728    "   -quote               set output mode to 'quote'\n"
 27729    "   -readonly            open the database read-only\n"
 27730    "   -safe                enable safe-mode\n"
 27731    "   -separator SEP       set output column separator. Default: '|'\n"
 27732  #ifdef SQLITE_ENABLE_SORTER_REFERENCES
 27733    "   -sorterref SIZE      sorter references threshold size\n"
 27734  #endif
 27735    "   -stats               print memory stats before each finalize\n"
 27736    "   -table               set output mode to 'table'\n"
 27737    "   -tabs                set output mode to 'tabs'\n"
 27738    "   -unsafe-testing      allow unsafe commands and modes for testing\n"
 27739  #if SHELL_WIN_UTF8_OPT
 27740    "   -utf8                setup interactive console code page for UTF-8\n"
 27741  #endif
 27742    "   -version             show SQLite version\n"
 27743    "   -vfs NAME            use NAME as the default VFS\n"
 27744  #ifdef SQLITE_ENABLE_VFSTRACE
 27745    "   -vfstrace            enable tracing of all VFS calls\n"
 27746  #endif
 27747  #ifdef SQLITE_HAVE_ZLIB
 27748    "   -zip                 open the file as a ZIP Archive\n"
 27749  #endif
 27750  ;
 27751  static void usage(int showDetail){
 27752    utf8_printf(stderr,
 27753        "Usage: %s [OPTIONS] [FILENAME [SQL]]\n"
 27754        "FILENAME is the name of an SQLite database. A new database is created\n"
 27755        "if the file does not previously exist. Defaults to :memory:.\n", Argv0);
 27756    if( showDetail ){
 27757      utf8_printf(stderr, "OPTIONS include:\n%s", zOptions);
 27758    }else{
 27759      raw_printf(stderr, "Use the -help option for additional information\n");
 27760    }
 27761    exit(1);
 27762  }
 27763  
 27764  /*
 27765  ** Internal check:  Verify that the SQLite is uninitialized.  Print a
 27766  ** error message if it is initialized.
 27767  */
 27768  static void verify_uninitialized(void){
 27769    if( sqlite3_config(-1)==SQLITE_MISUSE ){
 27770      utf8_printf(stdout, "WARNING: attempt to configure SQLite after"
 27771                          " initialization.\n");
 27772    }
 27773  }
 27774  
 27775  /*
 27776  ** Initialize the state information in data
 27777  */
 27778  static void main_init(ShellState *data) {
 27779    memset(data, 0, sizeof(*data));
 27780    data->normalMode = data->cMode = data->mode = MODE_List;
 27781    data->autoExplain = 1;
 27782    data->pAuxDb = &data->aAuxDb[0];
 27783    memcpy(data->colSeparator,SEP_Column, 2);
 27784    memcpy(data->rowSeparator,SEP_Row, 2);
 27785    data->showHeader = 0;
 27786    data->shellFlgs = SHFLG_Lookaside;
 27787    sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
 27788  #if !defined(SQLITE_SHELL_FIDDLE)
 27789    verify_uninitialized();
 27790  #endif
 27791    sqlite3_config(SQLITE_CONFIG_URI, 1);
 27792    sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
 27793    sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
 27794    sqlite3_snprintf(sizeof(continuePrompt), continuePrompt,"   ...> ");
 27795  }
 27796  
 27797  /*
 27798  ** Output text to the console in a font that attracts extra attention.
 27799  */
 27800  #ifdef _WIN32
 27801  static void printBold(const char *zText){
 27802  #if !SQLITE_OS_WINRT
 27803    HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
 27804    CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
 27805    GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
 27806    SetConsoleTextAttribute(out,
 27807           FOREGROUND_RED|FOREGROUND_INTENSITY
 27808    );
 27809  #endif
 27810    printf("%s", zText);
 27811  #if !SQLITE_OS_WINRT
 27812    SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
 27813  #endif
 27814  }
 27815  #else
 27816  static void printBold(const char *zText){
 27817    printf("\033[1m%s\033[0m", zText);
 27818  }
 27819  #endif
 27820  
 27821  /*
 27822  ** Get the argument to an --option.  Throw an error and die if no argument
 27823  ** is available.
 27824  */
 27825  static char *cmdline_option_value(int argc, char **argv, int i){
 27826    if( i==argc ){
 27827      utf8_printf(stderr, "%s: Error: missing argument to %s\n",
 27828              argv[0], argv[argc-1]);
 27829      exit(1);
 27830    }
 27831    return argv[i];
 27832  }
 27833  
 27834  static void sayAbnormalExit(void){
 27835    if( seenInterrupt ) fprintf(stderr, "Program interrupted.\n");
 27836  }
 27837  
 27838  #ifndef SQLITE_SHELL_IS_UTF8
 27839  #  if (defined(_WIN32) || defined(WIN32)) \
 27840     && (defined(_MSC_VER) || (defined(UNICODE) && defined(__GNUC__)))
 27841  #    define SQLITE_SHELL_IS_UTF8          (0)
 27842  #  else
 27843  #    define SQLITE_SHELL_IS_UTF8          (1)
 27844  #  endif
 27845  #endif
 27846  
 27847  #ifdef SQLITE_SHELL_FIDDLE
 27848  #  define main fiddle_main
 27849  #endif
 27850  
 27851  #if SQLITE_SHELL_IS_UTF8
 27852  int SQLITE_CDECL main(int argc, char **argv){
 27853  #else
 27854  int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
 27855    char **argv;
 27856  #endif
 27857  #ifdef SQLITE_DEBUG
 27858    sqlite3_int64 mem_main_enter = 0;
 27859  #endif
 27860    char *zErrMsg = 0;
 27861  #ifdef SQLITE_SHELL_FIDDLE
 27862  #  define data shellState
 27863  #else
 27864    ShellState data;
 27865  #endif
 27866    const char *zInitFile = 0;
 27867    int i;
 27868    int rc = 0;
 27869    int warnInmemoryDb = 0;
 27870    int readStdin = 1;
 27871    int nCmd = 0;
 27872    int nOptsEnd = argc;
 27873    char **azCmd = 0;
 27874    const char *zVfs = 0;           /* Value of -vfs command-line option */
 27875  #if !SQLITE_SHELL_IS_UTF8
 27876    char **argvToFree = 0;
 27877    int argcToFree = 0;
 27878  #endif
 27879    setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */
 27880  
 27881  #ifdef SQLITE_SHELL_FIDDLE
 27882    stdin_is_interactive = 0;
 27883    stdout_is_console = 1;
 27884    data.wasm.zDefaultDbName = "/fiddle.sqlite3";
 27885  #else
 27886    stdin_is_interactive = isatty(0);
 27887    stdout_is_console = isatty(1);
 27888  #endif
 27889  #if SHELL_WIN_UTF8_OPT
 27890    atexit(console_restore); /* Needs revision for CLI as library call */
 27891  #endif
 27892    atexit(sayAbnormalExit);
 27893  #ifdef SQLITE_DEBUG
 27894    mem_main_enter = sqlite3_memory_used();
 27895  #endif
 27896  #if !defined(_WIN32_WCE)
 27897    if( getenv("SQLITE_DEBUG_BREAK") ){
 27898      if( isatty(0) && isatty(2) ){
 27899        fprintf(stderr,
 27900            "attach debugger to process %d and press any key to continue.\n",
 27901            GETPID());
 27902        fgetc(stdin);
 27903      }else{
 27904  #if defined(_WIN32) || defined(WIN32)
 27905  #if SQLITE_OS_WINRT
 27906        __debugbreak();
 27907  #else
 27908        DebugBreak();
 27909  #endif
 27910  #elif defined(SIGTRAP)
 27911        raise(SIGTRAP);
 27912  #endif
 27913      }
 27914    }
 27915  #endif
 27916    /* Register a valid signal handler early, before much else is done. */
 27917  #ifdef SIGINT
 27918    signal(SIGINT, interrupt_handler);
 27919  #elif (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE)
 27920    if( !SetConsoleCtrlHandler(ConsoleCtrlHandler, TRUE) ){
 27921      fprintf(stderr, "No ^C handler.\n");
 27922    }
 27923  #endif
 27924  
 27925  #if USE_SYSTEM_SQLITE+0!=1
 27926    if( cli_strncmp(sqlite3_sourceid(),SQLITE_SOURCE_ID,60)!=0 ){
 27927      utf8_printf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
 27928              sqlite3_sourceid(), SQLITE_SOURCE_ID);
 27929      exit(1);
 27930    }
 27931  #endif
 27932    main_init(&data);
 27933  
 27934    /* On Windows, we must translate command-line arguments into UTF-8.
 27935    ** The SQLite memory allocator subsystem has to be enabled in order to
 27936    ** do this.  But we want to run an sqlite3_shutdown() afterwards so that
 27937    ** subsequent sqlite3_config() calls will work.  So copy all results into
 27938    ** memory that does not come from the SQLite memory allocator.
 27939    */
 27940  #if !SQLITE_SHELL_IS_UTF8
 27941    sqlite3_initialize();
 27942    argvToFree = malloc(sizeof(argv[0])*argc*2);
 27943    shell_check_oom(argvToFree);
 27944    argcToFree = argc;
 27945    argv = argvToFree + argc;
 27946    for(i=0; i<argc; i++){
 27947      char *z = sqlite3_win32_unicode_to_utf8(wargv[i]);
 27948      i64 n;
 27949      shell_check_oom(z);
 27950      n = strlen(z);
 27951      argv[i] = malloc( n+1 );
 27952      shell_check_oom(argv[i]);
 27953      memcpy(argv[i], z, n+1);
 27954      argvToFree[i] = argv[i];
 27955      sqlite3_free(z);
 27956    }
 27957    sqlite3_shutdown();
 27958  #endif
 27959  
 27960    assert( argc>=1 && argv && argv[0] );
 27961    Argv0 = argv[0];
 27962  
 27963  #ifdef SQLITE_SHELL_DBNAME_PROC
 27964    {
 27965      /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name
 27966      ** of a C-function that will provide the name of the database file.  Use
 27967      ** this compile-time option to embed this shell program in larger
 27968      ** applications. */
 27969      extern void SQLITE_SHELL_DBNAME_PROC(const char**);
 27970      SQLITE_SHELL_DBNAME_PROC(&data.pAuxDb->zDbFilename);
 27971      warnInmemoryDb = 0;
 27972    }
 27973  #endif
 27974  
 27975    /* Do an initial pass through the command-line argument to locate
 27976    ** the name of the database file, the name of the initialization file,
 27977    ** the size of the alternative malloc heap,
 27978    ** and the first command to execute.
 27979    */
 27980  #ifndef SQLITE_SHELL_FIDDLE
 27981    verify_uninitialized();
 27982  #endif
 27983    for(i=1; i<argc; i++){
 27984      char *z;
 27985      z = argv[i];
 27986      if( z[0]!='-' || i>nOptsEnd ){
 27987        if( data.aAuxDb->zDbFilename==0 ){
 27988          data.aAuxDb->zDbFilename = z;
 27989        }else{
 27990          /* Excess arguments are interpreted as SQL (or dot-commands) and
 27991          ** mean that nothing is read from stdin */
 27992          readStdin = 0;
 27993          nCmd++;
 27994          azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd);
 27995          shell_check_oom(azCmd);
 27996          azCmd[nCmd-1] = z;
 27997        }
 27998        continue;
 27999      }
 28000      if( z[1]=='-' ) z++;
 28001      if( cli_strcmp(z, "-")==0 ){
 28002        nOptsEnd = i;
 28003        continue;
 28004      }else if( cli_strcmp(z,"-separator")==0
 28005       || cli_strcmp(z,"-nullvalue")==0
 28006       || cli_strcmp(z,"-newline")==0
 28007       || cli_strcmp(z,"-cmd")==0
 28008      ){
 28009        (void)cmdline_option_value(argc, argv, ++i);
 28010      }else if( cli_strcmp(z,"-init")==0 ){
 28011        zInitFile = cmdline_option_value(argc, argv, ++i);
 28012      }else if( cli_strcmp(z,"-batch")==0 ){
 28013        /* Need to check for batch mode here to so we can avoid printing
 28014        ** informational messages (like from process_sqliterc) before
 28015        ** we do the actual processing of arguments later in a second pass.
 28016        */
 28017        stdin_is_interactive = 0;
 28018      }else if( cli_strcmp(z,"-heap")==0 ){
 28019  #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
 28020        const char *zSize;
 28021        sqlite3_int64 szHeap;
 28022  
 28023        zSize = cmdline_option_value(argc, argv, ++i);
 28024        szHeap = integerValue(zSize);
 28025        if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
 28026        verify_uninitialized();
 28027        sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
 28028  #else
 28029        (void)cmdline_option_value(argc, argv, ++i);
 28030  #endif
 28031      }else if( cli_strcmp(z,"-pagecache")==0 ){
 28032        sqlite3_int64 n, sz;
 28033        sz = integerValue(cmdline_option_value(argc,argv,++i));
 28034        if( sz>70000 ) sz = 70000;
 28035        if( sz<0 ) sz = 0;
 28036        n = integerValue(cmdline_option_value(argc,argv,++i));
 28037        if( sz>0 && n>0 && 0xffffffffffffLL/sz<n ){
 28038          n = 0xffffffffffffLL/sz;
 28039        }
 28040        verify_uninitialized();
 28041        sqlite3_config(SQLITE_CONFIG_PAGECACHE,
 28042                      (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n);
 28043        data.shellFlgs |= SHFLG_Pagecache;
 28044      }else if( cli_strcmp(z,"-lookaside")==0 ){
 28045        int n, sz;
 28046        sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
 28047        if( sz<0 ) sz = 0;
 28048        n = (int)integerValue(cmdline_option_value(argc,argv,++i));
 28049        if( n<0 ) n = 0;
 28050        verify_uninitialized();
 28051        sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n);
 28052        if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
 28053      }else if( cli_strcmp(z,"-threadsafe")==0 ){
 28054        int n;
 28055        n = (int)integerValue(cmdline_option_value(argc,argv,++i));
 28056        verify_uninitialized();
 28057        switch( n ){
 28058           case 0:  sqlite3_config(SQLITE_CONFIG_SINGLETHREAD);  break;
 28059           case 2:  sqlite3_config(SQLITE_CONFIG_MULTITHREAD);   break;
 28060           default: sqlite3_config(SQLITE_CONFIG_SERIALIZED);    break;
 28061        }
 28062  #ifdef SQLITE_ENABLE_VFSTRACE
 28063      }else if( cli_strcmp(z,"-vfstrace")==0 ){
 28064        extern int vfstrace_register(
 28065           const char *zTraceName,
 28066           const char *zOldVfsName,
 28067           int (*xOut)(const char*,void*),
 28068           void *pOutArg,
 28069           int makeDefault
 28070        );
 28071        vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
 28072  #endif
 28073  #ifdef SQLITE_ENABLE_MULTIPLEX
 28074      }else if( cli_strcmp(z,"-multiplex")==0 ){
 28075        extern int sqlite3_multiplex_initialize(const char*,int);
 28076        sqlite3_multiplex_initialize(0, 1);
 28077  #endif
 28078      }else if( cli_strcmp(z,"-mmap")==0 ){
 28079        sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
 28080        verify_uninitialized();
 28081        sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
 28082  #if defined(SQLITE_ENABLE_SORTER_REFERENCES)
 28083      }else if( cli_strcmp(z,"-sorterref")==0 ){
 28084        sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
 28085        verify_uninitialized();
 28086        sqlite3_config(SQLITE_CONFIG_SORTERREF_SIZE, (int)sz);
 28087  #endif
 28088      }else if( cli_strcmp(z,"-vfs")==0 ){
 28089        zVfs = cmdline_option_value(argc, argv, ++i);
 28090  #ifdef SQLITE_HAVE_ZLIB
 28091      }else if( cli_strcmp(z,"-zip")==0 ){
 28092        data.openMode = SHELL_OPEN_ZIPFILE;
 28093  #endif
 28094      }else if( cli_strcmp(z,"-append")==0 ){
 28095        data.openMode = SHELL_OPEN_APPENDVFS;
 28096  #ifndef SQLITE_OMIT_DESERIALIZE
 28097      }else if( cli_strcmp(z,"-deserialize")==0 ){
 28098        data.openMode = SHELL_OPEN_DESERIALIZE;
 28099      }else if( cli_strcmp(z,"-maxsize")==0 && i+1<argc ){
 28100        data.szMax = integerValue(argv[++i]);
 28101  #endif
 28102      }else if( cli_strcmp(z,"-readonly")==0 ){
 28103        data.openMode = SHELL_OPEN_READONLY;
 28104      }else if( cli_strcmp(z,"-nofollow")==0 ){
 28105        data.openFlags = SQLITE_OPEN_NOFOLLOW;
 28106  #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
 28107      }else if( cli_strncmp(z, "-A",2)==0 ){
 28108        /* All remaining command-line arguments are passed to the ".archive"
 28109        ** command, so ignore them */
 28110        break;
 28111  #endif
 28112      }else if( cli_strcmp(z, "-memtrace")==0 ){
 28113        sqlite3MemTraceActivate(stderr);
 28114      }else if( cli_strcmp(z, "-pcachetrace")==0 ){
 28115        sqlite3PcacheTraceActivate(stderr);
 28116      }else if( cli_strcmp(z,"-bail")==0 ){
 28117        bail_on_error = 1;
 28118      }else if( cli_strcmp(z,"-nonce")==0 ){
 28119        free(data.zNonce);
 28120        data.zNonce = strdup(cmdline_option_value(argc, argv, ++i));
 28121      }else if( cli_strcmp(z,"-unsafe-testing")==0 ){
 28122        ShellSetFlag(&data,SHFLG_TestingMode);
 28123      }else if( cli_strcmp(z,"-safe")==0 ){
 28124        /* no-op - catch this on the second pass */
 28125      }
 28126    }
 28127  #ifndef SQLITE_SHELL_FIDDLE
 28128    verify_uninitialized();
 28129  #endif
 28130  
 28131  
 28132  #ifdef SQLITE_SHELL_INIT_PROC
 28133    {
 28134      /* If the SQLITE_SHELL_INIT_PROC macro is defined, then it is the name
 28135      ** of a C-function that will perform initialization actions on SQLite that
 28136      ** occur just before or after sqlite3_initialize(). Use this compile-time
 28137      ** option to embed this shell program in larger applications. */
 28138      extern void SQLITE_SHELL_INIT_PROC(void);
 28139      SQLITE_SHELL_INIT_PROC();
 28140    }
 28141  #else
 28142    /* All the sqlite3_config() calls have now been made. So it is safe
 28143    ** to call sqlite3_initialize() and process any command line -vfs option. */
 28144    sqlite3_initialize();
 28145  #endif
 28146  
 28147    if( zVfs ){
 28148      sqlite3_vfs *pVfs = sqlite3_vfs_find(zVfs);
 28149      if( pVfs ){
 28150        sqlite3_vfs_register(pVfs, 1);
 28151      }else{
 28152        utf8_printf(stderr, "no such VFS: \"%s\"\n", zVfs);
 28153        exit(1);
 28154      }
 28155    }
 28156  
 28157    if( data.pAuxDb->zDbFilename==0 ){
 28158  #ifndef SQLITE_OMIT_MEMORYDB
 28159      data.pAuxDb->zDbFilename = ":memory:";
 28160      warnInmemoryDb = argc==1;
 28161  #else
 28162      utf8_printf(stderr,"%s: Error: no database filename specified\n", Argv0);
 28163      return 1;
 28164  #endif
 28165    }
 28166    data.out = stdout;
 28167  #ifndef SQLITE_SHELL_FIDDLE
 28168    sqlite3_appendvfs_init(0,0,0);
 28169  #endif
 28170  
 28171    /* Go ahead and open the database file if it already exists.  If the
 28172    ** file does not exist, delay opening it.  This prevents empty database
 28173    ** files from being created if a user mistypes the database name argument
 28174    ** to the sqlite command-line tool.
 28175    */
 28176    if( access(data.pAuxDb->zDbFilename, 0)==0 ){
 28177      open_db(&data, 0);
 28178    }
 28179  
 28180    /* Process the initialization file if there is one.  If no -init option
 28181    ** is given on the command line, look for a file named ~/.sqliterc and
 28182    ** try to process it.
 28183    */
 28184    process_sqliterc(&data,zInitFile);
 28185  
 28186    /* Make a second pass through the command-line argument and set
 28187    ** options.  This second pass is delayed until after the initialization
 28188    ** file is processed so that the command-line arguments will override
 28189    ** settings in the initialization file.
 28190    */
 28191    for(i=1; i<argc; i++){
 28192      char *z = argv[i];
 28193      if( z[0]!='-' || i>=nOptsEnd ) continue;
 28194      if( z[1]=='-' ){ z++; }
 28195      if( cli_strcmp(z,"-init")==0 ){
 28196        i++;
 28197      }else if( cli_strcmp(z,"-html")==0 ){
 28198        data.mode = MODE_Html;
 28199      }else if( cli_strcmp(z,"-list")==0 ){
 28200        data.mode = MODE_List;
 28201      }else if( cli_strcmp(z,"-quote")==0 ){
 28202        data.mode = MODE_Quote;
 28203        sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Comma);
 28204        sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Row);
 28205      }else if( cli_strcmp(z,"-line")==0 ){
 28206        data.mode = MODE_Line;
 28207      }else if( cli_strcmp(z,"-column")==0 ){
 28208        data.mode = MODE_Column;
 28209      }else if( cli_strcmp(z,"-json")==0 ){
 28210        data.mode = MODE_Json;
 28211      }else if( cli_strcmp(z,"-markdown")==0 ){
 28212        data.mode = MODE_Markdown;
 28213      }else if( cli_strcmp(z,"-table")==0 ){
 28214        data.mode = MODE_Table;
 28215      }else if( cli_strcmp(z,"-box")==0 ){
 28216        data.mode = MODE_Box;
 28217      }else if( cli_strcmp(z,"-csv")==0 ){
 28218        data.mode = MODE_Csv;
 28219        memcpy(data.colSeparator,",",2);
 28220  #ifdef SQLITE_HAVE_ZLIB
 28221      }else if( cli_strcmp(z,"-zip")==0 ){
 28222        data.openMode = SHELL_OPEN_ZIPFILE;
 28223  #endif
 28224      }else if( cli_strcmp(z,"-append")==0 ){
 28225        data.openMode = SHELL_OPEN_APPENDVFS;
 28226  #ifndef SQLITE_OMIT_DESERIALIZE
 28227      }else if( cli_strcmp(z,"-deserialize")==0 ){
 28228        data.openMode = SHELL_OPEN_DESERIALIZE;
 28229      }else if( cli_strcmp(z,"-maxsize")==0 && i+1<argc ){
 28230        data.szMax = integerValue(argv[++i]);
 28231  #endif
 28232      }else if( cli_strcmp(z,"-readonly")==0 ){
 28233        data.openMode = SHELL_OPEN_READONLY;
 28234      }else if( cli_strcmp(z,"-nofollow")==0 ){
 28235        data.openFlags |= SQLITE_OPEN_NOFOLLOW;
 28236      }else if( cli_strcmp(z,"-ascii")==0 ){
 28237        data.mode = MODE_Ascii;
 28238        sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,SEP_Unit);
 28239        sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,SEP_Record);
 28240      }else if( cli_strcmp(z,"-tabs")==0 ){
 28241        data.mode = MODE_List;
 28242        sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,SEP_Tab);
 28243        sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,SEP_Row);
 28244      }else if( cli_strcmp(z,"-separator")==0 ){
 28245        sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
 28246                         "%s",cmdline_option_value(argc,argv,++i));
 28247      }else if( cli_strcmp(z,"-newline")==0 ){
 28248        sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
 28249                         "%s",cmdline_option_value(argc,argv,++i));
 28250      }else if( cli_strcmp(z,"-nullvalue")==0 ){
 28251        sqlite3_snprintf(sizeof(data.nullValue), data.nullValue,
 28252                         "%s",cmdline_option_value(argc,argv,++i));
 28253      }else if( cli_strcmp(z,"-header")==0 ){
 28254        data.showHeader = 1;
 28255        ShellSetFlag(&data, SHFLG_HeaderSet);
 28256       }else if( cli_strcmp(z,"-noheader")==0 ){
 28257        data.showHeader = 0;
 28258        ShellSetFlag(&data, SHFLG_HeaderSet);
 28259      }else if( cli_strcmp(z,"-echo")==0 ){
 28260        ShellSetFlag(&data, SHFLG_Echo);
 28261      }else if( cli_strcmp(z,"-eqp")==0 ){
 28262        data.autoEQP = AUTOEQP_on;
 28263      }else if( cli_strcmp(z,"-eqpfull")==0 ){
 28264        data.autoEQP = AUTOEQP_full;
 28265      }else if( cli_strcmp(z,"-stats")==0 ){
 28266        data.statsOn = 1;
 28267      }else if( cli_strcmp(z,"-scanstats")==0 ){
 28268        data.scanstatsOn = 1;
 28269      }else if( cli_strcmp(z,"-backslash")==0 ){
 28270        /* Undocumented command-line option: -backslash
 28271        ** Causes C-style backslash escapes to be evaluated in SQL statements
 28272        ** prior to sending the SQL into SQLite.  Useful for injecting
 28273        ** crazy bytes in the middle of SQL statements for testing and debugging.
 28274        */
 28275        ShellSetFlag(&data, SHFLG_Backslash);
 28276      }else if( cli_strcmp(z,"-bail")==0 ){
 28277        /* No-op.  The bail_on_error flag should already be set. */
 28278      }else if( cli_strcmp(z,"-version")==0 ){
 28279        printf("%s %s (%d-bit)\n", sqlite3_libversion(), sqlite3_sourceid(),
 28280               8*(int)sizeof(char*));
 28281        return 0;
 28282      }else if( cli_strcmp(z,"-interactive")==0 ){
 28283        stdin_is_interactive = 1;
 28284      }else if( cli_strcmp(z,"-batch")==0 ){
 28285        stdin_is_interactive = 0;
 28286      }else if( cli_strcmp(z,"-utf8")==0 ){
 28287  #if SHELL_WIN_UTF8_OPT
 28288        console_utf8 = 1;
 28289  #endif /* SHELL_WIN_UTF8_OPT */
 28290      }else if( cli_strcmp(z,"-heap")==0 ){
 28291        i++;
 28292      }else if( cli_strcmp(z,"-pagecache")==0 ){
 28293        i+=2;
 28294      }else if( cli_strcmp(z,"-lookaside")==0 ){
 28295        i+=2;
 28296      }else if( cli_strcmp(z,"-threadsafe")==0 ){
 28297        i+=2;
 28298      }else if( cli_strcmp(z,"-nonce")==0 ){
 28299        i += 2;
 28300      }else if( cli_strcmp(z,"-mmap")==0 ){
 28301        i++;
 28302      }else if( cli_strcmp(z,"-memtrace")==0 ){
 28303        i++;
 28304      }else if( cli_strcmp(z,"-pcachetrace")==0 ){
 28305        i++;
 28306  #ifdef SQLITE_ENABLE_SORTER_REFERENCES
 28307      }else if( cli_strcmp(z,"-sorterref")==0 ){
 28308        i++;
 28309  #endif
 28310      }else if( cli_strcmp(z,"-vfs")==0 ){
 28311        i++;
 28312  #ifdef SQLITE_ENABLE_VFSTRACE
 28313      }else if( cli_strcmp(z,"-vfstrace")==0 ){
 28314        i++;
 28315  #endif
 28316  #ifdef SQLITE_ENABLE_MULTIPLEX
 28317      }else if( cli_strcmp(z,"-multiplex")==0 ){
 28318        i++;
 28319  #endif
 28320      }else if( cli_strcmp(z,"-help")==0 ){
 28321        usage(1);
 28322      }else if( cli_strcmp(z,"-cmd")==0 ){
 28323        /* Run commands that follow -cmd first and separately from commands
 28324        ** that simply appear on the command-line.  This seems goofy.  It would
 28325        ** be better if all commands ran in the order that they appear.  But
 28326        ** we retain the goofy behavior for historical compatibility. */
 28327        if( i==argc-1 ) break;
 28328        z = cmdline_option_value(argc,argv,++i);
 28329        if( z[0]=='.' ){
 28330          rc = do_meta_command(z, &data);
 28331          if( rc && bail_on_error ) return rc==2 ? 0 : rc;
 28332        }else{
 28333          open_db(&data, 0);
 28334          rc = shell_exec(&data, z, &zErrMsg);
 28335          if( zErrMsg!=0 ){
 28336            utf8_printf(stderr,"Error: %s\n", zErrMsg);
 28337            if( bail_on_error ) return rc!=0 ? rc : 1;
 28338          }else if( rc!=0 ){
 28339            utf8_printf(stderr,"Error: unable to process SQL \"%s\"\n", z);
 28340            if( bail_on_error ) return rc;
 28341          }
 28342        }
 28343  #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
 28344      }else if( cli_strncmp(z, "-A", 2)==0 ){
 28345        if( nCmd>0 ){
 28346          utf8_printf(stderr, "Error: cannot mix regular SQL or dot-commands"
 28347                              " with \"%s\"\n", z);
 28348          return 1;
 28349        }
 28350        open_db(&data, OPEN_DB_ZIPFILE);
 28351        if( z[2] ){
 28352          argv[i] = &z[2];
 28353          arDotCommand(&data, 1, argv+(i-1), argc-(i-1));
 28354        }else{
 28355          arDotCommand(&data, 1, argv+i, argc-i);
 28356        }
 28357        readStdin = 0;
 28358        break;
 28359  #endif
 28360      }else if( cli_strcmp(z,"-safe")==0 ){
 28361        data.bSafeMode = data.bSafeModePersist = 1;
 28362      }else if( cli_strcmp(z,"-unsafe-testing")==0 ){
 28363        /* Acted upon in first pass. */
 28364      }else{
 28365        utf8_printf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
 28366        raw_printf(stderr,"Use -help for a list of options.\n");
 28367        return 1;
 28368      }
 28369      data.cMode = data.mode;
 28370    }
 28371  #if SHELL_WIN_UTF8_OPT
 28372    if( console_utf8 && stdin_is_interactive ){
 28373      console_prepare();
 28374    }else{
 28375      setBinaryMode(stdin, 0);
 28376      console_utf8 = 0;
 28377    }
 28378  #endif
 28379  
 28380    if( !readStdin ){
 28381      /* Run all arguments that do not begin with '-' as if they were separate
 28382      ** command-line inputs, except for the argToSkip argument which contains
 28383      ** the database filename.
 28384      */
 28385      for(i=0; i<nCmd; i++){
 28386        if( azCmd[i][0]=='.' ){
 28387          rc = do_meta_command(azCmd[i], &data);
 28388          if( rc ){
 28389            free(azCmd);
 28390            return rc==2 ? 0 : rc;
 28391          }
 28392        }else{
 28393          open_db(&data, 0);
 28394          echo_group_input(&data, azCmd[i]);
 28395          rc = shell_exec(&data, azCmd[i], &zErrMsg);
 28396          if( zErrMsg || rc ){
 28397            if( zErrMsg!=0 ){
 28398              utf8_printf(stderr,"Error: %s\n", zErrMsg);
 28399            }else{
 28400              utf8_printf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]);
 28401            }
 28402            sqlite3_free(zErrMsg);
 28403            free(azCmd);
 28404            return rc!=0 ? rc : 1;
 28405          }
 28406        }
 28407      }
 28408    }else{
 28409      /* Run commands received from standard input
 28410      */
 28411      if( stdin_is_interactive ){
 28412        char *zHome;
 28413        char *zHistory;
 28414        int nHistory;
 28415        printf(
 28416          "SQLite version %s %.19s\n" /*extra-version-info*/
 28417          "Enter \".help\" for usage hints.\n",
 28418          sqlite3_libversion(), sqlite3_sourceid()
 28419        );
 28420        if( warnInmemoryDb ){
 28421          printf("Connected to a ");
 28422          printBold("transient in-memory database");
 28423          printf(".\nUse \".open FILENAME\" to reopen on a "
 28424                 "persistent database.\n");
 28425        }
 28426        zHistory = getenv("SQLITE_HISTORY");
 28427        if( zHistory ){
 28428          zHistory = strdup(zHistory);
 28429        }else if( (zHome = find_home_dir(0))!=0 ){
 28430          nHistory = strlen30(zHome) + 20;
 28431          if( (zHistory = malloc(nHistory))!=0 ){
 28432            sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
 28433          }
 28434        }
 28435        if( zHistory ){ shell_read_history(zHistory); }
 28436  #if HAVE_READLINE || HAVE_EDITLINE
 28437        rl_attempted_completion_function = readline_completion;
 28438  #elif HAVE_LINENOISE
 28439        linenoiseSetCompletionCallback(linenoise_completion);
 28440  #endif
 28441        data.in = 0;
 28442        rc = process_input(&data);
 28443        if( zHistory ){
 28444          shell_stifle_history(2000);
 28445          shell_write_history(zHistory);
 28446          free(zHistory);
 28447        }
 28448      }else{
 28449        data.in = stdin;
 28450        rc = process_input(&data);
 28451      }
 28452    }
 28453  #ifndef SQLITE_SHELL_FIDDLE
 28454    /* In WASM mode we have to leave the db state in place so that
 28455    ** client code can "push" SQL into it after this call returns. */
 28456    free(azCmd);
 28457    set_table_name(&data, 0);
 28458    if( data.db ){
 28459      session_close_all(&data, -1);
 28460      close_db(data.db);
 28461    }
 28462    for(i=0; i<ArraySize(data.aAuxDb); i++){
 28463      sqlite3_free(data.aAuxDb[i].zFreeOnClose);
 28464      if( data.aAuxDb[i].db ){
 28465        session_close_all(&data, i);
 28466        close_db(data.aAuxDb[i].db);
 28467      }
 28468    }
 28469    find_home_dir(1);
 28470    output_reset(&data);
 28471    data.doXdgOpen = 0;
 28472    clearTempFile(&data);
 28473  #if !SQLITE_SHELL_IS_UTF8
 28474    for(i=0; i<argcToFree; i++) free(argvToFree[i]);
 28475    free(argvToFree);
 28476  #endif
 28477    free(data.colWidth);
 28478    free(data.zNonce);
 28479    /* Clear the global data structure so that valgrind will detect memory
 28480    ** leaks */
 28481    memset(&data, 0, sizeof(data));
 28482  #ifdef SQLITE_DEBUG
 28483    if( sqlite3_memory_used()>mem_main_enter ){
 28484      utf8_printf(stderr, "Memory leaked: %u bytes\n",
 28485                  (unsigned int)(sqlite3_memory_used()-mem_main_enter));
 28486    }
 28487  #endif
 28488  #endif /* !SQLITE_SHELL_FIDDLE */
 28489    return rc;
 28490  }
 28491  
 28492  
 28493  #ifdef SQLITE_SHELL_FIDDLE
 28494  /* Only for emcc experimentation purposes. */
 28495  int fiddle_experiment(int a,int b){
 28496    return a + b;
 28497  }
 28498  
 28499  /*
 28500  ** Returns a pointer to the current DB handle.
 28501  */
 28502  sqlite3 * fiddle_db_handle(){
 28503    return globalDb;
 28504  }
 28505  
 28506  /*
 28507  ** Returns a pointer to the given DB name's VFS. If zDbName is 0 then
 28508  ** "main" is assumed. Returns 0 if no db with the given name is
 28509  ** open.
 28510  */
 28511  sqlite3_vfs * fiddle_db_vfs(const char *zDbName){
 28512    sqlite3_vfs * pVfs = 0;
 28513    if(globalDb){
 28514      sqlite3_file_control(globalDb, zDbName ? zDbName : "main",
 28515                           SQLITE_FCNTL_VFS_POINTER, &pVfs);
 28516    }
 28517    return pVfs;
 28518  }
 28519  
 28520  /* Only for emcc experimentation purposes. */
 28521  sqlite3 * fiddle_db_arg(sqlite3 *arg){
 28522      printf("fiddle_db_arg(%p)\n", (const void*)arg);
 28523      return arg;
 28524  }
 28525  
 28526  /*
 28527  ** Intended to be called via a SharedWorker() while a separate
 28528  ** SharedWorker() (which manages the wasm module) is performing work
 28529  ** which should be interrupted. Unfortunately, SharedWorker is not
 28530  ** portable enough to make real use of.
 28531  */
 28532  void fiddle_interrupt(void){
 28533    if( globalDb ) sqlite3_interrupt(globalDb);
 28534  }
 28535  
 28536  /*
 28537  ** Returns the filename of the given db name, assuming "main" if
 28538  ** zDbName is NULL. Returns NULL if globalDb is not opened.
 28539  */
 28540  const char * fiddle_db_filename(const char * zDbName){
 28541      return globalDb
 28542        ? sqlite3_db_filename(globalDb, zDbName ? zDbName : "main")
 28543        : NULL;
 28544  }
 28545  
 28546  /*
 28547  ** Completely wipes out the contents of the currently-opened database
 28548  ** but leaves its storage intact for reuse.
 28549  */
 28550  void fiddle_reset_db(void){
 28551    if( globalDb ){
 28552      int rc = sqlite3_db_config(globalDb, SQLITE_DBCONFIG_RESET_DATABASE, 1, 0);
 28553      if( 0==rc ) rc = sqlite3_exec(globalDb, "VACUUM", 0, 0, 0);
 28554      sqlite3_db_config(globalDb, SQLITE_DBCONFIG_RESET_DATABASE, 0, 0);
 28555    }
 28556  }
 28557  
 28558  /*
 28559  ** Uses the current database's VFS xRead to stream the db file's
 28560  ** contents out to the given callback. The callback gets a single
 28561  ** chunk of size n (its 2nd argument) on each call and must return 0
 28562  ** on success, non-0 on error. This function returns 0 on success,
 28563  ** SQLITE_NOTFOUND if no db is open, or propagates any other non-0
 28564  ** code from the callback. Note that this is not thread-friendly: it
 28565  ** expects that it will be the only thread reading the db file and
 28566  ** takes no measures to ensure that is the case.
 28567  */
 28568  int fiddle_export_db( int (*xCallback)(unsigned const char *zOut, int n) ){
 28569    sqlite3_int64 nSize = 0;
 28570    sqlite3_int64 nPos = 0;
 28571    sqlite3_file * pFile = 0;
 28572    unsigned char buf[1024 * 8];
 28573    int nBuf = (int)sizeof(buf);
 28574    int rc = shellState.db
 28575      ? sqlite3_file_control(shellState.db, "main",
 28576                             SQLITE_FCNTL_FILE_POINTER, &pFile)
 28577      : SQLITE_NOTFOUND;
 28578    if( rc ) return rc;
 28579    rc = pFile->pMethods->xFileSize(pFile, &nSize);
 28580    if( rc ) return rc;
 28581    if(nSize % nBuf){
 28582      /* DB size is not an even multiple of the buffer size. Reduce
 28583      ** buffer size so that we do not unduly inflate the db size when
 28584      ** exporting. */
 28585      if(0 == nSize % 4096) nBuf = 4096;
 28586      else if(0 == nSize % 2048) nBuf = 2048;
 28587      else if(0 == nSize % 1024) nBuf = 1024;
 28588      else nBuf = 512;
 28589    }
 28590    for( ; 0==rc && nPos<nSize; nPos += nBuf ){
 28591      rc = pFile->pMethods->xRead(pFile, buf, nBuf, nPos);
 28592      if(SQLITE_IOERR_SHORT_READ == rc){
 28593        rc = (nPos + nBuf) < nSize ? rc : 0/*assume EOF*/;
 28594      }
 28595      if( 0==rc ) rc = xCallback(buf, nBuf);
 28596    }
 28597    return rc;
 28598  }
 28599  
 28600  /*
 28601  ** Trivial exportable function for emscripten. It processes zSql as if
 28602  ** it were input to the sqlite3 shell and redirects all output to the
 28603  ** wasm binding. fiddle_main() must have been called before this
 28604  ** is called, or results are undefined.
 28605  */
 28606  void fiddle_exec(const char * zSql){
 28607    if(zSql && *zSql){
 28608      if('.'==*zSql) puts(zSql);
 28609      shellState.wasm.zInput = zSql;
 28610      shellState.wasm.zPos = zSql;
 28611      process_input(&shellState);
 28612      shellState.wasm.zInput = shellState.wasm.zPos = 0;
 28613    }
 28614  }
 28615  #endif /* SQLITE_SHELL_FIDDLE */